Skip to content

Commit

Permalink
Merge pull request #85 from Nexters/refactor/network-manager
Browse files Browse the repository at this point in the history
๋„คํŠธ์›Œํฌ ๋งค๋‹ˆ์ € ๋ฆฌํŒฉํ† ๋ง
  • Loading branch information
enebin authored Sep 3, 2023
2 parents 3e8698f + dad5a33 commit ee8d21f
Show file tree
Hide file tree
Showing 44 changed files with 989 additions and 615 deletions.
Binary file modified Encrypted/Secrets/GoogleService-Info.plist.encrypted
Binary file not shown.
Binary file modified Encrypted/XCConfig/App/DEV.xcconfig.encrypted
Binary file not shown.
2 changes: 1 addition & 1 deletion Encrypted/XCConfig/App/PROD.xcconfig.encrypted
Original file line number Diff line number Diff line change
@@ -1 +1 @@
๏ฟฝd๏ฟฝ๏ฟฝBJุ ๏ฟฝ๏ฟฝ๏ฟฝLH๏ฟฝ8๏ฟฝv2c๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝmHย ๏ฟฝ"?^F1Xn๏ฟฝo^๏ฟฝ |๏ฟฝั‚๏ฟฝ2x>๏ฟฝSFgtmz \๏ฟฝ๏ฟฝ๏ฟฝิŒ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝuQ&uD๏ฟฝ0๏ฟฝp>y๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ|/๏ฟฝN&Ucลž๏ฟฝ;RV๏ฟฝ๏ฟฝ$๏ฟฝH๏ฟฝK๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝX6W]๏ฟฝnu.๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝi}๏ฟฝD๏ฟฝลŸ?๏ฟฝ๏ฟฝ~Jod >๏ฟฝw๏ฟฝ๏ฟฝ๏ฟฝR
๏ฟฝd๏ฟฝ๏ฟฝBJุ ๏ฟฝ๏ฟฝ๏ฟฝLH๏ฟฝ8๏ฟฝv2c๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝmHย ๏ฟฝ"?^F1Xn๏ฟฝo^๏ฟฝ |๏ฟฝั‚๏ฟฝ2x>๏ฟฝSFgtmz \๏ฟฝ๏ฟฝ๏ฟฝิŒ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝuQ&=O๏ฟฝ๏ฟฝpV๏ฟฝ๏ฟฝfa๏ฟฝzuc)๏ฟฝ!๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝwW๏ฟฝ0+SXl>7{๏ฟฝmD@๏ฟฝ๏ฟฝ๏ฟฝZ๏ฟฝ]๏ฟฝ๏ฟฝๅขž๏ฟฝo๏ฟฝ_{๏ฟฝZ๏ฟฝ๏ฟฝ๏ฟฝEx๏ฟฝ6 l}๏ฟฝ5`๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝW๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ.?๏ฟฝ๏ฟฝh๏ฟฝ๏ฟฝo>Hหˆ4๏ฟฝ๏ฟฝ: Sัข๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝC^7L๏ฟฝ
Expand Down
31 changes: 16 additions & 15 deletions Projects/Domain/Sources/Client/KeymeTestsClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -25,29 +25,30 @@ extension DependencyValues {
}

extension KeymeTestsClient: DependencyKey {
public static var liveValue = KeymeTestsClient(
public static var liveValue = getClient(with: KeymeAPIManager.liveValue)
public static var testValue = getClient(with: KeymeAPIManager.testValue)
}

private func getClient(with network: KeymeAPIManager) -> KeymeTestsClient {
KeymeTestsClient(
fetchOnboardingTests: {
let api = KeymeTestsAPI.onboarding
// var response = try await KeymeTestsAPIManager.shared.requestWithSampleData(api, object: KeymeTestsDTO.self)
var response = try await KeymeTestsAPIManager.shared.request(api, object: KeymeTestsDTO.self)
let api = KeymeAPI.test(.onboarding)
let response = try await network.request(api, object: KeymeTestsDTO.self)

return response.toIconModel()
return response.toKeymeTestsModel()
}, fetchDailyTests: {
let api = KeymeTestsAPI.daily
// var response = try await KeymeTestsAPIManager.shared.requestWithSampleData(api, object: KeymeTestsDTO.self)
var response = try await KeymeTestsAPIManager.shared.request(api, object: KeymeTestsDTO.self)
let api = KeymeAPI.test(.daily)
let response = try await network.request(api, object: KeymeTestsDTO.self)

return response.toIconModel()
return response.toKeymeTestsModel()
}, fetchTestResult: { testResultId in
let api = KeymeTestsAPI.result(testResultId)
// var response = try await KeymeTestsAPIManager.shared.requestWithSampleData(api, object: TestResultDTO.self)
var response = try await KeymeTestsAPIManager.shared.request(api, object: TestResultDTO.self)
let api = KeymeAPI.test(.result(testResultId))
let response = try await network.request(api, object: TestResultDTO.self)

return response.data.results.map { $0.toModel() }
}, postTestResult: { resultCode in
let api = KeymeTestsAPI.register(resultCode)
// var response = try await KeymeTestsAPIManager.shared.requestWithSampleData(api, object: BaseDTO<String>.self)
var response = try await KeymeTestsAPIManager.shared.request(api, object: BaseDTO<String>.self)
let api = KeymeAPI.test(.register(resultCode))
let response = try await network.request(api, object: BaseDTO<String>.self)

return response.message
}
Expand Down
35 changes: 0 additions & 35 deletions Projects/Domain/Sources/Client/TestClient.swift

This file was deleted.

9 changes: 9 additions & 0 deletions Projects/Domain/Sources/Model/CirclePack/CharacterScore.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
// Copyright ยฉ 2023 team.humanwave. All rights reserved.
//

import Network
import Foundation

public struct CharacterScore: Identifiable, Equatable {
Expand All @@ -18,3 +19,11 @@ public struct CharacterScore: Identifiable, Equatable {
self.date = date
}
}

public extension QuestionResultScoresDTO {
func toCharacterScores() -> [CharacterScore] {
return self.data.results.map { resultItem in
CharacterScore(score: resultItem.score, date: resultItem.createdAt)
}
}
}
9 changes: 3 additions & 6 deletions Projects/Domain/Sources/Model/KeymeTestsModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import Network
import Kingfisher

public struct KeymeTestsModel: Equatable {
public let nickname: String
public let testId: Int
public let icons: [IconModel]
}
Expand All @@ -26,14 +25,12 @@ public struct IconModel: Equatable, Hashable {
}

public extension KeymeTestsDTO {
func toIconModel() -> KeymeTestsModel {
let nickname = data.owner.nickname
func toKeymeTestsModel() -> KeymeTestsModel {
let icons = data.questions.map {
IconModel(imageURL: $0.category.iconUrl,
color: Color.hex($0.category.color))
}
return KeymeTestsModel(nickname: nickname ?? "ํ‚ค๋ฏธ",
testId: data.testId,
icons: icons)

return KeymeTestsModel(testId: data.testId, icons: icons)
}
}
2 changes: 1 addition & 1 deletion Projects/Domain/Sources/Model/KeymeWebModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import Foundation

public struct KeymeWebViewModel: Codable, Equatable {
public let matchRate: Int
public let matchRate: Float
public let resultCode: String
public let testResultId: Int
}
21 changes: 0 additions & 21 deletions Projects/Domain/Sources/Model/TestModel.swift

This file was deleted.

16 changes: 14 additions & 2 deletions Projects/Domain/Sources/User/KeymeUserStorage.swift
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ public final class KeymeUserStorage {

private enum UserStorageKey: String, StorageKeyType {
case accessToken
case userId
case friendCode
case nickname
case profileImageURL
case profileThumbnailURL
Expand All @@ -45,19 +47,29 @@ public extension KeymeUserStorage {
set { set(newValue, forKey: .accessToken) }
}

var userId: Int? {
get { get(.userId) as? Int }
set { set(newValue, forKey: .userId) }
}

var friendCode: String? {
get { get(.friendCode) as? String }
set { set(newValue, forKey: .friendCode) }
}

var nickname: String? {
get { get(.nickname) as? String }
set { set(newValue, forKey: .nickname) }
}

var profileImageURL: URL? {
get { get(.profileImageURL) as? URL }
set { set(newValue, forKey: .profileImageURL) }
set { set(newValue?.absoluteString, forKey: .profileImageURL) }
}

var profileThumbnailURL: URL? {
get { get(.profileThumbnailURL) as? URL }
set { set(newValue, forKey: .profileThumbnailURL) }
set { set(newValue?.absoluteString, forKey: .profileThumbnailURL) }
}
}

Expand Down
61 changes: 61 additions & 0 deletions Projects/Features/Sources/Home/KeymeTestHomeFeature.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
//
// KeymeTestHomeFeature.swift
// Features
//
// Created by ์ด์˜๋นˆ on 2023/08/30.
// Copyright ยฉ 2023 team.humanwave. All rights reserved.
//

import ComposableArchitecture
import Domain
import Network

struct KeymeTestsHomeFeature: Reducer {
@Dependency(\.keymeAPIManager) private var network

// ํ…Œ์ŠคํŠธ๋ฅผ ์•„์ง ํ’€์ง€ ์•Š์•˜๊ฑฐ๋‚˜, ํ’€์—ˆ๊ฑฐ๋‚˜ 2๊ฐ€์ง€ ์ผ€์ด์Šค๋งŒ ์กด์žฌ
struct State: Equatable {
@PresentationState var testStartViewState: KeymeTestsStartFeature.State?
var view: View

struct View: Equatable {
let nickname: String
var dailyTestId: Int?
}

init(nickname: String) {
self.view = View(nickname: nickname)
}
}

enum Action {
case fetchDailyTests
case showTestStartView(testData: KeymeTestsModel)
case startTest(PresentationAction<KeymeTestsStartFeature.Action>)

enum View {}
}

var body: some ReducerOf<Self> {
Reduce { state, action in
switch action {
case .fetchDailyTests:
return .run { send in
let fetchedTest = try await network.request(.test(.daily), object: KeymeTestsDTO.self)
let testData = fetchedTest.toKeymeTestsModel()

await send(.showTestStartView(testData: testData))
}

case .showTestStartView(let testData):
state.view.dailyTestId = testData.testId
state.testStartViewState = .init(nickname: state.view.nickname, testData: testData)

default:
break
}

return .none
}
}
}
71 changes: 71 additions & 0 deletions Projects/Features/Sources/Home/KeymeTestHomeView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
//
// KeymeTestHomeView.swift
// Features
//
// Created by ์ด์˜๋นˆ on 2023/08/30.
// Copyright ยฉ 2023 team.humanwave. All rights reserved.
//

import ComposableArchitecture
import DSKit
import SwiftUI

struct KeymeTestsHomeView: View {
var store: StoreOf<KeymeTestsHomeFeature>

init(store: StoreOf<KeymeTestsHomeFeature>) {
self.store = store
store.send(.fetchDailyTests)
}

var body: some View {
WithViewStore(store, observe: { $0.view }) { viewStore in
ZStack(alignment: .center) {
DSKitAsset.Color.keymeBlack.swiftUIColor.ignoresSafeArea()

VStack(alignment: .leading) {
// Filler
Spacer().frame(height: 75)

welcomeText(nickname: viewStore.nickname)
.foregroundColor(DSKitAsset.Color.keymeWhite.swiftUIColor)

Spacer()
}
.fullFrame()
.padding(.horizontal, 16)

// ํ…Œ์ŠคํŠธ ๋ทฐ
testView

// ๊ฒฐ๊ณผ ํ™”๋ฉด ํ‘œ์‹œ๋„ ์ƒ๊ฐ

}
}
}
}

extension KeymeTestsHomeView {
var testView: some View {
let startTestStore = store.scope(
state: \.$testStartViewState,
action: KeymeTestsHomeFeature.Action.startTest)

return IfLetStore(startTestStore) { store in
KeymeTestsStartView(store: store)
} else: {
Circle()
.strokeBorder(.white.opacity(0.3), lineWidth: 1)
.background(Circle().foregroundColor(.white.opacity(0.3)))
.frame(width: 280, height: 280)
}
}

func welcomeText(nickname: String) -> some View {
Text.keyme(
"ํ™˜์˜ํ•ด์š” \(nickname)๋‹˜!",
// "ํ™˜์˜ํ•ด์š” \(viewStore.nickname)๋‹˜!\n์ด์ œ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณผ๊นŒ์š”?",
font: .heading1)
}

}
Loading

0 comments on commit ee8d21f

Please sign in to comment.