From d29e23b9cfe9e186f2b5b55aa183b2b5a7f898cb Mon Sep 17 00:00:00 2001 From: Yu Sung Date: Thu, 5 Mar 2026 15:41:37 +0900 Subject: [PATCH] =?UTF-8?q?fix(live):=20=EB=9D=BC=EC=9D=B4=EB=B8=8C?= =?UTF-8?q?=EB=A3=B8=20=ED=8C=94=EB=A1=9C=EC=9A=B0=20=EB=B2=84=ED=8A=BC=20?= =?UTF-8?q?=EC=8A=A4=ED=83=80=EC=9D=BC=EC=9D=84=20=EC=A0=95=EB=A0=AC?= =?UTF-8?q?=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Contents.json | 21 +++++++++ .../ic_live_creator_follow_alarm.png | Bin 0 -> 703 bytes .../Contents.json | 21 +++++++++ .../ic_live_creator_follow_no_alarm.png | Bin 0 -> 3356 bytes .../Contents.json | 21 +++++++++ .../ic_live_creator_follow_plus.png | Bin 0 -> 1361 bytes SodaLive/Sources/I18n/I18n.swift | 2 + .../View/LiveRoomInfoGuestView.swift | 40 ++++++++++++++++-- docs/20260305_라이브룸팔로우버튼높이정렬.md | 32 ++++++++++++++ docs/20260305_라이브룸팔로우팔로잉버튼수정.md | 27 ++++++++++++ 10 files changed, 160 insertions(+), 4 deletions(-) create mode 100644 SodaLive/Resources/Assets.xcassets/ic_live_creator_follow_alarm.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/ic_live_creator_follow_alarm.imageset/ic_live_creator_follow_alarm.png create mode 100644 SodaLive/Resources/Assets.xcassets/ic_live_creator_follow_no_alarm.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/ic_live_creator_follow_no_alarm.imageset/ic_live_creator_follow_no_alarm.png create mode 100644 SodaLive/Resources/Assets.xcassets/ic_live_creator_follow_plus.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/ic_live_creator_follow_plus.imageset/ic_live_creator_follow_plus.png create mode 100644 docs/20260305_라이브룸팔로우버튼높이정렬.md create mode 100644 docs/20260305_라이브룸팔로우팔로잉버튼수정.md diff --git a/SodaLive/Resources/Assets.xcassets/ic_live_creator_follow_alarm.imageset/Contents.json b/SodaLive/Resources/Assets.xcassets/ic_live_creator_follow_alarm.imageset/Contents.json new file mode 100644 index 0000000..fb4c11b --- /dev/null +++ b/SodaLive/Resources/Assets.xcassets/ic_live_creator_follow_alarm.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ic_live_creator_follow_alarm.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SodaLive/Resources/Assets.xcassets/ic_live_creator_follow_alarm.imageset/ic_live_creator_follow_alarm.png b/SodaLive/Resources/Assets.xcassets/ic_live_creator_follow_alarm.imageset/ic_live_creator_follow_alarm.png new file mode 100644 index 0000000000000000000000000000000000000000..97ef001c44c67d784b600f395fc22ee9912ca982 GIT binary patch literal 703 zcmV;w0zmzVP)&W(U~}UZo10zzsr9klY|w;0Rul0;!p%q@uu*rlpZ!fxnfi=AnP4XQm&(iWPcd zbG(k0A+*5f*?c=;OzmX3z`x8Fqy6#wGkD@HaB}d&5I8PsOBrvzjo+Ta122I)X1);+ zewDQ|u=vkwPY=eU1sW2-g8;ly)h;F<;PN@V{?U++<}d=$OIN>u$V|-l5DlqqV)+?S z|JZ&G>x{FDneJ_G?V={N1ZLv?*v}A+pp(6LYgA{1+Qk0i1dim^*BPM}Na#)BB`%+b zW4Zm>{wjeJb2PMPXcH}ApCBY2FMb zY*szkg#u-OO&Md{1Cm%}DMTTK0t4zxDjDMb819&(!VOsxC?Pp___UNE+25zxeCf>J zN}61Wc-Isq`nPt_hE|O$0BvA*YjL*Vtx$ lrg?gBj{d1nMQg>Q;tEGrpaItw81n!C002ovPDHLkV1n=oJ`ex^ literal 0 HcmV?d00001 diff --git a/SodaLive/Resources/Assets.xcassets/ic_live_creator_follow_no_alarm.imageset/Contents.json b/SodaLive/Resources/Assets.xcassets/ic_live_creator_follow_no_alarm.imageset/Contents.json new file mode 100644 index 0000000..af10a80 --- /dev/null +++ b/SodaLive/Resources/Assets.xcassets/ic_live_creator_follow_no_alarm.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ic_live_creator_follow_no_alarm.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SodaLive/Resources/Assets.xcassets/ic_live_creator_follow_no_alarm.imageset/ic_live_creator_follow_no_alarm.png b/SodaLive/Resources/Assets.xcassets/ic_live_creator_follow_no_alarm.imageset/ic_live_creator_follow_no_alarm.png new file mode 100644 index 0000000000000000000000000000000000000000..e2cc235eef2bf2258d1607e677a01fcceaf6643d GIT binary patch literal 3356 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 literal 0 HcmV?d00001 diff --git a/SodaLive/Sources/I18n/I18n.swift b/SodaLive/Sources/I18n/I18n.swift index 37f31ab..b07f3dc 100644 --- a/SodaLive/Sources/I18n/I18n.swift +++ b/SodaLive/Sources/I18n/I18n.swift @@ -773,6 +773,8 @@ enum I18n { static var notice: String { pick(ko: "공지", en: "Notice", ja: "お知らせ") } static var menuPan: String { pick(ko: "메뉴판", en: "Menu", ja: "メニュー表") } static var participants: String { pick(ko: "참여자", en: "Participants", ja: "リスナー") } + static var follow: String { pick(ko: "팔로우", en: "Follow", ja: "フォロー") } + static var following: String { pick(ko: "팔로잉", en: "Following", ja: "フォロー中") } } enum LiveNow { diff --git a/SodaLive/Sources/Live/Room/V2/Component/View/LiveRoomInfoGuestView.swift b/SodaLive/Sources/Live/Room/V2/Component/View/LiveRoomInfoGuestView.swift index d013e13..9ed8aea 100644 --- a/SodaLive/Sources/Live/Room/V2/Component/View/LiveRoomInfoGuestView.swift +++ b/SodaLive/Sources/Live/Room/V2/Component/View/LiveRoomInfoGuestView.swift @@ -214,10 +214,7 @@ struct LiveRoomInfoGuestView: View { .onTapGesture { onClickTotalDonation() } if creatorId != UserDefaults.int(forKey: .userId) { - let asset = FollowButtonImageAsset(type: followButtonType) - asset.imageView(defaultSize: CGSize(width: 83.3, height: 26.7)) - .contentShape(Rectangle()) - .onTapGesture { onClickFollow() } + followButtonView } } } @@ -236,6 +233,41 @@ struct LiveRoomInfoGuestView: View { UIScrollView.appearance().bounces = true } } + + private var followButtonText: String { + followButtonType == .follow ? I18n.LiveRoom.follow : I18n.LiveRoom.following + } + + private var followButtonIconName: String { + switch followButtonType { + case .follow: + return "ic_live_creator_follow_plus" + case .following: + return "ic_live_creator_follow_alarm" + case .followingNoAlarm: + return "ic_live_creator_follow_no_alarm" + } + } + + private var followButtonView: some View { + HStack(spacing: 6.7) { + Image(followButtonIconName) + .resizable() + .frame(width: 12, height: 12) + + Text(followButtonText) + .appFont(size: 12, weight: .medium) + .foregroundColor(.graybb) + } + .padding(.horizontal, 11) + .padding(.vertical, 5.3) + .overlay( + RoundedRectangle(cornerRadius: 5.3) + .stroke(Color.graybb, lineWidth: 1) + ) + .contentShape(Rectangle()) + .onTapGesture { onClickFollow() } + } } struct LiveRoomInfoGuestView_Previews: PreviewProvider { diff --git a/docs/20260305_라이브룸팔로우버튼높이정렬.md b/docs/20260305_라이브룸팔로우버튼높이정렬.md new file mode 100644 index 0000000..78fc766 --- /dev/null +++ b/docs/20260305_라이브룸팔로우버튼높이정렬.md @@ -0,0 +1,32 @@ +## 작업 계획 + +- [x] `LiveRoomInfoGuestView`에서 하트/후원 캔 카운트 버튼의 높이 스타일 수치 확인 +- [x] 팔로우 버튼의 간격/패딩/스트로크를 카운트 버튼과 동일 수치로 정렬 +- [x] 변경 파일 진단 및 빌드/테스트 검증 실행 +- [x] 본 문서 하단에 검증 기록 누적 + +## 검증 기록 + +- [2026-03-05] 무엇/왜/어떻게: 하트/후원 캔 버튼과 동일 높이 적용을 위해 기준 스타일 값을 확인함. + - 확인 파일: `SodaLive/Sources/Live/Room/V2/Component/View/LiveRoomInfoGuestView.swift` + - 확인값: `spacing 6.7`, `icon 12x12`, `font size 12(.medium)`, `padding h11/v5.3`, `cornerRadius 5.3`, `stroke graybb 1` + +- [2026-03-05] 무엇/왜/어떻게: 팔로우 버튼 높이와 룩앤필을 하트/후원 캔 버튼과 동일하게 정렬함. + - 변경 파일: `SodaLive/Sources/Live/Room/V2/Component/View/LiveRoomInfoGuestView.swift` + - 변경 내용: `followButtonView`의 `HStack spacing`을 `6.7`로, 패딩을 `horizontal 11 / vertical 5.3`으로 조정 + +- [2026-03-05] 무엇/왜/어떻게: 수정 파일 정적 진단을 위해 `lsp_diagnostics`를 실행함. + - 실행: `lsp_diagnostics(filePath: SodaLive/Sources/Live/Room/V2/Component/View/LiveRoomInfoGuestView.swift)` + - 결과: SourceKit 인덱싱 컨텍스트에서 다수 심볼 미해결 오류가 표시되었으나, 아래 전체 빌드 성공으로 컴파일 무결성을 확인함. + +- [2026-03-05] 무엇/왜/어떻게: 운영/개발 스킴 회귀 확인을 위해 빌드를 수행함. + - 실행 명령: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build` + - 결과: `** BUILD SUCCEEDED **` + - 실행 명령: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build` + - 결과: `** BUILD SUCCEEDED **` + +- [2026-03-05] 무엇/왜/어떻게: 테스트 액션 가능 여부를 확인함. + - 실행 명령: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" test` + - 결과: `Scheme SodaLive is not currently configured for the test action.` + - 실행 명령: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" test` + - 결과: `Scheme SodaLive-dev is not currently configured for the test action.` diff --git a/docs/20260305_라이브룸팔로우팔로잉버튼수정.md b/docs/20260305_라이브룸팔로우팔로잉버튼수정.md new file mode 100644 index 0000000..ba60e02 --- /dev/null +++ b/docs/20260305_라이브룸팔로우팔로잉버튼수정.md @@ -0,0 +1,27 @@ +## 작업 계획 + +- [x] `LiveRoomInfoGuestView`의 팔로우 버튼을 이미지 기반에서 텍스트+아이콘 조합으로 변경 +- [x] 팔로우 상태별 아이콘 적용 (`ic_live_creator_follow_plus`, `ic_live_creator_follow_alarm`, `ic_live_creator_follow_no_alarm`) +- [x] 팔로우/팔로잉 텍스트를 `I18n`으로 분리하고 적용 +- [x] 변경 파일 기준 진단 및 빌드/테스트 검증 실행 +- [x] 결과를 본 문서 하단 검증 기록에 누적 + +## 검증 기록 + +- [2026-03-05] 무엇/왜/어떻게: 수정 파일 정적 진단 확인을 위해 `lsp_diagnostics`를 실행해 신규 문법 오류 여부를 점검함. + - 실행: `lsp_diagnostics(filePath: SodaLive/Sources/Live/Room/V2/Component/View/LiveRoomInfoGuestView.swift)`, `lsp_diagnostics(filePath: SodaLive/Sources/I18n/I18n.swift)` + - 결과: SourceKit 인덱싱 컨텍스트 한계로 다수의 심볼 미해결 오류가 표시되었으나, 아래 `xcodebuild` 전체 빌드에서 컴파일 성공으로 실제 빌드 무결성을 확인함. + +- [2026-03-05] 무엇/왜/어떻게: 운영 스킴 기준 회귀 확인을 위해 앱 빌드를 수행함. + - 실행 명령: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build` + - 결과: `** BUILD SUCCEEDED **` + +- [2026-03-05] 무엇/왜/어떻게: 개발 스킴 기준 회귀 확인을 위해 앱 빌드를 수행함. + - 실행 명령: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build` + - 결과: `** BUILD SUCCEEDED **` + +- [2026-03-05] 무엇/왜/어떻게: 테스트 액션 가능 여부 확인을 위해 두 스킴 테스트를 실행함. + - 실행 명령: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" test` + - 결과: `Scheme SodaLive is not currently configured for the test action.` + - 실행 명령: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" test` + - 결과: `Scheme SodaLive-dev is not currently configured for the test action.`