diff --git a/src/components/Page.tsx b/src/components/Page.tsx index 9b45333..0f3b9f9 100644 --- a/src/components/Page.tsx +++ b/src/components/Page.tsx @@ -1,8 +1,76 @@ -import { FlowComponent } from "solid-js"; +import { + createEffect, + createMemo, + createSignal, + FlowComponent, + onCleanup, + useContext, +} from "solid-js"; +import { UiStoreContext } from "~/stores"; +import { de } from "date-fns/locale"; +import { formatDistanceToNow, fromUnixTime, getUnixTime } from "date-fns"; const Page: FlowComponent = (props) => { + const [uiState] = useContext(UiStoreContext)!; + const [now, setNow] = createSignal(new Date()); + createEffect(function () { + const interval = setInterval(function () { + setNow(new Date()); + }, 10000); + onCleanup(() => clearInterval(interval)); + }); + const lastSavedWords = createMemo(function () { + now(); + + let words = "Nie"; + + if (uiState.lastSaved > 0) { + words = formatDistanceToNow(fromUnixTime(uiState.lastSaved), { + includeSeconds: true, + addSuffix: true, + locale: de, + }); + } + + return words; + }); + const savedDistance = createMemo(function () { + now(); + + if (uiState.lastSaved === 0) { + return -1; + } + + const nowUnix = getUnixTime(new Date()); + const distance = nowUnix - uiState.lastSaved; + + return distance; + }); + return ( -
+
+
+ Zuletzt gespeichert:{" "} + = 0 && savedDistance() < 60, + "text-lime-800 text-opacity-50": + savedDistance() >= 60 && savedDistance() < 120, + "text-yellow-700 text-opacity-60": + savedDistance() >= 120 && savedDistance() < 180, + "text-orange-700 text-opacity-70": + savedDistance() >= 180 && savedDistance() < 300, + "text-red-700 text-opacity-75": savedDistance() >= 300, + "font-bold": savedDistance() >= 600, + }} + > + {lastSavedWords()} + +
{props.children}
diff --git a/src/components/Settings/Overlay.tsx b/src/components/Settings/Overlay.tsx index 823d4dc..a1d7fe7 100644 --- a/src/components/Settings/Overlay.tsx +++ b/src/components/Settings/Overlay.tsx @@ -12,7 +12,7 @@ import { onCleanup, } from "solid-js"; import { createStore, reconcile, unwrap } from "solid-js/store"; -import { format, fromUnixTime } from "date-fns"; +import { format, fromUnixTime, getUnixTime } from "date-fns"; import z from "myzod"; import Big from "big.js"; import { generate } from "node-iso11649"; @@ -199,6 +199,8 @@ const SettingsOverlay: Component = () => { "application/json", fileContent ); + + setUiState("lastSaved", getUnixTime(new Date())); }; const saveOnCtrlS = (e: KeyboardEvent) => { diff --git a/src/stores.ts b/src/stores.ts index 49501d0..1ea49ab 100644 --- a/src/stores.ts +++ b/src/stores.ts @@ -31,6 +31,7 @@ export const PRINT_TYPE_INVOICE = "INVOICE"; export const createUiStore = () => createStore_({ + lastSaved: 0, printType: PRINT_TYPE_INVOICE as | typeof PRINT_TYPE_OFFER | typeof PRINT_TYPE_CONFIRMATION