chore(client/save_indicator): address requested changes

This commit is contained in:
Elian Doran 2026-01-03 19:47:33 +02:00
parent 42283b2469
commit 02e08fdf12
No known key found for this signature in database
3 changed files with 32 additions and 26 deletions

View File

@ -80,12 +80,12 @@ export default class SpacedUpdate {
try { try {
await this.updater(); await this.updater();
this.stateCallback?.("saved"); this.stateCallback?.("saved");
this.changed = false;
} catch (e) { } catch (e) {
this.stateCallback?.("error"); this.stateCallback?.("error");
logError(getErrorMessage(e)); logError(getErrorMessage(e));
} }
this.lastUpdated = Date.now(); this.lastUpdated = Date.now();
this.changed = false;
} else { } else {
// update isn't triggered but changes are still pending, so we need to schedule another check // update isn't triggered but changes are still pending, so we need to schedule another check
this.scheduleUpdate(); this.scheduleUpdate();

View File

@ -113,30 +113,30 @@ export function SaveStatusBadge() {
const saveState = useGetContextData("saveState"); const saveState = useGetContextData("saveState");
if (!saveState) return; if (!saveState) return;
let icon: string; const stateConfig = {
let title: string; saved: {
let tooltip: string | undefined; icon: "bx bx-check",
switch (saveState?.state) { title: t("breadcrumb_badges.save_status_saved"),
case "saved": tooltip: undefined
icon = "bx bx-check"; },
title = t("breadcrumb_badges.save_status_saved"); saving: {
break; icon: "bx bx-loader bx-spin",
case "saving": title: t("breadcrumb_badges.save_status_saving"),
icon = "bx bx-loader bx-spin"; tooltip: t("breadcrumb_badges.save_status_saving_tooltip")
title = t("breadcrumb_badges.save_status_saving"); },
tooltip = t("breadcrumb_badges.save_status_saving_tooltip"); unsaved: {
break; icon: "bx bx-pencil",
case "unsaved": title: t("breadcrumb_badges.save_status_unsaved"),
icon = "bx bx-pencil"; tooltip: t("breadcrumb_badges.save_status_unsaved_tooltip")
title = t("breadcrumb_badges.save_status_unsaved"); },
tooltip = t("breadcrumb_badges.save_status_unsaved_tooltip"); error: {
break; icon: "bx bxs-error",
case "error": title: t("breadcrumb_badges.save_status_error"),
icon = "bx bxs-error"; tooltip: t("breadcrumb_badges.save_status_error_tooltip")
title = t("breadcrumb_badges.save_status_error"); }
tooltip = t("breadcrumb_badges.save_status_error_tooltip"); };
break;
} const { icon, title, tooltip } = stateConfig[saveState.state];
return ( return (
<Badge <Badge

View File

@ -65,10 +65,11 @@ export function useTriliumEvents<T extends EventNames>(eventNames: T[], handler:
export function useSpacedUpdate(callback: () => void | Promise<void>, interval = 1000, stateCallback?: StateCallback) { export function useSpacedUpdate(callback: () => void | Promise<void>, interval = 1000, stateCallback?: StateCallback) {
const callbackRef = useRef(callback); const callbackRef = useRef(callback);
const stateCallbackRef = useRef(stateCallback);
const spacedUpdateRef = useRef<SpacedUpdate>(new SpacedUpdate( const spacedUpdateRef = useRef<SpacedUpdate>(new SpacedUpdate(
() => callbackRef.current(), () => callbackRef.current(),
interval, interval,
stateCallback (state) => stateCallbackRef.current?.(state)
)); ));
// Update callback ref when it changes // Update callback ref when it changes
@ -76,6 +77,11 @@ export function useSpacedUpdate(callback: () => void | Promise<void>, interval =
callbackRef.current = callback; callbackRef.current = callback;
}, [callback]); }, [callback]);
// Update state callback when it changes.
useEffect(() => {
stateCallbackRef.current = stateCallback;
}, [ stateCallback ]);
// Update interval if it changes // Update interval if it changes
useEffect(() => { useEffect(() => {
spacedUpdateRef.current?.setUpdateInterval(interval); spacedUpdateRef.current?.setUpdateInterval(interval);