Skip to content

Commit 3f7be35

Browse files
authored
Merge pull request #12 from alyxferrari/version-1.0.6
Sobretium v1.0.6
2 parents b32b686 + fbfc62a commit 3f7be35

File tree

13 files changed

+209
-77
lines changed

13 files changed

+209
-77
lines changed

Sobretium.xcodeproj/project.pbxproj

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
/* Begin PBXBuildFile section */
1010
035E0CEE2908DE7E00F71A06 /* AppBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 035E0CED2908DE7E00F71A06 /* AppBanner.swift */; };
11+
03A94CF6292427780084C8F3 /* WhatsNewKit in Frameworks */ = {isa = PBXBuildFile; productRef = 03A94CF5292427780084C8F3 /* WhatsNewKit */; };
1112
1C229D3228EF523D006583DF /* SobretiumWatchApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C229D3128EF523D006583DF /* SobretiumWatchApp.swift */; };
1213
1C229D3428EF523D006583DF /* WatchContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C229D3328EF523D006583DF /* WatchContentView.swift */; };
1314
1C229D3628EF5241006583DF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1C229D3528EF5241006583DF /* Assets.xcassets */; };
@@ -130,6 +131,7 @@
130131
isa = PBXFrameworksBuildPhase;
131132
buildActionMask = 2147483647;
132133
files = (
134+
03A94CF6292427780084C8F3 /* WhatsNewKit in Frameworks */,
133135
1C98187928FF246C00FF68BD /* PopupView in Frameworks */,
134136
1C9F35EA28E60A3300C69CCB /* PathText in Frameworks */,
135137
1C9F35ED28E60A6300C69CCB /* Time in Frameworks */,
@@ -336,6 +338,7 @@
336338
1C9F35E928E60A3300C69CCB /* PathText */,
337339
1C9F35EC28E60A6300C69CCB /* Time */,
338340
1C98187828FF246C00FF68BD /* PopupView */,
341+
03A94CF5292427780084C8F3 /* WhatsNewKit */,
339342
);
340343
productName = Sobretium;
341344
productReference = 1C91B1DB28D0F2E00062C18A /* Sobretium.app */;
@@ -372,6 +375,7 @@
372375
1C9F35E828E60A3300C69CCB /* XCRemoteSwiftPackageReference "CurvyText" */,
373376
1C9F35EB28E60A6300C69CCB /* XCRemoteSwiftPackageReference "time" */,
374377
1C98187728FF246C00FF68BD /* XCRemoteSwiftPackageReference "PopupView" */,
378+
03A94CF4292427780084C8F3 /* XCRemoteSwiftPackageReference "WhatsNewKit" */,
375379
);
376380
productRefGroup = 1C91B1DC28D0F2E00062C18A /* Products */;
377381
projectDirPath = "";
@@ -463,7 +467,7 @@
463467
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
464468
CODE_SIGN_ENTITLEMENTS = "SobretiumWatch Watch App/SobretiumWatch Watch App.entitlements";
465469
CODE_SIGN_STYLE = Automatic;
466-
CURRENT_PROJECT_VERSION = 225;
470+
CURRENT_PROJECT_VERSION = 226;
467471
DEVELOPMENT_ASSET_PATHS = "\"SobretiumWatch Watch App/Preview Content\"";
468472
DEVELOPMENT_TEAM = W8C8UQ95CG;
469473
ENABLE_PREVIEWS = YES;
@@ -477,7 +481,7 @@
477481
"$(inherited)",
478482
"@executable_path/Frameworks",
479483
);
480-
MARKETING_VERSION = 1.0.5;
484+
MARKETING_VERSION = 1.0.6;
481485
PRODUCT_BUNDLE_IDENTIFIER = com.alyxferrari.Sobretium.watchkitapp;
482486
PRODUCT_NAME = "$(TARGET_NAME)";
483487
SDKROOT = watchos;
@@ -497,7 +501,7 @@
497501
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
498502
CODE_SIGN_ENTITLEMENTS = "SobretiumWatch Watch App/SobretiumWatch Watch App.entitlements";
499503
CODE_SIGN_STYLE = Automatic;
500-
CURRENT_PROJECT_VERSION = 225;
504+
CURRENT_PROJECT_VERSION = 226;
501505
DEVELOPMENT_ASSET_PATHS = "\"SobretiumWatch Watch App/Preview Content\"";
502506
DEVELOPMENT_TEAM = W8C8UQ95CG;
503507
ENABLE_PREVIEWS = YES;
@@ -511,7 +515,7 @@
511515
"$(inherited)",
512516
"@executable_path/Frameworks",
513517
);
514-
MARKETING_VERSION = 1.0.5;
518+
MARKETING_VERSION = 1.0.6;
515519
PRODUCT_BUNDLE_IDENTIFIER = com.alyxferrari.Sobretium.watchkitapp;
516520
PRODUCT_NAME = "$(TARGET_NAME)";
517521
SDKROOT = watchos;
@@ -645,7 +649,7 @@
645649
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
646650
CODE_SIGN_ENTITLEMENTS = Sobretium/Sobretium.entitlements;
647651
CODE_SIGN_STYLE = Automatic;
648-
CURRENT_PROJECT_VERSION = 225;
652+
CURRENT_PROJECT_VERSION = 246;
649653
DEVELOPMENT_ASSET_PATHS = "\"Sobretium/Preview Content\"";
650654
DEVELOPMENT_TEAM = W8C8UQ95CG;
651655
ENABLE_PREVIEWS = YES;
@@ -667,15 +671,15 @@
667671
"$(inherited)",
668672
"@executable_path/Frameworks",
669673
);
670-
MARKETING_VERSION = 1.0.5;
674+
MARKETING_VERSION = 1.0.6;
671675
PRODUCT_BUNDLE_IDENTIFIER = com.alyxferrari.Sobretium;
672676
PRODUCT_NAME = "$(TARGET_NAME)";
673677
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
674678
SUPPORTS_MACCATALYST = NO;
675679
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
676680
SWIFT_EMIT_LOC_STRINGS = YES;
677681
SWIFT_VERSION = 5.0;
678-
TARGETED_DEVICE_FAMILY = "1,2";
682+
TARGETED_DEVICE_FAMILY = 1;
679683
};
680684
name = Debug;
681685
};
@@ -687,7 +691,7 @@
687691
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
688692
CODE_SIGN_ENTITLEMENTS = Sobretium/Sobretium.entitlements;
689693
CODE_SIGN_STYLE = Automatic;
690-
CURRENT_PROJECT_VERSION = 225;
694+
CURRENT_PROJECT_VERSION = 246;
691695
DEVELOPMENT_ASSET_PATHS = "\"Sobretium/Preview Content\"";
692696
DEVELOPMENT_TEAM = W8C8UQ95CG;
693697
ENABLE_PREVIEWS = YES;
@@ -706,15 +710,15 @@
706710
"$(inherited)",
707711
"@executable_path/Frameworks",
708712
);
709-
MARKETING_VERSION = 1.0.5;
713+
MARKETING_VERSION = 1.0.6;
710714
PRODUCT_BUNDLE_IDENTIFIER = com.alyxferrari.Sobretium;
711715
PRODUCT_NAME = "$(TARGET_NAME)";
712716
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
713717
SUPPORTS_MACCATALYST = NO;
714718
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
715719
SWIFT_EMIT_LOC_STRINGS = YES;
716720
SWIFT_VERSION = 5.0;
717-
TARGETED_DEVICE_FAMILY = "1,2";
721+
TARGETED_DEVICE_FAMILY = 1;
718722
};
719723
name = Release;
720724
};
@@ -751,6 +755,14 @@
751755
/* End XCConfigurationList section */
752756

753757
/* Begin XCRemoteSwiftPackageReference section */
758+
03A94CF4292427780084C8F3 /* XCRemoteSwiftPackageReference "WhatsNewKit" */ = {
759+
isa = XCRemoteSwiftPackageReference;
760+
repositoryURL = "https://github.com/SvenTiigi/WhatsNewKit";
761+
requirement = {
762+
kind = upToNextMajorVersion;
763+
minimumVersion = 2.0.0;
764+
};
765+
};
754766
1C98187728FF246C00FF68BD /* XCRemoteSwiftPackageReference "PopupView" */ = {
755767
isa = XCRemoteSwiftPackageReference;
756768
repositoryURL = "https://github.com/exyte/PopupView";
@@ -778,6 +790,11 @@
778790
/* End XCRemoteSwiftPackageReference section */
779791

780792
/* Begin XCSwiftPackageProductDependency section */
793+
03A94CF5292427780084C8F3 /* WhatsNewKit */ = {
794+
isa = XCSwiftPackageProductDependency;
795+
package = 03A94CF4292427780084C8F3 /* XCRemoteSwiftPackageReference "WhatsNewKit" */;
796+
productName = WhatsNewKit;
797+
};
781798
1C98187828FF246C00FF68BD /* PopupView */ = {
782799
isa = XCSwiftPackageProductDependency;
783800
package = 1C98187728FF246C00FF68BD /* XCRemoteSwiftPackageReference "PopupView" */;

Sobretium.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Sobretium/Entrypoint/SobretiumApp.swift

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
//
77

88
import SwiftUI
9+
import WhatsNewKit
910

1011
@main
1112
struct SobretiumApp: App {
@@ -14,6 +15,41 @@ struct SobretiumApp: App {
1415
WindowGroup {
1516
ContentView()
1617
.environment(\.managedObjectContext, dataController.container.viewContext)
18+
.environment(\.whatsNew, WhatsNewEnvironment(versionStore: UserDefaultsWhatsNewVersionStore(), whatsNewCollection: self))
1719
}
1820
}
1921
}
22+
23+
extension SobretiumApp: WhatsNewCollectionProvider {
24+
var whatsNewCollection: WhatsNewCollection {
25+
WhatsNew(
26+
version: "1.0.6",
27+
title: .init(text: .init("What's New in " + AttributedString("Sobretium", attributes: .foregroundColor(.red)))),
28+
features: [
29+
.init(
30+
image: .init(systemName: "sparkles", foregroundColor: .yellow),
31+
title: "Extended tracker length support",
32+
subtitle: "Trackers with a length of 365 days or greater are now supported."
33+
),
34+
.init(
35+
image: .init(systemName: "iphone", foregroundColor: .accentColor), // gray?
36+
title: "'What's New' summaries",
37+
subtitle: "That's this! Future app updates will ship with a summary of the changes introduced in the update."
38+
),
39+
.init(
40+
image: .init(systemName: "wand.and.stars.inverse", foregroundColor: .cyan),
41+
title: "Bug Fixes",
42+
subtitle: "In previous versions, length summaries for each tracker on the tracker list didn't update until the app reloaded. This has been fixed."
43+
)
44+
]
45+
)
46+
}
47+
}
48+
49+
extension AttributeContainer {
50+
static func foregroundColor(_ color: Color) -> Self {
51+
var container = Self()
52+
container.foregroundColor = color
53+
return container
54+
}
55+
}

Sobretium/Main View/ContentView.swift

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,24 @@
77

88
import SwiftUI
99
import LocalAuthentication
10+
import WhatsNewKit
1011

1112
struct ContentView: View {
1213
@AppStorage("stealth") var stealth: Bool = false
1314
@AppStorage("biometry") var biometry: Bool = false
1415
@AppStorage("launchCount") var launchCount: Int = 0
16+
@Environment(\.managedObjectContext) var moc
17+
@Environment(\.whatsNew) var whatsNewEnvironment
18+
@FetchRequest(sortDescriptors: []) var entries: FetchedResults<SobrietyEntry>
1519
@State var addTrackerSheetPresented: Bool = false
1620
@State var editTrackerSheetPresented: Bool = false
17-
@FetchRequest(sortDescriptors: []) var entries: FetchedResults<SobrietyEntry>
1821
@State var deletionCandidate: SobrietyEntry?
1922
@State var deletionAlertPresented: Bool = false
20-
@Environment(\.managedObjectContext) var moc
2123
@State var authenticated: Bool = false
2224
@State var linkSelection: String?
25+
#if DEBUG
26+
@State var whatsNew: WhatsNew?
27+
#endif
2328
var updateListenerTask: Task<Void, Error>? = nil
2429
init() {
2530
updateListenerTask = listenForTransactions()
@@ -36,10 +41,18 @@ struct ContentView: View {
3641
}
3742
} else {
3843
List {
44+
#if DEBUG
45+
Section(header: Text("Debug")) {
46+
Button("Present 'What's New' Sheet") {
47+
whatsNew = whatsNewEnvironment.whatsNewCollection.last!
48+
}
49+
.sheet(whatsNew: $whatsNew)
50+
}
51+
#endif
3952
Section(header: Text(stealth ? "Trackers" : "Sobriety Trackers")) {
4053
ForEach(entries) { entry in
4154
if entry.startDate != nil && entry.name != nil {
42-
NavigationLink(tag: entry.name!, selection: $linkSelection) {
55+
NavigationLink(tag: entry.name ?? UUID().uuidString, selection: $linkSelection) {
4356
RingView(entry)
4457
} label: {
4558
SobrietyEntryLabel(entry)
@@ -110,6 +123,7 @@ struct ContentView: View {
110123
deletionAlertPresented = false
111124
}
112125
}
126+
.whatsNewSheet()
113127
}
114128
}
115129
.onAppear(perform: authenticate)
@@ -142,7 +156,7 @@ struct ContentView: View {
142156
launchCount += 1
143157
for entry in entries {
144158
if entry.defaultEntry {
145-
linkSelection = entry.name!
159+
linkSelection = entry.name ?? UUID().uuidString
146160
authenticated = true
147161
return
148162
}

Sobretium/Main View/SobrietyEntryLabel.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,16 @@
88
import SwiftUI
99

1010
struct SobrietyEntryLabel: View {
11-
@State var entry: SobrietyEntry
11+
@ObservedObject var entry: SobrietyEntry
1212
let gradient = LinearGradient(gradient: Gradient(colors: [.accentColor, .cyan, .accentColor]), startPoint: .leading, endPoint: .trailing)
1313
init(_ entry: SobrietyEntry) {
14-
self._entry = State(initialValue: entry)
14+
self._entry = ObservedObject(initialValue: entry)
1515
}
1616
var body: some View {
1717
HStack {
18-
Text(entry.name!)
18+
Text(entry.name ?? "Error")
1919
Spacer()
20-
Text(entry.startDate!.daysAgoString)
20+
Text((entry.startDate ?? Date()).daysAgoString)
2121
.frame(minWidth: 0, minHeight: 0)
2222
.padding(.vertical, 5)
2323
.padding(.horizontal, 15)

Sobretium/Rings/RingView.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,16 @@ struct RingView: View {
1111
@Environment(\.presentationMode) var presentation
1212
@Environment(\.managedObjectContext) var moc
1313
@AppStorage("ringType") var ringType: Bool = false
14-
@State var entry: SobrietyEntry
14+
@ObservedObject var entry: SobrietyEntry
1515
@State var editTrackerSheetPresented: Bool = false
1616
@State var resetDateAlertPresented: Bool = false
1717
let gradient = LinearGradient(gradient: Gradient(colors: [.accentColor, .cyan, .accentColor]), startPoint: .leading, endPoint: .trailing)
1818
init(_ entry: SobrietyEntry) {
19-
self._entry = State(initialValue: entry)
19+
self._entry = ObservedObject(initialValue: entry)
2020
}
2121
var body: some View {
2222
VStack {
23-
Text(entry.subtitle ?? "I've been \(entry.name!.lowercased()) free for")
23+
Text(entry.subtitle ?? "I've been \((entry.name ?? "Error").lowercased()) free for")
2424
.frame(minWidth: 0, minHeight: 0)
2525
.padding(.vertical, 5)
2626
.padding(.horizontal, 15)
@@ -29,11 +29,11 @@ struct RingView: View {
2929
Capsule()
3030
.stroke(gradient, lineWidth: 1)
3131
}
32-
SobrietyRings(false, entry, ringType)
32+
SobrietyRings(entry, ringType)
3333
}
3434
.toolbar {
3535
ToolbarItem(placement: .principal) {
36-
Text(entry.name!)
36+
Text(entry.name ?? "Error")
3737
.fixedSize(horizontal: true, vertical: false)
3838
.font(.headline)
3939
}

0 commit comments

Comments
 (0)