This commit is contained in:
2026-02-23 09:02:34 +00:00
parent 7298ee72aa
commit c3c905907b
9 changed files with 263 additions and 13 deletions
@@ -1,3 +1,4 @@
export * from './useFilesAPI';
export * from './useFileViewerPanels';
export * from './usePiChat';
export * from './useDock';
@@ -0,0 +1,54 @@
import { useCallback, useMemo } from 'react';
import { useQuery, useQueryClient } from '@tanstack/react-query';
import { useClient } from 'hooks/useClient';
import { useAuth } from 'hooks/useAuth';
const QUERY_KEY = ['DOCK'];
type DockItemLike = {
to: string;
role?: string;
};
export function useDock<T extends DockItemLike>(allDockItems: T[], defaultPaths?: string[]) {
const client = useClient();
const { user, isAuthenticated } = useAuth();
const queryClient = useQueryClient();
const { data: dockPaths = null } = useQuery<string[] | null>({
queryKey: QUERY_KEY,
enabled: isAuthenticated,
queryFn: () => client.get<string[] | null>('/dock'),
staleTime: Infinity,
});
const fallbackPaths = useMemo(() => defaultPaths ?? allDockItems.map((i) => i.to), [defaultPaths, allDockItems]);
const activePaths = dockPaths ?? fallbackPaths;
const items = useMemo(() => {
const byPath = new Map(allDockItems.map((item) => [item.to, item]));
return activePaths
.map((path) => byPath.get(path))
.filter((item): item is T => !!item && (!item.role || item.role === user?.role));
}, [activePaths, allDockItems, user?.role]);
const allItems = useMemo(
() => allDockItems.filter((item) => !item.role || item.role === user?.role),
[allDockItems, user?.role],
);
const setItems = useCallback(
(paths: string[]) => {
queryClient.setQueryData(QUERY_KEY, paths);
client.put('/dock', paths);
},
[client, queryClient],
);
const reset = useCallback(() => {
queryClient.setQueryData(QUERY_KEY, null);
client.put('/dock', null);
}, [client, queryClient]);
return { items, allItems, setItems, reset };
}