diff --git a/src/lib/History/history.ts b/src/lib/History/history.ts new file mode 100644 index 00000000..bf8189d2 --- /dev/null +++ b/src/lib/History/history.ts @@ -0,0 +1,25 @@ +import { derived, Readable, Writable, writable } from 'svelte/store'; + +const MAX_AUTO_HISTORY_LENGTH = 10; + +export const autoHistoryMode: Writable = writable(true); +const autoHistoryStore: Writable = writable([]); +const manualHistoryStore: Writable = writable([]); +export const historyStore: Readable = derived( + [autoHistoryMode, autoHistoryStore, manualHistoryStore], + ([autoMode, autoHistories, manualHistories], set) => { + set(autoMode ? autoHistories : manualHistories); + } +); +export const addHistoryEntry = (entry: HistoryEntry): void => { + if (!entry.auto) { + manualHistoryStore.update((entries) => [entry, ...entries]); + return; + } + autoHistoryStore.update((entries) => { + if (entries.length === MAX_AUTO_HISTORY_LENGTH) { + entries.pop(); + } + return [entry, ...entries]; + }); +}; diff --git a/src/lib/History/index.svelte b/src/lib/History/index.svelte index 1d8e30a2..d52b25d9 100644 --- a/src/lib/History/index.svelte +++ b/src/lib/History/index.svelte @@ -2,12 +2,13 @@ import Tabs from '$lib/Tabs/index.svelte'; import Card from '$lib/Card/index.svelte'; import { codeStore, getStateString } from '$lib/Util/state'; - import { historyStore } from '$lib/Util/history'; + import { addHistoryEntry, autoHistoryMode, historyStore } from './history'; + import { notify } from '$lib/Util/notify'; - let historyMode: string = 'saved'; + const HISTORY_SAVE_INTERVAL: number = 60000; const tabSelectHandler = (message: CustomEvent) => { - historyMode = message.detail.id; + autoHistoryMode.set('timeline' === message.detail.id); }; const tabs: Tab[] = [ { @@ -20,28 +21,25 @@ } ]; - let previousState = getStateString(); + const previousState = {}; setInterval(() => { - const currentState = getStateString(); - if (previousState !== currentState) { - saveHistory(true); - previousState = currentState; - } - }, 1000); + saveHistory(true); + }, HISTORY_SAVE_INTERVAL); - let history: HistoryEntry[] = []; - $: history = $historyStore.filter((h) => (historyMode === 'saved' ? !h.auto : h.auto)); const saveHistory = (auto = false) => { - historyStore.update((h) => [ - { + const currentState = getStateString(); + if (previousState[`${auto}`] !== currentState) { + addHistoryEntry({ state: $codeStore, time: new Date(), name: 'test', auto - }, - ...h - ]); + }); + previousState[`${auto}`] = currentState; + } else if (!auto) { + notify('State already saved.'); + } }; const restoreHistory = (state: State): any => { @@ -54,15 +52,16 @@
- saveHistory()} + >💾
    - {#each history as { state, time, name }} + {#each $historyStore as { state, time, name }}
  • {time} + {name}
  • {/each} diff --git a/src/lib/Util/history.ts b/src/lib/Util/history.ts deleted file mode 100644 index 6820e198..00000000 --- a/src/lib/Util/history.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { Writable, writable } from 'svelte/store'; - -export const historyStore: Writable = writable([]); diff --git a/src/lib/Util/notify.ts b/src/lib/Util/notify.ts new file mode 100644 index 00000000..782e27f5 --- /dev/null +++ b/src/lib/Util/notify.ts @@ -0,0 +1,3 @@ +export const notify = (message: string): void => { + alert(message); +}; diff --git a/src/routes/edit.svelte b/src/routes/edit.svelte index 09bbd97a..5a7d2c10 100644 --- a/src/routes/edit.svelte +++ b/src/routes/edit.svelte @@ -109,7 +109,7 @@
    {#if !$codeStore.autoSync} 🔄 {/if}