Files
creator-hub/web/src/components/PageActions.tsx
T

32 lines
1.1 KiB
TypeScript

import { createContext, useContext, useEffect } from 'react';
import type { ReactNode } from 'react';
// 页头槽:页面挂载时把自己的内容注册到布局 PageContainer 的 content 行——
// info 在左(实体标识/关键状态),actions 在右(操作按钮,右侧对齐),卸载时自动清除。
// Layout 提供 Provider,页面只消费 usePageInfo / usePageActions。
type SetSlot = (node: ReactNode) => void;
const PageHeaderSlotsContext = createContext<{ setInfo: SetSlot; setActions: SetSlot }>({
setInfo: () => {},
setActions: () => {},
});
function useSlot(setSlot: SetSlot, node: ReactNode, deps: unknown[]) {
useEffect(() => {
setSlot(node);
return () => setSlot(null);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, deps);
}
export function usePageInfo(node: ReactNode, deps: unknown[] = []) {
const { setInfo } = useContext(PageHeaderSlotsContext);
useSlot(setInfo, node, deps);
}
export function usePageActions(node: ReactNode, deps: unknown[] = []) {
const { setActions } = useContext(PageHeaderSlotsContext);
useSlot(setActions, node, deps);
}
export { PageHeaderSlotsContext };