diff --git a/src/lib/ae_journals/ae_journals_stores.ts b/src/lib/ae_journals/ae_journals_stores.ts index f18dc073..c032188f 100644 --- a/src/lib/ae_journals/ae_journals_stores.ts +++ b/src/lib/ae_journals/ae_journals_stores.ts @@ -81,6 +81,7 @@ const journals_local_data_struct: key_val = { llm__frequency_penalty: 0.0, llm__presence_penalty: 0.0, + auto_save: false, edit: false, edit_kv: {} } diff --git a/src/routes/journals/JournalEntry_Header.svelte b/src/routes/journals/JournalEntry_Header.svelte index 31297ef3..138bf099 100644 --- a/src/routes/journals/JournalEntry_Header.svelte +++ b/src/routes/journals/JournalEntry_Header.svelte @@ -8,7 +8,8 @@ Save, Eye, Pencil, Tags, Shapes, Siren, MessageSquareWarning, Skull, Fingerprint, LockKeyhole, LockKeyholeOpen, Menu, - Globe, BookHeart, BriefcaseBusiness + Globe, BookHeart, BriefcaseBusiness, + CircleCheck, CircleX, Loader2, RefreshCw } from '@lucide/svelte'; import { ae_util } from '$lib/ae_utils/ae_utils'; import { ae_loc } from '$lib/stores/ae_stores'; @@ -28,6 +29,7 @@ onChangeJournal: () => void; onAppend?: () => void; onPrepend?: () => void; + save_status?: 'saved' | 'unsaved' | 'saving'; log_lvl?: number; } @@ -43,6 +45,7 @@ onChangeJournal, onAppend, onPrepend, + save_status = 'saved', log_lvl = 0 }: Props = $props(); @@ -96,6 +99,34 @@ p-2 md:p-3 rounded-lg shadow-md {/if} + + {#if $journals_loc.entry.edit_kv[entry.journal_entry_id] === 'current'} +
+ + + {#if $journals_loc.entry.auto_save} +
+ {#if save_status === 'saving'} + + {:else if save_status === 'saved'} + + {:else} + + {/if} +
+ {/if} +
+ {/if} +

{#if $journals_loc.entry.edit_kv[entry.journal_entry_id] == 'current'} ; + + $effect(() => { + if (tmp_entry_obj_changed) { + if (save_status !== 'saving') save_status = 'unsaved'; + + if ($journals_loc.entry.auto_save) { + clearTimeout(auto_save_timer); + auto_save_timer = setTimeout(() => { + if (tmp_entry_obj_changed) { // Double check + update_journal_entry(); + } + }, 2000); // 2 seconds debounce + } + } else { + clearTimeout(auto_save_timer); + if (save_status !== 'saving') { + save_status = 'saved'; + } + } + }); + let decrypted_history: string = $state(''); if (!$journals_loc?.entry?.decrypt_kv) { @@ -266,6 +290,8 @@ return; } + save_status = 'saving'; + let data_kv: key_val = { alert: tmp_entry_obj?.alert, personal: tmp_entry_obj?.personal, @@ -388,8 +414,10 @@ }); if (log_lvl) console.log('Journal entry updated successfully:', response); updated_obj = true; + save_status = 'saved'; } catch (error) { console.error('Error updating journal entry:', error); + save_status = 'unsaved'; alert('Failed to update journal entry.'); } } @@ -527,6 +555,7 @@ onChangeJournal={change_journal_id} onAppend={handle_append_start} onPrepend={handle_prepend_start} + {save_status} {log_lvl} />