From 0b69ff0e30b883dad326c1f8dc970d090e455702 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=89=E1=85=A9=E1=86=BC=E1=84=8B=E1=85=A7=E1=86=BC?= =?UTF-8?q?=E1=84=86=E1=85=A9?= Date: Sun, 3 Dec 2023 14:29:40 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20quiz=20result=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AllNews/AllNewsNavigationStackStore.swift | 18 -- .../AllNews/AllNewsNavigationStackView.swift | 7 - .../Result/Cell/QuizResultItemCellStore.swift | 102 +++++----- .../Result/Cell/QuizResultItemCellView.swift | 180 +++++++++--------- .../Feature/Quiz/Result/QuizResultStore.swift | 116 +++++------ .../Feature/Quiz/Result/QuizResultView.swift | 134 ++++++------- .../Today/TodayNavigationStackStore.swift | 18 -- .../Today/TodayNavigationStackView.swift | 7 - 8 files changed, 266 insertions(+), 316 deletions(-) diff --git a/Targets/D3N/Sources/Feature/AllNews/AllNewsNavigationStackStore.swift b/Targets/D3N/Sources/Feature/AllNews/AllNewsNavigationStackStore.swift index 0a44404..c80de6e 100644 --- a/Targets/D3N/Sources/Feature/AllNews/AllNewsNavigationStackStore.swift +++ b/Targets/D3N/Sources/Feature/AllNews/AllNewsNavigationStackStore.swift @@ -34,13 +34,11 @@ public struct AllNewsNavigationStackStore: Reducer { public struct Path: Reducer { public enum State: Equatable { case quizMain(QuizMainStore.State) - case quizResult(QuizResultStore.State) case allNews(AllNewsStore.State) } public enum Action: Equatable { case quizMain(QuizMainStore.Action) - case quizResult(QuizResultStore.Action) case allNews(AllNewsStore.Action) } @@ -48,9 +46,6 @@ public struct AllNewsNavigationStackStore: Reducer { Scope(state: /State.quizMain, action: /Action.quizMain) { QuizMainStore() } - Scope(state: /State.quizResult, action: /Action.quizResult) { - QuizResultStore() - } Scope(state: /State.allNews, action: /Action.allNews) { AllNewsStore() } @@ -72,19 +67,6 @@ public struct AllNewsNavigationStackStore: Reducer { return .none } - case let .path(.element(id: _, action: .quizMain(.delegate(action)))): - switch action { - case let .solved(quizEntityList): - state.path.append(.quizResult(.init(quizEntityList: quizEntityList))) - return .none - } - - case let .path(.element(id: _, action: .quizResult(.delegate(action)))): - switch action { - case .backToRoot: - return .send(.popToRoot) - } - case let .path(.element(id: _, action: .allNews(.delegate(action)))): switch action { case let .select(newsEntity): diff --git a/Targets/D3N/Sources/Feature/AllNews/AllNewsNavigationStackView.swift b/Targets/D3N/Sources/Feature/AllNews/AllNewsNavigationStackView.swift index 8df6209..49846f4 100644 --- a/Targets/D3N/Sources/Feature/AllNews/AllNewsNavigationStackView.swift +++ b/Targets/D3N/Sources/Feature/AllNews/AllNewsNavigationStackView.swift @@ -37,13 +37,6 @@ public struct AllNewsNavigationStackView: View { then: QuizMainView.init(store:) ) - case .quizResult: - CaseLet( - /AllNewsNavigationStackStore.Path.State.quizResult, - action: AllNewsNavigationStackStore.Path.Action.quizResult, - then: QuizResultView.init(store:) - ) - case .allNews: CaseLet( /AllNewsNavigationStackStore.Path.State.allNews, diff --git a/Targets/D3N/Sources/Feature/Quiz/Result/Cell/QuizResultItemCellStore.swift b/Targets/D3N/Sources/Feature/Quiz/Result/Cell/QuizResultItemCellStore.swift index 8d85820..3493f2d 100644 --- a/Targets/D3N/Sources/Feature/Quiz/Result/Cell/QuizResultItemCellStore.swift +++ b/Targets/D3N/Sources/Feature/Quiz/Result/Cell/QuizResultItemCellStore.swift @@ -1,54 +1,54 @@ +//// +//// QuizResultItemCellStore.swift +//// D3N +//// +//// Created by 송영모 on 10/15/23. +//// Copyright © 2023 sju. All rights reserved. +//// // -// QuizResultItemCellStore.swift -// D3N // -// Created by 송영모 on 10/15/23. -// Copyright © 2023 sju. All rights reserved. +//import Foundation // - - -import Foundation - -import ComposableArchitecture - -public struct QuizResultItemCellStore: Reducer { - public struct State: Equatable, Identifiable { - public var id: UUID - public var quizEntity: QuizEntity - - public init( - id: UUID = .init(), - quizEntity: QuizEntity - ) { - self.id = id - self.quizEntity = quizEntity - } - } - - public enum Action: Equatable { - case onAppear - - case tapped - - case delegate(Delegate) - - public enum Delegate: Equatable { - case tapped - } - } - - public var body: some ReducerOf { - Reduce { state, action in - switch action { - case .onAppear: - return .none - - case .tapped: - return .send(.delegate(.tapped)) - - default: - return .none - } - } - } -} +//import ComposableArchitecture +// +//public struct QuizResultItemCellStore: Reducer { +// public struct State: Equatable, Identifiable { +// public var id: UUID +// public var quizEntity: QuizEntity +// +// public init( +// id: UUID = .init(), +// quizEntity: QuizEntity +// ) { +// self.id = id +// self.quizEntity = quizEntity +// } +// } +// +// public enum Action: Equatable { +// case onAppear +// +// case tapped +// +// case delegate(Delegate) +// +// public enum Delegate: Equatable { +// case tapped +// } +// } +// +// public var body: some ReducerOf { +// Reduce { state, action in +// switch action { +// case .onAppear: +// return .none +// +// case .tapped: +// return .send(.delegate(.tapped)) +// +// default: +// return .none +// } +// } +// } +//} diff --git a/Targets/D3N/Sources/Feature/Quiz/Result/Cell/QuizResultItemCellView.swift b/Targets/D3N/Sources/Feature/Quiz/Result/Cell/QuizResultItemCellView.swift index 86e9d37..e19e0c5 100644 --- a/Targets/D3N/Sources/Feature/Quiz/Result/Cell/QuizResultItemCellView.swift +++ b/Targets/D3N/Sources/Feature/Quiz/Result/Cell/QuizResultItemCellView.swift @@ -1,93 +1,93 @@ +//// +//// QuizResultItemCellView.swift +//// D3N +//// +//// Created by 송영모 on 10/15/23. +//// Copyright © 2023 sju. All rights reserved. +//// // -// QuizResultItemCellView.swift -// D3N +//import Foundation +//import SwiftUI // -// Created by 송영모 on 10/15/23. -// Copyright © 2023 sju. All rights reserved. +//import ComposableArchitecture // - -import Foundation -import SwiftUI - -import ComposableArchitecture - -public struct QuizResultItemCellView: View { - let store: StoreOf - - public var body: some View { - WithViewStore(self.store, observe: { $0 }) { viewStore in - VStack { - VStack { - titleView(viewStore: viewStore) - - quizResultListView(viewStore: viewStore) - } - .minimalBackgroundStyle() - - reasoneView(viewStore: viewStore) - .minimalBackgroundStyle() - } - .padding(.horizontal) - } - } - private func titleView(viewStore: ViewStoreOf) -> some View { - HStack { - Text(viewStore.state.quizEntity.question) - .font(.title3) - .fontWeight(.semibold) - .lineLimit(nil) - .fixedSize(horizontal: false, vertical: true) - - Spacer() - } - } - - private func quizResultListView(viewStore: ViewStoreOf) -> some View { - VStack(alignment: .leading) { - HStack { - Spacer() - } - ForEach(Array(viewStore.state.quizEntity.choiceList.enumerated()), id: \.offset) { index, choice in - Label(title: { - Text(choice) - }, icon: { - quizResultItemImage( - current: index, - answer: viewStore.state.quizEntity.answer, - userAnswer: viewStore.state.quizEntity.selectedAnswer ?? 0 - ) - }) - .font(.subheadline) - } - } - } - - private func reasoneView(viewStore: ViewStoreOf) -> some View { - HStack { - Text(viewStore.state.quizEntity.reason) - .font(.subheadline) - .lineLimit(nil) - .fixedSize(horizontal: false, vertical: true) - - Spacer() - } - } - - private func quizResultItemImage(current: Int, answer: Int, userAnswer: Int) -> some View { - VStack { - if current == answer && current == userAnswer { - return Image(systemName: "checkmark.circle.fill") - .foregroundStyle(.mint) - } else if current == answer { - return Image(systemName: "checkmark.circle.fill") - .foregroundStyle(.pink) - } else if current == userAnswer { - return Image(systemName: "circle.fill") - .foregroundStyle(.foreground) - } else { - return Image(systemName: "circle") - .foregroundStyle(.foreground) - } - } - } -} +//public struct QuizResultItemCellView: View { +// let store: StoreOf +// +// public var body: some View { +// WithViewStore(self.store, observe: { $0 }) { viewStore in +// VStack { +// VStack { +// titleView(viewStore: viewStore) +// +// quizResultListView(viewStore: viewStore) +// } +// .minimalBackgroundStyle() +// +// reasoneView(viewStore: viewStore) +// .minimalBackgroundStyle() +// } +// .padding(.horizontal) +// } +// } +// private func titleView(viewStore: ViewStoreOf) -> some View { +// HStack { +// Text(viewStore.state.quizEntity.question) +// .font(.title3) +// .fontWeight(.semibold) +// .lineLimit(nil) +// .fixedSize(horizontal: false, vertical: true) +// +// Spacer() +// } +// } +// +// private func quizResultListView(viewStore: ViewStoreOf) -> some View { +// VStack(alignment: .leading) { +// HStack { +// Spacer() +// } +// ForEach(Array(viewStore.state.quizEntity.choiceList.enumerated()), id: \.offset) { index, choice in +// Label(title: { +// Text(choice) +// }, icon: { +// quizResultItemImage( +// current: index, +// answer: viewStore.state.quizEntity.answer, +// userAnswer: viewStore.state.quizEntity.selectedAnswer ?? 0 +// ) +// }) +// .font(.subheadline) +// } +// } +// } +// +// private func reasoneView(viewStore: ViewStoreOf) -> some View { +// HStack { +// Text(viewStore.state.quizEntity.reason) +// .font(.subheadline) +// .lineLimit(nil) +// .fixedSize(horizontal: false, vertical: true) +// +// Spacer() +// } +// } +// +// private func quizResultItemImage(current: Int, answer: Int, userAnswer: Int) -> some View { +// VStack { +// if current == answer && current == userAnswer { +// return Image(systemName: "checkmark.circle.fill") +// .foregroundStyle(.mint) +// } else if current == answer { +// return Image(systemName: "checkmark.circle.fill") +// .foregroundStyle(.pink) +// } else if current == userAnswer { +// return Image(systemName: "circle.fill") +// .foregroundStyle(.foreground) +// } else { +// return Image(systemName: "circle") +// .foregroundStyle(.foreground) +// } +// } +// } +//} diff --git a/Targets/D3N/Sources/Feature/Quiz/Result/QuizResultStore.swift b/Targets/D3N/Sources/Feature/Quiz/Result/QuizResultStore.swift index 18ae52d..8848751 100644 --- a/Targets/D3N/Sources/Feature/Quiz/Result/QuizResultStore.swift +++ b/Targets/D3N/Sources/Feature/Quiz/Result/QuizResultStore.swift @@ -1,61 +1,61 @@ +//// +//// QuizResultStore.swift +//// D3N +//// +//// Created by 송영모 on 10/15/23. +//// Copyright © 2023 sju. All rights reserved. +//// // -// QuizResultStore.swift -// D3N +//import Foundation // -// Created by 송영모 on 10/15/23. -// Copyright © 2023 sju. All rights reserved. +//import ComposableArchitecture // - -import Foundation - -import ComposableArchitecture - -public struct QuizResultStore: Reducer { - public struct State: Equatable { - var quizEntityList: [QuizEntity] - - var collectCount: Int - var quizResultItems: IdentifiedArrayOf = [] - - public init(quizEntityList: [QuizEntity]) { - self.quizEntityList = quizEntityList - self.collectCount = quizEntityList.filter({ $0.selectedAnswer == $0.answer }).count - self.quizResultItems = .init( - uniqueElements: quizEntityList.map { quizEntity in - return .init(quizEntity: quizEntity) - } - ) - } - } - - public enum Action: Equatable { - case onAppear - - case firstButtonTapped - - case quizResultItems(id: QuizResultItemCellStore.State.ID, action: QuizResultItemCellStore.Action) - case delegate(Delegate) - - public enum Delegate: Equatable { - case backToRoot - } - } - - public var body: some ReducerOf { - Reduce { state, action in - switch action { - case .onAppear: - return .none - - case .firstButtonTapped: - return .send(.delegate(.backToRoot)) - - default: - return .none - } - } - .forEach(\.quizResultItems, action: /Action.quizResultItems(id:action:)) { - QuizResultItemCellStore() - } - } -} +//public struct QuizResultStore: Reducer { +// public struct State: Equatable { +// var quizEntityList: [QuizEntity] +// +// var collectCount: Int +// var quizResultItems: IdentifiedArrayOf = [] +// +// public init(quizEntityList: [QuizEntity]) { +// self.quizEntityList = quizEntityList +// self.collectCount = quizEntityList.filter({ $0.selectedAnswer == $0.answer }).count +// self.quizResultItems = .init( +// uniqueElements: quizEntityList.map { quizEntity in +// return .init(quizEntity: quizEntity) +// } +// ) +// } +// } +// +// public enum Action: Equatable { +// case onAppear +// +// case firstButtonTapped +// +// case quizResultItems(id: QuizResultItemCellStore.State.ID, action: QuizResultItemCellStore.Action) +// case delegate(Delegate) +// +// public enum Delegate: Equatable { +// case backToRoot +// } +// } +// +// public var body: some ReducerOf { +// Reduce { state, action in +// switch action { +// case .onAppear: +// return .none +// +// case .firstButtonTapped: +// return .send(.delegate(.backToRoot)) +// +// default: +// return .none +// } +// } +// .forEach(\.quizResultItems, action: /Action.quizResultItems(id:action:)) { +// QuizResultItemCellStore() +// } +// } +//} diff --git a/Targets/D3N/Sources/Feature/Quiz/Result/QuizResultView.swift b/Targets/D3N/Sources/Feature/Quiz/Result/QuizResultView.swift index e1d12f4..ba2ea7f 100644 --- a/Targets/D3N/Sources/Feature/Quiz/Result/QuizResultView.swift +++ b/Targets/D3N/Sources/Feature/Quiz/Result/QuizResultView.swift @@ -1,70 +1,70 @@ +//// +//// QuizResultView.swift +//// D3N +//// +//// Created by 송영모 on 10/15/23. +//// Copyright © 2023 sju. All rights reserved. +//// // -// QuizResultView.swift -// D3N +//import Foundation +//import SwiftUI // -// Created by 송영모 on 10/15/23. -// Copyright © 2023 sju. All rights reserved. +//import ComposableArchitecture // - -import Foundation -import SwiftUI - -import ComposableArchitecture - -public struct QuizResultView: View { - let store: StoreOf - - public var body: some View { - WithViewStore(self.store, observe: { $0 }) { viewStore in - GeometryReader { proxy in - ScrollView { - VStack(alignment: .leading) { - titleView(collect: viewStore.state.collectCount, whole: viewStore.state.quizEntityList.count) - .padding(.horizontal) - - quizResultItemsView() - - Spacer() - - MinimalButton( - title: "처음으로", - action: { - viewStore.send(.firstButtonTapped) - } - ) - .padding() - } - .frame(minHeight: proxy.size.height) - } - } - .navigationBarTitleDisplayMode(.inline) - .navigationBarBackButtonHidden() - .toolbar(.hidden, for: .tabBar) - } - } - - private func titleView(collect: Int, whole: Int) -> some View { - HStack(spacing: .zero) { - Text("\(whole)문제 중 ") - .fontWeight(.semibold) - .font(.title) - - Text("\(collect)") - .font(.title) - .fontWeight(.semibold) - .foregroundStyle(.mint) - - Text("문제를 맞췄습니다.") - .fontWeight(.semibold) - .font(.title) - } - } - - private func quizResultItemsView() -> some View { - VStack(spacing: 20) { - ForEachStore(self.store.scope(state: \.quizResultItems, action: QuizResultStore.Action.quizResultItems(id:action:))) { - QuizResultItemCellView(store: $0) - } - } - } -} +//public struct QuizResultView: View { +// let store: StoreOf +// +// public var body: some View { +// WithViewStore(self.store, observe: { $0 }) { viewStore in +// GeometryReader { proxy in +// ScrollView { +// VStack(alignment: .leading) { +// titleView(collect: viewStore.state.collectCount, whole: viewStore.state.quizEntityList.count) +// .padding(.horizontal) +// +// quizResultItemsView() +// +// Spacer() +// +// MinimalButton( +// title: "처음으로", +// action: { +// viewStore.send(.firstButtonTapped) +// } +// ) +// .padding() +// } +// .frame(minHeight: proxy.size.height) +// } +// } +// .navigationBarTitleDisplayMode(.inline) +// .navigationBarBackButtonHidden() +// .toolbar(.hidden, for: .tabBar) +// } +// } +// +// private func titleView(collect: Int, whole: Int) -> some View { +// HStack(spacing: .zero) { +// Text("\(whole)문제 중 ") +// .fontWeight(.semibold) +// .font(.title) +// +// Text("\(collect)") +// .font(.title) +// .fontWeight(.semibold) +// .foregroundStyle(.mint) +// +// Text("문제를 맞췄습니다.") +// .fontWeight(.semibold) +// .font(.title) +// } +// } +// +// private func quizResultItemsView() -> some View { +// VStack(spacing: 20) { +// ForEachStore(self.store.scope(state: \.quizResultItems, action: QuizResultStore.Action.quizResultItems(id:action:))) { +// QuizResultItemCellView(store: $0) +// } +// } +// } +//} diff --git a/Targets/D3N/Sources/Feature/Today/TodayNavigationStackStore.swift b/Targets/D3N/Sources/Feature/Today/TodayNavigationStackStore.swift index 20c4831..7437d09 100644 --- a/Targets/D3N/Sources/Feature/Today/TodayNavigationStackStore.swift +++ b/Targets/D3N/Sources/Feature/Today/TodayNavigationStackStore.swift @@ -35,14 +35,12 @@ public struct TodayNavigationStackStore: Reducer { public enum State: Equatable { case detail(TodayDetailStore.State) case quizMain(QuizMainStore.State) - case quizResult(QuizResultStore.State) case allNews(AllNewsStore.State) } public enum Action: Equatable { case detail(TodayDetailStore.Action) case quizMain(QuizMainStore.Action) - case quizResult(QuizResultStore.Action) case allNews(AllNewsStore.Action) } @@ -53,9 +51,6 @@ public struct TodayNavigationStackStore: Reducer { Scope(state: /State.quizMain, action: /Action.quizMain) { QuizMainStore() } - Scope(state: /State.quizResult, action: /Action.quizResult) { - QuizResultStore() - } Scope(state: /State.allNews, action: /Action.allNews) { AllNewsStore() } @@ -80,19 +75,6 @@ public struct TodayNavigationStackStore: Reducer { return .none } - case let .path(.element(id: _, action: .quizMain(.delegate(action)))): - switch action { - case let .solved(quizEntityList): - state.path.append(.quizResult(.init(quizEntityList: quizEntityList))) - return .none - } - - case let .path(.element(id: _, action: .quizResult(.delegate(action)))): - switch action { - case .backToRoot: - return .send(.popToRoot) - } - case let .path(.element(id: _, action: .allNews(.delegate(action)))): switch action { case let .select(newsEntity): diff --git a/Targets/D3N/Sources/Feature/Today/TodayNavigationStackView.swift b/Targets/D3N/Sources/Feature/Today/TodayNavigationStackView.swift index 7c93525..12fda93 100644 --- a/Targets/D3N/Sources/Feature/Today/TodayNavigationStackView.swift +++ b/Targets/D3N/Sources/Feature/Today/TodayNavigationStackView.swift @@ -44,13 +44,6 @@ public struct TodayNavigationStackView: View { then: QuizMainView.init(store:) ) - case .quizResult: - CaseLet( - /TodayNavigationStackStore.Path.State.quizResult, - action: TodayNavigationStackStore.Path.Action.quizResult, - then: QuizResultView.init(store:) - ) - case .allNews: CaseLet( /TodayNavigationStackStore.Path.State.allNews, From 5019631e5339fac88c96a7cde8cd42d533498542 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=89=E1=85=A9=E1=86=BC=E1=84=8B=E1=85=A7=E1=86=BC?= =?UTF-8?q?=E1=84=86=E1=85=A9?= Date: Sun, 3 Dec 2023 14:31:46 +0900 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20today=20detail=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Today/Detail/TodayDetailStore.swift | 54 +++++++++---------- .../Today/Detail/TodayDetailView.swift | 46 ++++++++-------- .../Today/TodayNavigationStackStore.swift | 5 -- .../Today/TodayNavigationStackView.swift | 7 --- 4 files changed, 50 insertions(+), 62 deletions(-) diff --git a/Targets/D3N/Sources/Feature/Today/Detail/TodayDetailStore.swift b/Targets/D3N/Sources/Feature/Today/Detail/TodayDetailStore.swift index 8d5893f..07d7952 100644 --- a/Targets/D3N/Sources/Feature/Today/Detail/TodayDetailStore.swift +++ b/Targets/D3N/Sources/Feature/Today/Detail/TodayDetailStore.swift @@ -1,30 +1,30 @@ +//// +//// TodayDetailStore.swift +//// D3N +//// +//// Created by 송영모 on 10/12/23. +//// Copyright © 2023 sju. All rights reserved. +//// // -// TodayDetailStore.swift -// D3N +//import ComposableArchitecture // -// Created by 송영모 on 10/12/23. -// Copyright © 2023 sju. All rights reserved. +//public struct TodayDetailStore: Reducer { +// public struct State: Equatable { } +// +// public enum Action: Equatable { +// case onAppear +// } +// +// public var body: some ReducerOf { +// Reduce { state, action in +// switch action { +// case .onAppear: +// return .none +// +// default: +// return .none +// } +// } +// } +//} // - -import ComposableArchitecture - -public struct TodayDetailStore: Reducer { - public struct State: Equatable { } - - public enum Action: Equatable { - case onAppear - } - - public var body: some ReducerOf { - Reduce { state, action in - switch action { - case .onAppear: - return .none - - default: - return .none - } - } - } -} - diff --git a/Targets/D3N/Sources/Feature/Today/Detail/TodayDetailView.swift b/Targets/D3N/Sources/Feature/Today/Detail/TodayDetailView.swift index 6a56f0a..8ef1e05 100644 --- a/Targets/D3N/Sources/Feature/Today/Detail/TodayDetailView.swift +++ b/Targets/D3N/Sources/Feature/Today/Detail/TodayDetailView.swift @@ -1,26 +1,26 @@ +//// +//// TodayDetailView.swift +//// D3N +//// +//// Created by 송영모 on 10/12/23. +//// Copyright © 2023 sju. All rights reserved. +//// // -// TodayDetailView.swift -// D3N +//import Foundation +//import SwiftUI // -// Created by 송영모 on 10/12/23. -// Copyright © 2023 sju. All rights reserved. +//import ComposableArchitecture // - -import Foundation -import SwiftUI - -import ComposableArchitecture - -public struct TodayDetailView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(self.store, observe: { $0 }) { viewStore in - Text("Today Detail") - } - } -} +//public struct TodayDetailView: View { +// let store: StoreOf +// +// public init(store: StoreOf) { +// self.store = store +// } +// +// public var body: some View { +// WithViewStore(self.store, observe: { $0 }) { viewStore in +// Text("Today Detail") +// } +// } +//} diff --git a/Targets/D3N/Sources/Feature/Today/TodayNavigationStackStore.swift b/Targets/D3N/Sources/Feature/Today/TodayNavigationStackStore.swift index 7437d09..4a0da39 100644 --- a/Targets/D3N/Sources/Feature/Today/TodayNavigationStackStore.swift +++ b/Targets/D3N/Sources/Feature/Today/TodayNavigationStackStore.swift @@ -33,21 +33,16 @@ public struct TodayNavigationStackStore: Reducer { public struct Path: Reducer { public enum State: Equatable { - case detail(TodayDetailStore.State) case quizMain(QuizMainStore.State) case allNews(AllNewsStore.State) } public enum Action: Equatable { - case detail(TodayDetailStore.Action) case quizMain(QuizMainStore.Action) case allNews(AllNewsStore.Action) } public var body: some Reducer { - Scope(state: /State.detail, action: /Action.detail) { - TodayDetailStore() - } Scope(state: /State.quizMain, action: /Action.quizMain) { QuizMainStore() } diff --git a/Targets/D3N/Sources/Feature/Today/TodayNavigationStackView.swift b/Targets/D3N/Sources/Feature/Today/TodayNavigationStackView.swift index 12fda93..85081b9 100644 --- a/Targets/D3N/Sources/Feature/Today/TodayNavigationStackView.swift +++ b/Targets/D3N/Sources/Feature/Today/TodayNavigationStackView.swift @@ -30,13 +30,6 @@ public struct TodayNavigationStackView: View { } } destination: { switch $0 { - case .detail: - CaseLet( - /TodayNavigationStackStore.Path.State.detail, - action: TodayNavigationStackStore.Path.Action.detail, - then: TodayDetailView.init(store:) - ) - case .quizMain: CaseLet( /TodayNavigationStackStore.Path.State.quizMain, From 762a67f32059beb78e6e094c7a88646690e1fdf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=89=E1=85=A9=E1=86=BC=E1=84=8B=E1=85=A7=E1=86=BC?= =?UTF-8?q?=E1=84=86=E1=85=A9?= Date: Sun, 3 Dec 2023 14:38:31 +0900 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=ED=8F=B4=EB=8D=94=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Main}/Cell/NewsListItemCellStore.swift | 0 .../Main}/Cell/NewsListItemCellView.swift | 0 .../Feature/News/List/NewsListStore.swift | 88 ------------------ .../Feature/News/List/NewsListView.swift | 45 --------- .../List/Cell/ChoiceListItemCellStore.swift | 56 ----------- .../List/Cell/ChoiceListItemCellView.swift | 39 -------- .../Result/Cell/QuizResultItemCellStore.swift | 54 ----------- .../Result/Cell/QuizResultItemCellView.swift | 93 ------------------- .../Feature/Quiz/Result/QuizResultStore.swift | 61 ------------ .../Feature/Quiz/Result/QuizResultView.swift | 70 -------------- .../Today/Detail/TodayDetailStore.swift | 30 ------ .../Today/Detail/TodayDetailView.swift | 26 ------ 12 files changed, 562 deletions(-) rename Targets/D3N/Sources/Feature/{News/List => AllNews/Main}/Cell/NewsListItemCellStore.swift (100%) rename Targets/D3N/Sources/Feature/{News/List => AllNews/Main}/Cell/NewsListItemCellView.swift (100%) delete mode 100644 Targets/D3N/Sources/Feature/News/List/NewsListStore.swift delete mode 100644 Targets/D3N/Sources/Feature/News/List/NewsListView.swift delete mode 100644 Targets/D3N/Sources/Feature/Quiz/List/Cell/ChoiceListItemCellStore.swift delete mode 100644 Targets/D3N/Sources/Feature/Quiz/List/Cell/ChoiceListItemCellView.swift delete mode 100644 Targets/D3N/Sources/Feature/Quiz/Result/Cell/QuizResultItemCellStore.swift delete mode 100644 Targets/D3N/Sources/Feature/Quiz/Result/Cell/QuizResultItemCellView.swift delete mode 100644 Targets/D3N/Sources/Feature/Quiz/Result/QuizResultStore.swift delete mode 100644 Targets/D3N/Sources/Feature/Quiz/Result/QuizResultView.swift delete mode 100644 Targets/D3N/Sources/Feature/Today/Detail/TodayDetailStore.swift delete mode 100644 Targets/D3N/Sources/Feature/Today/Detail/TodayDetailView.swift diff --git a/Targets/D3N/Sources/Feature/News/List/Cell/NewsListItemCellStore.swift b/Targets/D3N/Sources/Feature/AllNews/Main/Cell/NewsListItemCellStore.swift similarity index 100% rename from Targets/D3N/Sources/Feature/News/List/Cell/NewsListItemCellStore.swift rename to Targets/D3N/Sources/Feature/AllNews/Main/Cell/NewsListItemCellStore.swift diff --git a/Targets/D3N/Sources/Feature/News/List/Cell/NewsListItemCellView.swift b/Targets/D3N/Sources/Feature/AllNews/Main/Cell/NewsListItemCellView.swift similarity index 100% rename from Targets/D3N/Sources/Feature/News/List/Cell/NewsListItemCellView.swift rename to Targets/D3N/Sources/Feature/AllNews/Main/Cell/NewsListItemCellView.swift diff --git a/Targets/D3N/Sources/Feature/News/List/NewsListStore.swift b/Targets/D3N/Sources/Feature/News/List/NewsListStore.swift deleted file mode 100644 index 121a9ae..0000000 --- a/Targets/D3N/Sources/Feature/News/List/NewsListStore.swift +++ /dev/null @@ -1,88 +0,0 @@ -//// -//// NewsListStore.swift -//// D3N -//// -//// Created by 송영모 on 10/17/23. -//// Copyright © 2023 sju. All rights reserved. -//// -// -//import Foundation -// -//import ComposableArchitecture -// -//public struct NewsListStore: Reducer { -// let FIXED_PAGE_SIZE = 10 -// -// public struct State: Equatable, Identifiable { -// public let id: UUID -// -// var newsEntityList: [NewsEntity] = [] -// var pageIndex: Int = 0 -// -// var newsListItems: IdentifiedArrayOf = [] -// -// public init( -// id: UUID = .init() -// ) { -// self.id = id -// } -// } -// -// @Dependency(\.newsClient) var newsClient -// -// public enum Action: Equatable { -// case onAppear -// -// case fetchNewsListRequest -// case fetchNewsListResponse(Result<[NewsEntity], D3NAPIError>) -// -// case newsListItems(id: NewsListItemCellStore.State.ID, action: NewsListItemCellStore.Action) -// case delegate(Delegate) -// -// public enum Delegate: Equatable { -// case select(NewsEntity) -// } -// } -// -// public var body: some ReducerOf { -// Reduce { state, action in -// switch action { -// case .onAppear: -// return .concatenate([ -// .send(.fetchNewsListRequest) -// ]) -// -// case .fetchNewsListRequest: -// return .run { [pageIndex = state.pageIndex] send in -// let response = await newsClient.fetchNewsList(pageIndex, FIXED_PAGE_SIZE) -// await send(.fetchNewsListResponse(response)) -// } -// -// case let .fetchNewsListResponse(.success(newsEntityList)): -// let newsListItems = state.makeNewsListItems(from: newsEntityList) -// state.newsListItems.append(contentsOf: newsListItems) -// state.pageIndex += 1 -// return .none -// -// case let .newsListItems(id: id, action: .delegate(action)): -// switch action { -// case .onAppear: -// if id == state.newsListItems.ids.last { -// return .send(.fetchNewsListRequest) -// } -// case .tapped: -// if let newsEntity = state.newsListItems[id: id]?.newsEntity { -// return .send(.delegate(.select(newsEntity))) -// } -// } -// return .none -// -// default: -// return .none -// } -// } -// .forEach(\.newsListItems, action: /Action.newsListItems(id:action:)) { -// NewsListItemCellStore() -// } -// } -//} diff --git a/Targets/D3N/Sources/Feature/News/List/NewsListView.swift b/Targets/D3N/Sources/Feature/News/List/NewsListView.swift deleted file mode 100644 index cf47a08..0000000 --- a/Targets/D3N/Sources/Feature/News/List/NewsListView.swift +++ /dev/null @@ -1,45 +0,0 @@ -//// -//// NewsListView.swift -//// D3N -//// -//// Created by 송영모 on 10/17/23. -//// Copyright © 2023 sju. All rights reserved. -//// -// -//import Foundation -//import SwiftUI -// -//import ComposableArchitecture -// -//public struct NewsListView: View { -// let store: StoreOf -// -// public init(store: StoreOf) { -// self.store = store -// } -// -// public var body: some View { -// WithViewStore(self.store, observe: { $0 }) { viewStore in -// ScrollView { -// VStack { -// newsListItemsView -// .padding(.horizontal) -// -// Spacer() -// } -// } -// .navigationTitle("전체 뉴스") -// .onAppear { -// viewStore.send(.onAppear) -// } -// } -// } -// -// private var newsListItemsView: some View { -// LazyVStack { -// ForEachStore(self.store.scope(state: \.newsListItems, action: NewsListStore.Action.newsListItems(id:action:))) { -// NewsListItemCellView(store: $0) -// } -// } -// } -//} diff --git a/Targets/D3N/Sources/Feature/Quiz/List/Cell/ChoiceListItemCellStore.swift b/Targets/D3N/Sources/Feature/Quiz/List/Cell/ChoiceListItemCellStore.swift deleted file mode 100644 index cffd54b..0000000 --- a/Targets/D3N/Sources/Feature/Quiz/List/Cell/ChoiceListItemCellStore.swift +++ /dev/null @@ -1,56 +0,0 @@ -// -// ChoiceListItemCellStore.swift -// D3N -// -// Created by 송영모 on 10/14/23. -// Copyright © 2023 sju. All rights reserved. -// - -import Foundation - -import ComposableArchitecture - -public struct ChoiceListItemCellStore: Reducer { - public struct State: Equatable, Identifiable { - public var id: UUID - public let choice: String - public var isSelected: Bool - - public init( - id: UUID = .init(), - choice: String, - isSelected: Bool = false - ) { - self.id = id - self.choice = choice - self.isSelected = isSelected - } - } - - public enum Action: Equatable { - case onAppear - - case tapped - - case delegate(Delegate) - - public enum Delegate: Equatable { - case tapped - } - } - - public var body: some ReducerOf { - Reduce { state, action in - switch action { - case .onAppear: - return .none - - case .tapped: - return .send(.delegate(.tapped)) - - default: - return .none - } - } - } -} diff --git a/Targets/D3N/Sources/Feature/Quiz/List/Cell/ChoiceListItemCellView.swift b/Targets/D3N/Sources/Feature/Quiz/List/Cell/ChoiceListItemCellView.swift deleted file mode 100644 index fffbdfa..0000000 --- a/Targets/D3N/Sources/Feature/Quiz/List/Cell/ChoiceListItemCellView.swift +++ /dev/null @@ -1,39 +0,0 @@ -// -// ChoiceListItemCellView.swift -// D3N -// -// Created by 송영모 on 10/14/23. -// Copyright © 2023 sju. All rights reserved. -// - -import Foundation -import SwiftUI - -import ComposableArchitecture - -public struct ChoiceListItemCellView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(self.store, observe: { $0 }) { viewStore in - HStack { - Button(action: { - viewStore.send(.tapped) - }, label: { - Label( - LocalizedStringKey(viewStore.state.choice), - systemImage: viewStore.state.isSelected ? "circle.fill" : "circle" - ) - }) - .font(.subheadline) - .foregroundStyle(.foreground) - - Spacer() - } - } - } -} diff --git a/Targets/D3N/Sources/Feature/Quiz/Result/Cell/QuizResultItemCellStore.swift b/Targets/D3N/Sources/Feature/Quiz/Result/Cell/QuizResultItemCellStore.swift deleted file mode 100644 index 3493f2d..0000000 --- a/Targets/D3N/Sources/Feature/Quiz/Result/Cell/QuizResultItemCellStore.swift +++ /dev/null @@ -1,54 +0,0 @@ -//// -//// QuizResultItemCellStore.swift -//// D3N -//// -//// Created by 송영모 on 10/15/23. -//// Copyright © 2023 sju. All rights reserved. -//// -// -// -//import Foundation -// -//import ComposableArchitecture -// -//public struct QuizResultItemCellStore: Reducer { -// public struct State: Equatable, Identifiable { -// public var id: UUID -// public var quizEntity: QuizEntity -// -// public init( -// id: UUID = .init(), -// quizEntity: QuizEntity -// ) { -// self.id = id -// self.quizEntity = quizEntity -// } -// } -// -// public enum Action: Equatable { -// case onAppear -// -// case tapped -// -// case delegate(Delegate) -// -// public enum Delegate: Equatable { -// case tapped -// } -// } -// -// public var body: some ReducerOf { -// Reduce { state, action in -// switch action { -// case .onAppear: -// return .none -// -// case .tapped: -// return .send(.delegate(.tapped)) -// -// default: -// return .none -// } -// } -// } -//} diff --git a/Targets/D3N/Sources/Feature/Quiz/Result/Cell/QuizResultItemCellView.swift b/Targets/D3N/Sources/Feature/Quiz/Result/Cell/QuizResultItemCellView.swift deleted file mode 100644 index e19e0c5..0000000 --- a/Targets/D3N/Sources/Feature/Quiz/Result/Cell/QuizResultItemCellView.swift +++ /dev/null @@ -1,93 +0,0 @@ -//// -//// QuizResultItemCellView.swift -//// D3N -//// -//// Created by 송영모 on 10/15/23. -//// Copyright © 2023 sju. All rights reserved. -//// -// -//import Foundation -//import SwiftUI -// -//import ComposableArchitecture -// -//public struct QuizResultItemCellView: View { -// let store: StoreOf -// -// public var body: some View { -// WithViewStore(self.store, observe: { $0 }) { viewStore in -// VStack { -// VStack { -// titleView(viewStore: viewStore) -// -// quizResultListView(viewStore: viewStore) -// } -// .minimalBackgroundStyle() -// -// reasoneView(viewStore: viewStore) -// .minimalBackgroundStyle() -// } -// .padding(.horizontal) -// } -// } -// private func titleView(viewStore: ViewStoreOf) -> some View { -// HStack { -// Text(viewStore.state.quizEntity.question) -// .font(.title3) -// .fontWeight(.semibold) -// .lineLimit(nil) -// .fixedSize(horizontal: false, vertical: true) -// -// Spacer() -// } -// } -// -// private func quizResultListView(viewStore: ViewStoreOf) -> some View { -// VStack(alignment: .leading) { -// HStack { -// Spacer() -// } -// ForEach(Array(viewStore.state.quizEntity.choiceList.enumerated()), id: \.offset) { index, choice in -// Label(title: { -// Text(choice) -// }, icon: { -// quizResultItemImage( -// current: index, -// answer: viewStore.state.quizEntity.answer, -// userAnswer: viewStore.state.quizEntity.selectedAnswer ?? 0 -// ) -// }) -// .font(.subheadline) -// } -// } -// } -// -// private func reasoneView(viewStore: ViewStoreOf) -> some View { -// HStack { -// Text(viewStore.state.quizEntity.reason) -// .font(.subheadline) -// .lineLimit(nil) -// .fixedSize(horizontal: false, vertical: true) -// -// Spacer() -// } -// } -// -// private func quizResultItemImage(current: Int, answer: Int, userAnswer: Int) -> some View { -// VStack { -// if current == answer && current == userAnswer { -// return Image(systemName: "checkmark.circle.fill") -// .foregroundStyle(.mint) -// } else if current == answer { -// return Image(systemName: "checkmark.circle.fill") -// .foregroundStyle(.pink) -// } else if current == userAnswer { -// return Image(systemName: "circle.fill") -// .foregroundStyle(.foreground) -// } else { -// return Image(systemName: "circle") -// .foregroundStyle(.foreground) -// } -// } -// } -//} diff --git a/Targets/D3N/Sources/Feature/Quiz/Result/QuizResultStore.swift b/Targets/D3N/Sources/Feature/Quiz/Result/QuizResultStore.swift deleted file mode 100644 index 8848751..0000000 --- a/Targets/D3N/Sources/Feature/Quiz/Result/QuizResultStore.swift +++ /dev/null @@ -1,61 +0,0 @@ -//// -//// QuizResultStore.swift -//// D3N -//// -//// Created by 송영모 on 10/15/23. -//// Copyright © 2023 sju. All rights reserved. -//// -// -//import Foundation -// -//import ComposableArchitecture -// -//public struct QuizResultStore: Reducer { -// public struct State: Equatable { -// var quizEntityList: [QuizEntity] -// -// var collectCount: Int -// var quizResultItems: IdentifiedArrayOf = [] -// -// public init(quizEntityList: [QuizEntity]) { -// self.quizEntityList = quizEntityList -// self.collectCount = quizEntityList.filter({ $0.selectedAnswer == $0.answer }).count -// self.quizResultItems = .init( -// uniqueElements: quizEntityList.map { quizEntity in -// return .init(quizEntity: quizEntity) -// } -// ) -// } -// } -// -// public enum Action: Equatable { -// case onAppear -// -// case firstButtonTapped -// -// case quizResultItems(id: QuizResultItemCellStore.State.ID, action: QuizResultItemCellStore.Action) -// case delegate(Delegate) -// -// public enum Delegate: Equatable { -// case backToRoot -// } -// } -// -// public var body: some ReducerOf { -// Reduce { state, action in -// switch action { -// case .onAppear: -// return .none -// -// case .firstButtonTapped: -// return .send(.delegate(.backToRoot)) -// -// default: -// return .none -// } -// } -// .forEach(\.quizResultItems, action: /Action.quizResultItems(id:action:)) { -// QuizResultItemCellStore() -// } -// } -//} diff --git a/Targets/D3N/Sources/Feature/Quiz/Result/QuizResultView.swift b/Targets/D3N/Sources/Feature/Quiz/Result/QuizResultView.swift deleted file mode 100644 index ba2ea7f..0000000 --- a/Targets/D3N/Sources/Feature/Quiz/Result/QuizResultView.swift +++ /dev/null @@ -1,70 +0,0 @@ -//// -//// QuizResultView.swift -//// D3N -//// -//// Created by 송영모 on 10/15/23. -//// Copyright © 2023 sju. All rights reserved. -//// -// -//import Foundation -//import SwiftUI -// -//import ComposableArchitecture -// -//public struct QuizResultView: View { -// let store: StoreOf -// -// public var body: some View { -// WithViewStore(self.store, observe: { $0 }) { viewStore in -// GeometryReader { proxy in -// ScrollView { -// VStack(alignment: .leading) { -// titleView(collect: viewStore.state.collectCount, whole: viewStore.state.quizEntityList.count) -// .padding(.horizontal) -// -// quizResultItemsView() -// -// Spacer() -// -// MinimalButton( -// title: "처음으로", -// action: { -// viewStore.send(.firstButtonTapped) -// } -// ) -// .padding() -// } -// .frame(minHeight: proxy.size.height) -// } -// } -// .navigationBarTitleDisplayMode(.inline) -// .navigationBarBackButtonHidden() -// .toolbar(.hidden, for: .tabBar) -// } -// } -// -// private func titleView(collect: Int, whole: Int) -> some View { -// HStack(spacing: .zero) { -// Text("\(whole)문제 중 ") -// .fontWeight(.semibold) -// .font(.title) -// -// Text("\(collect)") -// .font(.title) -// .fontWeight(.semibold) -// .foregroundStyle(.mint) -// -// Text("문제를 맞췄습니다.") -// .fontWeight(.semibold) -// .font(.title) -// } -// } -// -// private func quizResultItemsView() -> some View { -// VStack(spacing: 20) { -// ForEachStore(self.store.scope(state: \.quizResultItems, action: QuizResultStore.Action.quizResultItems(id:action:))) { -// QuizResultItemCellView(store: $0) -// } -// } -// } -//} diff --git a/Targets/D3N/Sources/Feature/Today/Detail/TodayDetailStore.swift b/Targets/D3N/Sources/Feature/Today/Detail/TodayDetailStore.swift deleted file mode 100644 index 07d7952..0000000 --- a/Targets/D3N/Sources/Feature/Today/Detail/TodayDetailStore.swift +++ /dev/null @@ -1,30 +0,0 @@ -//// -//// TodayDetailStore.swift -//// D3N -//// -//// Created by 송영모 on 10/12/23. -//// Copyright © 2023 sju. All rights reserved. -//// -// -//import ComposableArchitecture -// -//public struct TodayDetailStore: Reducer { -// public struct State: Equatable { } -// -// public enum Action: Equatable { -// case onAppear -// } -// -// public var body: some ReducerOf { -// Reduce { state, action in -// switch action { -// case .onAppear: -// return .none -// -// default: -// return .none -// } -// } -// } -//} -// diff --git a/Targets/D3N/Sources/Feature/Today/Detail/TodayDetailView.swift b/Targets/D3N/Sources/Feature/Today/Detail/TodayDetailView.swift deleted file mode 100644 index 8ef1e05..0000000 --- a/Targets/D3N/Sources/Feature/Today/Detail/TodayDetailView.swift +++ /dev/null @@ -1,26 +0,0 @@ -//// -//// TodayDetailView.swift -//// D3N -//// -//// Created by 송영모 on 10/12/23. -//// Copyright © 2023 sju. All rights reserved. -//// -// -//import Foundation -//import SwiftUI -// -//import ComposableArchitecture -// -//public struct TodayDetailView: View { -// let store: StoreOf -// -// public init(store: StoreOf) { -// self.store = store -// } -// -// public var body: some View { -// WithViewStore(self.store, observe: { $0 }) { viewStore in -// Text("Today Detail") -// } -// } -//}