From b9f5a0a82b60412d8a1baf7b23c2e0cd5c59ab33 Mon Sep 17 00:00:00 2001 From: alex-arc Date: Sat, 11 Jul 2026 12:09:05 +0200 Subject: [PATCH] refactor: useSuspenseQuery for rundown list --- .../common/hooks-query/useProjectRundowns.ts | 15 +++--- .../panel/manage-panel/ManageRundowns.tsx | 16 ++++++- .../src/features/overview/OverviewWrapper.tsx | 46 +++++++++++++------ 3 files changed, 54 insertions(+), 23 deletions(-) diff --git a/apps/client/src/common/hooks-query/useProjectRundowns.ts b/apps/client/src/common/hooks-query/useProjectRundowns.ts index 45d83f42f..67a92da6b 100644 --- a/apps/client/src/common/hooks-query/useProjectRundowns.ts +++ b/apps/client/src/common/hooks-query/useProjectRundowns.ts @@ -1,7 +1,7 @@ -import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { useMutation, useSuspenseQuery } from '@tanstack/react-query'; import { ProjectRundownsList } from 'ontime-types'; +import { MILLIS_PER_HOUR } from 'ontime-utils'; -import { queryRefetchIntervalSlow } from '../../ontimeConfig'; import { PROJECT_RUNDOWNS } from '../api/constants'; import { createRundown, @@ -11,24 +11,21 @@ import { loadRundown, renameRundown, } from '../api/rundown'; +import { ontimeQueryClient } from '../queryClient'; -//TODO: make suspends so we don't have to deal with no value all over /** * Project rundowns */ export function useProjectRundowns() { - const { data, status, isError, refetch, isFetching } = useQuery({ + const { data, status, isError, refetch, isFetching } = useSuspenseQuery({ queryKey: PROJECT_RUNDOWNS, queryFn: ({ signal }) => fetchProjectRundownList({ signal }), - placeholderData: (previousData, _previousQuery) => previousData, - refetchInterval: queryRefetchIntervalSlow, + staleTime: MILLIS_PER_HOUR, }); - return { data: data ?? { loaded: '', rundowns: [] }, status, isError, refetch, isFetching }; + return { data, status, isError, refetch, isFetching }; } export function useMutateProjectRundowns() { - const ontimeQueryClient = useQueryClient(); - const { mutateAsync: create } = useMutation({ mutationFn: createRundown, onMutate: () => { diff --git a/apps/client/src/features/app-settings/panel/manage-panel/ManageRundowns.tsx b/apps/client/src/features/app-settings/panel/manage-panel/ManageRundowns.tsx index 0bc3e6c9b..e1cea93c6 100644 --- a/apps/client/src/features/app-settings/panel/manage-panel/ManageRundowns.tsx +++ b/apps/client/src/features/app-settings/panel/manage-panel/ManageRundowns.tsx @@ -1,5 +1,5 @@ import { useDisclosure } from '@mantine/hooks'; -import { useState } from 'react'; +import { Suspense, useState } from 'react'; import { IoAdd, IoDocumentOutline, @@ -28,6 +28,20 @@ import { ManageRundownForm } from './ManageRundownForm'; import style from './ManagePanel.module.scss'; export default function ManageRundowns() { + return ( + + + + } + > + + + ); +} + +function ManageRundownsSuspends() { const { data } = useProjectRundowns(); const { duplicate, remove, load, rename } = useMutateProjectRundowns(); const [isOpenDelete, deleteHandlers] = useDisclosure(); diff --git a/apps/client/src/features/overview/OverviewWrapper.tsx b/apps/client/src/features/overview/OverviewWrapper.tsx index b0afa1d4c..a49825a5e 100644 --- a/apps/client/src/features/overview/OverviewWrapper.tsx +++ b/apps/client/src/features/overview/OverviewWrapper.tsx @@ -1,9 +1,10 @@ import { ErrorBoundary } from '@sentry/react'; -import { PropsWithChildren, ReactNode } from 'react'; +import { PropsWithChildren, ReactNode, Suspense } from 'react'; import ScrollArea from '../../common/components/scroll-area/ScrollArea'; import { useIsOnline } from '../../common/hooks/useSocket'; import { cx } from '../../common/utils/styleUtils'; +import Loader from '../../views/common/loader/Loader'; import style from './Overview.module.scss'; @@ -15,18 +16,37 @@ export function OverviewWrapper({ navElements, children }: PropsWithChildren - -
{navElements}
- - {children} - -
+ }> +
+ +
{navElements}
+ + {children} + +
+
+
+ ); +} + +function OverviewFallback({ navElements }: OverviewWrapperProps) { + return ( +
+
{navElements}
+ + {/* TODO: this could be alined in a nicer way */} + +
); }