Skip to content

Commit

Permalink
initial custom user deferrals
Browse files Browse the repository at this point in the history
  • Loading branch information
erikng committed Aug 13, 2021
1 parent 851fa1c commit 08ea7eb
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 33 deletions.
92 changes: 59 additions & 33 deletions Nudge/UI/StandardMode/RightSide.swift
Expand Up @@ -17,7 +17,10 @@ struct StandardModeRightSide: View {
// State variables
@State var allowButtons = true
@State var hasClickedSecondaryQuitButton = false
@State var hasClickedCustomDeferralButton = false
@State var requireDualQuitButtons = false
@State var nudgeEventDate = Date()
@State var nudgeCustomEventDate = Date()

// Modal view for screenshot and device info
@State var showSSDetail = false
Expand Down Expand Up @@ -202,51 +205,65 @@ struct StandardModeRightSide: View {
if allowButtons || Utils().demoModeEnabled() {
// secondaryQuitButton
if requireDualQuitButtons {
if self.hasClickedSecondaryQuitButton {
Button {} label: {
Text(secondaryQuitButtonText)
}
.hidden()
} else {
if self.hasClickedSecondaryQuitButton == false {
Button {
hasClickedSecondaryQuitButton = true
userHasClickedSecondaryQuitButton()
} label: {
Text(secondaryQuitButtonText)
}
.padding(.leading, -200.0)
}
} else {
Button {} label: {
Text(secondaryQuitButtonText)
}
.hidden()
}

// primaryQuitButton
if requireDualQuitButtons {
if self.hasClickedSecondaryQuitButton {
Button {
Utils().userInitiatedExit()
} label: {
Text(primaryQuitButtonText)
.frame(minWidth: 35)
if requireDualQuitButtons == false || self.hasClickedSecondaryQuitButton {
HStack(spacing: 20) {
if hasClickedCustomDeferralButton == false {
Menu("Defer") {
Button {
// Always go back a day to trigger Nudge every time user hits this button
nudgeDefaults.set(Calendar.current.date(byAdding: .minute, value: -(1440), to: nudgeEventDate), forKey: "deferRunUntil")
Utils().userInitiatedExit()
} label: {
Text(primaryQuitButtonText)
.frame(minWidth: 35)
}
Button {
nudgeDefaults.set(nudgeEventDate.addingTimeInterval(3600), forKey: "deferRunUntil")
Utils().userInitiatedExit()
} label: {
Text("One Hour")
.frame(minWidth: 35)
}
Button {
nudgeDefaults.set(nudgeEventDate.addingTimeInterval(86400), forKey: "deferRunUntil")
Utils().userInitiatedExit()
} label: {
Text("One Day")
.frame(minWidth: 35)
}
Button {
hasClickedCustomDeferralButton = true
} label: {
Text("Custom")
.frame(minWidth: 35)
}
}
.frame(maxWidth: 100)
}
} else {
Button {
hasClickedSecondaryQuitButton = true
userHasClickedSecondaryQuitButton()
} label: {
Text(primaryQuitButtonText)
.frame(minWidth: 35)
if hasClickedCustomDeferralButton {
DatePicker("Please enter a time", selection: $nudgeCustomEventDate, in: limitRange)
.labelsHidden()
.frame(maxWidth: 150)
Button {
nudgeDefaults.set(nudgeCustomEventDate, forKey: "deferRunUntil")
Utils().userInitiatedExit()
} label: {
Text("Defer")
.frame(minWidth: 35)
}
}
.hidden()
}
} else {
Button {
Utils().userInitiatedExit()
} label: {
Text(primaryQuitButtonText)
.frame(minWidth: 35)
}
}
}
Expand All @@ -262,6 +279,15 @@ struct StandardModeRightSide: View {
}
}

var limitRange: ClosedRange<Date> {
let daysRemaining = Utils().getNumberOfDaysBetween()
if daysRemaining > 0 {
return Date()...Calendar.current.date(byAdding: .day, value: daysRemaining, to: Date())!
} else {
return Date()...Calendar.current.date(byAdding: .day, value: 0, to: Date())!
}
}

func updateUI() {
if Utils().requireDualQuitButtons() || hasLoggedDeferralCountPastThresholdDualQuitButtons {
self.requireDualQuitButtons = true
Expand Down
1 change: 1 addition & 0 deletions Nudge/Utilities/Preferences.swift
Expand Up @@ -11,6 +11,7 @@ let nudgeJSONPreferences = Utils().getNudgeJSONPreferences()
let nudgeDefaults = UserDefaults.standard
let language = NSLocale.current.languageCode!
var shouldExit = false
let deferRunUntil = UserDefaults.standard.object(forKey: "deferRunUntil") as? Date

// Get the language
func getDesiredLanguage() -> String {
Expand Down
5 changes: 5 additions & 0 deletions Nudge/Utilities/UILogic.swift
Expand Up @@ -10,6 +10,11 @@ import Foundation

// Start doing a basic check
func nudgeStartLogic() {
if deferRunUntil ?? lastRefreshTime > Date() {
let msg = "User has selected a deferral date that is in the future"
uiLog.notice("\(msg, privacy: .public)")
Utils().exitNudge()
}
if Utils().fullyUpdated() {
// Because Nudge will bail if it detects installed OS >= required OS, this will cause the Xcode preview to fail.
// https://zacwhite.com/2020/detecting-swiftui-previews/
Expand Down

0 comments on commit 08ea7eb

Please sign in to comment.