diff --git a/app/cmd/app/app.go b/app/cmd/app/app.go index 7e183b8df..1b99df5a7 100644 --- a/app/cmd/app/app.go +++ b/app/cmd/app/app.go @@ -305,6 +305,9 @@ func main() { go func() { <-signals slog.Info("received SIGINT or SIGTERM signal, shutting down") + if err := st.ClearAllDrafts(); err != nil { + slog.Warn("failed to clear drafts on shutdown", "error", err) + } quit() }() diff --git a/app/cmd/app/app_darwin.go b/app/cmd/app/app_darwin.go index 8e886a124..0c2fc2cad 100644 --- a/app/cmd/app/app_darwin.go +++ b/app/cmd/app/app_darwin.go @@ -182,6 +182,11 @@ func osRun(_ func(), hasCompletedFirstRun, startHidden bool) { } func quit() { + if wv.Store != nil { + if err := wv.Store.ClearAllDrafts(); err != nil { + slog.Warn("failed to clear drafts on quit", "error", err) + } + } C.quit() } diff --git a/app/cmd/app/app_windows.go b/app/cmd/app/app_windows.go index 9caeb178a..b7174d730 100644 --- a/app/cmd/app/app_windows.go +++ b/app/cmd/app/app_windows.go @@ -111,6 +111,11 @@ func (*appCallbacks) UIRunning() bool { } func (app *appCallbacks) Quit() { + if wv.Store != nil { + if err := wv.Store.ClearAllDrafts(); err != nil { + slog.Warn("failed to clear drafts on quit", "error", err) + } + } app.t.Quit() wv.Terminate() } diff --git a/app/store/database.go b/app/store/database.go index 91525abe5..9fda900f6 100644 --- a/app/store/database.go +++ b/app/store/database.go @@ -707,6 +707,14 @@ func (db *database) updateChatDraft(chatID string, draft string) error { return nil } +func (db *database) clearAllDrafts() error { + _, err := db.conn.Exec(`UPDATE chats SET draft = ''`) + if err != nil { + return fmt.Errorf("clear all drafts: %w", err) + } + return nil +} + // updateChatBrowserState updates only the browser_state for a chat func (db *database) updateChatBrowserState(chatID string, state json.RawMessage) error { _, err := db.conn.Exec(`UPDATE chats SET browser_state = ? WHERE id = ?`, string(state), chatID) diff --git a/app/store/store.go b/app/store/store.go index feaa0a354..2d53ea695 100644 --- a/app/store/store.go +++ b/app/store/store.go @@ -460,6 +460,14 @@ func (s *Store) UpdateChatDraft(chatID string, draft string) error { return s.db.updateChatDraft(chatID, draft) } +func (s *Store) ClearAllDrafts() error { + if err := s.ensureDB(); err != nil { + return err + } + + return s.db.clearAllDrafts() +} + func (s *Store) UpdateChatBrowserState(chatID string, state json.RawMessage) error { if err := s.ensureDB(); err != nil { return err diff --git a/app/ui/app/src/components/ChatForm.tsx b/app/ui/app/src/components/ChatForm.tsx index d312cc2aa..cca2824ef 100644 --- a/app/ui/app/src/components/ChatForm.tsx +++ b/app/ui/app/src/components/ChatForm.tsx @@ -268,8 +268,6 @@ function ChatForm({ if (textareaRef.current) { textareaRef.current.style.height = "auto"; } - - clearDraft(); }; // Clear loginPromptFeature when user becomes authenticated or no features are enabled