Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 6 additions & 44 deletions Projects/Feature/MainFeature/Sources/MainCore.swift
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public struct MainCore: Reducer {
@PresentationState public var settingsCore: SettingsCore.State?
@PresentationState public var noticeCore: NoticeCore.State?
public var isShowingReviewToast: Bool = false
public var dateSelectionMode: DateSelectionMode = .daily
public var dateSelectionMode: DateSelectionMode = .weekly

public var displayTitle: String {
let calendar = Calendar.autoupdatingCurrent
Expand Down Expand Up @@ -80,9 +80,7 @@ public struct MainCore: Reducer {
case onAppear
case tabTapped(Int)
case tabSwiped(Int)
case mealCore(MealCore.Action)
case weeklyMealCore(WeeklyMealCore.Action)
case timeTableCore(TimeTableCore.Action)
case weeklyTimeTableCore(WeeklyTimeTableCore.Action)
case settingButtonDidTap
case noticeButtonDidTap
Expand All @@ -92,7 +90,6 @@ public struct MainCore: Reducer {
case showReviewToast
case hideReviewToast
case requestReview
case weeklyModeUpdated(weeklyEnabled: Bool)
}

@Dependency(\.userDefaultsClient) var userDefaultsClient
Expand Down Expand Up @@ -152,21 +149,16 @@ public struct MainCore: Reducer {
state.school = userDefaultsClient.getValue(.school) as? String ?? ""
state.grade = "\(userDefaultsClient.getValue(.grade) as? Int ?? 1)"
state.class = "\(userDefaultsClient.getValue(.class) as? Int ?? 1)"
if state.mealCore == nil {
state.mealCore = .init(displayDate: state.$displayDate)
}

if state.weeklyMealCore == nil {
state.weeklyMealCore = .init(displayDate: state.$displayDate)
}
if state.timeTableCore == nil {
state.timeTableCore = .init(displayDate: state.$displayDate)
}
if state.weeklyTimeTableCore == nil {
state.weeklyTimeTableCore = .init(displayDate: state.$displayDate)
}
return .none

case .mealCore(.refresh), .weeklyMealCore(.refresh), .timeTableCore(.refresh), .weeklyTimeTableCore(.refresh):
case .weeklyMealCore(.refresh), .weeklyTimeTableCore(.refresh):
let isSkipWeekend = userDefaultsClient.getValue(.isSkipWeekend) as? Bool ?? false
let isSkipAfterDinner = userDefaultsClient.getValue(.isSkipAfterDinner) as? Bool ?? true

Expand All @@ -183,7 +175,7 @@ public struct MainCore: Reducer {
state.currentTab = tab
logTabSelected(index: tab, selectionType: .swiped)

case .settingButtonDidTap, .mealCore(.settingsButtonDidTap), .weeklyMealCore(.settingsButtonDidTap):
case .settingButtonDidTap, .weeklyMealCore(.settingsButtonDidTap):
state.settingsCore = .init()
let log = SettingButtonClickedEventLog()
TWLog.event(log)
Expand Down Expand Up @@ -225,30 +217,6 @@ public struct MainCore: Reducer {
}
return .none

case let .weeklyModeUpdated(weeklyEnabled):
let newMode: State.DateSelectionMode = weeklyEnabled ? .weekly : .daily
guard state.dateSelectionMode != newMode else { return .none }
state.dateSelectionMode = newMode

let isSkipWeekend = userDefaultsClient.getValue(.isSkipWeekend) as? Bool ?? false
let isSkipAfterDinner = userDefaultsClient.getValue(.isSkipAfterDinner) as? Bool ?? true
let datePolicy = DatePolicy(
isSkipWeekend: isSkipWeekend,
isSkipAfterDinner: isSkipAfterDinner
)
let today = Date()
let adjustedDate = datePolicy.adjustedDate(for: today)

state.$displayDate.withLock { date in
switch newMode {
case .daily:
date = adjustedDate
case .weekly:
date = datePolicy.startOfWeek(for: adjustedDate)
}
}
return .none

default:
return .none
}
Expand Down Expand Up @@ -282,16 +250,10 @@ public struct MainCore: Reducer {
extension Reducer where State == MainCore.State, Action == MainCore.Action {
func subFeatures() -> some ReducerOf<Self> {
self
.ifLet(\.mealCore, action: /Action.mealCore) {
MealCore()
}
.ifLet(\.weeklyMealCore, action: /Action.weeklyMealCore) {
.ifLet(\.weeklyMealCore, action: \.weeklyMealCore) {
WeeklyMealCore()
}
.ifLet(\.timeTableCore, action: /Action.timeTableCore) {
TimeTableCore()
}
.ifLet(\.weeklyTimeTableCore, action: /Action.weeklyTimeTableCore) {
.ifLet(\.weeklyTimeTableCore, action: \.weeklyTimeTableCore) {
WeeklyTimeTableCore()
}
.ifLet(\.$settingsCore, action: \.settingsCore) {
Expand Down
180 changes: 51 additions & 129 deletions Projects/Feature/MainFeature/Sources/MainView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ public struct MainView: View {
@Environment(\.openURL) var openURL
@Environment(\.calendar) var calendar
@Dependency(\.userDefaultsClient) var userDefaultsClient
@RemoteConfigProperty(key: "enable_weekly", fallback: false) private var enableWeeklyView

public init(store: StoreOf<MainCore>) {
self.store = store
Expand Down Expand Up @@ -51,51 +50,33 @@ public struct MainView: View {
).animation(.default)
) {
VStack {
if enableWeeklyView {
IfLetStore(
store.scope(
state: \.weeklyMealCore,
action: MainCore.Action.weeklyMealCore
)
) { store in
WeeklyMealView(store: store)
}
} else {
IfLetStore(
store.scope(state: \.mealCore, action: MainCore.Action.mealCore)
) { store in
MealView(store: store)
}
IfLetStore(
store.scope(
state: \.weeklyMealCore,
action: MainCore.Action.weeklyMealCore
)
) { store in
WeeklyMealView(store: store)
}
}
.tag(0)

VStack {
if enableWeeklyView {
IfLetStore(
store.scope(
state: \.weeklyTimeTableCore,
action: MainCore.Action.weeklyTimeTableCore
)
) { store in
WeeklyTimeTableView(store: store)
}
} else {
IfLetStore(
store.scope(state: \.timeTableCore, action: MainCore.Action.timeTableCore)
) { store in
TimeTableView(store: store)
}
IfLetStore(
store.scope(
state: \.weeklyTimeTableCore,
action: MainCore.Action.weeklyTimeTableCore
)
) { store in
WeeklyTimeTableView(store: store)
}
}
.tag(1)
}
.tabViewStyle(.page(indexDisplayMode: .never))
.background {
if enableWeeklyView {
Color.backgroundSecondary
.ignoresSafeArea()
}
Color.backgroundSecondary
.ignoresSafeArea()
}

if viewStore.isShowingReviewToast {
Expand Down Expand Up @@ -124,104 +105,52 @@ public struct MainView: View {

ToolbarItem(placement: .topBarLeading) {
Menu {
let isWeeklyModeEnabled = enableWeeklyView
let isSkipWeekend = userDefaultsClient.getValue(.isSkipWeekend) as? Bool ?? false
let isSkipAfterDinner = userDefaultsClient.getValue(.isSkipAfterDinner) as? Bool ?? true
let datePolicy = DatePolicy(isSkipWeekend: isSkipWeekend, isSkipAfterDinner: isSkipAfterDinner)

let today = Date()
if isWeeklyModeEnabled {
let currentWeekStart = datePolicy.startOfWeek(for: today)
let previousWeek = datePolicy.previousWeekStart(from: currentWeekStart)
let nextWeek = datePolicy.nextWeekStart(from: currentWeekStart)
ForEach([previousWeek, currentWeekStart, nextWeek], id: \.timeIntervalSince1970) { weekStart in
let normalizedWeekStart = datePolicy.startOfWeek(for: weekStart)
Button {
let tense: SelectDateTenseEventLog.Tense
if calendar.isDate(normalizedWeekStart, inSameDayAs: currentWeekStart) {
tense = .present
} else if normalizedWeekStart > currentWeekStart {
tense = .future
} else {
tense = .past
}

TWLog.event(SelectDateTenseEventLog(tense: tense))
_ = viewStore.send(.dateSelected(normalizedWeekStart))
} label: {
let labelText = datePolicy.weekDisplayText(for: normalizedWeekStart, baseDate: today)
let isSelected = calendar.isDate(
datePolicy.startOfWeek(for: viewStore.displayDate),
inSameDayAs: normalizedWeekStart
)
if isSelected {
Label {
Text(labelText)
.twFont(.body1)
.foregroundStyle(Color.extraWhite)
.animation(.easeInOut(duration: 0.2), value: viewStore.displayDate)
} icon: {
Image(systemName: "checkmark")
}
} else {
Text(labelText)
.twFont(.body1)
.foregroundStyle(Color.extraBlack)
.animation(.easeInOut(duration: 0.2), value: viewStore.displayDate)
}
let currentWeekStart = datePolicy.startOfWeek(for: today)
let previousWeek = datePolicy.previousWeekStart(from: currentWeekStart)
let nextWeek = datePolicy.nextWeekStart(from: currentWeekStart)
ForEach([previousWeek, currentWeekStart, nextWeek], id: \.timeIntervalSince1970) { weekStart in
let normalizedWeekStart = datePolicy.startOfWeek(for: weekStart)
Button {
let tense: SelectDateTenseEventLog.Tense
if calendar.isDate(normalizedWeekStart, inSameDayAs: currentWeekStart) {
tense = .present
} else if normalizedWeekStart > currentWeekStart {
tense = .future
} else {
tense = .past
}
.accessibilityLabel("\(datePolicy.weekDisplayText(for: normalizedWeekStart, baseDate: today)) 선택")
.accessibilityHint("주 변경")
}
} else {
let yesterday = datePolicy.previousDay(from: today)
let tomorrow = datePolicy.nextDay(from: today)

ForEach([yesterday, today, tomorrow], id: \.timeIntervalSince1970) { date in
Button {
let today = Date()
let tense: SelectDateTenseEventLog.Tense

if calendar.isDate(date, inSameDayAs: today) {
tense = .present
} else if date > today {
tense = .future
} else {
tense = .past
}

TWLog.event(SelectDateTenseEventLog(tense: tense))

_ = viewStore.send(.dateSelected(date))
} label: {
if calendar.isDate(viewStore.displayDate, inSameDayAs: date) {
Label {
Text(datePolicy.displayText(for: date, baseDate: today))
.twFont(.body1)
.foregroundStyle(
calendar.isDate(viewStore.displayDate, inSameDayAs: date)
? Color.extraWhite
: Color.extraBlack
)
.animation(.easeInOut(duration: 0.2), value: viewStore.displayDate)
} icon: {
Image(systemName: "checkmark")
}

} else {
Text(datePolicy.displayText(for: date, baseDate: today))

TWLog.event(SelectDateTenseEventLog(tense: tense))
_ = viewStore.send(.dateSelected(normalizedWeekStart))
} label: {
let labelText = datePolicy.weekDisplayText(for: normalizedWeekStart, baseDate: today)
let isSelected = calendar.isDate(
datePolicy.startOfWeek(for: viewStore.displayDate),
inSameDayAs: normalizedWeekStart
)
if isSelected {
Label {
Text(labelText)
.twFont(.body1)
.foregroundStyle(
calendar.isDate(viewStore.displayDate, inSameDayAs: date)
? Color.extraWhite
: Color.extraBlack
)
.foregroundStyle(Color.extraWhite)
.animation(.easeInOut(duration: 0.2), value: viewStore.displayDate)
} icon: {
Image(systemName: "checkmark")
}
} else {
Text(labelText)
.twFont(.body1)
.foregroundStyle(Color.extraBlack)
.animation(.easeInOut(duration: 0.2), value: viewStore.displayDate)
}
.accessibilityLabel("\(datePolicy.displayText(for: date, baseDate: today)) 선택")
.accessibilityHint("날짜 변경")
}
.accessibilityLabel("\(datePolicy.weekDisplayText(for: normalizedWeekStart, baseDate: today)) 선택")
.accessibilityHint("주 변경")
}
} label: {
HStack(spacing: 0) {
Expand Down Expand Up @@ -262,17 +191,10 @@ public struct MainView: View {
}
}
.onAppear {
TWLog.setUserProperty(property: .enableWeeklyView, value: enableWeeklyView.description)
viewStore.send(.onAppear, animation: .default)
viewStore.send(.weeklyModeUpdated(weeklyEnabled: enableWeeklyView))
}
.onChange(of: enableWeeklyView, perform: { _ in
TWLog.setUserProperty(property: .enableWeeklyView, value: enableWeeklyView.description)
viewStore.send(.weeklyModeUpdated(weeklyEnabled: enableWeeklyView))
})
.onLoad {
viewStore.send(.onLoad)
viewStore.send(.weeklyModeUpdated(weeklyEnabled: enableWeeklyView))
}
.background {
navigationLinks
Expand Down
22 changes: 4 additions & 18 deletions Projects/Feature/MealFeature/Sources/Weekly/WeeklyMealCore.swift
Original file line number Diff line number Diff line change
Expand Up @@ -62,24 +62,10 @@ public struct WeeklyMealCore: Reducer {
Reduce { state, action in
switch action {
case .onLoad:
do {
state.allergyList = try localDatabaseClient.readRecords(as: AllergyLocalEntity.self)
.compactMap { AllergyType(rawValue: $0.allergy) ?? nil }
} catch {}

state.showWeekend = !(userDefaultsClient.getValue(.isSkipWeekend) as? Bool ?? false)
state.isLoading = true

let displayDate = state.displayDate
let showWeekend = state.showWeekend

return .merge(
fetchWeeklyMeals(displayDate: displayDate, showWeekend: showWeekend),
.publisher {
state.$displayDate.publisher
.map { _ in Action.refreshData }
}
)
return .publisher {
state.$displayDate.publisher
.map { _ in Action.refreshData }
}

case .onAppear:
do {
Expand Down
Loading
Loading