55// Created by 김동준 on 7/11/26
66//
77
8- import ReactorKit
8+ import Foundation
99import CommonDomain
1010import FeedInterface
1111import ModyGroupInterface
12+ import ReactorKit
1213
1314public 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+ }
0 commit comments