-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProfileFeature+State.swift
More file actions
111 lines (92 loc) · 3.65 KB
/
Copy pathProfileFeature+State.swift
File metadata and controls
111 lines (92 loc) · 3.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
//
// ProfileFeature+State.swift
// DevLogPresentation
//
// Created by opfic on 6/15/26.
//
import DevLogCore
import Foundation
extension ProfileFeature.State {
var isLoading: Bool {
loading.isLoading
}
var quarterTitle: String {
guard let start = selectedQuarterStart else { return "" }
let year = Calendar.current.component(.year, from: start)
let month = Calendar.current.component(.month, from: start)
let quarter = ((month - 1) / 3) + 1
return String.localizedStringWithFormat(
String(localized: "profile_year_quarter_format"),
String(year),
String(quarter)
)
}
var selectedDayActivities: [HeatmapActivityItem] {
guard let selectedDay else { return [] }
let dayStart = Calendar.current.startOfDay(for: selectedDay.date)
let activities = dayActivitiesByDate[dayStart] ?? []
return activities.filter { activity in
!Set(activity.activityKinds).isDisjoint(with: selectedActivityKinds)
}
}
var isCreatedActivitySelected: Bool {
get { selectedActivityKinds.contains(.created) }
set { setActivityKind(.created, isSelected: newValue) }
}
var isCompletedActivitySelected: Bool {
get { selectedActivityKinds.contains(.completed) }
set { setActivityKind(.completed, isSelected: newValue) }
}
var isDeletedActivitySelected: Bool {
get { selectedActivityKinds.contains(.deleted) }
set { setActivityKind(.deleted, isSelected: newValue) }
}
var isCreatedActivityToggleDisabled: Bool {
selectedActivityKinds == [.created]
}
var isCompletedActivityToggleDisabled: Bool {
selectedActivityKinds == [.completed]
}
var isDeletedActivityToggleDisabled: Bool {
selectedActivityKinds == [.deleted]
}
var canMoveToPreviousQuarter: Bool {
ProfileHeatmapBuilder.canMoveToQuarter(offsetMonths: -3, state: self)
}
var canMoveToNextQuarter: Bool {
ProfileHeatmapBuilder.canMoveToQuarter(offsetMonths: 3, state: self)
}
var isViewingCurrentQuarter: Bool {
guard let selectedQuarterStart,
let currentQuarterStart = ProfileHeatmapBuilder.quarterStart(for: Date()) else {
return false
}
return selectedQuarterStart == currentQuarterStart
}
var availableQuarterYears: [Int] {
guard let earliestQuarterStart,
let currentQuarterStart = ProfileHeatmapBuilder.quarterStart(for: Date()) else {
return [selectedQuarterPickerYear]
}
let earliestYear = Calendar.current.component(.year, from: earliestQuarterStart)
let currentYear = Calendar.current.component(.year, from: currentQuarterStart)
return Array(stride(from: currentYear, through: earliestYear, by: -1))
}
func quarterStartForPicker(quarter: Int) -> Date? {
ProfileHeatmapBuilder.quarterStart(year: selectedQuarterPickerYear, quarter: quarter)
}
func isQuarterSelectableForPicker(_ quarter: Int) -> Bool {
guard let quarterStart = quarterStartForPicker(quarter: quarter) else { return false }
return ProfileHeatmapBuilder.canSelectQuarter(quarterStart, state: self)
}
func isQuarterSelectedForPicker(_ quarter: Int) -> Bool {
quarterStartForPicker(quarter: quarter) == selectedQuarterStart
}
private mutating func setActivityKind(_ activityKind: ActivityKind, isSelected: Bool) {
if isSelected {
selectedActivityKinds.insert(activityKind)
} else if 1 < selectedActivityKinds.count {
selectedActivityKinds.remove(activityKind)
}
}
}