-
Notifications
You must be signed in to change notification settings - Fork 40
/
Copy pathuse-overlay.ts
29 lines (25 loc) · 1.01 KB
/
use-overlay.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import { useEffect, useState } from 'react';
import {
type OverlayAsyncControllerComponent,
type OverlayControllerComponent,
} from '../context/provider/content-overlay-controller';
import { type OverlayItemContext } from '../context/store';
import { overlay } from '../utils';
import { randomId } from '../utils/random-id';
export interface UseOverlayProps<C extends OverlayItemContext> {
context?: C;
overlayId?: string;
}
export function useOverlay<C extends OverlayItemContext>({ context, overlayId }: UseOverlayProps<C>) {
const [id] = useState(() => overlayId ?? randomId());
useEffect(() => {
overlay.updateContext(id, context ?? ({} as C));
}, [context, id]);
return {
open: (controller: OverlayControllerComponent<C>) => overlay.open(controller, { overlayId: id, context }),
openAsync: <T>(controller: OverlayAsyncControllerComponent<T, C>) =>
overlay.openAsync(controller, { overlayId: id, context }),
close: () => overlay.close(id),
unmount: () => overlay.unmount(id),
};
}