import { QueryObserverIdleResult, QueryObserverLoadingErrorResult, QueryObserverLoadingResult, QueryObserverRefetchErrorResult, QueryObserverSuccessResult, UseQueryResult, } from "react-query"; import Loader from "@components/Loader"; import { Alert } from "@components/ui/Alert"; type ErrorLike = { message: string; }; interface QueryCellOptions { query: UseQueryResult; success: (query: QueryObserverSuccessResult) => JSX.Element; error?: ( query: QueryObserverLoadingErrorResult | QueryObserverRefetchErrorResult ) => JSX.Element; loading?: (query: QueryObserverLoadingResult) => JSX.Element; idle?: (query: QueryObserverIdleResult) => JSX.Element; /** * If there's no data (`null`, `undefined`, or `[]`), render this component */ empty?: (query: QueryObserverSuccessResult) => JSX.Element; } export function QueryCell(opts: QueryCellOptions) { const { query } = opts; if (query.status === "success") { if (opts.empty && (query.data == null || (Array.isArray(query.data) && query.data.length === 0))) { return opts.empty(query); } return opts.success(query); } if (query.status === "error") { return ( opts.error?.(query) ?? ( ) ); } if (query.status === "loading") { return opts.loading?.(query) ?? ; } if (query.status === "idle") { return null; } // impossible state return null; }