From 89c1f55978071ef921bfcd802a04124f6bb8ed75 Mon Sep 17 00:00:00 2001 From: yeonthusiast <0727ha@naver.com> Date: Mon, 12 Jan 2026 01:00:14 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=95=8C=EB=A6=BC=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- today-s-sound/Data/Models/Subscription.swift | 6 +++--- .../AddSubscription/AddSubscriptionView.swift | 10 +++++----- .../AddSubscription/AddSubscriptionViewModel.swift | 12 ++++++------ .../Component/SubscriptionCardView.swift | 6 ++---- 4 files changed, 16 insertions(+), 18 deletions(-) diff --git a/today-s-sound/Data/Models/Subscription.swift b/today-s-sound/Data/Models/Subscription.swift index 13fb059..7662993 100644 --- a/today-s-sound/Data/Models/Subscription.swift +++ b/today-s-sound/Data/Models/Subscription.swift @@ -8,7 +8,7 @@ struct CreateSubscriptionRequest: Codable { let keywordIds: [Int64] let alias: String? let isAlarmEnabled: Bool - + enum CodingKeys: String, CodingKey { case urlId case keywordIds @@ -22,11 +22,11 @@ struct UpdateSubscriptionRequest: Codable { let keywordIds: [Int64] let alias: String? let isAlarmEnabled: Bool - + enum CodingKeys: String, CodingKey { case keywordIds case alias - case isAlarmEnabled = "isAlarmEnabled" + case isAlarmEnabled } } diff --git a/today-s-sound/Presentation/Features/AddSubscription/AddSubscriptionView.swift b/today-s-sound/Presentation/Features/AddSubscription/AddSubscriptionView.swift index 2b6ea21..f9d2e44 100644 --- a/today-s-sound/Presentation/Features/AddSubscription/AddSubscriptionView.swift +++ b/today-s-sound/Presentation/Features/AddSubscription/AddSubscriptionView.swift @@ -5,7 +5,7 @@ struct AddSubscriptionView: View { @EnvironmentObject var appTheme: AppThemeManager @Environment(\.dismiss) var dismiss var onSuccess: (() -> Void)? - + init(subscriptionToEdit: SubscriptionItem? = nil, onSuccess: (() -> Void)? = nil) { _viewModel = StateObject(wrappedValue: AddSubscriptionViewModel(subscriptionToEdit: subscriptionToEdit)) self.onSuccess = onSuccess @@ -30,7 +30,7 @@ struct AddSubscriptionView: View { .accessibilityHint("탭하거나 두 손가락을 아래로 스와이프하면 창이 닫힙니다") // 화면 제목 - ScreenSubTitle(text: viewModel.isEditMode ? "구독 수정" : "새 웹페이지 추가", theme: appTheme.theme) + ScreenSubTitle(text: viewModel.isEditMode ? "구독 웹페이지 수정" : "새 웹페이지 추가", theme: appTheme.theme) .padding(.bottom, 8) .padding(.top, 4) @@ -86,7 +86,7 @@ struct AddSubscriptionView: View { } .onAppear { // 수정 모드일 때 키워드 목록 자동 로드 - if viewModel.isEditMode && viewModel.availableKeywords.isEmpty { + if viewModel.isEditMode, viewModel.availableKeywords.isEmpty { viewModel.loadKeywords() } } @@ -242,7 +242,7 @@ struct AddSubscriptionView: View { HStack(alignment: .top, spacing: 16) { // 타이틀과 설명을 왼쪽에 배치 (보이스오버 순서: 타이틀 → 설명) VStack(alignment: .leading, spacing: 12) { - Text("알림 받기") + Text("새로운 글을 알림으로 받기") .font(.KoddiBold20) .foregroundColor(Color.text(appTheme.theme)) @@ -258,7 +258,7 @@ struct AddSubscriptionView: View { // 토글을 오른쪽에 배치 (보이스오버에서는 마지막에 읽힘) Toggle("", isOn: $viewModel.isAlarmEnabled) .labelsHidden() - .accessibilityLabel("알림 받기") + .accessibilityLabel("알림") .accessibilityValue(viewModel.isAlarmEnabled ? "켜짐" : "꺼짐") } .padding(.vertical) diff --git a/today-s-sound/Presentation/Features/AddSubscription/AddSubscriptionViewModel.swift b/today-s-sound/Presentation/Features/AddSubscription/AddSubscriptionViewModel.swift index 30d1aee..441937e 100644 --- a/today-s-sound/Presentation/Features/AddSubscription/AddSubscriptionViewModel.swift +++ b/today-s-sound/Presentation/Features/AddSubscription/AddSubscriptionViewModel.swift @@ -39,12 +39,12 @@ final class AddSubscriptionViewModel: ObservableObject { init(subscriptionToEdit: SubscriptionItem? = nil, apiService: APIService = APIService()) { self.subscriptionToEdit = subscriptionToEdit self.apiService = apiService - + // 수정 모드일 때 기존 값 로드 if let subscription = subscriptionToEdit { nameText = subscription.alias isAlarmEnabled = subscription.isAlarmEnabled - selectedKeywordIds = subscription.keywords.map { $0.id } + selectedKeywordIds = subscription.keywords.map(\.id) // URL은 수정 불가이므로 표시만 하기 위해 URLItem을 찾아서 설정 // 실제로는 URL 선택 섹션을 비활성화할 예정 } @@ -77,7 +77,7 @@ final class AddSubscriptionViewModel: ObservableObject { createSubscriptionInternal(completion: completion) } } - + /// 구독 생성 API 호출 private func createSubscriptionInternal(completion: @escaping (Bool) -> Void) { guard !isLoading else { return } @@ -145,13 +145,13 @@ final class AddSubscriptionViewModel: ObservableObject { completion(true) } ) - .store(in: &cancellables) + .store(in: &cancellables) } - + /// 구독 수정 API 호출 private func updateSubscription(completion: @escaping (Bool) -> Void) { guard !isLoading else { return } - guard let subscriptionId = subscriptionId else { + guard let subscriptionId else { errorMessage = "구독 정보가 없습니다" completion(false) return diff --git a/today-s-sound/Presentation/Features/SubscriptionList/Component/SubscriptionCardView.swift b/today-s-sound/Presentation/Features/SubscriptionList/Component/SubscriptionCardView.swift index adfb5a7..e8e83f5 100644 --- a/today-s-sound/Presentation/Features/SubscriptionList/Component/SubscriptionCardView.swift +++ b/today-s-sound/Presentation/Features/SubscriptionList/Component/SubscriptionCardView.swift @@ -89,12 +89,10 @@ struct SubscriptionCardView: View { Image(systemName: "pencil") .resizable() .scaledToFit() - .frame(width: 44, height: 44) - .frame(width: 44, height: 44) - .foregroundColor(Color.text(theme)) + .frame(width: 40, height: 40) + .foregroundColor(.primaryGreen) .contentShape(Rectangle()) } - .buttonStyle(.plain) .accessibilityLabel("구독 수정") .accessibilityHint("탭하면 구독 정보를 수정할 수 있습니다") }