Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 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
4 changes: 2 additions & 2 deletions Projects/App/iOS/Support/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>11.3</string>
<string>12.0</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
Expand All @@ -32,7 +32,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
<string>84</string>
<string>85</string>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>LSRequiresIPhoneOS</key>
Expand Down
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
Loading
Loading