import { Splash } from '../splash'; import type { ReactNode } from 'react'; import { Button } from '../button'; import { useT } from '../../use-t'; interface AsyncRendererProps { loading: boolean; loadingMessage?: string; error: Error | undefined | null; errorMessage?: string; data: T | undefined; noDataMessage?: string; children?: ReactNode | null; render?: (data: T) => ReactNode; noDataCondition?(data?: T): boolean; reload?: () => void; } export function AsyncRenderer({ loading, loadingMessage, error, errorMessage, data, noDataMessage, noDataCondition, children, render, reload, }: AsyncRendererProps) { const t = useT(); if (error) { if (!data || (Array.isArray(data) && !data.length)) { return (
{errorMessage ? errorMessage : t('Something went wrong: {{errorMessage}}', { errorMessage: error.message, })} {reload && error.message === 'Timeout exceeded' && ( )}
); } } if (loading) { return {loadingMessage ? loadingMessage : t('Loading...')}; } if (noDataCondition ? noDataCondition(data) : !data) { return {noDataMessage ? noDataMessage : t('No data')}; } // eslint-disable-next-line react/jsx-no-useless-fragment return <>{render ? render(data as T) : children}; } export function AsyncRendererInline({ loading, loadingMessage, error, errorMessage, data, noDataMessage, noDataCondition, children, render, reload, }: AsyncRendererProps) { const t = useT(); const wrapperClasses = 'text-sm'; if (error) { if (!data) { return (

{errorMessage ? errorMessage : t('Something went wrong: {{errorMessage}}', { errorMessage: error.message, })}

{reload && error.message === 'Timeout exceeded' && ( )}
); } } if (loading) { return (

{loadingMessage ? loadingMessage : t('Loading...')}

); } if (noDataCondition ? noDataCondition(data) : !data) { return (

{noDataMessage ? noDataMessage : t('No data')}

); } // eslint-disable-next-line react/jsx-no-useless-fragment return <>{render ? render(data as T) : children}; }