From 544701df2ea217febbf087c98ee7874529d0cde0 Mon Sep 17 00:00:00 2001 From: Bambu Date: Wed, 19 Aug 2026 22:42:02 +0900 Subject: [PATCH 01/23] =?UTF-8?q?=F0=9F=A9=B9chore:=20=ED=8C=8C=EC=9D=BC?= =?UTF-8?q?=20=EC=B6=94=EC=A0=81=20=ED=95=B4=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UserInterfaceState.xcuserstate | Bin 16164 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Moha/Moha.xcodeproj/project.xcworkspace/xcuserdata/byeon-yerin.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/Moha/Moha.xcodeproj/project.xcworkspace/xcuserdata/byeon-yerin.xcuserdatad/UserInterfaceState.xcuserstate b/Moha/Moha.xcodeproj/project.xcworkspace/xcuserdata/byeon-yerin.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 43649be8ce1e4c84c5b79d2abdd98309bfe5bdd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16164 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 K^yz=kx%5Bp8fSn2 From 52e699b9251aa236e02ebf43c23a250a95c69455 Mon Sep 17 00:00:00 2001 From: Bambu Date: Wed, 19 Aug 2026 22:47:19 +0900 Subject: [PATCH 02/23] =?UTF-8?q?=F0=9F=9A=9Abuild:=20=ED=8F=B4=EB=8D=94?= =?UTF-8?q?=20=EB=B0=8F=20=ED=8C=8C=EC=9D=BC=20=EC=B6=94=EA=B0=80,=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Assets.xcassets/AccentColor.colorset/Contents.json | 0 .../Assets.xcassets/AppIcon.appiconset/Contents.json | 0 Moha/Moha/{ => Resources}/Assets.xcassets/Contents.json | 0 Moha/Moha/{ => Sources}/ContentView.swift | 0 Moha/Moha/{ => Sources}/Item.swift | 0 Moha/Moha/{ => Sources}/MohaApp.swift | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename Moha/Moha/{ => Resources}/Assets.xcassets/AccentColor.colorset/Contents.json (100%) rename Moha/Moha/{ => Resources}/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename Moha/Moha/{ => Resources}/Assets.xcassets/Contents.json (100%) rename Moha/Moha/{ => Sources}/ContentView.swift (100%) rename Moha/Moha/{ => Sources}/Item.swift (100%) rename Moha/Moha/{ => Sources}/MohaApp.swift (100%) diff --git a/Moha/Moha/Assets.xcassets/AccentColor.colorset/Contents.json b/Moha/Moha/Resources/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 100% rename from Moha/Moha/Assets.xcassets/AccentColor.colorset/Contents.json rename to Moha/Moha/Resources/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/Moha/Moha/Assets.xcassets/AppIcon.appiconset/Contents.json b/Moha/Moha/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from Moha/Moha/Assets.xcassets/AppIcon.appiconset/Contents.json rename to Moha/Moha/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/Moha/Moha/Assets.xcassets/Contents.json b/Moha/Moha/Resources/Assets.xcassets/Contents.json similarity index 100% rename from Moha/Moha/Assets.xcassets/Contents.json rename to Moha/Moha/Resources/Assets.xcassets/Contents.json diff --git a/Moha/Moha/ContentView.swift b/Moha/Moha/Sources/ContentView.swift similarity index 100% rename from Moha/Moha/ContentView.swift rename to Moha/Moha/Sources/ContentView.swift diff --git a/Moha/Moha/Item.swift b/Moha/Moha/Sources/Item.swift similarity index 100% rename from Moha/Moha/Item.swift rename to Moha/Moha/Sources/Item.swift diff --git a/Moha/Moha/MohaApp.swift b/Moha/Moha/Sources/MohaApp.swift similarity index 100% rename from Moha/Moha/MohaApp.swift rename to Moha/Moha/Sources/MohaApp.swift From 29e7bc122595b5bad5bf2a857d58f7042f02ce84 Mon Sep 17 00:00:00 2001 From: Bambu Date: Wed, 19 Aug 2026 23:21:19 +0900 Subject: [PATCH 03/23] =?UTF-8?q?=E2=9C=A8feat:=20MohaView=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=83=9D=EC=84=B1=20=EB=B0=8F=20TabView=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Moha/Moha/Sources/Features/MohaView.swift | 47 +++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 Moha/Moha/Sources/Features/MohaView.swift diff --git a/Moha/Moha/Sources/Features/MohaView.swift b/Moha/Moha/Sources/Features/MohaView.swift new file mode 100644 index 0000000..ddadbce --- /dev/null +++ b/Moha/Moha/Sources/Features/MohaView.swift @@ -0,0 +1,47 @@ +// +// MohaView.swift +// Moha +// +// Created by 변예린 on 8/19/26. +// + +import SwiftUI + +struct MohaView: View { + @State private var selectedTab: TabItem = .report + + var body: some View { + TabView(selection: $selectedTab) { + Text("Home") + .tabItem { + Label("Home", systemImage: "house") + } + .tag(TabItem.home) + + Text("Report") + .tabItem { + Label("Report", systemImage: "chart.xyaxis.line") + } + .tag(TabItem.report) + + Text("My Page") + .tabItem { + Label("My Page", systemImage: "person") + } + .tag(TabItem.profile) + } + } +} + +extension MohaView { + enum TabItem { + case home + case report + case profile + } +} + +//MARK: - MohaView Preview +#Preview { + MohaView() +} From 61498b3105b051b1b0a1b6ac420a36c4fae64096 Mon Sep 17 00:00:00 2001 From: Bambu Date: Thu, 20 Aug 2026 00:34:08 +0900 Subject: [PATCH 04/23] =?UTF-8?q?=E2=9C=A8feat:=20Route=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=ED=86=A0=EC=BD=9C=20=EC=83=9D=EC=84=B1=20=EB=B0=8F=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Moha/Moha/Sources/Navigation/Route.swift | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 Moha/Moha/Sources/Navigation/Route.swift diff --git a/Moha/Moha/Sources/Navigation/Route.swift b/Moha/Moha/Sources/Navigation/Route.swift new file mode 100644 index 0000000..eef6e09 --- /dev/null +++ b/Moha/Moha/Sources/Navigation/Route.swift @@ -0,0 +1,21 @@ +// +// Route.swift +// Moha +// +// Created by 변예린 on 8/20/26. +// + +protocol Route: Hashable { + var id: String { get } // NavigationPath에서 사용되는 키값 +} + +// extension으로 Hashable 프로토콜의 필수 구현사항을 구현함으로써 중복 코드 최소화 +extension Route { + func hash(into hasher: inout Hasher) { + hasher.combine(id) + } + + static func == (lhs: Self, rhs: Self) -> Bool { + lhs.id == rhs.id + } +} From 937263f95e90b399b02e55116bfb99a627cda176 Mon Sep 17 00:00:00 2001 From: Bambu Date: Thu, 20 Aug 2026 00:41:35 +0900 Subject: [PATCH 05/23] =?UTF-8?q?=E2=9C=A8feat:=20HomeRoute=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Moha/Moha/Sources/Navigation/HomeRoute.swift | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 Moha/Moha/Sources/Navigation/HomeRoute.swift diff --git a/Moha/Moha/Sources/Navigation/HomeRoute.swift b/Moha/Moha/Sources/Navigation/HomeRoute.swift new file mode 100644 index 0000000..68e6cf9 --- /dev/null +++ b/Moha/Moha/Sources/Navigation/HomeRoute.swift @@ -0,0 +1,16 @@ +// +// HomeRoute.swift +// Moha +// +// Created by 변예린 on 8/20/26. +// + +enum HomeRoute: Route { + case createTodo + + var id: String { + switch self { + case .createTodo: "createTodo" + } + } +} From 0b025db4a70166cf45cf495482827a2371416fe0 Mon Sep 17 00:00:00 2001 From: Bambu Date: Thu, 20 Aug 2026 18:26:23 +0900 Subject: [PATCH 06/23] =?UTF-8?q?=E2=9C=A8feat:=20MainRouter=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EB=B0=8F=20=EA=B8=B0=EC=B4=88=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Moha/Moha/Sources/Navigation/MainRouter.swift | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 Moha/Moha/Sources/Navigation/MainRouter.swift diff --git a/Moha/Moha/Sources/Navigation/MainRouter.swift b/Moha/Moha/Sources/Navigation/MainRouter.swift new file mode 100644 index 0000000..3708d64 --- /dev/null +++ b/Moha/Moha/Sources/Navigation/MainRouter.swift @@ -0,0 +1,36 @@ +// +// MainRouter.swift +// Moha +// +// Created by 변예린 on 8/20/26. +// + +import SwiftUI +import Combine + +final class MainRouter: ObservableObject { + @Published var path = NavigationPath() + + func push(to route: any Route) { + path.append(route) + } + + func pop() { + guard !path.isEmpty else { return } + path.removeLast() + } + + func reset() { + path = NavigationPath() + } + + func popTo(count: Int) { + guard count > 0, count <= path.count else { return } + path.removeLast(count) + } + + func replace(with route: any Route) { + path = NavigationPath() + path.append(route) + } +} From e2d73b92a4633a80adb71c7907eb57f35a3c4bae Mon Sep 17 00:00:00 2001 From: Bambu Date: Thu, 20 Aug 2026 20:18:26 +0900 Subject: [PATCH 07/23] =?UTF-8?q?=E2=9C=A8feat:=20MainRouter=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=ED=8D=BC=ED=8B=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Moha/Moha/Sources/Navigation/MainRouter.swift | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Moha/Moha/Sources/Navigation/MainRouter.swift b/Moha/Moha/Sources/Navigation/MainRouter.swift index 3708d64..aca6760 100644 --- a/Moha/Moha/Sources/Navigation/MainRouter.swift +++ b/Moha/Moha/Sources/Navigation/MainRouter.swift @@ -9,7 +9,11 @@ import SwiftUI import Combine final class MainRouter: ObservableObject { - @Published var path = NavigationPath() + var selectedTab = MohaView.TabItem.home + + let homeRouter = HomeRouter() + let reportRouter = ReportRouter() + let myPageRouter = myPageRouter() func push(to route: any Route) { path.append(route) From 69029b90b416f02a8f059475aa15a5819260aa12 Mon Sep 17 00:00:00 2001 From: Bambu Date: Thu, 20 Aug 2026 20:26:52 +0900 Subject: [PATCH 08/23] =?UTF-8?q?=E2=9C=A8feat:=20Router=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=ED=86=A0=EC=BD=9C=20=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Moha/Moha/Sources/Navigation/MainRouter.swift | 21 ---------- Moha/Moha/Sources/Navigation/Router.swift | 39 +++++++++++++++++++ 2 files changed, 39 insertions(+), 21 deletions(-) create mode 100644 Moha/Moha/Sources/Navigation/Router.swift diff --git a/Moha/Moha/Sources/Navigation/MainRouter.swift b/Moha/Moha/Sources/Navigation/MainRouter.swift index aca6760..5b17009 100644 --- a/Moha/Moha/Sources/Navigation/MainRouter.swift +++ b/Moha/Moha/Sources/Navigation/MainRouter.swift @@ -15,26 +15,5 @@ final class MainRouter: ObservableObject { let reportRouter = ReportRouter() let myPageRouter = myPageRouter() - func push(to route: any Route) { - path.append(route) - } - func pop() { - guard !path.isEmpty else { return } - path.removeLast() - } - - func reset() { - path = NavigationPath() - } - - func popTo(count: Int) { - guard count > 0, count <= path.count else { return } - path.removeLast(count) - } - - func replace(with route: any Route) { - path = NavigationPath() - path.append(route) - } } diff --git a/Moha/Moha/Sources/Navigation/Router.swift b/Moha/Moha/Sources/Navigation/Router.swift new file mode 100644 index 0000000..dfe106a --- /dev/null +++ b/Moha/Moha/Sources/Navigation/Router.swift @@ -0,0 +1,39 @@ +// +// Router.swift +// Moha +// +// Created by 변예린 on 8/20/26. +// + +import SwiftUI + +protocol Router: AnyObject { + associatedtype Destination: Route + + var path: NavigationPath { get set } +} + +extension Router { + func push(to route: any Route) { + path.append(route) + } + + func pop() { + guard !path.isEmpty else { return } + path.removeLast() + } + + func reset() { + path = NavigationPath() + } + + func popTo(count: Int) { + guard count > 0, count <= path.count else { return } + path.removeLast(count) + } + + func replace(with route: any Route) { + path = NavigationPath() + path.append(route) + } +} From c3056fe4a8b736d62dae3ad6d7301554dba18b3c Mon Sep 17 00:00:00 2001 From: Bambu Date: Thu, 20 Aug 2026 21:06:29 +0900 Subject: [PATCH 09/23] =?UTF-8?q?=E2=9C=A8feat:=20=ED=83=AD=EB=B3=84=20Rou?= =?UTF-8?q?ter=20=EB=B0=8F=20Route=20=EC=83=9D=EC=84=B1,=20=EB=A7=88?= =?UTF-8?q?=EC=A7=80=EB=A7=89=20=ED=83=AD=20=EC=9D=B4=EB=A6=84=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD(MyPage=20->=20Settings)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Moha/Moha/Sources/Features/MohaView.swift | 6 +++--- Moha/Moha/Sources/Navigation/MainRouter.swift | 2 +- .../Moha/Sources/Navigation/ReportRoute.swift | 16 ++++++++++++++ Moha/Moha/Sources/Navigation/Router.swift | 21 +++++++++++++++++++ .../Sources/Navigation/SettingsRoute.swift | 16 ++++++++++++++ 5 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 Moha/Moha/Sources/Navigation/ReportRoute.swift create mode 100644 Moha/Moha/Sources/Navigation/SettingsRoute.swift diff --git a/Moha/Moha/Sources/Features/MohaView.swift b/Moha/Moha/Sources/Features/MohaView.swift index ddadbce..ed4b7f1 100644 --- a/Moha/Moha/Sources/Features/MohaView.swift +++ b/Moha/Moha/Sources/Features/MohaView.swift @@ -26,9 +26,9 @@ struct MohaView: View { Text("My Page") .tabItem { - Label("My Page", systemImage: "person") + Label("Settings", systemImage: "person") } - .tag(TabItem.profile) + .tag(TabItem.settings) } } } @@ -37,7 +37,7 @@ extension MohaView { enum TabItem { case home case report - case profile + case settings } } diff --git a/Moha/Moha/Sources/Navigation/MainRouter.swift b/Moha/Moha/Sources/Navigation/MainRouter.swift index 5b17009..1b2cca5 100644 --- a/Moha/Moha/Sources/Navigation/MainRouter.swift +++ b/Moha/Moha/Sources/Navigation/MainRouter.swift @@ -13,7 +13,7 @@ final class MainRouter: ObservableObject { let homeRouter = HomeRouter() let reportRouter = ReportRouter() - let myPageRouter = myPageRouter() + let settingsRouter = SettingsRouter() } diff --git a/Moha/Moha/Sources/Navigation/ReportRoute.swift b/Moha/Moha/Sources/Navigation/ReportRoute.swift new file mode 100644 index 0000000..92ce7c1 --- /dev/null +++ b/Moha/Moha/Sources/Navigation/ReportRoute.swift @@ -0,0 +1,16 @@ +// +// ReportRoute.swift +// Moha +// +// Created by 변예린 on 8/20/26. +// + +enum ReportRoute: Route { + case createTodo + + var id: String { + switch self { + case .createTodo: "createTodo" + } + } +} diff --git a/Moha/Moha/Sources/Navigation/Router.swift b/Moha/Moha/Sources/Navigation/Router.swift index dfe106a..c59469f 100644 --- a/Moha/Moha/Sources/Navigation/Router.swift +++ b/Moha/Moha/Sources/Navigation/Router.swift @@ -37,3 +37,24 @@ extension Router { path.append(route) } } + +@Observable +final class HomeRouter: Router { + typealias Destination = HomeRoute + + var path = NavigationPath() +} + +@Observable +final class ReportRouter: Router { + typealias Destination = ReportRoute + + var path = NavigationPath() +} + +@Observable +final class SettingsRouter: Router { + typealias Destination = SettingsRoute + + var path = NavigationPath() +} diff --git a/Moha/Moha/Sources/Navigation/SettingsRoute.swift b/Moha/Moha/Sources/Navigation/SettingsRoute.swift new file mode 100644 index 0000000..c2802a7 --- /dev/null +++ b/Moha/Moha/Sources/Navigation/SettingsRoute.swift @@ -0,0 +1,16 @@ +// +// SettingsRoute.swift +// Moha +// +// Created by 변예린 on 8/20/26. +// + +enum SettingsRoute: Route { + case createTodo + + var id: String { + switch self { + case .createTodo: "createTodo" + } + } +} From 825958feb4b0d18f43bcbf15c96e2e39e96c6c87 Mon Sep 17 00:00:00 2001 From: Bambu Date: Thu, 20 Aug 2026 21:07:43 +0900 Subject: [PATCH 10/23] =?UTF-8?q?=F0=9F=9A=9Abuild:=20Route,=20Router=20?= =?UTF-8?q?=ED=8F=B4=EB=8D=94=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Moha/Moha/Sources/Navigation/{ => Route}/HomeRoute.swift | 0 Moha/Moha/Sources/Navigation/{ => Route}/ReportRoute.swift | 0 Moha/Moha/Sources/Navigation/{ => Route}/Route.swift | 0 Moha/Moha/Sources/Navigation/{ => Route}/SettingsRoute.swift | 0 Moha/Moha/Sources/Navigation/{ => Router}/MainRouter.swift | 0 Moha/Moha/Sources/Navigation/{ => Router}/Router.swift | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename Moha/Moha/Sources/Navigation/{ => Route}/HomeRoute.swift (100%) rename Moha/Moha/Sources/Navigation/{ => Route}/ReportRoute.swift (100%) rename Moha/Moha/Sources/Navigation/{ => Route}/Route.swift (100%) rename Moha/Moha/Sources/Navigation/{ => Route}/SettingsRoute.swift (100%) rename Moha/Moha/Sources/Navigation/{ => Router}/MainRouter.swift (100%) rename Moha/Moha/Sources/Navigation/{ => Router}/Router.swift (100%) diff --git a/Moha/Moha/Sources/Navigation/HomeRoute.swift b/Moha/Moha/Sources/Navigation/Route/HomeRoute.swift similarity index 100% rename from Moha/Moha/Sources/Navigation/HomeRoute.swift rename to Moha/Moha/Sources/Navigation/Route/HomeRoute.swift diff --git a/Moha/Moha/Sources/Navigation/ReportRoute.swift b/Moha/Moha/Sources/Navigation/Route/ReportRoute.swift similarity index 100% rename from Moha/Moha/Sources/Navigation/ReportRoute.swift rename to Moha/Moha/Sources/Navigation/Route/ReportRoute.swift diff --git a/Moha/Moha/Sources/Navigation/Route.swift b/Moha/Moha/Sources/Navigation/Route/Route.swift similarity index 100% rename from Moha/Moha/Sources/Navigation/Route.swift rename to Moha/Moha/Sources/Navigation/Route/Route.swift diff --git a/Moha/Moha/Sources/Navigation/SettingsRoute.swift b/Moha/Moha/Sources/Navigation/Route/SettingsRoute.swift similarity index 100% rename from Moha/Moha/Sources/Navigation/SettingsRoute.swift rename to Moha/Moha/Sources/Navigation/Route/SettingsRoute.swift diff --git a/Moha/Moha/Sources/Navigation/MainRouter.swift b/Moha/Moha/Sources/Navigation/Router/MainRouter.swift similarity index 100% rename from Moha/Moha/Sources/Navigation/MainRouter.swift rename to Moha/Moha/Sources/Navigation/Router/MainRouter.swift diff --git a/Moha/Moha/Sources/Navigation/Router.swift b/Moha/Moha/Sources/Navigation/Router/Router.swift similarity index 100% rename from Moha/Moha/Sources/Navigation/Router.swift rename to Moha/Moha/Sources/Navigation/Router/Router.swift From 685adba4a9b459543b60aa7ad75c0b98de869642 Mon Sep 17 00:00:00 2001 From: Bambu Date: Fri, 21 Aug 2026 00:23:38 +0900 Subject: [PATCH 11/23] =?UTF-8?q?=E2=9C=A8feat:=20MohaView=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=ED=8D=BC=ED=8B=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Moha/Moha/Sources/Features/MohaView.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Moha/Moha/Sources/Features/MohaView.swift b/Moha/Moha/Sources/Features/MohaView.swift index ed4b7f1..256f510 100644 --- a/Moha/Moha/Sources/Features/MohaView.swift +++ b/Moha/Moha/Sources/Features/MohaView.swift @@ -8,10 +8,10 @@ import SwiftUI struct MohaView: View { - @State private var selectedTab: TabItem = .report + @State private var router = MainRouter() var body: some View { - TabView(selection: $selectedTab) { + TabView(selection: $router.selectedTab) { Text("Home") .tabItem { Label("Home", systemImage: "house") From 9f6d910d19056101d7b495e51a4f8219b96bd4cc Mon Sep 17 00:00:00 2001 From: Bambu Date: Fri, 21 Aug 2026 00:28:41 +0900 Subject: [PATCH 12/23] =?UTF-8?q?=E2=9C=A8feat:=20HomeNavigationStack=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EA=B8=B0=EC=B4=88=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../NavigationStack/HomeNavigationStack.swift | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 Moha/Moha/Sources/Navigation/NavigationStack/HomeNavigationStack.swift diff --git a/Moha/Moha/Sources/Navigation/NavigationStack/HomeNavigationStack.swift b/Moha/Moha/Sources/Navigation/NavigationStack/HomeNavigationStack.swift new file mode 100644 index 0000000..c0df5b4 --- /dev/null +++ b/Moha/Moha/Sources/Navigation/NavigationStack/HomeNavigationStack.swift @@ -0,0 +1,28 @@ +// +// HomeNavigationStack.swift +// Moha +// +// Created by 변예린 on 8/21/26. +// + +import SwiftUI + +struct HomeNavigationStack: View { + @Bindable var router: HomeRouter + + var body: some View { + NavigationStack(path: $router.path) { + Text("Home") //TODO: HomeView로 수정 필요 + .navigationDestination(for: HomeRoute.self) { route in + destinationView(for: route) + } + } + } + + @ViewBuilder + private func destinationView(for route: HomeRoute) -> some View { + switch route { + case .createTodo: + } + } +} From 60bad05d5130a3e92d26699c9d0f17ea2e718e74 Mon Sep 17 00:00:00 2001 From: Bambu Date: Fri, 21 Aug 2026 00:29:45 +0900 Subject: [PATCH 13/23] =?UTF-8?q?=E2=9C=A8feat:=20ReportNavigationStack=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EA=B8=B0=EC=B4=88=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ReportNavigationStack.swift | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 Moha/Moha/Sources/Navigation/NavigationStack/ReportNavigationStack.swift diff --git a/Moha/Moha/Sources/Navigation/NavigationStack/ReportNavigationStack.swift b/Moha/Moha/Sources/Navigation/NavigationStack/ReportNavigationStack.swift new file mode 100644 index 0000000..02b2f54 --- /dev/null +++ b/Moha/Moha/Sources/Navigation/NavigationStack/ReportNavigationStack.swift @@ -0,0 +1,28 @@ +// +// ReportNavigationStack.swift +// Moha +// +// Created by 변예린 on 8/21/26. +// + +import SwiftUI + +struct ReportNavigationStack: View { + @Bindable var router: ReportRouter + + var body: some View { + NavigationStack(path: $router.path) { + Text("Report") //TODO: ReportView로 수정 필요 + .navigationDestination(for: ReportRoute.self) { route in + destinationView(for: route) + } + } + } + + @ViewBuilder + private func destinationView(for route: ReportRoute) -> some View { + switch route { + case .createTodo: + } + } +} From 2002e61d8f22612e23aa34413ba1558865166fef Mon Sep 17 00:00:00 2001 From: Bambu Date: Fri, 21 Aug 2026 00:30:38 +0900 Subject: [PATCH 14/23] =?UTF-8?q?=E2=9C=A8feat:=20SettingsNavigationStack?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EA=B8=B0=EC=B4=88=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SettingsNavigationStack.swift | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 Moha/Moha/Sources/Navigation/NavigationStack/SettingsNavigationStack.swift diff --git a/Moha/Moha/Sources/Navigation/NavigationStack/SettingsNavigationStack.swift b/Moha/Moha/Sources/Navigation/NavigationStack/SettingsNavigationStack.swift new file mode 100644 index 0000000..74e1b10 --- /dev/null +++ b/Moha/Moha/Sources/Navigation/NavigationStack/SettingsNavigationStack.swift @@ -0,0 +1,28 @@ +// +// SettingsNavigationStack.swift +// Moha +// +// Created by 변예린 on 8/21/26. +// + +import SwiftUI + +struct SettingsNavigationStack: View { + @Bindable var router: SettingsRouter + + var body: some View { + NavigationStack(path: $router.path) { + Text("Settings") //TODO: SettingsView로 수정 필요 + .navigationDestination(for: SettingsRoute.self) { route in + destinationView(for: route) + } + } + } + + @ViewBuilder + private func destinationView(for route: SettingsRoute) -> some View { + switch route { + case .createTodo: + } + } +} From f645af1faa3f9ac92162573325ee71bb47369bc4 Mon Sep 17 00:00:00 2001 From: Bambu Date: Fri, 21 Aug 2026 00:37:51 +0900 Subject: [PATCH 15/23] =?UTF-8?q?=E2=9C=A8feat:=20TabView=20=EA=B0=81=20Na?= =?UTF-8?q?vigationStack=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - destinationView 내부 임시 View 생성 코드 추가 --- Moha/Moha/Sources/Features/MohaView.swift | 12 ++++++------ .../NavigationStack/HomeNavigationStack.swift | 1 + .../NavigationStack/ReportNavigationStack.swift | 1 + .../NavigationStack/SettingsNavigationStack.swift | 1 + 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Moha/Moha/Sources/Features/MohaView.swift b/Moha/Moha/Sources/Features/MohaView.swift index 256f510..55e35bb 100644 --- a/Moha/Moha/Sources/Features/MohaView.swift +++ b/Moha/Moha/Sources/Features/MohaView.swift @@ -12,23 +12,23 @@ struct MohaView: View { var body: some View { TabView(selection: $router.selectedTab) { - Text("Home") + HomeNavigationStack(router: router.homeRouter) + .tag(TabItem.home) .tabItem { Label("Home", systemImage: "house") } - .tag(TabItem.home) - Text("Report") + ReportNavigationStack(router: router.reportRouter) + .tag(TabItem.report) .tabItem { Label("Report", systemImage: "chart.xyaxis.line") } - .tag(TabItem.report) - Text("My Page") + SettingsNavigationStack(router: router.settingsRouter) + .tag(TabItem.settings) .tabItem { Label("Settings", systemImage: "person") } - .tag(TabItem.settings) } } } diff --git a/Moha/Moha/Sources/Navigation/NavigationStack/HomeNavigationStack.swift b/Moha/Moha/Sources/Navigation/NavigationStack/HomeNavigationStack.swift index c0df5b4..87f7c23 100644 --- a/Moha/Moha/Sources/Navigation/NavigationStack/HomeNavigationStack.swift +++ b/Moha/Moha/Sources/Navigation/NavigationStack/HomeNavigationStack.swift @@ -23,6 +23,7 @@ struct HomeNavigationStack: View { private func destinationView(for route: HomeRoute) -> some View { switch route { case .createTodo: + Text("Create") } } } diff --git a/Moha/Moha/Sources/Navigation/NavigationStack/ReportNavigationStack.swift b/Moha/Moha/Sources/Navigation/NavigationStack/ReportNavigationStack.swift index 02b2f54..cfcfc0c 100644 --- a/Moha/Moha/Sources/Navigation/NavigationStack/ReportNavigationStack.swift +++ b/Moha/Moha/Sources/Navigation/NavigationStack/ReportNavigationStack.swift @@ -23,6 +23,7 @@ struct ReportNavigationStack: View { private func destinationView(for route: ReportRoute) -> some View { switch route { case .createTodo: + Text("Create") } } } diff --git a/Moha/Moha/Sources/Navigation/NavigationStack/SettingsNavigationStack.swift b/Moha/Moha/Sources/Navigation/NavigationStack/SettingsNavigationStack.swift index 74e1b10..10b05bc 100644 --- a/Moha/Moha/Sources/Navigation/NavigationStack/SettingsNavigationStack.swift +++ b/Moha/Moha/Sources/Navigation/NavigationStack/SettingsNavigationStack.swift @@ -23,6 +23,7 @@ struct SettingsNavigationStack: View { private func destinationView(for route: SettingsRoute) -> some View { switch route { case .createTodo: + Text("Create") } } } From 9bb31c13039fc7697b2527827fa0ac91f9fc83ff Mon Sep 17 00:00:00 2001 From: Bambu Date: Fri, 21 Aug 2026 00:40:16 +0900 Subject: [PATCH 16/23] =?UTF-8?q?=E2=9C=A8feat:=20MainRouter=20environment?= =?UTF-8?q?=20=EB=93=B1=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Moha/Moha/Sources/Features/MohaView.swift | 1 + Moha/Moha/Sources/Navigation/Router/MainRouter.swift | 1 + 2 files changed, 2 insertions(+) diff --git a/Moha/Moha/Sources/Features/MohaView.swift b/Moha/Moha/Sources/Features/MohaView.swift index 55e35bb..44cad00 100644 --- a/Moha/Moha/Sources/Features/MohaView.swift +++ b/Moha/Moha/Sources/Features/MohaView.swift @@ -30,6 +30,7 @@ struct MohaView: View { Label("Settings", systemImage: "person") } } + .environment(router) } } diff --git a/Moha/Moha/Sources/Navigation/Router/MainRouter.swift b/Moha/Moha/Sources/Navigation/Router/MainRouter.swift index 1b2cca5..29113fe 100644 --- a/Moha/Moha/Sources/Navigation/Router/MainRouter.swift +++ b/Moha/Moha/Sources/Navigation/Router/MainRouter.swift @@ -8,6 +8,7 @@ import SwiftUI import Combine +@Observable final class MainRouter: ObservableObject { var selectedTab = MohaView.TabItem.home From dfc2cdbc3c114d9f9de7fc08e5ba338db7e0e51a Mon Sep 17 00:00:00 2001 From: Bambu Date: Fri, 21 Aug 2026 00:40:53 +0900 Subject: [PATCH 17/23] =?UTF-8?q?=F0=9F=A9=B9chore:=20Router=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=ED=86=A0=EC=BD=9C=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20->=20NavigationRouter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Router/{Router.swift => NavigationRouter.swift} | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) rename Moha/Moha/Sources/Navigation/Router/{Router.swift => NavigationRouter.swift} (82%) diff --git a/Moha/Moha/Sources/Navigation/Router/Router.swift b/Moha/Moha/Sources/Navigation/Router/NavigationRouter.swift similarity index 82% rename from Moha/Moha/Sources/Navigation/Router/Router.swift rename to Moha/Moha/Sources/Navigation/Router/NavigationRouter.swift index c59469f..d25d89f 100644 --- a/Moha/Moha/Sources/Navigation/Router/Router.swift +++ b/Moha/Moha/Sources/Navigation/Router/NavigationRouter.swift @@ -7,13 +7,13 @@ import SwiftUI -protocol Router: AnyObject { +protocol NavigationRouter: AnyObject { associatedtype Destination: Route var path: NavigationPath { get set } } -extension Router { +extension NavigationRouter { func push(to route: any Route) { path.append(route) } @@ -39,21 +39,21 @@ extension Router { } @Observable -final class HomeRouter: Router { +final class HomeRouter: NavigationRouter { typealias Destination = HomeRoute var path = NavigationPath() } @Observable -final class ReportRouter: Router { +final class ReportRouter: NavigationRouter { typealias Destination = ReportRoute var path = NavigationPath() } @Observable -final class SettingsRouter: Router { +final class SettingsRouter: NavigationRouter { typealias Destination = SettingsRoute var path = NavigationPath() From 2667ab9e98c9f3f3614127c195778c21101a0855 Mon Sep 17 00:00:00 2001 From: Bambu Date: Fri, 21 Aug 2026 01:04:50 +0900 Subject: [PATCH 18/23] =?UTF-8?q?=E2=9C=A8feat:=20=EC=95=B1=20=EC=A7=84?= =?UTF-8?q?=EC=9E=85=20=EB=A9=94=EC=9D=B8=EB=B7=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Moha/Moha/Sources/MohaApp.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Moha/Moha/Sources/MohaApp.swift b/Moha/Moha/Sources/MohaApp.swift index 9a40416..3ee9746 100644 --- a/Moha/Moha/Sources/MohaApp.swift +++ b/Moha/Moha/Sources/MohaApp.swift @@ -25,7 +25,7 @@ struct MohaApp: App { var body: some Scene { WindowGroup { - ContentView() + MohaView() } .modelContainer(sharedModelContainer) } From d4345867473fec1f0314c8084e6207334cf4cb1e Mon Sep 17 00:00:00 2001 From: Bambu Date: Fri, 21 Aug 2026 01:19:17 +0900 Subject: [PATCH 19/23] =?UTF-8?q?=F0=9F=90=9Efix:=20workflow=20yml=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 프로젝트 경로 수정 - 시뮬레이터 수정 - 누락 기호 추가 ( ' \. ') --- .github/workflows/ci.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1518596..92fe6c8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,11 +15,12 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: Build & Test + - name: Build run: | xcodebuild \ - -project Moha.xcodeproj \ + -project Moha/Moha.xcodeproj \ -scheme Moha \ -sdk iphonesimulator \ - -destination 'platform=iOS Simulator,name=iPhone 15,OS=17.5' - clean test \ No newline at end of file + -destination 'generic/platform=iOS Simulator' \ + CODE_SIGNING_ALLOWED=NO \ + clean build From 813c0b5e3f31ffdd32002151f876846088dffad5 Mon Sep 17 00:00:00 2001 From: Bambu Date: Fri, 21 Aug 2026 01:23:11 +0900 Subject: [PATCH 20/23] =?UTF-8?q?=E2=9C=A8feat:=20NavigationRouter=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EB=A7=A4=EA=B0=9C=EB=B3=80=EC=88=98=20?= =?UTF-8?q?=ED=83=80=EC=9E=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - any Route -> Destination 수정으로 인해 함수 동작 오류 방지 --- Moha/Moha/Sources/Navigation/Router/NavigationRouter.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Moha/Moha/Sources/Navigation/Router/NavigationRouter.swift b/Moha/Moha/Sources/Navigation/Router/NavigationRouter.swift index d25d89f..f015a00 100644 --- a/Moha/Moha/Sources/Navigation/Router/NavigationRouter.swift +++ b/Moha/Moha/Sources/Navigation/Router/NavigationRouter.swift @@ -14,7 +14,7 @@ protocol NavigationRouter: AnyObject { } extension NavigationRouter { - func push(to route: any Route) { + func push(to route: Destination) { path.append(route) } @@ -32,7 +32,7 @@ extension NavigationRouter { path.removeLast(count) } - func replace(with route: any Route) { + func replace(with route: Destination) { path = NavigationPath() path.append(route) } From 60bd52c34572608bc67a4bafc70ab881e77b1e1b Mon Sep 17 00:00:00 2001 From: Bambu Date: Fri, 21 Aug 2026 01:35:46 +0900 Subject: [PATCH 21/23] =?UTF-8?q?=E2=9C=A8feat:=20Route=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=ED=86=A0=EC=BD=9C=20id=20=EC=86=8D=EC=84=B1=20?= =?UTF-8?q?=EB=B0=8F=20hash=20=ED=95=A8=EC=88=98=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 해당값이 없어도 enum은 Hashable 채택 가능 - Router에서의 associatedType을 제한하기 위해 Route 프로토콜은 삭제하지 않음 --- .../Moha/Sources/Navigation/Route/HomeRoute.swift | 6 ------ .../Sources/Navigation/Route/ReportRoute.swift | 6 ------ Moha/Moha/Sources/Navigation/Route/Route.swift | 15 +-------------- .../Sources/Navigation/Route/SettingsRoute.swift | 6 ------ 4 files changed, 1 insertion(+), 32 deletions(-) diff --git a/Moha/Moha/Sources/Navigation/Route/HomeRoute.swift b/Moha/Moha/Sources/Navigation/Route/HomeRoute.swift index 68e6cf9..9f642bf 100644 --- a/Moha/Moha/Sources/Navigation/Route/HomeRoute.swift +++ b/Moha/Moha/Sources/Navigation/Route/HomeRoute.swift @@ -7,10 +7,4 @@ enum HomeRoute: Route { case createTodo - - var id: String { - switch self { - case .createTodo: "createTodo" - } - } } diff --git a/Moha/Moha/Sources/Navigation/Route/ReportRoute.swift b/Moha/Moha/Sources/Navigation/Route/ReportRoute.swift index 92ce7c1..2a1bad4 100644 --- a/Moha/Moha/Sources/Navigation/Route/ReportRoute.swift +++ b/Moha/Moha/Sources/Navigation/Route/ReportRoute.swift @@ -7,10 +7,4 @@ enum ReportRoute: Route { case createTodo - - var id: String { - switch self { - case .createTodo: "createTodo" - } - } } diff --git a/Moha/Moha/Sources/Navigation/Route/Route.swift b/Moha/Moha/Sources/Navigation/Route/Route.swift index eef6e09..16f976d 100644 --- a/Moha/Moha/Sources/Navigation/Route/Route.swift +++ b/Moha/Moha/Sources/Navigation/Route/Route.swift @@ -5,17 +5,4 @@ // Created by 변예린 on 8/20/26. // -protocol Route: Hashable { - var id: String { get } // NavigationPath에서 사용되는 키값 -} - -// extension으로 Hashable 프로토콜의 필수 구현사항을 구현함으로써 중복 코드 최소화 -extension Route { - func hash(into hasher: inout Hasher) { - hasher.combine(id) - } - - static func == (lhs: Self, rhs: Self) -> Bool { - lhs.id == rhs.id - } -} +protocol Route: Hashable { } diff --git a/Moha/Moha/Sources/Navigation/Route/SettingsRoute.swift b/Moha/Moha/Sources/Navigation/Route/SettingsRoute.swift index c2802a7..50eff2a 100644 --- a/Moha/Moha/Sources/Navigation/Route/SettingsRoute.swift +++ b/Moha/Moha/Sources/Navigation/Route/SettingsRoute.swift @@ -7,10 +7,4 @@ enum SettingsRoute: Route { case createTodo - - var id: String { - switch self { - case .createTodo: "createTodo" - } - } } From 008d723fef2fee88595a79445ba8a9fc17bc7562 Mon Sep 17 00:00:00 2001 From: Bambu Date: Fri, 21 Aug 2026 01:39:31 +0900 Subject: [PATCH 22/23] =?UTF-8?q?=E2=9C=A8feat:=20TabItem=20=EC=9D=98?= =?UTF-8?q?=EC=A1=B4=EC=84=B1=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Moha/Moha/Sources/Features/MohaView.swift | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Moha/Moha/Sources/Features/MohaView.swift b/Moha/Moha/Sources/Features/MohaView.swift index 44cad00..10f5862 100644 --- a/Moha/Moha/Sources/Features/MohaView.swift +++ b/Moha/Moha/Sources/Features/MohaView.swift @@ -34,12 +34,11 @@ struct MohaView: View { } } -extension MohaView { - enum TabItem { - case home - case report - case settings - } +//MARK: Tab Item +enum TabItem { + case home + case report + case settings } //MARK: - MohaView Preview From d22a9cd02fa85f8ae863f066dcacc2edf4d2993f Mon Sep 17 00:00:00 2001 From: Bambu Date: Fri, 21 Aug 2026 01:44:29 +0900 Subject: [PATCH 23/23] =?UTF-8?q?=F0=9F=90=9Efix:=20selectedTab=EC=9D=98?= =?UTF-8?q?=20TabItem=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Moha/Moha/Sources/Navigation/Router/MainRouter.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Moha/Moha/Sources/Navigation/Router/MainRouter.swift b/Moha/Moha/Sources/Navigation/Router/MainRouter.swift index 29113fe..086e799 100644 --- a/Moha/Moha/Sources/Navigation/Router/MainRouter.swift +++ b/Moha/Moha/Sources/Navigation/Router/MainRouter.swift @@ -10,7 +10,7 @@ import Combine @Observable final class MainRouter: ObservableObject { - var selectedTab = MohaView.TabItem.home + var selectedTab = TabItem.home let homeRouter = HomeRouter() let reportRouter = ReportRouter()