Skip to content

Commit 94cbb33

Browse files
authored
Merge pull request #70 from alexandredev3/fix/typings
fix: useModal show handle no longer making every prop optional and add NiceModa.show component props generic
2 parents 5b84479 + 602677c commit 94cbb33

File tree

1 file changed

+16
-6
lines changed

1 file changed

+16
-6
lines changed

src/index.tsx

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -209,11 +209,12 @@ const getModalId = (modal: string | React.FC<any>): string => {
209209

210210
/** omit id and partial all required props */
211211
type NiceModalArgs<T> = T extends keyof JSX.IntrinsicElements | React.JSXElementConstructor<any>
212-
? Partial<Omit<React.ComponentProps<T>, 'id'>>
212+
? Omit<React.ComponentProps<T>, 'id'>
213213
: Record<string, unknown>;
214214

215215
export function show<T extends any, C extends React.FC>(modal: C, args?: Omit<React.ComponentProps<C>, 'id'>): Promise<T>;
216216
export function show<T extends any>(modal: string, args?: Record<string, unknown>): Promise<T>;
217+
export function show<T extends any, P extends any>(modal: string, args: P): Promise<T>;
217218
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
218219
export function show(modal: React.FC<any> | string, args?: NiceModalArgs<React.FC<any>> | Record<string, unknown>) {
219220
const modalId = getModalId(modal);
@@ -275,11 +276,20 @@ const setFlags = (modalId: string, flags: Record<string, unknown>): void => {
275276
dispatch(setModalFlags(modalId, flags));
276277
};
277278
export function useModal(): NiceModalHandler;
278-
export function useModal<T extends string>(modal: T, args?: Record<string, unknown>): NiceModalHandler;
279-
export function useModal<T extends React.FC<any>>(
279+
export function useModal(modal: string, args?: Record<string, unknown>): NiceModalHandler;
280+
export function useModal<
281+
T extends React.FC<any>,
282+
ComponentProps extends NiceModalArgs<T>,
283+
PreparedProps extends Partial<ComponentProps> = {},
284+
RemainingProps = Omit<ComponentProps, keyof PreparedProps> & Partial<ComponentProps>
285+
>(
280286
modal: T,
281-
args?: NiceModalArgs<T>,
282-
): NiceModalHandler<NiceModalArgs<T>>;
287+
args?: PreparedProps
288+
): Omit<NiceModalHandler, 'show'> & {
289+
show: { [K in keyof RemainingProps]: RemainingProps[K] extends Exclude<RemainingProps[keyof RemainingProps], undefined> ? K : never }[keyof RemainingProps] extends undefined
290+
? (args?: RemainingProps) => Promise<unknown>
291+
: (args: RemainingProps) => Promise<unknown>
292+
};
283293
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
284294
export function useModal(modal?: any, args?: any): any {
285295
const modals = useContext(NiceModalContext);
@@ -389,7 +399,7 @@ export const create = <P extends {}>(Comp: React.ComponentType<P>): React.FC<P &
389399
};
390400

391401
// All registered modals will be rendered in modal placeholder
392-
export const register = <T extends React.FC<any>>(id: string, comp: T, props?: NiceModalArgs<T>): void => {
402+
export const register = <T extends React.FC<any>>(id: string, comp: T, props?: Partial<NiceModalArgs<T>>): void => {
393403
if (!MODAL_REGISTRY[id]) {
394404
MODAL_REGISTRY[id] = { comp, props };
395405
} else {

0 commit comments

Comments
 (0)