Skip to content

Commit

Permalink
refactor #51: 점수 목록 뷰 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
enebin committed Aug 18, 2023
1 parent 42aaf55 commit 8f11bf7
Show file tree
Hide file tree
Showing 12 changed files with 150 additions and 20 deletions.
17 changes: 0 additions & 17 deletions Projects/DSKit/Sources/Font/DynamicText.swift

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

import Foundation

public struct CharacterScore: Identifiable {
public struct CharacterScore: Identifiable, Equatable {
public let id = UUID()
public let score: Int
public let date: Date
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -433,7 +433,7 @@ struct CirclePackView_Previews: PreviewProvider {
icon: Image(systemName: "person.fill"),
keyword: "표현력",
averageScore: 4.2,
myScore: 3.5)),
myScore: 3.5))
],
detailViewBuilder: { _ in
let scores = [
Expand Down
8 changes: 7 additions & 1 deletion Projects/Features/Sources/MyPage/MyPageView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,24 @@ import SwiftUI

struct MyPageView: View {
private let store: StoreOf<MyPageFeature>
private let scoreListStore: StoreOf<ScoreListFeature>

init(store: StoreOf<MyPageFeature>) {
self.store = store
self.scoreListStore = Store(initialState: ScoreListFeature.State(), reducer: {
ScoreListFeature()
})

store.send(.loadCircle)
scoreListStore.send(.loadScores)
}

public var body: some View {
WithViewStore(store, observe: { $0 }) { viewStore in
CirclePackView(
data: viewStore.state.circleDataList,
detailViewBuilder: { data in
Text(data.id.uuidString)
ScoreListView(nickname: "ninkname", keyword: data.metadata.keyword, store: scoreListStore) // TODO: Change nickname
})
.graphBackgroundColor(.hex("232323"))
.activateCircleBlink(viewStore.state.shownFirstTime)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
//
// ScoreListFeature.swift
// Features
//
// Created by Young Bin on 2023/08/15.
// Copyright © 2023 team.humanwave. All rights reserved.
//

import Foundation
132 changes: 132 additions & 0 deletions Projects/Features/Sources/MyPage/ScoreList/ScoreListView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
//
// ScoreListView.swift
// Features
//
// Created by Young Bin on 2023/08/15.
// Copyright © 2023 team.humanwave. All rights reserved.
//

import Foundation

import SwiftUI
import ComposableArchitecture
import Domain
import DSKit

struct ScoreListFeature: Reducer {
public struct State: Equatable {
var totalCount: Int?
var scores: [CharacterScore]

public init(totalCount: Int? = nil, scores: [CharacterScore] = []) {
self.scores = []
}
}

public enum Action: Equatable {
case loadScores
case saveScores(totalCount: Int, scores: [CharacterScore])
}

public var body: some ReducerOf<Self> {
Reduce { state, action in
switch action {
case .loadScores:
return .run { send in
try await Task.sleep(until: .now + .seconds(0.5), clock: .continuous)
await send(.saveScores(
totalCount: 16,
scores: [
CharacterScore(score: 3, date: Date()),
CharacterScore(score: 3, date: Date()),
CharacterScore(score: 3, date: Date()),
CharacterScore(score: 3, date: Date()),
CharacterScore(score: 3, date: Date())
]
))
}

case .saveScores(let totalCount, let data):
state.totalCount = totalCount
state.scores.append(contentsOf: data)
}
return .none
}
}
}

struct ScoreListView: View {
private let formatter: RelativeDateTimeFormatter
private let nickname: String
private let keyword: String
private let store: StoreOf<ScoreListFeature>

init(nickname: String, keyword: String, store: StoreOf<ScoreListFeature>) {
self.formatter = RelativeDateTimeFormatter()
formatter.locale = Locale(identifier: "ko_KR")
formatter.dateTimeStyle = .named

self.nickname = nickname
self.keyword = keyword
self.store = store
}

var body: some View {
WithViewStore(store, observe: { $0 }) { viewStore in
ScrollView {
LazyVStack(alignment: .leading, spacing: 8) {
Text.keyme("\(nickname)님의 \(keyword) 정도는?", font: .body1)
.foregroundColor(keymeWhite)

Text.keyme("응답자 수 \(viewStore.state.totalCount ?? 0)", font: .body3Regular)
.foregroundColor(DSKitAsset.Color.keymeWhite.swiftUIColor.opacity(0.6))

Divider()
.overlay(keymeWhite.opacity(0.1))

ForEach(viewStore.state.scores) { scoreData in
ZStack {
HStack {
Spacer()
Text.keyme("\(scoreData.score)", font: .body1)
.foregroundColor(.white)
Spacer()
}

HStack {
Spacer()
Text.keyme("\(formatter.localizedString(for: scoreData.date, relativeTo: Date()))", font: .caption1)
.foregroundColor(.white.opacity(0.3))
}
}
.padding(.horizontal, 12)
.frame(maxWidth: .infinity, minHeight: 85, maxHeight: 85)
.background(keymeWhite.opacity(0.05))
.cornerRadius(16)
.onAppear {
if
let thirdToLast = viewStore.state.scores.dropLast(2).last,
thirdToLast == scoreData
{
viewStore.send(.loadScores)
}
}
}
}
.padding(.horizontal, 17)
}
}
}

var keymeWhite: Color {
DSKitAsset.Color.keymeWhite.swiftUIColor
}
}

struct ScoreListView_Previews: PreviewProvider {
static var previews: some View {
MorePersonalityView(store: Store(initialState: MorePersonalityFeature.State(), reducer: {
MorePersonalityFeature()
}))
}
}

0 comments on commit 8f11bf7

Please sign in to comment.