@whop/react-native 0.1.14 → 0.1.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/web.mjs +1 -16
- package/dist/lib/web.mjs.map +1 -1
- package/package.json +1 -1
package/dist/lib/web.mjs
CHANGED
|
@@ -187,25 +187,10 @@ function makeModalComponent(R) {
|
|
|
187
187
|
{ className: "whop-rn-modal-panel-inner" },
|
|
188
188
|
[route ? props.render(route) : null]
|
|
189
189
|
);
|
|
190
|
-
const closeButton = R.createElement(
|
|
191
|
-
"button",
|
|
192
|
-
{
|
|
193
|
-
type: "button",
|
|
194
|
-
className: "whop-rn-modal-close",
|
|
195
|
-
"aria-label": "Close modal",
|
|
196
|
-
onClick: dismiss
|
|
197
|
-
},
|
|
198
|
-
"\xD7"
|
|
199
|
-
);
|
|
200
|
-
const header = R.createElement(
|
|
201
|
-
"div",
|
|
202
|
-
{ className: "whop-rn-modal-header" },
|
|
203
|
-
[closeButton]
|
|
204
|
-
);
|
|
205
190
|
const panel = R.createElement(
|
|
206
191
|
"div",
|
|
207
192
|
{ className: "whop-rn-modal-panel", role: "document" },
|
|
208
|
-
[
|
|
193
|
+
[panelInner]
|
|
209
194
|
);
|
|
210
195
|
const onOverlayClick = (e) => {
|
|
211
196
|
if (e.target === e.currentTarget) dismiss();
|
package/dist/lib/web.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/web-router.ts"],"sourcesContent":["import type React from \"react\";\nimport type { FC } from \"react\";\nimport type { TWhopCoreNavigation } from \"./native-whop-core-stub\";\nimport type {\n\tDashboardViewProps,\n\tDiscoverViewProps,\n\tExperienceViewProps,\n} from \"./props\";\n\ntype AppReactComponent = {\n\tExperienceView: FC<ExperienceViewProps>;\n\tDiscoverView: FC<DiscoverViewProps>;\n\tDashboardView: FC<DashboardViewProps>;\n};\n\nfunction getNavigation(): TWhopCoreNavigation {\n\t// biome-ignore lint/suspicious/noExplicitAny: <explanation>\n\tconst anyWindow = window as any;\n\tif (typeof anyWindow !== \"undefined\" && anyWindow.whopCoreNavigation) {\n\t\treturn anyWindow.whopCoreNavigation;\n\t}\n\n\tthrow new Error(\n\t\t\"window.whopCoreNavigation is not defined. this method is only available in a web build\",\n\t);\n}\n\nfunction parseQueryParams() {\n\tconst params = new URLSearchParams(window.location.search);\n\tconst experienceId = params.get(\"experienceId\");\n\tconst companyId = params.get(\"companyId\");\n\tconst currentUserId = params.get(\"currentUserId\");\n\tconst restPath = params.get(\"restPath\");\n\tconst queryStr = params.get(\"query\");\n\n\tlet path: string[] = [];\n\tif (restPath) path = restPath.split(\"/\").filter(Boolean);\n\n\tconst appParams: Record<string, string> = {};\n\tif (queryStr) {\n\t\tconst obj = new URLSearchParams(queryStr);\n\t\tfor (const [key, value] of obj.entries()) {\n\t\t\tappParams[key] = value;\n\t\t}\n\t}\n\n\treturn {\n\t\texperienceId,\n\t\tcompanyId,\n\t\tcurrentUserId,\n\t\tpath,\n\t\tparams: appParams,\n\t};\n}\n\nfunction usePath(\n\tR: typeof React,\n\tinitialPath: string[],\n\tinitialParams: Record<string, string>,\n): { path: string[]; params: Record<string, string> } {\n\tconst navigation = getNavigation();\n\tconst path = R.useSyncExternalStore(\n\t\tnavigation.subscribeToPath,\n\t\tnavigation.getFullStack,\n\t);\n\tconst route = path.at(path.length - 1);\n\tconst actualPath = route ?? { path: initialPath, params: initialParams };\n\treturn actualPath;\n}\n\nfunction useSheet(R: typeof React) {\n\tconst navigation = getNavigation();\n\tconst sheet = R.useSyncExternalStore(\n\t\tnavigation.subscribeToSheet,\n\t\tnavigation.getCurrentSheet,\n\t);\n\treturn sheet;\n}\n\nexport function WhopNavigationWrapper<T extends keyof AppReactComponent>(\n\tR: typeof React,\n\tname: T,\n\tComponent: AppReactComponent[T],\n) {\n\tconst {\n\t\texperienceId,\n\t\tcompanyId,\n\t\tcurrentUserId,\n\t\tpath: initialPath,\n\t\tparams,\n\t} = parseQueryParams();\n\n\tconst ModalComponent = makeModalComponent(R);\n\n\tlet render: (route: {\n\t\tpath: string[];\n\t\tparams: Record<string, string>;\n\t}) => React.ReactNode;\n\n\tif (name === \"ExperienceView\") {\n\t\tif (!experienceId || !companyId) {\n\t\t\tthrow new Error(\"Missing required query params\");\n\t\t}\n\n\t\tconst C = Component as FC<ExperienceViewProps>;\n\n\t\trender = (route: {\n\t\t\tpath: string[];\n\t\t\tparams: Record<string, string>;\n\t\t}) => {\n\t\t\treturn R.createElement(C, {\n\t\t\t\texperienceId,\n\t\t\t\tcompanyId,\n\t\t\t\tcurrentUserId,\n\t\t\t\tpath: route.path,\n\t\t\t\tparams: route.params,\n\t\t\t});\n\t\t};\n\t}\n\n\tif (name === \"DashboardView\") {\n\t\tif (!companyId) {\n\t\t\tthrow new Error(\"Missing required query params\");\n\t\t}\n\n\t\tconst C = Component as FC<DashboardViewProps>;\n\n\t\trender = (route: {\n\t\t\tpath: string[];\n\t\t\tparams: Record<string, string>;\n\t\t}) => {\n\t\t\treturn R.createElement(C, {\n\t\t\t\tcompanyId,\n\t\t\t\tcurrentUserId,\n\t\t\t\tpath: route.path,\n\t\t\t\tparams: route.params,\n\t\t\t});\n\t\t};\n\t}\n\n\tif (name === \"DiscoverView\") {\n\t\tconst C = Component as FC<DiscoverViewProps>;\n\t\trender = (route: {\n\t\t\tpath: string[];\n\t\t\tparams: Record<string, string>;\n\t\t}) => {\n\t\t\treturn R.createElement(C, {\n\t\t\t\tcurrentUserId,\n\t\t\t\tpath: route.path,\n\t\t\t\tparams: route.params,\n\t\t\t});\n\t\t};\n\t}\n\n\treturn function AppWrapper() {\n\t\tconst path = usePath(R, initialPath, params);\n\t\tconst sheet = useSheet(R);\n\t\tconst sheetElement = R.createElement(ModalComponent, {\n\t\t\troute: sheet,\n\t\t\trender,\n\t\t});\n\t\treturn R.createElement(R.Fragment, null, [render(path), sheetElement]);\n\t};\n}\n\nfunction makeModalComponent(R: typeof React) {\n\tconst STYLE_ID = \"whop-rn-modal-styles\";\n\tconst ANIMATION_MS = 220;\n\n\tfunction ensureStylesInjected() {\n\t\tif (typeof document === \"undefined\") return;\n\t\tif (document.getElementById(STYLE_ID)) return;\n\t\tconst styleEl = document.createElement(\"style\");\n\t\tstyleEl.id = STYLE_ID;\n\t\tstyleEl.textContent = `\n\t\t\t.whop-rn-modal-overlay{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:rgba(0,0,0,0.45);opacity:0;pointer-events:none;transition:opacity ${ANIMATION_MS}ms ease;z-index:2147483647}\n\t\t\t.whop-rn-modal-overlay.open{opacity:1;pointer-events:auto}\n\t\t\t.whop-rn-modal-panel{background:var(--modal-bg,#fff);color:var(--modal-fg,#111);border-radius:12px;box-shadow:0 10px 30px rgba(0,0,0,0.2);max-width:min(calc(100vw - 32px),720px);width:100%;max-height:min(calc(100vh - 32px),85vh);overflow:auto;transform:translateY(8px) scale(0.98);opacity:0.98;transition:transform ${ANIMATION_MS + 20}ms ease,opacity ${ANIMATION_MS + 20}ms ease}\n\t\t\t.whop-rn-modal-overlay.open .whop-rn-modal-panel{transform:translateY(0) scale(1);opacity:1}\n\t\t\t.whop-rn-modal-header{display:flex;justify-content:flex-end}\n\t\t\t.whop-rn-modal-close{height:36px;width:36px;display:inline-flex;align-items:center;justify-content:center;border:none;border-radius:8px;background:rgba(0,0,0,0.04);color:inherit;cursor:pointer;transition:background ${ANIMATION_MS}ms ease}\n\t\t\t.whop-rn-modal-close:hover{background:rgba(0,0,0,0.08)}\n\t\t\t.whop-rn-modal-close:focus{outline:2px solid rgba(59,130,246,0.6);outline-offset:2px}\n\t\t\t.whop-rn-modal-panel-inner{padding:0}\n\t\t\t@media (prefers-color-scheme: dark){.whop-rn-modal-panel{--modal-bg:#111416;--modal-fg:#e6e7e8;box-shadow:0 10px 30px rgba(0,0,0,0.7)}}\n\t\t`;\n\t\tdocument.head.appendChild(styleEl);\n\t}\n\n\treturn function ModalComponent(props: {\n\t\troute:\n\t\t\t| {\n\t\t\t\t\tpath: string[];\n\t\t\t\t\tparams: Record<string, string>;\n\t\t\t }\n\t\t\t| undefined\n\t\t\t| null;\n\t\trender: (route: {\n\t\t\tpath: string[];\n\t\t\tparams: Record<string, string>;\n\t\t}) => React.ReactNode;\n\t}) {\n\t\t// Manage mount/unmount to allow exit animations\n\t\tconst isOpen = !!props.route;\n\t\tconst [shouldRender, setShouldRender] = R.useState<boolean>(isOpen);\n\t\tconst [isVisible, setIsVisible] = R.useState<boolean>(isOpen);\n\t\tconst closeTimerRef = R.useRef<number | null>(null);\n\t\tconst mostRecentRouteRef = R.useRef<{\n\t\t\tpath: string[];\n\t\t\tparams: Record<string, string>;\n\t\t} | null>(null);\n\n\t\tif (props.route) mostRecentRouteRef.current = props.route;\n\n\t\tR.useEffect(() => {\n\t\t\tensureStylesInjected();\n\t\t\treturn () => {\n\t\t\t\tif (closeTimerRef.current !== null) {\n\t\t\t\t\twindow.clearTimeout(closeTimerRef.current);\n\t\t\t\t}\n\t\t\t};\n\t\t}, []);\n\n\t\tR.useEffect(() => {\n\t\t\tif (isOpen) {\n\t\t\t\tsetShouldRender(true);\n\t\t\t\t// Ensure next frame so transitions apply\n\t\t\t\twindow.requestAnimationFrame(() => setIsVisible(true));\n\t\t\t\tif (closeTimerRef.current !== null) {\n\t\t\t\t\twindow.clearTimeout(closeTimerRef.current);\n\t\t\t\t\tcloseTimerRef.current = null;\n\t\t\t\t}\n\t\t\t} else if (shouldRender) {\n\t\t\t\tsetIsVisible(false);\n\t\t\t\tif (closeTimerRef.current !== null) {\n\t\t\t\t\twindow.clearTimeout(closeTimerRef.current);\n\t\t\t\t}\n\t\t\t\tcloseTimerRef.current = window.setTimeout(() => {\n\t\t\t\t\tsetShouldRender(false);\n\t\t\t\t\tcloseTimerRef.current = null;\n\t\t\t\t}, ANIMATION_MS);\n\t\t\t}\n\t\t}, [isOpen, shouldRender]);\n\n\t\tconst overlayClass = isVisible\n\t\t\t? \"whop-rn-modal-overlay open\"\n\t\t\t: \"whop-rn-modal-overlay\";\n\n\t\tconst dismiss = R.useCallback((): void => {\n\t\t\ttry {\n\t\t\t\tgetNavigation().dismissSheet();\n\t\t\t} catch {\n\t\t\t\t// no-op when navigation is not available\n\t\t\t}\n\t\t}, []);\n\n\t\tR.useEffect(() => {\n\t\t\tif (!isOpen) return;\n\t\t\tconst onKeyDown = (e: KeyboardEvent) => {\n\t\t\t\tif (e.key === \"Escape\") dismiss();\n\t\t\t};\n\t\t\tdocument.addEventListener(\"keydown\", onKeyDown);\n\t\t\treturn () => document.removeEventListener(\"keydown\", onKeyDown);\n\t\t}, [isOpen, dismiss]);\n\n\t\tif (!shouldRender) return null;\n\n\t\tconst route = mostRecentRouteRef.current;\n\n\t\tconst panelInner = R.createElement(\n\t\t\t\"div\",\n\t\t\t{ className: \"whop-rn-modal-panel-inner\" },\n\t\t\t[route ? props.render(route) : null],\n\t\t);\n\n\t\tconst closeButton = R.createElement(\n\t\t\t\"button\",\n\t\t\t{\n\t\t\t\ttype: \"button\",\n\t\t\t\tclassName: \"whop-rn-modal-close\",\n\t\t\t\t\"aria-label\": \"Close modal\",\n\t\t\t\tonClick: dismiss,\n\t\t\t},\n\t\t\t\"×\",\n\t\t);\n\n\t\tconst header = R.createElement(\n\t\t\t\"div\",\n\t\t\t{ className: \"whop-rn-modal-header\" },\n\t\t\t[closeButton],\n\t\t);\n\n\t\tconst panel = R.createElement(\n\t\t\t\"div\",\n\t\t\t{ className: \"whop-rn-modal-panel\", role: \"document\" },\n\t\t\t[header, panelInner],\n\t\t);\n\n\t\tconst onOverlayClick = (e: React.MouseEvent<HTMLDivElement>): void => {\n\t\t\tif (e.target === e.currentTarget) dismiss();\n\t\t};\n\n\t\treturn R.createElement(\n\t\t\t\"div\",\n\t\t\t{\n\t\t\t\tclassName: overlayClass,\n\t\t\t\trole: \"dialog\",\n\t\t\t\t\"aria-modal\": \"true\",\n\t\t\t\tonClick: onOverlayClick,\n\t\t\t},\n\t\t\t[panel],\n\t\t);\n\t};\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/lib/web-router.ts"],"sourcesContent":["import type React from \"react\";\nimport type { FC } from \"react\";\nimport type { TWhopCoreNavigation } from \"./native-whop-core-stub\";\nimport type {\n\tDashboardViewProps,\n\tDiscoverViewProps,\n\tExperienceViewProps,\n} from \"./props\";\n\ntype AppReactComponent = {\n\tExperienceView: FC<ExperienceViewProps>;\n\tDiscoverView: FC<DiscoverViewProps>;\n\tDashboardView: FC<DashboardViewProps>;\n};\n\nfunction getNavigation(): TWhopCoreNavigation {\n\t// biome-ignore lint/suspicious/noExplicitAny: <explanation>\n\tconst anyWindow = window as any;\n\tif (typeof anyWindow !== \"undefined\" && anyWindow.whopCoreNavigation) {\n\t\treturn anyWindow.whopCoreNavigation;\n\t}\n\n\tthrow new Error(\n\t\t\"window.whopCoreNavigation is not defined. this method is only available in a web build\",\n\t);\n}\n\nfunction parseQueryParams() {\n\tconst params = new URLSearchParams(window.location.search);\n\tconst experienceId = params.get(\"experienceId\");\n\tconst companyId = params.get(\"companyId\");\n\tconst currentUserId = params.get(\"currentUserId\");\n\tconst restPath = params.get(\"restPath\");\n\tconst queryStr = params.get(\"query\");\n\n\tlet path: string[] = [];\n\tif (restPath) path = restPath.split(\"/\").filter(Boolean);\n\n\tconst appParams: Record<string, string> = {};\n\tif (queryStr) {\n\t\tconst obj = new URLSearchParams(queryStr);\n\t\tfor (const [key, value] of obj.entries()) {\n\t\t\tappParams[key] = value;\n\t\t}\n\t}\n\n\treturn {\n\t\texperienceId,\n\t\tcompanyId,\n\t\tcurrentUserId,\n\t\tpath,\n\t\tparams: appParams,\n\t};\n}\n\nfunction usePath(\n\tR: typeof React,\n\tinitialPath: string[],\n\tinitialParams: Record<string, string>,\n): { path: string[]; params: Record<string, string> } {\n\tconst navigation = getNavigation();\n\tconst path = R.useSyncExternalStore(\n\t\tnavigation.subscribeToPath,\n\t\tnavigation.getFullStack,\n\t);\n\tconst route = path.at(path.length - 1);\n\tconst actualPath = route ?? { path: initialPath, params: initialParams };\n\treturn actualPath;\n}\n\nfunction useSheet(R: typeof React) {\n\tconst navigation = getNavigation();\n\tconst sheet = R.useSyncExternalStore(\n\t\tnavigation.subscribeToSheet,\n\t\tnavigation.getCurrentSheet,\n\t);\n\treturn sheet;\n}\n\nexport function WhopNavigationWrapper<T extends keyof AppReactComponent>(\n\tR: typeof React,\n\tname: T,\n\tComponent: AppReactComponent[T],\n) {\n\tconst {\n\t\texperienceId,\n\t\tcompanyId,\n\t\tcurrentUserId,\n\t\tpath: initialPath,\n\t\tparams,\n\t} = parseQueryParams();\n\n\tconst ModalComponent = makeModalComponent(R);\n\n\tlet render: (route: {\n\t\tpath: string[];\n\t\tparams: Record<string, string>;\n\t}) => React.ReactNode;\n\n\tif (name === \"ExperienceView\") {\n\t\tif (!experienceId || !companyId) {\n\t\t\tthrow new Error(\"Missing required query params\");\n\t\t}\n\n\t\tconst C = Component as FC<ExperienceViewProps>;\n\n\t\trender = (route: {\n\t\t\tpath: string[];\n\t\t\tparams: Record<string, string>;\n\t\t}) => {\n\t\t\treturn R.createElement(C, {\n\t\t\t\texperienceId,\n\t\t\t\tcompanyId,\n\t\t\t\tcurrentUserId,\n\t\t\t\tpath: route.path,\n\t\t\t\tparams: route.params,\n\t\t\t});\n\t\t};\n\t}\n\n\tif (name === \"DashboardView\") {\n\t\tif (!companyId) {\n\t\t\tthrow new Error(\"Missing required query params\");\n\t\t}\n\n\t\tconst C = Component as FC<DashboardViewProps>;\n\n\t\trender = (route: {\n\t\t\tpath: string[];\n\t\t\tparams: Record<string, string>;\n\t\t}) => {\n\t\t\treturn R.createElement(C, {\n\t\t\t\tcompanyId,\n\t\t\t\tcurrentUserId,\n\t\t\t\tpath: route.path,\n\t\t\t\tparams: route.params,\n\t\t\t});\n\t\t};\n\t}\n\n\tif (name === \"DiscoverView\") {\n\t\tconst C = Component as FC<DiscoverViewProps>;\n\t\trender = (route: {\n\t\t\tpath: string[];\n\t\t\tparams: Record<string, string>;\n\t\t}) => {\n\t\t\treturn R.createElement(C, {\n\t\t\t\tcurrentUserId,\n\t\t\t\tpath: route.path,\n\t\t\t\tparams: route.params,\n\t\t\t});\n\t\t};\n\t}\n\n\treturn function AppWrapper() {\n\t\tconst path = usePath(R, initialPath, params);\n\t\tconst sheet = useSheet(R);\n\t\tconst sheetElement = R.createElement(ModalComponent, {\n\t\t\troute: sheet,\n\t\t\trender,\n\t\t});\n\t\treturn R.createElement(R.Fragment, null, [render(path), sheetElement]);\n\t};\n}\n\nfunction makeModalComponent(R: typeof React) {\n\tconst STYLE_ID = \"whop-rn-modal-styles\";\n\tconst ANIMATION_MS = 220;\n\n\tfunction ensureStylesInjected() {\n\t\tif (typeof document === \"undefined\") return;\n\t\tif (document.getElementById(STYLE_ID)) return;\n\t\tconst styleEl = document.createElement(\"style\");\n\t\tstyleEl.id = STYLE_ID;\n\t\tstyleEl.textContent = `\n\t\t\t.whop-rn-modal-overlay{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:rgba(0,0,0,0.45);opacity:0;pointer-events:none;transition:opacity ${ANIMATION_MS}ms ease;z-index:2147483647}\n\t\t\t.whop-rn-modal-overlay.open{opacity:1;pointer-events:auto}\n\t\t\t.whop-rn-modal-panel{background:var(--modal-bg,#fff);color:var(--modal-fg,#111);border-radius:12px;box-shadow:0 10px 30px rgba(0,0,0,0.2);max-width:min(calc(100vw - 32px),720px);width:100%;max-height:min(calc(100vh - 32px),85vh);overflow:auto;transform:translateY(8px) scale(0.98);opacity:0.98;transition:transform ${ANIMATION_MS + 20}ms ease,opacity ${ANIMATION_MS + 20}ms ease}\n\t\t\t.whop-rn-modal-overlay.open .whop-rn-modal-panel{transform:translateY(0) scale(1);opacity:1}\n\t\t\t.whop-rn-modal-header{display:flex;justify-content:flex-end}\n\t\t\t.whop-rn-modal-close{height:36px;width:36px;display:inline-flex;align-items:center;justify-content:center;border:none;border-radius:8px;background:rgba(0,0,0,0.04);color:inherit;cursor:pointer;transition:background ${ANIMATION_MS}ms ease}\n\t\t\t.whop-rn-modal-close:hover{background:rgba(0,0,0,0.08)}\n\t\t\t.whop-rn-modal-close:focus{outline:2px solid rgba(59,130,246,0.6);outline-offset:2px}\n\t\t\t.whop-rn-modal-panel-inner{padding:0}\n\t\t\t@media (prefers-color-scheme: dark){.whop-rn-modal-panel{--modal-bg:#111416;--modal-fg:#e6e7e8;box-shadow:0 10px 30px rgba(0,0,0,0.7)}}\n\t\t`;\n\t\tdocument.head.appendChild(styleEl);\n\t}\n\n\treturn function ModalComponent(props: {\n\t\troute:\n\t\t\t| {\n\t\t\t\t\tpath: string[];\n\t\t\t\t\tparams: Record<string, string>;\n\t\t\t }\n\t\t\t| undefined\n\t\t\t| null;\n\t\trender: (route: {\n\t\t\tpath: string[];\n\t\t\tparams: Record<string, string>;\n\t\t}) => React.ReactNode;\n\t}) {\n\t\t// Manage mount/unmount to allow exit animations\n\t\tconst isOpen = !!props.route;\n\t\tconst [shouldRender, setShouldRender] = R.useState<boolean>(isOpen);\n\t\tconst [isVisible, setIsVisible] = R.useState<boolean>(isOpen);\n\t\tconst closeTimerRef = R.useRef<number | null>(null);\n\t\tconst mostRecentRouteRef = R.useRef<{\n\t\t\tpath: string[];\n\t\t\tparams: Record<string, string>;\n\t\t} | null>(null);\n\n\t\tif (props.route) mostRecentRouteRef.current = props.route;\n\n\t\tR.useEffect(() => {\n\t\t\tensureStylesInjected();\n\t\t\treturn () => {\n\t\t\t\tif (closeTimerRef.current !== null) {\n\t\t\t\t\twindow.clearTimeout(closeTimerRef.current);\n\t\t\t\t}\n\t\t\t};\n\t\t}, []);\n\n\t\tR.useEffect(() => {\n\t\t\tif (isOpen) {\n\t\t\t\tsetShouldRender(true);\n\t\t\t\t// Ensure next frame so transitions apply\n\t\t\t\twindow.requestAnimationFrame(() => setIsVisible(true));\n\t\t\t\tif (closeTimerRef.current !== null) {\n\t\t\t\t\twindow.clearTimeout(closeTimerRef.current);\n\t\t\t\t\tcloseTimerRef.current = null;\n\t\t\t\t}\n\t\t\t} else if (shouldRender) {\n\t\t\t\tsetIsVisible(false);\n\t\t\t\tif (closeTimerRef.current !== null) {\n\t\t\t\t\twindow.clearTimeout(closeTimerRef.current);\n\t\t\t\t}\n\t\t\t\tcloseTimerRef.current = window.setTimeout(() => {\n\t\t\t\t\tsetShouldRender(false);\n\t\t\t\t\tcloseTimerRef.current = null;\n\t\t\t\t}, ANIMATION_MS);\n\t\t\t}\n\t\t}, [isOpen, shouldRender]);\n\n\t\tconst overlayClass = isVisible\n\t\t\t? \"whop-rn-modal-overlay open\"\n\t\t\t: \"whop-rn-modal-overlay\";\n\n\t\tconst dismiss = R.useCallback((): void => {\n\t\t\ttry {\n\t\t\t\tgetNavigation().dismissSheet();\n\t\t\t} catch {\n\t\t\t\t// no-op when navigation is not available\n\t\t\t}\n\t\t}, []);\n\n\t\tR.useEffect(() => {\n\t\t\tif (!isOpen) return;\n\t\t\tconst onKeyDown = (e: KeyboardEvent) => {\n\t\t\t\tif (e.key === \"Escape\") dismiss();\n\t\t\t};\n\t\t\tdocument.addEventListener(\"keydown\", onKeyDown);\n\t\t\treturn () => document.removeEventListener(\"keydown\", onKeyDown);\n\t\t}, [isOpen, dismiss]);\n\n\t\tif (!shouldRender) return null;\n\n\t\tconst route = mostRecentRouteRef.current;\n\n\t\tconst panelInner = R.createElement(\n\t\t\t\"div\",\n\t\t\t{ className: \"whop-rn-modal-panel-inner\" },\n\t\t\t[route ? props.render(route) : null],\n\t\t);\n\n\t\tconst panel = R.createElement(\n\t\t\t\"div\",\n\t\t\t{ className: \"whop-rn-modal-panel\", role: \"document\" },\n\t\t\t[panelInner],\n\t\t);\n\n\t\tconst onOverlayClick = (e: React.MouseEvent<HTMLDivElement>): void => {\n\t\t\tif (e.target === e.currentTarget) dismiss();\n\t\t};\n\n\t\treturn R.createElement(\n\t\t\t\"div\",\n\t\t\t{\n\t\t\t\tclassName: overlayClass,\n\t\t\t\trole: \"dialog\",\n\t\t\t\t\"aria-modal\": \"true\",\n\t\t\t\tonClick: onOverlayClick,\n\t\t\t},\n\t\t\t[panel],\n\t\t);\n\t};\n}\n"],"mappings":"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","names":[]}
|