Files organization + cancel + refactoring

release
Laurent 3 years ago
parent fffaf67caa
commit 7430a3842c
  1. 56
      LeCountdown.xcodeproj/project.pbxproj
  2. 0
      LeCountdown/Model/Countdown+Extensions.swift
  3. 0
      LeCountdown/Model/LeCountdown.xcdatamodeld/.xccurrentversion
  4. 0
      LeCountdown/Model/LeCountdown.xcdatamodeld/LeCountdown.xcdatamodel/contents
  5. 0
      LeCountdown/Model/NSManagedContext+Extensions.swift
  6. 0
      LeCountdown/Model/Persistence.swift
  7. 0
      LeCountdown/Utils/TimeInterval+Extensions.swift
  8. 22
      LeCountdown/Views/ContentView.swift
  9. 57
      LeCountdown/Views/NewCountdownView.swift
  10. 0
      LeCountdown/Widget/IntentDataProvider.swift

@ -41,7 +41,7 @@
C438C8012981327600BF3EF9 /* Persistence.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4060DC8297AE73D003FAB80 /* Persistence.swift */; };
C438C802298132B900BF3EF9 /* LeCountdown.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = C4060DCA297AE73D003FAB80 /* LeCountdown.xcdatamodeld */; };
C438C80529813FB400BF3EF9 /* TimeInterval+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4060DF4297AE9A7003FAB80 /* TimeInterval+Extensions.swift */; };
C438C807298195E600BF3EF9 /* Countdown+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C438C806298195E600BF3EF9 /* Countdown+Extension.swift */; };
C438C807298195E600BF3EF9 /* Countdown+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C438C806298195E600BF3EF9 /* Countdown+Extensions.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@ -126,7 +126,7 @@
C438C7FE2981300500BF3EF9 /* IntentDataProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntentDataProvider.swift; sourceTree = "<group>"; };
C438C80329813B2500BF3EF9 /* LaunchIntents.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = LaunchIntents.entitlements; sourceTree = "<group>"; };
C438C80429813B3100BF3EF9 /* LeCountdown.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = LeCountdown.entitlements; sourceTree = "<group>"; };
C438C806298195E600BF3EF9 /* Countdown+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Countdown+Extension.swift"; sourceTree = "<group>"; };
C438C806298195E600BF3EF9 /* Countdown+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Countdown+Extensions.swift"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -199,21 +199,17 @@
C4060DBE297AE73B003FAB80 /* LeCountdown */ = {
isa = PBXGroup;
children = (
C438C7C829803CA000BF3EF9 /* AppDelegate.swift */,
C4060DBF297AE73B003FAB80 /* LeCountdownApp.swift */,
C4060DC1297AE73B003FAB80 /* ContentView.swift */,
C4060DF6297AFEF2003FAB80 /* NewCountdownView.swift */,
C438C7C02980228B00BF3EF9 /* CountdownScheduler.swift */,
C438C80B2981DE2E00BF3EF9 /* Views */,
C438C8092981DDF800BF3EF9 /* Model */,
C438C80A2981DE1A00BF3EF9 /* Utils */,
C438C8082981DDD200BF3EF9 /* Widget */,
C4060DC3297AE73D003FAB80 /* Assets.xcassets */,
C438C7C829803CA000BF3EF9 /* AppDelegate.swift */,
C4060DC8297AE73D003FAB80 /* Persistence.swift */,
C438C7C4298024E900BF3EF9 /* NSManagedContext+Extensions.swift */,
C4060DF4297AE9A7003FAB80 /* TimeInterval+Extensions.swift */,
C438C7FE2981300500BF3EF9 /* IntentDataProvider.swift */,
C438C80429813B3100BF3EF9 /* LeCountdown.entitlements */,
C4060DCD297AE73D003FAB80 /* Info.plist */,
C4060DCA297AE73D003FAB80 /* LeCountdown.xcdatamodeld */,
C4060DC5297AE73D003FAB80 /* Preview Content */,
C438C806298195E600BF3EF9 /* Countdown+Extension.swift */,
);
path = LeCountdown;
sourceTree = "<group>";
@ -277,6 +273,42 @@
path = LaunchIntents;
sourceTree = "<group>";
};
C438C8082981DDD200BF3EF9 /* Widget */ = {
isa = PBXGroup;
children = (
C438C7FE2981300500BF3EF9 /* IntentDataProvider.swift */,
);
path = Widget;
sourceTree = "<group>";
};
C438C8092981DDF800BF3EF9 /* Model */ = {
isa = PBXGroup;
children = (
C4060DCA297AE73D003FAB80 /* LeCountdown.xcdatamodeld */,
C438C806298195E600BF3EF9 /* Countdown+Extensions.swift */,
C438C7C4298024E900BF3EF9 /* NSManagedContext+Extensions.swift */,
C4060DC8297AE73D003FAB80 /* Persistence.swift */,
);
path = Model;
sourceTree = "<group>";
};
C438C80A2981DE1A00BF3EF9 /* Utils */ = {
isa = PBXGroup;
children = (
C4060DF4297AE9A7003FAB80 /* TimeInterval+Extensions.swift */,
);
path = Utils;
sourceTree = "<group>";
};
C438C80B2981DE2E00BF3EF9 /* Views */ = {
isa = PBXGroup;
children = (
C4060DC1297AE73B003FAB80 /* ContentView.swift */,
C4060DF6297AFEF2003FAB80 /* NewCountdownView.swift */,
);
path = Views;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@ -468,7 +500,7 @@
buildActionMask = 2147483647;
files = (
C4060DC9297AE73D003FAB80 /* Persistence.swift in Sources */,
C438C807298195E600BF3EF9 /* Countdown+Extension.swift in Sources */,
C438C807298195E600BF3EF9 /* Countdown+Extensions.swift in Sources */,
C438C7FF2981300500BF3EF9 /* IntentDataProvider.swift in Sources */,
C4060DC2297AE73B003FAB80 /* ContentView.swift in Sources */,
C438C7C12980228B00BF3EF9 /* CountdownScheduler.swift in Sources */,

@ -19,6 +19,12 @@ struct CountdownLiveView: View {
Text(countdown.name ?? "")
if let date = environment.notificationDates[countdown.stringId] {
Text(date, style: .timer)
Button {
CountdownScheduler.master.cancelCurrentNotifications(countdown: countdown)
} label: {
Text("Cancel").buttonStyle(.bordered).tint(.blue)
}
} else {
Text(countdown.duration.minuteSecond)
}
@ -81,10 +87,8 @@ struct ContentView: View {
CountdownEditView(countdown: countdown, isPresented: $isShowingNewCountdown)
.environment(\.managedObjectContext, viewContext)
} label: {
Image(systemName: "pencil").font(.system(size: 30))
Image(systemName: "gearshape.fill").font(.system(size: 30))
.padding(12.0)
.overlay(Circle().stroke(.blue, lineWidth: 4)
)
}
}
@ -149,12 +153,12 @@ struct ContentView: View {
}
private let itemFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateStyle = .short
formatter.timeStyle = .medium
return formatter
}()
//private let itemFormatter: DateFormatter = {
// let formatter = DateFormatter()
// formatter.dateStyle = .short
// formatter.timeStyle = .medium
// return formatter
//}()
struct ContentView_Previews: PreviewProvider {
static var previews: some View {

@ -23,6 +23,38 @@ struct NewCountdownView : View {
}
struct CountdownFormView : View {
var secondsBinding: Binding<String>
var minutesBinding: Binding<String>
var nameBinding: Binding<String>
@FocusState private var textFieldIsFocused: Bool
var body: some View {
Form {
Section(header: Text("Duration")) {
TextField("minutes", text: minutesBinding)
.keyboardType(.numberPad)
.focused($textFieldIsFocused)
TextField("seconds", text: secondsBinding)
.keyboardType(.numberPad)
.focused($textFieldIsFocused)
}
Section(header: Text("Name for tracking the activity")) {
TextField("name", text: nameBinding)
.focused($textFieldIsFocused)
}
Section(header: Text("Properties")) {
Text("Image")
Text("Sound")
}
}
}
}
struct CountdownEditView : View {
@Environment(\.managedObjectContext) private var viewContext
@ -42,7 +74,7 @@ struct CountdownEditView : View {
@State var error: Error? = nil
@FocusState private var textFieldIsFocused: Bool
@FetchRequest(sortDescriptors: [])
private var countdowns: FetchedResults<Countdown>
@ -51,25 +83,10 @@ struct CountdownEditView : View {
var body: some View {
NavigationStack {
Form {
Section(header: Text("Duration")) {
TextField("minutes", text: $minutesString)
.keyboardType(.numberPad)
.focused($textFieldIsFocused)
TextField("seconds", text: $secondsString)
.keyboardType(.numberPad)
.focused($textFieldIsFocused)
}
Section(header: Text("Name for tracking the activity")) {
TextField("name", text: $nameString)
.focused($textFieldIsFocused)
}
Section(header: Text("Properties")) {
Text("Image")
Text("Sound")
}
}.onAppear {
CountdownFormView(secondsBinding: $secondsString,
minutesBinding: $minutesString,
nameBinding: $nameString)
.onAppear {
self._onAppear()
}
.confirmationDialog("", isPresented: $deleteConfirmationShown, actions: {
Loading…
Cancel
Save