b9eb6ae058
* refactor(web): remove legacy settings migration * fix(web): hydrate portable settings from boot state * fix(web): preserve sidebar sync contracts * fix(web): retain portable settings filters * fix(web): retry sidebar settings writes * fix(web): retain sidebar boot settings * fix(websocket): avoid shutdown teardown leaks * fix(boot): normalize sidebar task preferences * fix(settings): preserve saved views during hydration * fix(jira): avoid duplicate saved-view syncs * fix(jira): preserve saved views on fetch failure * fix(jira): retry saved-view hydration failures * refactor(jira): simplify hydration request cleanup * fix(websocket): close late clients after hub shutdown
27 lines
1.0 KiB
TypeScript
27 lines
1.0 KiB
TypeScript
"use client";
|
|
|
|
import { useEffect } from "react";
|
|
import { useAppStore } from "@/components/state-provider";
|
|
import { useToast } from "@/components/toast-provider";
|
|
|
|
/** Surfaces sidebar preference sync errors. Mount once inside the app's ToastProvider. */
|
|
export function useSidebarViewsSync() {
|
|
const syncError = useAppStore((s) => s.sidebarViews.syncError);
|
|
const taskPrefsSyncError = useAppStore((s) => s.sidebarTaskPrefs.syncError);
|
|
const clearError = useAppStore((s) => s.clearSidebarSyncError);
|
|
const clearTaskPrefsError = useAppStore((s) => s.clearSidebarTaskPrefsSyncError);
|
|
const { toast } = useToast();
|
|
|
|
useEffect(() => {
|
|
if (!syncError) return;
|
|
toast({ title: "Sidebar views", description: syncError, variant: "error" });
|
|
clearError();
|
|
}, [syncError, toast, clearError]);
|
|
|
|
useEffect(() => {
|
|
if (!taskPrefsSyncError) return;
|
|
toast({ title: "Sidebar task preferences", description: taskPrefsSyncError, variant: "error" });
|
|
clearTaskPrefsError();
|
|
}, [taskPrefsSyncError, toast, clearTaskPrefsError]);
|
|
}
|