Skip to content

Commit f9735a7

Browse files
committed
refactor basically everything
1 parent 6482f1e commit f9735a7

16 files changed

+559
-452
lines changed

README.md

+3
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,6 @@ macOS Sonoma 14.5 and higher
2323
#### Dark
2424
<img src="/assets/demo_dark_3.png" width=75% height=75%>
2525
<img src="/assets/demo_dark_4.png" width=75% height=75%>
26+
27+
### Notes on inspiration
28+
- https://stackoverflow.com/questions/67304592/how-to-reliably-retrieve-a-windows-background-color-on-macos-with-swiftui

demo/com.github.erikng.hello.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
"id": 3,
5959
"title": "Slack",
6060
"iconPath": "https://raw.githubusercontent.com/erikng/hello/main/demo/icons/apps/Slack.png",
61-
"installedPath": "/Applications/Slack.app"
61+
"installedPath": "/Applications/Slack.1app"
6262
},
6363
{
6464
"id": 4,

hello.xcodeproj/project.pbxproj

-4
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
/* Begin PBXBuildFile section */
1010
0305DD11267A9FF7000DA4C7 /* SecondaryStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0305DD10267A9FF7000DA4C7 /* SecondaryStatus.swift */; };
1111
0305DD13267AA086000DA4C7 /* Misc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0305DD12267AA086000DA4C7 /* Misc.swift */; };
12-
036C17BE2674F0AF006461A9 /* _Notes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 036C17BD2674F0AF006461A9 /* _Notes.swift */; };
1312
0380EC3E26704BD800DF4A87 /* helloApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0380EC3D26704BD800DF4A87 /* helloApp.swift */; };
1413
0380EC4026704BD800DF4A87 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0380EC3F26704BD800DF4A87 /* ContentView.swift */; };
1514
0380EC4226704BD900DF4A87 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0380EC4126704BD900DF4A87 /* Assets.xcassets */; };
@@ -48,7 +47,6 @@
4847
0305DD10267A9FF7000DA4C7 /* SecondaryStatus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecondaryStatus.swift; sourceTree = "<group>"; };
4948
0305DD12267AA086000DA4C7 /* Misc.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Misc.swift; sourceTree = "<group>"; };
5049
036BFFEA2C56ABF30077D261 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
51-
036C17BD2674F0AF006461A9 /* _Notes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = _Notes.swift; sourceTree = "<group>"; };
5250
0380EC3A26704BD800DF4A87 /* hello.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = hello.app; sourceTree = BUILT_PRODUCTS_DIR; };
5351
0380EC3D26704BD800DF4A87 /* helloApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = helloApp.swift; sourceTree = "<group>"; };
5452
0380EC3F26704BD800DF4A87 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
@@ -123,7 +121,6 @@
123121
03D332512672A46F006135BE /* UI */,
124122
03D3324726729161006135BE /* Preferences */,
125123
0380EC652670509C00DF4A87 /* Utils.swift */,
126-
036C17BD2674F0AF006461A9 /* _Notes.swift */,
127124
0380EC682670556200DF4A87 /* Info.plist */,
128125
0380EC67267054D900DF4A87 /* hello.entitlements */,
129126
0380EC4126704BD900DF4A87 /* Assets.xcassets */,
@@ -337,7 +334,6 @@
337334
0380EC662670509C00DF4A87 /* Utils.swift in Sources */,
338335
03D3324C26729238006135BE /* PreferencesStructure.swift in Sources */,
339336
03F00B8D2673AE1E004399FE /* ExitView.swift in Sources */,
340-
036C17BE2674F0AF006461A9 /* _Notes.swift in Sources */,
341337
);
342338
runOnlyForDeploymentPostprocessing = 0;
343339
};

hello.xcodeproj/xcshareddata/xcschemes/hello (Debug -json-url).xcscheme

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@
7272
</BuildableProductRunnable>
7373
<CommandLineArguments>
7474
<CommandLineArgument
75-
argument = "-json-url &quot;https://raw.githubusercontent.com/erikng/hello/main/demo/com.github.erikng.hello.json&quot;"
75+
argument = "-json-url &quot;file:///Users/Erik/Documents/GitHub/hello/demo/com.github.erikng.hello.json&quot;"
7676
isEnabled = "YES">
7777
</CommandLineArgument>
7878
</CommandLineArguments>

hello/Preferences/Defaults.swift

+112-56
Original file line numberDiff line numberDiff line change
@@ -11,80 +11,136 @@ import Foundation
1111
class PrefsWrapper {
1212
var welcomeScreenItem1SymbolName: String
1313
var pendingApplicationState: String
14+
1415
init() {
1516
welcomeScreenItem1SymbolName = userExperienceJSON?.welcomeScreenItem1SymbolName ?? "gear.circle"
1617
pendingApplicationState = "circle.dashed.inset.filled"
17-
1818
}
1919
}
2020

21+
// Define default values as constants or a struct for easier maintenance
22+
struct DefaultValues {
23+
static let exitScreenItem1ButtonText = "LAUNCH"
24+
static let exitScreenItem1DescriptionText = "Easily install apps and tools provided by your IT department."
25+
static let exitScreenItem1ImagePath = "file:///Applications/Safari.app/Contents/Resources/AppIcon.icns"
26+
static let exitScreenItem1LaunchURL = "file:///Applications/Safari.app"
27+
static let exitScreenItem1Title = "Self Service"
28+
static let exitScreenItem2ButtonText = "OPEN"
29+
static let exitScreenItem2DescriptionText = "Everything you need to know to start using your new Mac."
30+
static let exitScreenItem2ImagePath = "file:///System/Library/CoreServices/Finder.app/Contents/Resources/Finder.icns"
31+
static let exitScreenItem2LaunchURL = "https://support.apple.com/guide/mac-help/welcome/mac"
32+
static let exitScreenItem2Title = "macOS User Guide"
33+
static let exitScreenItem3ButtonText = "UPDATE"
34+
static let exitScreenItem3DescriptionText = "Updates may be available for your Mac. It is encouraged to install them."
35+
static let exitScreenItem3ImagePath = "file:///System/Library/CoreServices/ControlCenter.app/Contents/Resources/AppIcon.icns"
36+
static let exitScreenItem3LaunchURL = "file:///System/Library/PreferencePanes/SoftwareUpdate.prefPane"
37+
static let exitScreenItem3Title = "Software Updates"
38+
39+
static let welcomeScreenItem1DescriptionText = "Multiple settings are being configured, tailored to make your first day exceptional."
40+
static let welcomeScreenItem1SymbolName = "gear.circle"
41+
static let welcomeScreenItem1Title = "Configurations"
42+
static let welcomeScreenItem2DescriptionText = "While Apple has world class applications built in to macOS, we know that some of your favorite business applications still need to be added. Some are installing now, but checkout our self service application for even more."
43+
static let welcomeScreenItem2SymbolName = "slider.horizontal.below.rectangle"
44+
static let welcomeScreenItem2Title = "Applications"
45+
static let welcomeScreenItem3DescriptionText = "By applying security policies, we ensure that your device is fully up to date with the latest updates, all while still valuing your privacy."
46+
static let welcomeScreenItem3SymbolName = "mappin.circle"
47+
static let welcomeScreenItem3Title = "Secure"
48+
49+
static let companyLogoPath = "" // Add default company logo path if available
50+
static let companyLogoPath2 = "" // Add default secondary company logo path if available
51+
52+
static let aboutURL = "https://github.com/erikng/hello" // Default value for aboutURL
53+
static let provisioningHeaderText = "Setting up your Mac..." // Default value for provisioningHeaderText
54+
static let provisioningBodyText = "Your Mac is being automatically configured by your organization. This process may take some time to complete. Please don't attempt to restart or shut down the computer unless you are prompted to do so." // Default value for provisioningBodyText
55+
static let welcomeSubHeaderText = "hello" // Default value for welcomeSubHeaderText
56+
static let exitText = "Setup complete" // Default value for exitText
57+
static let quitButtonText = "Quit" // Default value for quitButtonText
58+
static let restartButtonText = "Restart" // Default value for restartButtonText
59+
60+
static let disableExitScreen = false // Default value for disableExitScreen
61+
static let restartStyle = "default" // Default value for restartStyle
62+
static let disableWelcomeScreen = false // Default value for disableWelcomeScreen
63+
static let enableWelcomeScreenTimer = true // Default value for enableWelcomeScreenTimer
64+
static let welcomeButtonText = "Start" // Default value for welcomeButtonText
65+
static let welcomeHeaderText = "Welcome" // Default value for welcomeHeaderText
66+
67+
static let exitScreenBodyText = "Your exit process is complete. Please follow any additional instructions if provided." // Default value for exitScreenBodyText
68+
}
69+
70+
// Define a function to fetch values with defaults
71+
func getUserExperienceValue<T>(_ keyPath: KeyPath<UserExperience, T?>, defaultValue: T) -> T {
72+
return userExperienceJSON?[keyPath: keyPath] ?? defaultValue
73+
}
74+
75+
// Setup UserExperience JSON and DeviceStage JSON
2176
let helloDefaults = UserDefaults.standard
22-
let dynamicOSPreferences = PrefsWrapper.init()
77+
let dynamicOSPreferences = PrefsWrapper()
2378
let helloJSONPreferences = Utils().getHelloJSONPreferences()
24-
let helloRefreshCycleTimer = Timer.publish(every: Double(2.0), on: .main, in: .common).autoconnect()
79+
let helloRefreshCycleTimer = Timer.publish(every: 2.0, on: .main, in: .common).autoconnect()
2580
let deviceStagesJSON = getDeviceStagesJSON()
2681
let userExperienceJSON = getUserExperienceJSON()
2782

28-
// userExperience
29-
let aboutURL = userExperienceJSON?.aboutURL ?? "https://github.com/erikng/hello"
30-
let companyLogoPath = userExperienceJSON?.companyLogoPath ?? ""
31-
let companyLogoPath2 = userExperienceJSON?.companyLogoPath2 ?? ""
32-
let exitScreenBodyText = userExperienceJSON?.exitScreenBodyText ?? "Your Mac has been successfully configured. Below are a few resources to help you get started."
33-
let exitText = userExperienceJSON?.exitText ?? "Setup complete"
34-
let disableWelcomeScreen = userExperienceJSON?.disableWelcomeScreen ?? false
35-
let disableExitScreen = userExperienceJSON?.disableExitScreen ?? false
36-
let enableWelcomeScreenTimer = userExperienceJSON?.enableWelcomeScreenTimer ?? false
37-
let exitScreenItem1ButtonText = userExperienceJSON?.exitScreenItem1ButtonText ?? "LAUNCH"
38-
let exitScreenItem1DescriptionText = userExperienceJSON?.exitScreenItem1DescriptionText ?? "Easily install apps and tools provided by your IT department."
39-
let exitScreenItem1ImagePath = userExperienceJSON?.exitScreenItem1ImagePath ?? "file:///Applications/Safari.app/Contents/Resources/AppIcon.icns"
40-
let exitScreenItem1LaunchURL = userExperienceJSON?.exitScreenItem1LaunchURL ?? "file:///Applications/Safari.app"
41-
let exitScreenItem1Title = userExperienceJSON?.exitScreenItem1Title ?? "Self Service"
42-
let exitScreenItem2ButtonText = userExperienceJSON?.exitScreenItem2ButtonText ?? "OPEN"
43-
let exitScreenItem2DescriptionText = userExperienceJSON?.exitScreenItem2DescriptionText ?? "Everything you need to know to start using your new Mac."
44-
let exitScreenItem2ImagePath = userExperienceJSON?.exitScreenItem2ImagePath ?? "file:///System/Library/CoreServices/Finder.app/Contents/Resources/Finder.icns"
45-
let exitScreenItem2LaunchURL = userExperienceJSON?.exitScreenItem2LaunchURL ?? "https://support.apple.com/guide/mac-help/welcome/mac"
46-
let exitScreenItem2Title = userExperienceJSON?.exitScreenItem2Title ?? "macOS User Guide"
47-
let exitScreenItem3ButtonText = userExperienceJSON?.exitScreenItem3ButtonText ?? "UPDATE"
48-
let exitScreenItem3DescriptionText = userExperienceJSON?.exitScreenItem3DescriptionText ?? "Updates may be available for your Mac. It is encouraged to install them."
49-
let exitScreenItem3ImagePath = userExperienceJSON?.exitScreenItem3ImagePath ?? "file:///System/Library/CoreServices/ControlCenter.app/Contents/Resources/AppIcon.icns"
50-
let exitScreenItem3LaunchURL = userExperienceJSON?.exitScreenItem3LaunchURL ?? "file:///System/Library/PreferencePanes/SoftwareUpdate.prefPane"
51-
let exitScreenItem3Title = userExperienceJSON?.exitScreenItem3Title ?? "Software Updates"
52-
let provisioningBodyText = userExperienceJSON?.provisioningBodyText ?? "Your Mac is being automatically configured by your organization. This process may take some time to complete. Please don't attempt to restart or shut down the computer unless you are prompted to do so."
53-
let provisioningHeaderText = userExperienceJSON?.provisioningHeaderText ?? "Setting up your Mac..."
54-
let quitButtonText = userExperienceJSON?.quitButtonText ?? "Quit"
55-
let restartButtonText = userExperienceJSON?.restartButtonText ?? "Restart"
56-
let restartStyle = userExperienceJSON?.restartStyle ?? "None"
57-
let welcomeButtonText = userExperienceJSON?.welcomeButtonText ?? "Continue"
58-
let welcomeHeaderText = userExperienceJSON?.welcomeHeaderText ?? "Welcome to"
59-
let welcomeSubHeaderText = userExperienceJSON?.welcomeSubHeaderText ?? "hello"
60-
let welcomeScreenItem1DescriptionText = userExperienceJSON?.welcomeScreenItem1DescriptionText ?? "Multiple settings are being configured, tailored to make your first day exceptional."
83+
// Fetch values using the function
84+
let exitScreenItem1ButtonText = getUserExperienceValue(\.exitScreenItem1ButtonText, defaultValue: DefaultValues.exitScreenItem1ButtonText)
85+
let exitScreenItem1DescriptionText = getUserExperienceValue(\.exitScreenItem1DescriptionText, defaultValue: DefaultValues.exitScreenItem1DescriptionText)
86+
let exitScreenItem1ImagePath = getUserExperienceValue(\.exitScreenItem1ImagePath, defaultValue: DefaultValues.exitScreenItem1ImagePath)
87+
let exitScreenItem1LaunchURL = getUserExperienceValue(\.exitScreenItem1LaunchURL, defaultValue: DefaultValues.exitScreenItem1LaunchURL)
88+
let exitScreenItem1Title = getUserExperienceValue(\.exitScreenItem1Title, defaultValue: DefaultValues.exitScreenItem1Title)
89+
90+
let exitScreenItem2ButtonText = getUserExperienceValue(\.exitScreenItem2ButtonText, defaultValue: DefaultValues.exitScreenItem2ButtonText)
91+
let exitScreenItem2DescriptionText = getUserExperienceValue(\.exitScreenItem2DescriptionText, defaultValue: DefaultValues.exitScreenItem2DescriptionText)
92+
let exitScreenItem2ImagePath = getUserExperienceValue(\.exitScreenItem2ImagePath, defaultValue: DefaultValues.exitScreenItem2ImagePath)
93+
let exitScreenItem2LaunchURL = getUserExperienceValue(\.exitScreenItem2LaunchURL, defaultValue: DefaultValues.exitScreenItem2LaunchURL)
94+
let exitScreenItem2Title = getUserExperienceValue(\.exitScreenItem2Title, defaultValue: DefaultValues.exitScreenItem2Title)
95+
96+
let exitScreenItem3ButtonText = getUserExperienceValue(\.exitScreenItem3ButtonText, defaultValue: DefaultValues.exitScreenItem3ButtonText)
97+
let exitScreenItem3DescriptionText = getUserExperienceValue(\.exitScreenItem3DescriptionText, defaultValue: DefaultValues.exitScreenItem3DescriptionText)
98+
let exitScreenItem3ImagePath = getUserExperienceValue(\.exitScreenItem3ImagePath, defaultValue: DefaultValues.exitScreenItem3ImagePath)
99+
let exitScreenItem3LaunchURL = getUserExperienceValue(\.exitScreenItem3LaunchURL, defaultValue: DefaultValues.exitScreenItem3LaunchURL)
100+
let exitScreenItem3Title = getUserExperienceValue(\.exitScreenItem3Title, defaultValue: DefaultValues.exitScreenItem3Title)
101+
102+
let welcomeScreenItem1DescriptionText = getUserExperienceValue(\.welcomeScreenItem1DescriptionText, defaultValue: DefaultValues.welcomeScreenItem1DescriptionText)
61103
let welcomeScreenItem1SymbolName = dynamicOSPreferences.welcomeScreenItem1SymbolName
104+
let welcomeScreenItem1Title = getUserExperienceValue(\.welcomeScreenItem1Title, defaultValue: DefaultValues.welcomeScreenItem1Title)
62105

63-
let welcomeScreenItem1Title = userExperienceJSON?.welcomeScreenItem1Title ?? "Configurations"
64-
let welcomeScreenItem2DescriptionText = userExperienceJSON?.welcomeScreenItem2DescriptionText ?? "While Apple has world class applications built in to macOS, we know that some of your favorite business applications still need to be added. Some are installing now, but checkout our self service application for even more."
65-
let welcomeScreenItem2SymbolName = userExperienceJSON?.welcomeScreenItem2SymbolName ?? "slider.horizontal.below.rectangle"
66-
let welcomeScreenItem2Title = userExperienceJSON?.welcomeScreenItem2Title ?? "Applications"
67-
let welcomeScreenItem3DescriptionText = userExperienceJSON?.welcomeScreenItem3DescriptionText ?? "By applying security policies, we ensure that your device is fully up to date with the latest updates, all while still valuing your privacy."
68-
let welcomeScreenItem3SymbolName = userExperienceJSON?.welcomeScreenItem3SymbolName ?? "mappin.circle"
69-
let welcomeScreenItem3Title = userExperienceJSON?.welcomeScreenItem3Title ?? "Secure"
70-
let welcomeTimer = userExperienceJSON?.welcomeTimer ?? 60
106+
let welcomeScreenItem2DescriptionText = getUserExperienceValue(\.welcomeScreenItem2DescriptionText, defaultValue: DefaultValues.welcomeScreenItem2DescriptionText)
107+
let welcomeScreenItem2SymbolName = getUserExperienceValue(\.welcomeScreenItem2SymbolName, defaultValue: DefaultValues.welcomeScreenItem2SymbolName)
108+
let welcomeScreenItem2Title = getUserExperienceValue(\.welcomeScreenItem2Title, defaultValue: DefaultValues.welcomeScreenItem2Title)
71109

72-
// deviceStages
110+
let welcomeScreenItem3DescriptionText = getUserExperienceValue(\.welcomeScreenItem3DescriptionText, defaultValue: DefaultValues.welcomeScreenItem3DescriptionText)
111+
let welcomeScreenItem3SymbolName = getUserExperienceValue(\.welcomeScreenItem3SymbolName, defaultValue: DefaultValues.welcomeScreenItem3SymbolName)
112+
let welcomeScreenItem3Title = getUserExperienceValue(\.welcomeScreenItem3Title, defaultValue: DefaultValues.welcomeScreenItem3Title)
113+
114+
let welcomeTimer = getUserExperienceValue(\.welcomeTimer, defaultValue: 60)
115+
116+
// Company logos
117+
let companyLogoPath = getUserExperienceValue(\.companyLogoPath, defaultValue: DefaultValues.companyLogoPath)
118+
let companyLogoPath2 = getUserExperienceValue(\.companyLogoPath2, defaultValue: DefaultValues.companyLogoPath2)
119+
120+
// Additional values
121+
let aboutURL = getUserExperienceValue(\.aboutURL, defaultValue: DefaultValues.aboutURL)
122+
let provisioningHeaderText = getUserExperienceValue(\.provisioningHeaderText, defaultValue: DefaultValues.provisioningHeaderText)
123+
let provisioningBodyText = getUserExperienceValue(\.provisioningBodyText, defaultValue: DefaultValues.provisioningBodyText)
124+
let welcomeSubHeaderText = getUserExperienceValue(\.welcomeSubHeaderText, defaultValue: DefaultValues.welcomeSubHeaderText)
125+
let exitText = getUserExperienceValue(\.exitText, defaultValue: DefaultValues.exitText)
126+
let quitButtonText = getUserExperienceValue(\.quitButtonText, defaultValue: DefaultValues.quitButtonText)
127+
let restartButtonText = getUserExperienceValue(\.restartButtonText, defaultValue: DefaultValues.restartButtonText)
128+
let disableExitScreen = getUserExperienceValue(\.disableExitScreen, defaultValue: DefaultValues.disableExitScreen)
129+
let restartStyle = getUserExperienceValue(\.restartStyle, defaultValue: DefaultValues.restartStyle)
130+
let disableWelcomeScreen = getUserExperienceValue(\.disableWelcomeScreen, defaultValue: DefaultValues.disableWelcomeScreen)
131+
let enableWelcomeScreenTimer = getUserExperienceValue(\.enableWelcomeScreenTimer, defaultValue: DefaultValues.enableWelcomeScreenTimer)
132+
let welcomeButtonText = getUserExperienceValue(\.welcomeButtonText, defaultValue: DefaultValues.welcomeButtonText)
133+
let welcomeHeaderText = getUserExperienceValue(\.welcomeHeaderText, defaultValue: DefaultValues.welcomeHeaderText)
134+
let exitScreenBodyText = getUserExperienceValue(\.exitScreenBodyText, defaultValue: DefaultValues.exitScreenBodyText)
135+
136+
// Device Stages
73137
let deviceStages = deviceStagesJSON ?? []
74138

139+
// Functions to retrieve JSON
75140
func getUserExperienceJSON() -> UserExperience? {
76-
if let userExperience = helloJSONPreferences?.userExperience {
77-
return userExperience
78-
} else {
79-
return nil
80-
}
141+
return helloJSONPreferences?.userExperience
81142
}
82143

83144
func getDeviceStagesJSON() -> [DeviceStage]? {
84-
if let deviceStages = helloJSONPreferences?.deviceStages {
85-
return deviceStages
86-
} else {
87-
return nil
88-
}
145+
return helloJSONPreferences?.deviceStages
89146
}
90-

0 commit comments

Comments
 (0)