mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-17 09:36:08 +08:00
55 lines
1.5 KiB
TypeScript
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;
|
|
}
|