TheNoiseClock/TheNoiseClock/Features/Alarms/Views/EditAlarmView.swift
Matt Bruce a3398f0dd0 refactored with bedrock and organized folders
Signed-off-by: Matt Bruce <mbrucedogs@gmail.com>
2026-01-31 10:46:41 -06:00

163 lines
6.4 KiB
Swift

//
// EditAlarmView.swift
// TheNoiseClock
//
// Created by Matt Bruce on 9/7/25.
//
import SwiftUI
import AudioPlaybackKit
/// View for editing existing alarms
struct EditAlarmView: View {
// MARK: - Properties
let viewModel: AlarmViewModel
let alarm: Alarm
@Environment(\.dismiss) private var dismiss
@State private var alarmTime: Date
@State private var selectedSoundName: String
@State private var alarmLabel: String
@State private var notificationMessage: String
@State private var snoozeDuration: Int
@State private var isVibrationEnabled: Bool
@State private var isLightFlashEnabled: Bool
@State private var volume: Float
// MARK: - Initialization
init(viewModel: AlarmViewModel, alarm: Alarm) {
self.viewModel = viewModel
self.alarm = alarm
// Initialize state with current alarm values
self._alarmTime = State(initialValue: alarm.time)
self._selectedSoundName = State(initialValue: alarm.soundName)
self._alarmLabel = State(initialValue: alarm.label)
self._notificationMessage = State(initialValue: alarm.notificationMessage)
self._snoozeDuration = State(initialValue: alarm.snoozeDuration)
self._isVibrationEnabled = State(initialValue: alarm.isVibrationEnabled)
self._isLightFlashEnabled = State(initialValue: alarm.isLightFlashEnabled)
self._volume = State(initialValue: alarm.volume)
}
// MARK: - Body
var body: some View {
NavigationView {
VStack(spacing: 0) {
// Time picker section at top
TimePickerSection(selectedTime: $alarmTime)
TimeUntilAlarmSection(alarmTime: alarmTime)
// List for settings below
List {
// Label Section
NavigationLink(destination: LabelEditView(label: $alarmLabel)) {
HStack {
Image(systemName: "textformat")
.foregroundColor(UIConstants.Colors.accentColor)
.frame(width: 24)
Text("Label")
Spacer()
Text(alarmLabel)
.foregroundColor(.secondary)
}
}
// Notification Message Section
NavigationLink(destination: NotificationMessageEditView(message: $notificationMessage)) {
HStack {
Image(systemName: "message")
.foregroundColor(UIConstants.Colors.accentColor)
.frame(width: 24)
Text("Message")
Spacer()
Text(notificationMessage)
.foregroundColor(.secondary)
.lineLimit(1)
}
}
// Sound Section
NavigationLink(destination: SoundSelectionView(selectedSound: $selectedSoundName)) {
HStack {
Image(systemName: "music.note")
.foregroundColor(UIConstants.Colors.accentColor)
.frame(width: 24)
Text("Sound")
Spacer()
Text(getSoundDisplayName(selectedSoundName))
.foregroundColor(.secondary)
}
}
// Snooze Section
NavigationLink(destination: SnoozeSelectionView(snoozeDuration: $snoozeDuration)) {
HStack {
Image(systemName: "clock.arrow.circlepath")
.foregroundColor(UIConstants.Colors.accentColor)
.frame(width: 24)
Text("Snooze")
Spacer()
Text("for \(snoozeDuration) min")
.foregroundColor(.secondary)
}
}
}
.listStyle(.insetGrouped)
}
.navigationTitle("Edit Alarm")
.navigationBarTitleDisplayMode(.inline)
.navigationBarBackButtonHidden(true)
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
Button("Cancel") {
dismiss()
}
.foregroundColor(UIConstants.Colors.accentColor)
}
ToolbarItem(placement: .navigationBarTrailing) {
Button("Save") {
Task {
let updatedAlarm = Alarm(
id: alarm.id, // Keep the same ID
time: alarmTime,
isEnabled: alarm.isEnabled, // Keep the same enabled state
soundName: selectedSoundName,
label: alarmLabel,
notificationMessage: notificationMessage,
snoozeDuration: snoozeDuration,
isVibrationEnabled: isVibrationEnabled,
isLightFlashEnabled: isLightFlashEnabled,
volume: volume
)
await viewModel.updateAlarm(updatedAlarm)
dismiss()
}
}
.foregroundColor(UIConstants.Colors.accentColor)
.fontWeight(.semibold)
}
}
}
}
// MARK: - Helper Methods
private func getSoundDisplayName(_ fileName: String) -> String {
return AlarmSoundService.shared.getSoundDisplayName(fileName)
}
}
// MARK: - Preview
#Preview {
EditAlarmView(
viewModel: AlarmViewModel(),
alarm: Alarm(
time: Date(),
label: "Morning Alarm",
notificationMessage: "Time to wake up!"
)
)
}