46 lines
1.0 KiB
TypeScript
46 lines
1.0 KiB
TypeScript
import { type InvestmentResourceMeta, readRetry } from "@/shared/api";
|
|
|
|
type SectionState = {
|
|
error: boolean;
|
|
hasData: boolean;
|
|
loading: boolean;
|
|
partial?: boolean;
|
|
readRetry?: ReturnType<typeof readRetry>;
|
|
};
|
|
|
|
function hasSectionData(data: unknown) {
|
|
return data !== undefined;
|
|
}
|
|
|
|
function section(query: {
|
|
data: unknown;
|
|
error?: unknown;
|
|
isError: boolean;
|
|
isFetching?: boolean;
|
|
meta?: InvestmentResourceMeta;
|
|
refetch?: () => Promise<unknown>;
|
|
}): SectionState {
|
|
const isError = query.isError || query.meta?.lastAttempt.state === "failed";
|
|
const hasData = hasSectionData(query.data);
|
|
|
|
return {
|
|
error: isError,
|
|
hasData,
|
|
loading: !hasData && !isError,
|
|
partial: query.meta?.completeness === "incomplete",
|
|
// Each section retries only its own GET, so sections recover independently.
|
|
readRetry: query.refetch
|
|
? readRetry([
|
|
{
|
|
error: query.error,
|
|
isError: query.isError,
|
|
isFetching: query.isFetching ?? false,
|
|
refetch: query.refetch,
|
|
},
|
|
])
|
|
: undefined,
|
|
};
|
|
}
|
|
|
|
export { section, type SectionState };
|