From 626518ef8bbbd269b12adb7f1929571a221c34cf Mon Sep 17 00:00:00 2001 From: SSylvain1989 Date: Tue, 3 Mar 2026 21:31:13 +0100 Subject: [PATCH] Add debounced auto-save while typing Schedule a persist after 1.5s of inactivity on title, content or color changes. The pending task is cancelled on each new keystroke and when the editor closes. --- .../components/Notch/NotchNotesView.swift | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/DynamicIsland/components/Notch/NotchNotesView.swift b/DynamicIsland/components/Notch/NotchNotesView.swift index 177b3d9..4fe1119 100644 --- a/DynamicIsland/components/Notch/NotchNotesView.swift +++ b/DynamicIsland/components/Notch/NotchNotesView.swift @@ -36,6 +36,7 @@ struct NotchNotesView: View { @State private var editorImageData: Data? = nil @State private var editorColorIndex: Int = 0 @State private var editorNoteId: UUID? + @State private var autoSaveTask: Task? @Default(.enableNotes) var enableNotes @@ -122,6 +123,15 @@ struct NotchNotesView: View { .onChange(of: enableNotes) { _, _ in updateLayoutState() } + .onChange(of: editorContent) { _, _ in + scheduleAutoSave() + } + .onChange(of: editorTitle) { _, _ in + scheduleAutoSave() + } + .onChange(of: editorColorIndex) { _, _ in + scheduleAutoSave() + } } // MARK: - Actions @@ -247,6 +257,19 @@ struct NotchNotesView: View { savedNotes = notes } + private func scheduleAutoSave() { + guard isEditingNewNote || selectedNoteId != nil else { return } + + autoSaveTask?.cancel() + autoSaveTask = Task { + try? await Task.sleep(nanoseconds: 1_500_000_000) + guard !Task.isCancelled else { return } + await MainActor.run { + persistNote() + } + } + } + private func saveNote() { persistNote() closeEditor() @@ -338,6 +361,8 @@ struct NotchNotesView: View { } private func closeEditor() { + autoSaveTask?.cancel() + autoSaveTask = nil isEditingNewNote = false selectedNoteId = nil // Tiny delay to clear state after animation