provinans / frontend /src /ChecklistFieldsProvider.tsx
reversely's picture
Upload folder using huggingface_hub
c9a1ce7 verified
Raw
History Blame Contribute Delete
1.33 kB
import { useEffect, useState } from "react";
import type { ReactNode } from "react";
import { fetchFields } from "./api";
import { ChecklistFieldsContext, EMPTY_CHECKLIST_FIELDS } from "./checklistFields";
import type { ChecklistFields } from "./checklistFields";
// Fetched once at app mount and held in context: the list is small, static for
// the life of the backend process, and every screen needs it (issue #37).
export function ChecklistFieldsProvider({ children }: { children: ReactNode }) {
const [state, setState] = useState<ChecklistFields>(EMPTY_CHECKLIST_FIELDS);
useEffect(() => {
let cancelled = false;
fetchFields()
.then((fields) => {
if (cancelled) return;
setState({
fields,
names: fields.map((f) => f.name),
labels: Object.fromEntries(fields.map((f) => [f.name, f.label])),
loading: false,
error: null,
});
})
.catch((err) => {
if (cancelled) return;
setState({
...EMPTY_CHECKLIST_FIELDS,
loading: false,
error: err instanceof Error ? err.message : String(err),
});
});
return () => {
cancelled = true;
};
}, []);
return (
<ChecklistFieldsContext.Provider value={state}>{children}</ChecklistFieldsContext.Provider>
);
}