mirror of
https://github.com/supermemoryai/supermemory.git
synced 2026-08-19 05:24:00 +00:00
Nova mobile pass - viewport: viewportFit cover for iOS safe-area-inset - safe-area utilities (pb-safe, pt-safe, bottom-safe-5, scroll-fade-x) in globals.css - chat FAB pinned above iPhone home indicator; chat sidebar widths responsive across sm/md/lg with min() clamps - chat input CoT panel max-h capped via min(60dvh, 420px) - header tab strip swapped from visible scrollbar to scroll-fade-x mask + snap-x - nova empty state uses svh on mobile, dvh from sm up Add-memory modal rebuilt for mobile - mobile shell switched from fullscreen Dialog to vaul Drawer at 85svh with swipe-down dismissal and scaled background - in-modal header removed; tabs moved to the bottom of the sheet for thumb reach - four tab compactLabels: Note, Links, Files, Connections - desktop tabs now render only when !isMobile (no DOM duplication) - note/link content state lifted to parent so switching tabs preserves typed input - NoteContent snapshots initialContent via lazy useState so the editor isn't reset on every keystroke - shared Drawer base uses rounded-t-xl - removed legacy pt-4 on tab content for mobile Connections — replace expiresAt with sync-run health - new useConnectionHealth hook reads the latest sync run and matches auth-failure patterns; backend errorKind field still needed (TODO) - regex tightened so 401/403 require co-occurring auth/token/grant context; refresh_token requires expired/revoked/invalid/missing qualifier - badge label changed Disconnected -> Needs reauth - Reconnect button replaces the sync action when needsReauth, kicks off the same OAuth flow - per-row reconnect tracking via mutation.variables instead of a single shared id (no race when multiple rows clicked) - fallback toast when authLink is missing so the spinner can't get stuck - sync history panel timeline capped at max-h-260 with internal scroll - useSyncRuns no longer refetches on mount; cache (30s) actually applies, cutting N requests per modal open
45 lines
1.1 KiB
TypeScript
45 lines
1.1 KiB
TypeScript
"use client"
|
|
|
|
import { $fetch } from "@lib/api"
|
|
import { useQuery } from "@tanstack/react-query"
|
|
|
|
/**
|
|
* Mirrors the Zod schema at `apiSchema["@get/connections/:connectionId/sync-runs"].output`.
|
|
* Keep in sync with `packages/lib/api.ts` if fields are added/removed.
|
|
*/
|
|
export type SyncRun = {
|
|
id: string
|
|
connectionId: string
|
|
status: "running" | "completed" | "failed"
|
|
triggerType: "event" | "cron" | "manual"
|
|
startedAt: string
|
|
completedAt: string | null
|
|
itemsProcessed: number
|
|
itemsFailed: number
|
|
error: string | null
|
|
}
|
|
|
|
export function useSyncRuns(connectionId: string) {
|
|
return useQuery<SyncRun[]>({
|
|
queryKey: ["sync-runs", connectionId],
|
|
queryFn: async () => {
|
|
const response = await $fetch(
|
|
"@get/connections/:connectionId/sync-runs",
|
|
{ params: { connectionId } },
|
|
)
|
|
if (response.error) {
|
|
throw new Error("Failed to fetch sync runs")
|
|
}
|
|
return response.data as SyncRun[]
|
|
},
|
|
enabled: !!connectionId,
|
|
staleTime: 30 * 1000,
|
|
refetchInterval: (query) => {
|
|
const runs = query.state.data as SyncRun[] | undefined
|
|
if (runs?.some((r) => r.status === "running")) {
|
|
return 5000
|
|
}
|
|
return false
|
|
},
|
|
})
|
|
}
|