import React from "react"; import type { z, ZodType } from "zod"; export type GetAppData = (key: string) => unknown; export type SetAppData = (key: string, value: unknown) => void; type LockedIcon = JSX.Element | false | undefined; type Disabled = boolean | undefined; type AppContext = { getAppData: GetAppData; setAppData: SetAppData; LockedIcon?: LockedIcon; disabled?: Disabled; }; // eslint-disable-next-line @typescript-eslint/no-empty-function const EventTypeAppContext = React.createContext({ getAppData: () => ({}), setAppData: () => ({}), }); type SetAppDataGeneric = < TKey extends keyof z.infer, TValue extends z.infer[TKey] >( key: TKey, value: TValue ) => void; type GetAppDataGeneric = >( key: TKey ) => z.infer[TKey]; export const useAppContextWithSchema = () => { type GetAppData = GetAppDataGeneric; type SetAppData = SetAppDataGeneric; // TODO: Not able to do it without type assertion here const context = React.useContext(EventTypeAppContext) as { getAppData: GetAppData; setAppData: SetAppData; LockedIcon: LockedIcon; disabled: Disabled; }; return context; }; export default EventTypeAppContext;