Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FIXME: 코드 1차 수정 #77

Closed
wants to merge 1 commit into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
fixme: 코드 1차 수정
  • Loading branch information
greetings1012 committed Dec 6, 2023
commit 371cab73fb0197e329bd2d4298fb6dbfd39bbecb
2 changes: 1 addition & 1 deletion Targets/D3N/Sources/Domain/D3NAPIProvider.swift
Original file line number Diff line number Diff line change
@@ -61,7 +61,7 @@ final class D3NAPIProvider {
}
}

private static func request<T: TargetType>(target: T) async -> Result<Response, MoyaError> {
public static func request<T: TargetType>(target: T) async -> Result<Response, MoyaError> {
await withCheckedContinuation { continuation in
provider.request(MultiTarget(target)) { result in
continuation.resume(returning: result)
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
//
// SwiftUIView.swift
// FetchSolvedQuizListResponseDTO.swift
// D3N
//
// Created by Younghoon Ahn on 11/28/23.
31 changes: 24 additions & 7 deletions Targets/D3N/Sources/Domain/Quiz/Entity/SolvedQuizEntity.swift
Original file line number Diff line number Diff line change
@@ -8,12 +8,29 @@

import Foundation

public struct SolvedQuizEntity: Equatable {
public struct SolvedQuizEntity: Equatable, Codable {
let id: Int
let question: String
let choiceList: [String]
let answer: Int
let reason: String
let selectedAnswer: Int
let news: NewsEntity
let question: String
let choiceList: [String]
let answer: Int
let reason: String
let selectedAnswer: Int
let news: NewsEntity

init(id: Int,
question: String,
choiceList: [String],
answer: Int,
reason: String,
selectedAnswer: Int,
news: NewsEntity
) {
self.id = id
self.question = question
self.choiceList = choiceList
self.answer = answer
self.reason = reason
self.selectedAnswer = selectedAnswer
self.news = news
}
}
5 changes: 0 additions & 5 deletions Targets/D3N/Sources/Domain/Quiz/QuizService.swift
Original file line number Diff line number Diff line change
@@ -12,7 +12,6 @@ import Moya

public enum QuizService {
case fetch(newsId: Int)
case fetchSolved(newsId: Int)
case submit(quizs: [QuizEntity])
case updateTime(quizId: Int, secondTime: Int)
}
@@ -23,7 +22,6 @@ extension QuizService: TargetType {
public var path: String {
switch self {
case .fetch: return "quiz/list"
case .fetchSolved: return "quiz/list/solved"
case .submit: return "quiz/list/submit"
case .updateTime: return "quiz/time"
}
@@ -32,7 +30,6 @@ extension QuizService: TargetType {
public var method: Moya.Method {
switch self {
case .fetch: return .get
case .fetchSolved: return .get
case .submit: return .post
case .updateTime: return .patch
}
@@ -42,8 +39,6 @@ extension QuizService: TargetType {
switch self {
case let .fetch(newsId: id):
return .requestParameters(parameters: ["newsId": id], encoding: URLEncoding.queryString)
case let .fetchSolved(newsId: id):
return .requestParameters(parameters: ["newsId": id], encoding: URLEncoding.queryString)
case let .submit(quizs):
let dto: SubmitQuizListRequestDTO = quizs.compactMap {
if let userAnswer = $0.selectedAnswer {
44 changes: 44 additions & 0 deletions Targets/D3N/Sources/Domain/Quiz/SolvedQuizClient.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
//
// SolvedQuizClient.swift
// D3N
//
// Created by Younghoon Ahn on 11/29/23.
// Copyright © 2023 sju. All rights reserved.
//

import Foundation

import ComposableArchitecture
import Moya

struct SolvedQuizClient {
var fetch: (Int) async -> Result<[SolvedQuizEntity], D3NAPIError>
}

extension SolvedQuizClient: TestDependencyKey {
static let previewValue = Self(
fetch: { _ in .failure(.none) }
)

static let testValue = Self(
fetch: unimplemented("\(Self.self).fetch")
)
Comment on lines +14 to +25
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

client를 또 추가할 필요가 없는 이유는 Quiz라는 도메인으로 묶어서 생각할 수 있기 때문이라고 생각합니다. 기존에 있는 QuizClient에 fetchSolved를 하는 방식이 응집도가 높아서 더 좋아보입니다.

}

extension DependencyValues {
var solvedQuizClient: SolvedQuizClient {
get { self[SolvedQuizClient.self] }
}
}

extension SolvedQuizClient: DependencyKey {
static let liveValue = SolvedQuizClient(
fetch: { _ in
let target: TargetType = SolvedQuizService.fetch
let response: Result<FetchSolvedQuizListResponseDTO, D3NAPIError> = await D3NAPIkProvider.reqeust(target: target)

return response.map { $0.map { $0.toEntity() } }
}
)
}

41 changes: 41 additions & 0 deletions Targets/D3N/Sources/Domain/Quiz/SolvedQuizService.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
//
// SolvedQuizService.swift
// D3N
//
// Created by Younghoon Ahn on 11/29/23.
// Copyright © 2023 sju. All rights reserved.
//

import Foundation

import Moya

public enum SolvedQuizService {
case fetch
}

extension SolvedQuizService: TargetType {
public var baseURL: URL { URL(string: Environment.baseURL)! }

public var path: String {
switch self {
case .fetch: return "quiz/list/solved"
}
}

public var method: Moya.Method {
switch self {
case .fetch: return .get
}
}

Comment on lines +13 to +31
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

비슷한 피드백으로 QuizService에 들어가야할 내용이라고 생각합니다. 그리고 이미 들어가있는것으로 알고있습니다!

public var task: Task {
switch self {
case .fetch:
return .requestPlain
}
}

public var headers: [String: String]? { nil }
}

10 changes: 5 additions & 5 deletions Targets/D3N/Sources/Feature/MyPage/Main/MyPageMainStore.swift
Original file line number Diff line number Diff line change
@@ -24,15 +24,15 @@ public struct MyPageMainStore: Reducer {
case appleUnlinkRequest
case appleUnlinkResponse(Result<Bool, D3NAPIError>)

case solvedNewsButtonTapped
case solvedQuizButtonTapped

case alert(PresentationAction<Alert>)
case delegate(Delegate)

public enum Delegate: Equatable {
case unlinked
case solvedNewsButtonTapped
case select(NewsEntity)
case solvedQuizButtonTapped
case select(SolvedQuizEntity)
}

public enum Alert: Equatable {
@@ -66,8 +66,8 @@ public struct MyPageMainStore: Reducer {
return .run { send in
await send(.appleUnlinkResponse(await authClient.appleUnlink()))
}
case .solvedNewsButtonTapped:
return .send(.delegate(.solvedNewsButtonTapped))
case .solvedQuizButtonTapped:
return .send(.delegate(.solvedQuizButtonTapped))

case .appleUnlinkResponse(.success), .appleUnlinkResponse(.failure):
return .send(.delegate(.unlinked))
Original file line number Diff line number Diff line change
@@ -35,7 +35,7 @@ public struct MyPageMainView: View {
private func personalSection(viewStore: ViewStoreOf<MyPageMainStore>) -> some View {
Section {
Button( action: {
viewStore.send(.solvedNewsButtonTapped)
viewStore.send(.solvedQuizButtonTapped)
}, label:{
Label(
title:{
Original file line number Diff line number Diff line change
@@ -11,10 +11,10 @@ import SwiftUI

import ComposableArchitecture

public struct SolvedNewsView: View {
let store: StoreOf<SolvedNewsStore>
public struct SolvedQuizView: View {
let store: StoreOf<SolvedQuizStore>

public init(store: StoreOf<SolvedNewsStore>) {
public init(store: StoreOf<SolvedQuizStore>) {
self.store = store
}

@@ -35,11 +35,11 @@ public struct SolvedNewsView: View {
}
}

private var newsListItemsView: some View {
private var QuizListItemsView: some View {
WithViewStore(self.store, observe: { $0 }) { viewStore in
if viewStore.state.isEmptyNewsEntityList() {
return AnyView(
Text("아직 풀어본 뉴스가 없어요")
Text("아직 풀어본 퀴즈가 없어요")
.font(.title2)
.foregroundColor(.gray)
.padding()
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
//
// SolvedQuizListItemCellStore.swift
// D3N
//
// Created by Younghoon Ahn on 12/1/23.
// Copyright © 2023 sju. All rights reserved.
//

import Foundation

import ComposableArchitecture

public struct SolvedQuizListItemCellStore: Reducer {
public struct State: Equatable, Identifiable {
public var id: Int

var question: String
var choices: [String]
var answer: Int
var reason: String
var userAnswer: Int
var news: NewsEntity

init(
id: Int = .init(),
question: String,
choices: [String],
answer: Int,
reason: String,
userAnswer: Int,
news: NewsEntity
) {
self.id = id
self.question = question
self.choices = choices
self.answer = answer
self.reason = reason
self.userAnswer = userAnswer
self.news = news
}
}

public enum Action: Equatable {
case onAppear

case delegate(Delegate)

public enum Delegate: Equatable {
case submit(Int)
}
}

public var body: some ReducerOf<Self> {
Reduce { state, action in
switch action {
case .onAppear:
return .none

default:
return .none
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
//
// SolvedQuizListItemCellView.swift
// D3N
//
// Created by Younghoon Ahn on 12/1/23.
// Copyright © 2023 sju. All rights reserved.
//

import Foundation
import SwiftUI

import ComposableArchitecture

public struct SolvedQuizListItemCellView: View {
let store: StoreOf<SolvedQuizListItemCellStore>

public init(store: StoreOf<SolvedQuizListItemCellStore>) {
self.store = store
}

public var body: some View {
WithViewStore(self.store, observe: { $0 }) { viewStore in
VStack {
Text(viewStore.state.question)
.padding(.top, 40)

Spacer()

ForEach(Array(viewStore.choices.enumerated()), id: \.offset) { index, choice in
VStack{
Text("Hello123")
}
}
.padding()
}
}
}
}