shoc-frontend-new/src/app/v/_components/vendor-portal-provider.tsx
Alexandre Brandizzi c68d47af7b
Some checks failed
CI / ci (push) Has been cancelled
Deploy / deploy (push) Has been cancelled
chore: upgrade frontend dependencies (#24)
* chore: upgrade frontend application dependencies

* chore: upgrade frontend infrastructure dependencies

* fix: align lockfiles with CI npm

* fix: preserve ky error semantics

* fix: sanitize timeout error message
2026-07-14 21:35:59 -03:00

53 lines
1.6 KiB
TypeScript

import { useEffect, useMemo, useState, type ReactNode } from "react";
import { useParams } from "react-router";
import { vendorPortalApi } from "@/domain/vendor-portal/api/vendor-portal-api";
import type { VendorPortalSession } from "@/domain/vendor-portal/types/vendor-portal";
import {
VendorPortalContext,
type VendorPortalContextValue,
type VendorPortalStatus,
} from "@/app/v/_components/vendor-portal-context";
function VendorPortalSessionLoader({ token, children }: { token: string; children: ReactNode }) {
const [vendor, setVendor] = useState<VendorPortalSession | null>(null);
const [status, setStatus] = useState<VendorPortalStatus>("loading");
const [error, setError] = useState<Error | null>(null);
useEffect(() => {
let cancelled = false;
vendorPortalApi
.session(token)
.then((data) => {
if (cancelled) return;
setVendor(data);
setStatus("ready");
})
.catch((err: Error) => {
if (cancelled) return;
setError(err);
setStatus("error");
});
return () => {
cancelled = true;
};
}, [token]);
const value = useMemo<VendorPortalContextValue>(
() => ({ token, vendor, status, error }),
[token, vendor, status, error],
);
return <VendorPortalContext.Provider value={value}>{children}</VendorPortalContext.Provider>;
}
export function VendorPortalProvider({ children }: { children: ReactNode }) {
const { token = "" } = useParams();
return (
<VendorPortalSessionLoader key={token} token={token}>
{children}
</VendorPortalSessionLoader>
);
}