From 37c34ae91ea50f1b46640120bfa2cf6f2a069650 Mon Sep 17 00:00:00 2001 From: Yu Sung Date: Fri, 3 Jul 2026 18:13:04 +0900 Subject: [PATCH] =?UTF-8?q?feat(creator):=20=EB=8C=80=ED=99=94=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20=EC=95=A1=EC=85=98=EC=9D=84=20=EC=97=B0=EA=B2=B0?= =?UTF-8?q?=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SodaLive.xcodeproj/project.pbxproj | 8 ++ .../ic_new_create_live.imageset/Contents.json | 21 ++++ .../ic_new_create_live.png | Bin 0 -> 606 bytes .../Contents.json | 21 ++++ .../ic_new_upload_audio.png | Bin 0 -> 510 bytes .../Contents.json | 21 ++++ .../ic_new_upload_community_post.png | Bin 0 -> 506 bytes .../v2/ic_new_x_black.imageset/Contents.json | 21 ++++ .../ic_new_x_black.png | Bin 0 -> 295 bytes .../CreatorChannelHeaderSection.swift | 26 +---- .../CreatorChannel/CreatorChannelView.swift | 107 +++++++++++++++++- .../CreatorChannelTalkActionSection.swift | 37 ++++++ docs/20260701_크리에이터_채널_홈/plan-task.md | 4 +- 13 files changed, 242 insertions(+), 24 deletions(-) create mode 100644 SodaLive/Resources/Assets.xcassets/v2/ic_new_create_live.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/v2/ic_new_create_live.imageset/ic_new_create_live.png create mode 100644 SodaLive/Resources/Assets.xcassets/v2/ic_new_upload_audio.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/v2/ic_new_upload_audio.imageset/ic_new_upload_audio.png create mode 100644 SodaLive/Resources/Assets.xcassets/v2/ic_new_upload_community_post.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/v2/ic_new_upload_community_post.imageset/ic_new_upload_community_post.png create mode 100644 SodaLive/Resources/Assets.xcassets/v2/ic_new_x_black.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/v2/ic_new_x_black.imageset/ic_new_x_black.png create mode 100644 SodaLive/Sources/V2/CreatorChannel/Home/Components/CreatorChannelTalkActionSection.swift diff --git a/SodaLive.xcodeproj/project.pbxproj b/SodaLive.xcodeproj/project.pbxproj index c643c7d7..1d5bf79a 100644 --- a/SodaLive.xcodeproj/project.pbxproj +++ b/SodaLive.xcodeproj/project.pbxproj @@ -61,6 +61,9 @@ CC0101272FF0100000A5BBA3 /* CreatorChannelSnsSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC0100272FF0100000A5BBA3 /* CreatorChannelSnsSection.swift */; }; CC0102272FF0100000A5BBA3 /* CreatorChannelSnsSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC0100272FF0100000A5BBA3 /* CreatorChannelSnsSection.swift */; }; CC0103272FF0100000A5BBA3 /* CreatorChannelSnsSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC0100272FF0100000A5BBA3 /* CreatorChannelSnsSection.swift */; }; + CC0101282FF0100000A5BBA3 /* CreatorChannelTalkActionSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC0100282FF0100000A5BBA3 /* CreatorChannelTalkActionSection.swift */; }; + CC0102282FF0100000A5BBA3 /* CreatorChannelTalkActionSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC0100282FF0100000A5BBA3 /* CreatorChannelTalkActionSection.swift */; }; + CC0103282FF0100000A5BBA3 /* CreatorChannelTalkActionSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC0100282FF0100000A5BBA3 /* CreatorChannelTalkActionSection.swift */; }; CC0101082FF0100000A5BBA3 /* CreatorChannelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC0100082FF0100000A5BBA3 /* CreatorChannelView.swift */; }; CC0102082FF0100000A5BBA3 /* CreatorChannelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC0100082FF0100000A5BBA3 /* CreatorChannelView.swift */; }; CC0103082FF0100000A5BBA3 /* CreatorChannelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC0100082FF0100000A5BBA3 /* CreatorChannelView.swift */; }; @@ -1798,6 +1801,7 @@ CC01001E2FF0100000A5BBA3 /* CreatorChannelIntroduceSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreatorChannelIntroduceSection.swift; sourceTree = ""; }; CC01001F2FF0100000A5BBA3 /* CreatorChannelActivitySection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreatorChannelActivitySection.swift; sourceTree = ""; }; CC0100272FF0100000A5BBA3 /* CreatorChannelSnsSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreatorChannelSnsSection.swift; sourceTree = ""; }; + CC0100282FF0100000A5BBA3 /* CreatorChannelTalkActionSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreatorChannelTalkActionSection.swift; sourceTree = ""; }; 0BBDC3ECBBE049EAA4057D3A /* PostChannelDonationRequest.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PostChannelDonationRequest.swift; sourceTree = ""; }; 0EC05859619BDC03056911E7 /* MainTab.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = MainTab.swift; sourceTree = ""; }; 189350EA101CF12EEBA6EC1D /* MainTabBarView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = MainTabBarView.swift; sourceTree = ""; }; @@ -2730,6 +2734,7 @@ CC01001E2FF0100000A5BBA3 /* CreatorChannelIntroduceSection.swift */, CC01001F2FF0100000A5BBA3 /* CreatorChannelActivitySection.swift */, CC0100272FF0100000A5BBA3 /* CreatorChannelSnsSection.swift */, + CC0100282FF0100000A5BBA3 /* CreatorChannelTalkActionSection.swift */, ); path = Components; sourceTree = ""; @@ -5677,6 +5682,7 @@ CC01011E2FF0100000A5BBA3 /* CreatorChannelIntroduceSection.swift in Sources */, CC01011F2FF0100000A5BBA3 /* CreatorChannelActivitySection.swift in Sources */, CC0101272FF0100000A5BBA3 /* CreatorChannelSnsSection.swift in Sources */, + CC0101282FF0100000A5BBA3 /* CreatorChannelTalkActionSection.swift in Sources */, CC0101082FF0100000A5BBA3 /* CreatorChannelView.swift in Sources */, CC0101112FF0100000A5BBA3 /* CreatorChannelTitleBar.swift in Sources */, CC0101122FF0100000A5BBA3 /* CreatorChannelHeaderSection.swift in Sources */, @@ -6487,6 +6493,7 @@ CC01021E2FF0100000A5BBA3 /* CreatorChannelIntroduceSection.swift in Sources */, CC01021F2FF0100000A5BBA3 /* CreatorChannelActivitySection.swift in Sources */, CC0102272FF0100000A5BBA3 /* CreatorChannelSnsSection.swift in Sources */, + CC0102282FF0100000A5BBA3 /* CreatorChannelTalkActionSection.swift in Sources */, CC0102082FF0100000A5BBA3 /* CreatorChannelView.swift in Sources */, CC0102112FF0100000A5BBA3 /* CreatorChannelTitleBar.swift in Sources */, CC0102122FF0100000A5BBA3 /* CreatorChannelHeaderSection.swift in Sources */, @@ -7313,6 +7320,7 @@ CC01031E2FF0100000A5BBA3 /* CreatorChannelIntroduceSection.swift in Sources */, CC01031F2FF0100000A5BBA3 /* CreatorChannelActivitySection.swift in Sources */, CC0103272FF0100000A5BBA3 /* CreatorChannelSnsSection.swift in Sources */, + CC0103282FF0100000A5BBA3 /* CreatorChannelTalkActionSection.swift in Sources */, CC0103082FF0100000A5BBA3 /* CreatorChannelView.swift in Sources */, CC0103112FF0100000A5BBA3 /* CreatorChannelTitleBar.swift in Sources */, CC0103122FF0100000A5BBA3 /* CreatorChannelHeaderSection.swift in Sources */, diff --git a/SodaLive/Resources/Assets.xcassets/v2/ic_new_create_live.imageset/Contents.json b/SodaLive/Resources/Assets.xcassets/v2/ic_new_create_live.imageset/Contents.json new file mode 100644 index 00000000..85852890 --- /dev/null +++ b/SodaLive/Resources/Assets.xcassets/v2/ic_new_create_live.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "ic_new_create_live.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SodaLive/Resources/Assets.xcassets/v2/ic_new_create_live.imageset/ic_new_create_live.png b/SodaLive/Resources/Assets.xcassets/v2/ic_new_create_live.imageset/ic_new_create_live.png new file mode 100644 index 0000000000000000000000000000000000000000..4bea4bc7eb42d2c49f7dbf8b121330cbef85f306 GIT binary patch literal 606 zcmV-k0-^nhP))Jr z+Xfv*7*6sp)6}KM^KJS)q zG$F!#D7k%r3%Rzit1$=*We^t1FJZdRnkP6D#-eCte}kT}Gp4wWU56C6U#?ENaI}@r ztk}Yi)&P!C}lTL(L0x2`}vbz^z z%(|B8hBqW#JyeB`e4s)^5(V6VVWSwzpA~lB=D_RHGgPHSV*Z~#v^Y*ZqAgm>Oe{F) sT*njr4I}Y!(k;7&8cNL80S5j%-_Z5TyR9QuZvX%Q07*qoM6N<$f@}2wVE_OC literal 0 HcmV?d00001 diff --git a/SodaLive/Resources/Assets.xcassets/v2/ic_new_upload_audio.imageset/Contents.json b/SodaLive/Resources/Assets.xcassets/v2/ic_new_upload_audio.imageset/Contents.json new file mode 100644 index 00000000..0571bedc --- /dev/null +++ b/SodaLive/Resources/Assets.xcassets/v2/ic_new_upload_audio.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "ic_new_upload_audio.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SodaLive/Resources/Assets.xcassets/v2/ic_new_upload_audio.imageset/ic_new_upload_audio.png b/SodaLive/Resources/Assets.xcassets/v2/ic_new_upload_audio.imageset/ic_new_upload_audio.png new file mode 100644 index 0000000000000000000000000000000000000000..98c1bd9ae8df349ff920442230fa9f55b201d524 GIT binary patch literal 510 zcmVmD;FkYr|wgLxIJ%deINd`}bI5h+9G{pMZsQl)ZY)VdyI<*X`bR zl+mv)?ap^8F^wH71=r0VQc;9sY?H8z5p27IN|#f%vMXq#gKBeOZM^O~93At$uoTlU zQ?jFf-8Ye7!Hqsa&(N#UFFcH$%GNa*H)m2w&pKbv$90^$;Qc%%b4;j8-~zgXexV&s z<(?u@#?T1pzV9L*9C^;A^;q@TC-g9>Z9IGa0Q87bAOV8HZ2$lO07*qoM6N<$f{={W ASpWb4 literal 0 HcmV?d00001 diff --git a/SodaLive/Resources/Assets.xcassets/v2/ic_new_upload_community_post.imageset/Contents.json b/SodaLive/Resources/Assets.xcassets/v2/ic_new_upload_community_post.imageset/Contents.json new file mode 100644 index 00000000..377615f6 --- /dev/null +++ b/SodaLive/Resources/Assets.xcassets/v2/ic_new_upload_community_post.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "ic_new_upload_community_post.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SodaLive/Resources/Assets.xcassets/v2/ic_new_upload_community_post.imageset/ic_new_upload_community_post.png b/SodaLive/Resources/Assets.xcassets/v2/ic_new_upload_community_post.imageset/ic_new_upload_community_post.png new file mode 100644 index 0000000000000000000000000000000000000000..e9ed0eb2080f1e5e57ff6e861ce878128cfdd010 GIT binary patch literal 506 zcmVr{HsCp@3jHlDry0AX_MqD4S8-v9sr07*qoM6N<$f*#1yA^-pY literal 0 HcmV?d00001 diff --git a/SodaLive/Resources/Assets.xcassets/v2/ic_new_x_black.imageset/Contents.json b/SodaLive/Resources/Assets.xcassets/v2/ic_new_x_black.imageset/Contents.json new file mode 100644 index 00000000..eeb6cb71 --- /dev/null +++ b/SodaLive/Resources/Assets.xcassets/v2/ic_new_x_black.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "ic_new_x_black.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SodaLive/Resources/Assets.xcassets/v2/ic_new_x_black.imageset/ic_new_x_black.png b/SodaLive/Resources/Assets.xcassets/v2/ic_new_x_black.imageset/ic_new_x_black.png new file mode 100644 index 0000000000000000000000000000000000000000..73633d6d398e7c64e2667447d4f75dea2591cc54 GIT binary patch literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^SI14-?iy0WWg+Z8+Vb&Z8pde#$ zkh>GZx^prwfgF}}M_)$E)e-c@Ne7+Lbh?3y^w370~qErUA%=FyEc^juC17#L@ zx;TbZFutA6$kk%N!!o`4q|H|Qy~`_#LPP{N<}PwH3SjXyWA@q@G)d*;@5H#JamuNG zo0nDAvNNxg3_dH<=9{oyhE4L>!4sZYDGvVr;wC&YH3TgG kM2WN7^r(1Fa(TwS`Fw%+-Qu^afv#onboFyt=akR{08t2HumAu6 literal 0 HcmV?d00001 diff --git a/SodaLive/Sources/V2/CreatorChannel/Components/CreatorChannelHeaderSection.swift b/SodaLive/Sources/V2/CreatorChannel/Components/CreatorChannelHeaderSection.swift index fa2276aa..5b6ac85b 100644 --- a/SodaLive/Sources/V2/CreatorChannel/Components/CreatorChannelHeaderSection.swift +++ b/SodaLive/Sources/V2/CreatorChannel/Components/CreatorChannelHeaderSection.swift @@ -3,6 +3,7 @@ import Kingfisher struct CreatorChannelHeaderSection: View { let creator: CreatorChannelCreatorResponse + let onTapTalk: () -> Void var body: some View { ZStack(alignment: .bottom) { @@ -49,7 +50,10 @@ struct CreatorChannelHeaderSection: View { .foregroundColor(.white) .multilineTextAlignment(.center) - talkButton + CreatorChannelTalkActionSection( + isAiChatAvailable: creator.isAiChatAvailable, + onTapTalk: onTapTalk + ) } .frame(maxWidth: .infinity) .padding(.horizontal, SodaSpacing.s24) @@ -57,24 +61,4 @@ struct CreatorChannelHeaderSection: View { } .frame(width: screenSize().width, height: screenSize().width) } - - private var talkButton: some View { - Button(action: {}) { - HStack(spacing: SodaSpacing.s6) { - Image("ic_new_talk") - .resizable() - .frame(width: 20, height: 20) - - Text(I18n.CreatorChannelHome.talk) - .appFont(size: 16, weight: .medium) - .foregroundColor(.white) - } - .padding(SodaSpacing.s12) - .overlay( - Capsule() - .stroke(Color.white.opacity(0.3), lineWidth: 1) - ) - } - .buttonStyle(.plain) - } } diff --git a/SodaLive/Sources/V2/CreatorChannel/CreatorChannelView.swift b/SodaLive/Sources/V2/CreatorChannel/CreatorChannelView.swift index f72e64be..7db5895e 100644 --- a/SodaLive/Sources/V2/CreatorChannel/CreatorChannelView.swift +++ b/SodaLive/Sources/V2/CreatorChannel/CreatorChannelView.swift @@ -1,13 +1,22 @@ import SwiftUI +import Bootpay +import BootpayUI struct CreatorChannelView: View { let creatorId: Int @StateObject private var viewModel = CreatorChannelViewModel() @StateObject private var channelDonationViewModel = ChannelDonationViewModel() + @StateObject private var mypageViewModel = MyPageViewModel() + @AppStorage("token") private var token: String = UserDefaults.string(forKey: UserDefaultsKey.token) + @AppStorage("auth") private var auth: Bool = UserDefaults.bool(forKey: UserDefaultsKey.auth) @Environment(\.dismiss) private var dismiss @State private var tabBarMinY: CGFloat = .greatestFiniteMagnitude @State private var isShowChannelDonationDialog = false + @State private var isShowAuthView = false + @State private var isShowAuthConfirmView = false + @State private var pendingAction: (() -> Void)? = nil + @State private var payload = Payload() private let titleBarHeight: CGFloat = 56 private let tabBarHeight: CGFloat = 52 @@ -68,6 +77,10 @@ struct CreatorChannelView: View { LoadingView() } + if isShowAuthConfirmView { + authConfirmDialog + } + if isShowChannelDonationDialog { LiveRoomDonationDialogView( isShowing: $isShowChannelDonationDialog, @@ -92,7 +105,11 @@ struct CreatorChannelView: View { } } .navigationBarBackButtonHidden(true) + .fullScreenCover(isPresented: $isShowAuthView) { + authView + } .onAppear { + configurePayload() if viewModel.hasLoaded == false { viewModel.fetchHome(creatorId: creatorId) } @@ -129,7 +146,7 @@ struct CreatorChannelView: View { @ViewBuilder private var headerSection: some View { if let creator = viewModel.response?.creator { - CreatorChannelHeaderSection(creator: creator) + CreatorChannelHeaderSection(creator: creator, onTapTalk: handleTalkTap) } } @@ -168,6 +185,57 @@ struct CreatorChannelView: View { } } + + private var authConfirmDialog: some View { + SodaDialog( + title: I18n.Chat.Auth.dialogTitle, + desc: I18n.Chat.Auth.dialogDescription, + confirmButtonTitle: I18n.Chat.Auth.goToVerification, + confirmButtonAction: { + isShowAuthConfirmView = false + isShowAuthView = true + }, + cancelButtonTitle: I18n.Common.cancel, + cancelButtonAction: { + isShowAuthConfirmView = false + pendingAction = nil + }, + textAlignment: .center + ) + } + + private var authView: some View { + BootpayUI(payload: payload, requestType: BootpayRequest.TYPE_AUTHENTICATION) + .onConfirm { _ in true } + .onCancel { _ in isShowAuthView = false } + .onError { _ in + AppState.shared.errorMessage = I18n.Chat.Auth.authenticationError + AppState.shared.isShowErrorPopup = true + isShowAuthView = false + } + .onDone { + DEBUG_LOG("onDone: \($0)") + mypageViewModel.authVerify($0) { + auth = true + isShowAuthView = false + if let action = pendingAction { + pendingAction = nil + action() + } + } + } + .onClose { isShowAuthView = false } + } + + private func configurePayload() { + payload.applicationId = BOOTPAY_APP_ID + payload.price = 0 + payload.pg = "다날" + payload.method = "본인인증" + payload.orderName = "본인인증" + payload.authenticationId = "\(UserDefaults.string(forKey: .nickname))__\(String(NSTimeIntervalSince1970))" + } + private func selectTab(_ tab: CreatorChannelTab) { switch tab { case .audio: @@ -228,6 +296,43 @@ struct CreatorChannelView: View { } } + private func handleTalkTap() { + guard let characterId = viewModel.response?.creator.characterId, characterId > 0 else { return } + + let trimmed = token.trimmingCharacters(in: .whitespacesAndNewlines) + guard !trimmed.isEmpty else { + AppState.shared.setAppStep(step: .login) + return + } + + let normalizedCountryCode = UserDefaults + .string(forKey: .countryCode) + .trimmingCharacters(in: .whitespacesAndNewlines) + .uppercased() + let isKoreanCountry = normalizedCountryCode.isEmpty || normalizedCountryCode == "KR" + + if isKoreanCountry && auth == false { + pendingAction = { + AppState.shared.setAppStep(step: .characterDetail(characterId: characterId)) + } + isShowAuthConfirmView = true + return + } + + if !UserDefaults.isAdultContentVisible() { + pendingAction = nil + moveToContentSettingsWithGuideToast() + return + } + + AppState.shared.setAppStep(step: .characterDetail(characterId: characterId)) + } + + private func moveToContentSettingsWithGuideToast() { + AppState.shared.setPendingContentSettingsGuideMessage(I18n.Settings.adultContentEnableGuide) + AppState.shared.setAppStep(step: .contentViewSettings) + } + private func showDonationDialog() { guard let creatorId = viewModel.response?.creator.creatorId else { return } channelDonationViewModel.setCreatorId(creatorId, shouldFetch: false) diff --git a/SodaLive/Sources/V2/CreatorChannel/Home/Components/CreatorChannelTalkActionSection.swift b/SodaLive/Sources/V2/CreatorChannel/Home/Components/CreatorChannelTalkActionSection.swift new file mode 100644 index 00000000..2299b054 --- /dev/null +++ b/SodaLive/Sources/V2/CreatorChannel/Home/Components/CreatorChannelTalkActionSection.swift @@ -0,0 +1,37 @@ +import SwiftUI + +struct CreatorChannelTalkActionSection: View { + let isAiChatAvailable: Bool + let onTapTalk: () -> Void + + var body: some View { + HStack { + Spacer() + + if isAiChatAvailable { + Button(action: onTapTalk) { + HStack(spacing: SodaSpacing.s6) { + Image("ic_new_talk") + .resizable() + .frame(width: 20, height: 20) + + Text(I18n.CreatorChannelHome.talk) + .appFont(size: 16, weight: .medium) + .foregroundColor(.white) + } + .padding(SodaSpacing.s12) + .overlay( + Capsule() + .stroke(Color.white.opacity(0.3), lineWidth: 1) + ) + } + .buttonStyle(.plain) + } + + Spacer() + } + .frame(height: 44) + .frame(maxWidth: .infinity) + .padding(.bottom, 14) + } +} diff --git a/docs/20260701_크리에이터_채널_홈/plan-task.md b/docs/20260701_크리에이터_채널_홈/plan-task.md index bafb1fad..0ef9f677 100644 --- a/docs/20260701_크리에이터_채널_홈/plan-task.md +++ b/docs/20260701_크리에이터_채널_홈/plan-task.md @@ -541,7 +541,7 @@ ### Phase 17: 대화하기 액션 영역 -- [ ] **Task 17.1: 대화하기 액션 섹션 생성** +- [x] **Task 17.1: 대화하기 액션 섹션 생성** - 대상 파일: - 생성: `SodaLive/Sources/V2/CreatorChannel/Home/Components/CreatorChannelTalkActionSection.swift` - 수정: `SodaLive/Sources/V2/CreatorChannel/Home/CreatorChannelHomeView.swift` @@ -556,7 +556,7 @@ - 실행 명령: `rg "struct CreatorChannelTalkActionSection|isAiChatAvailable|ic_new_talk|ic_new_dm|frame\\(height|onTapTalk" SodaLive/Sources/V2/CreatorChannel/Home/Components/CreatorChannelTalkActionSection.swift` - 기대 결과: 대화하기만 조건부 표시되고 DM 버튼 구현이 없다. -- [ ] **Task 17.2: 기존 AI 채팅방 진입 guard 연결** +- [x] **Task 17.2: 기존 AI 채팅방 진입 guard 연결** - 대상 파일: - 수정: `SodaLive/Sources/V2/CreatorChannel/CreatorChannelView.swift` - 수정: `SodaLive/Sources/V2/CreatorChannel/Home/CreatorChannelHomeView.swift`