AcadeDoc/apps/client/src/features/acadenice/database-view/hooks/use-views.ts
Corentin 71c2abad8a feat(client): add database-view Tiptap extension for R3.1.c
- Tiptap Node extension (database-view) with attrs tableId/viewId/viewType/bridgeUrl
- NodeViewWrapper dispatches on viewType: grid/table -> TableRenderer, other -> PlaceholderRenderer
- TableRenderer (HTML table, TanStack Table v8 migration-ready - dep not yet installed)
- InsertDatabaseModal (Mantine, 2-step: table -> view selection)
- useDatabaseRealtimeUpdates SSE hook (EventSource + exponential backoff + React Query invalidation)
- bridge-client.ts (axios wrapper, per-origin singleton, cookie Bearer passthrough)
- Slash command /database registered in menu-items CommandGroups
- DatabaseViewExtension wired in mainExtensions array
- i18n: 22 keys added in en-US and fr-FR
- 41 Vitest tests across 5 suites (extension schema, component dispatch, renderer states, modal steps, SSE hook)

Upstream patches: extensions.ts (+2 lines), menu-items.ts (+4 lines), 2 translation files

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 00:07:33 +02:00

30 lines
1,011 B
TypeScript

import { useQuery } from "@tanstack/react-query";
import { getBridgeClient, resolveBridgeUrl } from "../services/bridge-client";
import type { BridgeView } from "../types/database-view.types";
export const viewsQueryKey = (tableId: string, bridgeUrl: string) =>
["bridge-views", tableId, bridgeUrl] as const;
/**
* Fetches the list of views for a given table.
* Used in the insert-database-modal step 2.
*/
export function useViews(
tableId: string | null | undefined,
bridgeUrl?: string | null,
) {
const url = resolveBridgeUrl(bridgeUrl);
return useQuery<BridgeView[]>({
queryKey: viewsQueryKey(tableId ?? "", url),
enabled: Boolean(tableId),
queryFn: async () => {
const client = getBridgeClient(url);
const res = await (client.get(
`/api/v1/views/table/${tableId}`,
) as unknown as Promise<{ data: BridgeView[] } | BridgeView[]>);
return Array.isArray(res) ? res : (res as { data: BridgeView[] }).data ?? [];
},
staleTime: 30_000,
});
}