|
| 1 | +// |
| 2 | +// TraineeHomeFeature.swift |
| 3 | +// Presentation |
| 4 | +// |
| 5 | +// Created by ๋ฐ๋ฏผ์ on 2/2/25. |
| 6 | +// Copyright ยฉ 2025 yapp25thTeamTnT. All rights reserved. |
| 7 | +// |
| 8 | + |
| 9 | +import Foundation |
| 10 | +import ComposableArchitecture |
| 11 | + |
| 12 | +import Domain |
| 13 | + |
| 14 | +@Reducer |
| 15 | +public struct TraineeHomeFeature { |
| 16 | + |
| 17 | + @ObservableState |
| 18 | + public struct State: Equatable { |
| 19 | + // MARK: Data related state |
| 20 | + /// ์ ํ๋ ๋ ์ง |
| 21 | + var selectedDate: Date |
| 22 | + /// ์บ๋ฆฐ๋ ์ด๋ฒคํธ |
| 23 | + var events: [Date: Int] |
| 24 | + /// ์์
์ ๋ณด |
| 25 | + var sessionInfo: WorkoutListItemEntity? |
| 26 | + /// ๊ธฐ๋ก ์ ๋ณด ๋ชฉ๋ก |
| 27 | + var records: [RecordListItemEntity] |
| 28 | + |
| 29 | + // MARK: UI related state |
| 30 | + /// ์บ๋ฆฐ๋ ํ์ ํ์ด์ง |
| 31 | + var view_currentPage: Date |
| 32 | + /// ์์
์นด๋ ์๊ฐ ํ์ |
| 33 | + var view_sessionCardTimeString: String { |
| 34 | + guard let sessionInfo else { return "" } |
| 35 | + return "\(TDateFormatUtility.formatter(for: .a_HHmm).string(from: sessionInfo.startDate)) ~ \(TDateFormatUtility.formatter(for: .a_HHmm).string(from: sessionInfo.endDate))" |
| 36 | + } |
| 37 | + /// ๊ธฐ๋ก ์ ๋ชฉ ํ์ |
| 38 | + var view_recordTitleString: String { |
| 39 | + return TDateFormatUtility.formatter(for: .MM์_dd์ผ_EEEE).string(from: selectedDate) |
| 40 | + } |
| 41 | + /// ์ ํ ๋ฐํ
์ํธ ํ์ |
| 42 | + var view_isBottomSheetPresented: Bool |
| 43 | + |
| 44 | + public init( |
| 45 | + selectedDate: Date = .now, |
| 46 | + events: [Date: Int] = [:], |
| 47 | + sessionInfo: WorkoutListItemEntity? = nil, |
| 48 | + records: [RecordListItemEntity] = [], |
| 49 | + view_currentPage: Date = .now, |
| 50 | + view_isBottomSheetPresented: Bool = false |
| 51 | + ) { |
| 52 | + self.selectedDate = selectedDate |
| 53 | + self.events = events |
| 54 | + self.sessionInfo = sessionInfo |
| 55 | + self.records = records |
| 56 | + self.view_currentPage = view_currentPage |
| 57 | + self.view_isBottomSheetPresented = view_isBottomSheetPresented |
| 58 | + } |
| 59 | + } |
| 60 | + |
| 61 | + @Dependency(\.traineeUseCase) private var traineeUseCase: TraineeUseCase |
| 62 | + |
| 63 | + public enum Action: Sendable, ViewAction { |
| 64 | + /// ๋ทฐ์์ ๋ฐ์ํ ์ก์
์ ์ฒ๋ฆฌํฉ๋๋ค. |
| 65 | + case view(View) |
| 66 | + /// ๋ค๋น๊ฒ์ด์
์ฌ๋ถ ์ค์ |
| 67 | + case setNavigating |
| 68 | + |
| 69 | + @CasePathable |
| 70 | + public enum View: Sendable, BindableAction { |
| 71 | + /// ๋ฐ์ธ๋ฉํ ์ก์
์ ์ฒ๋ฆฌ |
| 72 | + case binding(BindingAction<State>) |
| 73 | + /// ์ฐ์ธก ์๋จ ์๋ฆผ ํ์ด์ง ๋ณด๊ธฐ ๋ฒํผ ํญ |
| 74 | + case tapAlarmPageButton |
| 75 | + /// ์๋จ ์์
๊ธฐ๋ก ๋ณด๊ธฐ ๋ฒํผ ํญ |
| 76 | + case tapShowSessionRecordButton(id: Int) |
| 77 | + /// ๊ธฐ๋ก ๋ชฉ๋ก ํผ๋๋ฐฑ ๋ณด๊ธฐ ๋ฒํผ ํญ |
| 78 | + case tapShowRecordFeedbackButton(id: Int) |
| 79 | + /// ์ฐ์ธก ํ๋จ ๊ธฐ๋ก ์ถ๊ฐ ๋ฒํผ ํญ |
| 80 | + case tapAddRecordButton |
| 81 | + /// ๊ฐ์ธ ์ด๋ ๊ธฐ๋ก ์ถ๊ฐ ๋ฒํผ ํญ |
| 82 | + case tapAddWorkoutRecordButton |
| 83 | + /// ์๋จ ๊ธฐ๋ก ์ถ๊ฐ ๋ฒํผ ํญ |
| 84 | + case tapAddMealRecordButton |
| 85 | + } |
| 86 | + } |
| 87 | + |
| 88 | + public init() {} |
| 89 | + |
| 90 | + public var body: some ReducerOf<Self> { |
| 91 | + BindingReducer(action: \.view) |
| 92 | + |
| 93 | + Reduce { state, action in |
| 94 | + switch action { |
| 95 | + |
| 96 | + case .view(let action): |
| 97 | + switch action { |
| 98 | + case .binding(\.selectedDate): |
| 99 | + print(state.events[state.selectedDate]) |
| 100 | + return .none |
| 101 | + case .binding: |
| 102 | + return .none |
| 103 | + case .tapAlarmPageButton: |
| 104 | + // TODO: ๋ค๋น๊ฒ์ด์
์ฐ๊ฒฐ ์ ์ถ๊ฐ |
| 105 | + print("tapAlarmPageButton") |
| 106 | + return .none |
| 107 | + case .tapShowSessionRecordButton(let id): |
| 108 | + // TODO: ๋ค๋น๊ฒ์ด์
์ฐ๊ฒฐ ์ ์ถ๊ฐ |
| 109 | + print("tapShowSessionRecordButton \(id)") |
| 110 | + return .none |
| 111 | + case .tapShowRecordFeedbackButton(let id): |
| 112 | + // TODO: ๋ค๋น๊ฒ์ด์
์ฐ๊ฒฐ ์ ์ถ๊ฐ |
| 113 | + print("tapShowRecordFeedbackButton \(id)") |
| 114 | + return .none |
| 115 | + case .tapAddRecordButton: |
| 116 | + state.view_isBottomSheetPresented = true |
| 117 | + return .none |
| 118 | + case .tapAddWorkoutRecordButton: |
| 119 | + // TODO: ๋ค๋น๊ฒ์ด์
์ฐ๊ฒฐ ์ ์ถ๊ฐ |
| 120 | + print("tapAddWorkoutRecordButton") |
| 121 | + return .none |
| 122 | + case .tapAddMealRecordButton: |
| 123 | + // TODO: ๋ค๋น๊ฒ์ด์
์ฐ๊ฒฐ ์ ์ถ๊ฐ |
| 124 | + print("tapAddMealRecordButton") |
| 125 | + return .none |
| 126 | + } |
| 127 | + case .setNavigating: |
| 128 | + return .none |
| 129 | + } |
| 130 | + } |
| 131 | + } |
| 132 | +} |
0 commit comments