Files
Hydro/packages/ui-next/src/context/page-data.tsx
T

55 lines
1.5 KiB
TypeScript

/* eslint-disable react-refresh/only-export-components */
import { createContext, type ReactNode, useContext, useMemo, useState } from 'react';
export interface PageData {
name: string;
args: {
UserContext: Record<string, any>;
UiContext: Record<string, any>;
[key: string]: any;
};
url: string;
}
interface PageDataContextValue {
data: PageData;
setData: React.Dispatch<React.SetStateAction<PageData>>;
}
const PageDataContext = createContext<PageDataContextValue | null>(null);
interface PageDataProviderProps {
initial: PageData;
children: ReactNode;
}
export function PageDataProvider({ initial, children }: PageDataProviderProps) {
const [data, setData] = useState<PageData>(initial);
const value = useMemo(() => ({ data, setData }), [data]);
return <PageDataContext.Provider value={value}>{children}</PageDataContext.Provider>;
}
function usePageDataContext(): PageDataContextValue {
const ctx = useContext(PageDataContext);
if (!ctx) throw new Error('usePageData must be used within PageDataProvider');
return ctx;
}
export function usePageData(): PageData {
return usePageDataContext().data;
}
export function useSetPageData(): React.Dispatch<React.SetStateAction<PageData>> {
return usePageDataContext().setData;
}
export function useUiContext(): PageData['args']['UiContext'] {
return usePageDataContext().data.args.UiContext;
}
export function useUserContext(): PageData['args']['UserContext'] {
return usePageDataContext().data.args.UserContext;
}