import { useEffect, useRef } from "react"; import type { Organization } from "fhir/r4"; import { useAuthServiceContext } from "../services/AuthService"; import { useOrganizationServiceContext } from "../services/OrganizationService"; // A save replaces the whole Organization, so saves run one at a time, each built from the last // confirmed version: a slow save can never land after, and overwrite, a newer one. export const useSerializedOrganizationSave = () => { const { currentOrganization, setWpOrganization } = useAuthServiceContext(); const { updateOrganization } = useOrganizationServiceContext(); const confirmed = useRef(currentOrganization); const queue = useRef>(Promise.resolve()); useEffect(() => { confirmed.current = currentOrganization; }, [currentOrganization]); return (build: (base: Organization) => Organization): Promise => { const run = queue.current.then(async () => { const base = confirmed.current; if (!base) throw new Error("The organization is not loaded."); const saved = await updateOrganization(build(base)); confirmed.current = saved; setWpOrganization(saved); return saved; }); queue.current = run.catch(() => undefined); return run; }; };