crazy haptics on completeing events

new alert for importing events (my custom one was pretty shit)
This commit is contained in:
neon443
2025-06-16 19:59:39 +01:00
parent b7ef7b4e19
commit 01ff82181a
2 changed files with 18 additions and 59 deletions

View File

@@ -15,7 +15,7 @@ struct ImportView: View {
@State private var text: String = "Ready..." @State private var text: String = "Ready..."
@State private var fgColor: Color = .yellow @State private var fgColor: Color = .yellow
@State private var showAlert: Bool = false @State private var showAlert: Bool = true
@State private var replaceCurrentEvents: Bool = false @State private var replaceCurrentEvents: Bool = false
@@ -67,64 +67,18 @@ struct ImportView: View {
} }
} }
.blur(radius: showAlert ? 2 : 0) .blur(radius: showAlert ? 2 : 0)
Group { .alert("Are you sure?", isPresented: $showAlert) {
Rectangle() Button(role: .destructive) {
.frame(maxWidth: .infinity, maxHeight: .infinity)
.foregroundStyle(replaceCurrentEvents ? .red.opacity(0.25) : .black.opacity(0.2))
.animation(.default, value: replaceCurrentEvents)
.ignoresSafeArea()
ZStack {
Rectangle()
.clipShape(RoundedRectangle(cornerRadius: 25))
VStack(alignment: .center) {
Text("Are you sure?")
.font(.largeTitle)
.bold()
.foregroundStyle(replaceCurrentEvents ? .red : .two)
.animation(.default, value: replaceCurrentEvents)
Text("This will replace your current events!")
.lineLimit(nil)
.multilineTextAlignment(.center)
.opacity(replaceCurrentEvents ? 1 : 0)
.animation(.default, value: replaceCurrentEvents)
.foregroundStyle(.two)
Toggle("Replace Events", isOn: $replaceCurrentEvents)
.foregroundStyle(.two)
Spacer()
HStack {
Button() {
withAnimation {
showAlert.toggle()
}
importEvents() importEvents()
} label: { } label: {
Text("cancel") Text("Replace Events")
.font(.title2)
.bold()
}
.buttonStyle(BorderedProminentButtonStyle())
Spacer()
Button() {
withAnimation {
showAlert.toggle()
} }
Button(role: .cancel) {
importEvents() importEvents()
} label: { } label: {
Text("yes") Text("Add to Events")
.font(.title2)
.bold()
} }
.buttonStyle(BorderedProminentButtonStyle())
} }
.padding()
}
.padding()
}
.frame(maxWidth: 250, maxHeight: 250)
}
.opacity(showAlert ? 1 : 0)
} }
} }
} }

View File

@@ -34,17 +34,22 @@ struct CompleteEventButton: View {
completeStartTime = .now completeStartTime = .now
progress = 0 progress = 0
timer = Timer(timeInterval: 0.01, repeats: true) { timer in timer = Timer(timeInterval: 0.02, repeats: true) { timer in
guard completeInProgress else { return } guard completeInProgress else { return }
guard timer.isValid else { return } guard timer.isValid else { return }
let elapsed = Date().timeIntervalSince(completeStartTime) let elapsed = Date().timeIntervalSince(completeStartTime)
progress = min(1, elapsed) progress = min(1, elapsed)
#if canImport(UIKit)
UIImpactFeedbackGenerator(style: .light).impactOccurred()
#endif
if progress >= 1 { if progress >= 1 {
withAnimation { completeInProgress = false } withAnimation { completeInProgress = false }
viewModel.completeEvent(&event) viewModel.completeEvent(&event)
#if canImport(UIKit) #if canImport(UIKit)
DispatchQueue.main.asyncAfter(deadline: .now()+0.02) {
UINotificationFeedbackGenerator().notificationOccurred(.success) UINotificationFeedbackGenerator().notificationOccurred(.success)
}
#endif #endif
timer.invalidate() timer.invalidate()
progress = 0 progress = 0