From 52e699b9251aa236e02ebf43c23a250a95c69455 Mon Sep 17 00:00:00 2001 From: Bambu Date: Wed, 19 Aug 2026 22:47:19 +0900 Subject: [PATCH 01/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 02/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 03/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 04/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 05/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 06/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 07/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 08/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 09/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 10/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 11/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 12/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 13/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 14/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 15/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 16/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 17/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 18/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 19/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 20/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 21/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 22/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() From 3ba92f0e2283e2e64275b2a5d0d3abc9dcb21374 Mon Sep 17 00:00:00 2001 From: Bambu Date: Fri, 21 Aug 2026 01:56:48 +0900 Subject: [PATCH 23/23] Update README.md --- README.md | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2e40300..62fdec9 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,28 @@ -# Moha -To-do list with daily scrum +# 모하 (Moha) + +> 오늘 뭐 하지? 계획하고, 실행하고, 돌아보는 하루. + +**모하(Moha)** 는 Daily Scrum의 흐름을 개인의 하루에 적용한 iOS 앱입니다. + +단순히 할 일을 기록하는 것에서 끝나지 않고, +**계획 → 실행 → 회고**의 흐름을 통해 하루를 관리하고 돌아볼 수 있도록 만드는 것을 목표로 합니다. + +## 주요 기능 + +* 하루 계획 작성 및 관리 +* 계획별 진행 상태 기록 +* 하루 회고 +* 주간 / 월간 리포트 +* 리마인드 알림 + +## 기술 스택 + +| Category | Technology | +| --- | --- | +| UI | SwiftUI | +| Architecture | MVI + Router Pattern | +| Persistence | SwiftData | + +## Status + +🚧 현재 개발 중입니다.