From 9a228c4b526dfdee30190e761b50dc4d481beb8b Mon Sep 17 00:00:00 2001 From: giljihun Date: Tue, 20 Jan 2026 19:55:16 +0900 Subject: [PATCH 01/17] =?UTF-8?q?feat:=20KeyringMakerRoute=20enum=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Workshop에서 Making관련 라우트 추출 - 템플릿별 라우트 정의 - from 메서드 정의 (문자열 받아서 해당 라우트로 바꿔주는 변환기) --- .../Navigation/Routes/KeyringMakerRoute.swift | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 Keychy/Keychy/Core/Navigation/Routes/KeyringMakerRoute.swift diff --git a/Keychy/Keychy/Core/Navigation/Routes/KeyringMakerRoute.swift b/Keychy/Keychy/Core/Navigation/Routes/KeyringMakerRoute.swift new file mode 100644 index 000000000..933e174f2 --- /dev/null +++ b/Keychy/Keychy/Core/Navigation/Routes/KeyringMakerRoute.swift @@ -0,0 +1,75 @@ +// +// KeyringMakerRoute.swift +// Keychy +// +// 키링 제작 모듈 라우팅 +// + +import Foundation + +/// 키링 제작(KeyringMaker) 모듈 라우팅 +enum KeyringMakerRoute: Hashable { + // MARK: - 아크릴 포토 템플릿 + case acrylicPhotoPreview + case acrylicPhotoCrop + case acrylicPhotoEdited + case acrylicPhotoCustomizing + case acrylicPhotoInfoInput + case acrylicPhotoComplete + + // MARK: - 네온 사인 템플릿 + case neonSignPreview + case neonSignCustomizing + case neonSignInfoInput + case neonSignComplete + + // MARK: - 폴라로이드 템플릿 + case polaroidPreview + case polaroidCustomizing + case polaroidInfoInput + case polaroidComplete + + // MARK: - 클리어 스케치 템플릿 + case clearSketchPreview + case clearSketchDrawing + case clearSketchCrop + case clearSketchCustomizing + case clearSketchInfoInput + case clearSketchComplete + + // MARK: - 픽셀 키링 템플릿 + case pixelPreview + case pixelDraw + case pixelCustomizing + case pixelInfoInput + case pixelComplete + + // MARK: - 말풍선 키링 템플릿 + case speechBubblePreview + case speechBubbleCustomizing + case speechBubbleInfoInput + case speechBubbleComplete + + // MARK: - 공통 + case coinCharge + + /// template.id 문자열을 KeyringMakerRoute로 변환 + static func from(string: String) -> KeyringMakerRoute? { + switch string { + case "AcrylicPhoto": + return .acrylicPhotoPreview + case "NeonSign": + return .neonSignPreview + case "Polaroid": + return .polaroidPreview + case "ClearSketch": + return .clearSketchPreview + case "PixelKeyring": + return .pixelPreview + case "SpeechBubble": + return .speechBubblePreview + default: + return nil + } + } +} From 1a826172072390ee3465f7d16cb152ba3f9cd32d Mon Sep 17 00:00:00 2001 From: giljihun Date: Tue, 20 Jan 2026 20:16:41 +0900 Subject: [PATCH 02/17] =?UTF-8?q?feat:=20KeryingMaker=20dual-router=20?= =?UTF-8?q?=EC=9D=B8=ED=94=84=EB=9D=BC=20=EA=B5=AC=EC=B6=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit KeryingMakerROute를 정의했고, 이를 사용하기 위해 여러 뷰에서 주입받는 라우터 수정 --- .../ViewModels/Showcase25BoardViewModel.swift | 1 + .../Tab/ViewModels/MainTabViewModel.swift | 24 + .../Presentation/Tab/Views/MainTabView.swift | 1 + .../Presentation/Tab/Views/WorkshopTab.swift | 429 ++++++++++-------- .../Shared/Views/KeyringCompleteView.swift | 6 +- .../Shared/Views/KeyringCustomizingView.swift | 4 +- .../Shared/Views/KeyringInfoInputView.swift | 4 +- .../Presentation/Workshop/MyItemsView.swift | 4 + .../Workshop/WorkshopComponents.swift | 16 +- .../WorkshopMain/WorkshopGridHelpers.swift | 5 + .../WorkshopMainContentSection.swift | 2 + .../WorkshopMain/WorkshopTemplatesView.swift | 8 +- .../Workshop/WorkshopMain/WorkshopView.swift | 14 +- 13 files changed, 303 insertions(+), 215 deletions(-) diff --git a/Keychy/Keychy/Presentation/Festival/ViewModels/Showcase25BoardViewModel.swift b/Keychy/Keychy/Presentation/Festival/ViewModels/Showcase25BoardViewModel.swift index 2bd48d476..f38c92f9e 100644 --- a/Keychy/Keychy/Presentation/Festival/ViewModels/Showcase25BoardViewModel.swift +++ b/Keychy/Keychy/Presentation/Festival/ViewModels/Showcase25BoardViewModel.swift @@ -23,6 +23,7 @@ class Showcase25BoardViewModel { // MARK: - Festival에서 Workshop으로 갔을 때 사용 var isFromFestivalTab: Bool = false var onKeyringCompleteFromFestival: ((NavigationRouter) -> Void)? + var onKeyringCompleteFromFestivalKeyringMaker: ((NavigationRouter) -> Void)? // MARK: - 선택된 키링 디테일 var selectedShowcaseKeyring: ShowcaseFestivalKeyring? diff --git a/Keychy/Keychy/Presentation/Tab/ViewModels/MainTabViewModel.swift b/Keychy/Keychy/Presentation/Tab/ViewModels/MainTabViewModel.swift index 07c4ecc50..c68555d6a 100644 --- a/Keychy/Keychy/Presentation/Tab/ViewModels/MainTabViewModel.swift +++ b/Keychy/Keychy/Presentation/Tab/ViewModels/MainTabViewModel.swift @@ -36,6 +36,7 @@ class MainTabViewModel { var homeRouter = NavigationRouter() var collectionRouter = NavigationRouter() var workshopRouter = NavigationRouter() + var keyringMakerRouter = NavigationRouter() var festivalRouter = NavigationRouter() // Sheets @@ -90,6 +91,18 @@ class MainTabViewModel { } } + /// Festival 탭에서 KeyringMaker로 전환하고 특정 라우트로 이동 + /// - Parameter route: 이동할 KeyringMakerRoute + func handleSwitchToKeyringMaker(_ route: KeyringMakerRoute) { + setupFestivalReturnCallbackForKeyringMaker() + + selectedTab = TabIndex.workshop.rawValue + Task { @MainActor in + try? await Task.sleep(for: .seconds(Delay.tabSwitchAnimation)) + keyringMakerRouter.push(route) + } + } + // MARK: - Private Methods /// Festival → Workshop 이동 시 완료 후 복귀 콜백 설정 private func setupFestivalReturnCallback() { @@ -102,6 +115,17 @@ class MainTabViewModel { } } + /// Festival → KeyringMaker 이동 시 완료 후 복귀 콜백 설정 + private func setupFestivalReturnCallbackForKeyringMaker() { + festivalViewModel.isFromFestivalTab = true + festivalViewModel.onKeyringCompleteFromFestivalKeyringMaker = { [weak self] router in + guard let self = self else { return } + router.reset() + self.selectedTab = TabIndex.festival.rawValue + self.festivalViewModel.isFromFestivalTab = false + } + } + /// 대기 중인 딥링크가 있는지 확인하고 처리 private func checkPendingDeepLink() { if let (postOfficeId, type) = deepLinkManager.consumePendingDeepLink() { diff --git a/Keychy/Keychy/Presentation/Tab/Views/MainTabView.swift b/Keychy/Keychy/Presentation/Tab/Views/MainTabView.swift index 5a2b8345c..4a9f11889 100644 --- a/Keychy/Keychy/Presentation/Tab/Views/MainTabView.swift +++ b/Keychy/Keychy/Presentation/Tab/Views/MainTabView.swift @@ -99,6 +99,7 @@ extension MainTabView { private var workshopTab: some View { WorkshopTab( router: viewModel.workshopRouter, + keyringMakerRouter: viewModel.keyringMakerRouter, festivalRouter: viewModel.festivalRouter, festivalVM: viewModel.festivalViewModel ) diff --git a/Keychy/Keychy/Presentation/Tab/Views/WorkshopTab.swift b/Keychy/Keychy/Presentation/Tab/Views/WorkshopTab.swift index cf65c1c6e..5fdad43dd 100644 --- a/Keychy/Keychy/Presentation/Tab/Views/WorkshopTab.swift +++ b/Keychy/Keychy/Presentation/Tab/Views/WorkshopTab.swift @@ -1,5 +1,5 @@ // -// HomeTab.swift +// WorkshopTab.swift // KeytschPrototype // // Created by 길지훈 on 10/16/25. @@ -9,9 +9,10 @@ import SwiftUI struct WorkshopTab: View { @Bindable var router: NavigationRouter + @Bindable var keyringMakerRouter: NavigationRouter @Bindable var festivalRouter: NavigationRouter @Bindable var festivalVM: Showcase25BoardViewModel - + @State private var acrylicPhotoVM: AcrylicPhotoVM? @State private var neonSignVM: NeonSignVM? @State private var polaroidVM: PolaroidVM? @@ -21,212 +22,246 @@ struct WorkshopTab: View { @State private var workshopViewModel = WorkshopViewModel(userManager: UserManager.shared) var body: some View { - NavigationStack(path: $router.path) { - WorkshopView(router: router, viewModel: workshopViewModel) + ZStack { + // MARK: - Workshop (마켓플레이스) NavigationStack + NavigationStack(path: $router.path) { + WorkshopView( + router: router, + keyringMakerRouter: keyringMakerRouter, + viewModel: workshopViewModel + ) .navigationDestination(for: WorkshopRoute.self) { route in - switch route { + workshopDestination(for: route) + } + } + .tint(.black) - // MARK: - 공통 프리뷰 - case .workshopPreview(let item): - if let template = item.base as? KeyringTemplate { - WorkshopPreview(router: router, viewModel: workshopViewModel, item: template) - } else if let background = item.base as? Background { - WorkshopPreview(router: router, viewModel: workshopViewModel, item: background) - } else if let carabiner = item.base as? Carabiner { - WorkshopPreview(router: router, viewModel: workshopViewModel, item: carabiner) - } else if let particle = item.base as? Particle { - WorkshopPreview(router: router, viewModel: workshopViewModel, item: particle) - } else if let sound = item.base as? Sound { - WorkshopPreview(router: router, viewModel: workshopViewModel, item: sound) + // MARK: - KeyringMaker (제작 플로우) NavigationStack + if !keyringMakerRouter.path.isEmpty { + NavigationStack(path: $keyringMakerRouter.path) { + EmptyView() + .navigationDestination(for: KeyringMakerRoute.self) { route in + keyringMakerDestination(for: route) } - - // MARK: - 내 창고뷰 - case .myItems: - MyItemsView(router: router) + } + .tint(.black) + } + } + } + + // MARK: - Workshop Destinations + @ViewBuilder + private func workshopDestination(for route: WorkshopRoute) -> some View { + switch route { + // MARK: - 공통 프리뷰 + case .workshopPreview(let item): + if let template = item.base as? KeyringTemplate { + WorkshopPreview(router: router, viewModel: workshopViewModel, item: template) + } else if let background = item.base as? Background { + WorkshopPreview(router: router, viewModel: workshopViewModel, item: background) + } else if let carabiner = item.base as? Carabiner { + WorkshopPreview(router: router, viewModel: workshopViewModel, item: carabiner) + } else if let particle = item.base as? Particle { + WorkshopPreview(router: router, viewModel: workshopViewModel, item: particle) + } else if let sound = item.base as? Sound { + WorkshopPreview(router: router, viewModel: workshopViewModel, item: sound) + } + + // MARK: - 내 창고뷰 + case .myItems: + MyItemsView(router: router) - // MARK: - 템플릿 목록뷰 - case .workshopTemplates: - WorkshopTemplatesView(router: router) + // MARK: - 템플릿 목록뷰 + case .workshopTemplates: + WorkshopTemplatesView(router: router, keyringMakerRouter: keyringMakerRouter) - // MARK: - 재화 구매뷰 - case .coinCharge: - CoinChargeView( - router: router - ) + // MARK: - 재화 구매뷰 + case .coinCharge: + CoinChargeView(router: router) - // MARK: - AcrylicPhoto - case .acrylicPhotoPreview: - AcrylicPhotoPreView(router: router, viewModel: getAcrylicPhotoVM()) - case .acrylicPhotoCrop: - AcrylicPhotoCropView(router: router, viewModel: getAcrylicPhotoVM()) - case .acrylicPhotoEdited: - AcrylicPhotoEditedView(router: router, viewModel: getAcrylicPhotoVM()) - case .acrylicPhotoCustomizing: - KeyringCustomizingView( - router: router, - viewModel: getAcrylicPhotoVM(), - nextRoute: .acrylicPhotoInfoInput - ) - case .acrylicPhotoInfoInput: - KeyringInfoInputView( - router: router, - viewModel: getAcrylicPhotoVM(), - nextRoute: .acrylicPhotoComplete - ) - case .acrylicPhotoComplete: - KeyringCompleteView( - router: router, - viewModel: getAcrylicPhotoVM(), - navigationTitle: "키링이 완성되었어요!", - onCloseFromFestival: festivalVM.isFromFestivalTab ? { workshopRouter in - festivalVM.onKeyringCompleteFromFestival?(workshopRouter) - } : nil - ) + // MARK: - 쇼케이스용 페스티벌 임시 라우트 + case .showcase25BoardView: + Showcase25BoardView(festivalRouter: festivalRouter, workshopRouter: router, viewModel: festivalVM) - // MARK: - NeonSign - case .NeonSignPreView: - NeonSignPreView(router: router, viewModel: getNeonSignVM()) - case .neonSignCustomizing: - KeyringCustomizingView( - router: router, - viewModel: getNeonSignVM(), - nextRoute: .neonSignInfoInput - ) - case .neonSignInfoInput: - KeyringInfoInputView( - router: router, - viewModel: getNeonSignVM(), - nextRoute: .neonSignComplete - ) - case .neonSignComplete: - KeyringCompleteView( - router: router, - viewModel: getNeonSignVM(), - navigationTitle: "키링이 완성되었어요!", - onCloseFromFestival: festivalVM.isFromFestivalTab ? { workshopRouter in - festivalVM.onKeyringCompleteFromFestival?(workshopRouter) - } : nil - ) + case .festivalKeyringDetailView(let keyring): + FestivalKeyringDetailView( + festivalRouter: festivalRouter, + workshopRouter: router, + keyringMakerRouter: keyringMakerRouter, + viewModel: festivalVM, + keyring: keyring + ) + } + } - // MARK: - Polaroid - case .polaroidPreview: - PolaroidPreview(router: router, viewModel: getPolaroidVM()) - case .polaroidCustomizing: - KeyringCustomizingView( - router: router, - viewModel: getPolaroidVM(), - nextRoute: .polaroidInfoInput - ) - case .polaroidInfoInput: - KeyringInfoInputView( - router: router, - viewModel: getPolaroidVM(), - nextRoute: .polaroidComplete - ) - case .polaroidComplete: - KeyringCompleteView( - router: router, - viewModel: getPolaroidVM(), - navigationTitle: "키링이 완성되었어요!", - onCloseFromFestival: festivalVM.isFromFestivalTab ? { workshopRouter in - festivalVM.onKeyringCompleteFromFestival?(workshopRouter) - } : nil - ) - - // MARK: - Clear Sketch - case .clearSketchPreview: - ClearSketchPreview(router: router, viewModel: getClearSketchVM()) - case .clearSketchDrawing: - ClearSketchDrawingView(router: router, viewModel: getClearSketchVM()) - case .clearSketchCrop: - ClearSketchCropView(router: router, viewModel: getClearSketchVM()) - case .clearSketchCustomizing: - KeyringCustomizingView( - router: router, - viewModel: getClearSketchVM(), - nextRoute: .clearSketchInfoInput - ) - case .clearSketchInfoInput: - KeyringInfoInputView( - router: router, - viewModel: getClearSketchVM(), - nextRoute: .clearSketchComplete - ) - case .clearSketchComplete: - KeyringCompleteView( - router: router, - viewModel: getClearSketchVM(), - navigationTitle: "키링이 완성되었어요!", - onCloseFromFestival: festivalVM.isFromFestivalTab ? { workshopRouter in - festivalVM.onKeyringCompleteFromFestival?(workshopRouter) - } : nil - ) + // MARK: - KeyringMaker Destinations + @ViewBuilder + private func keyringMakerDestination(for route: KeyringMakerRoute) -> some View { + switch route { + // MARK: - 재화 구매 (공통) + case .coinCharge: + CoinChargeView(keyringMakerRouter: keyringMakerRouter) - // MARK: - PixelKeyring - case .pixelPreview: - PixelPreviewView(router: router, viewModel: getPixelKeyringVM()) - case .pixelDraw: - PixelDrawView(router: router, viewModel: getPixelKeyringVM()) - case .pixelCustomizing: - KeyringCustomizingView( - router: router, - viewModel: getPixelKeyringVM(), - nextRoute: .pixelInfoInput - ) - case .pixelInfoInput: - KeyringInfoInputView( - router: router, - viewModel: getPixelKeyringVM(), - nextRoute: .pixelComplete - ) - case .pixelComplete: - KeyringCompleteView( - router: router, - viewModel: getPixelKeyringVM(), - navigationTitle: "키링이 완성되었어요!", - onCloseFromFestival: festivalVM.isFromFestivalTab ? { workshopRouter in - festivalVM.onKeyringCompleteFromFestival?(workshopRouter) - } : nil - ) - - //MARK: - 쇼케이스용 페스티벌 임시 라우트 지정 - case .festivalKeyringDetailView(let keyring): - FestivalKeyringDetailView( - festivalRouter: festivalRouter, - workshopRouter: router, - viewModel: festivalVM, - keyring: keyring - ) + // MARK: - AcrylicPhoto + case .acrylicPhotoPreview: + AcrylicPhotoPreView(router: keyringMakerRouter, viewModel: getAcrylicPhotoVM()) + case .acrylicPhotoCrop: + AcrylicPhotoCropView(router: keyringMakerRouter, viewModel: getAcrylicPhotoVM()) + case .acrylicPhotoEdited: + AcrylicPhotoEditedView(router: keyringMakerRouter, viewModel: getAcrylicPhotoVM()) + case .acrylicPhotoCustomizing: + KeyringCustomizingView( + router: keyringMakerRouter, + viewModel: getAcrylicPhotoVM(), + nextRoute: .acrylicPhotoInfoInput + ) + case .acrylicPhotoInfoInput: + KeyringInfoInputView( + router: keyringMakerRouter, + viewModel: getAcrylicPhotoVM(), + nextRoute: .acrylicPhotoComplete + ) + case .acrylicPhotoComplete: + KeyringCompleteView( + router: keyringMakerRouter, + viewModel: getAcrylicPhotoVM(), + navigationTitle: "키링이 완성되었어요!", + onCloseFromFestival: festivalVM.isFromFestivalTab ? { router in + festivalVM.onKeyringCompleteFromFestivalKeyringMaker?(router) + } : nil + ) - // MARK: - SpeechBubble - case .speechBubblePreview: - SpeechBubblePreview(router: router, viewModel: getSpeechBubbleVM()) - case .speechBubbleCustomizing: - KeyringCustomizingView( - router: router, - viewModel: getSpeechBubbleVM(), - nextRoute: .speechBubbleInfoInput - ) - case .speechBubbleInfoInput: - KeyringInfoInputView( - router: router, - viewModel: getSpeechBubbleVM(), - nextRoute: .speechBubbleComplete - ) - case .speechBubbleComplete: - KeyringCompleteView( - router: router, - viewModel: getSpeechBubbleVM(), - navigationTitle: "키링이 완성되었어요!" - ) + // MARK: - NeonSign + case .neonSignPreview: + NeonSignPreView(router: keyringMakerRouter, viewModel: getNeonSignVM()) + case .neonSignCustomizing: + KeyringCustomizingView( + router: keyringMakerRouter, + viewModel: getNeonSignVM(), + nextRoute: .neonSignInfoInput + ) + case .neonSignInfoInput: + KeyringInfoInputView( + router: keyringMakerRouter, + viewModel: getNeonSignVM(), + nextRoute: .neonSignComplete + ) + case .neonSignComplete: + KeyringCompleteView( + router: keyringMakerRouter, + viewModel: getNeonSignVM(), + navigationTitle: "키링이 완성되었어요!", + onCloseFromFestival: festivalVM.isFromFestivalTab ? { router in + festivalVM.onKeyringCompleteFromFestivalKeyringMaker?(router) + } : nil + ) - // MARK: - 새로운 템플릿이 추가되면 여기에 루트를 지정해주면 됩니다. - case .showcase25BoardView: - Showcase25BoardView(festivalRouter: festivalRouter, workshopRouter: router, viewModel: festivalVM) - } - } + // MARK: - Polaroid + case .polaroidPreview: + PolaroidPreview(router: keyringMakerRouter, viewModel: getPolaroidVM()) + case .polaroidCustomizing: + KeyringCustomizingView( + router: keyringMakerRouter, + viewModel: getPolaroidVM(), + nextRoute: .polaroidInfoInput + ) + case .polaroidInfoInput: + KeyringInfoInputView( + router: keyringMakerRouter, + viewModel: getPolaroidVM(), + nextRoute: .polaroidComplete + ) + case .polaroidComplete: + KeyringCompleteView( + router: keyringMakerRouter, + viewModel: getPolaroidVM(), + navigationTitle: "키링이 완성되었어요!", + onCloseFromFestival: festivalVM.isFromFestivalTab ? { router in + festivalVM.onKeyringCompleteFromFestivalKeyringMaker?(router) + } : nil + ) + + // MARK: - ClearSketch + case .clearSketchPreview: + ClearSketchPreview(router: keyringMakerRouter, viewModel: getClearSketchVM()) + case .clearSketchDrawing: + ClearSketchDrawingView(router: keyringMakerRouter, viewModel: getClearSketchVM()) + case .clearSketchCrop: + ClearSketchCropView(router: keyringMakerRouter, viewModel: getClearSketchVM()) + case .clearSketchCustomizing: + KeyringCustomizingView( + router: keyringMakerRouter, + viewModel: getClearSketchVM(), + nextRoute: .clearSketchInfoInput + ) + case .clearSketchInfoInput: + KeyringInfoInputView( + router: keyringMakerRouter, + viewModel: getClearSketchVM(), + nextRoute: .clearSketchComplete + ) + case .clearSketchComplete: + KeyringCompleteView( + router: keyringMakerRouter, + viewModel: getClearSketchVM(), + navigationTitle: "키링이 완성되었어요!", + onCloseFromFestival: festivalVM.isFromFestivalTab ? { router in + festivalVM.onKeyringCompleteFromFestivalKeyringMaker?(router) + } : nil + ) + + // MARK: - Pixel + case .pixelPreview: + PixelPreviewView(router: keyringMakerRouter, viewModel: getPixelKeyringVM()) + case .pixelDraw: + PixelDrawView(router: keyringMakerRouter, viewModel: getPixelKeyringVM()) + case .pixelCustomizing: + KeyringCustomizingView( + router: keyringMakerRouter, + viewModel: getPixelKeyringVM(), + nextRoute: .pixelInfoInput + ) + case .pixelInfoInput: + KeyringInfoInputView( + router: keyringMakerRouter, + viewModel: getPixelKeyringVM(), + nextRoute: .pixelComplete + ) + case .pixelComplete: + KeyringCompleteView( + router: keyringMakerRouter, + viewModel: getPixelKeyringVM(), + navigationTitle: "키링이 완성되었어요!", + onCloseFromFestival: festivalVM.isFromFestivalTab ? { router in + festivalVM.onKeyringCompleteFromFestivalKeyringMaker?(router) + } : nil + ) + + // MARK: - SpeechBubble + case .speechBubblePreview: + SpeechBubblePreview(router: keyringMakerRouter, viewModel: getSpeechBubbleVM()) + case .speechBubbleCustomizing: + KeyringCustomizingView( + router: keyringMakerRouter, + viewModel: getSpeechBubbleVM(), + nextRoute: .speechBubbleInfoInput + ) + case .speechBubbleInfoInput: + KeyringInfoInputView( + router: keyringMakerRouter, + viewModel: getSpeechBubbleVM(), + nextRoute: .speechBubbleComplete + ) + case .speechBubbleComplete: + KeyringCompleteView( + router: keyringMakerRouter, + viewModel: getSpeechBubbleVM(), + navigationTitle: "키링이 완성되었어요!", + onCloseFromFestival: festivalVM.isFromFestivalTab ? { router in + festivalVM.onKeyringCompleteFromFestivalKeyringMaker?(router) + } : nil + ) } - .tint(.black) } // MARK: - ViewModel Lazy Getters @@ -256,7 +291,7 @@ struct WorkshopTab: View { } return viewModel } - + private func getClearSketchVM() -> ClearSketchVM { guard let viewModel = clearSketchVM else { let newViewModel = ClearSketchVM() diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringCompleteView.swift b/Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringCompleteView.swift index 2428c70d8..9fca0d30d 100644 --- a/Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringCompleteView.swift +++ b/Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringCompleteView.swift @@ -11,15 +11,15 @@ import SpriteKit import FirebaseFirestore struct KeyringCompleteView: View { - @Bindable var router: NavigationRouter + @Bindable var router: NavigationRouter @Bindable var viewModel: VM let navigationTitle: String var userManager: UserManager = UserManager.shared var reviewManager: ReviewManager = ReviewManager.shared - + // Festival에서 왔을 때 처리용 옵셔널 콜백 - var onCloseFromFestival: ((NavigationRouter) -> Void)? + var onCloseFromFestival: ((NavigationRouter) -> Void)? // 이미지 저장 @State var showImageSaved = false diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringCustomizingView.swift b/Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringCustomizingView.swift index 56e28888d..96882a322 100644 --- a/Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringCustomizingView.swift +++ b/Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringCustomizingView.swift @@ -12,9 +12,9 @@ import SpriteKit import Lottie struct KeyringCustomizingView: View { - @Bindable var router: NavigationRouter + @Bindable var router: NavigationRouter @State var viewModel: VM - let nextRoute: WorkshopRoute + let nextRoute: KeyringMakerRoute // 뒤로가기 시 팝만 하는 템플릿들 (초기화 경고 없음) let popOnlyTemplates = ["ClearSketch", "PixelKeyring"] diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringInfoInputView.swift b/Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringInfoInputView.swift index 4f3f6a462..2e3389d38 100644 --- a/Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringInfoInputView.swift +++ b/Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringInfoInputView.swift @@ -12,9 +12,9 @@ import Combine import FirebaseFirestore struct KeyringInfoInputView: View { - @Bindable var router: NavigationRouter + @Bindable var router: NavigationRouter @Bindable var viewModel: VM - let nextRoute: WorkshopRoute + let nextRoute: KeyringMakerRoute // UserManager 주입 var userManager: UserManager = UserManager.shared diff --git a/Keychy/Keychy/Presentation/Workshop/MyItemsView.swift b/Keychy/Keychy/Presentation/Workshop/MyItemsView.swift index c1ddbeb6d..b6490cdcc 100644 --- a/Keychy/Keychy/Presentation/Workshop/MyItemsView.swift +++ b/Keychy/Keychy/Presentation/Workshop/MyItemsView.swift @@ -147,6 +147,7 @@ struct MyItemsView: View { items: filteredOwnedTemplates, isOwnedCheck: { _ in false }, router: router, + keyringMakerRouter: nil, viewModel: viewModel, emptyView: emptyContentView ) @@ -155,6 +156,7 @@ struct MyItemsView: View { items: filteredOwnedBackgrounds, isOwnedCheck: { _ in false }, router: router, + keyringMakerRouter: nil, viewModel: viewModel, emptyView: emptyContentView ) @@ -163,6 +165,7 @@ struct MyItemsView: View { items: filteredOwnedCarabiners, isOwnedCheck: { _ in false }, router: router, + keyringMakerRouter: nil, viewModel: viewModel, emptyView: emptyContentView ) @@ -172,6 +175,7 @@ struct MyItemsView: View { isSoundOwned: { _ in false }, isParticleOwned: { _ in false }, router: router, + keyringMakerRouter: nil, viewModel: viewModel, emptyView: emptyContentView ) diff --git a/Keychy/Keychy/Presentation/Workshop/WorkshopComponents.swift b/Keychy/Keychy/Presentation/Workshop/WorkshopComponents.swift index 992185e75..2dd74fb6d 100644 --- a/Keychy/Keychy/Presentation/Workshop/WorkshopComponents.swift +++ b/Keychy/Keychy/Presentation/Workshop/WorkshopComponents.swift @@ -120,6 +120,7 @@ struct WorkshopItemView: View { let item: Item var isOwned: Bool = false var router: NavigationRouter? = nil + var keyringMakerRouter: NavigationRouter? = nil var viewModel: WorkshopViewModel? = nil @State private var isParticleReady = false @@ -205,16 +206,19 @@ struct WorkshopItemView: View { return } - guard let router = router else { return } - - // 키링일 경우 바로 해당 키링 Preview로 이동 + // 키링일 경우 KeyringMakerRouter를 사용하여 해당 키링 Preview로 이동 if let template = item as? KeyringTemplate, let templateId = template.id, - let route = WorkshopRoute.from(string: templateId) { - router.push(route) + let route = KeyringMakerRoute.from(string: templateId), + let keyringMakerRouter = keyringMakerRouter { + keyringMakerRouter.push(route) + return } + // 나머지 아이템들은 WorkshopPreview로 이동 - else if let background = item as? Background { + guard let router = router else { return } + + if let background = item as? Background { router.push(.workshopPreview(item: AnyHashable(background))) } else if let carabiner = item as? Carabiner { router.push(.workshopPreview(item: AnyHashable(carabiner))) diff --git a/Keychy/Keychy/Presentation/Workshop/WorkshopMain/WorkshopGridHelpers.swift b/Keychy/Keychy/Presentation/Workshop/WorkshopMain/WorkshopGridHelpers.swift index d39bdeeb6..f5ce9a571 100644 --- a/Keychy/Keychy/Presentation/Workshop/WorkshopMain/WorkshopGridHelpers.swift +++ b/Keychy/Keychy/Presentation/Workshop/WorkshopMain/WorkshopGridHelpers.swift @@ -15,6 +15,7 @@ struct WorkshopGridHelpers { items: [T], isOwnedCheck: @escaping (T) -> Bool, router: NavigationRouter?, + keyringMakerRouter: NavigationRouter?, viewModel: WorkshopViewModel?, emptyView: EmptyView ) -> some View { @@ -31,6 +32,7 @@ struct WorkshopGridHelpers { item: item, isOwned: isOwnedCheck(item), router: router, + keyringMakerRouter: keyringMakerRouter, viewModel: viewModel ) .id(item.id) @@ -48,6 +50,7 @@ struct WorkshopGridHelpers { isSoundOwned: @escaping (Sound) -> Bool, isParticleOwned: @escaping (Particle) -> Bool, router: NavigationRouter?, + keyringMakerRouter: NavigationRouter?, viewModel: WorkshopViewModel?, emptyView: EmptyView ) -> some View { @@ -65,6 +68,7 @@ struct WorkshopGridHelpers { item: sound, isOwned: isSoundOwned(sound), router: router, + keyringMakerRouter: keyringMakerRouter, viewModel: viewModel ) .id(sound.id) @@ -73,6 +77,7 @@ struct WorkshopGridHelpers { item: particle, isOwned: isParticleOwned(particle), router: router, + keyringMakerRouter: keyringMakerRouter, viewModel: viewModel ) .id(particle.id) diff --git a/Keychy/Keychy/Presentation/Workshop/WorkshopMain/WorkshopMainContentSection.swift b/Keychy/Keychy/Presentation/Workshop/WorkshopMain/WorkshopMainContentSection.swift index 48d2c5af9..c5cf85b34 100644 --- a/Keychy/Keychy/Presentation/Workshop/WorkshopMain/WorkshopMainContentSection.swift +++ b/Keychy/Keychy/Presentation/Workshop/WorkshopMain/WorkshopMainContentSection.swift @@ -68,6 +68,7 @@ extension WorkshopView { isSoundOwned: viewModel.isSoundOwned, isParticleOwned: viewModel.isParticleOwned, router: router, + keyringMakerRouter: keyringMakerRouter, viewModel: viewModel, emptyView: emptyContentView ) @@ -82,6 +83,7 @@ extension WorkshopView { items: items, isOwnedCheck: isOwnedCheck, router: router, + keyringMakerRouter: keyringMakerRouter, viewModel: viewModel, emptyView: emptyContentView ) diff --git a/Keychy/Keychy/Presentation/Workshop/WorkshopMain/WorkshopTemplatesView.swift b/Keychy/Keychy/Presentation/Workshop/WorkshopMain/WorkshopTemplatesView.swift index e3de0d2cb..a79b1b210 100644 --- a/Keychy/Keychy/Presentation/Workshop/WorkshopMain/WorkshopTemplatesView.swift +++ b/Keychy/Keychy/Presentation/Workshop/WorkshopMain/WorkshopTemplatesView.swift @@ -10,12 +10,17 @@ import SwiftUI struct WorkshopTemplatesView: View { @Bindable var router: NavigationRouter + @Bindable var keyringMakerRouter: NavigationRouter @Environment(UserManager.self) private var userManager @State private var viewModel: WorkshopViewModel @State private var hasInitialized = false - init(router: NavigationRouter) { + init( + router: NavigationRouter, + keyringMakerRouter: NavigationRouter + ) { self.router = router + self.keyringMakerRouter = keyringMakerRouter _viewModel = State(initialValue: WorkshopViewModel(userManager: UserManager.shared)) } @@ -144,6 +149,7 @@ struct WorkshopTemplatesView: View { items: filteredTemplates, isOwnedCheck: { _ in false }, router: router, + keyringMakerRouter: keyringMakerRouter, viewModel: viewModel, emptyView: emptyContentView ) diff --git a/Keychy/Keychy/Presentation/Workshop/WorkshopMain/WorkshopView.swift b/Keychy/Keychy/Presentation/Workshop/WorkshopMain/WorkshopView.swift index 9a28fe787..7c8e78e9e 100644 --- a/Keychy/Keychy/Presentation/Workshop/WorkshopMain/WorkshopView.swift +++ b/Keychy/Keychy/Presentation/Workshop/WorkshopMain/WorkshopView.swift @@ -11,18 +11,24 @@ import NukeUI // MARK: - Main View struct WorkshopView: View { - + @Bindable var router: NavigationRouter + @Bindable var keyringMakerRouter: NavigationRouter @Environment(UserManager.self) var userManager @State var viewModel: WorkshopViewModel @State private var hasInitialized = false @State private var isTabBarVisible = true - + let categories = ["템플릿", "카라비너", "이펙트", "배경"] - + /// WorkshopTab에서 생성된 viewModel을 받아서 사용 - init(router: NavigationRouter, viewModel: WorkshopViewModel) { + init( + router: NavigationRouter, + keyringMakerRouter: NavigationRouter, + viewModel: WorkshopViewModel + ) { self.router = router + self.keyringMakerRouter = keyringMakerRouter _viewModel = State(initialValue: viewModel) } From 8565047bf5eba1d8cf130285cc36efbd3cf5a58e Mon Sep 17 00:00:00 2001 From: giljihun Date: Tue, 20 Jan 2026 20:24:15 +0900 Subject: [PATCH 03/17] =?UTF-8?q?refactor:=20=ED=85=9C=ED=94=8C=EB=A6=BF?= =?UTF-8?q?=20=EB=B7=B0=20=EB=93=B1=EC=97=90=20KeyringMakerRoute=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Preview 6개 - 중간단계 뷰들 - 페스티벌도 일단 변경 --- .../Views/FestivalKeyringDetailView.swift | 2 +- .../Showcase25Board/Showcase25BoardView.swift | 4 ++-- .../Presentation/Tab/Views/FestivalTab.swift | 16 ++++++++-------- .../Presentation/Tab/Views/MainTabView.swift | 6 +++--- .../Components/TemplatePreviewComponents.swift | 2 +- .../Views/AcrylicPhotoCropView.swift | 2 +- .../Views/AcrylicPhotoEditedView.swift | 2 +- .../AcrylicPhoto/Views/AcrylicPhotoPreView.swift | 2 +- .../ClearSketch/Views/ClearSketchCropView.swift | 2 +- .../Views/ClearSketchDrawingView.swift | 2 +- .../ClearSketch/Views/ClearSketchPreview.swift | 2 +- .../NeonSign/Views/NeonSignPreview.swift | 4 ++-- .../Templates/Pixel/Views/PixelDrawView.swift | 2 +- .../Templates/Pixel/Views/PixelPreviewView.swift | 2 +- .../Polaroid/Views/PolaroidPreview.swift | 4 ++-- .../SpeechBubble/Views/SpeechBubblePreview.swift | 2 +- 16 files changed, 28 insertions(+), 28 deletions(-) diff --git a/Keychy/Keychy/Presentation/Festival/Views/FestivalKeyringDetailView.swift b/Keychy/Keychy/Presentation/Festival/Views/FestivalKeyringDetailView.swift index 5ef716c6b..7d272cbc3 100644 --- a/Keychy/Keychy/Presentation/Festival/Views/FestivalKeyringDetailView.swift +++ b/Keychy/Keychy/Presentation/Festival/Views/FestivalKeyringDetailView.swift @@ -12,7 +12,7 @@ import Photos struct FestivalKeyringDetailView: View { @Bindable var festivalRouter: NavigationRouter - @Bindable var workshopRouter: NavigationRouter + @Bindable var keyringMakerRouter: NavigationRouter @Bindable var viewModel: Showcase25BoardViewModel @State var userManager = UserManager.shared diff --git a/Keychy/Keychy/Presentation/Festival/Views/Showcase25Board/Showcase25BoardView.swift b/Keychy/Keychy/Presentation/Festival/Views/Showcase25Board/Showcase25BoardView.swift index 705b8c946..87cbb8183 100644 --- a/Keychy/Keychy/Presentation/Festival/Views/Showcase25Board/Showcase25BoardView.swift +++ b/Keychy/Keychy/Presentation/Festival/Views/Showcase25Board/Showcase25BoardView.swift @@ -12,14 +12,14 @@ import FirebaseFirestore struct Showcase25BoardView: View { @Bindable var festivalRouter: NavigationRouter - @Bindable var workshopRouter: NavigationRouter + @Bindable var keyringMakerRouter: NavigationRouter @Bindable var viewModel: Showcase25BoardViewModel @Environment(\.scenePhase) private var scenePhase // 위치 기반 체크용 @State var locationManager = LocationManager() - var onNavigateToWorkshop: ((WorkshopRoute) -> Void)? = nil + var onNavigateToKeyringMaker: ((KeyringMakerRoute) -> Void)? = nil var isFromFestivalTab: Bool = false // 회수 확인 Alert diff --git a/Keychy/Keychy/Presentation/Tab/Views/FestivalTab.swift b/Keychy/Keychy/Presentation/Tab/Views/FestivalTab.swift index 7d5ed2e15..a94b7e8f8 100644 --- a/Keychy/Keychy/Presentation/Tab/Views/FestivalTab.swift +++ b/Keychy/Keychy/Presentation/Tab/Views/FestivalTab.swift @@ -9,10 +9,10 @@ import SwiftUI struct FestivalTab: View { @Bindable var router: NavigationRouter - @Bindable var workshopRouter: NavigationRouter + @Bindable var keyringMakerRouter: NavigationRouter @Bindable var showcaseVM: Showcase25BoardViewModel - var onSwitchToWorkshop: ((WorkshopRoute) -> Void)? = nil - + var onSwitchToKeyringMaker: ((KeyringMakerRoute) -> Void)? = nil + var body: some View { NavigationStack(path: $router.path) { FestivalView(router: router) @@ -21,19 +21,19 @@ struct FestivalTab: View { case .showcase25BoardView: Showcase25BoardView( festivalRouter: router, - workshopRouter: workshopRouter, + keyringMakerRouter: keyringMakerRouter, viewModel: showcaseVM, - onNavigateToWorkshop: { route in - onSwitchToWorkshop?(route) + onNavigateToKeyringMaker: { route in + onSwitchToKeyringMaker?(route) } ) - + case .festivalView: FestivalView(router: router) case .festivalKeyringDetailView(let keyring): FestivalKeyringDetailView( festivalRouter: router, - workshopRouter: workshopRouter, + keyringMakerRouter: keyringMakerRouter, viewModel: showcaseVM, keyring: keyring ) diff --git a/Keychy/Keychy/Presentation/Tab/Views/MainTabView.swift b/Keychy/Keychy/Presentation/Tab/Views/MainTabView.swift index 4a9f11889..3e93a8700 100644 --- a/Keychy/Keychy/Presentation/Tab/Views/MainTabView.swift +++ b/Keychy/Keychy/Presentation/Tab/Views/MainTabView.swift @@ -125,10 +125,10 @@ extension MainTabView { private var festivalTab: some View { FestivalTab( router: viewModel.festivalRouter, - workshopRouter: viewModel.workshopRouter, + keyringMakerRouter: viewModel.keyringMakerRouter, showcaseVM: viewModel.festivalViewModel, - onSwitchToWorkshop: { route in - viewModel.handleSwitchToWorkshop(route) + onSwitchToKeyringMaker: { route in + viewModel.handleSwitchToKeyringMaker(route) } ) .modifier(TabItemModifier( diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Shared/Components/TemplatePreviewComponents.swift b/Keychy/Keychy/Presentation/Workshop/Making/Shared/Components/TemplatePreviewComponents.swift index dbe84bcee..c0c2a4005 100644 --- a/Keychy/Keychy/Presentation/Workshop/Making/Shared/Components/TemplatePreviewComponents.swift +++ b/Keychy/Keychy/Presentation/Workshop/Making/Shared/Components/TemplatePreviewComponents.swift @@ -15,7 +15,7 @@ struct TemplatePreviewBody: View { let fetchTemplate: () async -> Void let onMake: () -> Void var onPurchase: (() -> Void)? = nil - var router: NavigationRouter? = nil + var router: NavigationRouter? = nil @Environment(UserManager.self) private var userManager diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/Views/AcrylicPhotoCropView.swift b/Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/Views/AcrylicPhotoCropView.swift index 98c2ec39b..d61ef5c03 100644 --- a/Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/Views/AcrylicPhotoCropView.swift +++ b/Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/Views/AcrylicPhotoCropView.swift @@ -1,7 +1,7 @@ import SwiftUI struct AcrylicPhotoCropView: View { - @Bindable var router: NavigationRouter + @Bindable var router: NavigationRouter @Bindable var viewModel: AcrylicPhotoVM @State private var isImageLoading = true diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/Views/AcrylicPhotoEditedView.swift b/Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/Views/AcrylicPhotoEditedView.swift index 1559368c8..c64fd89a1 100644 --- a/Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/Views/AcrylicPhotoEditedView.swift +++ b/Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/Views/AcrylicPhotoEditedView.swift @@ -10,7 +10,7 @@ import SwiftUI struct AcrylicPhotoEditedView: View { // MARK: - Dependencies - @Bindable var router: NavigationRouter + @Bindable var router: NavigationRouter @Bindable var viewModel: AcrylicPhotoVM // MARK: - Animation States diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/Views/AcrylicPhotoPreView.swift b/Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/Views/AcrylicPhotoPreView.swift index 950da3fc0..4f5855f56 100644 --- a/Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/Views/AcrylicPhotoPreView.swift +++ b/Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/Views/AcrylicPhotoPreView.swift @@ -9,7 +9,7 @@ import SwiftUI import PhotosUI struct AcrylicPhotoPreView: View { - @Bindable var router: NavigationRouter + @Bindable var router: NavigationRouter @State var viewModel: AcrylicPhotoVM @Environment(UserManager.self) private var userManager @State private var selectedItem: PhotosPickerItem? diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/ClearSketch/Views/ClearSketchCropView.swift b/Keychy/Keychy/Presentation/Workshop/Making/Templates/ClearSketch/Views/ClearSketchCropView.swift index 52a661324..8d865975c 100644 --- a/Keychy/Keychy/Presentation/Workshop/Making/Templates/ClearSketch/Views/ClearSketchCropView.swift +++ b/Keychy/Keychy/Presentation/Workshop/Making/Templates/ClearSketch/Views/ClearSketchCropView.swift @@ -8,7 +8,7 @@ import SwiftUI struct ClearSketchCropView: View { - @Bindable var router: NavigationRouter + @Bindable var router: NavigationRouter @Bindable var viewModel: ClearSketchVM @State private var cropPaths: [CropPath] = [] diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/ClearSketch/Views/ClearSketchDrawingView.swift b/Keychy/Keychy/Presentation/Workshop/Making/Templates/ClearSketch/Views/ClearSketchDrawingView.swift index 2e70bb67c..6c4131e92 100644 --- a/Keychy/Keychy/Presentation/Workshop/Making/Templates/ClearSketch/Views/ClearSketchDrawingView.swift +++ b/Keychy/Keychy/Presentation/Workshop/Making/Templates/ClearSketch/Views/ClearSketchDrawingView.swift @@ -8,7 +8,7 @@ import SwiftUI struct ClearSketchDrawingView: View { - @Bindable var router: NavigationRouter + @Bindable var router: NavigationRouter @Bindable var viewModel: ClearSketchVM /// 팔레트 표시 여부 (그리기 모드일 때만 표시) diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/ClearSketch/Views/ClearSketchPreview.swift b/Keychy/Keychy/Presentation/Workshop/Making/Templates/ClearSketch/Views/ClearSketchPreview.swift index b3735dc59..eae7d4850 100644 --- a/Keychy/Keychy/Presentation/Workshop/Making/Templates/ClearSketch/Views/ClearSketchPreview.swift +++ b/Keychy/Keychy/Presentation/Workshop/Making/Templates/ClearSketch/Views/ClearSketchPreview.swift @@ -8,7 +8,7 @@ import SwiftUI struct ClearSketchPreview: View { - @Bindable var router: NavigationRouter + @Bindable var router: NavigationRouter @State var viewModel: ClearSketchVM @Environment(UserManager.self) private var userManager diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/NeonSign/Views/NeonSignPreview.swift b/Keychy/Keychy/Presentation/Workshop/Making/Templates/NeonSign/Views/NeonSignPreview.swift index 55aab78a6..6ca72310c 100644 --- a/Keychy/Keychy/Presentation/Workshop/Making/Templates/NeonSign/Views/NeonSignPreview.swift +++ b/Keychy/Keychy/Presentation/Workshop/Making/Templates/NeonSign/Views/NeonSignPreview.swift @@ -8,7 +8,7 @@ import SwiftUI struct NeonSignPreView: View { - @Bindable var router: NavigationRouter + @Bindable var router: NavigationRouter @State var viewModel: NeonSignVM var body: some View { @@ -26,7 +26,7 @@ struct NeonSignPreView: View { #Preview { NeonSignPreView( - router: NavigationRouter(), + router: NavigationRouter(), viewModel: NeonSignVM() ) .environment(UserManager.shared) diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/Pixel/Views/PixelDrawView.swift b/Keychy/Keychy/Presentation/Workshop/Making/Templates/Pixel/Views/PixelDrawView.swift index 70e08d0e4..38f302ebd 100644 --- a/Keychy/Keychy/Presentation/Workshop/Making/Templates/Pixel/Views/PixelDrawView.swift +++ b/Keychy/Keychy/Presentation/Workshop/Making/Templates/Pixel/Views/PixelDrawView.swift @@ -8,7 +8,7 @@ import SwiftUI struct PixelDrawView: View { - @Bindable var router: NavigationRouter + @Bindable var router: NavigationRouter @Bindable var viewModel: PixelVM /// 팔레트 표시 여부 (그리기 모드일 때만 표시) diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/Pixel/Views/PixelPreviewView.swift b/Keychy/Keychy/Presentation/Workshop/Making/Templates/Pixel/Views/PixelPreviewView.swift index 159e8d2bb..4df0e584f 100644 --- a/Keychy/Keychy/Presentation/Workshop/Making/Templates/Pixel/Views/PixelPreviewView.swift +++ b/Keychy/Keychy/Presentation/Workshop/Making/Templates/Pixel/Views/PixelPreviewView.swift @@ -8,7 +8,7 @@ import SwiftUI struct PixelPreviewView: View { - @Bindable var router: NavigationRouter + @Bindable var router: NavigationRouter @State var viewModel: PixelVM @Environment(UserManager.self) private var userManager diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/Polaroid/Views/PolaroidPreview.swift b/Keychy/Keychy/Presentation/Workshop/Making/Templates/Polaroid/Views/PolaroidPreview.swift index f874ba26b..9a4cd2b2b 100644 --- a/Keychy/Keychy/Presentation/Workshop/Making/Templates/Polaroid/Views/PolaroidPreview.swift +++ b/Keychy/Keychy/Presentation/Workshop/Making/Templates/Polaroid/Views/PolaroidPreview.swift @@ -8,7 +8,7 @@ import SwiftUI struct PolaroidPreview: View { - @Bindable var router: NavigationRouter + @Bindable var router: NavigationRouter @State var viewModel: PolaroidVM var body: some View { @@ -29,7 +29,7 @@ struct PolaroidPreview: View { #Preview { PolaroidPreview( - router: NavigationRouter(), + router: NavigationRouter(), viewModel: PolaroidVM() ) .environment(UserManager.shared) diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/SpeechBubble/Views/SpeechBubblePreview.swift b/Keychy/Keychy/Presentation/Workshop/Making/Templates/SpeechBubble/Views/SpeechBubblePreview.swift index df8b4a0f1..892a25f9d 100644 --- a/Keychy/Keychy/Presentation/Workshop/Making/Templates/SpeechBubble/Views/SpeechBubblePreview.swift +++ b/Keychy/Keychy/Presentation/Workshop/Making/Templates/SpeechBubble/Views/SpeechBubblePreview.swift @@ -10,7 +10,7 @@ import SwiftUI struct SpeechBubblePreview: View { - @Bindable var router: NavigationRouter + @Bindable var router: NavigationRouter @State var viewModel: SpeechBubbleVM var body: some View { From 12c14fe5dc17496a5666728a513f6025ea77bd3f Mon Sep 17 00:00:00 2001 From: giljihun Date: Tue, 20 Jan 2026 20:25:12 +0900 Subject: [PATCH 04/17] =?UTF-8?q?refactor:=20EffectItem=EC=9D=84=20Making/?= =?UTF-8?q?Shared/Models=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Workshop/{ => Making/Shared/Models}/EffectItem.swift | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Keychy/Keychy/Presentation/Workshop/{ => Making/Shared/Models}/EffectItem.swift (100%) diff --git a/Keychy/Keychy/Presentation/Workshop/EffectItem.swift b/Keychy/Keychy/Presentation/Workshop/Making/Shared/Models/EffectItem.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/EffectItem.swift rename to Keychy/Keychy/Presentation/Workshop/Making/Shared/Models/EffectItem.swift From 0c3fefc47341042043ac2ba9ab568eef1e00e192 Mon Sep 17 00:00:00 2001 From: giljihun Date: Tue, 20 Jan 2026 20:27:50 +0900 Subject: [PATCH 05/17] =?UTF-8?q?chore:=20KeyringMaker=20=ED=8F=B4?= =?UTF-8?q?=EB=8D=94=20=EA=B5=AC=EC=A1=B0=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 일단 .gitkeep으로 폴더 유지 --- Keychy/Keychy/Presentation/KeyringMaker/.gitkeep | 0 Keychy/Keychy/Presentation/KeyringMaker/Core/.gitkeep | 0 Keychy/Keychy/Presentation/KeyringMaker/Core/Protocols/.gitkeep | 0 Keychy/Keychy/Presentation/KeyringMaker/Shared/.gitkeep | 0 .../Keychy/Presentation/KeyringMaker/Shared/Components/.gitkeep | 0 Keychy/Keychy/Presentation/KeyringMaker/Shared/Models/.gitkeep | 0 Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/.gitkeep | 0 Keychy/Keychy/Presentation/KeyringMaker/Templates/.gitkeep | 0 .../Presentation/KeyringMaker/Templates/AcrylicPhoto/.gitkeep | 0 .../KeyringMaker/Templates/AcrylicPhoto/ViewModels/.gitkeep | 0 .../KeyringMaker/Templates/AcrylicPhoto/Views/.gitkeep | 0 .../Presentation/KeyringMaker/Templates/ClearSketch/.gitkeep | 0 .../KeyringMaker/Templates/ClearSketch/ViewModels/.gitkeep | 0 .../KeyringMaker/Templates/ClearSketch/Views/.gitkeep | 0 .../Keychy/Presentation/KeyringMaker/Templates/NeonSign/.gitkeep | 0 .../KeyringMaker/Templates/NeonSign/ViewModels/.gitkeep | 0 .../Presentation/KeyringMaker/Templates/NeonSign/Views/.gitkeep | 0 Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/.gitkeep | 0 .../Presentation/KeyringMaker/Templates/Pixel/ViewModels/.gitkeep | 0 .../Presentation/KeyringMaker/Templates/Pixel/Views/.gitkeep | 0 .../Keychy/Presentation/KeyringMaker/Templates/Polaroid/.gitkeep | 0 .../KeyringMaker/Templates/Polaroid/ViewModels/.gitkeep | 0 .../Presentation/KeyringMaker/Templates/Polaroid/Views/.gitkeep | 0 .../Presentation/KeyringMaker/Templates/SpeechBubble/.gitkeep | 0 .../KeyringMaker/Templates/SpeechBubble/ViewModels/.gitkeep | 0 .../KeyringMaker/Templates/SpeechBubble/Views/.gitkeep | 0 26 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Keychy/Keychy/Presentation/KeyringMaker/.gitkeep create mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Core/.gitkeep create mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Core/Protocols/.gitkeep create mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Shared/.gitkeep create mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Shared/Components/.gitkeep create mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Shared/Models/.gitkeep create mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/.gitkeep create mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/.gitkeep create mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/.gitkeep create mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/ViewModels/.gitkeep create mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/Views/.gitkeep create mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/.gitkeep create mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/ViewModels/.gitkeep create mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/Views/.gitkeep create mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/.gitkeep create mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/ViewModels/.gitkeep create mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/Views/.gitkeep create mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/.gitkeep create mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/ViewModels/.gitkeep create mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/Views/.gitkeep create mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/.gitkeep create mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/ViewModels/.gitkeep create mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/Views/.gitkeep create mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/.gitkeep create mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/ViewModels/.gitkeep create mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/Views/.gitkeep diff --git a/Keychy/Keychy/Presentation/KeyringMaker/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Core/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Core/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Core/Protocols/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Core/Protocols/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Shared/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Shared/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Shared/Components/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Components/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Shared/Models/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Models/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/ViewModels/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/ViewModels/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/Views/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/Views/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/ViewModels/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/ViewModels/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/Views/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/Views/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/ViewModels/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/ViewModels/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/Views/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/Views/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/ViewModels/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/ViewModels/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/Views/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/Views/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/ViewModels/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/ViewModels/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/Views/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/Views/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/ViewModels/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/ViewModels/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/Views/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/Views/.gitkeep new file mode 100644 index 000000000..e69de29bb From 7cc276cf3c7db24a2bdf3a291ee110562eca831f Mon Sep 17 00:00:00 2001 From: giljihun Date: Tue, 20 Jan 2026 20:29:08 +0900 Subject: [PATCH 06/17] =?UTF-8?q?refactor:=20Protocols=EB=A5=BC=20KeyringM?= =?UTF-8?q?aker/Core=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Keychy/Keychy/Presentation/KeyringMaker/Core/Protocols/.gitkeep | 0 .../Core}/Protocols/KeyringViewModelProtocol+Reset.swift | 0 .../Core}/Protocols/KeyringViewModelProtocol.swift | 0 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Core/Protocols/.gitkeep rename Keychy/Keychy/Presentation/{Workshop/Making/Shared => KeyringMaker/Core}/Protocols/KeyringViewModelProtocol+Reset.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making/Shared => KeyringMaker/Core}/Protocols/KeyringViewModelProtocol.swift (100%) diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Core/Protocols/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Core/Protocols/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Shared/Protocols/KeyringViewModelProtocol+Reset.swift b/Keychy/Keychy/Presentation/KeyringMaker/Core/Protocols/KeyringViewModelProtocol+Reset.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Shared/Protocols/KeyringViewModelProtocol+Reset.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Core/Protocols/KeyringViewModelProtocol+Reset.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Shared/Protocols/KeyringViewModelProtocol.swift b/Keychy/Keychy/Presentation/KeyringMaker/Core/Protocols/KeyringViewModelProtocol.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Shared/Protocols/KeyringViewModelProtocol.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Core/Protocols/KeyringViewModelProtocol.swift From 0c14ccdb6b0d0078cebd7b13dc88948a16e88b6b Mon Sep 17 00:00:00 2001 From: giljihun Date: Tue, 20 Jan 2026 20:30:40 +0900 Subject: [PATCH 07/17] =?UTF-8?q?refactor:=20Components=EB=A5=BC=20Keyring?= =?UTF-8?q?Maker/Shared=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 카메라피커 ~ 레코딩매니저 등 --- .../Keychy/Presentation/KeyringMaker/Shared/Components/.gitkeep | 0 .../Making => KeyringMaker}/Shared/Components/CameraPicker.swift | 0 .../Shared/Components/CinematicAppearanceModifier.swift | 0 .../Shared/Components/PreviewGuiding.swift | 0 .../Shared/Components/Recording/AudioRecorderManager.swift | 0 .../Shared/Components/Recording/RecordingSheet.swift | 0 .../Shared/Components/TemplatePreviewComponents.swift | 0 7 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Shared/Components/.gitkeep rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Shared/Components/CameraPicker.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Shared/Components/CinematicAppearanceModifier.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Shared/Components/PreviewGuiding.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Shared/Components/Recording/AudioRecorderManager.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Shared/Components/Recording/RecordingSheet.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Shared/Components/TemplatePreviewComponents.swift (100%) diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Shared/Components/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Components/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Shared/Components/CameraPicker.swift b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Components/CameraPicker.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Shared/Components/CameraPicker.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Shared/Components/CameraPicker.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Shared/Components/CinematicAppearanceModifier.swift b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Components/CinematicAppearanceModifier.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Shared/Components/CinematicAppearanceModifier.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Shared/Components/CinematicAppearanceModifier.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Shared/Components/PreviewGuiding.swift b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Components/PreviewGuiding.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Shared/Components/PreviewGuiding.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Shared/Components/PreviewGuiding.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Shared/Components/Recording/AudioRecorderManager.swift b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Components/Recording/AudioRecorderManager.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Shared/Components/Recording/AudioRecorderManager.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Shared/Components/Recording/AudioRecorderManager.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Shared/Components/Recording/RecordingSheet.swift b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Components/Recording/RecordingSheet.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Shared/Components/Recording/RecordingSheet.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Shared/Components/Recording/RecordingSheet.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Shared/Components/TemplatePreviewComponents.swift b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Components/TemplatePreviewComponents.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Shared/Components/TemplatePreviewComponents.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Shared/Components/TemplatePreviewComponents.swift From 5d1b1909b94f878dd1132f36862d629327cf4d0d Mon Sep 17 00:00:00 2001 From: giljihun Date: Tue, 20 Jan 2026 20:32:08 +0900 Subject: [PATCH 08/17] =?UTF-8?q?refactor:=20Models=20+=20View=EB=A5=BC=20?= =?UTF-8?q?KeyringMaker/Shared=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Making 공유 모델과 뷰들을 KeyringMaker 모듈로 이동 --- Keychy/Keychy/Presentation/KeyringMaker/Shared/Models/.gitkeep | 0 .../Making => KeyringMaker}/Shared/Models/EffectItem.swift | 0 Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/.gitkeep | 0 .../Making => KeyringMaker}/Shared/Views/EffectSelectorView.swift | 0 .../Shared/Views/KeyringCompleteView+ReviewCheck.swift | 0 .../Shared/Views/KeyringCompleteView+SaveImage.swift | 0 .../Shared/Views/KeyringCompleteView+VideoGen.swift | 0 .../Shared/Views/KeyringCompleteView.swift | 0 .../Shared/Views/KeyringCustomizingView+Cart.swift | 0 .../Shared/Views/KeyringCustomizingView+Purchase.swift | 0 .../Shared/Views/KeyringCustomizingView+PurchaseSheet.swift | 0 .../Shared/Views/KeyringCustomizingView.swift | 0 .../Shared/Views/KeyringInfoInputView+FirebaseSave.swift | 0 .../Shared/Views/KeyringInfoInputView+Helpers.swift | 0 .../Shared/Views/KeyringInfoInputView+Sheet.swift | 0 .../Shared/Views/KeyringInfoInputView+TagManagement.swift | 0 .../Shared/Views/KeyringInfoInputView.swift | 0 17 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Shared/Models/.gitkeep rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Shared/Models/EffectItem.swift (100%) delete mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/.gitkeep rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Shared/Views/EffectSelectorView.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Shared/Views/KeyringCompleteView+ReviewCheck.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Shared/Views/KeyringCompleteView+SaveImage.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Shared/Views/KeyringCompleteView+VideoGen.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Shared/Views/KeyringCompleteView.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Shared/Views/KeyringCustomizingView+Cart.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Shared/Views/KeyringCustomizingView+Purchase.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Shared/Views/KeyringCustomizingView+PurchaseSheet.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Shared/Views/KeyringCustomizingView.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Shared/Views/KeyringInfoInputView+FirebaseSave.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Shared/Views/KeyringInfoInputView+Helpers.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Shared/Views/KeyringInfoInputView+Sheet.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Shared/Views/KeyringInfoInputView+TagManagement.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Shared/Views/KeyringInfoInputView.swift (100%) diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Shared/Models/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Models/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Shared/Models/EffectItem.swift b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Models/EffectItem.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Shared/Models/EffectItem.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Shared/Models/EffectItem.swift diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/EffectSelectorView.swift b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/EffectSelectorView.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/EffectSelectorView.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/EffectSelectorView.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringCompleteView+ReviewCheck.swift b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringCompleteView+ReviewCheck.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringCompleteView+ReviewCheck.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringCompleteView+ReviewCheck.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringCompleteView+SaveImage.swift b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringCompleteView+SaveImage.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringCompleteView+SaveImage.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringCompleteView+SaveImage.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringCompleteView+VideoGen.swift b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringCompleteView+VideoGen.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringCompleteView+VideoGen.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringCompleteView+VideoGen.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringCompleteView.swift b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringCompleteView.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringCompleteView.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringCompleteView.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringCustomizingView+Cart.swift b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringCustomizingView+Cart.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringCustomizingView+Cart.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringCustomizingView+Cart.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringCustomizingView+Purchase.swift b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringCustomizingView+Purchase.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringCustomizingView+Purchase.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringCustomizingView+Purchase.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringCustomizingView+PurchaseSheet.swift b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringCustomizingView+PurchaseSheet.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringCustomizingView+PurchaseSheet.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringCustomizingView+PurchaseSheet.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringCustomizingView.swift b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringCustomizingView.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringCustomizingView.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringCustomizingView.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringInfoInputView+FirebaseSave.swift b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringInfoInputView+FirebaseSave.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringInfoInputView+FirebaseSave.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringInfoInputView+FirebaseSave.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringInfoInputView+Helpers.swift b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringInfoInputView+Helpers.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringInfoInputView+Helpers.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringInfoInputView+Helpers.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringInfoInputView+Sheet.swift b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringInfoInputView+Sheet.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringInfoInputView+Sheet.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringInfoInputView+Sheet.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringInfoInputView+TagManagement.swift b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringInfoInputView+TagManagement.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringInfoInputView+TagManagement.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringInfoInputView+TagManagement.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringInfoInputView.swift b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringInfoInputView.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Shared/Views/KeyringInfoInputView.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringInfoInputView.swift From e95daf0d396ebdbdbf9c5dc3b71158264999080a Mon Sep 17 00:00:00 2001 From: giljihun Date: Tue, 20 Jan 2026 20:33:25 +0900 Subject: [PATCH 09/17] =?UTF-8?q?refactor:=20Templates=EB=A5=BC=20KeyringM?= =?UTF-8?q?aker=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/KeyringMaker/Templates/AcrylicPhoto/.gitkeep | 0 .../Templates/AcrylicPhoto/Models/CropModels.swift | 0 .../KeyringMaker/Templates/AcrylicPhoto/ViewModels/.gitkeep | 0 .../AcrylicPhoto/ViewModels/AcrylicPhotoVM+BGRemover.swift | 0 .../Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM+Crop.swift | 0 .../AcrylicPhoto/ViewModels/AcrylicPhotoVM+CropBoxDrag.swift | 0 .../Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM+Effect.swift | 0 .../AcrylicPhoto/ViewModels/AcrylicPhotoVM+ImageLoad.swift | 0 .../Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM.swift | 0 .../KeyringMaker/Templates/AcrylicPhoto/Views/.gitkeep | 0 .../Templates/AcrylicPhoto/Views/AcrylicPhotoCropView.swift | 0 .../Templates/AcrylicPhoto/Views/AcrylicPhotoEditedView.swift | 0 .../Templates/AcrylicPhoto/Views/AcrylicPhotoGuiding.swift | 0 .../Templates/AcrylicPhoto/Views/AcrylicPhotoPreView.swift | 0 .../Keychy/Presentation/KeyringMaker/Templates/NeonSign/.gitkeep | 0 .../KeyringMaker/Templates/NeonSign/ViewModels/.gitkeep | 0 .../Templates/NeonSign/ViewModels/NeonSignVM+Drawing.swift | 0 .../Templates/NeonSign/ViewModels/NeonSignVM+Effect.swift | 0 .../Templates/NeonSign/ViewModels/NeonSignVM.swift | 0 .../Presentation/KeyringMaker/Templates/NeonSign/Views/.gitkeep | 0 .../Templates/NeonSign/Views/DrawingCanvasView.swift | 0 .../Templates/NeonSign/Views/DrawingToolsView.swift | 0 .../Templates/NeonSign/Views/NeonSignPreview.swift | 0 .../Keychy/Presentation/KeyringMaker/Templates/Polaroid/.gitkeep | 0 .../KeyringMaker/Templates/Polaroid/ViewModels/.gitkeep | 0 .../Templates/Polaroid/ViewModels/PolaroidVM+Effect.swift | 0 .../Templates/Polaroid/ViewModels/PolaroidVM+Frame.swift | 0 .../Templates/Polaroid/ViewModels/PolaroidVM.swift | 0 .../Presentation/KeyringMaker/Templates/Polaroid/Views/.gitkeep | 0 .../Templates/Polaroid/Views/FramePreviewView.swift | 0 .../Templates/Polaroid/Views/FrameSelectorView.swift | 0 .../Templates/Polaroid/Views/PhotoSelectSheet.swift | 0 .../Templates/Polaroid/Views/PolaroidPreview.swift | 0 33 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/.gitkeep rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/AcrylicPhoto/Models/CropModels.swift (100%) delete mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/ViewModels/.gitkeep rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM+BGRemover.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM+Crop.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM+CropBoxDrag.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM+Effect.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM+ImageLoad.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM.swift (100%) delete mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/Views/.gitkeep rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/AcrylicPhoto/Views/AcrylicPhotoCropView.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/AcrylicPhoto/Views/AcrylicPhotoEditedView.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/AcrylicPhoto/Views/AcrylicPhotoGuiding.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/AcrylicPhoto/Views/AcrylicPhotoPreView.swift (100%) delete mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/.gitkeep delete mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/ViewModels/.gitkeep rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/NeonSign/ViewModels/NeonSignVM+Drawing.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/NeonSign/ViewModels/NeonSignVM+Effect.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/NeonSign/ViewModels/NeonSignVM.swift (100%) delete mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/Views/.gitkeep rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/NeonSign/Views/DrawingCanvasView.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/NeonSign/Views/DrawingToolsView.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/NeonSign/Views/NeonSignPreview.swift (100%) delete mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/.gitkeep delete mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/ViewModels/.gitkeep rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/Polaroid/ViewModels/PolaroidVM+Effect.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/Polaroid/ViewModels/PolaroidVM+Frame.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/Polaroid/ViewModels/PolaroidVM.swift (100%) delete mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/Views/.gitkeep rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/Polaroid/Views/FramePreviewView.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/Polaroid/Views/FrameSelectorView.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/Polaroid/Views/PhotoSelectSheet.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/Polaroid/Views/PolaroidPreview.swift (100%) diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/Models/CropModels.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/Models/CropModels.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/Models/CropModels.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/Models/CropModels.swift diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/ViewModels/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/ViewModels/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM+BGRemover.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM+BGRemover.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM+BGRemover.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM+BGRemover.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM+Crop.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM+Crop.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM+Crop.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM+Crop.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM+CropBoxDrag.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM+CropBoxDrag.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM+CropBoxDrag.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM+CropBoxDrag.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM+Effect.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM+Effect.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM+Effect.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM+Effect.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM+ImageLoad.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM+ImageLoad.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM+ImageLoad.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM+ImageLoad.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/ViewModels/AcrylicPhotoVM.swift diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/Views/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/Views/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/Views/AcrylicPhotoCropView.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/Views/AcrylicPhotoCropView.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/Views/AcrylicPhotoCropView.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/Views/AcrylicPhotoCropView.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/Views/AcrylicPhotoEditedView.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/Views/AcrylicPhotoEditedView.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/Views/AcrylicPhotoEditedView.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/Views/AcrylicPhotoEditedView.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/Views/AcrylicPhotoGuiding.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/Views/AcrylicPhotoGuiding.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/Views/AcrylicPhotoGuiding.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/Views/AcrylicPhotoGuiding.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/Views/AcrylicPhotoPreView.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/Views/AcrylicPhotoPreView.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/AcrylicPhoto/Views/AcrylicPhotoPreView.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/Views/AcrylicPhotoPreView.swift diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/ViewModels/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/ViewModels/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/NeonSign/ViewModels/NeonSignVM+Drawing.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/ViewModels/NeonSignVM+Drawing.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/NeonSign/ViewModels/NeonSignVM+Drawing.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/ViewModels/NeonSignVM+Drawing.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/NeonSign/ViewModels/NeonSignVM+Effect.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/ViewModels/NeonSignVM+Effect.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/NeonSign/ViewModels/NeonSignVM+Effect.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/ViewModels/NeonSignVM+Effect.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/NeonSign/ViewModels/NeonSignVM.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/ViewModels/NeonSignVM.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/NeonSign/ViewModels/NeonSignVM.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/ViewModels/NeonSignVM.swift diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/Views/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/Views/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/NeonSign/Views/DrawingCanvasView.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/Views/DrawingCanvasView.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/NeonSign/Views/DrawingCanvasView.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/Views/DrawingCanvasView.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/NeonSign/Views/DrawingToolsView.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/Views/DrawingToolsView.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/NeonSign/Views/DrawingToolsView.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/Views/DrawingToolsView.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/NeonSign/Views/NeonSignPreview.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/Views/NeonSignPreview.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/NeonSign/Views/NeonSignPreview.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/Views/NeonSignPreview.swift diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/ViewModels/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/ViewModels/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/Polaroid/ViewModels/PolaroidVM+Effect.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/ViewModels/PolaroidVM+Effect.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/Polaroid/ViewModels/PolaroidVM+Effect.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/ViewModels/PolaroidVM+Effect.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/Polaroid/ViewModels/PolaroidVM+Frame.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/ViewModels/PolaroidVM+Frame.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/Polaroid/ViewModels/PolaroidVM+Frame.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/ViewModels/PolaroidVM+Frame.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/Polaroid/ViewModels/PolaroidVM.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/ViewModels/PolaroidVM.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/Polaroid/ViewModels/PolaroidVM.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/ViewModels/PolaroidVM.swift diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/Views/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/Views/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/Polaroid/Views/FramePreviewView.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/Views/FramePreviewView.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/Polaroid/Views/FramePreviewView.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/Views/FramePreviewView.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/Polaroid/Views/FrameSelectorView.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/Views/FrameSelectorView.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/Polaroid/Views/FrameSelectorView.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/Views/FrameSelectorView.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/Polaroid/Views/PhotoSelectSheet.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/Views/PhotoSelectSheet.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/Polaroid/Views/PhotoSelectSheet.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/Views/PhotoSelectSheet.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/Polaroid/Views/PolaroidPreview.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/Views/PolaroidPreview.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/Polaroid/Views/PolaroidPreview.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/Views/PolaroidPreview.swift From 5f0def64e6f7c41f29617fb9cc1d64e0ce5ad479 Mon Sep 17 00:00:00 2001 From: giljihun Date: Tue, 20 Jan 2026 20:35:24 +0900 Subject: [PATCH 10/17] =?UTF-8?q?refactor:=20Templates=20->=20KeyringMaker?= =?UTF-8?q?=20=EB=82=98=EB=A8=B8=EC=A7=80=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/KeyringMaker/Templates/ClearSketch/.gitkeep | 0 .../KeyringMaker/Templates/ClearSketch/ViewModels/.gitkeep | 0 .../Templates/ClearSketch/ViewModels/ClearSketchVM+Crop.swift | 0 .../Templates/ClearSketch/ViewModels/ClearSketchVM+Drawing.swift | 0 .../Templates/ClearSketch/ViewModels/ClearSketchVM+Effect.swift | 0 .../ClearSketch/ViewModels/ClearSketchVM+ImageConversion.swift | 0 .../Templates/ClearSketch/ViewModels/ClearSketchVM.swift | 0 .../KeyringMaker/Templates/ClearSketch/Views/.gitkeep | 0 .../Templates/ClearSketch/Views/ClearSketchCropView.swift | 0 .../ClearSketch/Views/ClearSketchDrawingCanvasView.swift | 0 .../Templates/ClearSketch/Views/ClearSketchDrawingView.swift | 0 .../Templates/ClearSketch/Views/ClearSketchGuiding.swift | 0 .../Templates/ClearSketch/Views/ClearSketchPreview.swift | 0 Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/.gitkeep | 0 .../Presentation/KeyringMaker/Templates/Pixel/ViewModels/.gitkeep | 0 .../Templates/Pixel/ViewModels/PixelVM+Effect.swift | 0 .../Templates/Pixel/ViewModels/PixelVM+ImageConversion.swift | 0 .../Templates/Pixel/ViewModels/PixelVM.swift | 0 .../Presentation/KeyringMaker/Templates/Pixel/Views/.gitkeep | 0 .../Templates/Pixel/Views/PixelDrawView.swift | 0 .../Templates/Pixel/Views/PixelPreviewView.swift | 0 .../Presentation/KeyringMaker/Templates/SpeechBubble/.gitkeep | 0 .../KeyringMaker/Templates/SpeechBubble/ViewModels/.gitkeep | 0 .../SpeechBubble/ViewModels/SpeechBubbleVM+Customizing.swift | 0 .../Templates/SpeechBubble/ViewModels/SpeechBubbleVM+Effect.swift | 0 .../SpeechBubble/ViewModels/SpeechBubbleVM+Firebase.swift | 0 .../Templates/SpeechBubble/ViewModels/SpeechBubbleVM+Frame.swift | 0 .../Templates/SpeechBubble/ViewModels/SpeechBubbleVM.swift | 0 .../KeyringMaker/Templates/SpeechBubble/Views/.gitkeep | 0 .../SpeechBubble/Views/SpeechBubbleFramePreviewView.swift | 0 .../SpeechBubble/Views/SpeechBubbleFrameSelectorView.swift | 0 .../Templates/SpeechBubble/Views/SpeechBubblePreview.swift | 0 32 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/.gitkeep delete mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/ViewModels/.gitkeep rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/ClearSketch/ViewModels/ClearSketchVM+Crop.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/ClearSketch/ViewModels/ClearSketchVM+Drawing.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/ClearSketch/ViewModels/ClearSketchVM+Effect.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/ClearSketch/ViewModels/ClearSketchVM+ImageConversion.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/ClearSketch/ViewModels/ClearSketchVM.swift (100%) delete mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/Views/.gitkeep rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/ClearSketch/Views/ClearSketchCropView.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/ClearSketch/Views/ClearSketchDrawingCanvasView.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/ClearSketch/Views/ClearSketchDrawingView.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/ClearSketch/Views/ClearSketchGuiding.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/ClearSketch/Views/ClearSketchPreview.swift (100%) delete mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/.gitkeep delete mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/ViewModels/.gitkeep rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/Pixel/ViewModels/PixelVM+Effect.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/Pixel/ViewModels/PixelVM+ImageConversion.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/Pixel/ViewModels/PixelVM.swift (100%) delete mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/Views/.gitkeep rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/Pixel/Views/PixelDrawView.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/Pixel/Views/PixelPreviewView.swift (100%) delete mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/.gitkeep delete mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/ViewModels/.gitkeep rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/SpeechBubble/ViewModels/SpeechBubbleVM+Customizing.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/SpeechBubble/ViewModels/SpeechBubbleVM+Effect.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/SpeechBubble/ViewModels/SpeechBubbleVM+Firebase.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/SpeechBubble/ViewModels/SpeechBubbleVM+Frame.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/SpeechBubble/ViewModels/SpeechBubbleVM.swift (100%) delete mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/Views/.gitkeep rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/SpeechBubble/Views/SpeechBubbleFramePreviewView.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/SpeechBubble/Views/SpeechBubbleFrameSelectorView.swift (100%) rename Keychy/Keychy/Presentation/{Workshop/Making => KeyringMaker}/Templates/SpeechBubble/Views/SpeechBubblePreview.swift (100%) diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/ViewModels/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/ViewModels/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/ClearSketch/ViewModels/ClearSketchVM+Crop.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/ViewModels/ClearSketchVM+Crop.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/ClearSketch/ViewModels/ClearSketchVM+Crop.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/ViewModels/ClearSketchVM+Crop.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/ClearSketch/ViewModels/ClearSketchVM+Drawing.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/ViewModels/ClearSketchVM+Drawing.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/ClearSketch/ViewModels/ClearSketchVM+Drawing.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/ViewModels/ClearSketchVM+Drawing.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/ClearSketch/ViewModels/ClearSketchVM+Effect.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/ViewModels/ClearSketchVM+Effect.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/ClearSketch/ViewModels/ClearSketchVM+Effect.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/ViewModels/ClearSketchVM+Effect.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/ClearSketch/ViewModels/ClearSketchVM+ImageConversion.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/ViewModels/ClearSketchVM+ImageConversion.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/ClearSketch/ViewModels/ClearSketchVM+ImageConversion.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/ViewModels/ClearSketchVM+ImageConversion.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/ClearSketch/ViewModels/ClearSketchVM.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/ViewModels/ClearSketchVM.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/ClearSketch/ViewModels/ClearSketchVM.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/ViewModels/ClearSketchVM.swift diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/Views/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/Views/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/ClearSketch/Views/ClearSketchCropView.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/Views/ClearSketchCropView.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/ClearSketch/Views/ClearSketchCropView.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/Views/ClearSketchCropView.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/ClearSketch/Views/ClearSketchDrawingCanvasView.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/Views/ClearSketchDrawingCanvasView.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/ClearSketch/Views/ClearSketchDrawingCanvasView.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/Views/ClearSketchDrawingCanvasView.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/ClearSketch/Views/ClearSketchDrawingView.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/Views/ClearSketchDrawingView.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/ClearSketch/Views/ClearSketchDrawingView.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/Views/ClearSketchDrawingView.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/ClearSketch/Views/ClearSketchGuiding.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/Views/ClearSketchGuiding.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/ClearSketch/Views/ClearSketchGuiding.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/Views/ClearSketchGuiding.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/ClearSketch/Views/ClearSketchPreview.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/Views/ClearSketchPreview.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/ClearSketch/Views/ClearSketchPreview.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/Views/ClearSketchPreview.swift diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/ViewModels/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/ViewModels/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/Pixel/ViewModels/PixelVM+Effect.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/ViewModels/PixelVM+Effect.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/Pixel/ViewModels/PixelVM+Effect.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/ViewModels/PixelVM+Effect.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/Pixel/ViewModels/PixelVM+ImageConversion.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/ViewModels/PixelVM+ImageConversion.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/Pixel/ViewModels/PixelVM+ImageConversion.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/ViewModels/PixelVM+ImageConversion.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/Pixel/ViewModels/PixelVM.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/ViewModels/PixelVM.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/Pixel/ViewModels/PixelVM.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/ViewModels/PixelVM.swift diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/Views/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/Views/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/Pixel/Views/PixelDrawView.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/Views/PixelDrawView.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/Pixel/Views/PixelDrawView.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/Views/PixelDrawView.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/Pixel/Views/PixelPreviewView.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/Views/PixelPreviewView.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/Pixel/Views/PixelPreviewView.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/Views/PixelPreviewView.swift diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/ViewModels/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/ViewModels/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/SpeechBubble/ViewModels/SpeechBubbleVM+Customizing.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/ViewModels/SpeechBubbleVM+Customizing.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/SpeechBubble/ViewModels/SpeechBubbleVM+Customizing.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/ViewModels/SpeechBubbleVM+Customizing.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/SpeechBubble/ViewModels/SpeechBubbleVM+Effect.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/ViewModels/SpeechBubbleVM+Effect.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/SpeechBubble/ViewModels/SpeechBubbleVM+Effect.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/ViewModels/SpeechBubbleVM+Effect.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/SpeechBubble/ViewModels/SpeechBubbleVM+Firebase.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/ViewModels/SpeechBubbleVM+Firebase.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/SpeechBubble/ViewModels/SpeechBubbleVM+Firebase.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/ViewModels/SpeechBubbleVM+Firebase.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/SpeechBubble/ViewModels/SpeechBubbleVM+Frame.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/ViewModels/SpeechBubbleVM+Frame.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/SpeechBubble/ViewModels/SpeechBubbleVM+Frame.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/ViewModels/SpeechBubbleVM+Frame.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/SpeechBubble/ViewModels/SpeechBubbleVM.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/ViewModels/SpeechBubbleVM.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/SpeechBubble/ViewModels/SpeechBubbleVM.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/ViewModels/SpeechBubbleVM.swift diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/Views/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/Views/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/SpeechBubble/Views/SpeechBubbleFramePreviewView.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/Views/SpeechBubbleFramePreviewView.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/SpeechBubble/Views/SpeechBubbleFramePreviewView.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/Views/SpeechBubbleFramePreviewView.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/SpeechBubble/Views/SpeechBubbleFrameSelectorView.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/Views/SpeechBubbleFrameSelectorView.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/SpeechBubble/Views/SpeechBubbleFrameSelectorView.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/Views/SpeechBubbleFrameSelectorView.swift diff --git a/Keychy/Keychy/Presentation/Workshop/Making/Templates/SpeechBubble/Views/SpeechBubblePreview.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/Views/SpeechBubblePreview.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/Making/Templates/SpeechBubble/Views/SpeechBubblePreview.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/Views/SpeechBubblePreview.swift From 53493b50e9e6a2ce4ad9791e5944fa9d56baa804 Mon Sep 17 00:00:00 2001 From: giljihun Date: Tue, 20 Jan 2026 20:38:01 +0900 Subject: [PATCH 11/17] =?UTF-8?q?refactor:=20WorpshopROute=EC=97=90?= =?UTF-8?q?=EC=84=9C=20Making=20=EB=9D=BC=EC=9A=B0=ED=8A=B8=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - WorkshopRoute가 마켓플레이스 기능만 담당하도록 정리함 - preview, coinCharge, myItems 등 --- .../Navigation/Routes/WorkshopRoute.swift | 78 +------------------ .../Presentation/Tab/Views/WorkshopTab.swift | 3 +- 2 files changed, 5 insertions(+), 76 deletions(-) diff --git a/Keychy/Keychy/Core/Navigation/Routes/WorkshopRoute.swift b/Keychy/Keychy/Core/Navigation/Routes/WorkshopRoute.swift index d1129c50e..04059f15a 100644 --- a/Keychy/Keychy/Core/Navigation/Routes/WorkshopRoute.swift +++ b/Keychy/Keychy/Core/Navigation/Routes/WorkshopRoute.swift @@ -4,87 +4,17 @@ // // Created by 길지훈 on 10/16/25. // -import UIKit +import Foundation -/// 공방 탭 라우팅 +/// 공방 탭 라우팅 (마켓플레이스 기능) enum WorkshopRoute: Hashable { - // MARK: - 공통 프리뷰 + // MARK: - 공방 마켓플레이스 case workshopPreview(item: AnyHashable) - - // MARK: - 아크릴 포토 템플릿 - case acrylicPhotoPreview - case acrylicPhotoCrop - case acrylicPhotoEdited - case acrylicPhotoCustomizing - case acrylicPhotoInfoInput - case acrylicPhotoComplete case coinCharge case myItems case workshopTemplates - // MARK: - 네온 사인 템플릿 - case NeonSignPreView - case neonSignCustomizing - case neonSignInfoInput - case neonSignComplete - - // MARK: - 폴라로이드 템플릿 - case polaroidPreview - case polaroidCustomizing - case polaroidInfoInput - case polaroidComplete - - // MARK: - 클리어 스케치 템플릿 - case clearSketchPreview - case clearSketchDrawing - case clearSketchCrop - case clearSketchCustomizing - case clearSketchInfoInput - case clearSketchComplete - - // MARK: - 픽셀 키링 템플릿 - case pixelPreview - case pixelDraw - case pixelCustomizing - case pixelInfoInput - case pixelComplete - - // MARK: - 임시 페스티벌 라우트 + // MARK: - Festival 임시 라우트 (추후 정리 예정) case showcase25BoardView case festivalKeyringDetailView(Keyring) - - // MARK: - 말풍선 키링 템플릿 - case speechBubblePreview - case speechBubbleCustomizing - case speechBubbleInfoInput - case speechBubbleComplete - - // MARK: - 새로운 템플릿의 루트는 이렇게 추가해주면 됩니다. (예정) - // case hkPreview - // case hkCustomizing - // case hkInfoInput - // case hkComplete - - /// template.id 문자열을 WorkshopRoute로 변환 - static func from(string: String) -> WorkshopRoute? { - switch string { - case "AcrylicPhoto": - return .acrylicPhotoPreview - case "NeonSign": - return .NeonSignPreView - case "Polaroid": - return .polaroidPreview - case "ClearSketch": - return .clearSketchPreview - case "PixelKeyring": - return .pixelPreview - case "SpeechBubble": - return .speechBubblePreview - - // 필요한 프리뷰 케이스들 추가 - default: - return nil - } - } } - diff --git a/Keychy/Keychy/Presentation/Tab/Views/WorkshopTab.swift b/Keychy/Keychy/Presentation/Tab/Views/WorkshopTab.swift index 5fdad43dd..f5ffa30f9 100644 --- a/Keychy/Keychy/Presentation/Tab/Views/WorkshopTab.swift +++ b/Keychy/Keychy/Presentation/Tab/Views/WorkshopTab.swift @@ -81,12 +81,11 @@ struct WorkshopTab: View { // MARK: - 쇼케이스용 페스티벌 임시 라우트 case .showcase25BoardView: - Showcase25BoardView(festivalRouter: festivalRouter, workshopRouter: router, viewModel: festivalVM) + Showcase25BoardView(festivalRouter: festivalRouter, keyringMakerRouter: keyringMakerRouter, viewModel: festivalVM) case .festivalKeyringDetailView(let keyring): FestivalKeyringDetailView( festivalRouter: festivalRouter, - workshopRouter: router, keyringMakerRouter: keyringMakerRouter, viewModel: festivalVM, keyring: keyring From 19a70cc2b707f3b2c0c395099be00a0b6804b13a Mon Sep 17 00:00:00 2001 From: giljihun Date: Tue, 20 Jan 2026 20:40:06 +0900 Subject: [PATCH 12/17] =?UTF-8?q?refactor:=20Worhshop=20=ED=8F=B4=EB=8D=94?= =?UTF-8?q?=20=EA=B5=AC=EC=A1=B0=20=EC=9E=AC=EA=B5=AC=EC=84=B1!!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ``` Workshop/ ├── ViewModels/ │ └── WorkshopViewModel.swift ├── Views/ │ ├── Main/ (7개 파일) │ │ ├── WorkshopView.swift │ │ ├── WorkshopGridHelpers.swift │ │ ├── WorkshopTemplatesView.swift │ │ └── ...Section.swift (4개) │ ├── MyItemsView.swift │ └── WorkshopPreview.swift ├── Components/ │ └── WorkshopComponents.swift └── Coin/ (3개 파일 - 기존 유지) ``` --- .../Workshop/{ => Components}/WorkshopComponents.swift | 0 .../Workshop/{ => ViewModels}/WorkshopViewModel.swift | 0 .../{WorkshopMain => Views/Main}/WorkshopGridHelpers.swift | 0 .../{WorkshopMain => Views/Main}/WorkshopMainContentSection.swift | 0 .../Main}/WorkshopMakingKeyringSection.swift | 0 .../Main}/WorkshopStickyHeaderSection.swift | 0 .../{WorkshopMain => Views/Main}/WorkshopTemplatesView.swift | 0 .../{WorkshopMain => Views/Main}/WorkshopTopBannerSection.swift | 0 .../Workshop/{WorkshopMain => Views/Main}/WorkshopView.swift | 0 Keychy/Keychy/Presentation/Workshop/{ => Views}/MyItemsView.swift | 0 .../Presentation/Workshop/{ => Views}/WorkshopPreview.swift | 0 11 files changed, 0 insertions(+), 0 deletions(-) rename Keychy/Keychy/Presentation/Workshop/{ => Components}/WorkshopComponents.swift (100%) rename Keychy/Keychy/Presentation/Workshop/{ => ViewModels}/WorkshopViewModel.swift (100%) rename Keychy/Keychy/Presentation/Workshop/{WorkshopMain => Views/Main}/WorkshopGridHelpers.swift (100%) rename Keychy/Keychy/Presentation/Workshop/{WorkshopMain => Views/Main}/WorkshopMainContentSection.swift (100%) rename Keychy/Keychy/Presentation/Workshop/{WorkshopMain => Views/Main}/WorkshopMakingKeyringSection.swift (100%) rename Keychy/Keychy/Presentation/Workshop/{WorkshopMain => Views/Main}/WorkshopStickyHeaderSection.swift (100%) rename Keychy/Keychy/Presentation/Workshop/{WorkshopMain => Views/Main}/WorkshopTemplatesView.swift (100%) rename Keychy/Keychy/Presentation/Workshop/{WorkshopMain => Views/Main}/WorkshopTopBannerSection.swift (100%) rename Keychy/Keychy/Presentation/Workshop/{WorkshopMain => Views/Main}/WorkshopView.swift (100%) rename Keychy/Keychy/Presentation/Workshop/{ => Views}/MyItemsView.swift (100%) rename Keychy/Keychy/Presentation/Workshop/{ => Views}/WorkshopPreview.swift (100%) diff --git a/Keychy/Keychy/Presentation/Workshop/WorkshopComponents.swift b/Keychy/Keychy/Presentation/Workshop/Components/WorkshopComponents.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/WorkshopComponents.swift rename to Keychy/Keychy/Presentation/Workshop/Components/WorkshopComponents.swift diff --git a/Keychy/Keychy/Presentation/Workshop/WorkshopViewModel.swift b/Keychy/Keychy/Presentation/Workshop/ViewModels/WorkshopViewModel.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/WorkshopViewModel.swift rename to Keychy/Keychy/Presentation/Workshop/ViewModels/WorkshopViewModel.swift diff --git a/Keychy/Keychy/Presentation/Workshop/WorkshopMain/WorkshopGridHelpers.swift b/Keychy/Keychy/Presentation/Workshop/Views/Main/WorkshopGridHelpers.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/WorkshopMain/WorkshopGridHelpers.swift rename to Keychy/Keychy/Presentation/Workshop/Views/Main/WorkshopGridHelpers.swift diff --git a/Keychy/Keychy/Presentation/Workshop/WorkshopMain/WorkshopMainContentSection.swift b/Keychy/Keychy/Presentation/Workshop/Views/Main/WorkshopMainContentSection.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/WorkshopMain/WorkshopMainContentSection.swift rename to Keychy/Keychy/Presentation/Workshop/Views/Main/WorkshopMainContentSection.swift diff --git a/Keychy/Keychy/Presentation/Workshop/WorkshopMain/WorkshopMakingKeyringSection.swift b/Keychy/Keychy/Presentation/Workshop/Views/Main/WorkshopMakingKeyringSection.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/WorkshopMain/WorkshopMakingKeyringSection.swift rename to Keychy/Keychy/Presentation/Workshop/Views/Main/WorkshopMakingKeyringSection.swift diff --git a/Keychy/Keychy/Presentation/Workshop/WorkshopMain/WorkshopStickyHeaderSection.swift b/Keychy/Keychy/Presentation/Workshop/Views/Main/WorkshopStickyHeaderSection.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/WorkshopMain/WorkshopStickyHeaderSection.swift rename to Keychy/Keychy/Presentation/Workshop/Views/Main/WorkshopStickyHeaderSection.swift diff --git a/Keychy/Keychy/Presentation/Workshop/WorkshopMain/WorkshopTemplatesView.swift b/Keychy/Keychy/Presentation/Workshop/Views/Main/WorkshopTemplatesView.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/WorkshopMain/WorkshopTemplatesView.swift rename to Keychy/Keychy/Presentation/Workshop/Views/Main/WorkshopTemplatesView.swift diff --git a/Keychy/Keychy/Presentation/Workshop/WorkshopMain/WorkshopTopBannerSection.swift b/Keychy/Keychy/Presentation/Workshop/Views/Main/WorkshopTopBannerSection.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/WorkshopMain/WorkshopTopBannerSection.swift rename to Keychy/Keychy/Presentation/Workshop/Views/Main/WorkshopTopBannerSection.swift diff --git a/Keychy/Keychy/Presentation/Workshop/WorkshopMain/WorkshopView.swift b/Keychy/Keychy/Presentation/Workshop/Views/Main/WorkshopView.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/WorkshopMain/WorkshopView.swift rename to Keychy/Keychy/Presentation/Workshop/Views/Main/WorkshopView.swift diff --git a/Keychy/Keychy/Presentation/Workshop/MyItemsView.swift b/Keychy/Keychy/Presentation/Workshop/Views/MyItemsView.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/MyItemsView.swift rename to Keychy/Keychy/Presentation/Workshop/Views/MyItemsView.swift diff --git a/Keychy/Keychy/Presentation/Workshop/WorkshopPreview.swift b/Keychy/Keychy/Presentation/Workshop/Views/WorkshopPreview.swift similarity index 100% rename from Keychy/Keychy/Presentation/Workshop/WorkshopPreview.swift rename to Keychy/Keychy/Presentation/Workshop/Views/WorkshopPreview.swift From 97adbff0283bbb6b213d6e09760d1bb2a9720097 Mon Sep 17 00:00:00 2001 From: giljihun Date: Tue, 20 Jan 2026 20:43:36 +0900 Subject: [PATCH 13/17] =?UTF-8?q?refactor:=20=ED=8E=98=EC=8A=A4=ED=8B=B0?= =?UTF-8?q?=EB=B2=8C=EC=AA=BD=20KeyringMaker=20=EC=BD=9C=EB=B0=B1=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewModels/Showcase25BoardViewModel.swift | 5 ++--- .../Tab/ViewModels/MainTabViewModel.swift | 17 +++-------------- .../Presentation/Tab/Views/WorkshopTab.swift | 12 ++++++------ 3 files changed, 11 insertions(+), 23 deletions(-) diff --git a/Keychy/Keychy/Presentation/Festival/ViewModels/Showcase25BoardViewModel.swift b/Keychy/Keychy/Presentation/Festival/ViewModels/Showcase25BoardViewModel.swift index f38c92f9e..5620590e0 100644 --- a/Keychy/Keychy/Presentation/Festival/ViewModels/Showcase25BoardViewModel.swift +++ b/Keychy/Keychy/Presentation/Festival/ViewModels/Showcase25BoardViewModel.swift @@ -20,10 +20,9 @@ class Showcase25BoardViewModel { var userKeyrings: [Keyring] = [] var selectedKeyringIndex: Int = 0 - // MARK: - Festival에서 Workshop으로 갔을 때 사용 + // MARK: - Festival에서 KeyringMaker로 갔을 때 사용 var isFromFestivalTab: Bool = false - var onKeyringCompleteFromFestival: ((NavigationRouter) -> Void)? - var onKeyringCompleteFromFestivalKeyringMaker: ((NavigationRouter) -> Void)? + var onKeyringCompleteFromFestival: ((NavigationRouter) -> Void)? // MARK: - 선택된 키링 디테일 var selectedShowcaseKeyring: ShowcaseFestivalKeyring? diff --git a/Keychy/Keychy/Presentation/Tab/ViewModels/MainTabViewModel.swift b/Keychy/Keychy/Presentation/Tab/ViewModels/MainTabViewModel.swift index c68555d6a..6524aff45 100644 --- a/Keychy/Keychy/Presentation/Tab/ViewModels/MainTabViewModel.swift +++ b/Keychy/Keychy/Presentation/Tab/ViewModels/MainTabViewModel.swift @@ -82,7 +82,7 @@ class MainTabViewModel { /// Festival 탭에서 Workshop 탭으로 전환하고 특정 라우트로 이동 /// - Parameter route: 이동할 WorkshopRoute func handleSwitchToWorkshop(_ route: WorkshopRoute) { - setupFestivalReturnCallback() + festivalViewModel.isFromFestivalTab = true selectedTab = TabIndex.workshop.rawValue Task { @MainActor in @@ -94,7 +94,7 @@ class MainTabViewModel { /// Festival 탭에서 KeyringMaker로 전환하고 특정 라우트로 이동 /// - Parameter route: 이동할 KeyringMakerRoute func handleSwitchToKeyringMaker(_ route: KeyringMakerRoute) { - setupFestivalReturnCallbackForKeyringMaker() + setupFestivalReturnCallback() selectedTab = TabIndex.workshop.rawValue Task { @MainActor in @@ -104,7 +104,7 @@ class MainTabViewModel { } // MARK: - Private Methods - /// Festival → Workshop 이동 시 완료 후 복귀 콜백 설정 + /// Festival → KeyringMaker 이동 시 완료 후 복귀 콜백 설정 private func setupFestivalReturnCallback() { festivalViewModel.isFromFestivalTab = true festivalViewModel.onKeyringCompleteFromFestival = { [weak self] router in @@ -115,17 +115,6 @@ class MainTabViewModel { } } - /// Festival → KeyringMaker 이동 시 완료 후 복귀 콜백 설정 - private func setupFestivalReturnCallbackForKeyringMaker() { - festivalViewModel.isFromFestivalTab = true - festivalViewModel.onKeyringCompleteFromFestivalKeyringMaker = { [weak self] router in - guard let self = self else { return } - router.reset() - self.selectedTab = TabIndex.festival.rawValue - self.festivalViewModel.isFromFestivalTab = false - } - } - /// 대기 중인 딥링크가 있는지 확인하고 처리 private func checkPendingDeepLink() { if let (postOfficeId, type) = deepLinkManager.consumePendingDeepLink() { diff --git a/Keychy/Keychy/Presentation/Tab/Views/WorkshopTab.swift b/Keychy/Keychy/Presentation/Tab/Views/WorkshopTab.swift index f5ffa30f9..a997a08ae 100644 --- a/Keychy/Keychy/Presentation/Tab/Views/WorkshopTab.swift +++ b/Keychy/Keychy/Presentation/Tab/Views/WorkshopTab.swift @@ -126,7 +126,7 @@ struct WorkshopTab: View { viewModel: getAcrylicPhotoVM(), navigationTitle: "키링이 완성되었어요!", onCloseFromFestival: festivalVM.isFromFestivalTab ? { router in - festivalVM.onKeyringCompleteFromFestivalKeyringMaker?(router) + festivalVM.onKeyringCompleteFromFestival?(router) } : nil ) @@ -151,7 +151,7 @@ struct WorkshopTab: View { viewModel: getNeonSignVM(), navigationTitle: "키링이 완성되었어요!", onCloseFromFestival: festivalVM.isFromFestivalTab ? { router in - festivalVM.onKeyringCompleteFromFestivalKeyringMaker?(router) + festivalVM.onKeyringCompleteFromFestival?(router) } : nil ) @@ -176,7 +176,7 @@ struct WorkshopTab: View { viewModel: getPolaroidVM(), navigationTitle: "키링이 완성되었어요!", onCloseFromFestival: festivalVM.isFromFestivalTab ? { router in - festivalVM.onKeyringCompleteFromFestivalKeyringMaker?(router) + festivalVM.onKeyringCompleteFromFestival?(router) } : nil ) @@ -205,7 +205,7 @@ struct WorkshopTab: View { viewModel: getClearSketchVM(), navigationTitle: "키링이 완성되었어요!", onCloseFromFestival: festivalVM.isFromFestivalTab ? { router in - festivalVM.onKeyringCompleteFromFestivalKeyringMaker?(router) + festivalVM.onKeyringCompleteFromFestival?(router) } : nil ) @@ -232,7 +232,7 @@ struct WorkshopTab: View { viewModel: getPixelKeyringVM(), navigationTitle: "키링이 완성되었어요!", onCloseFromFestival: festivalVM.isFromFestivalTab ? { router in - festivalVM.onKeyringCompleteFromFestivalKeyringMaker?(router) + festivalVM.onKeyringCompleteFromFestival?(router) } : nil ) @@ -257,7 +257,7 @@ struct WorkshopTab: View { viewModel: getSpeechBubbleVM(), navigationTitle: "키링이 완성되었어요!", onCloseFromFestival: festivalVM.isFromFestivalTab ? { router in - festivalVM.onKeyringCompleteFromFestivalKeyringMaker?(router) + festivalVM.onKeyringCompleteFromFestival?(router) } : nil ) } From d7607b7222ac80ce12c1195c642a4ad0a2e85995 Mon Sep 17 00:00:00 2001 From: giljihun Date: Tue, 20 Jan 2026 20:52:50 +0900 Subject: [PATCH 14/17] =?UTF-8?q?chore:=20.gitkeep=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Keychy/Keychy.xcodeproj/project.pbxproj | 1140 +++++++++-------- .../Keychy/Presentation/KeyringMaker/.gitkeep | 0 .../Presentation/KeyringMaker/Core/.gitkeep | 0 .../Presentation/KeyringMaker/Shared/.gitkeep | 0 .../KeyringMaker/Templates/.gitkeep | 0 5 files changed, 592 insertions(+), 548 deletions(-) delete mode 100644 Keychy/Keychy/Presentation/KeyringMaker/.gitkeep delete mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Core/.gitkeep delete mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Shared/.gitkeep delete mode 100644 Keychy/Keychy/Presentation/KeyringMaker/Templates/.gitkeep diff --git a/Keychy/Keychy.xcodeproj/project.pbxproj b/Keychy/Keychy.xcodeproj/project.pbxproj index afa934cb8..44f4cd24f 100644 --- a/Keychy/Keychy.xcodeproj/project.pbxproj +++ b/Keychy/Keychy.xcodeproj/project.pbxproj @@ -17,9 +17,6 @@ 3822DDC22EBBC712003125BE /* KeyringEditView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3822DDC12EBBC712003125BE /* KeyringEditView.swift */; }; 3822DDC42EBBE108003125BE /* CopyPopup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3822DDC32EBBE108003125BE /* CopyPopup.swift */; }; 3822DDC62EBBE252003125BE /* LackPopup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3822DDC52EBBE252003125BE /* LackPopup.swift */; }; - 3824B5E52ED352CC00A4BBCB /* ClearSketchCropView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3824B5E42ED352CC00A4BBCB /* ClearSketchCropView.swift */; }; - 3824B6032ED37EC900A4BBCB /* ClearSketchVM+ImageConversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3824B6022ED37EC900A4BBCB /* ClearSketchVM+ImageConversion.swift */; }; - 3824B6052ED3A18100A4BBCB /* ClearSketchVM+Crop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3824B6042ED3A18100A4BBCB /* ClearSketchVM+Crop.swift */; }; 382800D12EC05D4E005F1332 /* PostOffice.swift in Sources */ = {isa = PBXBuildFile; fileRef = 382800D02EC05D4E005F1332 /* PostOffice.swift */; }; 382800D32EC0628D005F1332 /* CollectionViewModel+Package.swift in Sources */ = {isa = PBXBuildFile; fileRef = 382800D22EC0628D005F1332 /* CollectionViewModel+Package.swift */; }; 38283A7F2EBD3E8400BE45A5 /* PackageCompleteView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38283A7E2EBD3E8400BE45A5 /* PackageCompleteView.swift */; }; @@ -33,7 +30,6 @@ 385425BE2EB2989400A06C02 /* CollectionCellView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 385425BD2EB2989400A06C02 /* CollectionCellView.swift */; }; 385425C02EB2AE7800A06C02 /* CollectionViewModel+Sort.swift in Sources */ = {isa = PBXBuildFile; fileRef = 385425BF2EB2AE7800A06C02 /* CollectionViewModel+Sort.swift */; }; 385425C32EB2C35E00A06C02 /* WidgetSettingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 385425C22EB2C35E00A06C02 /* WidgetSettingView.swift */; }; - 385425C62EB3BD7C00A06C02 /* AcrylicPhotoGuiding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CBBEF162EB24DEC00252590 /* AcrylicPhotoGuiding.swift */; }; 385425C82EB3C3F300A06C02 /* KeyringDetailSceneView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 385425C72EB3C3F300A06C02 /* KeyringDetailSceneView.swift */; }; 385425CA2EB3C79A00A06C02 /* KeyringDetailScene.swift in Sources */ = {isa = PBXBuildFile; fileRef = 385425C92EB3C79A00A06C02 /* KeyringDetailScene.swift */; }; 385425CC2EB3C7CC00A06C02 /* KeyringDetailScene+Setup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 385425CB2EB3C7CC00A06C02 /* KeyringDetailScene+Setup.swift */; }; @@ -48,12 +44,10 @@ 386B17542ECCE8EC00CCCC23 /* CollectionViewModel+Distribution.swift in Sources */ = {isa = PBXBuildFile; fileRef = 386B17532ECCE8EC00CCCC23 /* CollectionViewModel+Distribution.swift */; }; 386B17642ECD142600CCCC23 /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 386B17632ECD142600CCCC23 /* String+Extension.swift */; }; 388E72942EF341F200AE1F1B /* CollectionViewModel+UserData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 388E72932EF341F200AE1F1B /* CollectionViewModel+UserData.swift */; }; - 389080072ED3B43900D7A49F /* ClearSketchGuiding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 389080062ED3B43900D7A49F /* ClearSketchGuiding.swift */; }; 389080172ED3F05D00D7A49F /* FestivalKeyringDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 389080162ED3F05D00D7A49F /* FestivalKeyringDetailView.swift */; }; 389080192ED3F32700D7A49F /* FestivalKeyringDetailView+Sheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 389080182ED3F32700D7A49F /* FestivalKeyringDetailView+Sheet.swift */; }; 3890801B2ED3F3BB00D7A49F /* FestivalKeyringDetailView+Alerts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3890801A2ED3F3BB00D7A49F /* FestivalKeyringDetailView+Alerts.swift */; }; 389080632ED47F2500D7A49F /* VotePopup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 389080622ED47F2500D7A49F /* VotePopup.swift */; }; - 389497172ED32405008340FA /* ClearSketchDrawingCanvasView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 389497162ED32405008340FA /* ClearSketchDrawingCanvasView.swift */; }; 38A22A7F2EC2238800B4C7C5 /* CollectionKeyringPackageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38A22A7E2EC2238800B4C7C5 /* CollectionKeyringPackageView.swift */; }; 38A22A9D2EC27AC400B4C7C5 /* PackagedKeyringView+SaveImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38A22A9C2EC27AC400B4C7C5 /* PackagedKeyringView+SaveImage.swift */; }; 38A22A9F2EC28B3D00B4C7C5 /* PackageCompleteView+SaveImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38A22A9E2EC28B3D00B4C7C5 /* PackageCompleteView+SaveImage.swift */; }; @@ -84,11 +78,6 @@ 38C3C2922EC1F787003C5DE1 /* CollectionKeyringDetailView+Lifecycle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38C3C2912EC1F787003C5DE1 /* CollectionKeyringDetailView+Lifecycle.swift */; }; 38C3C2942EC1F81C003C5DE1 /* CollectionKeyringDetailView+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38C3C2932EC1F81C003C5DE1 /* CollectionKeyringDetailView+Helpers.swift */; }; 38C3C2962EC20B1E003C5DE1 /* PackagedKeyringView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38C3C2952EC20B1E003C5DE1 /* PackagedKeyringView.swift */; }; - 38CE39B22ECD995D00168E4B /* ClearSketchPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38CE39B12ECD995D00168E4B /* ClearSketchPreview.swift */; }; - 38CE39B42ECD998B00168E4B /* ClearSketchVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38CE39B32ECD998B00168E4B /* ClearSketchVM.swift */; }; - 38CE39D22ECE5F9300168E4B /* ClearSketchVM+Effect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38CE39D12ECE5F9300168E4B /* ClearSketchVM+Effect.swift */; }; - 38CE39D42ECE62D100168E4B /* ClearSketchDrawingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38CE39D32ECE62D100168E4B /* ClearSketchDrawingView.swift */; }; - 38CE39E42ECE684300168E4B /* ClearSketchVM+Drawing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38CE39E32ECE684300168E4B /* ClearSketchVM+Drawing.swift */; }; 38D17A512EBBF88C00F52A88 /* CollectionViewModel+Edit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38D17A502EBBF88C00F52A88 /* CollectionViewModel+Edit.swift */; }; 38DD90622ED594C00042EB45 /* FestivalKeyringContextMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38DD90612ED594C00042EB45 /* FestivalKeyringContextMenu.swift */; }; 38DD909C2EF1679D0042EB45 /* Color+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38DD909B2EF1679D0042EB45 /* Color+Extension.swift */; }; @@ -111,14 +100,8 @@ 4C004FB12F187CFC00D9063E /* CollectionKeyringDetailView+VideoGen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C004FB02F187CFC00D9063E /* CollectionKeyringDetailView+VideoGen.swift */; }; 4C004FB32F187ED000D9063E /* KeyringVideoGenerator+Keyring.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C004FB22F187ED000D9063E /* KeyringVideoGenerator+Keyring.swift */; }; 4C004FB52F18D98C00D9063E /* ReviewManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C004FB42F18D98C00D9063E /* ReviewManager.swift */; }; - 4C004FB92F19C27700D9063E /* KeyringCompleteView+ReviewCheck.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C004FB82F19C27700D9063E /* KeyringCompleteView+ReviewCheck.swift */; }; 4C004FBB2F19F1FE00D9063E /* RootViewModel+ReviewCheck.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C004FBA2F19F1FE00D9063E /* RootViewModel+ReviewCheck.swift */; }; 4C07024C2ECF10760026D6DC /* EffectSyncManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C07024A2ECF10760026D6DC /* EffectSyncManager.swift */; }; - 4C07027F2ED1DFA20026D6DC /* PixelVM+Effect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0702782ED1DFA20026D6DC /* PixelVM+Effect.swift */; }; - 4C0702802ED1DFA20026D6DC /* PixelVM+ImageConversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0702792ED1DFA20026D6DC /* PixelVM+ImageConversion.swift */; }; - 4C0702812ED1DFA20026D6DC /* PixelVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0702772ED1DFA20026D6DC /* PixelVM.swift */; }; - 4C0702822ED1DFA20026D6DC /* PixelDrawView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C07027B2ED1DFA20026D6DC /* PixelDrawView.swift */; }; - 4C0702832ED1DFA20026D6DC /* PixelPreviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C07027C2ED1DFA20026D6DC /* PixelPreviewView.swift */; }; 4C3687F72EBFA87800C64E75 /* Pretendard-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 4C3687F62EBFA87800C64E75 /* Pretendard-Medium.ttf */; }; 4C3687FA2EBFC0FB00C64E75 /* NotificationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3687F82EBFC0FB00C64E75 /* NotificationManager.swift */; }; 4C3687FC2EC05E6800C64E75 /* AccountAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3687FB2EC05E6800C64E75 /* AccountAlert.swift */; }; @@ -133,15 +116,94 @@ 4C36880F2EC07C4E00C64E75 /* NotoSansKR-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 4C3688042EC07C4E00C64E75 /* NotoSansKR-Regular.ttf */; }; 4C3688132EC08A3100C64E75 /* HancomMalangMalang-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 4C3688112EC08A3100C64E75 /* HancomMalangMalang-Bold.otf */; }; 4C3688142EC08A3100C64E75 /* HancomMalangMalang-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = 4C3688122EC08A3100C64E75 /* HancomMalangMalang-Regular.otf */; }; + 4C4733232F1FA2AB005D2376 /* WorkshopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C47331E2F1FA2AB005D2376 /* WorkshopView.swift */; }; + 4C4733242F1FA2AB005D2376 /* WorkshopPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733212F1FA2AB005D2376 /* WorkshopPreview.swift */; }; + 4C4733252F1FA2AB005D2376 /* MyItemsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733202F1FA2AB005D2376 /* MyItemsView.swift */; }; + 4C4733262F1FA2AB005D2376 /* WorkshopGridHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733182F1FA2AB005D2376 /* WorkshopGridHelpers.swift */; }; + 4C4733272F1FA2AB005D2376 /* WorkshopMakingKeyringSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C47331A2F1FA2AB005D2376 /* WorkshopMakingKeyringSection.swift */; }; + 4C4733282F1FA2AB005D2376 /* WorkshopTemplatesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C47331C2F1FA2AB005D2376 /* WorkshopTemplatesView.swift */; }; + 4C4733292F1FA2AB005D2376 /* WorkshopMainContentSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733192F1FA2AB005D2376 /* WorkshopMainContentSection.swift */; }; + 4C47332A2F1FA2AB005D2376 /* WorkshopStickyHeaderSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C47331B2F1FA2AB005D2376 /* WorkshopStickyHeaderSection.swift */; }; + 4C47332B2F1FA2AB005D2376 /* WorkshopTopBannerSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C47331D2F1FA2AB005D2376 /* WorkshopTopBannerSection.swift */; }; + 4C47332C2F1FA2AB005D2376 /* WorkshopComponents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733142F1FA2AB005D2376 /* WorkshopComponents.swift */; }; + 4C47332D2F1FA2AB005D2376 /* WorkshopViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733162F1FA2AB005D2376 /* WorkshopViewModel.swift */; }; + 4C4733942F1FA388005D2376 /* PixelDrawView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733772F1FA388005D2376 /* PixelDrawView.swift */; }; + 4C4733952F1FA388005D2376 /* ClearSketchDrawingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733652F1FA388005D2376 /* ClearSketchDrawingView.swift */; }; + 4C4733962F1FA388005D2376 /* KeyringCustomizingView+Cart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733432F1FA388005D2376 /* KeyringCustomizingView+Cart.swift */; }; + 4C4733972F1FA388005D2376 /* EffectItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C47333B2F1FA388005D2376 /* EffectItem.swift */; }; + 4C4733982F1FA388005D2376 /* PolaroidPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733822F1FA388005D2376 /* PolaroidPreview.swift */; }; + 4C4733992F1FA388005D2376 /* EffectSelectorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C47333D2F1FA388005D2376 /* EffectSelectorView.swift */; }; + 4C47339A2F1FA388005D2376 /* AcrylicPhotoEditedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733582F1FA388005D2376 /* AcrylicPhotoEditedView.swift */; }; + 4C47339B2F1FA388005D2376 /* KeyringCustomizingView+Purchase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733442F1FA388005D2376 /* KeyringCustomizingView+Purchase.swift */; }; + 4C47339C2F1FA388005D2376 /* PreviewGuiding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733382F1FA388005D2376 /* PreviewGuiding.swift */; }; + 4C47339D2F1FA388005D2376 /* DrawingCanvasView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C47336E2F1FA388005D2376 /* DrawingCanvasView.swift */; }; + 4C47339E2F1FA388005D2376 /* NeonSignVM+Drawing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C47336B2F1FA388005D2376 /* NeonSignVM+Drawing.swift */; }; + 4C47339F2F1FA388005D2376 /* SpeechBubblePreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C47338D2F1FA388005D2376 /* SpeechBubblePreview.swift */; }; + 4C4733A02F1FA388005D2376 /* KeyringCustomizingView+PurchaseSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733452F1FA388005D2376 /* KeyringCustomizingView+PurchaseSheet.swift */; }; + 4C4733A12F1FA388005D2376 /* AcrylicPhotoCropView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733572F1FA388005D2376 /* AcrylicPhotoCropView.swift */; }; + 4C4733A22F1FA388005D2376 /* PhotoSelectSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733812F1FA388005D2376 /* PhotoSelectSheet.swift */; }; + 4C4733A32F1FA388005D2376 /* SpeechBubbleVM+Firebase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733882F1FA388005D2376 /* SpeechBubbleVM+Firebase.swift */; }; + 4C4733A42F1FA388005D2376 /* KeyringInfoInputView+FirebaseSave.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733472F1FA388005D2376 /* KeyringInfoInputView+FirebaseSave.swift */; }; + 4C4733A52F1FA388005D2376 /* SpeechBubbleFramePreviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C47338B2F1FA388005D2376 /* SpeechBubbleFramePreviewView.swift */; }; + 4C4733A62F1FA388005D2376 /* KeyringCompleteView+VideoGen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733412F1FA388005D2376 /* KeyringCompleteView+VideoGen.swift */; }; + 4C4733A72F1FA388005D2376 /* KeyringCompleteView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C47333E2F1FA388005D2376 /* KeyringCompleteView.swift */; }; + 4C4733A82F1FA388005D2376 /* AcrylicPhotoVM+ImageLoad.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733552F1FA388005D2376 /* AcrylicPhotoVM+ImageLoad.swift */; }; + 4C4733A92F1FA388005D2376 /* NeonSignPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733702F1FA388005D2376 /* NeonSignPreview.swift */; }; + 4C4733AA2F1FA388005D2376 /* SpeechBubbleFrameSelectorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C47338C2F1FA388005D2376 /* SpeechBubbleFrameSelectorView.swift */; }; + 4C4733AB2F1FA388005D2376 /* KeyringViewModelProtocol+Reset.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C47332F2F1FA388005D2376 /* KeyringViewModelProtocol+Reset.swift */; }; + 4C4733AC2F1FA388005D2376 /* PixelPreviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733782F1FA388005D2376 /* PixelPreviewView.swift */; }; + 4C4733AD2F1FA388005D2376 /* ClearSketchVM+ImageConversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733612F1FA388005D2376 /* ClearSketchVM+ImageConversion.swift */; }; + 4C4733AE2F1FA388005D2376 /* CinematicAppearanceModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733372F1FA388005D2376 /* CinematicAppearanceModifier.swift */; }; + 4C4733AF2F1FA388005D2376 /* ClearSketchVM+Effect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733602F1FA388005D2376 /* ClearSketchVM+Effect.swift */; }; + 4C4733B02F1FA388005D2376 /* AcrylicPhotoVM+Effect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733542F1FA388005D2376 /* AcrylicPhotoVM+Effect.swift */; }; + 4C4733B12F1FA388005D2376 /* PixelVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733732F1FA388005D2376 /* PixelVM.swift */; }; + 4C4733B22F1FA388005D2376 /* KeyringCompleteView+ReviewCheck.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C47333F2F1FA388005D2376 /* KeyringCompleteView+ReviewCheck.swift */; }; + 4C4733B32F1FA388005D2376 /* AcrylicPhotoVM+BGRemover.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733512F1FA388005D2376 /* AcrylicPhotoVM+BGRemover.swift */; }; + 4C4733B42F1FA388005D2376 /* ClearSketchGuiding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733662F1FA388005D2376 /* ClearSketchGuiding.swift */; }; + 4C4733B52F1FA388005D2376 /* KeyringCustomizingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733422F1FA388005D2376 /* KeyringCustomizingView.swift */; }; + 4C4733B62F1FA388005D2376 /* KeyringInfoInputView+Sheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733492F1FA388005D2376 /* KeyringInfoInputView+Sheet.swift */; }; + 4C4733B72F1FA388005D2376 /* KeyringInfoInputView+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733482F1FA388005D2376 /* KeyringInfoInputView+Helpers.swift */; }; + 4C4733B82F1FA388005D2376 /* FrameSelectorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733802F1FA388005D2376 /* FrameSelectorView.swift */; }; + 4C4733B92F1FA388005D2376 /* KeyringInfoInputView+TagManagement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C47334A2F1FA388005D2376 /* KeyringInfoInputView+TagManagement.swift */; }; + 4C4733BA2F1FA388005D2376 /* AcrylicPhotoVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733502F1FA388005D2376 /* AcrylicPhotoVM.swift */; }; + 4C4733BB2F1FA388005D2376 /* CameraPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733362F1FA388005D2376 /* CameraPicker.swift */; }; + 4C4733BC2F1FA388005D2376 /* PixelVM+ImageConversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733752F1FA388005D2376 /* PixelVM+ImageConversion.swift */; }; + 4C4733BD2F1FA388005D2376 /* AcrylicPhotoGuiding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733592F1FA388005D2376 /* AcrylicPhotoGuiding.swift */; }; + 4C4733BE2F1FA388005D2376 /* PolaroidVM+Effect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C47337C2F1FA388005D2376 /* PolaroidVM+Effect.swift */; }; + 4C4733BF2F1FA388005D2376 /* PolaroidVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C47337B2F1FA388005D2376 /* PolaroidVM.swift */; }; + 4C4733C02F1FA388005D2376 /* ClearSketchPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733672F1FA388005D2376 /* ClearSketchPreview.swift */; }; + 4C4733C12F1FA388005D2376 /* ClearSketchVM+Drawing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C47335F2F1FA388005D2376 /* ClearSketchVM+Drawing.swift */; }; + 4C4733C22F1FA388005D2376 /* PixelVM+Effect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733742F1FA388005D2376 /* PixelVM+Effect.swift */; }; + 4C4733C32F1FA388005D2376 /* CropModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C47334E2F1FA388005D2376 /* CropModels.swift */; }; + 4C4733C42F1FA388005D2376 /* SpeechBubbleVM+Effect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733872F1FA388005D2376 /* SpeechBubbleVM+Effect.swift */; }; + 4C4733C52F1FA388005D2376 /* ClearSketchCropView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733632F1FA388005D2376 /* ClearSketchCropView.swift */; }; + 4C4733C62F1FA388005D2376 /* AudioRecorderManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733332F1FA388005D2376 /* AudioRecorderManager.swift */; }; + 4C4733C72F1FA388005D2376 /* DrawingToolsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C47336F2F1FA388005D2376 /* DrawingToolsView.swift */; }; + 4C4733C82F1FA388005D2376 /* KeyringInfoInputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733462F1FA388005D2376 /* KeyringInfoInputView.swift */; }; + 4C4733C92F1FA388005D2376 /* PolaroidVM+Frame.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C47337D2F1FA388005D2376 /* PolaroidVM+Frame.swift */; }; + 4C4733CA2F1FA388005D2376 /* KeyringViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C47332E2F1FA388005D2376 /* KeyringViewModelProtocol.swift */; }; + 4C4733CB2F1FA388005D2376 /* NeonSignVM+Effect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C47336C2F1FA388005D2376 /* NeonSignVM+Effect.swift */; }; + 4C4733CC2F1FA388005D2376 /* SpeechBubbleVM+Frame.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733892F1FA388005D2376 /* SpeechBubbleVM+Frame.swift */; }; + 4C4733CD2F1FA388005D2376 /* NeonSignVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C47336A2F1FA388005D2376 /* NeonSignVM.swift */; }; + 4C4733CE2F1FA388005D2376 /* KeyringCompleteView+SaveImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733402F1FA388005D2376 /* KeyringCompleteView+SaveImage.swift */; }; + 4C4733CF2F1FA388005D2376 /* ClearSketchVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C47335D2F1FA388005D2376 /* ClearSketchVM.swift */; }; + 4C4733D02F1FA388005D2376 /* RecordingSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733342F1FA388005D2376 /* RecordingSheet.swift */; }; + 4C4733D12F1FA388005D2376 /* ClearSketchVM+Crop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C47335E2F1FA388005D2376 /* ClearSketchVM+Crop.swift */; }; + 4C4733D22F1FA388005D2376 /* ClearSketchDrawingCanvasView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733642F1FA388005D2376 /* ClearSketchDrawingCanvasView.swift */; }; + 4C4733D32F1FA388005D2376 /* FramePreviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C47337F2F1FA388005D2376 /* FramePreviewView.swift */; }; + 4C4733D42F1FA388005D2376 /* SpeechBubbleVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733852F1FA388005D2376 /* SpeechBubbleVM.swift */; }; + 4C4733D52F1FA388005D2376 /* AcrylicPhotoVM+CropBoxDrag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733532F1FA388005D2376 /* AcrylicPhotoVM+CropBoxDrag.swift */; }; + 4C4733D62F1FA388005D2376 /* SpeechBubbleVM+Customizing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733862F1FA388005D2376 /* SpeechBubbleVM+Customizing.swift */; }; + 4C4733D72F1FA388005D2376 /* AcrylicPhotoVM+Crop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733522F1FA388005D2376 /* AcrylicPhotoVM+Crop.swift */; }; + 4C4733D82F1FA388005D2376 /* AcrylicPhotoPreView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C47335A2F1FA388005D2376 /* AcrylicPhotoPreView.swift */; }; + 4C4733D92F1FA388005D2376 /* TemplatePreviewComponents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733392F1FA388005D2376 /* TemplatePreviewComponents.swift */; }; + 4C4733DB2F1FA388005D2376 /* .gitkeep in Resources */ = {isa = PBXBuildFile; fileRef = 4C47334C2F1FA388005D2376 /* .gitkeep */; }; + 4C4733DC2F1FA388005D2376 /* .gitkeep in Resources */ = {isa = PBXBuildFile; fileRef = 4C4733902F1FA388005D2376 /* .gitkeep */; }; + 4C4733DD2F1FA388005D2376 /* .gitkeep in Resources */ = {isa = PBXBuildFile; fileRef = 4C4733312F1FA388005D2376 /* .gitkeep */; }; 4C65303B2EBA5FA0000F8154 /* CheckmarkAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C65303A2EBA5FA0000F8154 /* CheckmarkAlert.swift */; }; 4C65303E2EBA6042000F8154 /* ImageSaveAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C65303D2EBA6042000F8154 /* ImageSaveAlert.swift */; }; - 4C6530402EBA6F46000F8154 /* KeyringCompleteView+SaveImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C65303F2EBA6F46000F8154 /* KeyringCompleteView+SaveImage.swift */; }; - 4C6530422EBA7D12000F8154 /* KeyringCustomizingView+PurchaseSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6530412EBA7D12000F8154 /* KeyringCustomizingView+PurchaseSheet.swift */; }; 4C6530442EBA8077000F8154 /* PurchaseSuccessAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6530432EBA8077000F8154 /* PurchaseSuccessAlert.swift */; }; 4C6530462EBA80DA000F8154 /* PurchaseFailAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6530452EBA80DA000F8154 /* PurchaseFailAlert.swift */; }; - 4C6530482EBA8886000F8154 /* EffectItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6530472EBA8886000F8154 /* EffectItem.swift */; }; - 4C65304C2EBA88EF000F8154 /* KeyringCustomizingView+Purchase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C65304A2EBA88EF000F8154 /* KeyringCustomizingView+Purchase.swift */; }; - 4C65304E2EBA88FB000F8154 /* KeyringCustomizingView+Cart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C65304D2EBA88FB000F8154 /* KeyringCustomizingView+Cart.swift */; }; 4C6530502EBB2A90000F8154 /* LoadingAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C65304F2EBB2A90000F8154 /* LoadingAlert.swift */; }; 4C65306C2EBC889B000F8154 /* ChangeNameView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C65306B2EBC889B000F8154 /* ChangeNameView.swift */; }; 4C65306E2EBCF157000F8154 /* TermsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C65306D2EBCF157000F8154 /* TermsView.swift */; }; @@ -171,38 +233,19 @@ 4C77753F2EB1343600981C3E /* IntroViewModel+Login.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C77753A2EB1343600981C3E /* IntroViewModel+Login.swift */; }; 4C7775402EB1343600981C3E /* IntroViewModel+Signup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C77753C2EB1343600981C3E /* IntroViewModel+Signup.swift */; }; 4C7775412EB1343600981C3E /* IntroViewModel+NicknameSetup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C77753B2EB1343600981C3E /* IntroViewModel+NicknameSetup.swift */; }; - 4C8426552ED356550050B6FE /* SpeechBubbleVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C8426542ED356550050B6FE /* SpeechBubbleVM.swift */; }; - 4C8426572ED356DA0050B6FE /* SpeechBubbleVM+Firebase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C8426562ED356DA0050B6FE /* SpeechBubbleVM+Firebase.swift */; }; - 4C8426592ED356FD0050B6FE /* SpeechBubbleVM+Effect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C8426582ED356FD0050B6FE /* SpeechBubbleVM+Effect.swift */; }; - 4C84265B2ED3572F0050B6FE /* SpeechBubbleVM+Frame.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C84265A2ED3572F0050B6FE /* SpeechBubbleVM+Frame.swift */; }; - 4C84265D2ED357E10050B6FE /* SpeechBubbleVM+Customizing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C84265C2ED357E10050B6FE /* SpeechBubbleVM+Customizing.swift */; }; 4C8426602ED3585A0050B6FE /* gulimche-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 4C84265F2ED3585A0050B6FE /* gulimche-Regular.ttf */; }; - 4C8426622ED372650050B6FE /* SpeechBubblePreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C8426612ED372650050B6FE /* SpeechBubblePreview.swift */; }; 4C8426642ED375840050B6FE /* ColorPalette.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C8426632ED375840050B6FE /* ColorPalette.swift */; }; - 4C8426672ED377650050B6FE /* SpeechBubbleFramePreviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C8426652ED377650050B6FE /* SpeechBubbleFramePreviewView.swift */; }; - 4C8426682ED377650050B6FE /* SpeechBubbleFrameSelectorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C8426662ED377650050B6FE /* SpeechBubbleFrameSelectorView.swift */; }; 4C84A1602EB134BD008FFE57 /* ProfileSetupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38A596832EAFEAA20003D712 /* ProfileSetupView.swift */; }; 4CA9C6A62EC9D11600CA546B /* CustomNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA9C6A42EC9D11600CA546B /* CustomNavigationBar.swift */; }; 4CA9C6A82EC9DB5300CA546B /* View+SafeAreaBottom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA9C6A72EC9DB5300CA546B /* View+SafeAreaBottom.swift */; }; - 4CA9C6AA2ECA50C000CA546B /* KeyringInfoInputView+FirebaseSave.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA9C6A92ECA50C000CA546B /* KeyringInfoInputView+FirebaseSave.swift */; }; 4CA9C6D62ECB7AEA00CA546B /* BadWords.json in Resources */ = {isa = PBXBuildFile; fileRef = 4CA9C6D52ECB7AEA00CA546B /* BadWords.json */; }; 4CA9C6D92ECB7B2800CA546B /* TextFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA9C6D72ECB7B2800CA546B /* TextFilter.swift */; }; 4CA9C6F72ECBA45200CA546B /* KeychyNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA9C6F62ECBA45200CA546B /* KeychyNotification.swift */; }; 4CA9C6F92ECBA5EF00CA546B /* NotificationItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA9C6F82ECBA5EF00CA546B /* NotificationItemView.swift */; }; 4CA9C6FC2ECBC20100CA546B /* NotificationGiftView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA9C6FB2ECBC20100CA546B /* NotificationGiftView.swift */; }; 4CAF11AB2EBF6058004CB08C /* CollectionKeyringDetailView+SaveImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CAF11AA2EBF6058004CB08C /* CollectionKeyringDetailView+SaveImage.swift */; }; - 4CB82EC92EB1EDB700B7458B /* AcrylicPhotoVM+BGRemover.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB82EC82EB1EDB700B7458B /* AcrylicPhotoVM+BGRemover.swift */; }; - 4CB82ECB2EB1FD8500B7458B /* PreviewGuiding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB82ECA2EB1FD8500B7458B /* PreviewGuiding.swift */; }; 4CBBEF1A2EB2565900252590 /* Nuke in Frameworks */ = {isa = PBXBuildFile; productRef = 4CBBEF192EB2565900252590 /* Nuke */; }; 4CBBEF1C2EB2565900252590 /* NukeUI in Frameworks */ = {isa = PBXBuildFile; productRef = 4CBBEF1B2EB2565900252590 /* NukeUI */; }; - 4CBBEF1E2EB260BE00252590 /* CameraPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CBBEF1D2EB260BE00252590 /* CameraPicker.swift */; }; - 4CBBEF242EB78A5D00252590 /* KeyringInfoInputView+Sheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CBBEF222EB78A5D00252590 /* KeyringInfoInputView+Sheet.swift */; }; - 4CBBEF252EB78A5D00252590 /* KeyringInfoInputView+TagManagement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CBBEF232EB78A5D00252590 /* KeyringInfoInputView+TagManagement.swift */; }; - 4CBBEF262EB78A5D00252590 /* KeyringInfoInputView+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CBBEF212EB78A5D00252590 /* KeyringInfoInputView+Helpers.swift */; }; - 4CBBEF2A2EB7DB9800252590 /* RecordingSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CBBEF282EB7DB9800252590 /* RecordingSheet.swift */; }; - 4CBBEF2B2EB7DB9800252590 /* AudioRecorderManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CBBEF272EB7DB9800252590 /* AudioRecorderManager.swift */; }; - 4CBBEF2D2EB7E92900252590 /* KeyringViewModelProtocol+Reset.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CBBEF2C2EB7E92900252590 /* KeyringViewModelProtocol+Reset.swift */; }; - 4CBBEF332EB919CC00252590 /* CinematicAppearanceModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CBBEF322EB919CC00252590 /* CinematicAppearanceModifier.swift */; }; 4CC3D36E2EC2801F0009D376 /* WelcomeKeyringViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CC3D36D2EC2801F0009D376 /* WelcomeKeyringViewModel.swift */; }; 4CC3D36F2EC2801F0009D376 /* IntroViewModel+WelcomeKeyring.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CC3D36C2EC2801F0009D376 /* IntroViewModel+WelcomeKeyring.swift */; }; 4CC3D37F2EC464D70009D376 /* IntroAppGuidingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CC3D37E2EC464D70009D376 /* IntroAppGuidingView.swift */; }; @@ -224,7 +267,6 @@ 4CC8D0202EF0447100317467 /* MyPageViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CC8D01E2EF0447100317467 /* MyPageViewModel.swift */; }; 4CC8D0222EF110A300317467 /* NotificationGiftViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CC8D0212EF110A300317467 /* NotificationGiftViewModel.swift */; }; 4CC8D0252EF11CD200317467 /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CC8D0242EF11CD200317467 /* HomeViewModel.swift */; }; - 4CDCADC42F14CC8800C01972 /* KeyringCompleteView+VideoGen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CDCADC32F14CC8800C01972 /* KeyringCompleteView+VideoGen.swift */; }; 4CEBB1482EFA93D000CF53E2 /* RootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEBB1462EFA93D000CF53E2 /* RootView.swift */; }; 4CEBB1492EFA93D000CF53E2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEBB1442EFA93D000CF53E2 /* AppDelegate.swift */; }; 4CEBB14D2EFAA52F00CF53E2 /* DeepLinkHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEBB14A2EFAA52F00CF53E2 /* DeepLinkHandler.swift */; }; @@ -271,23 +313,9 @@ 4CEC62312EAE08DA0099ECEE /* KeyringScene+Swipe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEC61FD2EAE08DA0099ECEE /* KeyringScene+Swipe.swift */; }; 4CEC62332EAE08DA0099ECEE /* KeyringBundleItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEC61F52EAE08DA0099ECEE /* KeyringBundleItem.swift */; }; 4CEC62342EAE08DA0099ECEE /* Spacing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEC62142EAE08DA0099ECEE /* Spacing.swift */; }; - 4CEC626A2EAE08DF0099ECEE /* AcrylicPhotoVM+Effect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEC625E2EAE08DF0099ECEE /* AcrylicPhotoVM+Effect.swift */; }; 4CEC626C2EAE08DF0099ECEE /* FestivalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEC62442EAE08DF0099ECEE /* FestivalView.swift */; }; - 4CEC626E2EAE08DF0099ECEE /* AcrylicPhotoCropView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEC62622EAE08DF0099ECEE /* AcrylicPhotoCropView.swift */; }; - 4CEC62702EAE08DF0099ECEE /* KeyringInfoInputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEC62542EAE08DF0099ECEE /* KeyringInfoInputView.swift */; }; - 4CEC62722EAE08DF0099ECEE /* AcrylicPhotoVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEC625A2EAE08DF0099ECEE /* AcrylicPhotoVM.swift */; }; - 4CEC62732EAE08DF0099ECEE /* AcrylicPhotoVM+CropBoxDrag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEC625D2EAE08DF0099ECEE /* AcrylicPhotoVM+CropBoxDrag.swift */; }; - 4CEC62742EAE08DF0099ECEE /* AcrylicPhotoVM+ImageLoad.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEC625F2EAE08DF0099ECEE /* AcrylicPhotoVM+ImageLoad.swift */; }; 4CEC62752EAE08DF0099ECEE /* HomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEC624B2EAE08DF0099ECEE /* HomeView.swift */; }; - 4CEC62762EAE08DF0099ECEE /* AcrylicPhotoEditedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEC62612EAE08DF0099ECEE /* AcrylicPhotoEditedView.swift */; }; - 4CEC62772EAE08DF0099ECEE /* CropModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEC62582EAE08DF0099ECEE /* CropModels.swift */; }; - 4CEC62782EAE08DF0099ECEE /* KeyringCompleteView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEC62532EAE08DF0099ECEE /* KeyringCompleteView.swift */; }; - 4CEC627B2EAE08DF0099ECEE /* AcrylicPhotoPreView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEC62632EAE08DF0099ECEE /* AcrylicPhotoPreView.swift */; }; - 4CEC627C2EAE08DF0099ECEE /* WorkshopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEC62502EAE08DF0099ECEE /* WorkshopView.swift */; }; - 4CEC627D2EAE08DF0099ECEE /* KeyringViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEC62512EAE08DF0099ECEE /* KeyringViewModelProtocol.swift */; }; 4CEC627F2EAE08DF0099ECEE /* CollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEC623E2EAE08DF0099ECEE /* CollectionView.swift */; }; - 4CEC62812EAE08DF0099ECEE /* KeyringCustomizingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEC62552EAE08DF0099ECEE /* KeyringCustomizingView.swift */; }; - 4CEC62842EAE08DF0099ECEE /* AcrylicPhotoVM+Crop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEC625C2EAE08DF0099ECEE /* AcrylicPhotoVM+Crop.swift */; }; 4CEC62962EAE08F70099ECEE /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4CEC62872EAE08F70099ECEE /* Assets.xcassets */; }; 4CEC629F2EAE09990099ECEE /* BundleDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEC629A2EAE09990099ECEE /* BundleDetailView.swift */; }; 4CEC62A02EAE09990099ECEE /* BundleInventoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEC629B2EAE09990099ECEE /* BundleInventoryView.swift */; }; @@ -339,37 +367,17 @@ AAEB46AF2EC1D648002B13E5 /* BundleNameEditView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAEB46AE2EC1D648002B13E5 /* BundleNameEditView.swift */; }; C645AE9F2EB1055C004BFE69 /* CategoryTabBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = C645AE9E2EB1055C004BFE69 /* CategoryTabBar.swift */; }; C645AEA32EB1B8FC004BFE69 /* DataInitializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C645AEA22EB1B8FC004BFE69 /* DataInitializer.swift */; }; - C64EE7952ECD733300E8450F /* PolaroidVM+Frame.swift in Sources */ = {isa = PBXBuildFile; fileRef = C64EE7942ECD733300E8450F /* PolaroidVM+Frame.swift */; }; C665DDE82EAEFA8700CE4495 /* CoinChargeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C665DDE72EAEFA8700CE4495 /* CoinChargeView.swift */; }; C665DDEC2EAF064500CE4495 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C665DDEB2EAF064500CE4495 /* StoreKit.framework */; }; C665DDF02EAF08D000CE4495 /* PurchaseManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C665DDEF2EAF08D000CE4495 /* PurchaseManager.swift */; }; - C67B753B2ECC9E6C00D6E3FA /* EffectSelectorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C67B753A2ECC9E6C00D6E3FA /* EffectSelectorView.swift */; }; - C67B753E2ECCA32A00D6E3FA /* DrawingToolsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C67B753D2ECCA32A00D6E3FA /* DrawingToolsView.swift */; }; - C67B753F2ECCA32A00D6E3FA /* DrawingCanvasView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C67B753C2ECCA32A00D6E3FA /* DrawingCanvasView.swift */; }; - C67B754F2ECD373200D6E3FA /* NeonSignVM+Drawing.swift in Sources */ = {isa = PBXBuildFile; fileRef = C67B754E2ECD373200D6E3FA /* NeonSignVM+Drawing.swift */; }; - C67B75582ECD4C6F00D6E3FA /* PolaroidVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = C67B75502ECD4C6F00D6E3FA /* PolaroidVM.swift */; }; - C67B75592ECD4C6F00D6E3FA /* PolaroidVM+Effect.swift in Sources */ = {isa = PBXBuildFile; fileRef = C67B75512ECD4C6F00D6E3FA /* PolaroidVM+Effect.swift */; }; - C67B755A2ECD4C6F00D6E3FA /* FrameSelectorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C67B75542ECD4C6F00D6E3FA /* FrameSelectorView.swift */; }; - C67B755B2ECD4C6F00D6E3FA /* FramePreviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C67B75532ECD4C6F00D6E3FA /* FramePreviewView.swift */; }; - C67B755C2ECD4C6F00D6E3FA /* PolaroidPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = C67B75552ECD4C6F00D6E3FA /* PolaroidPreview.swift */; }; C67B755F2ECD526A00D6E3FA /* Frame.swift in Sources */ = {isa = PBXBuildFile; fileRef = C67B755D2ECD526A00D6E3FA /* Frame.swift */; }; C6830F042EB8A4000059379A /* WorkshopDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6830F032EB8A4000059379A /* WorkshopDataManager.swift */; }; - C6830F082EB8E96D0059379A /* MyItemsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6830F072EB8E96D0059379A /* MyItemsView.swift */; }; - C6830F0A2EB9AAE00059379A /* WorkshopGridHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6830F092EB9AAE00059379A /* WorkshopGridHelpers.swift */; }; C6830F172EBB08380059379A /* MultiKeyringScene.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6830F152EBB08380059379A /* MultiKeyringScene.swift */; }; C6830F182EBB08380059379A /* MultiKeyringSceneView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6830F162EBB08380059379A /* MultiKeyringSceneView.swift */; }; - C6831A342ECEBD4700753DAE /* PhotoSelectSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6831A332ECEBD4700753DAE /* PhotoSelectSheet.swift */; }; C68931CE2EB7B94B00C5F083 /* EffectManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C68931CC2EB7B94B00C5F083 /* EffectManager.swift */; }; - C68931D02EB835E800C5F083 /* WorkshopPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = C68931CF2EB835E800C5F083 /* WorkshopPreview.swift */; }; - C68931D62EB8527C00C5F083 /* WorkshopMainContentSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = C68931D22EB8527C00C5F083 /* WorkshopMainContentSection.swift */; }; - C68931D72EB8527C00C5F083 /* WorkshopStickyHeaderSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = C68931D42EB8527C00C5F083 /* WorkshopStickyHeaderSection.swift */; }; - C68931D92EB8527C00C5F083 /* WorkshopTopBannerSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = C68931D52EB8527C00C5F083 /* WorkshopTopBannerSection.swift */; }; C6B56F0B2EBC43AC0049F969 /* StoreProduct.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6B56F0A2EBC43AC0049F969 /* StoreProduct.swift */; }; C6B56F112EBD96110049F969 /* CoinChargeView+Purchase.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6B56F102EBD96110049F969 /* CoinChargeView+Purchase.swift */; }; C6B56F132EBD962E0049F969 /* CurrentItemsCard.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6B56F122EBD962E0049F969 /* CurrentItemsCard.swift */; }; - C6B56F182EBF28170049F969 /* NeonSignVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6B56F162EBF28170049F969 /* NeonSignVM.swift */; }; - C6B56F1A2EBF284F0049F969 /* TemplatePreviewComponents.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6B56F192EBF284F0049F969 /* TemplatePreviewComponents.swift */; }; - C6B56F1C2EBF2A960049F969 /* NeonSignVM+Effect.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6B56F1B2EBF2A960049F969 /* NeonSignVM+Effect.swift */; }; C6B56F202EBF72130049F969 /* ItemPurchaseManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6B56F1F2EBF72130049F969 /* ItemPurchaseManager.swift */; }; C6B56F232EC0341B0049F969 /* KeyringImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6B56F212EC0341B0049F969 /* KeyringImageCache.swift */; }; C6B56F2B2EC039D30049F969 /* KeyringCellScene+Capture.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6B56F2A2EC039D30049F969 /* KeyringCellScene+Capture.swift */; }; @@ -390,18 +398,13 @@ C6C35F3E2ED2AB71009642F4 /* ZoomableScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6C35F3D2ED2AB71009642F4 /* ZoomableScrollView.swift */; }; C6C35F412ED2B6E6009642F4 /* ShowcaseFestivalKeyring.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6C35F3F2ED2B6E6009642F4 /* ShowcaseFestivalKeyring.swift */; }; C6C35F432ED2B70E009642F4 /* Showcase25BoardViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6C35F422ED2B70E009642F4 /* Showcase25BoardViewModel.swift */; }; - C6C360252ED3C40F009642F4 /* WorkshopMakingKeyringSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6C360242ED3C40F009642F4 /* WorkshopMakingKeyringSection.swift */; }; - C6C360272ED3D037009642F4 /* WorkshopTemplatesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6C360262ED3D037009642F4 /* WorkshopTemplatesView.swift */; }; C6C361422ED44EE4009642F4 /* Showcase25BoardView+Sheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6C361412ED44EE4009642F4 /* Showcase25BoardView+Sheet.swift */; }; C6C361442ED44EF1009642F4 /* Showcase25BoardView+Detail.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6C361432ED44EF1009642F4 /* Showcase25BoardView+Detail.swift */; }; C6C361E22ED4AC49009642F4 /* SubmitCompleteAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6C361E12ED4AC49009642F4 /* SubmitCompleteAlert.swift */; }; C6C361E42ED4AF48009642F4 /* Showcase25BoardView+Grid.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6C361E32ED4AF48009642F4 /* Showcase25BoardView+Grid.swift */; }; C6C361E62ED4B289009642F4 /* ShowcaseConfirmPopup.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6C361E52ED4B289009642F4 /* ShowcaseConfirmPopup.swift */; }; - C6C402862EB26C66006B58DF /* NeonSignPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6C402852EB26C66006B58DF /* NeonSignPreview.swift */; }; C6C4028D2EB2741D006B58DF /* Sound.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6C4028C2EB2741D006B58DF /* Sound.swift */; }; C6C4028F2EB27458006B58DF /* Particle.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6C4028E2EB27458006B58DF /* Particle.swift */; }; - C6C4029F2EB30163006B58DF /* WorkshopViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6C4029E2EB30163006B58DF /* WorkshopViewModel.swift */; }; - C6C402A12EB3F3A9006B58DF /* WorkshopComponents.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6C402A02EB3F3A9006B58DF /* WorkshopComponents.swift */; }; C6C402A32EB40ACA006B58DF /* AlarmView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6C402A22EB40ACA006B58DF /* AlarmView.swift */; }; C6EE7AD72EB445F6002B5669 /* MyPageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6EE7AD62EB445F6002B5669 /* MyPageView.swift */; }; /* End PBXBuildFile section */ @@ -451,9 +454,6 @@ 3822DDC12EBBC712003125BE /* KeyringEditView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyringEditView.swift; sourceTree = ""; }; 3822DDC32EBBE108003125BE /* CopyPopup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CopyPopup.swift; sourceTree = ""; }; 3822DDC52EBBE252003125BE /* LackPopup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LackPopup.swift; sourceTree = ""; }; - 3824B5E42ED352CC00A4BBCB /* ClearSketchCropView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClearSketchCropView.swift; sourceTree = ""; }; - 3824B6022ED37EC900A4BBCB /* ClearSketchVM+ImageConversion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ClearSketchVM+ImageConversion.swift"; sourceTree = ""; }; - 3824B6042ED3A18100A4BBCB /* ClearSketchVM+Crop.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ClearSketchVM+Crop.swift"; sourceTree = ""; }; 382800CD2EBFBE03005F1332 /* Keychy.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Keychy.entitlements; sourceTree = ""; }; 382800D02EC05D4E005F1332 /* PostOffice.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostOffice.swift; sourceTree = ""; }; 382800D22EC0628D005F1332 /* CollectionViewModel+Package.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CollectionViewModel+Package.swift"; sourceTree = ""; }; @@ -481,12 +481,10 @@ 386B17532ECCE8EC00CCCC23 /* CollectionViewModel+Distribution.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CollectionViewModel+Distribution.swift"; sourceTree = ""; }; 386B17632ECD142600CCCC23 /* String+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Extension.swift"; sourceTree = ""; }; 388E72932EF341F200AE1F1B /* CollectionViewModel+UserData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CollectionViewModel+UserData.swift"; sourceTree = ""; }; - 389080062ED3B43900D7A49F /* ClearSketchGuiding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClearSketchGuiding.swift; sourceTree = ""; }; 389080162ED3F05D00D7A49F /* FestivalKeyringDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FestivalKeyringDetailView.swift; sourceTree = ""; }; 389080182ED3F32700D7A49F /* FestivalKeyringDetailView+Sheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FestivalKeyringDetailView+Sheet.swift"; sourceTree = ""; }; 3890801A2ED3F3BB00D7A49F /* FestivalKeyringDetailView+Alerts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FestivalKeyringDetailView+Alerts.swift"; sourceTree = ""; }; 389080622ED47F2500D7A49F /* VotePopup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VotePopup.swift; sourceTree = ""; }; - 389497162ED32405008340FA /* ClearSketchDrawingCanvasView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClearSketchDrawingCanvasView.swift; sourceTree = ""; }; 38A22A7E2EC2238800B4C7C5 /* CollectionKeyringPackageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CollectionKeyringPackageView.swift; sourceTree = ""; }; 38A22A9C2EC27AC400B4C7C5 /* PackagedKeyringView+SaveImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PackagedKeyringView+SaveImage.swift"; sourceTree = ""; }; 38A22A9E2EC28B3D00B4C7C5 /* PackageCompleteView+SaveImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PackageCompleteView+SaveImage.swift"; sourceTree = ""; }; @@ -512,11 +510,6 @@ 38C3C2912EC1F787003C5DE1 /* CollectionKeyringDetailView+Lifecycle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CollectionKeyringDetailView+Lifecycle.swift"; sourceTree = ""; }; 38C3C2932EC1F81C003C5DE1 /* CollectionKeyringDetailView+Helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CollectionKeyringDetailView+Helpers.swift"; sourceTree = ""; }; 38C3C2952EC20B1E003C5DE1 /* PackagedKeyringView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PackagedKeyringView.swift; sourceTree = ""; }; - 38CE39B12ECD995D00168E4B /* ClearSketchPreview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClearSketchPreview.swift; sourceTree = ""; }; - 38CE39B32ECD998B00168E4B /* ClearSketchVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClearSketchVM.swift; sourceTree = ""; }; - 38CE39D12ECE5F9300168E4B /* ClearSketchVM+Effect.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ClearSketchVM+Effect.swift"; sourceTree = ""; }; - 38CE39D32ECE62D100168E4B /* ClearSketchDrawingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClearSketchDrawingView.swift; sourceTree = ""; }; - 38CE39E32ECE684300168E4B /* ClearSketchVM+Drawing.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ClearSketchVM+Drawing.swift"; sourceTree = ""; }; 38D17A502EBBF88C00F52A88 /* CollectionViewModel+Edit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CollectionViewModel+Edit.swift"; sourceTree = ""; }; 38DD90612ED594C00042EB45 /* FestivalKeyringContextMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FestivalKeyringContextMenu.swift; sourceTree = ""; }; 38DD909B2EF1679D0042EB45 /* Color+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Color+Extension.swift"; sourceTree = ""; }; @@ -539,14 +532,8 @@ 4C004FB02F187CFC00D9063E /* CollectionKeyringDetailView+VideoGen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CollectionKeyringDetailView+VideoGen.swift"; sourceTree = ""; }; 4C004FB22F187ED000D9063E /* KeyringVideoGenerator+Keyring.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KeyringVideoGenerator+Keyring.swift"; sourceTree = ""; }; 4C004FB42F18D98C00D9063E /* ReviewManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReviewManager.swift; sourceTree = ""; }; - 4C004FB82F19C27700D9063E /* KeyringCompleteView+ReviewCheck.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KeyringCompleteView+ReviewCheck.swift"; sourceTree = ""; }; 4C004FBA2F19F1FE00D9063E /* RootViewModel+ReviewCheck.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "RootViewModel+ReviewCheck.swift"; sourceTree = ""; }; 4C07024A2ECF10760026D6DC /* EffectSyncManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EffectSyncManager.swift; sourceTree = ""; }; - 4C0702772ED1DFA20026D6DC /* PixelVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PixelVM.swift; sourceTree = ""; }; - 4C0702782ED1DFA20026D6DC /* PixelVM+Effect.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PixelVM+Effect.swift"; sourceTree = ""; }; - 4C0702792ED1DFA20026D6DC /* PixelVM+ImageConversion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PixelVM+ImageConversion.swift"; sourceTree = ""; }; - 4C07027B2ED1DFA20026D6DC /* PixelDrawView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PixelDrawView.swift; sourceTree = ""; }; - 4C07027C2ED1DFA20026D6DC /* PixelPreviewView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PixelPreviewView.swift; sourceTree = ""; }; 4C3687F62EBFA87800C64E75 /* Pretendard-Medium.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Medium.ttf"; sourceTree = ""; }; 4C3687F82EBFC0FB00C64E75 /* NotificationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationManager.swift; sourceTree = ""; }; 4C3687FB2EC05E6800C64E75 /* AccountAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountAlert.swift; sourceTree = ""; }; @@ -561,15 +548,94 @@ 4C3688062EC07C4E00C64E75 /* NotoSansKR-Thin.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "NotoSansKR-Thin.ttf"; sourceTree = ""; }; 4C3688112EC08A3100C64E75 /* HancomMalangMalang-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HancomMalangMalang-Bold.otf"; sourceTree = ""; }; 4C3688122EC08A3100C64E75 /* HancomMalangMalang-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HancomMalangMalang-Regular.otf"; sourceTree = ""; }; + 4C4733142F1FA2AB005D2376 /* WorkshopComponents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkshopComponents.swift; sourceTree = ""; }; + 4C4733162F1FA2AB005D2376 /* WorkshopViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkshopViewModel.swift; sourceTree = ""; }; + 4C4733182F1FA2AB005D2376 /* WorkshopGridHelpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkshopGridHelpers.swift; sourceTree = ""; }; + 4C4733192F1FA2AB005D2376 /* WorkshopMainContentSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkshopMainContentSection.swift; sourceTree = ""; }; + 4C47331A2F1FA2AB005D2376 /* WorkshopMakingKeyringSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkshopMakingKeyringSection.swift; sourceTree = ""; }; + 4C47331B2F1FA2AB005D2376 /* WorkshopStickyHeaderSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkshopStickyHeaderSection.swift; sourceTree = ""; }; + 4C47331C2F1FA2AB005D2376 /* WorkshopTemplatesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkshopTemplatesView.swift; sourceTree = ""; }; + 4C47331D2F1FA2AB005D2376 /* WorkshopTopBannerSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkshopTopBannerSection.swift; sourceTree = ""; }; + 4C47331E2F1FA2AB005D2376 /* WorkshopView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkshopView.swift; sourceTree = ""; }; + 4C4733202F1FA2AB005D2376 /* MyItemsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyItemsView.swift; sourceTree = ""; }; + 4C4733212F1FA2AB005D2376 /* WorkshopPreview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkshopPreview.swift; sourceTree = ""; }; + 4C47332E2F1FA388005D2376 /* KeyringViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyringViewModelProtocol.swift; sourceTree = ""; }; + 4C47332F2F1FA388005D2376 /* KeyringViewModelProtocol+Reset.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KeyringViewModelProtocol+Reset.swift"; sourceTree = ""; }; + 4C4733312F1FA388005D2376 /* .gitkeep */ = {isa = PBXFileReference; lastKnownFileType = text; path = .gitkeep; sourceTree = ""; }; + 4C4733332F1FA388005D2376 /* AudioRecorderManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioRecorderManager.swift; sourceTree = ""; }; + 4C4733342F1FA388005D2376 /* RecordingSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordingSheet.swift; sourceTree = ""; }; + 4C4733362F1FA388005D2376 /* CameraPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CameraPicker.swift; sourceTree = ""; }; + 4C4733372F1FA388005D2376 /* CinematicAppearanceModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CinematicAppearanceModifier.swift; sourceTree = ""; }; + 4C4733382F1FA388005D2376 /* PreviewGuiding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviewGuiding.swift; sourceTree = ""; }; + 4C4733392F1FA388005D2376 /* TemplatePreviewComponents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TemplatePreviewComponents.swift; sourceTree = ""; }; + 4C47333B2F1FA388005D2376 /* EffectItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EffectItem.swift; sourceTree = ""; }; + 4C47333D2F1FA388005D2376 /* EffectSelectorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EffectSelectorView.swift; sourceTree = ""; }; + 4C47333E2F1FA388005D2376 /* KeyringCompleteView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyringCompleteView.swift; sourceTree = ""; }; + 4C47333F2F1FA388005D2376 /* KeyringCompleteView+ReviewCheck.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KeyringCompleteView+ReviewCheck.swift"; sourceTree = ""; }; + 4C4733402F1FA388005D2376 /* KeyringCompleteView+SaveImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KeyringCompleteView+SaveImage.swift"; sourceTree = ""; }; + 4C4733412F1FA388005D2376 /* KeyringCompleteView+VideoGen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KeyringCompleteView+VideoGen.swift"; sourceTree = ""; }; + 4C4733422F1FA388005D2376 /* KeyringCustomizingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyringCustomizingView.swift; sourceTree = ""; }; + 4C4733432F1FA388005D2376 /* KeyringCustomizingView+Cart.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KeyringCustomizingView+Cart.swift"; sourceTree = ""; }; + 4C4733442F1FA388005D2376 /* KeyringCustomizingView+Purchase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KeyringCustomizingView+Purchase.swift"; sourceTree = ""; }; + 4C4733452F1FA388005D2376 /* KeyringCustomizingView+PurchaseSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KeyringCustomizingView+PurchaseSheet.swift"; sourceTree = ""; }; + 4C4733462F1FA388005D2376 /* KeyringInfoInputView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyringInfoInputView.swift; sourceTree = ""; }; + 4C4733472F1FA388005D2376 /* KeyringInfoInputView+FirebaseSave.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KeyringInfoInputView+FirebaseSave.swift"; sourceTree = ""; }; + 4C4733482F1FA388005D2376 /* KeyringInfoInputView+Helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KeyringInfoInputView+Helpers.swift"; sourceTree = ""; }; + 4C4733492F1FA388005D2376 /* KeyringInfoInputView+Sheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KeyringInfoInputView+Sheet.swift"; sourceTree = ""; }; + 4C47334A2F1FA388005D2376 /* KeyringInfoInputView+TagManagement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KeyringInfoInputView+TagManagement.swift"; sourceTree = ""; }; + 4C47334C2F1FA388005D2376 /* .gitkeep */ = {isa = PBXFileReference; lastKnownFileType = text; path = .gitkeep; sourceTree = ""; }; + 4C47334E2F1FA388005D2376 /* CropModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CropModels.swift; sourceTree = ""; }; + 4C4733502F1FA388005D2376 /* AcrylicPhotoVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AcrylicPhotoVM.swift; sourceTree = ""; }; + 4C4733512F1FA388005D2376 /* AcrylicPhotoVM+BGRemover.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AcrylicPhotoVM+BGRemover.swift"; sourceTree = ""; }; + 4C4733522F1FA388005D2376 /* AcrylicPhotoVM+Crop.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AcrylicPhotoVM+Crop.swift"; sourceTree = ""; }; + 4C4733532F1FA388005D2376 /* AcrylicPhotoVM+CropBoxDrag.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AcrylicPhotoVM+CropBoxDrag.swift"; sourceTree = ""; }; + 4C4733542F1FA388005D2376 /* AcrylicPhotoVM+Effect.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AcrylicPhotoVM+Effect.swift"; sourceTree = ""; }; + 4C4733552F1FA388005D2376 /* AcrylicPhotoVM+ImageLoad.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AcrylicPhotoVM+ImageLoad.swift"; sourceTree = ""; }; + 4C4733572F1FA388005D2376 /* AcrylicPhotoCropView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AcrylicPhotoCropView.swift; sourceTree = ""; }; + 4C4733582F1FA388005D2376 /* AcrylicPhotoEditedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AcrylicPhotoEditedView.swift; sourceTree = ""; }; + 4C4733592F1FA388005D2376 /* AcrylicPhotoGuiding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AcrylicPhotoGuiding.swift; sourceTree = ""; }; + 4C47335A2F1FA388005D2376 /* AcrylicPhotoPreView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AcrylicPhotoPreView.swift; sourceTree = ""; }; + 4C47335D2F1FA388005D2376 /* ClearSketchVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClearSketchVM.swift; sourceTree = ""; }; + 4C47335E2F1FA388005D2376 /* ClearSketchVM+Crop.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ClearSketchVM+Crop.swift"; sourceTree = ""; }; + 4C47335F2F1FA388005D2376 /* ClearSketchVM+Drawing.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ClearSketchVM+Drawing.swift"; sourceTree = ""; }; + 4C4733602F1FA388005D2376 /* ClearSketchVM+Effect.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ClearSketchVM+Effect.swift"; sourceTree = ""; }; + 4C4733612F1FA388005D2376 /* ClearSketchVM+ImageConversion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ClearSketchVM+ImageConversion.swift"; sourceTree = ""; }; + 4C4733632F1FA388005D2376 /* ClearSketchCropView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClearSketchCropView.swift; sourceTree = ""; }; + 4C4733642F1FA388005D2376 /* ClearSketchDrawingCanvasView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClearSketchDrawingCanvasView.swift; sourceTree = ""; }; + 4C4733652F1FA388005D2376 /* ClearSketchDrawingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClearSketchDrawingView.swift; sourceTree = ""; }; + 4C4733662F1FA388005D2376 /* ClearSketchGuiding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClearSketchGuiding.swift; sourceTree = ""; }; + 4C4733672F1FA388005D2376 /* ClearSketchPreview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClearSketchPreview.swift; sourceTree = ""; }; + 4C47336A2F1FA388005D2376 /* NeonSignVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NeonSignVM.swift; sourceTree = ""; }; + 4C47336B2F1FA388005D2376 /* NeonSignVM+Drawing.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NeonSignVM+Drawing.swift"; sourceTree = ""; }; + 4C47336C2F1FA388005D2376 /* NeonSignVM+Effect.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NeonSignVM+Effect.swift"; sourceTree = ""; }; + 4C47336E2F1FA388005D2376 /* DrawingCanvasView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DrawingCanvasView.swift; sourceTree = ""; }; + 4C47336F2F1FA388005D2376 /* DrawingToolsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DrawingToolsView.swift; sourceTree = ""; }; + 4C4733702F1FA388005D2376 /* NeonSignPreview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NeonSignPreview.swift; sourceTree = ""; }; + 4C4733732F1FA388005D2376 /* PixelVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PixelVM.swift; sourceTree = ""; }; + 4C4733742F1FA388005D2376 /* PixelVM+Effect.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PixelVM+Effect.swift"; sourceTree = ""; }; + 4C4733752F1FA388005D2376 /* PixelVM+ImageConversion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PixelVM+ImageConversion.swift"; sourceTree = ""; }; + 4C4733772F1FA388005D2376 /* PixelDrawView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PixelDrawView.swift; sourceTree = ""; }; + 4C4733782F1FA388005D2376 /* PixelPreviewView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PixelPreviewView.swift; sourceTree = ""; }; + 4C47337B2F1FA388005D2376 /* PolaroidVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PolaroidVM.swift; sourceTree = ""; }; + 4C47337C2F1FA388005D2376 /* PolaroidVM+Effect.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PolaroidVM+Effect.swift"; sourceTree = ""; }; + 4C47337D2F1FA388005D2376 /* PolaroidVM+Frame.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PolaroidVM+Frame.swift"; sourceTree = ""; }; + 4C47337F2F1FA388005D2376 /* FramePreviewView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FramePreviewView.swift; sourceTree = ""; }; + 4C4733802F1FA388005D2376 /* FrameSelectorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FrameSelectorView.swift; sourceTree = ""; }; + 4C4733812F1FA388005D2376 /* PhotoSelectSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoSelectSheet.swift; sourceTree = ""; }; + 4C4733822F1FA388005D2376 /* PolaroidPreview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PolaroidPreview.swift; sourceTree = ""; }; + 4C4733852F1FA388005D2376 /* SpeechBubbleVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpeechBubbleVM.swift; sourceTree = ""; }; + 4C4733862F1FA388005D2376 /* SpeechBubbleVM+Customizing.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SpeechBubbleVM+Customizing.swift"; sourceTree = ""; }; + 4C4733872F1FA388005D2376 /* SpeechBubbleVM+Effect.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SpeechBubbleVM+Effect.swift"; sourceTree = ""; }; + 4C4733882F1FA388005D2376 /* SpeechBubbleVM+Firebase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SpeechBubbleVM+Firebase.swift"; sourceTree = ""; }; + 4C4733892F1FA388005D2376 /* SpeechBubbleVM+Frame.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SpeechBubbleVM+Frame.swift"; sourceTree = ""; }; + 4C47338B2F1FA388005D2376 /* SpeechBubbleFramePreviewView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpeechBubbleFramePreviewView.swift; sourceTree = ""; }; + 4C47338C2F1FA388005D2376 /* SpeechBubbleFrameSelectorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpeechBubbleFrameSelectorView.swift; sourceTree = ""; }; + 4C47338D2F1FA388005D2376 /* SpeechBubblePreview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpeechBubblePreview.swift; sourceTree = ""; }; + 4C4733902F1FA388005D2376 /* .gitkeep */ = {isa = PBXFileReference; lastKnownFileType = text; path = .gitkeep; sourceTree = ""; }; 4C65303A2EBA5FA0000F8154 /* CheckmarkAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckmarkAlert.swift; sourceTree = ""; }; 4C65303D2EBA6042000F8154 /* ImageSaveAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageSaveAlert.swift; sourceTree = ""; }; - 4C65303F2EBA6F46000F8154 /* KeyringCompleteView+SaveImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KeyringCompleteView+SaveImage.swift"; sourceTree = ""; }; - 4C6530412EBA7D12000F8154 /* KeyringCustomizingView+PurchaseSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KeyringCustomizingView+PurchaseSheet.swift"; sourceTree = ""; }; 4C6530432EBA8077000F8154 /* PurchaseSuccessAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PurchaseSuccessAlert.swift; sourceTree = ""; }; 4C6530452EBA80DA000F8154 /* PurchaseFailAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PurchaseFailAlert.swift; sourceTree = ""; }; - 4C6530472EBA8886000F8154 /* EffectItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EffectItem.swift; sourceTree = ""; }; - 4C65304A2EBA88EF000F8154 /* KeyringCustomizingView+Purchase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KeyringCustomizingView+Purchase.swift"; sourceTree = ""; }; - 4C65304D2EBA88FB000F8154 /* KeyringCustomizingView+Cart.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KeyringCustomizingView+Cart.swift"; sourceTree = ""; }; 4C65304F2EBB2A90000F8154 /* LoadingAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingAlert.swift; sourceTree = ""; }; 4C65306B2EBC889B000F8154 /* ChangeNameView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangeNameView.swift; sourceTree = ""; }; 4C65306D2EBCF157000F8154 /* TermsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TermsView.swift; sourceTree = ""; }; @@ -599,36 +665,16 @@ 4C77753A2EB1343600981C3E /* IntroViewModel+Login.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "IntroViewModel+Login.swift"; sourceTree = ""; }; 4C77753B2EB1343600981C3E /* IntroViewModel+NicknameSetup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "IntroViewModel+NicknameSetup.swift"; sourceTree = ""; }; 4C77753C2EB1343600981C3E /* IntroViewModel+Signup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "IntroViewModel+Signup.swift"; sourceTree = ""; }; - 4C8426542ED356550050B6FE /* SpeechBubbleVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpeechBubbleVM.swift; sourceTree = ""; }; - 4C8426562ED356DA0050B6FE /* SpeechBubbleVM+Firebase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SpeechBubbleVM+Firebase.swift"; sourceTree = ""; }; - 4C8426582ED356FD0050B6FE /* SpeechBubbleVM+Effect.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SpeechBubbleVM+Effect.swift"; sourceTree = ""; }; - 4C84265A2ED3572F0050B6FE /* SpeechBubbleVM+Frame.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SpeechBubbleVM+Frame.swift"; sourceTree = ""; }; - 4C84265C2ED357E10050B6FE /* SpeechBubbleVM+Customizing.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SpeechBubbleVM+Customizing.swift"; sourceTree = ""; }; 4C84265F2ED3585A0050B6FE /* gulimche-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "gulimche-Regular.ttf"; sourceTree = ""; }; - 4C8426612ED372650050B6FE /* SpeechBubblePreview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpeechBubblePreview.swift; sourceTree = ""; }; 4C8426632ED375840050B6FE /* ColorPalette.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPalette.swift; sourceTree = ""; }; - 4C8426652ED377650050B6FE /* SpeechBubbleFramePreviewView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpeechBubbleFramePreviewView.swift; sourceTree = ""; }; - 4C8426662ED377650050B6FE /* SpeechBubbleFrameSelectorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpeechBubbleFrameSelectorView.swift; sourceTree = ""; }; 4CA9C6A42EC9D11600CA546B /* CustomNavigationBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomNavigationBar.swift; sourceTree = ""; }; 4CA9C6A72EC9DB5300CA546B /* View+SafeAreaBottom.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+SafeAreaBottom.swift"; sourceTree = ""; }; - 4CA9C6A92ECA50C000CA546B /* KeyringInfoInputView+FirebaseSave.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KeyringInfoInputView+FirebaseSave.swift"; sourceTree = ""; }; 4CA9C6D52ECB7AEA00CA546B /* BadWords.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = BadWords.json; sourceTree = ""; }; 4CA9C6D72ECB7B2800CA546B /* TextFilter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextFilter.swift; sourceTree = ""; }; 4CA9C6F62ECBA45200CA546B /* KeychyNotification.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychyNotification.swift; sourceTree = ""; }; 4CA9C6F82ECBA5EF00CA546B /* NotificationItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationItemView.swift; sourceTree = ""; }; 4CA9C6FB2ECBC20100CA546B /* NotificationGiftView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationGiftView.swift; sourceTree = ""; }; 4CAF11AA2EBF6058004CB08C /* CollectionKeyringDetailView+SaveImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CollectionKeyringDetailView+SaveImage.swift"; sourceTree = ""; }; - 4CB82EC82EB1EDB700B7458B /* AcrylicPhotoVM+BGRemover.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AcrylicPhotoVM+BGRemover.swift"; sourceTree = ""; }; - 4CB82ECA2EB1FD8500B7458B /* PreviewGuiding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviewGuiding.swift; sourceTree = ""; }; - 4CBBEF162EB24DEC00252590 /* AcrylicPhotoGuiding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AcrylicPhotoGuiding.swift; sourceTree = ""; }; - 4CBBEF1D2EB260BE00252590 /* CameraPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CameraPicker.swift; sourceTree = ""; }; - 4CBBEF212EB78A5D00252590 /* KeyringInfoInputView+Helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KeyringInfoInputView+Helpers.swift"; sourceTree = ""; }; - 4CBBEF222EB78A5D00252590 /* KeyringInfoInputView+Sheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KeyringInfoInputView+Sheet.swift"; sourceTree = ""; }; - 4CBBEF232EB78A5D00252590 /* KeyringInfoInputView+TagManagement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KeyringInfoInputView+TagManagement.swift"; sourceTree = ""; }; - 4CBBEF272EB7DB9800252590 /* AudioRecorderManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioRecorderManager.swift; sourceTree = ""; }; - 4CBBEF282EB7DB9800252590 /* RecordingSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordingSheet.swift; sourceTree = ""; }; - 4CBBEF2C2EB7E92900252590 /* KeyringViewModelProtocol+Reset.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KeyringViewModelProtocol+Reset.swift"; sourceTree = ""; }; - 4CBBEF322EB919CC00252590 /* CinematicAppearanceModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CinematicAppearanceModifier.swift; sourceTree = ""; }; 4CC3D36C2EC2801F0009D376 /* IntroViewModel+WelcomeKeyring.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "IntroViewModel+WelcomeKeyring.swift"; sourceTree = ""; }; 4CC3D36D2EC2801F0009D376 /* WelcomeKeyringViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeKeyringViewModel.swift; sourceTree = ""; }; 4CC3D37E2EC464D70009D376 /* IntroAppGuidingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntroAppGuidingView.swift; sourceTree = ""; }; @@ -653,7 +699,6 @@ 4CC8D01E2EF0447100317467 /* MyPageViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPageViewModel.swift; sourceTree = ""; }; 4CC8D0212EF110A300317467 /* NotificationGiftViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationGiftViewModel.swift; sourceTree = ""; }; 4CC8D0242EF11CD200317467 /* HomeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewModel.swift; sourceTree = ""; }; - 4CDCADC32F14CC8800C01972 /* KeyringCompleteView+VideoGen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KeyringCompleteView+VideoGen.swift"; sourceTree = ""; }; 4CEBB1442EFA93D000CF53E2 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 4CEBB1462EFA93D000CF53E2 /* RootView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RootView.swift; sourceTree = ""; }; 4CEBB14A2EFAA52F00CF53E2 /* DeepLinkHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeepLinkHandler.swift; sourceTree = ""; }; @@ -704,20 +749,6 @@ 4CEC623E2EAE08DF0099ECEE /* CollectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CollectionView.swift; sourceTree = ""; }; 4CEC62442EAE08DF0099ECEE /* FestivalView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FestivalView.swift; sourceTree = ""; }; 4CEC624B2EAE08DF0099ECEE /* HomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeView.swift; sourceTree = ""; }; - 4CEC62502EAE08DF0099ECEE /* WorkshopView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkshopView.swift; sourceTree = ""; }; - 4CEC62512EAE08DF0099ECEE /* KeyringViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyringViewModelProtocol.swift; sourceTree = ""; }; - 4CEC62532EAE08DF0099ECEE /* KeyringCompleteView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyringCompleteView.swift; sourceTree = ""; }; - 4CEC62542EAE08DF0099ECEE /* KeyringInfoInputView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyringInfoInputView.swift; sourceTree = ""; }; - 4CEC62552EAE08DF0099ECEE /* KeyringCustomizingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyringCustomizingView.swift; sourceTree = ""; }; - 4CEC62582EAE08DF0099ECEE /* CropModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CropModels.swift; sourceTree = ""; }; - 4CEC625A2EAE08DF0099ECEE /* AcrylicPhotoVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AcrylicPhotoVM.swift; sourceTree = ""; }; - 4CEC625C2EAE08DF0099ECEE /* AcrylicPhotoVM+Crop.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AcrylicPhotoVM+Crop.swift"; sourceTree = ""; }; - 4CEC625D2EAE08DF0099ECEE /* AcrylicPhotoVM+CropBoxDrag.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AcrylicPhotoVM+CropBoxDrag.swift"; sourceTree = ""; }; - 4CEC625E2EAE08DF0099ECEE /* AcrylicPhotoVM+Effect.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AcrylicPhotoVM+Effect.swift"; sourceTree = ""; }; - 4CEC625F2EAE08DF0099ECEE /* AcrylicPhotoVM+ImageLoad.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AcrylicPhotoVM+ImageLoad.swift"; sourceTree = ""; }; - 4CEC62612EAE08DF0099ECEE /* AcrylicPhotoEditedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AcrylicPhotoEditedView.swift; sourceTree = ""; }; - 4CEC62622EAE08DF0099ECEE /* AcrylicPhotoCropView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AcrylicPhotoCropView.swift; sourceTree = ""; }; - 4CEC62632EAE08DF0099ECEE /* AcrylicPhotoPreView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AcrylicPhotoPreView.swift; sourceTree = ""; }; 4CEC62872EAE08F70099ECEE /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 4CEC629A2EAE09990099ECEE /* BundleDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BundleDetailView.swift; sourceTree = ""; }; 4CEC629B2EAE09990099ECEE /* BundleInventoryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BundleInventoryView.swift; sourceTree = ""; }; @@ -769,37 +800,17 @@ AAEB46AE2EC1D648002B13E5 /* BundleNameEditView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BundleNameEditView.swift; sourceTree = ""; }; C645AE9E2EB1055C004BFE69 /* CategoryTabBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CategoryTabBar.swift; sourceTree = ""; }; C645AEA22EB1B8FC004BFE69 /* DataInitializer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataInitializer.swift; sourceTree = ""; }; - C64EE7942ECD733300E8450F /* PolaroidVM+Frame.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PolaroidVM+Frame.swift"; sourceTree = ""; }; C665DDE72EAEFA8700CE4495 /* CoinChargeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoinChargeView.swift; sourceTree = ""; }; C665DDEB2EAF064500CE4495 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; }; C665DDEF2EAF08D000CE4495 /* PurchaseManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PurchaseManager.swift; sourceTree = ""; }; - C67B753A2ECC9E6C00D6E3FA /* EffectSelectorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EffectSelectorView.swift; sourceTree = ""; }; - C67B753C2ECCA32A00D6E3FA /* DrawingCanvasView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DrawingCanvasView.swift; sourceTree = ""; }; - C67B753D2ECCA32A00D6E3FA /* DrawingToolsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DrawingToolsView.swift; sourceTree = ""; }; - C67B754E2ECD373200D6E3FA /* NeonSignVM+Drawing.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NeonSignVM+Drawing.swift"; sourceTree = ""; }; - C67B75502ECD4C6F00D6E3FA /* PolaroidVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PolaroidVM.swift; sourceTree = ""; }; - C67B75512ECD4C6F00D6E3FA /* PolaroidVM+Effect.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PolaroidVM+Effect.swift"; sourceTree = ""; }; - C67B75532ECD4C6F00D6E3FA /* FramePreviewView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FramePreviewView.swift; sourceTree = ""; }; - C67B75542ECD4C6F00D6E3FA /* FrameSelectorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FrameSelectorView.swift; sourceTree = ""; }; - C67B75552ECD4C6F00D6E3FA /* PolaroidPreview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PolaroidPreview.swift; sourceTree = ""; }; C67B755D2ECD526A00D6E3FA /* Frame.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Frame.swift; sourceTree = ""; }; C6830F032EB8A4000059379A /* WorkshopDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkshopDataManager.swift; sourceTree = ""; }; - C6830F072EB8E96D0059379A /* MyItemsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyItemsView.swift; sourceTree = ""; }; - C6830F092EB9AAE00059379A /* WorkshopGridHelpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkshopGridHelpers.swift; sourceTree = ""; }; C6830F152EBB08380059379A /* MultiKeyringScene.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultiKeyringScene.swift; sourceTree = ""; }; C6830F162EBB08380059379A /* MultiKeyringSceneView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultiKeyringSceneView.swift; sourceTree = ""; }; - C6831A332ECEBD4700753DAE /* PhotoSelectSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoSelectSheet.swift; sourceTree = ""; }; C68931CC2EB7B94B00C5F083 /* EffectManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EffectManager.swift; sourceTree = ""; }; - C68931CF2EB835E800C5F083 /* WorkshopPreview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkshopPreview.swift; sourceTree = ""; }; - C68931D22EB8527C00C5F083 /* WorkshopMainContentSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkshopMainContentSection.swift; sourceTree = ""; }; - C68931D42EB8527C00C5F083 /* WorkshopStickyHeaderSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkshopStickyHeaderSection.swift; sourceTree = ""; }; - C68931D52EB8527C00C5F083 /* WorkshopTopBannerSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkshopTopBannerSection.swift; sourceTree = ""; }; C6B56F0A2EBC43AC0049F969 /* StoreProduct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreProduct.swift; sourceTree = ""; }; C6B56F102EBD96110049F969 /* CoinChargeView+Purchase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CoinChargeView+Purchase.swift"; sourceTree = ""; }; C6B56F122EBD962E0049F969 /* CurrentItemsCard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CurrentItemsCard.swift; sourceTree = ""; }; - C6B56F162EBF28170049F969 /* NeonSignVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NeonSignVM.swift; sourceTree = ""; }; - C6B56F192EBF284F0049F969 /* TemplatePreviewComponents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TemplatePreviewComponents.swift; sourceTree = ""; }; - C6B56F1B2EBF2A960049F969 /* NeonSignVM+Effect.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NeonSignVM+Effect.swift"; sourceTree = ""; }; C6B56F1F2EBF72130049F969 /* ItemPurchaseManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemPurchaseManager.swift; sourceTree = ""; }; C6B56F212EC0341B0049F969 /* KeyringImageCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyringImageCache.swift; sourceTree = ""; }; C6B56F2A2EC039D30049F969 /* KeyringCellScene+Capture.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KeyringCellScene+Capture.swift"; sourceTree = ""; }; @@ -819,18 +830,13 @@ C6C35F3D2ED2AB71009642F4 /* ZoomableScrollView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZoomableScrollView.swift; sourceTree = ""; }; C6C35F3F2ED2B6E6009642F4 /* ShowcaseFestivalKeyring.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShowcaseFestivalKeyring.swift; sourceTree = ""; }; C6C35F422ED2B70E009642F4 /* Showcase25BoardViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Showcase25BoardViewModel.swift; sourceTree = ""; }; - C6C360242ED3C40F009642F4 /* WorkshopMakingKeyringSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkshopMakingKeyringSection.swift; sourceTree = ""; }; - C6C360262ED3D037009642F4 /* WorkshopTemplatesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkshopTemplatesView.swift; sourceTree = ""; }; C6C361412ED44EE4009642F4 /* Showcase25BoardView+Sheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Showcase25BoardView+Sheet.swift"; sourceTree = ""; }; C6C361432ED44EF1009642F4 /* Showcase25BoardView+Detail.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Showcase25BoardView+Detail.swift"; sourceTree = ""; }; C6C361E12ED4AC49009642F4 /* SubmitCompleteAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubmitCompleteAlert.swift; sourceTree = ""; }; C6C361E32ED4AF48009642F4 /* Showcase25BoardView+Grid.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Showcase25BoardView+Grid.swift"; sourceTree = ""; }; C6C361E52ED4B289009642F4 /* ShowcaseConfirmPopup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShowcaseConfirmPopup.swift; sourceTree = ""; }; - C6C402852EB26C66006B58DF /* NeonSignPreview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NeonSignPreview.swift; sourceTree = ""; }; C6C4028C2EB2741D006B58DF /* Sound.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Sound.swift; sourceTree = ""; }; C6C4028E2EB27458006B58DF /* Particle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Particle.swift; sourceTree = ""; }; - C6C4029E2EB30163006B58DF /* WorkshopViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkshopViewModel.swift; sourceTree = ""; }; - C6C402A02EB3F3A9006B58DF /* WorkshopComponents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkshopComponents.swift; sourceTree = ""; }; C6C402A22EB40ACA006B58DF /* AlarmView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlarmView.swift; sourceTree = ""; }; C6EE7AD62EB445F6002B5669 /* MyPageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPageView.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -1007,39 +1013,6 @@ path = Button; sourceTree = ""; }; - 38CE39AE2ECD990F00168E4B /* ClearSketch */ = { - isa = PBXGroup; - children = ( - 38CE39AF2ECD993F00168E4B /* ViewModels */, - 38CE39B02ECD994900168E4B /* Views */, - ); - path = ClearSketch; - sourceTree = ""; - }; - 38CE39AF2ECD993F00168E4B /* ViewModels */ = { - isa = PBXGroup; - children = ( - 38CE39B32ECD998B00168E4B /* ClearSketchVM.swift */, - 38CE39D12ECE5F9300168E4B /* ClearSketchVM+Effect.swift */, - 38CE39E32ECE684300168E4B /* ClearSketchVM+Drawing.swift */, - 3824B6042ED3A18100A4BBCB /* ClearSketchVM+Crop.swift */, - 3824B6022ED37EC900A4BBCB /* ClearSketchVM+ImageConversion.swift */, - ); - path = ViewModels; - sourceTree = ""; - }; - 38CE39B02ECD994900168E4B /* Views */ = { - isa = PBXGroup; - children = ( - 38CE39B12ECD995D00168E4B /* ClearSketchPreview.swift */, - 38CE39D32ECE62D100168E4B /* ClearSketchDrawingView.swift */, - 389497162ED32405008340FA /* ClearSketchDrawingCanvasView.swift */, - 3824B5E42ED352CC00A4BBCB /* ClearSketchCropView.swift */, - 389080062ED3B43900D7A49F /* ClearSketchGuiding.swift */, - ); - path = Views; - sourceTree = ""; - }; 4C004F9A2F177C4600D9063E /* Bundle */ = { isa = PBXGroup; children = ( @@ -1066,34 +1039,6 @@ path = Keyring; sourceTree = ""; }; - 4C07027A2ED1DFA20026D6DC /* ViewModels */ = { - isa = PBXGroup; - children = ( - 4C0702772ED1DFA20026D6DC /* PixelVM.swift */, - 4C0702782ED1DFA20026D6DC /* PixelVM+Effect.swift */, - 4C0702792ED1DFA20026D6DC /* PixelVM+ImageConversion.swift */, - ); - path = ViewModels; - sourceTree = ""; - }; - 4C07027D2ED1DFA20026D6DC /* Views */ = { - isa = PBXGroup; - children = ( - 4C07027B2ED1DFA20026D6DC /* PixelDrawView.swift */, - 4C07027C2ED1DFA20026D6DC /* PixelPreviewView.swift */, - ); - path = Views; - sourceTree = ""; - }; - 4C07027E2ED1DFA20026D6DC /* Pixel */ = { - isa = PBXGroup; - children = ( - 4C07027A2ED1DFA20026D6DC /* ViewModels */, - 4C07027D2ED1DFA20026D6DC /* Views */, - ); - path = Pixel; - sourceTree = ""; - }; 4C3687F52EBFA86B00C64E75 /* pretendard */ = { isa = PBXGroup; children = ( @@ -1135,6 +1080,342 @@ path = HancomMalangMalang; sourceTree = ""; }; + 4C4733152F1FA2AB005D2376 /* Components */ = { + isa = PBXGroup; + children = ( + 4C4733142F1FA2AB005D2376 /* WorkshopComponents.swift */, + ); + path = Components; + sourceTree = ""; + }; + 4C4733172F1FA2AB005D2376 /* ViewModels */ = { + isa = PBXGroup; + children = ( + 4C4733162F1FA2AB005D2376 /* WorkshopViewModel.swift */, + ); + path = ViewModels; + sourceTree = ""; + }; + 4C47331F2F1FA2AB005D2376 /* Main */ = { + isa = PBXGroup; + children = ( + 4C4733182F1FA2AB005D2376 /* WorkshopGridHelpers.swift */, + 4C4733192F1FA2AB005D2376 /* WorkshopMainContentSection.swift */, + 4C47331A2F1FA2AB005D2376 /* WorkshopMakingKeyringSection.swift */, + 4C47331B2F1FA2AB005D2376 /* WorkshopStickyHeaderSection.swift */, + 4C47331C2F1FA2AB005D2376 /* WorkshopTemplatesView.swift */, + 4C47331D2F1FA2AB005D2376 /* WorkshopTopBannerSection.swift */, + 4C47331E2F1FA2AB005D2376 /* WorkshopView.swift */, + ); + path = Main; + sourceTree = ""; + }; + 4C4733222F1FA2AB005D2376 /* Views */ = { + isa = PBXGroup; + children = ( + 4C47331F2F1FA2AB005D2376 /* Main */, + 4C4733202F1FA2AB005D2376 /* MyItemsView.swift */, + 4C4733212F1FA2AB005D2376 /* WorkshopPreview.swift */, + ); + path = Views; + sourceTree = ""; + }; + 4C4733302F1FA388005D2376 /* Protocols */ = { + isa = PBXGroup; + children = ( + 4C47332E2F1FA388005D2376 /* KeyringViewModelProtocol.swift */, + 4C47332F2F1FA388005D2376 /* KeyringViewModelProtocol+Reset.swift */, + ); + path = Protocols; + sourceTree = ""; + }; + 4C4733322F1FA388005D2376 /* Core */ = { + isa = PBXGroup; + children = ( + 4C4733302F1FA388005D2376 /* Protocols */, + 4C4733312F1FA388005D2376 /* .gitkeep */, + ); + path = Core; + sourceTree = ""; + }; + 4C4733352F1FA388005D2376 /* Recording */ = { + isa = PBXGroup; + children = ( + 4C4733332F1FA388005D2376 /* AudioRecorderManager.swift */, + 4C4733342F1FA388005D2376 /* RecordingSheet.swift */, + ); + path = Recording; + sourceTree = ""; + }; + 4C47333A2F1FA388005D2376 /* Components */ = { + isa = PBXGroup; + children = ( + 4C4733352F1FA388005D2376 /* Recording */, + 4C4733362F1FA388005D2376 /* CameraPicker.swift */, + 4C4733372F1FA388005D2376 /* CinematicAppearanceModifier.swift */, + 4C4733382F1FA388005D2376 /* PreviewGuiding.swift */, + 4C4733392F1FA388005D2376 /* TemplatePreviewComponents.swift */, + ); + path = Components; + sourceTree = ""; + }; + 4C47333C2F1FA388005D2376 /* Models */ = { + isa = PBXGroup; + children = ( + 4C47333B2F1FA388005D2376 /* EffectItem.swift */, + ); + path = Models; + sourceTree = ""; + }; + 4C47334B2F1FA388005D2376 /* Views */ = { + isa = PBXGroup; + children = ( + 4C47333D2F1FA388005D2376 /* EffectSelectorView.swift */, + 4C47333E2F1FA388005D2376 /* KeyringCompleteView.swift */, + 4C47333F2F1FA388005D2376 /* KeyringCompleteView+ReviewCheck.swift */, + 4C4733402F1FA388005D2376 /* KeyringCompleteView+SaveImage.swift */, + 4C4733412F1FA388005D2376 /* KeyringCompleteView+VideoGen.swift */, + 4C4733422F1FA388005D2376 /* KeyringCustomizingView.swift */, + 4C4733432F1FA388005D2376 /* KeyringCustomizingView+Cart.swift */, + 4C4733442F1FA388005D2376 /* KeyringCustomizingView+Purchase.swift */, + 4C4733452F1FA388005D2376 /* KeyringCustomizingView+PurchaseSheet.swift */, + 4C4733462F1FA388005D2376 /* KeyringInfoInputView.swift */, + 4C4733472F1FA388005D2376 /* KeyringInfoInputView+FirebaseSave.swift */, + 4C4733482F1FA388005D2376 /* KeyringInfoInputView+Helpers.swift */, + 4C4733492F1FA388005D2376 /* KeyringInfoInputView+Sheet.swift */, + 4C47334A2F1FA388005D2376 /* KeyringInfoInputView+TagManagement.swift */, + ); + path = Views; + sourceTree = ""; + }; + 4C47334D2F1FA388005D2376 /* Shared */ = { + isa = PBXGroup; + children = ( + 4C47333A2F1FA388005D2376 /* Components */, + 4C47333C2F1FA388005D2376 /* Models */, + 4C47334B2F1FA388005D2376 /* Views */, + 4C47334C2F1FA388005D2376 /* .gitkeep */, + ); + path = Shared; + sourceTree = ""; + }; + 4C47334F2F1FA388005D2376 /* Models */ = { + isa = PBXGroup; + children = ( + 4C47334E2F1FA388005D2376 /* CropModels.swift */, + ); + path = Models; + sourceTree = ""; + }; + 4C4733562F1FA388005D2376 /* ViewModels */ = { + isa = PBXGroup; + children = ( + 4C4733502F1FA388005D2376 /* AcrylicPhotoVM.swift */, + 4C4733512F1FA388005D2376 /* AcrylicPhotoVM+BGRemover.swift */, + 4C4733522F1FA388005D2376 /* AcrylicPhotoVM+Crop.swift */, + 4C4733532F1FA388005D2376 /* AcrylicPhotoVM+CropBoxDrag.swift */, + 4C4733542F1FA388005D2376 /* AcrylicPhotoVM+Effect.swift */, + 4C4733552F1FA388005D2376 /* AcrylicPhotoVM+ImageLoad.swift */, + ); + path = ViewModels; + sourceTree = ""; + }; + 4C47335B2F1FA388005D2376 /* Views */ = { + isa = PBXGroup; + children = ( + 4C4733572F1FA388005D2376 /* AcrylicPhotoCropView.swift */, + 4C4733582F1FA388005D2376 /* AcrylicPhotoEditedView.swift */, + 4C4733592F1FA388005D2376 /* AcrylicPhotoGuiding.swift */, + 4C47335A2F1FA388005D2376 /* AcrylicPhotoPreView.swift */, + ); + path = Views; + sourceTree = ""; + }; + 4C47335C2F1FA388005D2376 /* AcrylicPhoto */ = { + isa = PBXGroup; + children = ( + 4C47334F2F1FA388005D2376 /* Models */, + 4C4733562F1FA388005D2376 /* ViewModels */, + 4C47335B2F1FA388005D2376 /* Views */, + ); + path = AcrylicPhoto; + sourceTree = ""; + }; + 4C4733622F1FA388005D2376 /* ViewModels */ = { + isa = PBXGroup; + children = ( + 4C47335D2F1FA388005D2376 /* ClearSketchVM.swift */, + 4C47335E2F1FA388005D2376 /* ClearSketchVM+Crop.swift */, + 4C47335F2F1FA388005D2376 /* ClearSketchVM+Drawing.swift */, + 4C4733602F1FA388005D2376 /* ClearSketchVM+Effect.swift */, + 4C4733612F1FA388005D2376 /* ClearSketchVM+ImageConversion.swift */, + ); + path = ViewModels; + sourceTree = ""; + }; + 4C4733682F1FA388005D2376 /* Views */ = { + isa = PBXGroup; + children = ( + 4C4733632F1FA388005D2376 /* ClearSketchCropView.swift */, + 4C4733642F1FA388005D2376 /* ClearSketchDrawingCanvasView.swift */, + 4C4733652F1FA388005D2376 /* ClearSketchDrawingView.swift */, + 4C4733662F1FA388005D2376 /* ClearSketchGuiding.swift */, + 4C4733672F1FA388005D2376 /* ClearSketchPreview.swift */, + ); + path = Views; + sourceTree = ""; + }; + 4C4733692F1FA388005D2376 /* ClearSketch */ = { + isa = PBXGroup; + children = ( + 4C4733622F1FA388005D2376 /* ViewModels */, + 4C4733682F1FA388005D2376 /* Views */, + ); + path = ClearSketch; + sourceTree = ""; + }; + 4C47336D2F1FA388005D2376 /* ViewModels */ = { + isa = PBXGroup; + children = ( + 4C47336A2F1FA388005D2376 /* NeonSignVM.swift */, + 4C47336B2F1FA388005D2376 /* NeonSignVM+Drawing.swift */, + 4C47336C2F1FA388005D2376 /* NeonSignVM+Effect.swift */, + ); + path = ViewModels; + sourceTree = ""; + }; + 4C4733712F1FA388005D2376 /* Views */ = { + isa = PBXGroup; + children = ( + 4C47336E2F1FA388005D2376 /* DrawingCanvasView.swift */, + 4C47336F2F1FA388005D2376 /* DrawingToolsView.swift */, + 4C4733702F1FA388005D2376 /* NeonSignPreview.swift */, + ); + path = Views; + sourceTree = ""; + }; + 4C4733722F1FA388005D2376 /* NeonSign */ = { + isa = PBXGroup; + children = ( + 4C47336D2F1FA388005D2376 /* ViewModels */, + 4C4733712F1FA388005D2376 /* Views */, + ); + path = NeonSign; + sourceTree = ""; + }; + 4C4733762F1FA388005D2376 /* ViewModels */ = { + isa = PBXGroup; + children = ( + 4C4733732F1FA388005D2376 /* PixelVM.swift */, + 4C4733742F1FA388005D2376 /* PixelVM+Effect.swift */, + 4C4733752F1FA388005D2376 /* PixelVM+ImageConversion.swift */, + ); + path = ViewModels; + sourceTree = ""; + }; + 4C4733792F1FA388005D2376 /* Views */ = { + isa = PBXGroup; + children = ( + 4C4733772F1FA388005D2376 /* PixelDrawView.swift */, + 4C4733782F1FA388005D2376 /* PixelPreviewView.swift */, + ); + path = Views; + sourceTree = ""; + }; + 4C47337A2F1FA388005D2376 /* Pixel */ = { + isa = PBXGroup; + children = ( + 4C4733762F1FA388005D2376 /* ViewModels */, + 4C4733792F1FA388005D2376 /* Views */, + ); + path = Pixel; + sourceTree = ""; + }; + 4C47337E2F1FA388005D2376 /* ViewModels */ = { + isa = PBXGroup; + children = ( + 4C47337B2F1FA388005D2376 /* PolaroidVM.swift */, + 4C47337C2F1FA388005D2376 /* PolaroidVM+Effect.swift */, + 4C47337D2F1FA388005D2376 /* PolaroidVM+Frame.swift */, + ); + path = ViewModels; + sourceTree = ""; + }; + 4C4733832F1FA388005D2376 /* Views */ = { + isa = PBXGroup; + children = ( + 4C47337F2F1FA388005D2376 /* FramePreviewView.swift */, + 4C4733802F1FA388005D2376 /* FrameSelectorView.swift */, + 4C4733812F1FA388005D2376 /* PhotoSelectSheet.swift */, + 4C4733822F1FA388005D2376 /* PolaroidPreview.swift */, + ); + path = Views; + sourceTree = ""; + }; + 4C4733842F1FA388005D2376 /* Polaroid */ = { + isa = PBXGroup; + children = ( + 4C47337E2F1FA388005D2376 /* ViewModels */, + 4C4733832F1FA388005D2376 /* Views */, + ); + path = Polaroid; + sourceTree = ""; + }; + 4C47338A2F1FA388005D2376 /* ViewModels */ = { + isa = PBXGroup; + children = ( + 4C4733852F1FA388005D2376 /* SpeechBubbleVM.swift */, + 4C4733862F1FA388005D2376 /* SpeechBubbleVM+Customizing.swift */, + 4C4733872F1FA388005D2376 /* SpeechBubbleVM+Effect.swift */, + 4C4733882F1FA388005D2376 /* SpeechBubbleVM+Firebase.swift */, + 4C4733892F1FA388005D2376 /* SpeechBubbleVM+Frame.swift */, + ); + path = ViewModels; + sourceTree = ""; + }; + 4C47338E2F1FA388005D2376 /* Views */ = { + isa = PBXGroup; + children = ( + 4C47338B2F1FA388005D2376 /* SpeechBubbleFramePreviewView.swift */, + 4C47338C2F1FA388005D2376 /* SpeechBubbleFrameSelectorView.swift */, + 4C47338D2F1FA388005D2376 /* SpeechBubblePreview.swift */, + ); + path = Views; + sourceTree = ""; + }; + 4C47338F2F1FA388005D2376 /* SpeechBubble */ = { + isa = PBXGroup; + children = ( + 4C47338A2F1FA388005D2376 /* ViewModels */, + 4C47338E2F1FA388005D2376 /* Views */, + ); + path = SpeechBubble; + sourceTree = ""; + }; + 4C4733912F1FA388005D2376 /* Templates */ = { + isa = PBXGroup; + children = ( + 4C47335C2F1FA388005D2376 /* AcrylicPhoto */, + 4C4733692F1FA388005D2376 /* ClearSketch */, + 4C4733722F1FA388005D2376 /* NeonSign */, + 4C47337A2F1FA388005D2376 /* Pixel */, + 4C4733842F1FA388005D2376 /* Polaroid */, + 4C47338F2F1FA388005D2376 /* SpeechBubble */, + 4C4733902F1FA388005D2376 /* .gitkeep */, + ); + path = Templates; + sourceTree = ""; + }; + 4C4733932F1FA388005D2376 /* KeyringMaker */ = { + isa = PBXGroup; + children = ( + 4C4733322F1FA388005D2376 /* Core */, + 4C47334D2F1FA388005D2376 /* Shared */, + 4C4733912F1FA388005D2376 /* Templates */, + ); + path = KeyringMaker; + sourceTree = ""; + }; 4C65303C2EBA5FF3000F8154 /* Alerts */ = { isa = PBXGroup; children = ( @@ -1189,18 +1470,6 @@ path = "nanum-square-round"; sourceTree = ""; }; - 4C7775302EB0ED0800981C3E /* Components */ = { - isa = PBXGroup; - children = ( - 4CBBEF292EB7DB9800252590 /* Recording */, - 4CBBEF1D2EB260BE00252590 /* CameraPicker.swift */, - 4CB82ECA2EB1FD8500B7458B /* PreviewGuiding.swift */, - 4CBBEF322EB919CC00252590 /* CinematicAppearanceModifier.swift */, - C6B56F192EBF284F0049F969 /* TemplatePreviewComponents.swift */, - ); - path = Components; - sourceTree = ""; - }; 4C77753D2EB1343600981C3E /* ViewModels */ = { isa = PBXGroup; children = ( @@ -1217,37 +1486,6 @@ path = ViewModels; sourceTree = ""; }; - 4C84264F2ED350AD0050B6FE /* ViewModels */ = { - isa = PBXGroup; - children = ( - 4C8426542ED356550050B6FE /* SpeechBubbleVM.swift */, - 4C8426562ED356DA0050B6FE /* SpeechBubbleVM+Firebase.swift */, - 4C8426582ED356FD0050B6FE /* SpeechBubbleVM+Effect.swift */, - 4C84265A2ED3572F0050B6FE /* SpeechBubbleVM+Frame.swift */, - 4C84265C2ED357E10050B6FE /* SpeechBubbleVM+Customizing.swift */, - ); - path = ViewModels; - sourceTree = ""; - }; - 4C8426502ED350AD0050B6FE /* SpeechBubble */ = { - isa = PBXGroup; - children = ( - 4C84264F2ED350AD0050B6FE /* ViewModels */, - 4C8426532ED350CB0050B6FE /* Views */, - ); - path = SpeechBubble; - sourceTree = ""; - }; - 4C8426532ED350CB0050B6FE /* Views */ = { - isa = PBXGroup; - children = ( - 4C8426652ED377650050B6FE /* SpeechBubbleFramePreviewView.swift */, - 4C8426662ED377650050B6FE /* SpeechBubbleFrameSelectorView.swift */, - 4C8426612ED372650050B6FE /* SpeechBubblePreview.swift */, - ); - path = Views; - sourceTree = ""; - }; 4C84265E2ED358520050B6FE /* Gulim */ = { isa = PBXGroup; children = ( @@ -1284,15 +1522,6 @@ path = Items; sourceTree = ""; }; - 4CBBEF292EB7DB9800252590 /* Recording */ = { - isa = PBXGroup; - children = ( - 4CBBEF272EB7DB9800252590 /* AudioRecorderManager.swift */, - 4CBBEF282EB7DB9800252590 /* RecordingSheet.swift */, - ); - path = Recording; - sourceTree = ""; - }; 4CC3D3C72EC8A47E0009D376 /* Text */ = { isa = PBXGroup; children = ( @@ -1748,120 +1977,12 @@ path = Home; sourceTree = ""; }; - 4CEC62522EAE08DF0099ECEE /* Protocols */ = { - isa = PBXGroup; - children = ( - 4CBBEF2C2EB7E92900252590 /* KeyringViewModelProtocol+Reset.swift */, - 4CEC62512EAE08DF0099ECEE /* KeyringViewModelProtocol.swift */, - ); - path = Protocols; - sourceTree = ""; - }; - 4CEC62562EAE08DF0099ECEE /* Views */ = { - isa = PBXGroup; - children = ( - C67B753A2ECC9E6C00D6E3FA /* EffectSelectorView.swift */, - 4CEC62552EAE08DF0099ECEE /* KeyringCustomizingView.swift */, - 4C65304D2EBA88FB000F8154 /* KeyringCustomizingView+Cart.swift */, - 4C65304A2EBA88EF000F8154 /* KeyringCustomizingView+Purchase.swift */, - 4C6530412EBA7D12000F8154 /* KeyringCustomizingView+PurchaseSheet.swift */, - 4CEC62542EAE08DF0099ECEE /* KeyringInfoInputView.swift */, - 4CBBEF222EB78A5D00252590 /* KeyringInfoInputView+Sheet.swift */, - 4CBBEF212EB78A5D00252590 /* KeyringInfoInputView+Helpers.swift */, - 4CBBEF232EB78A5D00252590 /* KeyringInfoInputView+TagManagement.swift */, - 4CA9C6A92ECA50C000CA546B /* KeyringInfoInputView+FirebaseSave.swift */, - 4CEC62532EAE08DF0099ECEE /* KeyringCompleteView.swift */, - 4C65303F2EBA6F46000F8154 /* KeyringCompleteView+SaveImage.swift */, - 4CDCADC32F14CC8800C01972 /* KeyringCompleteView+VideoGen.swift */, - 4C004FB82F19C27700D9063E /* KeyringCompleteView+ReviewCheck.swift */, - ); - path = Views; - sourceTree = ""; - }; - 4CEC62572EAE08DF0099ECEE /* Shared */ = { - isa = PBXGroup; - children = ( - 4C7775302EB0ED0800981C3E /* Components */, - 4CEC62562EAE08DF0099ECEE /* Views */, - 4CEC62522EAE08DF0099ECEE /* Protocols */, - ); - path = Shared; - sourceTree = ""; - }; - 4CEC62592EAE08DF0099ECEE /* Models */ = { - isa = PBXGroup; - children = ( - 4CEC62582EAE08DF0099ECEE /* CropModels.swift */, - ); - path = Models; - sourceTree = ""; - }; - 4CEC62602EAE08DF0099ECEE /* ViewModels */ = { - isa = PBXGroup; - children = ( - 4CEC625A2EAE08DF0099ECEE /* AcrylicPhotoVM.swift */, - 4CEC625C2EAE08DF0099ECEE /* AcrylicPhotoVM+Crop.swift */, - 4CEC625D2EAE08DF0099ECEE /* AcrylicPhotoVM+CropBoxDrag.swift */, - 4CB82EC82EB1EDB700B7458B /* AcrylicPhotoVM+BGRemover.swift */, - 4CEC625E2EAE08DF0099ECEE /* AcrylicPhotoVM+Effect.swift */, - 4CEC625F2EAE08DF0099ECEE /* AcrylicPhotoVM+ImageLoad.swift */, - ); - path = ViewModels; - sourceTree = ""; - }; - 4CEC62642EAE08DF0099ECEE /* Views */ = { - isa = PBXGroup; - children = ( - 4CEC62632EAE08DF0099ECEE /* AcrylicPhotoPreView.swift */, - 4CBBEF162EB24DEC00252590 /* AcrylicPhotoGuiding.swift */, - 4CEC62622EAE08DF0099ECEE /* AcrylicPhotoCropView.swift */, - 4CEC62612EAE08DF0099ECEE /* AcrylicPhotoEditedView.swift */, - ); - path = Views; - sourceTree = ""; - }; - 4CEC62652EAE08DF0099ECEE /* AcrylicPhoto */ = { - isa = PBXGroup; - children = ( - 4CEC62592EAE08DF0099ECEE /* Models */, - 4CEC62602EAE08DF0099ECEE /* ViewModels */, - 4CEC62642EAE08DF0099ECEE /* Views */, - ); - path = AcrylicPhoto; - sourceTree = ""; - }; - 4CEC62662EAE08DF0099ECEE /* Templates */ = { - isa = PBXGroup; - children = ( - 4C8426502ED350AD0050B6FE /* SpeechBubble */, - 4C07027E2ED1DFA20026D6DC /* Pixel */, - 38CE39AE2ECD990F00168E4B /* ClearSketch */, - C67B75572ECD4C6F00D6E3FA /* Polaroid */, - 4CEC62652EAE08DF0099ECEE /* AcrylicPhoto */, - C6C4027F2EB26BFB006B58DF /* NeonSign */, - ); - path = Templates; - sourceTree = ""; - }; - 4CEC62672EAE08DF0099ECEE /* Making */ = { - isa = PBXGroup; - children = ( - 4CEC62572EAE08DF0099ECEE /* Shared */, - 4CEC62662EAE08DF0099ECEE /* Templates */, - ); - path = Making; - sourceTree = ""; - }; 4CEC62682EAE08DF0099ECEE /* Workshop */ = { isa = PBXGroup; children = ( - 4C6530472EBA8886000F8154 /* EffectItem.swift */, - C6830F072EB8E96D0059379A /* MyItemsView.swift */, - C6C402A02EB3F3A9006B58DF /* WorkshopComponents.swift */, - C6C4029E2EB30163006B58DF /* WorkshopViewModel.swift */, - C68931D12EB850BC00C5F083 /* WorkshopMain */, - C68931CF2EB835E800C5F083 /* WorkshopPreview.swift */, - 4CEC62672EAE08DF0099ECEE /* Making */, + 4C4733152F1FA2AB005D2376 /* Components */, + 4C4733172F1FA2AB005D2376 /* ViewModels */, + 4C4733222F1FA2AB005D2376 /* Views */, C665DDE92EAEFAA800CE4495 /* Coin */, ); path = Workshop; @@ -1874,6 +1995,7 @@ 38A596702EAFA8880003D712 /* Intro */, 4CEC624E2EAE08DF0099ECEE /* Home */, 4CEC62682EAE08DF0099ECEE /* Workshop */, + 4C4733932F1FA388005D2376 /* KeyringMaker */, 4CEC62412EAE08DF0099ECEE /* Collection */, 4CEC62472EAE08DF0099ECEE /* Festival */, AA8C9B932F10E67200A352D2 /* Bundle */, @@ -1924,20 +2046,12 @@ AA8C9B932F10E67200A352D2 /* Bundle */ = { isa = PBXGroup; children = ( - AA8C9B942F10E68E00A352D2 /* Models */, AA8C9B952F10E69F00A352D2 /* ViewModels */, AA8C9B962F10E6A500A352D2 /* Views */, ); path = Bundle; sourceTree = ""; }; - AA8C9B942F10E68E00A352D2 /* Models */ = { - isa = PBXGroup; - children = ( - ); - path = Models; - sourceTree = ""; - }; AA8C9B952F10E69F00A352D2 /* ViewModels */ = { isa = PBXGroup; children = ( @@ -2020,36 +2134,6 @@ name = Frameworks; sourceTree = ""; }; - C67B75522ECD4C6F00D6E3FA /* ViewModels */ = { - isa = PBXGroup; - children = ( - C64EE7942ECD733300E8450F /* PolaroidVM+Frame.swift */, - C67B75502ECD4C6F00D6E3FA /* PolaroidVM.swift */, - C67B75512ECD4C6F00D6E3FA /* PolaroidVM+Effect.swift */, - ); - path = ViewModels; - sourceTree = ""; - }; - C67B75562ECD4C6F00D6E3FA /* Views */ = { - isa = PBXGroup; - children = ( - C67B75532ECD4C6F00D6E3FA /* FramePreviewView.swift */, - C67B75542ECD4C6F00D6E3FA /* FrameSelectorView.swift */, - C67B75552ECD4C6F00D6E3FA /* PolaroidPreview.swift */, - C6831A332ECEBD4700753DAE /* PhotoSelectSheet.swift */, - ); - path = Views; - sourceTree = ""; - }; - C67B75572ECD4C6F00D6E3FA /* Polaroid */ = { - isa = PBXGroup; - children = ( - C67B75522ECD4C6F00D6E3FA /* ViewModels */, - C67B75562ECD4C6F00D6E3FA /* Views */, - ); - path = Polaroid; - sourceTree = ""; - }; C67B75602ECD528900D6E3FA /* Template */ = { isa = PBXGroup; children = ( @@ -2069,30 +2153,6 @@ path = FileManagers; sourceTree = ""; }; - C68931D12EB850BC00C5F083 /* WorkshopMain */ = { - isa = PBXGroup; - children = ( - 4CEC62502EAE08DF0099ECEE /* WorkshopView.swift */, - C6C360262ED3D037009642F4 /* WorkshopTemplatesView.swift */, - C68931D22EB8527C00C5F083 /* WorkshopMainContentSection.swift */, - C6C360242ED3C40F009642F4 /* WorkshopMakingKeyringSection.swift */, - C6830F092EB9AAE00059379A /* WorkshopGridHelpers.swift */, - C68931D42EB8527C00C5F083 /* WorkshopStickyHeaderSection.swift */, - C68931D52EB8527C00C5F083 /* WorkshopTopBannerSection.swift */, - ); - path = WorkshopMain; - sourceTree = ""; - }; - C6B56F172EBF28170049F969 /* ViewModels */ = { - isa = PBXGroup; - children = ( - C67B754E2ECD373200D6E3FA /* NeonSignVM+Drawing.swift */, - C6B56F162EBF28170049F969 /* NeonSignVM.swift */, - C6B56F1B2EBF2A960049F969 /* NeonSignVM+Effect.swift */, - ); - path = ViewModels; - sourceTree = ""; - }; C6B56F222EC0341B0049F969 /* Cache */ = { isa = PBXGroup; children = ( @@ -2133,25 +2193,6 @@ path = Showcase25Board; sourceTree = ""; }; - C6C4027F2EB26BFB006B58DF /* NeonSign */ = { - isa = PBXGroup; - children = ( - C6B56F172EBF28170049F969 /* ViewModels */, - C6C402802EB26C10006B58DF /* Views */, - ); - path = NeonSign; - sourceTree = ""; - }; - C6C402802EB26C10006B58DF /* Views */ = { - isa = PBXGroup; - children = ( - C67B753C2ECCA32A00D6E3FA /* DrawingCanvasView.swift */, - C67B753D2ECCA32A00D6E3FA /* DrawingToolsView.swift */, - C6C402852EB26C66006B58DF /* NeonSignPreview.swift */, - ); - path = Views; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -2257,6 +2298,9 @@ buildActionMask = 2147483647; files = ( 4C3688132EC08A3100C64E75 /* HancomMalangMalang-Bold.otf in Resources */, + 4C4733DB2F1FA388005D2376 /* .gitkeep in Resources */, + 4C4733DC2F1FA388005D2376 /* .gitkeep in Resources */, + 4C4733DD2F1FA388005D2376 /* .gitkeep in Resources */, 4C3688142EC08A3100C64E75 /* HancomMalangMalang-Regular.otf in Resources */, 4CEC62962EAE08F70099ECEE /* Assets.xcassets in Resources */, 4C6622052EAE5FC3001760B5 /* SUIT-Bold.otf in Resources */, @@ -2309,56 +2353,35 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 3824B6032ED37EC900A4BBCB /* ClearSketchVM+ImageConversion.swift in Sources */, C6C4028F2EB27458006B58DF /* Particle.swift in Sources */, AA0A54B72EC053E4007B5413 /* CarabinerType.swift in Sources */, AA4B07322EB26CD2005F9227 /* BundleAddKeyringView.swift in Sources */, 4CEC61E52EAE08C00099ECEE /* KeyringBundle.swift in Sources */, 4C004FAD2F177F2600D9063E /* BundleDetailView+VideoGen.swift in Sources */, - C67B753E2ECCA32A00D6E3FA /* DrawingToolsView.swift in Sources */, - 4CDCADC42F14CC8800C01972 /* KeyringCompleteView+VideoGen.swift in Sources */, - C67B753F2ECCA32A00D6E3FA /* DrawingCanvasView.swift in Sources */, - C68931D62EB8527C00C5F083 /* WorkshopMainContentSection.swift in Sources */, - C68931D72EB8527C00C5F083 /* WorkshopStickyHeaderSection.swift in Sources */, 386102462F10F9CE0045C529 /* KeyringReceiveView+Alerts.swift in Sources */, - C6830F0A2EB9AAE00059379A /* WorkshopGridHelpers.swift in Sources */, 4C65306C2EBC889B000F8154 /* ChangeNameView.swift in Sources */, 38A22A9F2EC28B3D00B4C7C5 /* PackageCompleteView+SaveImage.swift in Sources */, - 4C8426572ED356DA0050B6FE /* SpeechBubbleVM+Firebase.swift in Sources */, 3822DDC02EBB2353003125BE /* KeyringMenu.swift in Sources */, 38DD909C2EF1679D0042EB45 /* Color+Extension.swift in Sources */, 4C3687FC2EC05E6800C64E75 /* AccountAlert.swift in Sources */, 388E72942EF341F200AE1F1B /* CollectionViewModel+UserData.swift in Sources */, - C6B56F1C2EBF2A960049F969 /* NeonSignVM+Effect.swift in Sources */, - 4C84265D2ED357E10050B6FE /* SpeechBubbleVM+Customizing.swift in Sources */, 4CEBB14D2EFAA52F00CF53E2 /* DeepLinkHandler.swift in Sources */, 4CEBB14E2EFAA52F00CF53E2 /* DeepLinkManager.swift in Sources */, - C68931D92EB8527C00C5F083 /* WorkshopTopBannerSection.swift in Sources */, 4CEC61E62EAE08C00099ECEE /* Keyring.swift in Sources */, 4CEC61F12EAE08C40099ECEE /* KeychyApp.swift in Sources */, AA69DD222F14C41300C0A41C /* BundleViewModel+LoadData.swift in Sources */, 4CEBB1482EFA93D000CF53E2 /* RootView.swift in Sources */, 4CEBB1492EFA93D000CF53E2 /* AppDelegate.swift in Sources */, - 4C6530482EBA8886000F8154 /* EffectItem.swift in Sources */, 4C6622152EAE70BF001760B5 /* Gradient+Keychy.swift in Sources */, C6B56F2B2EC039D30049F969 /* KeyringCellScene+Capture.swift in Sources */, - 4CBBEF2A2EB7DB9800252590 /* RecordingSheet.swift in Sources */, - 4CBBEF2B2EB7DB9800252590 /* AudioRecorderManager.swift in Sources */, 386B17542ECCE8EC00CCCC23 /* CollectionViewModel+Distribution.swift in Sources */, 3822DDC62EBBE252003125BE /* LackPopup.swift in Sources */, 4CEBB16F2EFCFC5600CF53E2 /* NoInternetView.swift in Sources */, 4C004FAB2F177C7200D9063E /* KeyringVideoGenerator+Metal.swift in Sources */, 4CEBB1702EFCFC5600CF53E2 /* NoInternetToast.swift in Sources */, - C67B75582ECD4C6F00D6E3FA /* PolaroidVM.swift in Sources */, - C67B75592ECD4C6F00D6E3FA /* PolaroidVM+Effect.swift in Sources */, - C67B755A2ECD4C6F00D6E3FA /* FrameSelectorView.swift in Sources */, - C67B755B2ECD4C6F00D6E3FA /* FramePreviewView.swift in Sources */, - C67B755C2ECD4C6F00D6E3FA /* PolaroidPreview.swift in Sources */, AA8C9B9A2F14C35200A352D2 /* BundleViewModel+ReloadDecision.swift in Sources */, 4CEC61E82EAE08C00099ECEE /* ChainType.swift in Sources */, 4C77753E2EB1343600981C3E /* IntroViewModel.swift in Sources */, - 4C8426552ED356550050B6FE /* SpeechBubbleVM.swift in Sources */, - 385425C62EB3BD7C00A06C02 /* AcrylicPhotoGuiding.swift in Sources */, 4C77753F2EB1343600981C3E /* IntroViewModel+Login.swift in Sources */, 4C7775402EB1343600981C3E /* IntroViewModel+Signup.swift in Sources */, AAA446822EC6519700080AB1 /* SelectCarabinerSheetContent.swift in Sources */, @@ -2369,7 +2392,6 @@ 4CEC61EA2EAE08C00099ECEE /* RingType.swift in Sources */, 386AECC92EB445F80001A5CD /* SplashView.swift in Sources */, 38C147BD2EB14DFF00A8E511 /* CollectionViewModel+Status.swift in Sources */, - 4C004FB92F19C27700D9063E /* KeyringCompleteView+ReviewCheck.swift in Sources */, 38C3C2942EC1F81C003C5DE1 /* CollectionKeyringDetailView+Helpers.swift in Sources */, C6B56F132EBD962E0049F969 /* CurrentItemsCard.swift in Sources */, 38A596802EAFCF5F0003D712 /* UserManager.swift in Sources */, @@ -2379,7 +2401,6 @@ AA8C9B982F10E6D500A352D2 /* BundleViewModel.swift in Sources */, C6B5707B2EC2036C0049F969 /* MultiKeyringCaptureScene.swift in Sources */, 4CEC621A2EAE08DA0099ECEE /* KeyringScene.swift in Sources */, - 4C84265B2ED3572F0050B6FE /* SpeechBubbleVM+Frame.swift in Sources */, 4CEC621B2EAE08DA0099ECEE /* KeyringScene+Touch.swift in Sources */, 38C3C2882EC1D761003C5DE1 /* CollectionKeyringDetailView+Menu.swift in Sources */, 4CEC621C2EAE08DA0099ECEE /* BackgroundSelectableCell.swift in Sources */, @@ -2403,20 +2424,14 @@ 4CC8D0252EF11CD200317467 /* HomeViewModel.swift in Sources */, C68931CE2EB7B94B00C5F083 /* EffectManager.swift in Sources */, 4CEC62232EAE08DA0099ECEE /* KeyringRingComponent.swift in Sources */, - 4CBBEF242EB78A5D00252590 /* KeyringInfoInputView+Sheet.swift in Sources */, C6B56F202EBF72130049F969 /* ItemPurchaseManager.swift in Sources */, - 4CBBEF252EB78A5D00252590 /* KeyringInfoInputView+TagManagement.swift in Sources */, - 4CBBEF262EB78A5D00252590 /* KeyringInfoInputView+Helpers.swift in Sources */, 38C3C28C2EC1E4B4003C5DE1 /* CollectionKeyringDetailView+Alerts.swift in Sources */, 4CAF11AB2EBF6058004CB08C /* CollectionKeyringDetailView+SaveImage.swift in Sources */, 4CA9C6A82EC9DB5300CA546B /* View+SafeAreaBottom.swift in Sources */, 4C7775342EB0EF8800981C3E /* ItemDetailInfoSection.swift in Sources */, 4CC3D3992EC4C16B0009D376 /* ToolbarButtons.swift in Sources */, AA8C9B8C2F0F349500A352D2 /* BundleDetailView+Alert.swift in Sources */, - C67B754F2ECD373200D6E3FA /* NeonSignVM+Drawing.swift in Sources */, 4CEC62252EAE08DA0099ECEE /* WorkshopRoute.swift in Sources */, - 38CE39E42ECE684300168E4B /* ClearSketchVM+Drawing.swift in Sources */, - 38CE39B42ECD998B00168E4B /* ClearSketchVM.swift in Sources */, 4CEC62262EAE08DA0099ECEE /* Radius.swift in Sources */, 4CEC62282EAE08DA0099ECEE /* FestivalRoute.swift in Sources */, 4CEC62292EAE08DA0099ECEE /* KeyringCellScene.swift in Sources */, @@ -2425,7 +2440,6 @@ AA9B2E8B2EB001B70004D31C /* Carabiner.swift in Sources */, AA6298582EC457DF001576C0 /* CarabinerChangePopup.swift in Sources */, AAA4467C2EC64C9900080AB1 /* SelectBackgroundSheetContent.swift in Sources */, - 4CBBEF2D2EB7E92900252590 /* KeyringViewModelProtocol+Reset.swift in Sources */, 38C3C2842EC0D081003C5DE1 /* LinkCopiedPopup.swift in Sources */, C6C35F3E2ED2AB71009642F4 /* ZoomableScrollView.swift in Sources */, AA69DD262F14C60000C0A41C /* BundleViewModel+Edit.swift in Sources */, @@ -2450,14 +2464,10 @@ 4CC3D3C82EC8A47E0009D376 /* OutlineText.swift in Sources */, 385425C32EB2C35E00A06C02 /* WidgetSettingView.swift in Sources */, 4CEC622B2EAE08DA0099ECEE /* Font+Styles.swift in Sources */, - 4C6530402EBA6F46000F8154 /* KeyringCompleteView+SaveImage.swift in Sources */, 386B17522ECCDFBA00CCCC23 /* KeyringCollectView.swift in Sources */, 4CEBB15F2EFAD3D600CF53E2 /* MainTabViewModel.swift in Sources */, 4C65303B2EBA5FA0000F8154 /* CheckmarkAlert.swift in Sources */, - C6830F082EB8E96D0059379A /* MyItemsView.swift in Sources */, AA69DD2C2F14C80900C0A41C /* BundleViewModel+CaptureScene.swift in Sources */, - 4CEC626A2EAE08DF0099ECEE /* AcrylicPhotoVM+Effect.swift in Sources */, - 4CBBEF332EB919CC00252590 /* CinematicAppearanceModifier.swift in Sources */, 4C004FB12F187CFC00D9063E /* CollectionKeyringDetailView+VideoGen.swift in Sources */, 4C004FBB2F19F1FE00D9063E /* RootViewModel+ReviewCheck.swift in Sources */, C6B56F112EBD96110049F969 /* CoinChargeView+Purchase.swift in Sources */, @@ -2471,16 +2481,81 @@ AA2146B52F15D8490048D40E /* KeyringSelectableCell.swift in Sources */, C6EE7AD72EB445F6002B5669 /* MyPageView.swift in Sources */, AA8C9B8E2F0F3E5E00A352D2 /* BundleDetailView+Menu.swift in Sources */, - 4C8426622ED372650050B6FE /* SpeechBubblePreview.swift in Sources */, - 4CBBEF1E2EB260BE00252590 /* CameraPicker.swift in Sources */, - 4CEC626E2EAE08DF0099ECEE /* AcrylicPhotoCropView.swift in Sources */, - 4CB82EC92EB1EDB700B7458B /* AcrylicPhotoVM+BGRemover.swift in Sources */, 389080632ED47F2500D7A49F /* VotePopup.swift in Sources */, - 4CEC62702EAE08DF0099ECEE /* KeyringInfoInputView.swift in Sources */, 3822DDC42EBBE108003125BE /* CopyPopup.swift in Sources */, 4C004FA12F177C4600D9063E /* BundleVideoGenerator+Rendering.swift in Sources */, 4C004FA22F177C4600D9063E /* KeyringVideoGenerator+Setup.swift in Sources */, 4C004FA32F177C4600D9063E /* BundleVideoGenerator+Metal.swift in Sources */, + 4C4733942F1FA388005D2376 /* PixelDrawView.swift in Sources */, + 4C4733952F1FA388005D2376 /* ClearSketchDrawingView.swift in Sources */, + 4C4733962F1FA388005D2376 /* KeyringCustomizingView+Cart.swift in Sources */, + 4C4733972F1FA388005D2376 /* EffectItem.swift in Sources */, + 4C4733982F1FA388005D2376 /* PolaroidPreview.swift in Sources */, + 4C4733992F1FA388005D2376 /* EffectSelectorView.swift in Sources */, + 4C47339A2F1FA388005D2376 /* AcrylicPhotoEditedView.swift in Sources */, + 4C47339B2F1FA388005D2376 /* KeyringCustomizingView+Purchase.swift in Sources */, + 4C47339C2F1FA388005D2376 /* PreviewGuiding.swift in Sources */, + 4C47339D2F1FA388005D2376 /* DrawingCanvasView.swift in Sources */, + 4C47339E2F1FA388005D2376 /* NeonSignVM+Drawing.swift in Sources */, + 4C47339F2F1FA388005D2376 /* SpeechBubblePreview.swift in Sources */, + 4C4733A02F1FA388005D2376 /* KeyringCustomizingView+PurchaseSheet.swift in Sources */, + 4C4733A12F1FA388005D2376 /* AcrylicPhotoCropView.swift in Sources */, + 4C4733A22F1FA388005D2376 /* PhotoSelectSheet.swift in Sources */, + 4C4733A32F1FA388005D2376 /* SpeechBubbleVM+Firebase.swift in Sources */, + 4C4733A42F1FA388005D2376 /* KeyringInfoInputView+FirebaseSave.swift in Sources */, + 4C4733A52F1FA388005D2376 /* SpeechBubbleFramePreviewView.swift in Sources */, + 4C4733A62F1FA388005D2376 /* KeyringCompleteView+VideoGen.swift in Sources */, + 4C4733A72F1FA388005D2376 /* KeyringCompleteView.swift in Sources */, + 4C4733A82F1FA388005D2376 /* AcrylicPhotoVM+ImageLoad.swift in Sources */, + 4C4733A92F1FA388005D2376 /* NeonSignPreview.swift in Sources */, + 4C4733AA2F1FA388005D2376 /* SpeechBubbleFrameSelectorView.swift in Sources */, + 4C4733AB2F1FA388005D2376 /* KeyringViewModelProtocol+Reset.swift in Sources */, + 4C4733AC2F1FA388005D2376 /* PixelPreviewView.swift in Sources */, + 4C4733AD2F1FA388005D2376 /* ClearSketchVM+ImageConversion.swift in Sources */, + 4C4733AE2F1FA388005D2376 /* CinematicAppearanceModifier.swift in Sources */, + 4C4733AF2F1FA388005D2376 /* ClearSketchVM+Effect.swift in Sources */, + 4C4733B02F1FA388005D2376 /* AcrylicPhotoVM+Effect.swift in Sources */, + 4C4733B12F1FA388005D2376 /* PixelVM.swift in Sources */, + 4C4733B22F1FA388005D2376 /* KeyringCompleteView+ReviewCheck.swift in Sources */, + 4C4733B32F1FA388005D2376 /* AcrylicPhotoVM+BGRemover.swift in Sources */, + 4C4733B42F1FA388005D2376 /* ClearSketchGuiding.swift in Sources */, + 4C4733B52F1FA388005D2376 /* KeyringCustomizingView.swift in Sources */, + 4C4733B62F1FA388005D2376 /* KeyringInfoInputView+Sheet.swift in Sources */, + 4C4733B72F1FA388005D2376 /* KeyringInfoInputView+Helpers.swift in Sources */, + 4C4733B82F1FA388005D2376 /* FrameSelectorView.swift in Sources */, + 4C4733B92F1FA388005D2376 /* KeyringInfoInputView+TagManagement.swift in Sources */, + 4C4733BA2F1FA388005D2376 /* AcrylicPhotoVM.swift in Sources */, + 4C4733BB2F1FA388005D2376 /* CameraPicker.swift in Sources */, + 4C4733BC2F1FA388005D2376 /* PixelVM+ImageConversion.swift in Sources */, + 4C4733BD2F1FA388005D2376 /* AcrylicPhotoGuiding.swift in Sources */, + 4C4733BE2F1FA388005D2376 /* PolaroidVM+Effect.swift in Sources */, + 4C4733BF2F1FA388005D2376 /* PolaroidVM.swift in Sources */, + 4C4733C02F1FA388005D2376 /* ClearSketchPreview.swift in Sources */, + 4C4733C12F1FA388005D2376 /* ClearSketchVM+Drawing.swift in Sources */, + 4C4733C22F1FA388005D2376 /* PixelVM+Effect.swift in Sources */, + 4C4733C32F1FA388005D2376 /* CropModels.swift in Sources */, + 4C4733C42F1FA388005D2376 /* SpeechBubbleVM+Effect.swift in Sources */, + 4C4733C52F1FA388005D2376 /* ClearSketchCropView.swift in Sources */, + 4C4733C62F1FA388005D2376 /* AudioRecorderManager.swift in Sources */, + 4C4733C72F1FA388005D2376 /* DrawingToolsView.swift in Sources */, + 4C4733C82F1FA388005D2376 /* KeyringInfoInputView.swift in Sources */, + 4C4733C92F1FA388005D2376 /* PolaroidVM+Frame.swift in Sources */, + 4C4733CA2F1FA388005D2376 /* KeyringViewModelProtocol.swift in Sources */, + 4C4733CB2F1FA388005D2376 /* NeonSignVM+Effect.swift in Sources */, + 4C4733CC2F1FA388005D2376 /* SpeechBubbleVM+Frame.swift in Sources */, + 4C4733CD2F1FA388005D2376 /* NeonSignVM.swift in Sources */, + 4C4733CE2F1FA388005D2376 /* KeyringCompleteView+SaveImage.swift in Sources */, + 4C4733CF2F1FA388005D2376 /* ClearSketchVM.swift in Sources */, + 4C4733D02F1FA388005D2376 /* RecordingSheet.swift in Sources */, + 4C4733D12F1FA388005D2376 /* ClearSketchVM+Crop.swift in Sources */, + 4C4733D22F1FA388005D2376 /* ClearSketchDrawingCanvasView.swift in Sources */, + 4C4733D32F1FA388005D2376 /* FramePreviewView.swift in Sources */, + 4C4733D42F1FA388005D2376 /* SpeechBubbleVM.swift in Sources */, + 4C4733D52F1FA388005D2376 /* AcrylicPhotoVM+CropBoxDrag.swift in Sources */, + 4C4733D62F1FA388005D2376 /* SpeechBubbleVM+Customizing.swift in Sources */, + 4C4733D72F1FA388005D2376 /* AcrylicPhotoVM+Crop.swift in Sources */, + 4C4733D82F1FA388005D2376 /* AcrylicPhotoPreView.swift in Sources */, + 4C4733D92F1FA388005D2376 /* TemplatePreviewComponents.swift in Sources */, 4C004FA42F177C4600D9063E /* BundleVideoGenerator+Setup.swift in Sources */, 4C004FA52F177C4600D9063E /* KeyringVideoGenerator+Rendering.swift in Sources */, 4C004FA62F177C4600D9063E /* KeyringVideoGenerator.swift in Sources */, @@ -2501,50 +2576,42 @@ 4CEBB1722EFE66CF00CF53E2 /* ToastManager.swift in Sources */, C6B56F232EC0341B0049F969 /* KeyringImageCache.swift in Sources */, AA6298522EC233D2001576C0 /* BundleEditView.swift in Sources */, - C68931D02EB835E800C5F083 /* WorkshopPreview.swift in Sources */, - 4C07027F2ED1DFA20026D6DC /* PixelVM+Effect.swift in Sources */, - 4C0702802ED1DFA20026D6DC /* PixelVM+ImageConversion.swift in Sources */, - 4C0702812ED1DFA20026D6DC /* PixelVM.swift in Sources */, - 4C0702822ED1DFA20026D6DC /* PixelDrawView.swift in Sources */, - 4C0702832ED1DFA20026D6DC /* PixelPreviewView.swift in Sources */, + 4C4733232F1FA2AB005D2376 /* WorkshopView.swift in Sources */, + 4C4733242F1FA2AB005D2376 /* WorkshopPreview.swift in Sources */, + 4C4733252F1FA2AB005D2376 /* MyItemsView.swift in Sources */, + 4C4733262F1FA2AB005D2376 /* WorkshopGridHelpers.swift in Sources */, + 4C4733272F1FA2AB005D2376 /* WorkshopMakingKeyringSection.swift in Sources */, + 4C4733282F1FA2AB005D2376 /* WorkshopTemplatesView.swift in Sources */, + 4C4733292F1FA2AB005D2376 /* WorkshopMainContentSection.swift in Sources */, + 4C47332A2F1FA2AB005D2376 /* WorkshopStickyHeaderSection.swift in Sources */, + 4C47332B2F1FA2AB005D2376 /* WorkshopTopBannerSection.swift in Sources */, + 4C47332C2F1FA2AB005D2376 /* WorkshopComponents.swift in Sources */, + 4C47332D2F1FA2AB005D2376 /* WorkshopViewModel.swift in Sources */, 386B17642ECD142600CCCC23 /* String+Extension.swift in Sources */, 4CEBB1652EFBA54200CF53E2 /* RootViewModel.swift in Sources */, - 4CEC62722EAE08DF0099ECEE /* AcrylicPhotoVM.swift in Sources */, - C6B56F1A2EBF284F0049F969 /* TemplatePreviewComponents.swift in Sources */, 4CC3D37F2EC464D70009D376 /* IntroAppGuidingView.swift in Sources */, 3828F5432EC4C80800F1B040 /* CollectionView+Alerts.swift in Sources */, - 389080072ED3B43900D7A49F /* ClearSketchGuiding.swift in Sources */, 4C84A1602EB134BD008FFE57 /* ProfileSetupView.swift in Sources */, 4CEC62A72EAE0C130099ECEE /* LottieView.swift in Sources */, 38C3C2802EC0C94D003C5DE1 /* InvenLackPopup.swift in Sources */, 38C147BF2EB1502300A8E511 /* CollectionKeyringDetailView.swift in Sources */, 38173D082EB8AD3900E36F7E /* CollectionViewModel+Tags.swift in Sources */, 4C004FB32F187ED000D9063E /* KeyringVideoGenerator+Keyring.swift in Sources */, - 4CEC62732EAE08DF0099ECEE /* AcrylicPhotoVM+CropBoxDrag.swift in Sources */, - 4CEC62742EAE08DF0099ECEE /* AcrylicPhotoVM+ImageLoad.swift in Sources */, 38F832CF2EC914C900D3A248 /* InvenExpandPopup.swift in Sources */, - C6C402A12EB3F3A9006B58DF /* WorkshopComponents.swift in Sources */, 4C3687FA2EBFC0FB00C64E75 /* NotificationManager.swift in Sources */, 38F832CB2EC9067300D3A248 /* WidgetOnboardingStepView.swift in Sources */, 4CEC62752EAE08DF0099ECEE /* HomeView.swift in Sources */, 4C6622482EAF9B3A001760B5 /* Haptic.swift in Sources */, 3822DDBE2EBAAC80003125BE /* PurchasePopup.swift in Sources */, 4CC3D3CD2EC8AE030009D376 /* KeychyAlert.swift in Sources */, - 4CEC62762EAE08DF0099ECEE /* AcrylicPhotoEditedView.swift in Sources */, - 4CEC62772EAE08DF0099ECEE /* CropModels.swift in Sources */, 4CF2A9702F0FB2E100BA9FDA /* AppUpdateManager.swift in Sources */, AA9B2E912EB081750004D31C /* ItemDetailView.swift in Sources */, - 4CEC62782EAE08DF0099ECEE /* KeyringCompleteView.swift in Sources */, C665DDE82EAEFA8700CE4495 /* CoinChargeView.swift in Sources */, AA69DD282F14C64B00C0A41C /* BundleViewModel+Sort.swift in Sources */, AAEB46AD2EC1C893002B13E5 /* BundleMenu.swift in Sources */, 4CF2A96D2F0F969300BA9FDA /* UpdateAlert.swift in Sources */, - C6C4029F2EB30163006B58DF /* WorkshopViewModel.swift in Sources */, 4C7775322EB0EEF100981C3E /* ItemDetailImage.swift in Sources */, AA2146B12F15D43C0048D40E /* BundleEditView+Alert.swift in Sources */, - 38CE39D22ECE5F9300168E4B /* ClearSketchVM+Effect.swift in Sources */, - 4C8426672ED377650050B6FE /* SpeechBubbleFramePreviewView.swift in Sources */, - 4C8426682ED377650050B6FE /* SpeechBubbleFrameSelectorView.swift in Sources */, 4C07024C2ECF10760026D6DC /* EffectSyncManager.swift in Sources */, 3828F54B2EC4D0C500F1B040 /* CollectionView+Handlers.swift in Sources */, 4CF2A96A2F0B94EA00BA9FDA /* View+PullToRefresh.swift in Sources */, @@ -2558,7 +2625,6 @@ 4CC8D00B2EEFC36900317467 /* AlarmViewModel.swift in Sources */, 4CC8D0222EF110A300317467 /* NotificationGiftViewModel.swift in Sources */, 38C3C2822EC0CB6E003C5DE1 /* SavedPopup.swift in Sources */, - 4CEC627B2EAE08DF0099ECEE /* AcrylicPhotoPreView.swift in Sources */, 38C3C2962EC20B1E003C5DE1 /* PackagedKeyringView.swift in Sources */, 38173D0A2EB8AD7900E36F7E /* CategoryTabBarWithLongPress.swift in Sources */, 4CEBB1552EFACFA900CF53E2 /* HomeTab.swift in Sources */, @@ -2566,34 +2632,21 @@ 4CEBB1582EFACFA900CF53E2 /* FestivalTab.swift in Sources */, 4CEBB1592EFACFA900CF53E2 /* WorkshopTab.swift in Sources */, 38F832CD2EC90DEF00D3A248 /* WidgetOnboardingStepView+Helpers.swift in Sources */, - 4CEC627C2EAE08DF0099ECEE /* WorkshopView.swift in Sources */, 38A22A9D2EC27AC400B4C7C5 /* PackagedKeyringView+SaveImage.swift in Sources */, - 4CEC627D2EAE08DF0099ECEE /* KeyringViewModelProtocol.swift in Sources */, - C64EE7952ECD733300E8450F /* PolaroidVM+Frame.swift in Sources */, - 4C65304E2EBA88FB000F8154 /* KeyringCustomizingView+Cart.swift in Sources */, 3861024A2F1129FA0045C529 /* KeyringCacheManager.swift in Sources */, - 4C65304C2EBA88EF000F8154 /* KeyringCustomizingView+Purchase.swift in Sources */, AABA4DAC2ED2D4C700A7D062 /* cardPagerView.swift in Sources */, AA9115082EB126A60026E9BC /* CarabinerSelectableCell.swift in Sources */, 38283A832EBF554E00BE45A5 /* KeyringReceiveView.swift in Sources */, 4CEC627F2EAE08DF0099ECEE /* CollectionView.swift in Sources */, AA0A54B92EC05C41007B5413 /* BundleRingComponent.swift in Sources */, - C6B56F182EBF28170049F969 /* NeonSignVM.swift in Sources */, C6C361422ED44EE4009642F4 /* Showcase25BoardView+Sheet.swift in Sources */, - 38CE39B22ECD995D00168E4B /* ClearSketchPreview.swift in Sources */, - 4CEC62812EAE08DF0099ECEE /* KeyringCustomizingView.swift in Sources */, - 4CEC62842EAE08DF0099ECEE /* AcrylicPhotoVM+Crop.swift in Sources */, 3828F5452EC4CC0A00F1B040 /* CollectionViewModel+Filter.swift in Sources */, 38C3C28A2EC1D879003C5DE1 /* UnpackPopup.swift in Sources */, C6C361E42ED4AF48009642F4 /* Showcase25BoardView+Grid.swift in Sources */, 386102442F0F7C980045C529 /* KeyringCollectViewModel.swift in Sources */, 4C65306E2EBCF157000F8154 /* TermsView.swift in Sources */, AA91150A2EB1B7930026E9BC /* CarabinerAddKeyringButton.swift in Sources */, - 4CA9C6AA2ECA50C000CA546B /* KeyringInfoInputView+FirebaseSave.swift in Sources */, - 3824B6052ED3A18100A4BBCB /* ClearSketchVM+Crop.swift in Sources */, 4CEC622C2EAE08DA0099ECEE /* KeyringSceneView.swift in Sources */, - C6C360272ED3D037009642F4 /* WorkshopTemplatesView.swift in Sources */, - 389497172ED32405008340FA /* ClearSketchDrawingCanvasView.swift in Sources */, C645AEA32EB1B8FC004BFE69 /* DataInitializer.swift in Sources */, 4CA9C6F72ECBA45200CA546B /* KeychyNotification.swift in Sources */, 4CF2A9682F0B91F300BA9FDA /* AnimatedGIFView.swift in Sources */, @@ -2606,36 +2659,28 @@ C6C35F3C2ED2A7BD009642F4 /* Showcase25BoardView.swift in Sources */, 4CEC622D2EAE08DA0099ECEE /* KeyringScene+Setup.swift in Sources */, 38D17A512EBBF88C00F52A88 /* CollectionViewModel+Edit.swift in Sources */, - 4CB82ECB2EB1FD8500B7458B /* PreviewGuiding.swift in Sources */, 4CEC622E2EAE08DA0099ECEE /* KeyringCellScene+Setup.swift in Sources */, C6B5707F2EC206CD0049F969 /* BundleImageCache.swift in Sources */, C645AE9F2EB1055C004BFE69 /* CategoryTabBar.swift in Sources */, 386102422F0F7C8C0045C529 /* KeyringReceiveViewModel.swift in Sources */, 4CEC622F2EAE08DA0099ECEE /* NavigationRouter.swift in Sources */, 4C6530502EBB2A90000F8154 /* LoadingAlert.swift in Sources */, - C6831A342ECEBD4700753DAE /* PhotoSelectSheet.swift in Sources */, 4CEC62302EAE08DA0099ECEE /* KeyringScene+Effects.swift in Sources */, 385425CC2EB3C7CC00A06C02 /* KeyringDetailScene+Setup.swift in Sources */, 4C6530722EBCFD10000F8154 /* BangmarkAlert.swift in Sources */, 389080192ED3F32700D7A49F /* FestivalKeyringDetailView+Sheet.swift in Sources */, - C6C360252ED3C40F009642F4 /* WorkshopMakingKeyringSection.swift in Sources */, 4CEC62312EAE08DA0099ECEE /* KeyringScene+Swipe.swift in Sources */, - 3824B5E52ED352CC00A4BBCB /* ClearSketchCropView.swift in Sources */, 4C004F912F164D5500D9063E /* TabBarManager.swift in Sources */, - 38CE39D42ECE62D100168E4B /* ClearSketchDrawingView.swift in Sources */, C665DDF02EAF08D000CE4495 /* PurchaseManager.swift in Sources */, 4CEC62332EAE08DA0099ECEE /* KeyringBundleItem.swift in Sources */, AA69DD242F14C56F00C0A41C /* BundleViewModel+CRUD.swift in Sources */, - C67B753B2ECC9E6C00D6E3FA /* EffectSelectorView.swift in Sources */, AA3908F82EC8BF0400D87EEC /* BundleDetailView+SaveImage.swift in Sources */, AA0219DE2EB1C041006EF269 /* BundleNameInputView.swift in Sources */, - 4C8426592ED356FD0050B6FE /* SpeechBubbleVM+Effect.swift in Sources */, 4CEC62342EAE08DA0099ECEE /* Spacing.swift in Sources */, 38A596732EAFA8D20003D712 /* KeychyUser.swift in Sources */, 385425CA2EB3C79A00A06C02 /* KeyringDetailScene.swift in Sources */, 4CA9C6D92ECB7B2800CA546B /* TextFilter.swift in Sources */, 3890801B2ED3F3BB00D7A49F /* FestivalKeyringDetailView+Alerts.swift in Sources */, - C6C402862EB26C66006B58DF /* NeonSignPreview.swift in Sources */, C6C35F412ED2B6E6009642F4 /* ShowcaseFestivalKeyring.swift in Sources */, 4CEC61EC2EAE08C00099ECEE /* BodyType.swift in Sources */, C6C361E22ED4AC49009642F4 /* SubmitCompleteAlert.swift in Sources */, @@ -2645,7 +2690,6 @@ 4C8426642ED375840050B6FE /* ColorPalette.swift in Sources */, C6C402A32EB40ACA006B58DF /* AlarmView.swift in Sources */, C6B56F0B2EBC43AC0049F969 /* StoreProduct.swift in Sources */, - 4C6530422EBA7D12000F8154 /* KeyringCustomizingView+PurchaseSheet.swift in Sources */, 38DD90622ED594C00042EB45 /* FestivalKeyringContextMenu.swift in Sources */, AABA4DBD2ED2D6CA00A7D062 /* festivalCard.swift in Sources */, C6B56F2D2EC03A000049F969 /* CachedImagesDebugView.swift in Sources */, diff --git a/Keychy/Keychy/Presentation/KeyringMaker/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Core/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Core/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Shared/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Shared/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/.gitkeep b/Keychy/Keychy/Presentation/KeyringMaker/Templates/.gitkeep deleted file mode 100644 index e69de29bb..000000000 From 0819df78b1e64f5b07e538a068f21898064c6c92 Mon Sep 17 00:00:00 2001 From: giljihun Date: Tue, 20 Jan 2026 20:55:47 +0900 Subject: [PATCH 15/17] =?UTF-8?q?chore:=20KeyringMaker=20=EB=82=B4=20?= =?UTF-8?q?=ED=8F=B4=EB=8D=94=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - COre 제거 --- Keychy/Keychy.xcodeproj/project.pbxproj | 26 ++++--------------- .../KeyringViewModelProtocol+Reset.swift | 0 .../Protocols/KeyringViewModelProtocol.swift | 0 3 files changed, 5 insertions(+), 21 deletions(-) rename Keychy/Keychy/Presentation/KeyringMaker/{Core => Shared}/Protocols/KeyringViewModelProtocol+Reset.swift (100%) rename Keychy/Keychy/Presentation/KeyringMaker/{Core => Shared}/Protocols/KeyringViewModelProtocol.swift (100%) diff --git a/Keychy/Keychy.xcodeproj/project.pbxproj b/Keychy/Keychy.xcodeproj/project.pbxproj index 44f4cd24f..fbe2ac2ca 100644 --- a/Keychy/Keychy.xcodeproj/project.pbxproj +++ b/Keychy/Keychy.xcodeproj/project.pbxproj @@ -197,9 +197,7 @@ 4C4733D72F1FA388005D2376 /* AcrylicPhotoVM+Crop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733522F1FA388005D2376 /* AcrylicPhotoVM+Crop.swift */; }; 4C4733D82F1FA388005D2376 /* AcrylicPhotoPreView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C47335A2F1FA388005D2376 /* AcrylicPhotoPreView.swift */; }; 4C4733D92F1FA388005D2376 /* TemplatePreviewComponents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733392F1FA388005D2376 /* TemplatePreviewComponents.swift */; }; - 4C4733DB2F1FA388005D2376 /* .gitkeep in Resources */ = {isa = PBXBuildFile; fileRef = 4C47334C2F1FA388005D2376 /* .gitkeep */; }; - 4C4733DC2F1FA388005D2376 /* .gitkeep in Resources */ = {isa = PBXBuildFile; fileRef = 4C4733902F1FA388005D2376 /* .gitkeep */; }; - 4C4733DD2F1FA388005D2376 /* .gitkeep in Resources */ = {isa = PBXBuildFile; fileRef = 4C4733312F1FA388005D2376 /* .gitkeep */; }; + 4C4733DF2F1FA44C005D2376 /* KeyringMakerRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733DE2F1FA44C005D2376 /* KeyringMakerRoute.swift */; }; 4C65303B2EBA5FA0000F8154 /* CheckmarkAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C65303A2EBA5FA0000F8154 /* CheckmarkAlert.swift */; }; 4C65303E2EBA6042000F8154 /* ImageSaveAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C65303D2EBA6042000F8154 /* ImageSaveAlert.swift */; }; 4C6530442EBA8077000F8154 /* PurchaseSuccessAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6530432EBA8077000F8154 /* PurchaseSuccessAlert.swift */; }; @@ -561,7 +559,6 @@ 4C4733212F1FA2AB005D2376 /* WorkshopPreview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkshopPreview.swift; sourceTree = ""; }; 4C47332E2F1FA388005D2376 /* KeyringViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyringViewModelProtocol.swift; sourceTree = ""; }; 4C47332F2F1FA388005D2376 /* KeyringViewModelProtocol+Reset.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KeyringViewModelProtocol+Reset.swift"; sourceTree = ""; }; - 4C4733312F1FA388005D2376 /* .gitkeep */ = {isa = PBXFileReference; lastKnownFileType = text; path = .gitkeep; sourceTree = ""; }; 4C4733332F1FA388005D2376 /* AudioRecorderManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioRecorderManager.swift; sourceTree = ""; }; 4C4733342F1FA388005D2376 /* RecordingSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordingSheet.swift; sourceTree = ""; }; 4C4733362F1FA388005D2376 /* CameraPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CameraPicker.swift; sourceTree = ""; }; @@ -583,7 +580,6 @@ 4C4733482F1FA388005D2376 /* KeyringInfoInputView+Helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KeyringInfoInputView+Helpers.swift"; sourceTree = ""; }; 4C4733492F1FA388005D2376 /* KeyringInfoInputView+Sheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KeyringInfoInputView+Sheet.swift"; sourceTree = ""; }; 4C47334A2F1FA388005D2376 /* KeyringInfoInputView+TagManagement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KeyringInfoInputView+TagManagement.swift"; sourceTree = ""; }; - 4C47334C2F1FA388005D2376 /* .gitkeep */ = {isa = PBXFileReference; lastKnownFileType = text; path = .gitkeep; sourceTree = ""; }; 4C47334E2F1FA388005D2376 /* CropModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CropModels.swift; sourceTree = ""; }; 4C4733502F1FA388005D2376 /* AcrylicPhotoVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AcrylicPhotoVM.swift; sourceTree = ""; }; 4C4733512F1FA388005D2376 /* AcrylicPhotoVM+BGRemover.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AcrylicPhotoVM+BGRemover.swift"; sourceTree = ""; }; @@ -631,7 +627,7 @@ 4C47338B2F1FA388005D2376 /* SpeechBubbleFramePreviewView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpeechBubbleFramePreviewView.swift; sourceTree = ""; }; 4C47338C2F1FA388005D2376 /* SpeechBubbleFrameSelectorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpeechBubbleFrameSelectorView.swift; sourceTree = ""; }; 4C47338D2F1FA388005D2376 /* SpeechBubblePreview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpeechBubblePreview.swift; sourceTree = ""; }; - 4C4733902F1FA388005D2376 /* .gitkeep */ = {isa = PBXFileReference; lastKnownFileType = text; path = .gitkeep; sourceTree = ""; }; + 4C4733DE2F1FA44C005D2376 /* KeyringMakerRoute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyringMakerRoute.swift; sourceTree = ""; }; 4C65303A2EBA5FA0000F8154 /* CheckmarkAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckmarkAlert.swift; sourceTree = ""; }; 4C65303D2EBA6042000F8154 /* ImageSaveAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageSaveAlert.swift; sourceTree = ""; }; 4C6530432EBA8077000F8154 /* PurchaseSuccessAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PurchaseSuccessAlert.swift; sourceTree = ""; }; @@ -1129,15 +1125,6 @@ path = Protocols; sourceTree = ""; }; - 4C4733322F1FA388005D2376 /* Core */ = { - isa = PBXGroup; - children = ( - 4C4733302F1FA388005D2376 /* Protocols */, - 4C4733312F1FA388005D2376 /* .gitkeep */, - ); - path = Core; - sourceTree = ""; - }; 4C4733352F1FA388005D2376 /* Recording */ = { isa = PBXGroup; children = ( @@ -1191,10 +1178,10 @@ 4C47334D2F1FA388005D2376 /* Shared */ = { isa = PBXGroup; children = ( + 4C4733302F1FA388005D2376 /* Protocols */, 4C47333A2F1FA388005D2376 /* Components */, 4C47333C2F1FA388005D2376 /* Models */, 4C47334B2F1FA388005D2376 /* Views */, - 4C47334C2F1FA388005D2376 /* .gitkeep */, ); path = Shared; sourceTree = ""; @@ -1401,7 +1388,6 @@ 4C47337A2F1FA388005D2376 /* Pixel */, 4C4733842F1FA388005D2376 /* Polaroid */, 4C47338F2F1FA388005D2376 /* SpeechBubble */, - 4C4733902F1FA388005D2376 /* .gitkeep */, ); path = Templates; sourceTree = ""; @@ -1409,7 +1395,6 @@ 4C4733932F1FA388005D2376 /* KeyringMaker */ = { isa = PBXGroup; children = ( - 4C4733322F1FA388005D2376 /* Core */, 4C47334D2F1FA388005D2376 /* Shared */, 4C4733912F1FA388005D2376 /* Templates */, ); @@ -1799,6 +1784,7 @@ 4CEC620B2EAE08DA0099ECEE /* Routes */ = { isa = PBXGroup; children = ( + 4C4733DE2F1FA44C005D2376 /* KeyringMakerRoute.swift */, 4CEC62072EAE08DA0099ECEE /* HomeRoute.swift */, 4CEC62082EAE08DA0099ECEE /* CollectionRoute.swift */, 4CEC62092EAE08DA0099ECEE /* WorkshopRoute.swift */, @@ -2298,9 +2284,6 @@ buildActionMask = 2147483647; files = ( 4C3688132EC08A3100C64E75 /* HancomMalangMalang-Bold.otf in Resources */, - 4C4733DB2F1FA388005D2376 /* .gitkeep in Resources */, - 4C4733DC2F1FA388005D2376 /* .gitkeep in Resources */, - 4C4733DD2F1FA388005D2376 /* .gitkeep in Resources */, 4C3688142EC08A3100C64E75 /* HancomMalangMalang-Regular.otf in Resources */, 4CEC62962EAE08F70099ECEE /* Assets.xcassets in Resources */, 4C6622052EAE5FC3001760B5 /* SUIT-Bold.otf in Resources */, @@ -2603,6 +2586,7 @@ 4CEC62752EAE08DF0099ECEE /* HomeView.swift in Sources */, 4C6622482EAF9B3A001760B5 /* Haptic.swift in Sources */, 3822DDBE2EBAAC80003125BE /* PurchasePopup.swift in Sources */, + 4C4733DF2F1FA44C005D2376 /* KeyringMakerRoute.swift in Sources */, 4CC3D3CD2EC8AE030009D376 /* KeychyAlert.swift in Sources */, 4CF2A9702F0FB2E100BA9FDA /* AppUpdateManager.swift in Sources */, AA9B2E912EB081750004D31C /* ItemDetailView.swift in Sources */, diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Core/Protocols/KeyringViewModelProtocol+Reset.swift b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Protocols/KeyringViewModelProtocol+Reset.swift similarity index 100% rename from Keychy/Keychy/Presentation/KeyringMaker/Core/Protocols/KeyringViewModelProtocol+Reset.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Shared/Protocols/KeyringViewModelProtocol+Reset.swift diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Core/Protocols/KeyringViewModelProtocol.swift b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Protocols/KeyringViewModelProtocol.swift similarity index 100% rename from Keychy/Keychy/Presentation/KeyringMaker/Core/Protocols/KeyringViewModelProtocol.swift rename to Keychy/Keychy/Presentation/KeyringMaker/Shared/Protocols/KeyringViewModelProtocol.swift From 2fe6f4087ceadf263c5af89f058b1e7bea47200d Mon Sep 17 00:00:00 2001 From: giljihun Date: Tue, 20 Jan 2026 21:20:54 +0900 Subject: [PATCH 16/17] =?UTF-8?q?fix:=20Festival=20->=20Workshop=20?= =?UTF-8?q?=EB=84=A4=EB=B9=84=20=EC=97=B0=EA=B2=B0=20=EB=B0=8F=20=EB=B9=8C?= =?UTF-8?q?=EB=93=9C=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Views/Showcase25Board/Showcase25BoardView+Sheet.swift | 6 ------ .../Views/Showcase25Board/Showcase25BoardView.swift | 1 + Keychy/Keychy/Presentation/Tab/Views/FestivalTab.swift | 4 ++++ Keychy/Keychy/Presentation/Tab/Views/MainTabView.swift | 3 +++ Keychy/Keychy/Presentation/Tab/Views/WorkshopTab.swift | 2 +- 5 files changed, 9 insertions(+), 7 deletions(-) diff --git a/Keychy/Keychy/Presentation/Festival/Views/Showcase25Board/Showcase25BoardView+Sheet.swift b/Keychy/Keychy/Presentation/Festival/Views/Showcase25Board/Showcase25BoardView+Sheet.swift index 30a186ddb..0d4dfd024 100644 --- a/Keychy/Keychy/Presentation/Festival/Views/Showcase25Board/Showcase25BoardView+Sheet.swift +++ b/Keychy/Keychy/Presentation/Festival/Views/Showcase25Board/Showcase25BoardView+Sheet.swift @@ -23,12 +23,6 @@ extension Showcase25BoardView { Button { dismissSheet() viewModel.isFromFestivalTab = true - - viewModel.onKeyringCompleteFromFestival = { workshopRouter in - workshopRouter.reset() - workshopRouter.push(.showcase25BoardView) - } - onNavigateToWorkshop?(.workshopTemplates) } label: { Text("+ 만들기") diff --git a/Keychy/Keychy/Presentation/Festival/Views/Showcase25Board/Showcase25BoardView.swift b/Keychy/Keychy/Presentation/Festival/Views/Showcase25Board/Showcase25BoardView.swift index 87cbb8183..1d2adb844 100644 --- a/Keychy/Keychy/Presentation/Festival/Views/Showcase25Board/Showcase25BoardView.swift +++ b/Keychy/Keychy/Presentation/Festival/Views/Showcase25Board/Showcase25BoardView.swift @@ -20,6 +20,7 @@ struct Showcase25BoardView: View { @State var locationManager = LocationManager() var onNavigateToKeyringMaker: ((KeyringMakerRoute) -> Void)? = nil + var onNavigateToWorkshop: ((WorkshopRoute) -> Void)? = nil var isFromFestivalTab: Bool = false // 회수 확인 Alert diff --git a/Keychy/Keychy/Presentation/Tab/Views/FestivalTab.swift b/Keychy/Keychy/Presentation/Tab/Views/FestivalTab.swift index a94b7e8f8..cf1bee073 100644 --- a/Keychy/Keychy/Presentation/Tab/Views/FestivalTab.swift +++ b/Keychy/Keychy/Presentation/Tab/Views/FestivalTab.swift @@ -12,6 +12,7 @@ struct FestivalTab: View { @Bindable var keyringMakerRouter: NavigationRouter @Bindable var showcaseVM: Showcase25BoardViewModel var onSwitchToKeyringMaker: ((KeyringMakerRoute) -> Void)? = nil + var onSwitchToWorkshop: ((WorkshopRoute) -> Void)? = nil var body: some View { NavigationStack(path: $router.path) { @@ -25,6 +26,9 @@ struct FestivalTab: View { viewModel: showcaseVM, onNavigateToKeyringMaker: { route in onSwitchToKeyringMaker?(route) + }, + onNavigateToWorkshop: { route in + onSwitchToWorkshop?(route) } ) diff --git a/Keychy/Keychy/Presentation/Tab/Views/MainTabView.swift b/Keychy/Keychy/Presentation/Tab/Views/MainTabView.swift index 3e93a8700..f58e440ac 100644 --- a/Keychy/Keychy/Presentation/Tab/Views/MainTabView.swift +++ b/Keychy/Keychy/Presentation/Tab/Views/MainTabView.swift @@ -129,6 +129,9 @@ extension MainTabView { showcaseVM: viewModel.festivalViewModel, onSwitchToKeyringMaker: { route in viewModel.handleSwitchToKeyringMaker(route) + }, + onSwitchToWorkshop: { route in + viewModel.handleSwitchToWorkshop(route) } ) .modifier(TabItemModifier( diff --git a/Keychy/Keychy/Presentation/Tab/Views/WorkshopTab.swift b/Keychy/Keychy/Presentation/Tab/Views/WorkshopTab.swift index a997a08ae..641d9b99b 100644 --- a/Keychy/Keychy/Presentation/Tab/Views/WorkshopTab.swift +++ b/Keychy/Keychy/Presentation/Tab/Views/WorkshopTab.swift @@ -99,7 +99,7 @@ struct WorkshopTab: View { switch route { // MARK: - 재화 구매 (공통) case .coinCharge: - CoinChargeView(keyringMakerRouter: keyringMakerRouter) + CoinChargeView(router: keyringMakerRouter) // MARK: - AcrylicPhoto case .acrylicPhotoPreview: From 11c64c897c89596fd4bf0e39ae764e48b26e6847 Mon Sep 17 00:00:00 2001 From: giljihun Date: Tue, 20 Jan 2026 23:06:12 +0900 Subject: [PATCH 17/17] =?UTF-8?q?refactor:=20dual=20NavigationStack=20?= =?UTF-8?q?=E2=86=92=20=EB=8B=A8=EC=9D=BC=20NavigationStack=20=ED=86=B5?= =?UTF-8?q?=ED=95=A9=20(=EB=A1=A4=EB=B0=B1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 탭바가 프리뷰에서 복귀할때 NavigationRequestObserver 다중 업데이트 충돌 발생 --- Keychy/Keychy.xcodeproj/project.pbxproj | 4 - .../Navigation/Routes/KeyringMakerRoute.swift | 75 ------------ .../Navigation/Routes/WorkshopRoute.swift | 63 +++++++++- .../ViewModels/Showcase25BoardViewModel.swift | 2 +- .../Views/FestivalKeyringDetailView.swift | 1 - .../Showcase25Board/Showcase25BoardView.swift | 9 +- .../TemplatePreviewComponents.swift | 2 +- .../Shared/Views/KeyringCompleteView.swift | 4 +- .../Shared/Views/KeyringCustomizingView.swift | 4 +- .../Shared/Views/KeyringInfoInputView.swift | 4 +- .../Views/AcrylicPhotoCropView.swift | 2 +- .../Views/AcrylicPhotoEditedView.swift | 2 +- .../Views/AcrylicPhotoPreView.swift | 2 +- .../Views/ClearSketchCropView.swift | 2 +- .../Views/ClearSketchDrawingView.swift | 2 +- .../Views/ClearSketchPreview.swift | 2 +- .../NeonSign/Views/NeonSignPreview.swift | 4 +- .../Templates/Pixel/Views/PixelDrawView.swift | 2 +- .../Pixel/Views/PixelPreviewView.swift | 2 +- .../Polaroid/Views/PolaroidPreview.swift | 4 +- .../Views/SpeechBubblePreview.swift | 2 +- .../Tab/ViewModels/MainTabViewModel.swift | 9 +- .../Presentation/Tab/Views/FestivalTab.swift | 5 +- .../Presentation/Tab/Views/MainTabView.swift | 2 - .../Presentation/Tab/Views/WorkshopTab.swift | 109 +++++++----------- .../Components/WorkshopComponents.swift | 12 +- .../Views/Main/WorkshopGridHelpers.swift | 5 - .../Main/WorkshopMainContentSection.swift | 2 - .../Views/Main/WorkshopTemplatesView.swift | 8 +- .../Workshop/Views/Main/WorkshopView.swift | 3 - .../Workshop/Views/MyItemsView.swift | 4 - 31 files changed, 139 insertions(+), 214 deletions(-) delete mode 100644 Keychy/Keychy/Core/Navigation/Routes/KeyringMakerRoute.swift diff --git a/Keychy/Keychy.xcodeproj/project.pbxproj b/Keychy/Keychy.xcodeproj/project.pbxproj index fbe2ac2ca..0cc4926a7 100644 --- a/Keychy/Keychy.xcodeproj/project.pbxproj +++ b/Keychy/Keychy.xcodeproj/project.pbxproj @@ -197,7 +197,6 @@ 4C4733D72F1FA388005D2376 /* AcrylicPhotoVM+Crop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733522F1FA388005D2376 /* AcrylicPhotoVM+Crop.swift */; }; 4C4733D82F1FA388005D2376 /* AcrylicPhotoPreView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C47335A2F1FA388005D2376 /* AcrylicPhotoPreView.swift */; }; 4C4733D92F1FA388005D2376 /* TemplatePreviewComponents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733392F1FA388005D2376 /* TemplatePreviewComponents.swift */; }; - 4C4733DF2F1FA44C005D2376 /* KeyringMakerRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4733DE2F1FA44C005D2376 /* KeyringMakerRoute.swift */; }; 4C65303B2EBA5FA0000F8154 /* CheckmarkAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C65303A2EBA5FA0000F8154 /* CheckmarkAlert.swift */; }; 4C65303E2EBA6042000F8154 /* ImageSaveAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C65303D2EBA6042000F8154 /* ImageSaveAlert.swift */; }; 4C6530442EBA8077000F8154 /* PurchaseSuccessAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6530432EBA8077000F8154 /* PurchaseSuccessAlert.swift */; }; @@ -627,7 +626,6 @@ 4C47338B2F1FA388005D2376 /* SpeechBubbleFramePreviewView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpeechBubbleFramePreviewView.swift; sourceTree = ""; }; 4C47338C2F1FA388005D2376 /* SpeechBubbleFrameSelectorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpeechBubbleFrameSelectorView.swift; sourceTree = ""; }; 4C47338D2F1FA388005D2376 /* SpeechBubblePreview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpeechBubblePreview.swift; sourceTree = ""; }; - 4C4733DE2F1FA44C005D2376 /* KeyringMakerRoute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyringMakerRoute.swift; sourceTree = ""; }; 4C65303A2EBA5FA0000F8154 /* CheckmarkAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckmarkAlert.swift; sourceTree = ""; }; 4C65303D2EBA6042000F8154 /* ImageSaveAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageSaveAlert.swift; sourceTree = ""; }; 4C6530432EBA8077000F8154 /* PurchaseSuccessAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PurchaseSuccessAlert.swift; sourceTree = ""; }; @@ -1784,7 +1782,6 @@ 4CEC620B2EAE08DA0099ECEE /* Routes */ = { isa = PBXGroup; children = ( - 4C4733DE2F1FA44C005D2376 /* KeyringMakerRoute.swift */, 4CEC62072EAE08DA0099ECEE /* HomeRoute.swift */, 4CEC62082EAE08DA0099ECEE /* CollectionRoute.swift */, 4CEC62092EAE08DA0099ECEE /* WorkshopRoute.swift */, @@ -2586,7 +2583,6 @@ 4CEC62752EAE08DF0099ECEE /* HomeView.swift in Sources */, 4C6622482EAF9B3A001760B5 /* Haptic.swift in Sources */, 3822DDBE2EBAAC80003125BE /* PurchasePopup.swift in Sources */, - 4C4733DF2F1FA44C005D2376 /* KeyringMakerRoute.swift in Sources */, 4CC3D3CD2EC8AE030009D376 /* KeychyAlert.swift in Sources */, 4CF2A9702F0FB2E100BA9FDA /* AppUpdateManager.swift in Sources */, AA9B2E912EB081750004D31C /* ItemDetailView.swift in Sources */, diff --git a/Keychy/Keychy/Core/Navigation/Routes/KeyringMakerRoute.swift b/Keychy/Keychy/Core/Navigation/Routes/KeyringMakerRoute.swift deleted file mode 100644 index 933e174f2..000000000 --- a/Keychy/Keychy/Core/Navigation/Routes/KeyringMakerRoute.swift +++ /dev/null @@ -1,75 +0,0 @@ -// -// KeyringMakerRoute.swift -// Keychy -// -// 키링 제작 모듈 라우팅 -// - -import Foundation - -/// 키링 제작(KeyringMaker) 모듈 라우팅 -enum KeyringMakerRoute: Hashable { - // MARK: - 아크릴 포토 템플릿 - case acrylicPhotoPreview - case acrylicPhotoCrop - case acrylicPhotoEdited - case acrylicPhotoCustomizing - case acrylicPhotoInfoInput - case acrylicPhotoComplete - - // MARK: - 네온 사인 템플릿 - case neonSignPreview - case neonSignCustomizing - case neonSignInfoInput - case neonSignComplete - - // MARK: - 폴라로이드 템플릿 - case polaroidPreview - case polaroidCustomizing - case polaroidInfoInput - case polaroidComplete - - // MARK: - 클리어 스케치 템플릿 - case clearSketchPreview - case clearSketchDrawing - case clearSketchCrop - case clearSketchCustomizing - case clearSketchInfoInput - case clearSketchComplete - - // MARK: - 픽셀 키링 템플릿 - case pixelPreview - case pixelDraw - case pixelCustomizing - case pixelInfoInput - case pixelComplete - - // MARK: - 말풍선 키링 템플릿 - case speechBubblePreview - case speechBubbleCustomizing - case speechBubbleInfoInput - case speechBubbleComplete - - // MARK: - 공통 - case coinCharge - - /// template.id 문자열을 KeyringMakerRoute로 변환 - static func from(string: String) -> KeyringMakerRoute? { - switch string { - case "AcrylicPhoto": - return .acrylicPhotoPreview - case "NeonSign": - return .neonSignPreview - case "Polaroid": - return .polaroidPreview - case "ClearSketch": - return .clearSketchPreview - case "PixelKeyring": - return .pixelPreview - case "SpeechBubble": - return .speechBubblePreview - default: - return nil - } - } -} diff --git a/Keychy/Keychy/Core/Navigation/Routes/WorkshopRoute.swift b/Keychy/Keychy/Core/Navigation/Routes/WorkshopRoute.swift index 04059f15a..64c061733 100644 --- a/Keychy/Keychy/Core/Navigation/Routes/WorkshopRoute.swift +++ b/Keychy/Keychy/Core/Navigation/Routes/WorkshopRoute.swift @@ -6,7 +6,7 @@ // import Foundation -/// 공방 탭 라우팅 (마켓플레이스 기능) +/// 공방 탭 라우팅 (마켓플레이스 + 키링 제작) enum WorkshopRoute: Hashable { // MARK: - 공방 마켓플레이스 case workshopPreview(item: AnyHashable) @@ -17,4 +17,65 @@ enum WorkshopRoute: Hashable { // MARK: - Festival 임시 라우트 (추후 정리 예정) case showcase25BoardView case festivalKeyringDetailView(Keyring) + + // MARK: - 아크릴 포토 템플릿 + case acrylicPhotoPreview + case acrylicPhotoCrop + case acrylicPhotoEdited + case acrylicPhotoCustomizing + case acrylicPhotoInfoInput + case acrylicPhotoComplete + + // MARK: - 네온 사인 템플릿 + case neonSignPreview + case neonSignCustomizing + case neonSignInfoInput + case neonSignComplete + + // MARK: - 폴라로이드 템플릿 + case polaroidPreview + case polaroidCustomizing + case polaroidInfoInput + case polaroidComplete + + // MARK: - 클리어 스케치 템플릿 + case clearSketchPreview + case clearSketchDrawing + case clearSketchCrop + case clearSketchCustomizing + case clearSketchInfoInput + case clearSketchComplete + + // MARK: - 픽셀 키링 템플릿 + case pixelPreview + case pixelDraw + case pixelCustomizing + case pixelInfoInput + case pixelComplete + + // MARK: - 말풍선 키링 템플릿 + case speechBubblePreview + case speechBubbleCustomizing + case speechBubbleInfoInput + case speechBubbleComplete + + /// template.id 문자열을 WorkshopRoute로 변환 + static func from(string: String) -> WorkshopRoute? { + switch string { + case "AcrylicPhoto": + return .acrylicPhotoPreview + case "NeonSign": + return .neonSignPreview + case "Polaroid": + return .polaroidPreview + case "ClearSketch": + return .clearSketchPreview + case "PixelKeyring": + return .pixelPreview + case "SpeechBubble": + return .speechBubblePreview + default: + return nil + } + } } diff --git a/Keychy/Keychy/Presentation/Festival/ViewModels/Showcase25BoardViewModel.swift b/Keychy/Keychy/Presentation/Festival/ViewModels/Showcase25BoardViewModel.swift index 5620590e0..023d07da6 100644 --- a/Keychy/Keychy/Presentation/Festival/ViewModels/Showcase25BoardViewModel.swift +++ b/Keychy/Keychy/Presentation/Festival/ViewModels/Showcase25BoardViewModel.swift @@ -22,7 +22,7 @@ class Showcase25BoardViewModel { // MARK: - Festival에서 KeyringMaker로 갔을 때 사용 var isFromFestivalTab: Bool = false - var onKeyringCompleteFromFestival: ((NavigationRouter) -> Void)? + var onKeyringCompleteFromFestival: ((NavigationRouter) -> Void)? // MARK: - 선택된 키링 디테일 var selectedShowcaseKeyring: ShowcaseFestivalKeyring? diff --git a/Keychy/Keychy/Presentation/Festival/Views/FestivalKeyringDetailView.swift b/Keychy/Keychy/Presentation/Festival/Views/FestivalKeyringDetailView.swift index 7d272cbc3..bf1e6b5b3 100644 --- a/Keychy/Keychy/Presentation/Festival/Views/FestivalKeyringDetailView.swift +++ b/Keychy/Keychy/Presentation/Festival/Views/FestivalKeyringDetailView.swift @@ -12,7 +12,6 @@ import Photos struct FestivalKeyringDetailView: View { @Bindable var festivalRouter: NavigationRouter - @Bindable var keyringMakerRouter: NavigationRouter @Bindable var viewModel: Showcase25BoardViewModel @State var userManager = UserManager.shared diff --git a/Keychy/Keychy/Presentation/Festival/Views/Showcase25Board/Showcase25BoardView.swift b/Keychy/Keychy/Presentation/Festival/Views/Showcase25Board/Showcase25BoardView.swift index 1d2adb844..dcd9ceb1f 100644 --- a/Keychy/Keychy/Presentation/Festival/Views/Showcase25Board/Showcase25BoardView.swift +++ b/Keychy/Keychy/Presentation/Festival/Views/Showcase25Board/Showcase25BoardView.swift @@ -10,16 +10,15 @@ import NukeUI import FirebaseFirestore struct Showcase25BoardView: View { - + @Bindable var festivalRouter: NavigationRouter - @Bindable var keyringMakerRouter: NavigationRouter @Bindable var viewModel: Showcase25BoardViewModel @Environment(\.scenePhase) private var scenePhase - + // 위치 기반 체크용 @State var locationManager = LocationManager() - - var onNavigateToKeyringMaker: ((KeyringMakerRoute) -> Void)? = nil + + var onNavigateToKeyringMaker: ((WorkshopRoute) -> Void)? = nil var onNavigateToWorkshop: ((WorkshopRoute) -> Void)? = nil var isFromFestivalTab: Bool = false diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Shared/Components/TemplatePreviewComponents.swift b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Components/TemplatePreviewComponents.swift index c0c2a4005..dbe84bcee 100644 --- a/Keychy/Keychy/Presentation/KeyringMaker/Shared/Components/TemplatePreviewComponents.swift +++ b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Components/TemplatePreviewComponents.swift @@ -15,7 +15,7 @@ struct TemplatePreviewBody: View { let fetchTemplate: () async -> Void let onMake: () -> Void var onPurchase: (() -> Void)? = nil - var router: NavigationRouter? = nil + var router: NavigationRouter? = nil @Environment(UserManager.self) private var userManager diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringCompleteView.swift b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringCompleteView.swift index 9fca0d30d..ae0a25c42 100644 --- a/Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringCompleteView.swift +++ b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringCompleteView.swift @@ -11,7 +11,7 @@ import SpriteKit import FirebaseFirestore struct KeyringCompleteView: View { - @Bindable var router: NavigationRouter + @Bindable var router: NavigationRouter @Bindable var viewModel: VM let navigationTitle: String @@ -19,7 +19,7 @@ struct KeyringCompleteView: View { var reviewManager: ReviewManager = ReviewManager.shared // Festival에서 왔을 때 처리용 옵셔널 콜백 - var onCloseFromFestival: ((NavigationRouter) -> Void)? + var onCloseFromFestival: ((NavigationRouter) -> Void)? // 이미지 저장 @State var showImageSaved = false diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringCustomizingView.swift b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringCustomizingView.swift index 96882a322..56e28888d 100644 --- a/Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringCustomizingView.swift +++ b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringCustomizingView.swift @@ -12,9 +12,9 @@ import SpriteKit import Lottie struct KeyringCustomizingView: View { - @Bindable var router: NavigationRouter + @Bindable var router: NavigationRouter @State var viewModel: VM - let nextRoute: KeyringMakerRoute + let nextRoute: WorkshopRoute // 뒤로가기 시 팝만 하는 템플릿들 (초기화 경고 없음) let popOnlyTemplates = ["ClearSketch", "PixelKeyring"] diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringInfoInputView.swift b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringInfoInputView.swift index 2e3389d38..4f3f6a462 100644 --- a/Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringInfoInputView.swift +++ b/Keychy/Keychy/Presentation/KeyringMaker/Shared/Views/KeyringInfoInputView.swift @@ -12,9 +12,9 @@ import Combine import FirebaseFirestore struct KeyringInfoInputView: View { - @Bindable var router: NavigationRouter + @Bindable var router: NavigationRouter @Bindable var viewModel: VM - let nextRoute: KeyringMakerRoute + let nextRoute: WorkshopRoute // UserManager 주입 var userManager: UserManager = UserManager.shared diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/Views/AcrylicPhotoCropView.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/Views/AcrylicPhotoCropView.swift index d61ef5c03..98c2ec39b 100644 --- a/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/Views/AcrylicPhotoCropView.swift +++ b/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/Views/AcrylicPhotoCropView.swift @@ -1,7 +1,7 @@ import SwiftUI struct AcrylicPhotoCropView: View { - @Bindable var router: NavigationRouter + @Bindable var router: NavigationRouter @Bindable var viewModel: AcrylicPhotoVM @State private var isImageLoading = true diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/Views/AcrylicPhotoEditedView.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/Views/AcrylicPhotoEditedView.swift index c64fd89a1..1559368c8 100644 --- a/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/Views/AcrylicPhotoEditedView.swift +++ b/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/Views/AcrylicPhotoEditedView.swift @@ -10,7 +10,7 @@ import SwiftUI struct AcrylicPhotoEditedView: View { // MARK: - Dependencies - @Bindable var router: NavigationRouter + @Bindable var router: NavigationRouter @Bindable var viewModel: AcrylicPhotoVM // MARK: - Animation States diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/Views/AcrylicPhotoPreView.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/Views/AcrylicPhotoPreView.swift index 4f5855f56..950da3fc0 100644 --- a/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/Views/AcrylicPhotoPreView.swift +++ b/Keychy/Keychy/Presentation/KeyringMaker/Templates/AcrylicPhoto/Views/AcrylicPhotoPreView.swift @@ -9,7 +9,7 @@ import SwiftUI import PhotosUI struct AcrylicPhotoPreView: View { - @Bindable var router: NavigationRouter + @Bindable var router: NavigationRouter @State var viewModel: AcrylicPhotoVM @Environment(UserManager.self) private var userManager @State private var selectedItem: PhotosPickerItem? diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/Views/ClearSketchCropView.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/Views/ClearSketchCropView.swift index 8d865975c..52a661324 100644 --- a/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/Views/ClearSketchCropView.swift +++ b/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/Views/ClearSketchCropView.swift @@ -8,7 +8,7 @@ import SwiftUI struct ClearSketchCropView: View { - @Bindable var router: NavigationRouter + @Bindable var router: NavigationRouter @Bindable var viewModel: ClearSketchVM @State private var cropPaths: [CropPath] = [] diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/Views/ClearSketchDrawingView.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/Views/ClearSketchDrawingView.swift index 6c4131e92..2e70bb67c 100644 --- a/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/Views/ClearSketchDrawingView.swift +++ b/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/Views/ClearSketchDrawingView.swift @@ -8,7 +8,7 @@ import SwiftUI struct ClearSketchDrawingView: View { - @Bindable var router: NavigationRouter + @Bindable var router: NavigationRouter @Bindable var viewModel: ClearSketchVM /// 팔레트 표시 여부 (그리기 모드일 때만 표시) diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/Views/ClearSketchPreview.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/Views/ClearSketchPreview.swift index eae7d4850..b3735dc59 100644 --- a/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/Views/ClearSketchPreview.swift +++ b/Keychy/Keychy/Presentation/KeyringMaker/Templates/ClearSketch/Views/ClearSketchPreview.swift @@ -8,7 +8,7 @@ import SwiftUI struct ClearSketchPreview: View { - @Bindable var router: NavigationRouter + @Bindable var router: NavigationRouter @State var viewModel: ClearSketchVM @Environment(UserManager.self) private var userManager diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/Views/NeonSignPreview.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/Views/NeonSignPreview.swift index 6ca72310c..55aab78a6 100644 --- a/Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/Views/NeonSignPreview.swift +++ b/Keychy/Keychy/Presentation/KeyringMaker/Templates/NeonSign/Views/NeonSignPreview.swift @@ -8,7 +8,7 @@ import SwiftUI struct NeonSignPreView: View { - @Bindable var router: NavigationRouter + @Bindable var router: NavigationRouter @State var viewModel: NeonSignVM var body: some View { @@ -26,7 +26,7 @@ struct NeonSignPreView: View { #Preview { NeonSignPreView( - router: NavigationRouter(), + router: NavigationRouter(), viewModel: NeonSignVM() ) .environment(UserManager.shared) diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/Views/PixelDrawView.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/Views/PixelDrawView.swift index 38f302ebd..70e08d0e4 100644 --- a/Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/Views/PixelDrawView.swift +++ b/Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/Views/PixelDrawView.swift @@ -8,7 +8,7 @@ import SwiftUI struct PixelDrawView: View { - @Bindable var router: NavigationRouter + @Bindable var router: NavigationRouter @Bindable var viewModel: PixelVM /// 팔레트 표시 여부 (그리기 모드일 때만 표시) diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/Views/PixelPreviewView.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/Views/PixelPreviewView.swift index 4df0e584f..159e8d2bb 100644 --- a/Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/Views/PixelPreviewView.swift +++ b/Keychy/Keychy/Presentation/KeyringMaker/Templates/Pixel/Views/PixelPreviewView.swift @@ -8,7 +8,7 @@ import SwiftUI struct PixelPreviewView: View { - @Bindable var router: NavigationRouter + @Bindable var router: NavigationRouter @State var viewModel: PixelVM @Environment(UserManager.self) private var userManager diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/Views/PolaroidPreview.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/Views/PolaroidPreview.swift index 9a4cd2b2b..f874ba26b 100644 --- a/Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/Views/PolaroidPreview.swift +++ b/Keychy/Keychy/Presentation/KeyringMaker/Templates/Polaroid/Views/PolaroidPreview.swift @@ -8,7 +8,7 @@ import SwiftUI struct PolaroidPreview: View { - @Bindable var router: NavigationRouter + @Bindable var router: NavigationRouter @State var viewModel: PolaroidVM var body: some View { @@ -29,7 +29,7 @@ struct PolaroidPreview: View { #Preview { PolaroidPreview( - router: NavigationRouter(), + router: NavigationRouter(), viewModel: PolaroidVM() ) .environment(UserManager.shared) diff --git a/Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/Views/SpeechBubblePreview.swift b/Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/Views/SpeechBubblePreview.swift index 892a25f9d..df8b4a0f1 100644 --- a/Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/Views/SpeechBubblePreview.swift +++ b/Keychy/Keychy/Presentation/KeyringMaker/Templates/SpeechBubble/Views/SpeechBubblePreview.swift @@ -10,7 +10,7 @@ import SwiftUI struct SpeechBubblePreview: View { - @Bindable var router: NavigationRouter + @Bindable var router: NavigationRouter @State var viewModel: SpeechBubbleVM var body: some View { diff --git a/Keychy/Keychy/Presentation/Tab/ViewModels/MainTabViewModel.swift b/Keychy/Keychy/Presentation/Tab/ViewModels/MainTabViewModel.swift index 6524aff45..4dd070ed2 100644 --- a/Keychy/Keychy/Presentation/Tab/ViewModels/MainTabViewModel.swift +++ b/Keychy/Keychy/Presentation/Tab/ViewModels/MainTabViewModel.swift @@ -36,7 +36,6 @@ class MainTabViewModel { var homeRouter = NavigationRouter() var collectionRouter = NavigationRouter() var workshopRouter = NavigationRouter() - var keyringMakerRouter = NavigationRouter() var festivalRouter = NavigationRouter() // Sheets @@ -92,14 +91,14 @@ class MainTabViewModel { } /// Festival 탭에서 KeyringMaker로 전환하고 특정 라우트로 이동 - /// - Parameter route: 이동할 KeyringMakerRoute - func handleSwitchToKeyringMaker(_ route: KeyringMakerRoute) { + /// - Parameter route: 이동할 WorkshopRoute (키링 제작 라우트) + func handleSwitchToKeyringMaker(_ route: WorkshopRoute) { setupFestivalReturnCallback() selectedTab = TabIndex.workshop.rawValue Task { @MainActor in try? await Task.sleep(for: .seconds(Delay.tabSwitchAnimation)) - keyringMakerRouter.push(route) + workshopRouter.push(route) } } @@ -107,7 +106,7 @@ class MainTabViewModel { /// Festival → KeyringMaker 이동 시 완료 후 복귀 콜백 설정 private func setupFestivalReturnCallback() { festivalViewModel.isFromFestivalTab = true - festivalViewModel.onKeyringCompleteFromFestival = { [weak self] router in + festivalViewModel.onKeyringCompleteFromFestival = { [weak self] (router: NavigationRouter) in guard let self = self else { return } router.reset() self.selectedTab = TabIndex.festival.rawValue diff --git a/Keychy/Keychy/Presentation/Tab/Views/FestivalTab.swift b/Keychy/Keychy/Presentation/Tab/Views/FestivalTab.swift index cf1bee073..202e52d1a 100644 --- a/Keychy/Keychy/Presentation/Tab/Views/FestivalTab.swift +++ b/Keychy/Keychy/Presentation/Tab/Views/FestivalTab.swift @@ -9,9 +9,8 @@ import SwiftUI struct FestivalTab: View { @Bindable var router: NavigationRouter - @Bindable var keyringMakerRouter: NavigationRouter @Bindable var showcaseVM: Showcase25BoardViewModel - var onSwitchToKeyringMaker: ((KeyringMakerRoute) -> Void)? = nil + var onSwitchToKeyringMaker: ((WorkshopRoute) -> Void)? = nil var onSwitchToWorkshop: ((WorkshopRoute) -> Void)? = nil var body: some View { @@ -22,7 +21,6 @@ struct FestivalTab: View { case .showcase25BoardView: Showcase25BoardView( festivalRouter: router, - keyringMakerRouter: keyringMakerRouter, viewModel: showcaseVM, onNavigateToKeyringMaker: { route in onSwitchToKeyringMaker?(route) @@ -37,7 +35,6 @@ struct FestivalTab: View { case .festivalKeyringDetailView(let keyring): FestivalKeyringDetailView( festivalRouter: router, - keyringMakerRouter: keyringMakerRouter, viewModel: showcaseVM, keyring: keyring ) diff --git a/Keychy/Keychy/Presentation/Tab/Views/MainTabView.swift b/Keychy/Keychy/Presentation/Tab/Views/MainTabView.swift index f58e440ac..cf7f89c9b 100644 --- a/Keychy/Keychy/Presentation/Tab/Views/MainTabView.swift +++ b/Keychy/Keychy/Presentation/Tab/Views/MainTabView.swift @@ -99,7 +99,6 @@ extension MainTabView { private var workshopTab: some View { WorkshopTab( router: viewModel.workshopRouter, - keyringMakerRouter: viewModel.keyringMakerRouter, festivalRouter: viewModel.festivalRouter, festivalVM: viewModel.festivalViewModel ) @@ -125,7 +124,6 @@ extension MainTabView { private var festivalTab: some View { FestivalTab( router: viewModel.festivalRouter, - keyringMakerRouter: viewModel.keyringMakerRouter, showcaseVM: viewModel.festivalViewModel, onSwitchToKeyringMaker: { route in viewModel.handleSwitchToKeyringMaker(route) diff --git a/Keychy/Keychy/Presentation/Tab/Views/WorkshopTab.swift b/Keychy/Keychy/Presentation/Tab/Views/WorkshopTab.swift index 641d9b99b..5e142c549 100644 --- a/Keychy/Keychy/Presentation/Tab/Views/WorkshopTab.swift +++ b/Keychy/Keychy/Presentation/Tab/Views/WorkshopTab.swift @@ -9,7 +9,6 @@ import SwiftUI struct WorkshopTab: View { @Bindable var router: NavigationRouter - @Bindable var keyringMakerRouter: NavigationRouter @Bindable var festivalRouter: NavigationRouter @Bindable var festivalVM: Showcase25BoardViewModel @@ -22,36 +21,21 @@ struct WorkshopTab: View { @State private var workshopViewModel = WorkshopViewModel(userManager: UserManager.shared) var body: some View { - ZStack { - // MARK: - Workshop (마켓플레이스) NavigationStack - NavigationStack(path: $router.path) { - WorkshopView( - router: router, - keyringMakerRouter: keyringMakerRouter, - viewModel: workshopViewModel - ) - .navigationDestination(for: WorkshopRoute.self) { route in - workshopDestination(for: route) - } - } - .tint(.black) - - // MARK: - KeyringMaker (제작 플로우) NavigationStack - if !keyringMakerRouter.path.isEmpty { - NavigationStack(path: $keyringMakerRouter.path) { - EmptyView() - .navigationDestination(for: KeyringMakerRoute.self) { route in - keyringMakerDestination(for: route) - } - } - .tint(.black) + NavigationStack(path: $router.path) { + WorkshopView( + router: router, + viewModel: workshopViewModel + ) + .navigationDestination(for: WorkshopRoute.self) { route in + destination(for: route) } } + .tint(.black) } - // MARK: - Workshop Destinations + // MARK: - Destinations @ViewBuilder - private func workshopDestination(for route: WorkshopRoute) -> some View { + private func destination(for route: WorkshopRoute) -> some View { switch route { // MARK: - 공통 프리뷰 case .workshopPreview(let item): @@ -73,7 +57,7 @@ struct WorkshopTab: View { // MARK: - 템플릿 목록뷰 case .workshopTemplates: - WorkshopTemplatesView(router: router, keyringMakerRouter: keyringMakerRouter) + WorkshopTemplatesView(router: router) // MARK: - 재화 구매뷰 case .coinCharge: @@ -81,48 +65,37 @@ struct WorkshopTab: View { // MARK: - 쇼케이스용 페스티벌 임시 라우트 case .showcase25BoardView: - Showcase25BoardView(festivalRouter: festivalRouter, keyringMakerRouter: keyringMakerRouter, viewModel: festivalVM) + Showcase25BoardView(festivalRouter: festivalRouter, viewModel: festivalVM) case .festivalKeyringDetailView(let keyring): FestivalKeyringDetailView( festivalRouter: festivalRouter, - keyringMakerRouter: keyringMakerRouter, viewModel: festivalVM, keyring: keyring ) - } - } - - // MARK: - KeyringMaker Destinations - @ViewBuilder - private func keyringMakerDestination(for route: KeyringMakerRoute) -> some View { - switch route { - // MARK: - 재화 구매 (공통) - case .coinCharge: - CoinChargeView(router: keyringMakerRouter) // MARK: - AcrylicPhoto case .acrylicPhotoPreview: - AcrylicPhotoPreView(router: keyringMakerRouter, viewModel: getAcrylicPhotoVM()) + AcrylicPhotoPreView(router: router, viewModel: getAcrylicPhotoVM()) case .acrylicPhotoCrop: - AcrylicPhotoCropView(router: keyringMakerRouter, viewModel: getAcrylicPhotoVM()) + AcrylicPhotoCropView(router: router, viewModel: getAcrylicPhotoVM()) case .acrylicPhotoEdited: - AcrylicPhotoEditedView(router: keyringMakerRouter, viewModel: getAcrylicPhotoVM()) + AcrylicPhotoEditedView(router: router, viewModel: getAcrylicPhotoVM()) case .acrylicPhotoCustomizing: KeyringCustomizingView( - router: keyringMakerRouter, + router: router, viewModel: getAcrylicPhotoVM(), nextRoute: .acrylicPhotoInfoInput ) case .acrylicPhotoInfoInput: KeyringInfoInputView( - router: keyringMakerRouter, + router: router, viewModel: getAcrylicPhotoVM(), nextRoute: .acrylicPhotoComplete ) case .acrylicPhotoComplete: KeyringCompleteView( - router: keyringMakerRouter, + router: router, viewModel: getAcrylicPhotoVM(), navigationTitle: "키링이 완성되었어요!", onCloseFromFestival: festivalVM.isFromFestivalTab ? { router in @@ -132,22 +105,22 @@ struct WorkshopTab: View { // MARK: - NeonSign case .neonSignPreview: - NeonSignPreView(router: keyringMakerRouter, viewModel: getNeonSignVM()) + NeonSignPreView(router: router, viewModel: getNeonSignVM()) case .neonSignCustomizing: KeyringCustomizingView( - router: keyringMakerRouter, + router: router, viewModel: getNeonSignVM(), nextRoute: .neonSignInfoInput ) case .neonSignInfoInput: KeyringInfoInputView( - router: keyringMakerRouter, + router: router, viewModel: getNeonSignVM(), nextRoute: .neonSignComplete ) case .neonSignComplete: KeyringCompleteView( - router: keyringMakerRouter, + router: router, viewModel: getNeonSignVM(), navigationTitle: "키링이 완성되었어요!", onCloseFromFestival: festivalVM.isFromFestivalTab ? { router in @@ -157,22 +130,22 @@ struct WorkshopTab: View { // MARK: - Polaroid case .polaroidPreview: - PolaroidPreview(router: keyringMakerRouter, viewModel: getPolaroidVM()) + PolaroidPreview(router: router, viewModel: getPolaroidVM()) case .polaroidCustomizing: KeyringCustomizingView( - router: keyringMakerRouter, + router: router, viewModel: getPolaroidVM(), nextRoute: .polaroidInfoInput ) case .polaroidInfoInput: KeyringInfoInputView( - router: keyringMakerRouter, + router: router, viewModel: getPolaroidVM(), nextRoute: .polaroidComplete ) case .polaroidComplete: KeyringCompleteView( - router: keyringMakerRouter, + router: router, viewModel: getPolaroidVM(), navigationTitle: "키링이 완성되었어요!", onCloseFromFestival: festivalVM.isFromFestivalTab ? { router in @@ -182,26 +155,26 @@ struct WorkshopTab: View { // MARK: - ClearSketch case .clearSketchPreview: - ClearSketchPreview(router: keyringMakerRouter, viewModel: getClearSketchVM()) + ClearSketchPreview(router: router, viewModel: getClearSketchVM()) case .clearSketchDrawing: - ClearSketchDrawingView(router: keyringMakerRouter, viewModel: getClearSketchVM()) + ClearSketchDrawingView(router: router, viewModel: getClearSketchVM()) case .clearSketchCrop: - ClearSketchCropView(router: keyringMakerRouter, viewModel: getClearSketchVM()) + ClearSketchCropView(router: router, viewModel: getClearSketchVM()) case .clearSketchCustomizing: KeyringCustomizingView( - router: keyringMakerRouter, + router: router, viewModel: getClearSketchVM(), nextRoute: .clearSketchInfoInput ) case .clearSketchInfoInput: KeyringInfoInputView( - router: keyringMakerRouter, + router: router, viewModel: getClearSketchVM(), nextRoute: .clearSketchComplete ) case .clearSketchComplete: KeyringCompleteView( - router: keyringMakerRouter, + router: router, viewModel: getClearSketchVM(), navigationTitle: "키링이 완성되었어요!", onCloseFromFestival: festivalVM.isFromFestivalTab ? { router in @@ -211,24 +184,24 @@ struct WorkshopTab: View { // MARK: - Pixel case .pixelPreview: - PixelPreviewView(router: keyringMakerRouter, viewModel: getPixelKeyringVM()) + PixelPreviewView(router: router, viewModel: getPixelKeyringVM()) case .pixelDraw: - PixelDrawView(router: keyringMakerRouter, viewModel: getPixelKeyringVM()) + PixelDrawView(router: router, viewModel: getPixelKeyringVM()) case .pixelCustomizing: KeyringCustomizingView( - router: keyringMakerRouter, + router: router, viewModel: getPixelKeyringVM(), nextRoute: .pixelInfoInput ) case .pixelInfoInput: KeyringInfoInputView( - router: keyringMakerRouter, + router: router, viewModel: getPixelKeyringVM(), nextRoute: .pixelComplete ) case .pixelComplete: KeyringCompleteView( - router: keyringMakerRouter, + router: router, viewModel: getPixelKeyringVM(), navigationTitle: "키링이 완성되었어요!", onCloseFromFestival: festivalVM.isFromFestivalTab ? { router in @@ -238,22 +211,22 @@ struct WorkshopTab: View { // MARK: - SpeechBubble case .speechBubblePreview: - SpeechBubblePreview(router: keyringMakerRouter, viewModel: getSpeechBubbleVM()) + SpeechBubblePreview(router: router, viewModel: getSpeechBubbleVM()) case .speechBubbleCustomizing: KeyringCustomizingView( - router: keyringMakerRouter, + router: router, viewModel: getSpeechBubbleVM(), nextRoute: .speechBubbleInfoInput ) case .speechBubbleInfoInput: KeyringInfoInputView( - router: keyringMakerRouter, + router: router, viewModel: getSpeechBubbleVM(), nextRoute: .speechBubbleComplete ) case .speechBubbleComplete: KeyringCompleteView( - router: keyringMakerRouter, + router: router, viewModel: getSpeechBubbleVM(), navigationTitle: "키링이 완성되었어요!", onCloseFromFestival: festivalVM.isFromFestivalTab ? { router in diff --git a/Keychy/Keychy/Presentation/Workshop/Components/WorkshopComponents.swift b/Keychy/Keychy/Presentation/Workshop/Components/WorkshopComponents.swift index 2dd74fb6d..fe9a5f308 100644 --- a/Keychy/Keychy/Presentation/Workshop/Components/WorkshopComponents.swift +++ b/Keychy/Keychy/Presentation/Workshop/Components/WorkshopComponents.swift @@ -120,7 +120,6 @@ struct WorkshopItemView: View { let item: Item var isOwned: Bool = false var router: NavigationRouter? = nil - var keyringMakerRouter: NavigationRouter? = nil var viewModel: WorkshopViewModel? = nil @State private var isParticleReady = false @@ -206,18 +205,17 @@ struct WorkshopItemView: View { return } - // 키링일 경우 KeyringMakerRouter를 사용하여 해당 키링 Preview로 이동 + guard let router = router else { return } + + // 키링 템플릿일 경우 해당 Preview로 이동 if let template = item as? KeyringTemplate, let templateId = template.id, - let route = KeyringMakerRoute.from(string: templateId), - let keyringMakerRouter = keyringMakerRouter { - keyringMakerRouter.push(route) + let route = WorkshopRoute.from(string: templateId) { + router.push(route) return } // 나머지 아이템들은 WorkshopPreview로 이동 - guard let router = router else { return } - if let background = item as? Background { router.push(.workshopPreview(item: AnyHashable(background))) } else if let carabiner = item as? Carabiner { diff --git a/Keychy/Keychy/Presentation/Workshop/Views/Main/WorkshopGridHelpers.swift b/Keychy/Keychy/Presentation/Workshop/Views/Main/WorkshopGridHelpers.swift index f5ce9a571..d39bdeeb6 100644 --- a/Keychy/Keychy/Presentation/Workshop/Views/Main/WorkshopGridHelpers.swift +++ b/Keychy/Keychy/Presentation/Workshop/Views/Main/WorkshopGridHelpers.swift @@ -15,7 +15,6 @@ struct WorkshopGridHelpers { items: [T], isOwnedCheck: @escaping (T) -> Bool, router: NavigationRouter?, - keyringMakerRouter: NavigationRouter?, viewModel: WorkshopViewModel?, emptyView: EmptyView ) -> some View { @@ -32,7 +31,6 @@ struct WorkshopGridHelpers { item: item, isOwned: isOwnedCheck(item), router: router, - keyringMakerRouter: keyringMakerRouter, viewModel: viewModel ) .id(item.id) @@ -50,7 +48,6 @@ struct WorkshopGridHelpers { isSoundOwned: @escaping (Sound) -> Bool, isParticleOwned: @escaping (Particle) -> Bool, router: NavigationRouter?, - keyringMakerRouter: NavigationRouter?, viewModel: WorkshopViewModel?, emptyView: EmptyView ) -> some View { @@ -68,7 +65,6 @@ struct WorkshopGridHelpers { item: sound, isOwned: isSoundOwned(sound), router: router, - keyringMakerRouter: keyringMakerRouter, viewModel: viewModel ) .id(sound.id) @@ -77,7 +73,6 @@ struct WorkshopGridHelpers { item: particle, isOwned: isParticleOwned(particle), router: router, - keyringMakerRouter: keyringMakerRouter, viewModel: viewModel ) .id(particle.id) diff --git a/Keychy/Keychy/Presentation/Workshop/Views/Main/WorkshopMainContentSection.swift b/Keychy/Keychy/Presentation/Workshop/Views/Main/WorkshopMainContentSection.swift index c5cf85b34..48d2c5af9 100644 --- a/Keychy/Keychy/Presentation/Workshop/Views/Main/WorkshopMainContentSection.swift +++ b/Keychy/Keychy/Presentation/Workshop/Views/Main/WorkshopMainContentSection.swift @@ -68,7 +68,6 @@ extension WorkshopView { isSoundOwned: viewModel.isSoundOwned, isParticleOwned: viewModel.isParticleOwned, router: router, - keyringMakerRouter: keyringMakerRouter, viewModel: viewModel, emptyView: emptyContentView ) @@ -83,7 +82,6 @@ extension WorkshopView { items: items, isOwnedCheck: isOwnedCheck, router: router, - keyringMakerRouter: keyringMakerRouter, viewModel: viewModel, emptyView: emptyContentView ) diff --git a/Keychy/Keychy/Presentation/Workshop/Views/Main/WorkshopTemplatesView.swift b/Keychy/Keychy/Presentation/Workshop/Views/Main/WorkshopTemplatesView.swift index a79b1b210..e3de0d2cb 100644 --- a/Keychy/Keychy/Presentation/Workshop/Views/Main/WorkshopTemplatesView.swift +++ b/Keychy/Keychy/Presentation/Workshop/Views/Main/WorkshopTemplatesView.swift @@ -10,17 +10,12 @@ import SwiftUI struct WorkshopTemplatesView: View { @Bindable var router: NavigationRouter - @Bindable var keyringMakerRouter: NavigationRouter @Environment(UserManager.self) private var userManager @State private var viewModel: WorkshopViewModel @State private var hasInitialized = false - init( - router: NavigationRouter, - keyringMakerRouter: NavigationRouter - ) { + init(router: NavigationRouter) { self.router = router - self.keyringMakerRouter = keyringMakerRouter _viewModel = State(initialValue: WorkshopViewModel(userManager: UserManager.shared)) } @@ -149,7 +144,6 @@ struct WorkshopTemplatesView: View { items: filteredTemplates, isOwnedCheck: { _ in false }, router: router, - keyringMakerRouter: keyringMakerRouter, viewModel: viewModel, emptyView: emptyContentView ) diff --git a/Keychy/Keychy/Presentation/Workshop/Views/Main/WorkshopView.swift b/Keychy/Keychy/Presentation/Workshop/Views/Main/WorkshopView.swift index 7c8e78e9e..adf5ba17a 100644 --- a/Keychy/Keychy/Presentation/Workshop/Views/Main/WorkshopView.swift +++ b/Keychy/Keychy/Presentation/Workshop/Views/Main/WorkshopView.swift @@ -13,7 +13,6 @@ import NukeUI struct WorkshopView: View { @Bindable var router: NavigationRouter - @Bindable var keyringMakerRouter: NavigationRouter @Environment(UserManager.self) var userManager @State var viewModel: WorkshopViewModel @State private var hasInitialized = false @@ -24,11 +23,9 @@ struct WorkshopView: View { /// WorkshopTab에서 생성된 viewModel을 받아서 사용 init( router: NavigationRouter, - keyringMakerRouter: NavigationRouter, viewModel: WorkshopViewModel ) { self.router = router - self.keyringMakerRouter = keyringMakerRouter _viewModel = State(initialValue: viewModel) } diff --git a/Keychy/Keychy/Presentation/Workshop/Views/MyItemsView.swift b/Keychy/Keychy/Presentation/Workshop/Views/MyItemsView.swift index b6490cdcc..c1ddbeb6d 100644 --- a/Keychy/Keychy/Presentation/Workshop/Views/MyItemsView.swift +++ b/Keychy/Keychy/Presentation/Workshop/Views/MyItemsView.swift @@ -147,7 +147,6 @@ struct MyItemsView: View { items: filteredOwnedTemplates, isOwnedCheck: { _ in false }, router: router, - keyringMakerRouter: nil, viewModel: viewModel, emptyView: emptyContentView ) @@ -156,7 +155,6 @@ struct MyItemsView: View { items: filteredOwnedBackgrounds, isOwnedCheck: { _ in false }, router: router, - keyringMakerRouter: nil, viewModel: viewModel, emptyView: emptyContentView ) @@ -165,7 +163,6 @@ struct MyItemsView: View { items: filteredOwnedCarabiners, isOwnedCheck: { _ in false }, router: router, - keyringMakerRouter: nil, viewModel: viewModel, emptyView: emptyContentView ) @@ -175,7 +172,6 @@ struct MyItemsView: View { isSoundOwned: { _ in false }, isParticleOwned: { _ in false }, router: router, - keyringMakerRouter: nil, viewModel: viewModel, emptyView: emptyContentView )