Skip to content

Commit da1e7ae

Browse files
committed
feat: Calendar 관련 logic 추가 개발
1 parent 6befaf3 commit da1e7ae

2 files changed

Lines changed: 100 additions & 22 deletions

File tree

Projects/Feature/Feed/Sources/Presentation/FeedReactor.swift

Lines changed: 94 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,41 @@
55
// Created by 김동준 on 7/11/26
66
//
77

8-
import ReactorKit
8+
import Foundation
99
import CommonDomain
1010
import FeedInterface
1111
import ModyGroupInterface
12+
import ReactorKit
1213

1314
public final class FeedReactor: Reactor {
1415
private let groupUseCase: GroupUseCaseProtocol
1516
private weak var router: FeedRouter?
16-
public let initialState: State = .init()
17-
17+
public let initialState: State
18+
private let baseDate: Date
19+
private let calendar: Calendar
20+
1821
public struct State {
1922
var isFloatingActionButtonExpanded = false
2023
var groups: [GroupModel] = []
2124
var selectedGroup: GroupModel?
2225
var isFetchGroupLoading = false
26+
27+
var weekCalendarViewState: FeedWeekCalendarViewState
28+
var weekOffset = 0
2329
}
2430

2531
public enum Mutation {
2632
case setFloatingActionButtonExpanded(Bool)
2733
case setGroups([GroupModel])
2834
case setSelectedGroup(GroupModel)
2935
case setFetchGroupLoading(Bool)
36+
37+
case setWeekCalendar(
38+
offset: Int,
39+
title: String,
40+
dates: [FeedWeekCalendarModel]
41+
)
42+
case setSelectedCalendarDate(String)
3043
}
3144

3245
public enum Action {
@@ -37,6 +50,10 @@ public final class FeedReactor: Reactor {
3750
case didTapMealRecordButton
3851
case didTapAddGroup
3952
case didSelectGroup(GroupModel)
53+
54+
case didTapPreviousWeek
55+
case didTapNextWeek
56+
case didTapCalendarDate(FeedWeekCalendarModel)
4057
}
4158

4259
public init(
@@ -45,6 +62,29 @@ public final class FeedReactor: Reactor {
4562
) {
4663
self.groupUseCase = groupUseCase
4764
self.router = router
65+
let calendar = Date.koreanCalendar
66+
let baseDate = Date().startOfDay(calendar: calendar)
67+
let weekInfo = FeedWeekCalendarCalculator.calculateWeekInfoFromBaseDate(
68+
baseDate,
69+
calendar: calendar
70+
)
71+
let todayDate = baseDate.toString()
72+
73+
self.calendar = calendar
74+
self.baseDate = baseDate
75+
self.initialState = State(
76+
weekCalendarViewState: FeedWeekCalendarViewState(
77+
calendarTitle: weekInfo.title,
78+
calendarDates: FeedWeekCalendarCalculator.makeModels(
79+
containing: baseDate,
80+
calendar: calendar
81+
),
82+
canMovePreviousWeek: true,
83+
canMoveNextWeek: false,
84+
todayDate: todayDate,
85+
selectedDate: todayDate
86+
)
87+
)
4888
}
4989

5090
public func mutate(action: Action) -> Observable<Mutation> {
@@ -73,6 +113,21 @@ public final class FeedReactor: Reactor {
73113
return .empty()
74114
}
75115
return .just(.setSelectedGroup(group))
116+
case .didTapPreviousWeek:
117+
return makeCalendarMutation(offset: currentState.weekOffset - 1)
118+
case .didTapNextWeek:
119+
guard currentState.weekCalendarViewState.canMoveNextWeek else { return .empty() }
120+
return makeCalendarMutation(offset: currentState.weekOffset + 1)
121+
case let .didTapCalendarDate(model):
122+
guard FeedWeekCalendarCalculator.isSelectable(
123+
date: model.date,
124+
latestSelectableDate: currentState.weekCalendarViewState.todayDate,
125+
calendar: calendar
126+
) else {
127+
return .empty()
128+
}
129+
130+
return .just(.setSelectedCalendarDate(model.date))
76131
}
77132
}
78133

@@ -91,6 +146,14 @@ public final class FeedReactor: Reactor {
91146
newState.selectedGroup = group
92147
case .setFetchGroupLoading(let isLoading):
93148
newState.isFetchGroupLoading = isLoading
149+
case let .setWeekCalendar(offset, title, dates):
150+
newState.weekOffset = offset
151+
newState.weekCalendarViewState.calendarTitle = title
152+
newState.weekCalendarViewState.calendarDates = dates
153+
newState.weekCalendarViewState.canMovePreviousWeek = true
154+
newState.weekCalendarViewState.canMoveNextWeek = offset < 0
155+
case let .setSelectedCalendarDate(date):
156+
newState.weekCalendarViewState.selectedDate = date
94157
}
95158

96159
return newState
@@ -118,3 +181,31 @@ private extension FeedReactor {
118181
.observe(on: MainScheduler.instance)
119182
}
120183
}
184+
185+
private extension FeedReactor {
186+
func makeCalendarMutation(offset: Int) -> Observable<Mutation> {
187+
guard offset <= 0,
188+
let targetDate = calendar.date(
189+
byAdding: .weekOfYear,
190+
value: offset,
191+
to: baseDate
192+
) else {
193+
return .empty()
194+
}
195+
196+
let weekInfo = FeedWeekCalendarCalculator.calculateWeekInfoFromBaseDate(
197+
targetDate,
198+
calendar: calendar
199+
)
200+
let models = FeedWeekCalendarCalculator.makeModels(
201+
containing: targetDate,
202+
calendar: calendar
203+
)
204+
205+
return .just(.setWeekCalendar(
206+
offset: offset,
207+
title: weekInfo.title,
208+
dates: models
209+
))
210+
}
211+
}

Projects/Feature/Feed/Sources/Presentation/ViewState/FeedWeekCalendarViewState.swift

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,10 @@
66
//
77

88
struct FeedWeekCalendarViewState: Equatable {
9-
let calendarTitle: String
10-
let calendarDates: [FeedWeekCalendarModel]
11-
let canMovePreviousWeek: Bool
12-
let canMoveNextWeek: Bool
13-
let todayDate: String
14-
let selectedDate: String
15-
}
16-
17-
extension FeedReactor.State {
18-
var weekCalendarViewState: FeedWeekCalendarViewState {
19-
FeedWeekCalendarViewState(
20-
calendarTitle: calendarTitle,
21-
calendarDates: calendarDates,
22-
canMovePreviousWeek: canMovePreviousWeek,
23-
canMoveNextWeek: canMoveNextWeek,
24-
todayDate: todayDate,
25-
selectedDate: selectedDate
26-
)
27-
}
9+
var calendarTitle: String
10+
var calendarDates: [FeedWeekCalendarModel]
11+
var canMovePreviousWeek: Bool
12+
var canMoveNextWeek: Bool
13+
var todayDate: String
14+
var selectedDate: String
2815
}

0 commit comments

Comments
 (0)