@mustmove/overlay-kit-rn 1.0.97 → 1.0.98
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/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1254,7 +1254,7 @@ function createOverlayProvider() {
|
|
|
1254
1254
|
return () => {
|
|
1255
1255
|
subscription.remove();
|
|
1256
1256
|
};
|
|
1257
|
-
}, [overlayDispatch]);
|
|
1257
|
+
}, [overlayDispatch, overlayState.overlayOrderList]);
|
|
1258
1258
|
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react_native_gesture_handler.GestureHandlerRootView, { style: { flex: 1 }, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(PortalProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_bottom_sheet2.BottomSheetModalProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(OverlayContextProvider, { value: overlayState, children: [
|
|
1259
1259
|
children,
|
|
1260
1260
|
overlayState.overlayOrderList.map((item) => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/context/provider/index.tsx","../src/context/provider/content-overlay-controller.tsx","../src/context/provider/bottom-sheet-controller.tsx","../node_modules/@gorhom/portal/lib/module/components/portal/Portal.tsx","../node_modules/nanoid/non-secure/index.js","../node_modules/@gorhom/portal/lib/module/hooks/usePortal.ts","../node_modules/@gorhom/portal/lib/module/state/constants.ts","../node_modules/@gorhom/portal/lib/module/contexts/portal.ts","../node_modules/@gorhom/portal/lib/module/components/portalHost/PortalHost.tsx","../node_modules/@gorhom/portal/lib/module/hooks/usePortalState.ts","../node_modules/@gorhom/portal/lib/module/components/portalProvider/PortalProvider.tsx","../node_modules/@gorhom/portal/lib/module/utilities/logger.ts","../node_modules/@gorhom/portal/lib/module/state/reducer.ts","../src/context/provider/modal-controller.tsx","../src/event.ts","../src/utils/create-use-external-events.ts","../src/utils/emitter.ts","../src/utils/random-id.ts","../src/utils/get-component-name.ts","../src/utils/create-safe-context.ts","../src/context/context.ts","../src/context/reducer.ts","../src/utils/create-overlay-context.tsx"],"sourcesContent":["export * from \"./utils\";\nexport { overlay, OverlayProvider, useCurrentOverlay, useOverlayData } from \"./utils/create-overlay-context\";\nexport type {\n OverlayControllerComponent,\n OverlayAsyncControllerComponent,\n} from \"./context/provider/content-overlay-controller\";\nexport type { BottomSheetControllerComponent } from \"./context/provider/bottom-sheet-controller\";\nexport type { ModalControllerComponent } from \"./context/provider/modal-controller\";\n","import {\n useCallback,\n useEffect,\n useReducer,\n useRef,\n type PropsWithChildren,\n} from \"react\";\nimport { BackHandler, Platform, View } from \"react-native\";\nimport { ContentOverlayController } from \"./content-overlay-controller\";\nimport { ContentBottomSheetController } from \"./bottom-sheet-controller\";\nimport { ContentModalController } from \"./modal-controller\";\nimport { type OverlayEvent, createOverlay } from \"../../event\";\nimport { randomId } from \"../../utils/random-id\";\nimport { createOverlaySafeContext } from \"../context\";\nimport { overlayReducer } from \"../reducer\";\nimport { GestureHandlerRootView } from \"react-native-gesture-handler\";\nimport { BottomSheetModalProvider } from \"@gorhom/bottom-sheet\";\nimport { PortalProvider, PortalHost } from \"@gorhom/portal\";\n\nexport function createOverlayProvider() {\n const overlayId = randomId();\n const { useOverlayEvent, ...overlay } = createOverlay(overlayId);\n\n const { OverlayContextProvider, useCurrentOverlay, useOverlayData } =\n createOverlaySafeContext();\n\n function OverlayProvider({ children }: PropsWithChildren) {\n const [overlayState, overlayDispatch] = useReducer(overlayReducer, {\n current: null,\n overlayOrderList: [],\n overlayData: {},\n });\n const overlayStateRef = useRef(overlayState);\n\n useEffect(() => {\n overlayStateRef.current = overlayState;\n }, [overlayState]);\n\n // Overlay 이벤트 핸들러들\n const overlayOpen: OverlayEvent[\"open\"] = useCallback(\n ({\n controller,\n overlayId,\n componentKey,\n componentName,\n overlayType = \"overlay\",\n options,\n }) => {\n overlayDispatch({\n type: \"ADD\",\n overlay: {\n id: overlayId,\n componentKey,\n componentName,\n isOpen: true,\n isMounted: true,\n controller: controller,\n overlayType,\n options,\n },\n });\n },\n []\n );\n\n const close = useCallback((overlayId: string) => {\n overlayDispatch({ type: \"CLOSE\", overlayId });\n }, []);\n\n const unmount = useCallback((overlayId: string) => {\n overlayDispatch({ type: \"REMOVE\", overlayId });\n }, []);\n\n const closeAll = useCallback(() => {\n overlayDispatch({ type: \"CLOSE_ALL\" });\n }, []);\n\n const unmountAll = useCallback(() => {\n overlayDispatch({ type: \"REMOVE_ALL\" });\n }, []);\n\n // 이벤트 리스너 등록\n useOverlayEvent({\n open: overlayOpen,\n close,\n unmount,\n closeAll,\n unmountAll,\n });\n\n useEffect(() => {\n return () => {\n overlayDispatch({ type: \"REMOVE_ALL\" });\n };\n }, []);\n\n useEffect(() => {\n if (Platform.OS !== \"android\") {\n return;\n }\n\n const onHardwareBackPress = () => {\n const { overlayOrderList, overlayData } = overlayStateRef.current;\n\n for (let idx = overlayOrderList.length - 1; idx >= 0; idx -= 1) {\n const currentOverlayId = overlayOrderList[idx];\n const overlayItem = overlayData[currentOverlayId];\n\n if (!overlayItem?.isOpen) {\n continue;\n }\n\n if (\n overlayItem.overlayType === \"modal\" ||\n overlayItem.overlayType === \"bottomSheet\"\n ) {\n overlayDispatch({ type: \"REMOVE\", overlayId: currentOverlayId });\n return true;\n }\n }\n\n return false;\n };\n\n const subscription = BackHandler.addEventListener(\n \"hardwareBackPress\",\n onHardwareBackPress\n );\n\n return () => {\n subscription.remove();\n };\n }, [overlayDispatch]);\n\n return (\n <GestureHandlerRootView style={{ flex: 1 }}>\n <PortalProvider>\n <BottomSheetModalProvider>\n <OverlayContextProvider value={overlayState}>\n {children}\n\n {/* 1) Modal/Overlay 먼저 렌더: BottomSheet가 열려있으면 모달은 숨김 */}\n {overlayState.overlayOrderList.map((item) => {\n const overlayItem = overlayState.overlayData[item];\n const {\n id: currentOverlayId,\n componentKey,\n isOpen,\n controller: Controller,\n overlayType,\n options,\n } = overlayItem;\n\n if (overlayType === \"bottomSheet\") return null;\n\n // hasOpenBottomSheet 계산 (모달은 항상 마운트 유지, 대신 '가려짐' 상태만 전달)\n const hasOpenBottomSheet = overlayState.overlayOrderList.some(\n (id) =>\n overlayState.overlayData[id]?.overlayType ===\n \"bottomSheet\" && overlayState.overlayData[id]?.isOpen\n );\n\n if (overlayType === \"modal\") {\n const sameTypeOverlays = overlayState.overlayOrderList.filter(\n (id) =>\n overlayState.overlayData[id]?.overlayType === \"modal\" &&\n overlayState.overlayData[id]?.isOpen\n );\n const isTopModal =\n sameTypeOverlays[sameTypeOverlays.length - 1] ===\n currentOverlayId;\n const shouldShow = isOpen && isTopModal; // ★ 더 이상 닫지 않음\n\n return (\n <ContentModalController\n key={componentKey}\n isOpen={isOpen}\n controller={Controller as any}\n overlayId={currentOverlayId}\n overlayDispatch={overlayDispatch}\n overlayOrderList={overlayState.overlayOrderList}\n options={{\n ...options,\n coveredByBottomSheet: hasOpenBottomSheet,\n }}\n />\n );\n }\n\n // fallback: overlay\n return (\n <ContentOverlayController\n key={componentKey}\n isOpen={isOpen}\n controller={Controller as any}\n overlayId={currentOverlayId}\n overlayDispatch={overlayDispatch}\n />\n );\n })}\n\n {/* 2) BottomSheet는 항상 마지막에 렌더 */}\n {overlayState.overlayOrderList.map((item) => {\n const overlayItem = overlayState.overlayData[item];\n const {\n id: currentOverlayId,\n componentKey,\n isOpen,\n controller: Controller,\n overlayType,\n options,\n } = overlayItem;\n\n if (overlayType !== \"bottomSheet\") return null;\n\n const sameTypeOverlays = overlayState.overlayOrderList.filter(\n (id) =>\n overlayState.overlayData[id]?.overlayType ===\n \"bottomSheet\" && overlayState.overlayData[id]?.isOpen\n );\n const isTopBottomSheet =\n sameTypeOverlays[sameTypeOverlays.length - 1] ===\n currentOverlayId;\n const shouldShow = isOpen && isTopBottomSheet;\n\n return (\n <ContentBottomSheetController\n key={componentKey}\n isOpen={isOpen}\n controller={Controller as any}\n overlayId={currentOverlayId}\n overlayDispatch={overlayDispatch}\n overlayOrderList={overlayState.overlayOrderList}\n options={options}\n />\n );\n })}\n\n {/* Portal hosts for modals, ordered by overlayOrderList index (controls stacking) */}\n {overlayState.overlayOrderList.map((id, idx) => (\n <PortalHost\n key={`overlay-modal-${idx}`}\n name={`overlay-modal-${idx}`}\n />\n ))}\n </OverlayContextProvider>\n </BottomSheetModalProvider>\n </PortalProvider>\n </GestureHandlerRootView>\n );\n }\n\n return {\n overlay,\n OverlayProvider,\n useCurrentOverlay,\n useOverlayData,\n };\n}\n","import React, { type FC, memo, useEffect, type Dispatch } from \"react\";\nimport { Modal } from \"react-native\";\nimport { type OverlayReducerAction } from \"../reducer\";\n\ntype OverlayControllerProps = {\n overlayId: string;\n isOpen: boolean;\n close: () => void;\n unmount: () => void;\n};\n\ntype OverlayAsyncControllerProps<T> = Omit<OverlayControllerProps, \"close\"> & {\n close: (param: T) => void;\n};\n\nexport type OverlayControllerComponent = FC<OverlayControllerProps>;\nexport type OverlayAsyncControllerComponent<T> = FC<\n OverlayAsyncControllerProps<T>\n>;\n\ntype ContentOverlayControllerProps = {\n isOpen: boolean;\n overlayId: string;\n overlayDispatch: Dispatch<OverlayReducerAction>;\n controller: OverlayControllerComponent;\n};\n\nexport const ContentOverlayController = memo(\n ({\n isOpen,\n overlayId,\n overlayDispatch,\n controller: Controller,\n }: ContentOverlayControllerProps) => {\n useEffect(() => {\n setImmediate(() => {\n overlayDispatch({ type: \"OPEN\", overlayId });\n });\n }, [overlayDispatch, overlayId]);\n\n const handleClose = () => {\n overlayDispatch({ type: \"CLOSE\", overlayId });\n // 커스텀 애니메이션을 위한 짧은 딜레이 후 메모리에서 제거\n setTimeout(() => {\n overlayDispatch({ type: \"REMOVE\", overlayId });\n }, 200);\n };\n\n return (\n <Controller\n isOpen={isOpen}\n overlayId={overlayId}\n close={handleClose}\n unmount={() => overlayDispatch({ type: \"REMOVE\", overlayId })}\n />\n );\n }\n);\n","import React, {\n type FC,\n memo,\n useEffect,\n useRef,\n type Dispatch,\n useCallback,\n useState,\n useMemo,\n} from \"react\";\nimport BottomSheet, {\n BottomSheetModal,\n BottomSheetView,\n BottomSheetFlatList,\n BottomSheetScrollView,\n BottomSheetBackdrop,\n BottomSheetModalProvider,\n BottomSheetTextInput,\n BottomSheetFooterProps,\n} from \"@gorhom/bottom-sheet\";\n\nimport {\n StyleProp,\n ViewStyle,\n ListRenderItem,\n View,\n StyleSheet,\n Platform,\n Keyboard,\n} from \"react-native\";\nimport { useReducedMotion, Easing } from \"react-native-reanimated\";\nimport { type OverlayReducerAction } from \"../reducer\";\nimport { Portal } from \"@gorhom/portal\";\n\ntype BottomSheetControllerProps<T = any> = {\n overlayId: string;\n isOpen: boolean;\n close: () => void;\n unmount: () => void;\n snapPoints?: (string | number)[];\n enablePanDownToClose?: boolean;\n // Enhanced features\n header?: React.ReactNode;\n footer?: React.ReactNode;\n children?: React.ReactNode;\n // FlatList support\n isFlatList?: boolean;\n data?: ArrayLike<T> | null | undefined;\n renderItem?: ListRenderItem<T> | null | undefined;\n keyExtractor?: ((item: T, index: number) => string) | undefined;\n contentContainerStyle?: StyleProp<ViewStyle> | undefined;\n ItemSeparatorComponent?: React.ComponentType<any> | null | undefined;\n flatListHeader?: React.ReactNode;\n flatListFooter?: React.ReactNode;\n // Backdrop\n enableBackdrop?: boolean;\n backdropOpacity?: number;\n onBackdropPress?: () => void;\n // Dynamic sizing\n enableDynamicSizing?: boolean;\n // Scrolling\n enableScrolling?: boolean;\n // Styling\n backgroundStyle?: StyleProp<ViewStyle>;\n handleStyle?: StyleProp<ViewStyle>;\n // Loading & empty state\n isLoading?: boolean;\n emptyText?: string;\n extraData?: any;\n};\n\nexport type BottomSheetControllerComponent<T = any> = FC<\n BottomSheetControllerProps<T>\n>;\n\ntype ContentBottomSheetControllerProps = {\n isOpen: boolean;\n overlayId: string;\n overlayDispatch: Dispatch<OverlayReducerAction>;\n controller: BottomSheetControllerComponent | React.ReactElement;\n overlayOrderList: string[];\n options?: {\n snapPoints?: (string | number)[];\n enablePanDownToClose?: boolean;\n enableBackdrop?: boolean;\n backdropOpacity?: number;\n enableDynamicSizing?: boolean;\n backgroundStyle?: StyleProp<ViewStyle>;\n handleStyle?: StyleProp<ViewStyle>;\n keyboardBehavior?: \"interactive\" | \"extend\" | \"fillParent\";\n keyboardBlurBehavior?: \"restore\" | \"none\";\n androidKeyboardInputMode?: \"adjustResize\" | \"adjustPan\";\n closeAllOnGestureClose?: boolean;\n closeFunction?: () => void;\n isHandleClose?: boolean;\n [key: string]: any;\n };\n};\n\nexport const ContentBottomSheetController = memo(\n ({\n isOpen,\n overlayId,\n overlayDispatch,\n controller: Controller,\n overlayOrderList,\n options = {},\n }: ContentBottomSheetControllerProps) => {\n const bottomSheetRef = useRef<BottomSheet>(null);\n const reducedMotion = useReducedMotion();\n const isClosingRef = useRef(false);\n const closeTimerRef = useRef<NodeJS.Timeout | null>(null);\n\n // 빠른 닫힘 애니메이션 설정\n const animationConfigs = useMemo(\n () => ({\n duration: 200, // 200ms로 빠르게\n easing: Easing.out(Easing.cubic),\n }),\n []\n );\n\n // Use react-native-keyboard-controller for keyboard tracking (number type)\n const [keyboardHeight, setKeyboardHeight] = useState(0);\n const isKeyboardActiveRef = useRef(false);\n\n // 키보드 상태 감지 (빠른 반응을 위해 ref 사용)\n useEffect(() => {\n const keyboardWillShowListener = Keyboard.addListener(\n Platform.OS === \"ios\" ? \"keyboardWillShow\" : \"keyboardDidShow\",\n (e) => {\n isKeyboardActiveRef.current = true;\n setKeyboardHeight(e.endCoordinates.height);\n }\n );\n const keyboardWillHideListener = Keyboard.addListener(\n Platform.OS === \"ios\" ? \"keyboardWillHide\" : \"keyboardDidHide\",\n () => {\n isKeyboardActiveRef.current = false;\n setKeyboardHeight(0);\n }\n );\n\n return () => {\n keyboardWillShowListener.remove();\n keyboardWillHideListener.remove();\n };\n }, []);\n\n const getZIndex = () => {\n const index = overlayOrderList.indexOf(overlayId);\n // bottomSheet는 항상 modal보다 앞에 나오도록 훨씬 높은 zIndex 사용\n return 1000 + index;\n };\n\n // --- Android keyboard handling defaults ---\n // On Android, the sheet won't move with the keyboard unless:\n // 1) Activity windowSoftInputMode = \"adjustResize\"\n // 2) bottom-sheet uses keyboardBehavior=\"extend\"\n // 3) Text inputs inside sheet use BottomSheetTextInput\n\n const {\n snapPoints,\n enablePanDownToClose = true,\n enableBackdrop = true,\n backdropOpacity = 0.5,\n enableDynamicSizing = true,\n backgroundStyle = {},\n handleStyle = {},\n keyboardBehavior = Platform.OS === \"android\" ? \"extend\" : \"interactive\",\n keyboardBlurBehavior = \"restore\",\n androidKeyboardInputMode = \"adjustResize\",\n closeAllOnGestureClose = false,\n isHandleClose = true,\n closeFunction,\n ...restOptions\n } = options;\n\n useEffect(() => {\n if (isOpen) {\n // 바텀시트가 열릴 때 플래그와 타이머 초기화\n isClosingRef.current = false;\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n\n const rafId = requestAnimationFrame(() => {\n bottomSheetRef.current?.expand();\n overlayDispatch({ type: \"OPEN\", overlayId });\n });\n return () => cancelAnimationFrame(rafId);\n } else {\n // bottomSheetRef.current?.close();\n }\n }, [isOpen, overlayDispatch, overlayId]);\n\n // 컴포넌트 언마운트 시 타이머 정리\n useEffect(() => {\n return () => {\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n isClosingRef.current = false;\n };\n }, []);\n\n // 키보드가 열려있다면 먼저 닫고, 그 다음 바텀시트 닫기\n const handleClose = useCallback(() => {\n // 이미 닫히는 중이면 무시 (중복 클릭 방지)\n if (isClosingRef.current) {\n return;\n }\n isClosingRef.current = true;\n\n // 기존 타이머가 있다면 정리\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n\n // 키보드가 활성화되어 있으면 먼저 키보드를 닫기\n if (keyboardHeight > 0) {\n Keyboard.dismiss();\n // 키보드 닫히는 애니메이션 시간을 최소화\n closeTimerRef.current = setTimeout(() => {\n closeTimerRef.current = null;\n\n if (closeAllOnGestureClose) {\n overlayDispatch({ type: \"REMOVE_ALL\" });\n } else {\n overlayDispatch({ type: \"REMOVE\", overlayId });\n }\n\n if (closeFunction) {\n closeFunction();\n }\n\n // 작업 완료 후 플래그 리셋\n isClosingRef.current = false;\n }, 50);\n return;\n }\n\n // 키보드가 활성화되어 있지 않으면 즉시 바텀시트 닫기\n // requestAnimationFrame으로 한 프레임만 대기 후 즉시 제거\n requestAnimationFrame(() => {\n if (closeAllOnGestureClose) {\n overlayDispatch({ type: \"REMOVE_ALL\" });\n } else {\n overlayDispatch({ type: \"REMOVE\", overlayId });\n }\n if (closeFunction) {\n closeFunction();\n }\n\n // 작업 완료 후 플래그 리셋\n isClosingRef.current = false;\n });\n }, [\n overlayDispatch,\n overlayId,\n closeAllOnGestureClose,\n closeFunction,\n keyboardHeight,\n ]);\n\n // 백드롭 렌더링\n const renderBackdrop = useCallback(\n (props: any) => (\n <BottomSheetBackdrop\n {...props}\n appearsOnIndex={1}\n disappearsOnIndex={-1}\n opacity={backdropOpacity}\n // pressBehavior=\"close\"\n onPress={handleClose}\n />\n ),\n [backdropOpacity, handleClose]\n );\n\n // callbacks\n const handleSheetChange = useCallback((index: number) => {}, []);\n const getLayerIndex = () => {\n return Math.max(0, overlayOrderList.indexOf(overlayId));\n };\n if (!isOpen) return null;\n\n return (\n <Portal hostName={`overlay-modal-${getLayerIndex()}`}>\n <BottomSheet\n style={[{ zIndex: getZIndex() }]}\n ref={bottomSheetRef}\n onChange={handleSheetChange}\n android_keyboardInputMode={androidKeyboardInputMode}\n keyboardBehavior={keyboardBehavior}\n snapPoints={enableDynamicSizing ? undefined : snapPoints}\n enablePanDownToClose={enablePanDownToClose}\n onClose={isHandleClose ? handleClose : undefined}\n bottomInset={Platform.OS === \"android\" ? keyboardHeight : 0}\n keyboardBlurBehavior={keyboardBlurBehavior}\n animationConfigs={animationConfigs}\n // index={0}\n backdropComponent={enableBackdrop ? renderBackdrop : undefined}\n backgroundStyle={[\n {\n borderTopLeftRadius: 16,\n borderTopRightRadius: 16,\n },\n backgroundStyle,\n ]}\n handleStyle={[\n {\n backgroundColor: \"transparent\",\n borderTopLeftRadius: 16,\n borderTopRightRadius: 16,\n },\n handleStyle,\n ]}\n enableDynamicSizing={enableDynamicSizing}\n animateOnMount={!reducedMotion}\n >\n {React.isValidElement(Controller)\n ? React.cloneElement(Controller as React.ReactElement<any>, {\n close: () => overlayDispatch({ type: \"CLOSE\", overlayId }),\n unmount: () => overlayDispatch({ type: \"REMOVE\", overlayId }),\n })\n : React.createElement(Controller as any, {\n isOpen,\n overlayId,\n snapPoints,\n enablePanDownToClose,\n close: () => overlayDispatch({ type: \"CLOSE\", overlayId }),\n unmount: () => overlayDispatch({ type: \"REMOVE\", overlayId }),\n ...restOptions,\n })}\n </BottomSheet>\n </Portal>\n );\n }\n);\n","import { memo, useCallback, useEffect, useMemo, useRef } from 'react';\nimport { nanoid } from 'nanoid/non-secure';\nimport { usePortal } from '../../hooks/usePortal';\nimport type { PortalProps } from './types';\n\nconst PortalComponent = ({\n name: _providedName,\n hostName,\n handleOnMount: _providedHandleOnMount,\n handleOnUnmount: _providedHandleOnUnmount,\n handleOnUpdate: _providedHandleOnUpdate,\n children,\n}: PortalProps) => {\n //#region hooks\n const { addPortal: addUpdatePortal, removePortal } = usePortal(hostName);\n //#endregion\n\n //#region variables\n const name = useMemo(() => _providedName || nanoid(), [_providedName]);\n //#endregion\n\n //#region refs\n const handleOnMountRef = useRef<Function>();\n const handleOnUnmountRef = useRef<Function>();\n const handleOnUpdateRef = useRef<Function>();\n //#endregion\n\n //#region callbacks\n const handleOnMount = useCallback(() => {\n if (_providedHandleOnMount) {\n _providedHandleOnMount(() => addUpdatePortal(name, children));\n } else {\n addUpdatePortal(name, children);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [_providedHandleOnMount, addUpdatePortal]);\n handleOnMountRef.current = handleOnMount;\n\n const handleOnUnmount = useCallback(() => {\n if (_providedHandleOnUnmount) {\n _providedHandleOnUnmount(() => removePortal(name));\n } else {\n removePortal(name);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [_providedHandleOnUnmount, removePortal]);\n handleOnUnmountRef.current = handleOnUnmount;\n\n const handleOnUpdate = useCallback(() => {\n if (_providedHandleOnUpdate) {\n _providedHandleOnUpdate(() => addUpdatePortal(name, children));\n } else {\n addUpdatePortal(name, children);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [_providedHandleOnUpdate, addUpdatePortal, children]);\n handleOnUpdateRef.current = handleOnUpdate;\n //#endregion\n\n //#region effects\n useEffect(() => {\n handleOnMountRef.current?.();\n return () => {\n handleOnUnmountRef.current?.();\n\n // remove callbacks refs\n handleOnMountRef.current = undefined;\n handleOnUnmountRef.current = undefined;\n handleOnUpdateRef.current = undefined;\n };\n }, []);\n useEffect(() => {\n handleOnUpdateRef.current?.();\n }, [children]);\n //#endregion\n\n return null;\n};\n\nexport const Portal = memo(PortalComponent);\nPortal.displayName = 'Portal';\n","let urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\nlet customAlphabet = (alphabet, defaultSize = 21) => {\n return (size = defaultSize) => {\n let id = ''\n let i = size | 0\n while (i--) {\n id += alphabet[(Math.random() * alphabet.length) | 0]\n }\n return id\n }\n}\nlet nanoid = (size = 21) => {\n let id = ''\n let i = size | 0\n while (i--) {\n id += urlAlphabet[(Math.random() * 64) | 0]\n }\n return id\n}\nexport { nanoid, customAlphabet }\n","import { ReactNode, useCallback, useContext } from 'react';\nimport { ACTIONS } from '../state/constants';\nimport { PortalDispatchContext } from '../contexts/portal';\n\nexport const usePortal = (hostName: string = 'root') => {\n const dispatch = useContext(PortalDispatchContext);\n\n if (dispatch === null) {\n throw new Error(\n \"'PortalDispatchContext' cannot be null, please add 'PortalProvider' to the root component.\"\n );\n }\n\n //#region methods\n const registerHost = useCallback(() => {\n dispatch({\n type: ACTIONS.REGISTER_HOST,\n hostName: hostName,\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const deregisterHost = useCallback(() => {\n dispatch({\n type: ACTIONS.DEREGISTER_HOST,\n hostName: hostName,\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const addUpdatePortal = useCallback((name: string, node: ReactNode) => {\n dispatch({\n type: ACTIONS.ADD_UPDATE_PORTAL,\n hostName,\n portalName: name,\n node,\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const removePortal = useCallback((name: string) => {\n dispatch({\n type: ACTIONS.REMOVE_PORTAL,\n hostName,\n portalName: name,\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n //#endregion\n\n return {\n registerHost,\n deregisterHost,\n addPortal: addUpdatePortal,\n updatePortal: addUpdatePortal,\n removePortal,\n };\n};\n","enum ACTIONS {\n REGISTER_HOST,\n DEREGISTER_HOST,\n ADD_UPDATE_PORTAL,\n REMOVE_PORTAL,\n}\n\nconst INITIAL_STATE = {};\n\nexport { ACTIONS, INITIAL_STATE };\n","import { createContext } from 'react';\nimport type { ActionTypes } from '../state/types';\nimport type { PortalType } from '../types';\n\nexport const PortalStateContext = createContext<Record<\n string,\n Array<PortalType>\n> | null>(null);\nexport const PortalDispatchContext =\n createContext<React.Dispatch<ActionTypes> | null>(null);\n","import React, { memo, useEffect } from 'react';\nimport { usePortalState } from '../../hooks/usePortalState';\nimport { usePortal } from '../../hooks/usePortal';\nimport type { PortalHostProps } from './types';\n\nconst PortalHostComponent = ({ name }: PortalHostProps) => {\n //#region hooks\n const state = usePortalState(name);\n const { registerHost, deregisterHost } = usePortal(name);\n //#endregion\n\n //#region effects\n useEffect(() => {\n registerHost();\n return () => {\n deregisterHost();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n //#endregion\n\n //#region render\n return <>{state.map(item => item.node)}</>;\n //#endregion\n};\n\nexport const PortalHost = memo(PortalHostComponent);\nPortalHost.displayName = 'PortalHost';\n","import { useContext } from 'react';\nimport { PortalStateContext } from '../contexts/portal';\n\nexport const usePortalState = (hostName: string) => {\n const state = useContext(PortalStateContext);\n\n if (state === null) {\n throw new Error(\n \"'PortalStateContext' cannot be null, please add 'PortalProvider' to the root component.\"\n );\n }\n\n return state[hostName] || [];\n};\n","import React, { memo, useReducer } from 'react';\nimport { PortalHost } from '../portalHost/PortalHost';\nimport {\n PortalDispatchContext,\n PortalStateContext,\n} from '../../contexts/portal';\nimport { INITIAL_STATE } from '../../state/constants';\nimport { reducer } from '../../state/reducer';\nimport type { PortalProviderProps } from './types';\n\nconst PortalProviderComponent = ({\n rootHostName = 'root',\n shouldAddRootHost = true,\n children,\n}: PortalProviderProps) => {\n const [state, dispatch] = useReducer(reducer, INITIAL_STATE);\n return (\n <PortalDispatchContext.Provider value={dispatch}>\n <PortalStateContext.Provider value={state}>\n {children}\n {shouldAddRootHost && <PortalHost name={rootHostName} />}\n </PortalStateContext.Provider>\n </PortalDispatchContext.Provider>\n );\n};\n\nexport const PortalProvider = memo(PortalProviderComponent);\nPortalProvider.displayName = 'PortalProvider';\n","interface PrintOptions {\n component?: string;\n method?: string;\n params?: Record<string, any> | string | number | boolean;\n}\n\ntype Print = (options: PrintOptions) => void;\n\nlet isLoggingEnabled = false;\n\n// __DEV__ global is by default not defined in React Native Web builds\nconst isDev = Boolean(typeof __DEV__ !== 'undefined' && __DEV__)\n\nconst enableLogging = () => {\n if (!isDev) {\n console.warn('[Portal] could not enable logging on production!');\n return;\n }\n isLoggingEnabled = true;\n};\n\nlet print: Print = () => {};\n\nif (isDev) {\n print = ({ component, method, params }) => {\n if (!isLoggingEnabled) {\n return;\n }\n let message = '';\n\n if (typeof params === 'object') {\n message = Object.keys(params)\n .map(key => `${key}:${params[key]}`)\n .join(' ');\n } else {\n message = `${params ?? ''}`;\n }\n console.log(\n `[Portal::${[component, method].filter(Boolean).join('::')}]`,\n message\n );\n };\n}\n\nObject.freeze(print);\n\nexport { print, enableLogging };\n","import { ACTIONS } from './constants';\nimport { print } from '../utilities/logger';\nimport type { PortalType } from '../types';\nimport type {\n ActionTypes,\n AddUpdatePortalAction,\n RemovePortalAction,\n} from './types';\n\nconst registerHost = (\n state: Record<string, Array<PortalType>>,\n hostName: string\n) => {\n if (!(hostName in state)) {\n state[hostName] = [];\n }\n return state;\n};\n\nconst deregisterHost = (\n state: Record<string, Array<PortalType>>,\n hostName: string\n) => {\n delete state[hostName];\n return state;\n};\n\nconst addUpdatePortal = (\n state: Record<string, Array<PortalType>>,\n hostName: string,\n portalName: string,\n node: any\n) => {\n if (!(hostName in state)) {\n state = registerHost(state, hostName);\n }\n\n /**\n * updated portal, if it was already added.\n */\n const index = state[hostName].findIndex(item => item.name === portalName);\n if (index !== -1) {\n state[hostName][index].node = node;\n } else {\n state[hostName].push({\n name: portalName,\n node,\n });\n }\n return state;\n};\n\nconst removePortal = (\n state: Record<string, Array<PortalType>>,\n hostName: string,\n portalName: string\n) => {\n if (!(hostName in state)) {\n print({\n component: reducer.name,\n method: removePortal.name,\n params: `Failed to remove portal '${portalName}', '${hostName}' was not registered!`,\n });\n return state;\n }\n\n const index = state[hostName].findIndex(item => item.name === portalName);\n if (index !== -1) state[hostName].splice(index, 1);\n return state;\n};\n\nexport const reducer = (\n state: Record<string, Array<PortalType>>,\n action: ActionTypes\n) => {\n const { type } = action;\n let clonedState = { ...state };\n switch (type) {\n case ACTIONS.REGISTER_HOST:\n return registerHost(clonedState, action.hostName);\n case ACTIONS.DEREGISTER_HOST:\n return deregisterHost(clonedState, action.hostName);\n case ACTIONS.ADD_UPDATE_PORTAL:\n return addUpdatePortal(\n clonedState,\n action.hostName,\n (action as AddUpdatePortalAction).portalName,\n (action as AddUpdatePortalAction).node\n );\n case ACTIONS.REMOVE_PORTAL:\n return removePortal(\n clonedState,\n action.hostName,\n (action as RemovePortalAction).portalName\n );\n default:\n return state;\n }\n};\n","// modal-controller.tsx\nimport React, { type FC, memo, useEffect, useState } from \"react\";\nimport {\n View,\n Animated,\n StyleSheet,\n Dimensions,\n Pressable,\n Keyboard,\n} from \"react-native\";\nimport { Portal } from \"@gorhom/portal\";\nimport { type OverlayReducerAction } from \"../reducer\";\n\ntype ModalControllerProps = {\n overlayId: string;\n isOpen: boolean;\n close: () => void;\n unmount: () => void;\n modalType?: \"center\" | \"bottom\" | \"top\" | \"left\" | \"right\";\n backdropOpacity?: number;\n animationType?: \"none\" | \"slide\" | \"fade\";\n swipeDirection?:\n | \"up\"\n | \"down\"\n | \"left\"\n | \"right\"\n | Array<\"up\" | \"down\" | \"left\" | \"right\">;\n};\n\nexport type ModalControllerComponent<T = {}> = FC<ModalControllerProps & T>;\n\ntype ContentModalControllerProps = {\n isOpen: boolean;\n overlayId: string;\n overlayDispatch: React.Dispatch<OverlayReducerAction>;\n controller: ModalControllerComponent | React.ReactElement;\n overlayOrderList: string[];\n options?: {\n modalType?: \"center\" | \"bottom\" | \"top\" | \"left\" | \"right\";\n backdropOpacity?: number;\n animationType?: \"none\" | \"slide\" | \"fade\";\n swipeDirection?:\n | \"up\"\n | \"down\"\n | \"left\"\n | \"right\"\n | Array<\"up\" | \"down\" | \"left\" | \"right\">;\n closeFunction?: () => void;\n // coveredByBottomSheet?: boolean;\n };\n};\n\nconst { width: SCREEN_WIDTH, height: SCREEN_HEIGHT } = Dimensions.get(\"window\");\n\nexport const ContentModalController = memo(\n ({\n isOpen,\n overlayId,\n overlayDispatch,\n controller: Controller,\n overlayOrderList,\n options = {},\n }: ContentModalControllerProps) => {\n const {\n modalType = \"center\",\n backdropOpacity = 0.5,\n animationType = \"fade\",\n swipeDirection,\n closeFunction,\n } = options;\n\n const [backdropAnimation] = useState(new Animated.Value(0));\n const [contentAnimation] = useState(new Animated.Value(0));\n const [mounted, setMounted] = useState<boolean>(isOpen);\n const [isClosing, setIsClosing] = useState(false);\n\n useEffect(() => {\n if (isOpen) {\n // ensure mounted before playing open animation\n if (!mounted) setMounted(true);\n setImmediate(() => {\n overlayDispatch({ type: \"OPEN\", overlayId });\n });\n Animated.parallel([\n Animated.timing(backdropAnimation, {\n toValue: 1,\n duration: 300,\n useNativeDriver: true,\n }),\n Animated.timing(contentAnimation, {\n toValue: 1,\n duration: 300,\n useNativeDriver: true,\n }),\n ]).start();\n } else {\n // play close animation, then unmount to avoid touch blocking\n Animated.parallel([\n Animated.timing(backdropAnimation, {\n toValue: 0,\n duration: 200,\n useNativeDriver: true,\n }),\n Animated.timing(contentAnimation, {\n toValue: 0,\n duration: 200,\n useNativeDriver: true,\n }),\n ]).start(() => {\n setMounted(false);\n // 애니메이션 끝나면 메모리에서 완전히 제거\n overlayDispatch({ type: \"REMOVE\", overlayId });\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen]);\n\n const handleClose = () => {\n // 이미 닫히는 중이면 무시 (중복 클릭 방지)\n if (isClosing) {\n return;\n }\n setIsClosing(true);\n\n // 키보드가 열려있다면 먼저 닫기\n Keyboard.dismiss();\n\n // 즉시 모달 닫기 (requestAnimationFrame으로 한 프레임만 대기)\n requestAnimationFrame(() => {\n overlayDispatch({ type: \"REMOVE\", overlayId });\n\n if (closeFunction) {\n closeFunction();\n }\n });\n };\n\n const getLayerIndex = () => {\n return Math.max(0, overlayOrderList.indexOf(overlayId));\n };\n\n const getZIndex = () => {\n const index = overlayOrderList.indexOf(overlayId);\n // modal은 bottomSheet보다 앞에 나오도록 더 높은 zIndex 사용\n return 1000 + index;\n };\n\n const getContainerStyle = () => {\n switch (modalType) {\n case \"bottom\":\n return styles.bottomContainer;\n case \"top\":\n return styles.topContainer;\n case \"left\":\n return styles.leftContainer;\n case \"right\":\n return styles.rightContainer;\n default:\n return styles.centerContainer;\n }\n };\n\n const getContentAnimationStyle = () => {\n const baseOpacity = { opacity: contentAnimation };\n\n switch (modalType) {\n case \"bottom\":\n return {\n ...baseOpacity,\n transform: [\n {\n translateY: contentAnimation.interpolate({\n inputRange: [0, 1],\n outputRange: [SCREEN_HEIGHT, 0],\n }),\n },\n ],\n };\n case \"top\":\n return {\n ...baseOpacity,\n transform: [\n {\n translateY: contentAnimation.interpolate({\n inputRange: [0, 1],\n outputRange: [-SCREEN_HEIGHT, 0],\n }),\n },\n ],\n };\n case \"left\":\n return {\n ...baseOpacity,\n transform: [\n {\n translateX: contentAnimation.interpolate({\n inputRange: [0, 1],\n outputRange: [-SCREEN_WIDTH, 0],\n }),\n },\n ],\n };\n case \"right\":\n return {\n ...baseOpacity,\n transform: [\n {\n translateX: contentAnimation.interpolate({\n inputRange: [0, 1],\n outputRange: [SCREEN_WIDTH, 0],\n }),\n },\n ],\n };\n default:\n if (animationType === \"slide\") {\n return {\n ...baseOpacity,\n transform: [\n {\n scale: contentAnimation.interpolate({\n inputRange: [0, 1],\n outputRange: [0.8, 1],\n }),\n },\n ],\n };\n }\n return baseOpacity;\n }\n };\n // const isCovered = !!options?.coveredByBottomSheet;\n // const isHidden = isCovered;\n\n if (!mounted) return null;\n\n return (\n <Portal hostName={`overlay-modal-${getLayerIndex()}`}>\n <View\n style={[styles.absoluteContainer]}\n pointerEvents={isOpen ? \"box-none\" : \"none\"}\n importantForAccessibility={isOpen ? \"auto\" : \"no-hide-descendants\"}\n >\n <Pressable\n style={StyleSheet.absoluteFill}\n onPress={handleClose}\n disabled={!isOpen}\n >\n <Animated.View\n pointerEvents=\"none\"\n style={[\n styles.backdrop,\n {\n backgroundColor: `rgba(0, 0, 0, ${backdropOpacity})`,\n opacity: backdropAnimation,\n },\n ]}\n />\n </Pressable>\n\n <Animated.View\n style={[getContainerStyle(), getContentAnimationStyle()]}\n pointerEvents=\"box-none\"\n >\n <View pointerEvents=\"box-none\">\n {React.isValidElement(Controller)\n ? React.cloneElement(Controller as React.ReactElement<any>, {\n close: () => overlayDispatch({ type: \"CLOSE\", overlayId }),\n unmount: () =>\n overlayDispatch({ type: \"REMOVE\", overlayId }),\n })\n : React.createElement(Controller as any, {\n isOpen,\n overlayId,\n modalType,\n backdropOpacity,\n animationType,\n swipeDirection,\n close: () => overlayDispatch({ type: \"CLOSE\", overlayId }),\n unmount: () =>\n overlayDispatch({ type: \"REMOVE\", overlayId }),\n })}\n </View>\n </Animated.View>\n </View>\n </Portal>\n );\n }\n);\n\nconst styles = StyleSheet.create({\n absoluteContainer: {\n ...StyleSheet.absoluteFillObject,\n },\n backdrop: {\n ...StyleSheet.absoluteFillObject,\n },\n centerContainer: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"center\",\n paddingHorizontal: 20,\n },\n bottomContainer: {\n flex: 1,\n justifyContent: \"flex-end\",\n },\n topContainer: {\n flex: 1,\n justifyContent: \"flex-start\",\n },\n leftContainer: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"flex-start\",\n },\n rightContainer: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"flex-end\",\n },\n});\n","// 사용자가 실제로 사용하는 API 를 만드는 팩토리\n// overlay.open(), overlay.close 등\n\nimport React from \"react\";\nimport {\n OverlayAsyncControllerComponent,\n OverlayControllerComponent,\n} from \"./context/provider/content-overlay-controller\";\nimport { BottomSheetControllerComponent } from \"./context/provider/bottom-sheet-controller\";\nimport { ModalControllerComponent } from \"./context/provider/modal-controller\";\nimport { createUseExternalEvents } from \"./utils/create-use-external-events\";\nimport { randomId } from \"./utils/random-id\";\nimport { getComponentName } from \"./utils/get-component-name\";\nimport { BottomSheetFooterProps } from \"@gorhom/bottom-sheet\";\nimport { StyleProp, ViewStyle } from \"react-native\";\n\nexport type OverlayEvent = {\n open: (args: {\n controller:\n | OverlayControllerComponent\n | BottomSheetControllerComponent\n | ModalControllerComponent\n | React.ReactElement;\n overlayId: string;\n componentKey: string;\n componentName?: string;\n overlayType?: \"overlay\" | \"bottomSheet\" | \"modal\";\n options?: any;\n }) => void;\n close: (overlayId: string) => void;\n unmount: (overlayId: string) => void;\n closeAll: () => void;\n unmountAll: () => void;\n};\n\ntype OpenOverlayOptions = {\n overlayId?: string;\n overlayType?: \"overlay\" | \"bottomSheet\" | \"modal\";\n // BottomSheet options\n snapPoints?: (string | number)[];\n enablePanDownToClose?: boolean;\n closeAllOnGestureClose?: boolean;\n // Modal options\n modalType?: \"center\" | \"bottom\" | \"top\" | \"left\" | \"right\";\n backdropOpacity?: number;\n keyboardBehavior?: \"interactive\" | \"extend\" | \"fillParent\";\n keyboardBlurBehavior?: \"restore\" | \"none\";\n androidKeyboardInputMode?: \"adjustResize\" | \"adjustPan\";\n enableDynamicSizing?: boolean;\n closeFunction?: () => void;\n isHandleClose?: boolean;\n // Styling options\n backgroundStyle?: StyleProp<ViewStyle>;\n handleStyle?: StyleProp<ViewStyle>;\n\n animationType?:\n | \"none\"\n | \"slide\"\n | \"fade\"\n | \"bounceIn\"\n | \"bounceInDown\"\n | \"bounceInUp\"\n | \"bounceInLeft\"\n | \"bounceInRight\"\n | \"bounceOut\"\n | \"bounceOutDown\"\n | \"bounceOutUp\"\n | \"bounceOutLeft\"\n | \"bounceOutRight\"\n | \"fadeIn\"\n | \"fadeInDown\"\n | \"fadeInDownBig\"\n | \"fadeInUp\"\n | \"fadeInUpBig\"\n | \"fadeInLeft\"\n | \"fadeInLeftBig\"\n | \"fadeInRight\"\n | \"fadeInRightBig\"\n | \"fadeOut\"\n | \"fadeOutDown\"\n | \"fadeOutDownBig\"\n | \"fadeOutUp\"\n | \"fadeOutUpBig\"\n | \"fadeOutLeft\"\n | \"fadeOutLeftBig\"\n | \"fadeOutRight\"\n | \"fadeOutRightBig\";\n swipeDirection?:\n | \"up\"\n | \"down\"\n | \"left\"\n | \"right\"\n | Array<\"up\" | \"down\" | \"left\" | \"right\">;\n footerComponent?: React.FC<BottomSheetFooterProps>;\n};\n// id 받아\nexport function createOverlay(overlayId: string) {\n const [useOverlayEvent, createEvent] = createUseExternalEvents<OverlayEvent>(\n `${overlayId}/overlay-kit`\n );\n\n const open = (\n controller:\n | OverlayControllerComponent\n | BottomSheetControllerComponent\n | ModalControllerComponent\n | React.ReactElement,\n options?: OpenOverlayOptions\n ) => {\n const overlayId = options?.overlayId ?? randomId();\n const componentKey = randomId();\n const overlayType = options?.overlayType ?? \"overlay\";\n const componentName = getComponentName(controller);\n\n const dispatchOpenEvent = createEvent(\"open\");\n\n // 옵션에서 overlayType과 overlayId를 제외한 나머지를 options로 전달\n const { overlayId: _, overlayType: __, ...restOptions } = options || {};\n\n // JSX 엘리먼트인 경우 wrapper 컴포넌트로 감싸기\n let finalController;\n if (React.isValidElement(controller)) {\n finalController = (props: any) => {\n return React.cloneElement(controller as React.ReactElement, {\n ...(controller.props || {}),\n ...props,\n close: props.close,\n unmount: props.unmount,\n });\n };\n } else {\n finalController = controller;\n }\n\n dispatchOpenEvent({\n controller: finalController,\n overlayId,\n componentKey,\n componentName,\n overlayType,\n options: restOptions,\n });\n return overlayId;\n };\n\n // openAsync는 모든 overlay 타입에서 사용 가능\n const openAsync = async <T>(\n controller:\n | OverlayAsyncControllerComponent<T>\n | BottomSheetControllerComponent\n | ModalControllerComponent\n | React.ReactElement\n | ((props: any) => any),\n options?: OpenOverlayOptions\n ) => {\n return new Promise<T>((resolve) => {\n const wrappedController = (overlayProps: any) => {\n const close = (param?: T) => {\n resolve(param as T);\n overlayProps.close();\n };\n const unmount = (param?: T) => {\n resolve(param as T);\n overlayProps.unmount();\n };\n const props = { ...overlayProps, close, unmount };\n\n // JSX 엘리먼트인 경우 처리\n if (React.isValidElement(controller)) {\n return React.cloneElement(controller as React.ReactElement, {\n ...(controller.props || {}),\n ...props,\n });\n }\n\n // 함수인 경우 호출\n if (typeof controller === \"function\") {\n return controller(props);\n }\n\n // 기타 컴포넌트 타입인 경우\n return controller;\n };\n\n open(wrappedController, options);\n });\n };\n const close = createEvent(\"close\");\n const unmount = createEvent(\"unmount\");\n const closeAll = createEvent(\"closeAll\");\n const unmountAll = createEvent(\"unmountAll\");\n return {\n open,\n openAsync,\n close,\n unmount,\n closeAll,\n unmountAll,\n useOverlayEvent,\n };\n}\n","import { useEffect } from \"react\";\nimport { createEmitter } from \"./emitter\";\n\nconst emitter = createEmitter();\n\n// React Native에서는 useEffect를 사용 (useLayoutEffect 대신)\nfunction useClientEffect(...args: Parameters<typeof useEffect>) {\n // RN에서는 항상 useEffect 실행\n useEffect(...args);\n}\n\n// 단순한 wrapper 함수\n// emitter.emit을 한번 감싼 이유는 나중에 로깅, 디버깅 등 추가 기능을 넣기 위함\nfunction dispatchEvent<Detail>(type: string, detail?: Detail) {\n emitter.emit(type, detail);\n}\n\n// 메인 팩토리 함수\n// 사용 예\n// createUseExternalEvents<OverlayEvents>('overlay-kit')\n// prefix의 역할:\n// - 'overlay-kit' → 실제 이벤트명은 overlay-kit:open, overlay-kit:close\n// - 네임스페이스로 이벤트 충돌 방지\n\nfunction createUseExternalEvents<\n EventHandlers extends Record<string, (params: any) => void>\n>(prefix: string) {\n function useExternalEvents(events: EventHandlers) {\n // 변환 과정:\n // 입력:\n // events = {\n // open: (data) => console.log('열기', data),\n // close: (id) => console.log('닫기', id)\n // }\n\n // 변환 결과:\n // handlers = {\n // 'overlay-kit:open': (event) => events.open(event),\n // 'overlay-kit:close': (event) => events.close(event)\n // }\n\n const handlers = Object.keys(events).reduce<Record<string, () => void>>(\n (prev, eventKey) => {\n const currentEventKeys = `${prefix}:${eventKey}`;\n\n return {\n ...prev,\n [currentEventKeys]: function (event: unknown) {\n events[eventKey](event);\n } as () => void,\n };\n },\n {}\n );\n\n useClientEffect(() => {\n Object.keys(handlers).forEach((eventKey) => {\n emitter.off(eventKey, handlers[eventKey]); // 🔥 기존 핸들러 제거\n // (중복 방지)\n emitter.on(eventKey, handlers[eventKey]); // 🔥 새로운 핸들러 등록\n });\n\n // 🧹 컴포넌트 언마운트시 정리\n return () =>\n Object.keys(handlers).forEach((eventKey) => {\n emitter.off(eventKey, handlers[eventKey]);\n });\n }, [handlers]);\n }\n\n // 타입 분석:\n // EventKey = 'open' | 'close' | 'closeAll'\n // Parameters<EventHandlers['open']> = [data: {component: Component, id:\n // string}]\n\n // const openEvent = createEvent('open');\n // openEvent의 타입: (data: {component: Component, id: string}) => void\n\n // openEvent({component: MyModal, id: '123'});\n // → dispatchEvent('overlay-kit:open', {component: MyModal, id: '123'})\n\n // payload[0]을 사용하는 이유:\n // 함수 호출: openEvent(arg1, arg2, arg3)\n // payload = [arg1, arg2, arg3]\n // payload[0] = arg1 (첫 번째 인자만 이벤트 데이터로 전달)\n\n function createEvent<EventKey extends keyof EventHandlers>(event: EventKey) {\n return (...payload: Parameters<EventHandlers[EventKey]>) =>\n dispatchEvent(`${prefix}:${String(event)}`, payload[0]);\n }\n\n return [useExternalEvents, createEvent] as const;\n}\n\n// 💡 이 패턴의 천재적인 점\n\n// 1. React 외부에서 React 내부 제어: overlay.open() 같은 명령형 API 가능\n// 2. 타입 안전성: TypeScript로 이벤트 타입 완벽 추론\n// 3. 메모리 안전: React Hook 생명주기와 완벽 동기화\n// 4. 플랫폼 호환: 웹/RN 모두 지원\n// 5. 네임스페이스: 이벤트 충돌 방지\n\nexport { createUseExternalEvents };\n","\n// 이벤트 이름\nexport type EventType = string | symbol;\n\n// 이벤트 핸들러\nexport type Handler<T = unknown> = (event: T) => void;\nexport type WildcardHandler<T = Record<string, unknown>> = (type: keyof T, event: T[keyof T]) => void;\n\n// 이벤트 핸들러 목록\nexport type EventHandlerList<T = unknown> = Array<Handler<T>>;\nexport type WildCardEventHandlerList<T = Record<string, unknown>> = Array<WildcardHandler<T>>;\n\n// 이벤트 핸들러 맵\nexport type EventHandlerMap<Events extends Record<EventType, unknown>> = Map<\n keyof Events | '*',\n EventHandlerList<Events[keyof Events]> | WildCardEventHandlerList<Events>\n>;\n\n// 이벤트 발행기\nexport interface Emitter<Events extends Record<EventType, unknown>> {\n all: EventHandlerMap<Events>;\n\n on<Key extends keyof Events>(type: Key, handler: Handler<Events[Key]>): void;\n on(type: '*', handler: WildcardHandler<Events>): void;\n\n off<Key extends keyof Events>(type: Key, handler?: Handler<Events[Key]>): void;\n off(type: '*', handler: WildcardHandler<Events>): void;\n\n emit<Key extends keyof Events>(type: Key, event: Events[Key]): void;\n emit<Key extends keyof Events>(type: undefined extends Events[Key] ? Key : never): void;\n}\n\nexport function createEmitter<Events extends Record<EventType, unknown>>(\n all?: EventHandlerMap<Events>\n): Emitter<Events> {\n type GenericEventHandler = Handler<Events[keyof Events]> | WildcardHandler<Events>;\n all = all || new Map();\n\n return {\n all,\n on<Key extends keyof Events>(type: Key, handler: GenericEventHandler) {\n const handlers: Array<GenericEventHandler> | undefined = all!.get(type);\n if (handlers) {\n handlers.push(handler);\n } else {\n all!.set(type, [handler] as EventHandlerList<Events[keyof Events]>);\n }\n },\n off<Key extends keyof Events>(type: Key, handler?: GenericEventHandler) {\n const handlers: Array<GenericEventHandler> | undefined = all!.get(type);\n if (handlers) {\n if (handler) {\n handlers.splice(handlers.indexOf(handler) >>> 0, 1);\n } else {\n all!.set(type, []);\n }\n }\n },\n emit<Key extends keyof Events>(type: Key, evt?: Events[Key]) {\n let handlers = all!.get(type);\n if (handlers) {\n (handlers as EventHandlerList<Events[keyof Events]>).slice().forEach((handler) => {\n handler(evt!);\n });\n }\n\n handlers = all!.get('*');\n if (handlers) {\n (handlers as WildCardEventHandlerList<Events>).slice().forEach((handler) => {\n handler(type, evt!);\n });\n }\n },\n };\n}","export function randomId() {\n return `overlay-kit-${Math.random().toString(36).slice(2, 11)}`;\n}","import React from 'react';\n\n/**\n * React 컴포넌트나 함수로부터 이름을 추출합니다.\n * 디버깅 목적으로 사용됩니다.\n */\nexport function getComponentName(controller: any): string {\n // 1. displayName 우선 (개발자가 명시적으로 설정한 이름)\n if (controller?.displayName) {\n return controller.displayName;\n }\n\n // 2. React element인 경우\n if (React.isValidElement(controller)) {\n const type = controller.type as any;\n if (type?.displayName) return type.displayName;\n if (type?.name && type.name !== 'anonymous') return type.name;\n }\n\n // 3. 함수/컴포넌트의 name 속성\n if (typeof controller === 'function') {\n if (controller.name && controller.name !== 'anonymous') {\n return controller.name;\n }\n }\n\n // 4. 래핑된 컴포넌트 (forwardRef, memo 등)\n if (controller?.type?.displayName) {\n return controller.type.displayName;\n }\n if (controller?.type?.name && controller.type.name !== 'anonymous') {\n return controller.type.name;\n }\n\n // 5. Fallback\n return 'Anonymous';\n}\n","import { type Provider, createContext, useContext } from 'react';\n\ntype NullSymbolType = typeof NullSymbol;\nconst NullSymbol = Symbol('Null');\n\nexport type CreateContextReturn<T> = [Provider<T>, () => T];\n\nexport function createSafeContext<T>(displayName?: string): CreateContextReturn<T> {\n const Context = createContext<T | NullSymbolType>(NullSymbol);\n Context.displayName = displayName ?? 'SafeContext';\n\n function useSafeContext() {\n const context = useContext(Context);\n\n if (context === NullSymbol) {\n const error = new Error(`[${Context.displayName}]: Provider not found.`);\n error.name = '[Error] Context';\n\n throw error;\n }\n\n return context;\n }\n\n return [Context.Provider as any, useSafeContext];\n}\n","import { createSafeContext } from '../utils/create-safe-context';\nimport { type OverlayData } from './reducer';\n\n\nexport function createOverlaySafeContext() {\n const [OverlayContextProvider, useOverlayContext] = createSafeContext<OverlayData>('overlay-kit/OverlayContext');\n\n function useCurrentOverlay() {\n return useOverlayContext().current;\n }\n\n function useOverlayData() {\n return useOverlayContext().overlayData;\n }\n\n return { OverlayContextProvider, useCurrentOverlay, useOverlayData };\n}\n","import { OverlayControllerComponent } from \"./provider/content-overlay-controller\";\nimport { BottomSheetControllerComponent } from \"./provider/bottom-sheet-controller\";\nimport { ModalControllerComponent } from \"./provider/modal-controller\";\n\ntype OverlayId = string;\ntype OverlayItem = {\n /**\n * @description 오버레이 고유한 ID\n */\n id : OverlayId;\n /**\n * @description 오버레이 컴포넌트의 고유한 키\n * 컴포넌트가 언마운트시 사용됩니다.\n */\n componentKey: string;\n /**\n * @description 컴포넌트 이름 (디버깅용)\n */\n componentName?: string;\n isOpen: boolean;\n isMounted: boolean;\n controller: OverlayControllerComponent | BottomSheetControllerComponent | ModalControllerComponent;\n overlayType?: 'overlay' | 'bottomSheet' | 'modal';\n options?: any;\n}\nexport type OverlayData = {\n current: OverlayId | null; // 현재 열려있는 오버레이 ID\n overlayOrderList: OverlayId[];\n overlayData: Record<OverlayId, OverlayItem>;\n}\nexport type OverlayReducerAction =\n | { type: 'ADD'; overlay: OverlayItem }\n | { type: 'OPEN'; overlayId: string }\n | { type: 'CLOSE'; overlayId: string }\n | { type: 'REMOVE'; overlayId: string }\n | { type: 'CLOSE_ALL' }\n | { type: 'REMOVE_ALL' };\n\n/**\n * 오버레이를 닫거나 제거할 때, 어떤 오버레이를 현재(current)로 지정할지 결정합니다.\n *\n * @description 마지막 오버레이를 닫을 경우, 그 이전 오버레이를 현재로 지정합니다.\n * @description 중간에 있는 오버레이를 닫을 경우, 마지막 오버레이를 현재로 지정합니다.\n *\n * @example open - [1, 2, 3, 4]\n * close 2 => current: 4\n * close 4 => current: 3\n * close 3 => current: 1\n * close 1 => current: null\n *\n * @param overlayOrderList 오버레이 ID가 순서대로 담긴 리스트\n * @param overlayData 오버레이 데이터 맵\n * @param targetOverlayId 닫거나 제거하려는 오버레이의 ID\n * @returns 현재로 지정될 오버레이의 ID, 없으면 null\n */\nexport const determineCurrentOverlayId = (overlayOrderList: OverlayId[], overlayData: Record<OverlayId, OverlayItem>, targetOverlayId: OverlayId): OverlayId | null => {\n // 1단계: 열린 오버레이들만 필터링\n\n const openedOverlayOrderList = overlayOrderList.filter(\n (orderedOverlayId) => overlayData[orderedOverlayId].isOpen === true\n );\n // 2단계: 닫힐 오버레이의 위치 찾기\n const targetIndexInOpenedList = openedOverlayOrderList.findIndex((item) => item === targetOverlayId);\n\n // 3단계: 다음 활성 오버레이 결정\n return targetIndexInOpenedList === openedOverlayOrderList.length - 1\n ? openedOverlayOrderList[targetIndexInOpenedList - 1] ?? null // 마지막이면 이전 것\n : openedOverlayOrderList[openedOverlayOrderList.length - 1] ?? null;// 중간이면 최상위\n\n}\n\n/** 동작 예시:\n * \n *\n * // 상황: 오버레이 [1, 2, 3, 4]가 순서대로 열려있음\n * overlayOrderList = [\"modal-1\", \"modal-2\", \"modal-3\", \"modal-4\"];\n * // 모두 isOpen: true\n *\n * // 케이스 1: 최상위(4번) 닫기\n * determineCurrentOverlayId(list, data, \"modal-4\");\n * // → \"modal-3\" (바로 아래가 활성화)\n *\n * // 케이스 2: 중간(2번) 닫기\n * determineCurrentOverlayId(list, data, \"modal-2\");\n * // → \"modal-4\" (최상위가 여전히 활성)\n *\n * // 케이스 3: 마지막 남은 것 닫기\n * determineCurrentOverlayId([\"modal-1\"], data, \"modal-1\");\n * // → null (더 이상 활성 오버레이 없음)\n */\n\n// 상태 변경 로직\nexport function overlayReducer(state: OverlayData, action: OverlayReducerAction): OverlayData {\n switch (action.type) {\n case 'ADD': {\n const isExisted = state.overlayOrderList.includes(action.overlay.id);\n const existingOverlay = state.overlayData[action.overlay.id];\n\n // 이미 같은 overlayId를 가진 오버레이가 열려있다면, 중복 추가하지 않고 기존 것을 맨 앞으로 가져오기\n if (isExisted && existingOverlay?.isOpen === true) {\n return {\n ...state,\n current: action.overlay.id,\n // 이미 열려있는 오버레이를 맨 앞으로 이동\n overlayOrderList: [...state.overlayOrderList.filter((item) => item !== action.overlay.id), action.overlay.id],\n };\n }\n\n // 같은 overlayId를 가진 오버레이가 존재하지만 닫혀있는 경우, 다시 열기\n if (isExisted && existingOverlay?.isOpen === false) {\n return {\n ...state,\n current: action.overlay.id,\n // 맨 앞으로 이동\n overlayOrderList: [...state.overlayOrderList.filter((item) => item !== action.overlay.id), action.overlay.id],\n overlayData: {\n ...state.overlayData,\n [action.overlay.id]: { ...existingOverlay, isOpen: true, isMounted: true },\n },\n };\n }\n\n // 새로운 오버레이 추가\n return {\n current: action.overlay.id,\n overlayOrderList: [...state.overlayOrderList, action.overlay.id],\n overlayData: {\n ...state.overlayData,\n [action.overlay.id]: action.overlay,\n },\n };\n }\n case 'OPEN': {\n const overlay = state.overlayData[action.overlayId];\n\n // ignore if the overlay don't exist or already open\n if (overlay == null || overlay.isOpen) {\n return state;\n }\n\n return {\n ...state,\n current: action.overlayId,\n // 닫혀있던 오버레이를 다시 열 때 맨 뒤로 이동시켜 최상단에 표시\n overlayOrderList: [...state.overlayOrderList.filter((item) => item !== action.overlayId), action.overlayId],\n overlayData: {\n ...state.overlayData,\n [action.overlayId]: { ...overlay, isOpen: true, isMounted: true },\n },\n };\n }\n case 'CLOSE': {\n const overlay = state.overlayData[action.overlayId];\n\n // ignore if the overlay don't exist or already closed\n if (overlay == null || !overlay.isOpen) {\n return state;\n }\n\n const currentOverlayId = determineCurrentOverlayId(state.overlayOrderList, state.overlayData, action.overlayId);\n\n return {\n ...state,\n current: currentOverlayId,\n overlayData: {\n ...state.overlayData,\n [action.overlayId]: {\n ...state.overlayData[action.overlayId],\n isOpen: false,\n },\n },\n };\n }\n case 'REMOVE': {\n const overlay = state.overlayData[action.overlayId];\n\n // ignore if the overlay don't exist\n if (overlay == null) {\n return state;\n }\n\n const remainingOverlays = state.overlayOrderList.filter((item) => item !== action.overlayId);\n if (state.overlayOrderList.length === remainingOverlays.length) {\n return state;\n }\n\n const copiedOverlayData = { ...state.overlayData };\n delete copiedOverlayData[action.overlayId];\n\n const currentOverlayId = determineCurrentOverlayId(state.overlayOrderList, state.overlayData, action.overlayId);\n\n return {\n current: currentOverlayId,\n overlayOrderList: remainingOverlays,\n overlayData: copiedOverlayData,\n };\n }\n case 'CLOSE_ALL': {\n // ignore if there is no overlay\n if (Object.keys(state.overlayData).length === 0) {\n return state;\n }\n\n return {\n ...state,\n current: null,\n overlayData: Object.keys(state.overlayData).reduce(\n (prev, curr) => ({\n ...prev,\n [curr]: {\n ...state.overlayData[curr],\n isOpen: false,\n } satisfies OverlayItem,\n }),\n {} satisfies Record<string, OverlayItem>\n ),\n };\n }\n case 'REMOVE_ALL': {\n return { current: null, overlayOrderList: [], overlayData: {} };\n }\n }\n}","import { createOverlayProvider } from '../context/provider';\n\nexport const { overlay, OverlayProvider, useCurrentOverlay, useOverlayData } = createOverlayProvider();\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function experimental_createOverlayContext() {\n return createOverlayProvider();\n}"],"mappings":"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","names":["import_react","import_react_native","import_react","import_react","import_react","ACTIONS","INITIAL_STATE","import_react","PortalStateContext","createContext","PortalDispatchContext","usePortal","hostName","dispatch","useContext","PortalDispatchContext","Error","registerHost","useCallback","type","ACTIONS","REGISTER_HOST","deregisterHost","DEREGISTER_HOST","addUpdatePortal","name","node","ADD_UPDATE_PORTAL","portalName","removePortal","REMOVE_PORTAL","addPortal","updatePortal","PortalComponent","name","_providedName","hostName","handleOnMount","_providedHandleOnMount","handleOnUnmount","_providedHandleOnUnmount","handleOnUpdate","_providedHandleOnUpdate","children","addPortal","addUpdatePortal","removePortal","usePortal","useMemo","nanoid","handleOnMountRef","useRef","handleOnUnmountRef","handleOnUpdateRef","useCallback","current","useEffect","undefined","Portal","memo","displayName","import_react","import_react","usePortalState","hostName","state","useContext","PortalStateContext","Error","PortalHostComponent","name","state","usePortalState","registerHost","deregisterHost","usePortal","useEffect","React","map","item","node","PortalHost","memo","displayName","import_react","isLoggingEnabled","isDev","Boolean","__DEV__","print","isDev","component","method","params","isLoggingEnabled","message","Object","keys","map","key","join","console","log","filter","Boolean","freeze","registerHost","state","hostName","deregisterHost","addUpdatePortal","portalName","node","index","findIndex","item","name","push","removePortal","print","component","reducer","method","params","splice","action","type","clonedState","ACTIONS","REGISTER_HOST","DEREGISTER_HOST","ADD_UPDATE_PORTAL","REMOVE_PORTAL","PortalProviderComponent","rootHostName","shouldAddRootHost","children","state","dispatch","useReducer","reducer","INITIAL_STATE","React","PortalProvider","memo","displayName","import_jsx_runtime","_a","BottomSheet","React","import_react","import_react_native","import_jsx_runtime","React","import_react","import_react","import_react","React","overlayId","React","close","unmount","import_react","useCurrentOverlay","useOverlayData","overlay","import_bottom_sheet","import_jsx_runtime","overlay","useCurrentOverlay","useOverlayData","OverlayProvider","overlayId","_a"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/context/provider/index.tsx","../src/context/provider/content-overlay-controller.tsx","../src/context/provider/bottom-sheet-controller.tsx","../node_modules/@gorhom/portal/lib/module/components/portal/Portal.tsx","../node_modules/nanoid/non-secure/index.js","../node_modules/@gorhom/portal/lib/module/hooks/usePortal.ts","../node_modules/@gorhom/portal/lib/module/state/constants.ts","../node_modules/@gorhom/portal/lib/module/contexts/portal.ts","../node_modules/@gorhom/portal/lib/module/components/portalHost/PortalHost.tsx","../node_modules/@gorhom/portal/lib/module/hooks/usePortalState.ts","../node_modules/@gorhom/portal/lib/module/components/portalProvider/PortalProvider.tsx","../node_modules/@gorhom/portal/lib/module/utilities/logger.ts","../node_modules/@gorhom/portal/lib/module/state/reducer.ts","../src/context/provider/modal-controller.tsx","../src/event.ts","../src/utils/create-use-external-events.ts","../src/utils/emitter.ts","../src/utils/random-id.ts","../src/utils/get-component-name.ts","../src/utils/create-safe-context.ts","../src/context/context.ts","../src/context/reducer.ts","../src/utils/create-overlay-context.tsx"],"sourcesContent":["export * from \"./utils\";\nexport { overlay, OverlayProvider, useCurrentOverlay, useOverlayData } from \"./utils/create-overlay-context\";\nexport type {\n OverlayControllerComponent,\n OverlayAsyncControllerComponent,\n} from \"./context/provider/content-overlay-controller\";\nexport type { BottomSheetControllerComponent } from \"./context/provider/bottom-sheet-controller\";\nexport type { ModalControllerComponent } from \"./context/provider/modal-controller\";\n","import {\n useCallback,\n useEffect,\n useReducer,\n useRef,\n type PropsWithChildren,\n} from \"react\";\nimport { BackHandler, Platform, View } from \"react-native\";\nimport { ContentOverlayController } from \"./content-overlay-controller\";\nimport { ContentBottomSheetController } from \"./bottom-sheet-controller\";\nimport { ContentModalController } from \"./modal-controller\";\nimport { type OverlayEvent, createOverlay } from \"../../event\";\nimport { randomId } from \"../../utils/random-id\";\nimport { createOverlaySafeContext } from \"../context\";\nimport { overlayReducer } from \"../reducer\";\nimport { GestureHandlerRootView } from \"react-native-gesture-handler\";\nimport { BottomSheetModalProvider } from \"@gorhom/bottom-sheet\";\nimport { PortalProvider, PortalHost } from \"@gorhom/portal\";\n\nexport function createOverlayProvider() {\n const overlayId = randomId();\n const { useOverlayEvent, ...overlay } = createOverlay(overlayId);\n\n const { OverlayContextProvider, useCurrentOverlay, useOverlayData } =\n createOverlaySafeContext();\n\n function OverlayProvider({ children }: PropsWithChildren) {\n const [overlayState, overlayDispatch] = useReducer(overlayReducer, {\n current: null,\n overlayOrderList: [],\n overlayData: {},\n });\n const overlayStateRef = useRef(overlayState);\n\n useEffect(() => {\n overlayStateRef.current = overlayState;\n }, [overlayState]);\n\n // Overlay 이벤트 핸들러들\n const overlayOpen: OverlayEvent[\"open\"] = useCallback(\n ({\n controller,\n overlayId,\n componentKey,\n componentName,\n overlayType = \"overlay\",\n options,\n }) => {\n overlayDispatch({\n type: \"ADD\",\n overlay: {\n id: overlayId,\n componentKey,\n componentName,\n isOpen: true,\n isMounted: true,\n controller: controller,\n overlayType,\n options,\n },\n });\n },\n []\n );\n\n const close = useCallback((overlayId: string) => {\n overlayDispatch({ type: \"CLOSE\", overlayId });\n }, []);\n\n const unmount = useCallback((overlayId: string) => {\n overlayDispatch({ type: \"REMOVE\", overlayId });\n }, []);\n\n const closeAll = useCallback(() => {\n overlayDispatch({ type: \"CLOSE_ALL\" });\n }, []);\n\n const unmountAll = useCallback(() => {\n overlayDispatch({ type: \"REMOVE_ALL\" });\n }, []);\n\n // 이벤트 리스너 등록\n useOverlayEvent({\n open: overlayOpen,\n close,\n unmount,\n closeAll,\n unmountAll,\n });\n\n useEffect(() => {\n return () => {\n overlayDispatch({ type: \"REMOVE_ALL\" });\n };\n }, []);\n\n useEffect(() => {\n if (Platform.OS !== \"android\") {\n return;\n }\n\n const onHardwareBackPress = () => {\n const { overlayOrderList, overlayData } = overlayStateRef.current;\n\n for (let idx = overlayOrderList.length - 1; idx >= 0; idx -= 1) {\n const currentOverlayId = overlayOrderList[idx];\n const overlayItem = overlayData[currentOverlayId];\n\n if (!overlayItem?.isOpen) {\n continue;\n }\n\n if (\n overlayItem.overlayType === \"modal\" ||\n overlayItem.overlayType === \"bottomSheet\"\n ) {\n overlayDispatch({ type: \"REMOVE\", overlayId: currentOverlayId });\n return true;\n }\n }\n\n return false;\n };\n\n const subscription = BackHandler.addEventListener(\n \"hardwareBackPress\",\n onHardwareBackPress\n );\n\n return () => {\n subscription.remove();\n };\n }, [overlayDispatch, overlayState.overlayOrderList]);\n\n return (\n <GestureHandlerRootView style={{ flex: 1 }}>\n <PortalProvider>\n <BottomSheetModalProvider>\n <OverlayContextProvider value={overlayState}>\n {children}\n\n {/* 1) Modal/Overlay 먼저 렌더: BottomSheet가 열려있으면 모달은 숨김 */}\n {overlayState.overlayOrderList.map((item) => {\n const overlayItem = overlayState.overlayData[item];\n const {\n id: currentOverlayId,\n componentKey,\n isOpen,\n controller: Controller,\n overlayType,\n options,\n } = overlayItem;\n\n if (overlayType === \"bottomSheet\") return null;\n\n // hasOpenBottomSheet 계산 (모달은 항상 마운트 유지, 대신 '가려짐' 상태만 전달)\n const hasOpenBottomSheet = overlayState.overlayOrderList.some(\n (id) =>\n overlayState.overlayData[id]?.overlayType ===\n \"bottomSheet\" && overlayState.overlayData[id]?.isOpen\n );\n\n if (overlayType === \"modal\") {\n const sameTypeOverlays = overlayState.overlayOrderList.filter(\n (id) =>\n overlayState.overlayData[id]?.overlayType === \"modal\" &&\n overlayState.overlayData[id]?.isOpen\n );\n const isTopModal =\n sameTypeOverlays[sameTypeOverlays.length - 1] ===\n currentOverlayId;\n const shouldShow = isOpen && isTopModal; // ★ 더 이상 닫지 않음\n\n return (\n <ContentModalController\n key={componentKey}\n isOpen={isOpen}\n controller={Controller as any}\n overlayId={currentOverlayId}\n overlayDispatch={overlayDispatch}\n overlayOrderList={overlayState.overlayOrderList}\n options={{\n ...options,\n coveredByBottomSheet: hasOpenBottomSheet,\n }}\n />\n );\n }\n\n // fallback: overlay\n return (\n <ContentOverlayController\n key={componentKey}\n isOpen={isOpen}\n controller={Controller as any}\n overlayId={currentOverlayId}\n overlayDispatch={overlayDispatch}\n />\n );\n })}\n\n {/* 2) BottomSheet는 항상 마지막에 렌더 */}\n {overlayState.overlayOrderList.map((item) => {\n const overlayItem = overlayState.overlayData[item];\n const {\n id: currentOverlayId,\n componentKey,\n isOpen,\n controller: Controller,\n overlayType,\n options,\n } = overlayItem;\n\n if (overlayType !== \"bottomSheet\") return null;\n\n const sameTypeOverlays = overlayState.overlayOrderList.filter(\n (id) =>\n overlayState.overlayData[id]?.overlayType ===\n \"bottomSheet\" && overlayState.overlayData[id]?.isOpen\n );\n const isTopBottomSheet =\n sameTypeOverlays[sameTypeOverlays.length - 1] ===\n currentOverlayId;\n const shouldShow = isOpen && isTopBottomSheet;\n\n return (\n <ContentBottomSheetController\n key={componentKey}\n isOpen={isOpen}\n controller={Controller as any}\n overlayId={currentOverlayId}\n overlayDispatch={overlayDispatch}\n overlayOrderList={overlayState.overlayOrderList}\n options={options}\n />\n );\n })}\n\n {/* Portal hosts for modals, ordered by overlayOrderList index (controls stacking) */}\n {overlayState.overlayOrderList.map((id, idx) => (\n <PortalHost\n key={`overlay-modal-${idx}`}\n name={`overlay-modal-${idx}`}\n />\n ))}\n </OverlayContextProvider>\n </BottomSheetModalProvider>\n </PortalProvider>\n </GestureHandlerRootView>\n );\n }\n\n return {\n overlay,\n OverlayProvider,\n useCurrentOverlay,\n useOverlayData,\n };\n}\n","import React, { type FC, memo, useEffect, type Dispatch } from \"react\";\nimport { Modal } from \"react-native\";\nimport { type OverlayReducerAction } from \"../reducer\";\n\ntype OverlayControllerProps = {\n overlayId: string;\n isOpen: boolean;\n close: () => void;\n unmount: () => void;\n};\n\ntype OverlayAsyncControllerProps<T> = Omit<OverlayControllerProps, \"close\"> & {\n close: (param: T) => void;\n};\n\nexport type OverlayControllerComponent = FC<OverlayControllerProps>;\nexport type OverlayAsyncControllerComponent<T> = FC<\n OverlayAsyncControllerProps<T>\n>;\n\ntype ContentOverlayControllerProps = {\n isOpen: boolean;\n overlayId: string;\n overlayDispatch: Dispatch<OverlayReducerAction>;\n controller: OverlayControllerComponent;\n};\n\nexport const ContentOverlayController = memo(\n ({\n isOpen,\n overlayId,\n overlayDispatch,\n controller: Controller,\n }: ContentOverlayControllerProps) => {\n useEffect(() => {\n setImmediate(() => {\n overlayDispatch({ type: \"OPEN\", overlayId });\n });\n }, [overlayDispatch, overlayId]);\n\n const handleClose = () => {\n overlayDispatch({ type: \"CLOSE\", overlayId });\n // 커스텀 애니메이션을 위한 짧은 딜레이 후 메모리에서 제거\n setTimeout(() => {\n overlayDispatch({ type: \"REMOVE\", overlayId });\n }, 200);\n };\n\n return (\n <Controller\n isOpen={isOpen}\n overlayId={overlayId}\n close={handleClose}\n unmount={() => overlayDispatch({ type: \"REMOVE\", overlayId })}\n />\n );\n }\n);\n","import React, {\n type FC,\n memo,\n useEffect,\n useRef,\n type Dispatch,\n useCallback,\n useState,\n useMemo,\n} from \"react\";\nimport BottomSheet, {\n BottomSheetModal,\n BottomSheetView,\n BottomSheetFlatList,\n BottomSheetScrollView,\n BottomSheetBackdrop,\n BottomSheetModalProvider,\n BottomSheetTextInput,\n BottomSheetFooterProps,\n} from \"@gorhom/bottom-sheet\";\n\nimport {\n StyleProp,\n ViewStyle,\n ListRenderItem,\n View,\n StyleSheet,\n Platform,\n Keyboard,\n} from \"react-native\";\nimport { useReducedMotion, Easing } from \"react-native-reanimated\";\nimport { type OverlayReducerAction } from \"../reducer\";\nimport { Portal } from \"@gorhom/portal\";\n\ntype BottomSheetControllerProps<T = any> = {\n overlayId: string;\n isOpen: boolean;\n close: () => void;\n unmount: () => void;\n snapPoints?: (string | number)[];\n enablePanDownToClose?: boolean;\n // Enhanced features\n header?: React.ReactNode;\n footer?: React.ReactNode;\n children?: React.ReactNode;\n // FlatList support\n isFlatList?: boolean;\n data?: ArrayLike<T> | null | undefined;\n renderItem?: ListRenderItem<T> | null | undefined;\n keyExtractor?: ((item: T, index: number) => string) | undefined;\n contentContainerStyle?: StyleProp<ViewStyle> | undefined;\n ItemSeparatorComponent?: React.ComponentType<any> | null | undefined;\n flatListHeader?: React.ReactNode;\n flatListFooter?: React.ReactNode;\n // Backdrop\n enableBackdrop?: boolean;\n backdropOpacity?: number;\n onBackdropPress?: () => void;\n // Dynamic sizing\n enableDynamicSizing?: boolean;\n // Scrolling\n enableScrolling?: boolean;\n // Styling\n backgroundStyle?: StyleProp<ViewStyle>;\n handleStyle?: StyleProp<ViewStyle>;\n // Loading & empty state\n isLoading?: boolean;\n emptyText?: string;\n extraData?: any;\n};\n\nexport type BottomSheetControllerComponent<T = any> = FC<\n BottomSheetControllerProps<T>\n>;\n\ntype ContentBottomSheetControllerProps = {\n isOpen: boolean;\n overlayId: string;\n overlayDispatch: Dispatch<OverlayReducerAction>;\n controller: BottomSheetControllerComponent | React.ReactElement;\n overlayOrderList: string[];\n options?: {\n snapPoints?: (string | number)[];\n enablePanDownToClose?: boolean;\n enableBackdrop?: boolean;\n backdropOpacity?: number;\n enableDynamicSizing?: boolean;\n backgroundStyle?: StyleProp<ViewStyle>;\n handleStyle?: StyleProp<ViewStyle>;\n keyboardBehavior?: \"interactive\" | \"extend\" | \"fillParent\";\n keyboardBlurBehavior?: \"restore\" | \"none\";\n androidKeyboardInputMode?: \"adjustResize\" | \"adjustPan\";\n closeAllOnGestureClose?: boolean;\n closeFunction?: () => void;\n isHandleClose?: boolean;\n [key: string]: any;\n };\n};\n\nexport const ContentBottomSheetController = memo(\n ({\n isOpen,\n overlayId,\n overlayDispatch,\n controller: Controller,\n overlayOrderList,\n options = {},\n }: ContentBottomSheetControllerProps) => {\n const bottomSheetRef = useRef<BottomSheet>(null);\n const reducedMotion = useReducedMotion();\n const isClosingRef = useRef(false);\n const closeTimerRef = useRef<NodeJS.Timeout | null>(null);\n\n // 빠른 닫힘 애니메이션 설정\n const animationConfigs = useMemo(\n () => ({\n duration: 200, // 200ms로 빠르게\n easing: Easing.out(Easing.cubic),\n }),\n []\n );\n\n // Use react-native-keyboard-controller for keyboard tracking (number type)\n const [keyboardHeight, setKeyboardHeight] = useState(0);\n const isKeyboardActiveRef = useRef(false);\n\n // 키보드 상태 감지 (빠른 반응을 위해 ref 사용)\n useEffect(() => {\n const keyboardWillShowListener = Keyboard.addListener(\n Platform.OS === \"ios\" ? \"keyboardWillShow\" : \"keyboardDidShow\",\n (e) => {\n isKeyboardActiveRef.current = true;\n setKeyboardHeight(e.endCoordinates.height);\n }\n );\n const keyboardWillHideListener = Keyboard.addListener(\n Platform.OS === \"ios\" ? \"keyboardWillHide\" : \"keyboardDidHide\",\n () => {\n isKeyboardActiveRef.current = false;\n setKeyboardHeight(0);\n }\n );\n\n return () => {\n keyboardWillShowListener.remove();\n keyboardWillHideListener.remove();\n };\n }, []);\n\n const getZIndex = () => {\n const index = overlayOrderList.indexOf(overlayId);\n // bottomSheet는 항상 modal보다 앞에 나오도록 훨씬 높은 zIndex 사용\n return 1000 + index;\n };\n\n // --- Android keyboard handling defaults ---\n // On Android, the sheet won't move with the keyboard unless:\n // 1) Activity windowSoftInputMode = \"adjustResize\"\n // 2) bottom-sheet uses keyboardBehavior=\"extend\"\n // 3) Text inputs inside sheet use BottomSheetTextInput\n\n const {\n snapPoints,\n enablePanDownToClose = true,\n enableBackdrop = true,\n backdropOpacity = 0.5,\n enableDynamicSizing = true,\n backgroundStyle = {},\n handleStyle = {},\n keyboardBehavior = Platform.OS === \"android\" ? \"extend\" : \"interactive\",\n keyboardBlurBehavior = \"restore\",\n androidKeyboardInputMode = \"adjustResize\",\n closeAllOnGestureClose = false,\n isHandleClose = true,\n closeFunction,\n ...restOptions\n } = options;\n\n useEffect(() => {\n if (isOpen) {\n // 바텀시트가 열릴 때 플래그와 타이머 초기화\n isClosingRef.current = false;\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n\n const rafId = requestAnimationFrame(() => {\n bottomSheetRef.current?.expand();\n overlayDispatch({ type: \"OPEN\", overlayId });\n });\n return () => cancelAnimationFrame(rafId);\n } else {\n // bottomSheetRef.current?.close();\n }\n }, [isOpen, overlayDispatch, overlayId]);\n\n // 컴포넌트 언마운트 시 타이머 정리\n useEffect(() => {\n return () => {\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n isClosingRef.current = false;\n };\n }, []);\n\n // 키보드가 열려있다면 먼저 닫고, 그 다음 바텀시트 닫기\n const handleClose = useCallback(() => {\n // 이미 닫히는 중이면 무시 (중복 클릭 방지)\n if (isClosingRef.current) {\n return;\n }\n isClosingRef.current = true;\n\n // 기존 타이머가 있다면 정리\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n\n // 키보드가 활성화되어 있으면 먼저 키보드를 닫기\n if (keyboardHeight > 0) {\n Keyboard.dismiss();\n // 키보드 닫히는 애니메이션 시간을 최소화\n closeTimerRef.current = setTimeout(() => {\n closeTimerRef.current = null;\n\n if (closeAllOnGestureClose) {\n overlayDispatch({ type: \"REMOVE_ALL\" });\n } else {\n overlayDispatch({ type: \"REMOVE\", overlayId });\n }\n\n if (closeFunction) {\n closeFunction();\n }\n\n // 작업 완료 후 플래그 리셋\n isClosingRef.current = false;\n }, 50);\n return;\n }\n\n // 키보드가 활성화되어 있지 않으면 즉시 바텀시트 닫기\n // requestAnimationFrame으로 한 프레임만 대기 후 즉시 제거\n requestAnimationFrame(() => {\n if (closeAllOnGestureClose) {\n overlayDispatch({ type: \"REMOVE_ALL\" });\n } else {\n overlayDispatch({ type: \"REMOVE\", overlayId });\n }\n if (closeFunction) {\n closeFunction();\n }\n\n // 작업 완료 후 플래그 리셋\n isClosingRef.current = false;\n });\n }, [\n overlayDispatch,\n overlayId,\n closeAllOnGestureClose,\n closeFunction,\n keyboardHeight,\n ]);\n\n // 백드롭 렌더링\n const renderBackdrop = useCallback(\n (props: any) => (\n <BottomSheetBackdrop\n {...props}\n appearsOnIndex={1}\n disappearsOnIndex={-1}\n opacity={backdropOpacity}\n // pressBehavior=\"close\"\n onPress={handleClose}\n />\n ),\n [backdropOpacity, handleClose]\n );\n\n // callbacks\n const handleSheetChange = useCallback((index: number) => {}, []);\n const getLayerIndex = () => {\n return Math.max(0, overlayOrderList.indexOf(overlayId));\n };\n if (!isOpen) return null;\n\n return (\n <Portal hostName={`overlay-modal-${getLayerIndex()}`}>\n <BottomSheet\n style={[{ zIndex: getZIndex() }]}\n ref={bottomSheetRef}\n onChange={handleSheetChange}\n android_keyboardInputMode={androidKeyboardInputMode}\n keyboardBehavior={keyboardBehavior}\n snapPoints={enableDynamicSizing ? undefined : snapPoints}\n enablePanDownToClose={enablePanDownToClose}\n onClose={isHandleClose ? handleClose : undefined}\n bottomInset={Platform.OS === \"android\" ? keyboardHeight : 0}\n keyboardBlurBehavior={keyboardBlurBehavior}\n animationConfigs={animationConfigs}\n // index={0}\n backdropComponent={enableBackdrop ? renderBackdrop : undefined}\n backgroundStyle={[\n {\n borderTopLeftRadius: 16,\n borderTopRightRadius: 16,\n },\n backgroundStyle,\n ]}\n handleStyle={[\n {\n backgroundColor: \"transparent\",\n borderTopLeftRadius: 16,\n borderTopRightRadius: 16,\n },\n handleStyle,\n ]}\n enableDynamicSizing={enableDynamicSizing}\n animateOnMount={!reducedMotion}\n >\n {React.isValidElement(Controller)\n ? React.cloneElement(Controller as React.ReactElement<any>, {\n close: () => overlayDispatch({ type: \"CLOSE\", overlayId }),\n unmount: () => overlayDispatch({ type: \"REMOVE\", overlayId }),\n })\n : React.createElement(Controller as any, {\n isOpen,\n overlayId,\n snapPoints,\n enablePanDownToClose,\n close: () => overlayDispatch({ type: \"CLOSE\", overlayId }),\n unmount: () => overlayDispatch({ type: \"REMOVE\", overlayId }),\n ...restOptions,\n })}\n </BottomSheet>\n </Portal>\n );\n }\n);\n","import { memo, useCallback, useEffect, useMemo, useRef } from 'react';\nimport { nanoid } from 'nanoid/non-secure';\nimport { usePortal } from '../../hooks/usePortal';\nimport type { PortalProps } from './types';\n\nconst PortalComponent = ({\n name: _providedName,\n hostName,\n handleOnMount: _providedHandleOnMount,\n handleOnUnmount: _providedHandleOnUnmount,\n handleOnUpdate: _providedHandleOnUpdate,\n children,\n}: PortalProps) => {\n //#region hooks\n const { addPortal: addUpdatePortal, removePortal } = usePortal(hostName);\n //#endregion\n\n //#region variables\n const name = useMemo(() => _providedName || nanoid(), [_providedName]);\n //#endregion\n\n //#region refs\n const handleOnMountRef = useRef<Function>();\n const handleOnUnmountRef = useRef<Function>();\n const handleOnUpdateRef = useRef<Function>();\n //#endregion\n\n //#region callbacks\n const handleOnMount = useCallback(() => {\n if (_providedHandleOnMount) {\n _providedHandleOnMount(() => addUpdatePortal(name, children));\n } else {\n addUpdatePortal(name, children);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [_providedHandleOnMount, addUpdatePortal]);\n handleOnMountRef.current = handleOnMount;\n\n const handleOnUnmount = useCallback(() => {\n if (_providedHandleOnUnmount) {\n _providedHandleOnUnmount(() => removePortal(name));\n } else {\n removePortal(name);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [_providedHandleOnUnmount, removePortal]);\n handleOnUnmountRef.current = handleOnUnmount;\n\n const handleOnUpdate = useCallback(() => {\n if (_providedHandleOnUpdate) {\n _providedHandleOnUpdate(() => addUpdatePortal(name, children));\n } else {\n addUpdatePortal(name, children);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [_providedHandleOnUpdate, addUpdatePortal, children]);\n handleOnUpdateRef.current = handleOnUpdate;\n //#endregion\n\n //#region effects\n useEffect(() => {\n handleOnMountRef.current?.();\n return () => {\n handleOnUnmountRef.current?.();\n\n // remove callbacks refs\n handleOnMountRef.current = undefined;\n handleOnUnmountRef.current = undefined;\n handleOnUpdateRef.current = undefined;\n };\n }, []);\n useEffect(() => {\n handleOnUpdateRef.current?.();\n }, [children]);\n //#endregion\n\n return null;\n};\n\nexport const Portal = memo(PortalComponent);\nPortal.displayName = 'Portal';\n","let urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\nlet customAlphabet = (alphabet, defaultSize = 21) => {\n return (size = defaultSize) => {\n let id = ''\n let i = size | 0\n while (i--) {\n id += alphabet[(Math.random() * alphabet.length) | 0]\n }\n return id\n }\n}\nlet nanoid = (size = 21) => {\n let id = ''\n let i = size | 0\n while (i--) {\n id += urlAlphabet[(Math.random() * 64) | 0]\n }\n return id\n}\nexport { nanoid, customAlphabet }\n","import { ReactNode, useCallback, useContext } from 'react';\nimport { ACTIONS } from '../state/constants';\nimport { PortalDispatchContext } from '../contexts/portal';\n\nexport const usePortal = (hostName: string = 'root') => {\n const dispatch = useContext(PortalDispatchContext);\n\n if (dispatch === null) {\n throw new Error(\n \"'PortalDispatchContext' cannot be null, please add 'PortalProvider' to the root component.\"\n );\n }\n\n //#region methods\n const registerHost = useCallback(() => {\n dispatch({\n type: ACTIONS.REGISTER_HOST,\n hostName: hostName,\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const deregisterHost = useCallback(() => {\n dispatch({\n type: ACTIONS.DEREGISTER_HOST,\n hostName: hostName,\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const addUpdatePortal = useCallback((name: string, node: ReactNode) => {\n dispatch({\n type: ACTIONS.ADD_UPDATE_PORTAL,\n hostName,\n portalName: name,\n node,\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const removePortal = useCallback((name: string) => {\n dispatch({\n type: ACTIONS.REMOVE_PORTAL,\n hostName,\n portalName: name,\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n //#endregion\n\n return {\n registerHost,\n deregisterHost,\n addPortal: addUpdatePortal,\n updatePortal: addUpdatePortal,\n removePortal,\n };\n};\n","enum ACTIONS {\n REGISTER_HOST,\n DEREGISTER_HOST,\n ADD_UPDATE_PORTAL,\n REMOVE_PORTAL,\n}\n\nconst INITIAL_STATE = {};\n\nexport { ACTIONS, INITIAL_STATE };\n","import { createContext } from 'react';\nimport type { ActionTypes } from '../state/types';\nimport type { PortalType } from '../types';\n\nexport const PortalStateContext = createContext<Record<\n string,\n Array<PortalType>\n> | null>(null);\nexport const PortalDispatchContext =\n createContext<React.Dispatch<ActionTypes> | null>(null);\n","import React, { memo, useEffect } from 'react';\nimport { usePortalState } from '../../hooks/usePortalState';\nimport { usePortal } from '../../hooks/usePortal';\nimport type { PortalHostProps } from './types';\n\nconst PortalHostComponent = ({ name }: PortalHostProps) => {\n //#region hooks\n const state = usePortalState(name);\n const { registerHost, deregisterHost } = usePortal(name);\n //#endregion\n\n //#region effects\n useEffect(() => {\n registerHost();\n return () => {\n deregisterHost();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n //#endregion\n\n //#region render\n return <>{state.map(item => item.node)}</>;\n //#endregion\n};\n\nexport const PortalHost = memo(PortalHostComponent);\nPortalHost.displayName = 'PortalHost';\n","import { useContext } from 'react';\nimport { PortalStateContext } from '../contexts/portal';\n\nexport const usePortalState = (hostName: string) => {\n const state = useContext(PortalStateContext);\n\n if (state === null) {\n throw new Error(\n \"'PortalStateContext' cannot be null, please add 'PortalProvider' to the root component.\"\n );\n }\n\n return state[hostName] || [];\n};\n","import React, { memo, useReducer } from 'react';\nimport { PortalHost } from '../portalHost/PortalHost';\nimport {\n PortalDispatchContext,\n PortalStateContext,\n} from '../../contexts/portal';\nimport { INITIAL_STATE } from '../../state/constants';\nimport { reducer } from '../../state/reducer';\nimport type { PortalProviderProps } from './types';\n\nconst PortalProviderComponent = ({\n rootHostName = 'root',\n shouldAddRootHost = true,\n children,\n}: PortalProviderProps) => {\n const [state, dispatch] = useReducer(reducer, INITIAL_STATE);\n return (\n <PortalDispatchContext.Provider value={dispatch}>\n <PortalStateContext.Provider value={state}>\n {children}\n {shouldAddRootHost && <PortalHost name={rootHostName} />}\n </PortalStateContext.Provider>\n </PortalDispatchContext.Provider>\n );\n};\n\nexport const PortalProvider = memo(PortalProviderComponent);\nPortalProvider.displayName = 'PortalProvider';\n","interface PrintOptions {\n component?: string;\n method?: string;\n params?: Record<string, any> | string | number | boolean;\n}\n\ntype Print = (options: PrintOptions) => void;\n\nlet isLoggingEnabled = false;\n\n// __DEV__ global is by default not defined in React Native Web builds\nconst isDev = Boolean(typeof __DEV__ !== 'undefined' && __DEV__)\n\nconst enableLogging = () => {\n if (!isDev) {\n console.warn('[Portal] could not enable logging on production!');\n return;\n }\n isLoggingEnabled = true;\n};\n\nlet print: Print = () => {};\n\nif (isDev) {\n print = ({ component, method, params }) => {\n if (!isLoggingEnabled) {\n return;\n }\n let message = '';\n\n if (typeof params === 'object') {\n message = Object.keys(params)\n .map(key => `${key}:${params[key]}`)\n .join(' ');\n } else {\n message = `${params ?? ''}`;\n }\n console.log(\n `[Portal::${[component, method].filter(Boolean).join('::')}]`,\n message\n );\n };\n}\n\nObject.freeze(print);\n\nexport { print, enableLogging };\n","import { ACTIONS } from './constants';\nimport { print } from '../utilities/logger';\nimport type { PortalType } from '../types';\nimport type {\n ActionTypes,\n AddUpdatePortalAction,\n RemovePortalAction,\n} from './types';\n\nconst registerHost = (\n state: Record<string, Array<PortalType>>,\n hostName: string\n) => {\n if (!(hostName in state)) {\n state[hostName] = [];\n }\n return state;\n};\n\nconst deregisterHost = (\n state: Record<string, Array<PortalType>>,\n hostName: string\n) => {\n delete state[hostName];\n return state;\n};\n\nconst addUpdatePortal = (\n state: Record<string, Array<PortalType>>,\n hostName: string,\n portalName: string,\n node: any\n) => {\n if (!(hostName in state)) {\n state = registerHost(state, hostName);\n }\n\n /**\n * updated portal, if it was already added.\n */\n const index = state[hostName].findIndex(item => item.name === portalName);\n if (index !== -1) {\n state[hostName][index].node = node;\n } else {\n state[hostName].push({\n name: portalName,\n node,\n });\n }\n return state;\n};\n\nconst removePortal = (\n state: Record<string, Array<PortalType>>,\n hostName: string,\n portalName: string\n) => {\n if (!(hostName in state)) {\n print({\n component: reducer.name,\n method: removePortal.name,\n params: `Failed to remove portal '${portalName}', '${hostName}' was not registered!`,\n });\n return state;\n }\n\n const index = state[hostName].findIndex(item => item.name === portalName);\n if (index !== -1) state[hostName].splice(index, 1);\n return state;\n};\n\nexport const reducer = (\n state: Record<string, Array<PortalType>>,\n action: ActionTypes\n) => {\n const { type } = action;\n let clonedState = { ...state };\n switch (type) {\n case ACTIONS.REGISTER_HOST:\n return registerHost(clonedState, action.hostName);\n case ACTIONS.DEREGISTER_HOST:\n return deregisterHost(clonedState, action.hostName);\n case ACTIONS.ADD_UPDATE_PORTAL:\n return addUpdatePortal(\n clonedState,\n action.hostName,\n (action as AddUpdatePortalAction).portalName,\n (action as AddUpdatePortalAction).node\n );\n case ACTIONS.REMOVE_PORTAL:\n return removePortal(\n clonedState,\n action.hostName,\n (action as RemovePortalAction).portalName\n );\n default:\n return state;\n }\n};\n","// modal-controller.tsx\nimport React, { type FC, memo, useEffect, useState } from \"react\";\nimport {\n View,\n Animated,\n StyleSheet,\n Dimensions,\n Pressable,\n Keyboard,\n} from \"react-native\";\nimport { Portal } from \"@gorhom/portal\";\nimport { type OverlayReducerAction } from \"../reducer\";\n\ntype ModalControllerProps = {\n overlayId: string;\n isOpen: boolean;\n close: () => void;\n unmount: () => void;\n modalType?: \"center\" | \"bottom\" | \"top\" | \"left\" | \"right\";\n backdropOpacity?: number;\n animationType?: \"none\" | \"slide\" | \"fade\";\n swipeDirection?:\n | \"up\"\n | \"down\"\n | \"left\"\n | \"right\"\n | Array<\"up\" | \"down\" | \"left\" | \"right\">;\n};\n\nexport type ModalControllerComponent<T = {}> = FC<ModalControllerProps & T>;\n\ntype ContentModalControllerProps = {\n isOpen: boolean;\n overlayId: string;\n overlayDispatch: React.Dispatch<OverlayReducerAction>;\n controller: ModalControllerComponent | React.ReactElement;\n overlayOrderList: string[];\n options?: {\n modalType?: \"center\" | \"bottom\" | \"top\" | \"left\" | \"right\";\n backdropOpacity?: number;\n animationType?: \"none\" | \"slide\" | \"fade\";\n swipeDirection?:\n | \"up\"\n | \"down\"\n | \"left\"\n | \"right\"\n | Array<\"up\" | \"down\" | \"left\" | \"right\">;\n closeFunction?: () => void;\n // coveredByBottomSheet?: boolean;\n };\n};\n\nconst { width: SCREEN_WIDTH, height: SCREEN_HEIGHT } = Dimensions.get(\"window\");\n\nexport const ContentModalController = memo(\n ({\n isOpen,\n overlayId,\n overlayDispatch,\n controller: Controller,\n overlayOrderList,\n options = {},\n }: ContentModalControllerProps) => {\n const {\n modalType = \"center\",\n backdropOpacity = 0.5,\n animationType = \"fade\",\n swipeDirection,\n closeFunction,\n } = options;\n\n const [backdropAnimation] = useState(new Animated.Value(0));\n const [contentAnimation] = useState(new Animated.Value(0));\n const [mounted, setMounted] = useState<boolean>(isOpen);\n const [isClosing, setIsClosing] = useState(false);\n\n useEffect(() => {\n if (isOpen) {\n // ensure mounted before playing open animation\n if (!mounted) setMounted(true);\n setImmediate(() => {\n overlayDispatch({ type: \"OPEN\", overlayId });\n });\n Animated.parallel([\n Animated.timing(backdropAnimation, {\n toValue: 1,\n duration: 300,\n useNativeDriver: true,\n }),\n Animated.timing(contentAnimation, {\n toValue: 1,\n duration: 300,\n useNativeDriver: true,\n }),\n ]).start();\n } else {\n // play close animation, then unmount to avoid touch blocking\n Animated.parallel([\n Animated.timing(backdropAnimation, {\n toValue: 0,\n duration: 200,\n useNativeDriver: true,\n }),\n Animated.timing(contentAnimation, {\n toValue: 0,\n duration: 200,\n useNativeDriver: true,\n }),\n ]).start(() => {\n setMounted(false);\n // 애니메이션 끝나면 메모리에서 완전히 제거\n overlayDispatch({ type: \"REMOVE\", overlayId });\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen]);\n\n const handleClose = () => {\n // 이미 닫히는 중이면 무시 (중복 클릭 방지)\n if (isClosing) {\n return;\n }\n setIsClosing(true);\n\n // 키보드가 열려있다면 먼저 닫기\n Keyboard.dismiss();\n\n // 즉시 모달 닫기 (requestAnimationFrame으로 한 프레임만 대기)\n requestAnimationFrame(() => {\n overlayDispatch({ type: \"REMOVE\", overlayId });\n\n if (closeFunction) {\n closeFunction();\n }\n });\n };\n\n const getLayerIndex = () => {\n return Math.max(0, overlayOrderList.indexOf(overlayId));\n };\n\n const getZIndex = () => {\n const index = overlayOrderList.indexOf(overlayId);\n // modal은 bottomSheet보다 앞에 나오도록 더 높은 zIndex 사용\n return 1000 + index;\n };\n\n const getContainerStyle = () => {\n switch (modalType) {\n case \"bottom\":\n return styles.bottomContainer;\n case \"top\":\n return styles.topContainer;\n case \"left\":\n return styles.leftContainer;\n case \"right\":\n return styles.rightContainer;\n default:\n return styles.centerContainer;\n }\n };\n\n const getContentAnimationStyle = () => {\n const baseOpacity = { opacity: contentAnimation };\n\n switch (modalType) {\n case \"bottom\":\n return {\n ...baseOpacity,\n transform: [\n {\n translateY: contentAnimation.interpolate({\n inputRange: [0, 1],\n outputRange: [SCREEN_HEIGHT, 0],\n }),\n },\n ],\n };\n case \"top\":\n return {\n ...baseOpacity,\n transform: [\n {\n translateY: contentAnimation.interpolate({\n inputRange: [0, 1],\n outputRange: [-SCREEN_HEIGHT, 0],\n }),\n },\n ],\n };\n case \"left\":\n return {\n ...baseOpacity,\n transform: [\n {\n translateX: contentAnimation.interpolate({\n inputRange: [0, 1],\n outputRange: [-SCREEN_WIDTH, 0],\n }),\n },\n ],\n };\n case \"right\":\n return {\n ...baseOpacity,\n transform: [\n {\n translateX: contentAnimation.interpolate({\n inputRange: [0, 1],\n outputRange: [SCREEN_WIDTH, 0],\n }),\n },\n ],\n };\n default:\n if (animationType === \"slide\") {\n return {\n ...baseOpacity,\n transform: [\n {\n scale: contentAnimation.interpolate({\n inputRange: [0, 1],\n outputRange: [0.8, 1],\n }),\n },\n ],\n };\n }\n return baseOpacity;\n }\n };\n // const isCovered = !!options?.coveredByBottomSheet;\n // const isHidden = isCovered;\n\n if (!mounted) return null;\n\n return (\n <Portal hostName={`overlay-modal-${getLayerIndex()}`}>\n <View\n style={[styles.absoluteContainer]}\n pointerEvents={isOpen ? \"box-none\" : \"none\"}\n importantForAccessibility={isOpen ? \"auto\" : \"no-hide-descendants\"}\n >\n <Pressable\n style={StyleSheet.absoluteFill}\n onPress={handleClose}\n disabled={!isOpen}\n >\n <Animated.View\n pointerEvents=\"none\"\n style={[\n styles.backdrop,\n {\n backgroundColor: `rgba(0, 0, 0, ${backdropOpacity})`,\n opacity: backdropAnimation,\n },\n ]}\n />\n </Pressable>\n\n <Animated.View\n style={[getContainerStyle(), getContentAnimationStyle()]}\n pointerEvents=\"box-none\"\n >\n <View pointerEvents=\"box-none\">\n {React.isValidElement(Controller)\n ? React.cloneElement(Controller as React.ReactElement<any>, {\n close: () => overlayDispatch({ type: \"CLOSE\", overlayId }),\n unmount: () =>\n overlayDispatch({ type: \"REMOVE\", overlayId }),\n })\n : React.createElement(Controller as any, {\n isOpen,\n overlayId,\n modalType,\n backdropOpacity,\n animationType,\n swipeDirection,\n close: () => overlayDispatch({ type: \"CLOSE\", overlayId }),\n unmount: () =>\n overlayDispatch({ type: \"REMOVE\", overlayId }),\n })}\n </View>\n </Animated.View>\n </View>\n </Portal>\n );\n }\n);\n\nconst styles = StyleSheet.create({\n absoluteContainer: {\n ...StyleSheet.absoluteFillObject,\n },\n backdrop: {\n ...StyleSheet.absoluteFillObject,\n },\n centerContainer: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"center\",\n paddingHorizontal: 20,\n },\n bottomContainer: {\n flex: 1,\n justifyContent: \"flex-end\",\n },\n topContainer: {\n flex: 1,\n justifyContent: \"flex-start\",\n },\n leftContainer: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"flex-start\",\n },\n rightContainer: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"flex-end\",\n },\n});\n","// 사용자가 실제로 사용하는 API 를 만드는 팩토리\n// overlay.open(), overlay.close 등\n\nimport React from \"react\";\nimport {\n OverlayAsyncControllerComponent,\n OverlayControllerComponent,\n} from \"./context/provider/content-overlay-controller\";\nimport { BottomSheetControllerComponent } from \"./context/provider/bottom-sheet-controller\";\nimport { ModalControllerComponent } from \"./context/provider/modal-controller\";\nimport { createUseExternalEvents } from \"./utils/create-use-external-events\";\nimport { randomId } from \"./utils/random-id\";\nimport { getComponentName } from \"./utils/get-component-name\";\nimport { BottomSheetFooterProps } from \"@gorhom/bottom-sheet\";\nimport { StyleProp, ViewStyle } from \"react-native\";\n\nexport type OverlayEvent = {\n open: (args: {\n controller:\n | OverlayControllerComponent\n | BottomSheetControllerComponent\n | ModalControllerComponent\n | React.ReactElement;\n overlayId: string;\n componentKey: string;\n componentName?: string;\n overlayType?: \"overlay\" | \"bottomSheet\" | \"modal\";\n options?: any;\n }) => void;\n close: (overlayId: string) => void;\n unmount: (overlayId: string) => void;\n closeAll: () => void;\n unmountAll: () => void;\n};\n\ntype OpenOverlayOptions = {\n overlayId?: string;\n overlayType?: \"overlay\" | \"bottomSheet\" | \"modal\";\n // BottomSheet options\n snapPoints?: (string | number)[];\n enablePanDownToClose?: boolean;\n closeAllOnGestureClose?: boolean;\n // Modal options\n modalType?: \"center\" | \"bottom\" | \"top\" | \"left\" | \"right\";\n backdropOpacity?: number;\n keyboardBehavior?: \"interactive\" | \"extend\" | \"fillParent\";\n keyboardBlurBehavior?: \"restore\" | \"none\";\n androidKeyboardInputMode?: \"adjustResize\" | \"adjustPan\";\n enableDynamicSizing?: boolean;\n closeFunction?: () => void;\n isHandleClose?: boolean;\n // Styling options\n backgroundStyle?: StyleProp<ViewStyle>;\n handleStyle?: StyleProp<ViewStyle>;\n\n animationType?:\n | \"none\"\n | \"slide\"\n | \"fade\"\n | \"bounceIn\"\n | \"bounceInDown\"\n | \"bounceInUp\"\n | \"bounceInLeft\"\n | \"bounceInRight\"\n | \"bounceOut\"\n | \"bounceOutDown\"\n | \"bounceOutUp\"\n | \"bounceOutLeft\"\n | \"bounceOutRight\"\n | \"fadeIn\"\n | \"fadeInDown\"\n | \"fadeInDownBig\"\n | \"fadeInUp\"\n | \"fadeInUpBig\"\n | \"fadeInLeft\"\n | \"fadeInLeftBig\"\n | \"fadeInRight\"\n | \"fadeInRightBig\"\n | \"fadeOut\"\n | \"fadeOutDown\"\n | \"fadeOutDownBig\"\n | \"fadeOutUp\"\n | \"fadeOutUpBig\"\n | \"fadeOutLeft\"\n | \"fadeOutLeftBig\"\n | \"fadeOutRight\"\n | \"fadeOutRightBig\";\n swipeDirection?:\n | \"up\"\n | \"down\"\n | \"left\"\n | \"right\"\n | Array<\"up\" | \"down\" | \"left\" | \"right\">;\n footerComponent?: React.FC<BottomSheetFooterProps>;\n};\n// id 받아\nexport function createOverlay(overlayId: string) {\n const [useOverlayEvent, createEvent] = createUseExternalEvents<OverlayEvent>(\n `${overlayId}/overlay-kit`\n );\n\n const open = (\n controller:\n | OverlayControllerComponent\n | BottomSheetControllerComponent\n | ModalControllerComponent\n | React.ReactElement,\n options?: OpenOverlayOptions\n ) => {\n const overlayId = options?.overlayId ?? randomId();\n const componentKey = randomId();\n const overlayType = options?.overlayType ?? \"overlay\";\n const componentName = getComponentName(controller);\n\n const dispatchOpenEvent = createEvent(\"open\");\n\n // 옵션에서 overlayType과 overlayId를 제외한 나머지를 options로 전달\n const { overlayId: _, overlayType: __, ...restOptions } = options || {};\n\n // JSX 엘리먼트인 경우 wrapper 컴포넌트로 감싸기\n let finalController;\n if (React.isValidElement(controller)) {\n finalController = (props: any) => {\n return React.cloneElement(controller as React.ReactElement, {\n ...(controller.props || {}),\n ...props,\n close: props.close,\n unmount: props.unmount,\n });\n };\n } else {\n finalController = controller;\n }\n\n dispatchOpenEvent({\n controller: finalController,\n overlayId,\n componentKey,\n componentName,\n overlayType,\n options: restOptions,\n });\n return overlayId;\n };\n\n // openAsync는 모든 overlay 타입에서 사용 가능\n const openAsync = async <T>(\n controller:\n | OverlayAsyncControllerComponent<T>\n | BottomSheetControllerComponent\n | ModalControllerComponent\n | React.ReactElement\n | ((props: any) => any),\n options?: OpenOverlayOptions\n ) => {\n return new Promise<T>((resolve) => {\n const wrappedController = (overlayProps: any) => {\n const close = (param?: T) => {\n resolve(param as T);\n overlayProps.close();\n };\n const unmount = (param?: T) => {\n resolve(param as T);\n overlayProps.unmount();\n };\n const props = { ...overlayProps, close, unmount };\n\n // JSX 엘리먼트인 경우 처리\n if (React.isValidElement(controller)) {\n return React.cloneElement(controller as React.ReactElement, {\n ...(controller.props || {}),\n ...props,\n });\n }\n\n // 함수인 경우 호출\n if (typeof controller === \"function\") {\n return controller(props);\n }\n\n // 기타 컴포넌트 타입인 경우\n return controller;\n };\n\n open(wrappedController, options);\n });\n };\n const close = createEvent(\"close\");\n const unmount = createEvent(\"unmount\");\n const closeAll = createEvent(\"closeAll\");\n const unmountAll = createEvent(\"unmountAll\");\n return {\n open,\n openAsync,\n close,\n unmount,\n closeAll,\n unmountAll,\n useOverlayEvent,\n };\n}\n","import { useEffect } from \"react\";\nimport { createEmitter } from \"./emitter\";\n\nconst emitter = createEmitter();\n\n// React Native에서는 useEffect를 사용 (useLayoutEffect 대신)\nfunction useClientEffect(...args: Parameters<typeof useEffect>) {\n // RN에서는 항상 useEffect 실행\n useEffect(...args);\n}\n\n// 단순한 wrapper 함수\n// emitter.emit을 한번 감싼 이유는 나중에 로깅, 디버깅 등 추가 기능을 넣기 위함\nfunction dispatchEvent<Detail>(type: string, detail?: Detail) {\n emitter.emit(type, detail);\n}\n\n// 메인 팩토리 함수\n// 사용 예\n// createUseExternalEvents<OverlayEvents>('overlay-kit')\n// prefix의 역할:\n// - 'overlay-kit' → 실제 이벤트명은 overlay-kit:open, overlay-kit:close\n// - 네임스페이스로 이벤트 충돌 방지\n\nfunction createUseExternalEvents<\n EventHandlers extends Record<string, (params: any) => void>\n>(prefix: string) {\n function useExternalEvents(events: EventHandlers) {\n // 변환 과정:\n // 입력:\n // events = {\n // open: (data) => console.log('열기', data),\n // close: (id) => console.log('닫기', id)\n // }\n\n // 변환 결과:\n // handlers = {\n // 'overlay-kit:open': (event) => events.open(event),\n // 'overlay-kit:close': (event) => events.close(event)\n // }\n\n const handlers = Object.keys(events).reduce<Record<string, () => void>>(\n (prev, eventKey) => {\n const currentEventKeys = `${prefix}:${eventKey}`;\n\n return {\n ...prev,\n [currentEventKeys]: function (event: unknown) {\n events[eventKey](event);\n } as () => void,\n };\n },\n {}\n );\n\n useClientEffect(() => {\n Object.keys(handlers).forEach((eventKey) => {\n emitter.off(eventKey, handlers[eventKey]); // 🔥 기존 핸들러 제거\n // (중복 방지)\n emitter.on(eventKey, handlers[eventKey]); // 🔥 새로운 핸들러 등록\n });\n\n // 🧹 컴포넌트 언마운트시 정리\n return () =>\n Object.keys(handlers).forEach((eventKey) => {\n emitter.off(eventKey, handlers[eventKey]);\n });\n }, [handlers]);\n }\n\n // 타입 분석:\n // EventKey = 'open' | 'close' | 'closeAll'\n // Parameters<EventHandlers['open']> = [data: {component: Component, id:\n // string}]\n\n // const openEvent = createEvent('open');\n // openEvent의 타입: (data: {component: Component, id: string}) => void\n\n // openEvent({component: MyModal, id: '123'});\n // → dispatchEvent('overlay-kit:open', {component: MyModal, id: '123'})\n\n // payload[0]을 사용하는 이유:\n // 함수 호출: openEvent(arg1, arg2, arg3)\n // payload = [arg1, arg2, arg3]\n // payload[0] = arg1 (첫 번째 인자만 이벤트 데이터로 전달)\n\n function createEvent<EventKey extends keyof EventHandlers>(event: EventKey) {\n return (...payload: Parameters<EventHandlers[EventKey]>) =>\n dispatchEvent(`${prefix}:${String(event)}`, payload[0]);\n }\n\n return [useExternalEvents, createEvent] as const;\n}\n\n// 💡 이 패턴의 천재적인 점\n\n// 1. React 외부에서 React 내부 제어: overlay.open() 같은 명령형 API 가능\n// 2. 타입 안전성: TypeScript로 이벤트 타입 완벽 추론\n// 3. 메모리 안전: React Hook 생명주기와 완벽 동기화\n// 4. 플랫폼 호환: 웹/RN 모두 지원\n// 5. 네임스페이스: 이벤트 충돌 방지\n\nexport { createUseExternalEvents };\n","\n// 이벤트 이름\nexport type EventType = string | symbol;\n\n// 이벤트 핸들러\nexport type Handler<T = unknown> = (event: T) => void;\nexport type WildcardHandler<T = Record<string, unknown>> = (type: keyof T, event: T[keyof T]) => void;\n\n// 이벤트 핸들러 목록\nexport type EventHandlerList<T = unknown> = Array<Handler<T>>;\nexport type WildCardEventHandlerList<T = Record<string, unknown>> = Array<WildcardHandler<T>>;\n\n// 이벤트 핸들러 맵\nexport type EventHandlerMap<Events extends Record<EventType, unknown>> = Map<\n keyof Events | '*',\n EventHandlerList<Events[keyof Events]> | WildCardEventHandlerList<Events>\n>;\n\n// 이벤트 발행기\nexport interface Emitter<Events extends Record<EventType, unknown>> {\n all: EventHandlerMap<Events>;\n\n on<Key extends keyof Events>(type: Key, handler: Handler<Events[Key]>): void;\n on(type: '*', handler: WildcardHandler<Events>): void;\n\n off<Key extends keyof Events>(type: Key, handler?: Handler<Events[Key]>): void;\n off(type: '*', handler: WildcardHandler<Events>): void;\n\n emit<Key extends keyof Events>(type: Key, event: Events[Key]): void;\n emit<Key extends keyof Events>(type: undefined extends Events[Key] ? Key : never): void;\n}\n\nexport function createEmitter<Events extends Record<EventType, unknown>>(\n all?: EventHandlerMap<Events>\n): Emitter<Events> {\n type GenericEventHandler = Handler<Events[keyof Events]> | WildcardHandler<Events>;\n all = all || new Map();\n\n return {\n all,\n on<Key extends keyof Events>(type: Key, handler: GenericEventHandler) {\n const handlers: Array<GenericEventHandler> | undefined = all!.get(type);\n if (handlers) {\n handlers.push(handler);\n } else {\n all!.set(type, [handler] as EventHandlerList<Events[keyof Events]>);\n }\n },\n off<Key extends keyof Events>(type: Key, handler?: GenericEventHandler) {\n const handlers: Array<GenericEventHandler> | undefined = all!.get(type);\n if (handlers) {\n if (handler) {\n handlers.splice(handlers.indexOf(handler) >>> 0, 1);\n } else {\n all!.set(type, []);\n }\n }\n },\n emit<Key extends keyof Events>(type: Key, evt?: Events[Key]) {\n let handlers = all!.get(type);\n if (handlers) {\n (handlers as EventHandlerList<Events[keyof Events]>).slice().forEach((handler) => {\n handler(evt!);\n });\n }\n\n handlers = all!.get('*');\n if (handlers) {\n (handlers as WildCardEventHandlerList<Events>).slice().forEach((handler) => {\n handler(type, evt!);\n });\n }\n },\n };\n}","export function randomId() {\n return `overlay-kit-${Math.random().toString(36).slice(2, 11)}`;\n}","import React from 'react';\n\n/**\n * React 컴포넌트나 함수로부터 이름을 추출합니다.\n * 디버깅 목적으로 사용됩니다.\n */\nexport function getComponentName(controller: any): string {\n // 1. displayName 우선 (개발자가 명시적으로 설정한 이름)\n if (controller?.displayName) {\n return controller.displayName;\n }\n\n // 2. React element인 경우\n if (React.isValidElement(controller)) {\n const type = controller.type as any;\n if (type?.displayName) return type.displayName;\n if (type?.name && type.name !== 'anonymous') return type.name;\n }\n\n // 3. 함수/컴포넌트의 name 속성\n if (typeof controller === 'function') {\n if (controller.name && controller.name !== 'anonymous') {\n return controller.name;\n }\n }\n\n // 4. 래핑된 컴포넌트 (forwardRef, memo 등)\n if (controller?.type?.displayName) {\n return controller.type.displayName;\n }\n if (controller?.type?.name && controller.type.name !== 'anonymous') {\n return controller.type.name;\n }\n\n // 5. Fallback\n return 'Anonymous';\n}\n","import { type Provider, createContext, useContext } from 'react';\n\ntype NullSymbolType = typeof NullSymbol;\nconst NullSymbol = Symbol('Null');\n\nexport type CreateContextReturn<T> = [Provider<T>, () => T];\n\nexport function createSafeContext<T>(displayName?: string): CreateContextReturn<T> {\n const Context = createContext<T | NullSymbolType>(NullSymbol);\n Context.displayName = displayName ?? 'SafeContext';\n\n function useSafeContext() {\n const context = useContext(Context);\n\n if (context === NullSymbol) {\n const error = new Error(`[${Context.displayName}]: Provider not found.`);\n error.name = '[Error] Context';\n\n throw error;\n }\n\n return context;\n }\n\n return [Context.Provider as any, useSafeContext];\n}\n","import { createSafeContext } from '../utils/create-safe-context';\nimport { type OverlayData } from './reducer';\n\n\nexport function createOverlaySafeContext() {\n const [OverlayContextProvider, useOverlayContext] = createSafeContext<OverlayData>('overlay-kit/OverlayContext');\n\n function useCurrentOverlay() {\n return useOverlayContext().current;\n }\n\n function useOverlayData() {\n return useOverlayContext().overlayData;\n }\n\n return { OverlayContextProvider, useCurrentOverlay, useOverlayData };\n}\n","import { OverlayControllerComponent } from \"./provider/content-overlay-controller\";\nimport { BottomSheetControllerComponent } from \"./provider/bottom-sheet-controller\";\nimport { ModalControllerComponent } from \"./provider/modal-controller\";\n\ntype OverlayId = string;\ntype OverlayItem = {\n /**\n * @description 오버레이 고유한 ID\n */\n id : OverlayId;\n /**\n * @description 오버레이 컴포넌트의 고유한 키\n * 컴포넌트가 언마운트시 사용됩니다.\n */\n componentKey: string;\n /**\n * @description 컴포넌트 이름 (디버깅용)\n */\n componentName?: string;\n isOpen: boolean;\n isMounted: boolean;\n controller: OverlayControllerComponent | BottomSheetControllerComponent | ModalControllerComponent;\n overlayType?: 'overlay' | 'bottomSheet' | 'modal';\n options?: any;\n}\nexport type OverlayData = {\n current: OverlayId | null; // 현재 열려있는 오버레이 ID\n overlayOrderList: OverlayId[];\n overlayData: Record<OverlayId, OverlayItem>;\n}\nexport type OverlayReducerAction =\n | { type: 'ADD'; overlay: OverlayItem }\n | { type: 'OPEN'; overlayId: string }\n | { type: 'CLOSE'; overlayId: string }\n | { type: 'REMOVE'; overlayId: string }\n | { type: 'CLOSE_ALL' }\n | { type: 'REMOVE_ALL' };\n\n/**\n * 오버레이를 닫거나 제거할 때, 어떤 오버레이를 현재(current)로 지정할지 결정합니다.\n *\n * @description 마지막 오버레이를 닫을 경우, 그 이전 오버레이를 현재로 지정합니다.\n * @description 중간에 있는 오버레이를 닫을 경우, 마지막 오버레이를 현재로 지정합니다.\n *\n * @example open - [1, 2, 3, 4]\n * close 2 => current: 4\n * close 4 => current: 3\n * close 3 => current: 1\n * close 1 => current: null\n *\n * @param overlayOrderList 오버레이 ID가 순서대로 담긴 리스트\n * @param overlayData 오버레이 데이터 맵\n * @param targetOverlayId 닫거나 제거하려는 오버레이의 ID\n * @returns 현재로 지정될 오버레이의 ID, 없으면 null\n */\nexport const determineCurrentOverlayId = (overlayOrderList: OverlayId[], overlayData: Record<OverlayId, OverlayItem>, targetOverlayId: OverlayId): OverlayId | null => {\n // 1단계: 열린 오버레이들만 필터링\n\n const openedOverlayOrderList = overlayOrderList.filter(\n (orderedOverlayId) => overlayData[orderedOverlayId].isOpen === true\n );\n // 2단계: 닫힐 오버레이의 위치 찾기\n const targetIndexInOpenedList = openedOverlayOrderList.findIndex((item) => item === targetOverlayId);\n\n // 3단계: 다음 활성 오버레이 결정\n return targetIndexInOpenedList === openedOverlayOrderList.length - 1\n ? openedOverlayOrderList[targetIndexInOpenedList - 1] ?? null // 마지막이면 이전 것\n : openedOverlayOrderList[openedOverlayOrderList.length - 1] ?? null;// 중간이면 최상위\n\n}\n\n/** 동작 예시:\n * \n *\n * // 상황: 오버레이 [1, 2, 3, 4]가 순서대로 열려있음\n * overlayOrderList = [\"modal-1\", \"modal-2\", \"modal-3\", \"modal-4\"];\n * // 모두 isOpen: true\n *\n * // 케이스 1: 최상위(4번) 닫기\n * determineCurrentOverlayId(list, data, \"modal-4\");\n * // → \"modal-3\" (바로 아래가 활성화)\n *\n * // 케이스 2: 중간(2번) 닫기\n * determineCurrentOverlayId(list, data, \"modal-2\");\n * // → \"modal-4\" (최상위가 여전히 활성)\n *\n * // 케이스 3: 마지막 남은 것 닫기\n * determineCurrentOverlayId([\"modal-1\"], data, \"modal-1\");\n * // → null (더 이상 활성 오버레이 없음)\n */\n\n// 상태 변경 로직\nexport function overlayReducer(state: OverlayData, action: OverlayReducerAction): OverlayData {\n switch (action.type) {\n case 'ADD': {\n const isExisted = state.overlayOrderList.includes(action.overlay.id);\n const existingOverlay = state.overlayData[action.overlay.id];\n\n // 이미 같은 overlayId를 가진 오버레이가 열려있다면, 중복 추가하지 않고 기존 것을 맨 앞으로 가져오기\n if (isExisted && existingOverlay?.isOpen === true) {\n return {\n ...state,\n current: action.overlay.id,\n // 이미 열려있는 오버레이를 맨 앞으로 이동\n overlayOrderList: [...state.overlayOrderList.filter((item) => item !== action.overlay.id), action.overlay.id],\n };\n }\n\n // 같은 overlayId를 가진 오버레이가 존재하지만 닫혀있는 경우, 다시 열기\n if (isExisted && existingOverlay?.isOpen === false) {\n return {\n ...state,\n current: action.overlay.id,\n // 맨 앞으로 이동\n overlayOrderList: [...state.overlayOrderList.filter((item) => item !== action.overlay.id), action.overlay.id],\n overlayData: {\n ...state.overlayData,\n [action.overlay.id]: { ...existingOverlay, isOpen: true, isMounted: true },\n },\n };\n }\n\n // 새로운 오버레이 추가\n return {\n current: action.overlay.id,\n overlayOrderList: [...state.overlayOrderList, action.overlay.id],\n overlayData: {\n ...state.overlayData,\n [action.overlay.id]: action.overlay,\n },\n };\n }\n case 'OPEN': {\n const overlay = state.overlayData[action.overlayId];\n\n // ignore if the overlay don't exist or already open\n if (overlay == null || overlay.isOpen) {\n return state;\n }\n\n return {\n ...state,\n current: action.overlayId,\n // 닫혀있던 오버레이를 다시 열 때 맨 뒤로 이동시켜 최상단에 표시\n overlayOrderList: [...state.overlayOrderList.filter((item) => item !== action.overlayId), action.overlayId],\n overlayData: {\n ...state.overlayData,\n [action.overlayId]: { ...overlay, isOpen: true, isMounted: true },\n },\n };\n }\n case 'CLOSE': {\n const overlay = state.overlayData[action.overlayId];\n\n // ignore if the overlay don't exist or already closed\n if (overlay == null || !overlay.isOpen) {\n return state;\n }\n\n const currentOverlayId = determineCurrentOverlayId(state.overlayOrderList, state.overlayData, action.overlayId);\n\n return {\n ...state,\n current: currentOverlayId,\n overlayData: {\n ...state.overlayData,\n [action.overlayId]: {\n ...state.overlayData[action.overlayId],\n isOpen: false,\n },\n },\n };\n }\n case 'REMOVE': {\n const overlay = state.overlayData[action.overlayId];\n\n // ignore if the overlay don't exist\n if (overlay == null) {\n return state;\n }\n\n const remainingOverlays = state.overlayOrderList.filter((item) => item !== action.overlayId);\n if (state.overlayOrderList.length === remainingOverlays.length) {\n return state;\n }\n\n const copiedOverlayData = { ...state.overlayData };\n delete copiedOverlayData[action.overlayId];\n\n const currentOverlayId = determineCurrentOverlayId(state.overlayOrderList, state.overlayData, action.overlayId);\n\n return {\n current: currentOverlayId,\n overlayOrderList: remainingOverlays,\n overlayData: copiedOverlayData,\n };\n }\n case 'CLOSE_ALL': {\n // ignore if there is no overlay\n if (Object.keys(state.overlayData).length === 0) {\n return state;\n }\n\n return {\n ...state,\n current: null,\n overlayData: Object.keys(state.overlayData).reduce(\n (prev, curr) => ({\n ...prev,\n [curr]: {\n ...state.overlayData[curr],\n isOpen: false,\n } satisfies OverlayItem,\n }),\n {} satisfies Record<string, OverlayItem>\n ),\n };\n }\n case 'REMOVE_ALL': {\n return { current: null, overlayOrderList: [], overlayData: {} };\n }\n }\n}","import { createOverlayProvider } from '../context/provider';\n\nexport const { overlay, OverlayProvider, useCurrentOverlay, useOverlayData } = createOverlayProvider();\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function experimental_createOverlayContext() {\n return createOverlayProvider();\n}"],"mappings":"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","names":["import_react","import_react_native","import_react","import_react","import_react","ACTIONS","INITIAL_STATE","import_react","PortalStateContext","createContext","PortalDispatchContext","usePortal","hostName","dispatch","useContext","PortalDispatchContext","Error","registerHost","useCallback","type","ACTIONS","REGISTER_HOST","deregisterHost","DEREGISTER_HOST","addUpdatePortal","name","node","ADD_UPDATE_PORTAL","portalName","removePortal","REMOVE_PORTAL","addPortal","updatePortal","PortalComponent","name","_providedName","hostName","handleOnMount","_providedHandleOnMount","handleOnUnmount","_providedHandleOnUnmount","handleOnUpdate","_providedHandleOnUpdate","children","addPortal","addUpdatePortal","removePortal","usePortal","useMemo","nanoid","handleOnMountRef","useRef","handleOnUnmountRef","handleOnUpdateRef","useCallback","current","useEffect","undefined","Portal","memo","displayName","import_react","import_react","usePortalState","hostName","state","useContext","PortalStateContext","Error","PortalHostComponent","name","state","usePortalState","registerHost","deregisterHost","usePortal","useEffect","React","map","item","node","PortalHost","memo","displayName","import_react","isLoggingEnabled","isDev","Boolean","__DEV__","print","isDev","component","method","params","isLoggingEnabled","message","Object","keys","map","key","join","console","log","filter","Boolean","freeze","registerHost","state","hostName","deregisterHost","addUpdatePortal","portalName","node","index","findIndex","item","name","push","removePortal","print","component","reducer","method","params","splice","action","type","clonedState","ACTIONS","REGISTER_HOST","DEREGISTER_HOST","ADD_UPDATE_PORTAL","REMOVE_PORTAL","PortalProviderComponent","rootHostName","shouldAddRootHost","children","state","dispatch","useReducer","reducer","INITIAL_STATE","React","PortalProvider","memo","displayName","import_jsx_runtime","_a","BottomSheet","React","import_react","import_react_native","import_jsx_runtime","React","import_react","import_react","import_react","React","overlayId","React","close","unmount","import_react","useCurrentOverlay","useOverlayData","overlay","import_bottom_sheet","import_jsx_runtime","overlay","useCurrentOverlay","useOverlayData","OverlayProvider","overlayId","_a"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1239,7 +1239,7 @@ function createOverlayProvider() {
|
|
|
1239
1239
|
return () => {
|
|
1240
1240
|
subscription.remove();
|
|
1241
1241
|
};
|
|
1242
|
-
}, [overlayDispatch]);
|
|
1242
|
+
}, [overlayDispatch, overlayState.overlayOrderList]);
|
|
1243
1243
|
return /* @__PURE__ */ jsx4(GestureHandlerRootView, { style: { flex: 1 }, children: /* @__PURE__ */ jsx4(PortalProvider, { children: /* @__PURE__ */ jsx4(BottomSheetModalProvider2, { children: /* @__PURE__ */ jsxs2(OverlayContextProvider, { value: overlayState, children: [
|
|
1244
1244
|
children,
|
|
1245
1245
|
overlayState.overlayOrderList.map((item) => {
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/context/provider/index.tsx","../src/context/provider/content-overlay-controller.tsx","../src/context/provider/bottom-sheet-controller.tsx","../node_modules/@gorhom/portal/lib/module/components/portal/Portal.tsx","../node_modules/nanoid/non-secure/index.js","../node_modules/@gorhom/portal/lib/module/hooks/usePortal.ts","../node_modules/@gorhom/portal/lib/module/state/constants.ts","../node_modules/@gorhom/portal/lib/module/contexts/portal.ts","../node_modules/@gorhom/portal/lib/module/components/portalHost/PortalHost.tsx","../node_modules/@gorhom/portal/lib/module/hooks/usePortalState.ts","../node_modules/@gorhom/portal/lib/module/components/portalProvider/PortalProvider.tsx","../node_modules/@gorhom/portal/lib/module/utilities/logger.ts","../node_modules/@gorhom/portal/lib/module/state/reducer.ts","../src/context/provider/modal-controller.tsx","../src/event.ts","../src/utils/create-use-external-events.ts","../src/utils/emitter.ts","../src/utils/random-id.ts","../src/utils/get-component-name.ts","../src/utils/create-safe-context.ts","../src/context/context.ts","../src/context/reducer.ts","../src/utils/create-overlay-context.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useReducer,\n useRef,\n type PropsWithChildren,\n} from \"react\";\nimport { BackHandler, Platform, View } from \"react-native\";\nimport { ContentOverlayController } from \"./content-overlay-controller\";\nimport { ContentBottomSheetController } from \"./bottom-sheet-controller\";\nimport { ContentModalController } from \"./modal-controller\";\nimport { type OverlayEvent, createOverlay } from \"../../event\";\nimport { randomId } from \"../../utils/random-id\";\nimport { createOverlaySafeContext } from \"../context\";\nimport { overlayReducer } from \"../reducer\";\nimport { GestureHandlerRootView } from \"react-native-gesture-handler\";\nimport { BottomSheetModalProvider } from \"@gorhom/bottom-sheet\";\nimport { PortalProvider, PortalHost } from \"@gorhom/portal\";\n\nexport function createOverlayProvider() {\n const overlayId = randomId();\n const { useOverlayEvent, ...overlay } = createOverlay(overlayId);\n\n const { OverlayContextProvider, useCurrentOverlay, useOverlayData } =\n createOverlaySafeContext();\n\n function OverlayProvider({ children }: PropsWithChildren) {\n const [overlayState, overlayDispatch] = useReducer(overlayReducer, {\n current: null,\n overlayOrderList: [],\n overlayData: {},\n });\n const overlayStateRef = useRef(overlayState);\n\n useEffect(() => {\n overlayStateRef.current = overlayState;\n }, [overlayState]);\n\n // Overlay 이벤트 핸들러들\n const overlayOpen: OverlayEvent[\"open\"] = useCallback(\n ({\n controller,\n overlayId,\n componentKey,\n componentName,\n overlayType = \"overlay\",\n options,\n }) => {\n overlayDispatch({\n type: \"ADD\",\n overlay: {\n id: overlayId,\n componentKey,\n componentName,\n isOpen: true,\n isMounted: true,\n controller: controller,\n overlayType,\n options,\n },\n });\n },\n []\n );\n\n const close = useCallback((overlayId: string) => {\n overlayDispatch({ type: \"CLOSE\", overlayId });\n }, []);\n\n const unmount = useCallback((overlayId: string) => {\n overlayDispatch({ type: \"REMOVE\", overlayId });\n }, []);\n\n const closeAll = useCallback(() => {\n overlayDispatch({ type: \"CLOSE_ALL\" });\n }, []);\n\n const unmountAll = useCallback(() => {\n overlayDispatch({ type: \"REMOVE_ALL\" });\n }, []);\n\n // 이벤트 리스너 등록\n useOverlayEvent({\n open: overlayOpen,\n close,\n unmount,\n closeAll,\n unmountAll,\n });\n\n useEffect(() => {\n return () => {\n overlayDispatch({ type: \"REMOVE_ALL\" });\n };\n }, []);\n\n useEffect(() => {\n if (Platform.OS !== \"android\") {\n return;\n }\n\n const onHardwareBackPress = () => {\n const { overlayOrderList, overlayData } = overlayStateRef.current;\n\n for (let idx = overlayOrderList.length - 1; idx >= 0; idx -= 1) {\n const currentOverlayId = overlayOrderList[idx];\n const overlayItem = overlayData[currentOverlayId];\n\n if (!overlayItem?.isOpen) {\n continue;\n }\n\n if (\n overlayItem.overlayType === \"modal\" ||\n overlayItem.overlayType === \"bottomSheet\"\n ) {\n overlayDispatch({ type: \"REMOVE\", overlayId: currentOverlayId });\n return true;\n }\n }\n\n return false;\n };\n\n const subscription = BackHandler.addEventListener(\n \"hardwareBackPress\",\n onHardwareBackPress\n );\n\n return () => {\n subscription.remove();\n };\n }, [overlayDispatch]);\n\n return (\n <GestureHandlerRootView style={{ flex: 1 }}>\n <PortalProvider>\n <BottomSheetModalProvider>\n <OverlayContextProvider value={overlayState}>\n {children}\n\n {/* 1) Modal/Overlay 먼저 렌더: BottomSheet가 열려있으면 모달은 숨김 */}\n {overlayState.overlayOrderList.map((item) => {\n const overlayItem = overlayState.overlayData[item];\n const {\n id: currentOverlayId,\n componentKey,\n isOpen,\n controller: Controller,\n overlayType,\n options,\n } = overlayItem;\n\n if (overlayType === \"bottomSheet\") return null;\n\n // hasOpenBottomSheet 계산 (모달은 항상 마운트 유지, 대신 '가려짐' 상태만 전달)\n const hasOpenBottomSheet = overlayState.overlayOrderList.some(\n (id) =>\n overlayState.overlayData[id]?.overlayType ===\n \"bottomSheet\" && overlayState.overlayData[id]?.isOpen\n );\n\n if (overlayType === \"modal\") {\n const sameTypeOverlays = overlayState.overlayOrderList.filter(\n (id) =>\n overlayState.overlayData[id]?.overlayType === \"modal\" &&\n overlayState.overlayData[id]?.isOpen\n );\n const isTopModal =\n sameTypeOverlays[sameTypeOverlays.length - 1] ===\n currentOverlayId;\n const shouldShow = isOpen && isTopModal; // ★ 더 이상 닫지 않음\n\n return (\n <ContentModalController\n key={componentKey}\n isOpen={isOpen}\n controller={Controller as any}\n overlayId={currentOverlayId}\n overlayDispatch={overlayDispatch}\n overlayOrderList={overlayState.overlayOrderList}\n options={{\n ...options,\n coveredByBottomSheet: hasOpenBottomSheet,\n }}\n />\n );\n }\n\n // fallback: overlay\n return (\n <ContentOverlayController\n key={componentKey}\n isOpen={isOpen}\n controller={Controller as any}\n overlayId={currentOverlayId}\n overlayDispatch={overlayDispatch}\n />\n );\n })}\n\n {/* 2) BottomSheet는 항상 마지막에 렌더 */}\n {overlayState.overlayOrderList.map((item) => {\n const overlayItem = overlayState.overlayData[item];\n const {\n id: currentOverlayId,\n componentKey,\n isOpen,\n controller: Controller,\n overlayType,\n options,\n } = overlayItem;\n\n if (overlayType !== \"bottomSheet\") return null;\n\n const sameTypeOverlays = overlayState.overlayOrderList.filter(\n (id) =>\n overlayState.overlayData[id]?.overlayType ===\n \"bottomSheet\" && overlayState.overlayData[id]?.isOpen\n );\n const isTopBottomSheet =\n sameTypeOverlays[sameTypeOverlays.length - 1] ===\n currentOverlayId;\n const shouldShow = isOpen && isTopBottomSheet;\n\n return (\n <ContentBottomSheetController\n key={componentKey}\n isOpen={isOpen}\n controller={Controller as any}\n overlayId={currentOverlayId}\n overlayDispatch={overlayDispatch}\n overlayOrderList={overlayState.overlayOrderList}\n options={options}\n />\n );\n })}\n\n {/* Portal hosts for modals, ordered by overlayOrderList index (controls stacking) */}\n {overlayState.overlayOrderList.map((id, idx) => (\n <PortalHost\n key={`overlay-modal-${idx}`}\n name={`overlay-modal-${idx}`}\n />\n ))}\n </OverlayContextProvider>\n </BottomSheetModalProvider>\n </PortalProvider>\n </GestureHandlerRootView>\n );\n }\n\n return {\n overlay,\n OverlayProvider,\n useCurrentOverlay,\n useOverlayData,\n };\n}\n","import React, { type FC, memo, useEffect, type Dispatch } from \"react\";\nimport { Modal } from \"react-native\";\nimport { type OverlayReducerAction } from \"../reducer\";\n\ntype OverlayControllerProps = {\n overlayId: string;\n isOpen: boolean;\n close: () => void;\n unmount: () => void;\n};\n\ntype OverlayAsyncControllerProps<T> = Omit<OverlayControllerProps, \"close\"> & {\n close: (param: T) => void;\n};\n\nexport type OverlayControllerComponent = FC<OverlayControllerProps>;\nexport type OverlayAsyncControllerComponent<T> = FC<\n OverlayAsyncControllerProps<T>\n>;\n\ntype ContentOverlayControllerProps = {\n isOpen: boolean;\n overlayId: string;\n overlayDispatch: Dispatch<OverlayReducerAction>;\n controller: OverlayControllerComponent;\n};\n\nexport const ContentOverlayController = memo(\n ({\n isOpen,\n overlayId,\n overlayDispatch,\n controller: Controller,\n }: ContentOverlayControllerProps) => {\n useEffect(() => {\n setImmediate(() => {\n overlayDispatch({ type: \"OPEN\", overlayId });\n });\n }, [overlayDispatch, overlayId]);\n\n const handleClose = () => {\n overlayDispatch({ type: \"CLOSE\", overlayId });\n // 커스텀 애니메이션을 위한 짧은 딜레이 후 메모리에서 제거\n setTimeout(() => {\n overlayDispatch({ type: \"REMOVE\", overlayId });\n }, 200);\n };\n\n return (\n <Controller\n isOpen={isOpen}\n overlayId={overlayId}\n close={handleClose}\n unmount={() => overlayDispatch({ type: \"REMOVE\", overlayId })}\n />\n );\n }\n);\n","import React, {\n type FC,\n memo,\n useEffect,\n useRef,\n type Dispatch,\n useCallback,\n useState,\n useMemo,\n} from \"react\";\nimport BottomSheet, {\n BottomSheetModal,\n BottomSheetView,\n BottomSheetFlatList,\n BottomSheetScrollView,\n BottomSheetBackdrop,\n BottomSheetModalProvider,\n BottomSheetTextInput,\n BottomSheetFooterProps,\n} from \"@gorhom/bottom-sheet\";\n\nimport {\n StyleProp,\n ViewStyle,\n ListRenderItem,\n View,\n StyleSheet,\n Platform,\n Keyboard,\n} from \"react-native\";\nimport { useReducedMotion, Easing } from \"react-native-reanimated\";\nimport { type OverlayReducerAction } from \"../reducer\";\nimport { Portal } from \"@gorhom/portal\";\n\ntype BottomSheetControllerProps<T = any> = {\n overlayId: string;\n isOpen: boolean;\n close: () => void;\n unmount: () => void;\n snapPoints?: (string | number)[];\n enablePanDownToClose?: boolean;\n // Enhanced features\n header?: React.ReactNode;\n footer?: React.ReactNode;\n children?: React.ReactNode;\n // FlatList support\n isFlatList?: boolean;\n data?: ArrayLike<T> | null | undefined;\n renderItem?: ListRenderItem<T> | null | undefined;\n keyExtractor?: ((item: T, index: number) => string) | undefined;\n contentContainerStyle?: StyleProp<ViewStyle> | undefined;\n ItemSeparatorComponent?: React.ComponentType<any> | null | undefined;\n flatListHeader?: React.ReactNode;\n flatListFooter?: React.ReactNode;\n // Backdrop\n enableBackdrop?: boolean;\n backdropOpacity?: number;\n onBackdropPress?: () => void;\n // Dynamic sizing\n enableDynamicSizing?: boolean;\n // Scrolling\n enableScrolling?: boolean;\n // Styling\n backgroundStyle?: StyleProp<ViewStyle>;\n handleStyle?: StyleProp<ViewStyle>;\n // Loading & empty state\n isLoading?: boolean;\n emptyText?: string;\n extraData?: any;\n};\n\nexport type BottomSheetControllerComponent<T = any> = FC<\n BottomSheetControllerProps<T>\n>;\n\ntype ContentBottomSheetControllerProps = {\n isOpen: boolean;\n overlayId: string;\n overlayDispatch: Dispatch<OverlayReducerAction>;\n controller: BottomSheetControllerComponent | React.ReactElement;\n overlayOrderList: string[];\n options?: {\n snapPoints?: (string | number)[];\n enablePanDownToClose?: boolean;\n enableBackdrop?: boolean;\n backdropOpacity?: number;\n enableDynamicSizing?: boolean;\n backgroundStyle?: StyleProp<ViewStyle>;\n handleStyle?: StyleProp<ViewStyle>;\n keyboardBehavior?: \"interactive\" | \"extend\" | \"fillParent\";\n keyboardBlurBehavior?: \"restore\" | \"none\";\n androidKeyboardInputMode?: \"adjustResize\" | \"adjustPan\";\n closeAllOnGestureClose?: boolean;\n closeFunction?: () => void;\n isHandleClose?: boolean;\n [key: string]: any;\n };\n};\n\nexport const ContentBottomSheetController = memo(\n ({\n isOpen,\n overlayId,\n overlayDispatch,\n controller: Controller,\n overlayOrderList,\n options = {},\n }: ContentBottomSheetControllerProps) => {\n const bottomSheetRef = useRef<BottomSheet>(null);\n const reducedMotion = useReducedMotion();\n const isClosingRef = useRef(false);\n const closeTimerRef = useRef<NodeJS.Timeout | null>(null);\n\n // 빠른 닫힘 애니메이션 설정\n const animationConfigs = useMemo(\n () => ({\n duration: 200, // 200ms로 빠르게\n easing: Easing.out(Easing.cubic),\n }),\n []\n );\n\n // Use react-native-keyboard-controller for keyboard tracking (number type)\n const [keyboardHeight, setKeyboardHeight] = useState(0);\n const isKeyboardActiveRef = useRef(false);\n\n // 키보드 상태 감지 (빠른 반응을 위해 ref 사용)\n useEffect(() => {\n const keyboardWillShowListener = Keyboard.addListener(\n Platform.OS === \"ios\" ? \"keyboardWillShow\" : \"keyboardDidShow\",\n (e) => {\n isKeyboardActiveRef.current = true;\n setKeyboardHeight(e.endCoordinates.height);\n }\n );\n const keyboardWillHideListener = Keyboard.addListener(\n Platform.OS === \"ios\" ? \"keyboardWillHide\" : \"keyboardDidHide\",\n () => {\n isKeyboardActiveRef.current = false;\n setKeyboardHeight(0);\n }\n );\n\n return () => {\n keyboardWillShowListener.remove();\n keyboardWillHideListener.remove();\n };\n }, []);\n\n const getZIndex = () => {\n const index = overlayOrderList.indexOf(overlayId);\n // bottomSheet는 항상 modal보다 앞에 나오도록 훨씬 높은 zIndex 사용\n return 1000 + index;\n };\n\n // --- Android keyboard handling defaults ---\n // On Android, the sheet won't move with the keyboard unless:\n // 1) Activity windowSoftInputMode = \"adjustResize\"\n // 2) bottom-sheet uses keyboardBehavior=\"extend\"\n // 3) Text inputs inside sheet use BottomSheetTextInput\n\n const {\n snapPoints,\n enablePanDownToClose = true,\n enableBackdrop = true,\n backdropOpacity = 0.5,\n enableDynamicSizing = true,\n backgroundStyle = {},\n handleStyle = {},\n keyboardBehavior = Platform.OS === \"android\" ? \"extend\" : \"interactive\",\n keyboardBlurBehavior = \"restore\",\n androidKeyboardInputMode = \"adjustResize\",\n closeAllOnGestureClose = false,\n isHandleClose = true,\n closeFunction,\n ...restOptions\n } = options;\n\n useEffect(() => {\n if (isOpen) {\n // 바텀시트가 열릴 때 플래그와 타이머 초기화\n isClosingRef.current = false;\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n\n const rafId = requestAnimationFrame(() => {\n bottomSheetRef.current?.expand();\n overlayDispatch({ type: \"OPEN\", overlayId });\n });\n return () => cancelAnimationFrame(rafId);\n } else {\n // bottomSheetRef.current?.close();\n }\n }, [isOpen, overlayDispatch, overlayId]);\n\n // 컴포넌트 언마운트 시 타이머 정리\n useEffect(() => {\n return () => {\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n isClosingRef.current = false;\n };\n }, []);\n\n // 키보드가 열려있다면 먼저 닫고, 그 다음 바텀시트 닫기\n const handleClose = useCallback(() => {\n // 이미 닫히는 중이면 무시 (중복 클릭 방지)\n if (isClosingRef.current) {\n return;\n }\n isClosingRef.current = true;\n\n // 기존 타이머가 있다면 정리\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n\n // 키보드가 활성화되어 있으면 먼저 키보드를 닫기\n if (keyboardHeight > 0) {\n Keyboard.dismiss();\n // 키보드 닫히는 애니메이션 시간을 최소화\n closeTimerRef.current = setTimeout(() => {\n closeTimerRef.current = null;\n\n if (closeAllOnGestureClose) {\n overlayDispatch({ type: \"REMOVE_ALL\" });\n } else {\n overlayDispatch({ type: \"REMOVE\", overlayId });\n }\n\n if (closeFunction) {\n closeFunction();\n }\n\n // 작업 완료 후 플래그 리셋\n isClosingRef.current = false;\n }, 50);\n return;\n }\n\n // 키보드가 활성화되어 있지 않으면 즉시 바텀시트 닫기\n // requestAnimationFrame으로 한 프레임만 대기 후 즉시 제거\n requestAnimationFrame(() => {\n if (closeAllOnGestureClose) {\n overlayDispatch({ type: \"REMOVE_ALL\" });\n } else {\n overlayDispatch({ type: \"REMOVE\", overlayId });\n }\n if (closeFunction) {\n closeFunction();\n }\n\n // 작업 완료 후 플래그 리셋\n isClosingRef.current = false;\n });\n }, [\n overlayDispatch,\n overlayId,\n closeAllOnGestureClose,\n closeFunction,\n keyboardHeight,\n ]);\n\n // 백드롭 렌더링\n const renderBackdrop = useCallback(\n (props: any) => (\n <BottomSheetBackdrop\n {...props}\n appearsOnIndex={1}\n disappearsOnIndex={-1}\n opacity={backdropOpacity}\n // pressBehavior=\"close\"\n onPress={handleClose}\n />\n ),\n [backdropOpacity, handleClose]\n );\n\n // callbacks\n const handleSheetChange = useCallback((index: number) => {}, []);\n const getLayerIndex = () => {\n return Math.max(0, overlayOrderList.indexOf(overlayId));\n };\n if (!isOpen) return null;\n\n return (\n <Portal hostName={`overlay-modal-${getLayerIndex()}`}>\n <BottomSheet\n style={[{ zIndex: getZIndex() }]}\n ref={bottomSheetRef}\n onChange={handleSheetChange}\n android_keyboardInputMode={androidKeyboardInputMode}\n keyboardBehavior={keyboardBehavior}\n snapPoints={enableDynamicSizing ? undefined : snapPoints}\n enablePanDownToClose={enablePanDownToClose}\n onClose={isHandleClose ? handleClose : undefined}\n bottomInset={Platform.OS === \"android\" ? keyboardHeight : 0}\n keyboardBlurBehavior={keyboardBlurBehavior}\n animationConfigs={animationConfigs}\n // index={0}\n backdropComponent={enableBackdrop ? renderBackdrop : undefined}\n backgroundStyle={[\n {\n borderTopLeftRadius: 16,\n borderTopRightRadius: 16,\n },\n backgroundStyle,\n ]}\n handleStyle={[\n {\n backgroundColor: \"transparent\",\n borderTopLeftRadius: 16,\n borderTopRightRadius: 16,\n },\n handleStyle,\n ]}\n enableDynamicSizing={enableDynamicSizing}\n animateOnMount={!reducedMotion}\n >\n {React.isValidElement(Controller)\n ? React.cloneElement(Controller as React.ReactElement<any>, {\n close: () => overlayDispatch({ type: \"CLOSE\", overlayId }),\n unmount: () => overlayDispatch({ type: \"REMOVE\", overlayId }),\n })\n : React.createElement(Controller as any, {\n isOpen,\n overlayId,\n snapPoints,\n enablePanDownToClose,\n close: () => overlayDispatch({ type: \"CLOSE\", overlayId }),\n unmount: () => overlayDispatch({ type: \"REMOVE\", overlayId }),\n ...restOptions,\n })}\n </BottomSheet>\n </Portal>\n );\n }\n);\n","import { memo, useCallback, useEffect, useMemo, useRef } from 'react';\nimport { nanoid } from 'nanoid/non-secure';\nimport { usePortal } from '../../hooks/usePortal';\nimport type { PortalProps } from './types';\n\nconst PortalComponent = ({\n name: _providedName,\n hostName,\n handleOnMount: _providedHandleOnMount,\n handleOnUnmount: _providedHandleOnUnmount,\n handleOnUpdate: _providedHandleOnUpdate,\n children,\n}: PortalProps) => {\n //#region hooks\n const { addPortal: addUpdatePortal, removePortal } = usePortal(hostName);\n //#endregion\n\n //#region variables\n const name = useMemo(() => _providedName || nanoid(), [_providedName]);\n //#endregion\n\n //#region refs\n const handleOnMountRef = useRef<Function>();\n const handleOnUnmountRef = useRef<Function>();\n const handleOnUpdateRef = useRef<Function>();\n //#endregion\n\n //#region callbacks\n const handleOnMount = useCallback(() => {\n if (_providedHandleOnMount) {\n _providedHandleOnMount(() => addUpdatePortal(name, children));\n } else {\n addUpdatePortal(name, children);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [_providedHandleOnMount, addUpdatePortal]);\n handleOnMountRef.current = handleOnMount;\n\n const handleOnUnmount = useCallback(() => {\n if (_providedHandleOnUnmount) {\n _providedHandleOnUnmount(() => removePortal(name));\n } else {\n removePortal(name);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [_providedHandleOnUnmount, removePortal]);\n handleOnUnmountRef.current = handleOnUnmount;\n\n const handleOnUpdate = useCallback(() => {\n if (_providedHandleOnUpdate) {\n _providedHandleOnUpdate(() => addUpdatePortal(name, children));\n } else {\n addUpdatePortal(name, children);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [_providedHandleOnUpdate, addUpdatePortal, children]);\n handleOnUpdateRef.current = handleOnUpdate;\n //#endregion\n\n //#region effects\n useEffect(() => {\n handleOnMountRef.current?.();\n return () => {\n handleOnUnmountRef.current?.();\n\n // remove callbacks refs\n handleOnMountRef.current = undefined;\n handleOnUnmountRef.current = undefined;\n handleOnUpdateRef.current = undefined;\n };\n }, []);\n useEffect(() => {\n handleOnUpdateRef.current?.();\n }, [children]);\n //#endregion\n\n return null;\n};\n\nexport const Portal = memo(PortalComponent);\nPortal.displayName = 'Portal';\n","let urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\nlet customAlphabet = (alphabet, defaultSize = 21) => {\n return (size = defaultSize) => {\n let id = ''\n let i = size | 0\n while (i--) {\n id += alphabet[(Math.random() * alphabet.length) | 0]\n }\n return id\n }\n}\nlet nanoid = (size = 21) => {\n let id = ''\n let i = size | 0\n while (i--) {\n id += urlAlphabet[(Math.random() * 64) | 0]\n }\n return id\n}\nexport { nanoid, customAlphabet }\n","import { ReactNode, useCallback, useContext } from 'react';\nimport { ACTIONS } from '../state/constants';\nimport { PortalDispatchContext } from '../contexts/portal';\n\nexport const usePortal = (hostName: string = 'root') => {\n const dispatch = useContext(PortalDispatchContext);\n\n if (dispatch === null) {\n throw new Error(\n \"'PortalDispatchContext' cannot be null, please add 'PortalProvider' to the root component.\"\n );\n }\n\n //#region methods\n const registerHost = useCallback(() => {\n dispatch({\n type: ACTIONS.REGISTER_HOST,\n hostName: hostName,\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const deregisterHost = useCallback(() => {\n dispatch({\n type: ACTIONS.DEREGISTER_HOST,\n hostName: hostName,\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const addUpdatePortal = useCallback((name: string, node: ReactNode) => {\n dispatch({\n type: ACTIONS.ADD_UPDATE_PORTAL,\n hostName,\n portalName: name,\n node,\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const removePortal = useCallback((name: string) => {\n dispatch({\n type: ACTIONS.REMOVE_PORTAL,\n hostName,\n portalName: name,\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n //#endregion\n\n return {\n registerHost,\n deregisterHost,\n addPortal: addUpdatePortal,\n updatePortal: addUpdatePortal,\n removePortal,\n };\n};\n","enum ACTIONS {\n REGISTER_HOST,\n DEREGISTER_HOST,\n ADD_UPDATE_PORTAL,\n REMOVE_PORTAL,\n}\n\nconst INITIAL_STATE = {};\n\nexport { ACTIONS, INITIAL_STATE };\n","import { createContext } from 'react';\nimport type { ActionTypes } from '../state/types';\nimport type { PortalType } from '../types';\n\nexport const PortalStateContext = createContext<Record<\n string,\n Array<PortalType>\n> | null>(null);\nexport const PortalDispatchContext =\n createContext<React.Dispatch<ActionTypes> | null>(null);\n","import React, { memo, useEffect } from 'react';\nimport { usePortalState } from '../../hooks/usePortalState';\nimport { usePortal } from '../../hooks/usePortal';\nimport type { PortalHostProps } from './types';\n\nconst PortalHostComponent = ({ name }: PortalHostProps) => {\n //#region hooks\n const state = usePortalState(name);\n const { registerHost, deregisterHost } = usePortal(name);\n //#endregion\n\n //#region effects\n useEffect(() => {\n registerHost();\n return () => {\n deregisterHost();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n //#endregion\n\n //#region render\n return <>{state.map(item => item.node)}</>;\n //#endregion\n};\n\nexport const PortalHost = memo(PortalHostComponent);\nPortalHost.displayName = 'PortalHost';\n","import { useContext } from 'react';\nimport { PortalStateContext } from '../contexts/portal';\n\nexport const usePortalState = (hostName: string) => {\n const state = useContext(PortalStateContext);\n\n if (state === null) {\n throw new Error(\n \"'PortalStateContext' cannot be null, please add 'PortalProvider' to the root component.\"\n );\n }\n\n return state[hostName] || [];\n};\n","import React, { memo, useReducer } from 'react';\nimport { PortalHost } from '../portalHost/PortalHost';\nimport {\n PortalDispatchContext,\n PortalStateContext,\n} from '../../contexts/portal';\nimport { INITIAL_STATE } from '../../state/constants';\nimport { reducer } from '../../state/reducer';\nimport type { PortalProviderProps } from './types';\n\nconst PortalProviderComponent = ({\n rootHostName = 'root',\n shouldAddRootHost = true,\n children,\n}: PortalProviderProps) => {\n const [state, dispatch] = useReducer(reducer, INITIAL_STATE);\n return (\n <PortalDispatchContext.Provider value={dispatch}>\n <PortalStateContext.Provider value={state}>\n {children}\n {shouldAddRootHost && <PortalHost name={rootHostName} />}\n </PortalStateContext.Provider>\n </PortalDispatchContext.Provider>\n );\n};\n\nexport const PortalProvider = memo(PortalProviderComponent);\nPortalProvider.displayName = 'PortalProvider';\n","interface PrintOptions {\n component?: string;\n method?: string;\n params?: Record<string, any> | string | number | boolean;\n}\n\ntype Print = (options: PrintOptions) => void;\n\nlet isLoggingEnabled = false;\n\n// __DEV__ global is by default not defined in React Native Web builds\nconst isDev = Boolean(typeof __DEV__ !== 'undefined' && __DEV__)\n\nconst enableLogging = () => {\n if (!isDev) {\n console.warn('[Portal] could not enable logging on production!');\n return;\n }\n isLoggingEnabled = true;\n};\n\nlet print: Print = () => {};\n\nif (isDev) {\n print = ({ component, method, params }) => {\n if (!isLoggingEnabled) {\n return;\n }\n let message = '';\n\n if (typeof params === 'object') {\n message = Object.keys(params)\n .map(key => `${key}:${params[key]}`)\n .join(' ');\n } else {\n message = `${params ?? ''}`;\n }\n console.log(\n `[Portal::${[component, method].filter(Boolean).join('::')}]`,\n message\n );\n };\n}\n\nObject.freeze(print);\n\nexport { print, enableLogging };\n","import { ACTIONS } from './constants';\nimport { print } from '../utilities/logger';\nimport type { PortalType } from '../types';\nimport type {\n ActionTypes,\n AddUpdatePortalAction,\n RemovePortalAction,\n} from './types';\n\nconst registerHost = (\n state: Record<string, Array<PortalType>>,\n hostName: string\n) => {\n if (!(hostName in state)) {\n state[hostName] = [];\n }\n return state;\n};\n\nconst deregisterHost = (\n state: Record<string, Array<PortalType>>,\n hostName: string\n) => {\n delete state[hostName];\n return state;\n};\n\nconst addUpdatePortal = (\n state: Record<string, Array<PortalType>>,\n hostName: string,\n portalName: string,\n node: any\n) => {\n if (!(hostName in state)) {\n state = registerHost(state, hostName);\n }\n\n /**\n * updated portal, if it was already added.\n */\n const index = state[hostName].findIndex(item => item.name === portalName);\n if (index !== -1) {\n state[hostName][index].node = node;\n } else {\n state[hostName].push({\n name: portalName,\n node,\n });\n }\n return state;\n};\n\nconst removePortal = (\n state: Record<string, Array<PortalType>>,\n hostName: string,\n portalName: string\n) => {\n if (!(hostName in state)) {\n print({\n component: reducer.name,\n method: removePortal.name,\n params: `Failed to remove portal '${portalName}', '${hostName}' was not registered!`,\n });\n return state;\n }\n\n const index = state[hostName].findIndex(item => item.name === portalName);\n if (index !== -1) state[hostName].splice(index, 1);\n return state;\n};\n\nexport const reducer = (\n state: Record<string, Array<PortalType>>,\n action: ActionTypes\n) => {\n const { type } = action;\n let clonedState = { ...state };\n switch (type) {\n case ACTIONS.REGISTER_HOST:\n return registerHost(clonedState, action.hostName);\n case ACTIONS.DEREGISTER_HOST:\n return deregisterHost(clonedState, action.hostName);\n case ACTIONS.ADD_UPDATE_PORTAL:\n return addUpdatePortal(\n clonedState,\n action.hostName,\n (action as AddUpdatePortalAction).portalName,\n (action as AddUpdatePortalAction).node\n );\n case ACTIONS.REMOVE_PORTAL:\n return removePortal(\n clonedState,\n action.hostName,\n (action as RemovePortalAction).portalName\n );\n default:\n return state;\n }\n};\n","// modal-controller.tsx\nimport React, { type FC, memo, useEffect, useState } from \"react\";\nimport {\n View,\n Animated,\n StyleSheet,\n Dimensions,\n Pressable,\n Keyboard,\n} from \"react-native\";\nimport { Portal } from \"@gorhom/portal\";\nimport { type OverlayReducerAction } from \"../reducer\";\n\ntype ModalControllerProps = {\n overlayId: string;\n isOpen: boolean;\n close: () => void;\n unmount: () => void;\n modalType?: \"center\" | \"bottom\" | \"top\" | \"left\" | \"right\";\n backdropOpacity?: number;\n animationType?: \"none\" | \"slide\" | \"fade\";\n swipeDirection?:\n | \"up\"\n | \"down\"\n | \"left\"\n | \"right\"\n | Array<\"up\" | \"down\" | \"left\" | \"right\">;\n};\n\nexport type ModalControllerComponent<T = {}> = FC<ModalControllerProps & T>;\n\ntype ContentModalControllerProps = {\n isOpen: boolean;\n overlayId: string;\n overlayDispatch: React.Dispatch<OverlayReducerAction>;\n controller: ModalControllerComponent | React.ReactElement;\n overlayOrderList: string[];\n options?: {\n modalType?: \"center\" | \"bottom\" | \"top\" | \"left\" | \"right\";\n backdropOpacity?: number;\n animationType?: \"none\" | \"slide\" | \"fade\";\n swipeDirection?:\n | \"up\"\n | \"down\"\n | \"left\"\n | \"right\"\n | Array<\"up\" | \"down\" | \"left\" | \"right\">;\n closeFunction?: () => void;\n // coveredByBottomSheet?: boolean;\n };\n};\n\nconst { width: SCREEN_WIDTH, height: SCREEN_HEIGHT } = Dimensions.get(\"window\");\n\nexport const ContentModalController = memo(\n ({\n isOpen,\n overlayId,\n overlayDispatch,\n controller: Controller,\n overlayOrderList,\n options = {},\n }: ContentModalControllerProps) => {\n const {\n modalType = \"center\",\n backdropOpacity = 0.5,\n animationType = \"fade\",\n swipeDirection,\n closeFunction,\n } = options;\n\n const [backdropAnimation] = useState(new Animated.Value(0));\n const [contentAnimation] = useState(new Animated.Value(0));\n const [mounted, setMounted] = useState<boolean>(isOpen);\n const [isClosing, setIsClosing] = useState(false);\n\n useEffect(() => {\n if (isOpen) {\n // ensure mounted before playing open animation\n if (!mounted) setMounted(true);\n setImmediate(() => {\n overlayDispatch({ type: \"OPEN\", overlayId });\n });\n Animated.parallel([\n Animated.timing(backdropAnimation, {\n toValue: 1,\n duration: 300,\n useNativeDriver: true,\n }),\n Animated.timing(contentAnimation, {\n toValue: 1,\n duration: 300,\n useNativeDriver: true,\n }),\n ]).start();\n } else {\n // play close animation, then unmount to avoid touch blocking\n Animated.parallel([\n Animated.timing(backdropAnimation, {\n toValue: 0,\n duration: 200,\n useNativeDriver: true,\n }),\n Animated.timing(contentAnimation, {\n toValue: 0,\n duration: 200,\n useNativeDriver: true,\n }),\n ]).start(() => {\n setMounted(false);\n // 애니메이션 끝나면 메모리에서 완전히 제거\n overlayDispatch({ type: \"REMOVE\", overlayId });\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen]);\n\n const handleClose = () => {\n // 이미 닫히는 중이면 무시 (중복 클릭 방지)\n if (isClosing) {\n return;\n }\n setIsClosing(true);\n\n // 키보드가 열려있다면 먼저 닫기\n Keyboard.dismiss();\n\n // 즉시 모달 닫기 (requestAnimationFrame으로 한 프레임만 대기)\n requestAnimationFrame(() => {\n overlayDispatch({ type: \"REMOVE\", overlayId });\n\n if (closeFunction) {\n closeFunction();\n }\n });\n };\n\n const getLayerIndex = () => {\n return Math.max(0, overlayOrderList.indexOf(overlayId));\n };\n\n const getZIndex = () => {\n const index = overlayOrderList.indexOf(overlayId);\n // modal은 bottomSheet보다 앞에 나오도록 더 높은 zIndex 사용\n return 1000 + index;\n };\n\n const getContainerStyle = () => {\n switch (modalType) {\n case \"bottom\":\n return styles.bottomContainer;\n case \"top\":\n return styles.topContainer;\n case \"left\":\n return styles.leftContainer;\n case \"right\":\n return styles.rightContainer;\n default:\n return styles.centerContainer;\n }\n };\n\n const getContentAnimationStyle = () => {\n const baseOpacity = { opacity: contentAnimation };\n\n switch (modalType) {\n case \"bottom\":\n return {\n ...baseOpacity,\n transform: [\n {\n translateY: contentAnimation.interpolate({\n inputRange: [0, 1],\n outputRange: [SCREEN_HEIGHT, 0],\n }),\n },\n ],\n };\n case \"top\":\n return {\n ...baseOpacity,\n transform: [\n {\n translateY: contentAnimation.interpolate({\n inputRange: [0, 1],\n outputRange: [-SCREEN_HEIGHT, 0],\n }),\n },\n ],\n };\n case \"left\":\n return {\n ...baseOpacity,\n transform: [\n {\n translateX: contentAnimation.interpolate({\n inputRange: [0, 1],\n outputRange: [-SCREEN_WIDTH, 0],\n }),\n },\n ],\n };\n case \"right\":\n return {\n ...baseOpacity,\n transform: [\n {\n translateX: contentAnimation.interpolate({\n inputRange: [0, 1],\n outputRange: [SCREEN_WIDTH, 0],\n }),\n },\n ],\n };\n default:\n if (animationType === \"slide\") {\n return {\n ...baseOpacity,\n transform: [\n {\n scale: contentAnimation.interpolate({\n inputRange: [0, 1],\n outputRange: [0.8, 1],\n }),\n },\n ],\n };\n }\n return baseOpacity;\n }\n };\n // const isCovered = !!options?.coveredByBottomSheet;\n // const isHidden = isCovered;\n\n if (!mounted) return null;\n\n return (\n <Portal hostName={`overlay-modal-${getLayerIndex()}`}>\n <View\n style={[styles.absoluteContainer]}\n pointerEvents={isOpen ? \"box-none\" : \"none\"}\n importantForAccessibility={isOpen ? \"auto\" : \"no-hide-descendants\"}\n >\n <Pressable\n style={StyleSheet.absoluteFill}\n onPress={handleClose}\n disabled={!isOpen}\n >\n <Animated.View\n pointerEvents=\"none\"\n style={[\n styles.backdrop,\n {\n backgroundColor: `rgba(0, 0, 0, ${backdropOpacity})`,\n opacity: backdropAnimation,\n },\n ]}\n />\n </Pressable>\n\n <Animated.View\n style={[getContainerStyle(), getContentAnimationStyle()]}\n pointerEvents=\"box-none\"\n >\n <View pointerEvents=\"box-none\">\n {React.isValidElement(Controller)\n ? React.cloneElement(Controller as React.ReactElement<any>, {\n close: () => overlayDispatch({ type: \"CLOSE\", overlayId }),\n unmount: () =>\n overlayDispatch({ type: \"REMOVE\", overlayId }),\n })\n : React.createElement(Controller as any, {\n isOpen,\n overlayId,\n modalType,\n backdropOpacity,\n animationType,\n swipeDirection,\n close: () => overlayDispatch({ type: \"CLOSE\", overlayId }),\n unmount: () =>\n overlayDispatch({ type: \"REMOVE\", overlayId }),\n })}\n </View>\n </Animated.View>\n </View>\n </Portal>\n );\n }\n);\n\nconst styles = StyleSheet.create({\n absoluteContainer: {\n ...StyleSheet.absoluteFillObject,\n },\n backdrop: {\n ...StyleSheet.absoluteFillObject,\n },\n centerContainer: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"center\",\n paddingHorizontal: 20,\n },\n bottomContainer: {\n flex: 1,\n justifyContent: \"flex-end\",\n },\n topContainer: {\n flex: 1,\n justifyContent: \"flex-start\",\n },\n leftContainer: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"flex-start\",\n },\n rightContainer: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"flex-end\",\n },\n});\n","// 사용자가 실제로 사용하는 API 를 만드는 팩토리\n// overlay.open(), overlay.close 등\n\nimport React from \"react\";\nimport {\n OverlayAsyncControllerComponent,\n OverlayControllerComponent,\n} from \"./context/provider/content-overlay-controller\";\nimport { BottomSheetControllerComponent } from \"./context/provider/bottom-sheet-controller\";\nimport { ModalControllerComponent } from \"./context/provider/modal-controller\";\nimport { createUseExternalEvents } from \"./utils/create-use-external-events\";\nimport { randomId } from \"./utils/random-id\";\nimport { getComponentName } from \"./utils/get-component-name\";\nimport { BottomSheetFooterProps } from \"@gorhom/bottom-sheet\";\nimport { StyleProp, ViewStyle } from \"react-native\";\n\nexport type OverlayEvent = {\n open: (args: {\n controller:\n | OverlayControllerComponent\n | BottomSheetControllerComponent\n | ModalControllerComponent\n | React.ReactElement;\n overlayId: string;\n componentKey: string;\n componentName?: string;\n overlayType?: \"overlay\" | \"bottomSheet\" | \"modal\";\n options?: any;\n }) => void;\n close: (overlayId: string) => void;\n unmount: (overlayId: string) => void;\n closeAll: () => void;\n unmountAll: () => void;\n};\n\ntype OpenOverlayOptions = {\n overlayId?: string;\n overlayType?: \"overlay\" | \"bottomSheet\" | \"modal\";\n // BottomSheet options\n snapPoints?: (string | number)[];\n enablePanDownToClose?: boolean;\n closeAllOnGestureClose?: boolean;\n // Modal options\n modalType?: \"center\" | \"bottom\" | \"top\" | \"left\" | \"right\";\n backdropOpacity?: number;\n keyboardBehavior?: \"interactive\" | \"extend\" | \"fillParent\";\n keyboardBlurBehavior?: \"restore\" | \"none\";\n androidKeyboardInputMode?: \"adjustResize\" | \"adjustPan\";\n enableDynamicSizing?: boolean;\n closeFunction?: () => void;\n isHandleClose?: boolean;\n // Styling options\n backgroundStyle?: StyleProp<ViewStyle>;\n handleStyle?: StyleProp<ViewStyle>;\n\n animationType?:\n | \"none\"\n | \"slide\"\n | \"fade\"\n | \"bounceIn\"\n | \"bounceInDown\"\n | \"bounceInUp\"\n | \"bounceInLeft\"\n | \"bounceInRight\"\n | \"bounceOut\"\n | \"bounceOutDown\"\n | \"bounceOutUp\"\n | \"bounceOutLeft\"\n | \"bounceOutRight\"\n | \"fadeIn\"\n | \"fadeInDown\"\n | \"fadeInDownBig\"\n | \"fadeInUp\"\n | \"fadeInUpBig\"\n | \"fadeInLeft\"\n | \"fadeInLeftBig\"\n | \"fadeInRight\"\n | \"fadeInRightBig\"\n | \"fadeOut\"\n | \"fadeOutDown\"\n | \"fadeOutDownBig\"\n | \"fadeOutUp\"\n | \"fadeOutUpBig\"\n | \"fadeOutLeft\"\n | \"fadeOutLeftBig\"\n | \"fadeOutRight\"\n | \"fadeOutRightBig\";\n swipeDirection?:\n | \"up\"\n | \"down\"\n | \"left\"\n | \"right\"\n | Array<\"up\" | \"down\" | \"left\" | \"right\">;\n footerComponent?: React.FC<BottomSheetFooterProps>;\n};\n// id 받아\nexport function createOverlay(overlayId: string) {\n const [useOverlayEvent, createEvent] = createUseExternalEvents<OverlayEvent>(\n `${overlayId}/overlay-kit`\n );\n\n const open = (\n controller:\n | OverlayControllerComponent\n | BottomSheetControllerComponent\n | ModalControllerComponent\n | React.ReactElement,\n options?: OpenOverlayOptions\n ) => {\n const overlayId = options?.overlayId ?? randomId();\n const componentKey = randomId();\n const overlayType = options?.overlayType ?? \"overlay\";\n const componentName = getComponentName(controller);\n\n const dispatchOpenEvent = createEvent(\"open\");\n\n // 옵션에서 overlayType과 overlayId를 제외한 나머지를 options로 전달\n const { overlayId: _, overlayType: __, ...restOptions } = options || {};\n\n // JSX 엘리먼트인 경우 wrapper 컴포넌트로 감싸기\n let finalController;\n if (React.isValidElement(controller)) {\n finalController = (props: any) => {\n return React.cloneElement(controller as React.ReactElement, {\n ...(controller.props || {}),\n ...props,\n close: props.close,\n unmount: props.unmount,\n });\n };\n } else {\n finalController = controller;\n }\n\n dispatchOpenEvent({\n controller: finalController,\n overlayId,\n componentKey,\n componentName,\n overlayType,\n options: restOptions,\n });\n return overlayId;\n };\n\n // openAsync는 모든 overlay 타입에서 사용 가능\n const openAsync = async <T>(\n controller:\n | OverlayAsyncControllerComponent<T>\n | BottomSheetControllerComponent\n | ModalControllerComponent\n | React.ReactElement\n | ((props: any) => any),\n options?: OpenOverlayOptions\n ) => {\n return new Promise<T>((resolve) => {\n const wrappedController = (overlayProps: any) => {\n const close = (param?: T) => {\n resolve(param as T);\n overlayProps.close();\n };\n const unmount = (param?: T) => {\n resolve(param as T);\n overlayProps.unmount();\n };\n const props = { ...overlayProps, close, unmount };\n\n // JSX 엘리먼트인 경우 처리\n if (React.isValidElement(controller)) {\n return React.cloneElement(controller as React.ReactElement, {\n ...(controller.props || {}),\n ...props,\n });\n }\n\n // 함수인 경우 호출\n if (typeof controller === \"function\") {\n return controller(props);\n }\n\n // 기타 컴포넌트 타입인 경우\n return controller;\n };\n\n open(wrappedController, options);\n });\n };\n const close = createEvent(\"close\");\n const unmount = createEvent(\"unmount\");\n const closeAll = createEvent(\"closeAll\");\n const unmountAll = createEvent(\"unmountAll\");\n return {\n open,\n openAsync,\n close,\n unmount,\n closeAll,\n unmountAll,\n useOverlayEvent,\n };\n}\n","import { useEffect } from \"react\";\nimport { createEmitter } from \"./emitter\";\n\nconst emitter = createEmitter();\n\n// React Native에서는 useEffect를 사용 (useLayoutEffect 대신)\nfunction useClientEffect(...args: Parameters<typeof useEffect>) {\n // RN에서는 항상 useEffect 실행\n useEffect(...args);\n}\n\n// 단순한 wrapper 함수\n// emitter.emit을 한번 감싼 이유는 나중에 로깅, 디버깅 등 추가 기능을 넣기 위함\nfunction dispatchEvent<Detail>(type: string, detail?: Detail) {\n emitter.emit(type, detail);\n}\n\n// 메인 팩토리 함수\n// 사용 예\n// createUseExternalEvents<OverlayEvents>('overlay-kit')\n// prefix의 역할:\n// - 'overlay-kit' → 실제 이벤트명은 overlay-kit:open, overlay-kit:close\n// - 네임스페이스로 이벤트 충돌 방지\n\nfunction createUseExternalEvents<\n EventHandlers extends Record<string, (params: any) => void>\n>(prefix: string) {\n function useExternalEvents(events: EventHandlers) {\n // 변환 과정:\n // 입력:\n // events = {\n // open: (data) => console.log('열기', data),\n // close: (id) => console.log('닫기', id)\n // }\n\n // 변환 결과:\n // handlers = {\n // 'overlay-kit:open': (event) => events.open(event),\n // 'overlay-kit:close': (event) => events.close(event)\n // }\n\n const handlers = Object.keys(events).reduce<Record<string, () => void>>(\n (prev, eventKey) => {\n const currentEventKeys = `${prefix}:${eventKey}`;\n\n return {\n ...prev,\n [currentEventKeys]: function (event: unknown) {\n events[eventKey](event);\n } as () => void,\n };\n },\n {}\n );\n\n useClientEffect(() => {\n Object.keys(handlers).forEach((eventKey) => {\n emitter.off(eventKey, handlers[eventKey]); // 🔥 기존 핸들러 제거\n // (중복 방지)\n emitter.on(eventKey, handlers[eventKey]); // 🔥 새로운 핸들러 등록\n });\n\n // 🧹 컴포넌트 언마운트시 정리\n return () =>\n Object.keys(handlers).forEach((eventKey) => {\n emitter.off(eventKey, handlers[eventKey]);\n });\n }, [handlers]);\n }\n\n // 타입 분석:\n // EventKey = 'open' | 'close' | 'closeAll'\n // Parameters<EventHandlers['open']> = [data: {component: Component, id:\n // string}]\n\n // const openEvent = createEvent('open');\n // openEvent의 타입: (data: {component: Component, id: string}) => void\n\n // openEvent({component: MyModal, id: '123'});\n // → dispatchEvent('overlay-kit:open', {component: MyModal, id: '123'})\n\n // payload[0]을 사용하는 이유:\n // 함수 호출: openEvent(arg1, arg2, arg3)\n // payload = [arg1, arg2, arg3]\n // payload[0] = arg1 (첫 번째 인자만 이벤트 데이터로 전달)\n\n function createEvent<EventKey extends keyof EventHandlers>(event: EventKey) {\n return (...payload: Parameters<EventHandlers[EventKey]>) =>\n dispatchEvent(`${prefix}:${String(event)}`, payload[0]);\n }\n\n return [useExternalEvents, createEvent] as const;\n}\n\n// 💡 이 패턴의 천재적인 점\n\n// 1. React 외부에서 React 내부 제어: overlay.open() 같은 명령형 API 가능\n// 2. 타입 안전성: TypeScript로 이벤트 타입 완벽 추론\n// 3. 메모리 안전: React Hook 생명주기와 완벽 동기화\n// 4. 플랫폼 호환: 웹/RN 모두 지원\n// 5. 네임스페이스: 이벤트 충돌 방지\n\nexport { createUseExternalEvents };\n","\n// 이벤트 이름\nexport type EventType = string | symbol;\n\n// 이벤트 핸들러\nexport type Handler<T = unknown> = (event: T) => void;\nexport type WildcardHandler<T = Record<string, unknown>> = (type: keyof T, event: T[keyof T]) => void;\n\n// 이벤트 핸들러 목록\nexport type EventHandlerList<T = unknown> = Array<Handler<T>>;\nexport type WildCardEventHandlerList<T = Record<string, unknown>> = Array<WildcardHandler<T>>;\n\n// 이벤트 핸들러 맵\nexport type EventHandlerMap<Events extends Record<EventType, unknown>> = Map<\n keyof Events | '*',\n EventHandlerList<Events[keyof Events]> | WildCardEventHandlerList<Events>\n>;\n\n// 이벤트 발행기\nexport interface Emitter<Events extends Record<EventType, unknown>> {\n all: EventHandlerMap<Events>;\n\n on<Key extends keyof Events>(type: Key, handler: Handler<Events[Key]>): void;\n on(type: '*', handler: WildcardHandler<Events>): void;\n\n off<Key extends keyof Events>(type: Key, handler?: Handler<Events[Key]>): void;\n off(type: '*', handler: WildcardHandler<Events>): void;\n\n emit<Key extends keyof Events>(type: Key, event: Events[Key]): void;\n emit<Key extends keyof Events>(type: undefined extends Events[Key] ? Key : never): void;\n}\n\nexport function createEmitter<Events extends Record<EventType, unknown>>(\n all?: EventHandlerMap<Events>\n): Emitter<Events> {\n type GenericEventHandler = Handler<Events[keyof Events]> | WildcardHandler<Events>;\n all = all || new Map();\n\n return {\n all,\n on<Key extends keyof Events>(type: Key, handler: GenericEventHandler) {\n const handlers: Array<GenericEventHandler> | undefined = all!.get(type);\n if (handlers) {\n handlers.push(handler);\n } else {\n all!.set(type, [handler] as EventHandlerList<Events[keyof Events]>);\n }\n },\n off<Key extends keyof Events>(type: Key, handler?: GenericEventHandler) {\n const handlers: Array<GenericEventHandler> | undefined = all!.get(type);\n if (handlers) {\n if (handler) {\n handlers.splice(handlers.indexOf(handler) >>> 0, 1);\n } else {\n all!.set(type, []);\n }\n }\n },\n emit<Key extends keyof Events>(type: Key, evt?: Events[Key]) {\n let handlers = all!.get(type);\n if (handlers) {\n (handlers as EventHandlerList<Events[keyof Events]>).slice().forEach((handler) => {\n handler(evt!);\n });\n }\n\n handlers = all!.get('*');\n if (handlers) {\n (handlers as WildCardEventHandlerList<Events>).slice().forEach((handler) => {\n handler(type, evt!);\n });\n }\n },\n };\n}","export function randomId() {\n return `overlay-kit-${Math.random().toString(36).slice(2, 11)}`;\n}","import React from 'react';\n\n/**\n * React 컴포넌트나 함수로부터 이름을 추출합니다.\n * 디버깅 목적으로 사용됩니다.\n */\nexport function getComponentName(controller: any): string {\n // 1. displayName 우선 (개발자가 명시적으로 설정한 이름)\n if (controller?.displayName) {\n return controller.displayName;\n }\n\n // 2. React element인 경우\n if (React.isValidElement(controller)) {\n const type = controller.type as any;\n if (type?.displayName) return type.displayName;\n if (type?.name && type.name !== 'anonymous') return type.name;\n }\n\n // 3. 함수/컴포넌트의 name 속성\n if (typeof controller === 'function') {\n if (controller.name && controller.name !== 'anonymous') {\n return controller.name;\n }\n }\n\n // 4. 래핑된 컴포넌트 (forwardRef, memo 등)\n if (controller?.type?.displayName) {\n return controller.type.displayName;\n }\n if (controller?.type?.name && controller.type.name !== 'anonymous') {\n return controller.type.name;\n }\n\n // 5. Fallback\n return 'Anonymous';\n}\n","import { type Provider, createContext, useContext } from 'react';\n\ntype NullSymbolType = typeof NullSymbol;\nconst NullSymbol = Symbol('Null');\n\nexport type CreateContextReturn<T> = [Provider<T>, () => T];\n\nexport function createSafeContext<T>(displayName?: string): CreateContextReturn<T> {\n const Context = createContext<T | NullSymbolType>(NullSymbol);\n Context.displayName = displayName ?? 'SafeContext';\n\n function useSafeContext() {\n const context = useContext(Context);\n\n if (context === NullSymbol) {\n const error = new Error(`[${Context.displayName}]: Provider not found.`);\n error.name = '[Error] Context';\n\n throw error;\n }\n\n return context;\n }\n\n return [Context.Provider as any, useSafeContext];\n}\n","import { createSafeContext } from '../utils/create-safe-context';\nimport { type OverlayData } from './reducer';\n\n\nexport function createOverlaySafeContext() {\n const [OverlayContextProvider, useOverlayContext] = createSafeContext<OverlayData>('overlay-kit/OverlayContext');\n\n function useCurrentOverlay() {\n return useOverlayContext().current;\n }\n\n function useOverlayData() {\n return useOverlayContext().overlayData;\n }\n\n return { OverlayContextProvider, useCurrentOverlay, useOverlayData };\n}\n","import { OverlayControllerComponent } from \"./provider/content-overlay-controller\";\nimport { BottomSheetControllerComponent } from \"./provider/bottom-sheet-controller\";\nimport { ModalControllerComponent } from \"./provider/modal-controller\";\n\ntype OverlayId = string;\ntype OverlayItem = {\n /**\n * @description 오버레이 고유한 ID\n */\n id : OverlayId;\n /**\n * @description 오버레이 컴포넌트의 고유한 키\n * 컴포넌트가 언마운트시 사용됩니다.\n */\n componentKey: string;\n /**\n * @description 컴포넌트 이름 (디버깅용)\n */\n componentName?: string;\n isOpen: boolean;\n isMounted: boolean;\n controller: OverlayControllerComponent | BottomSheetControllerComponent | ModalControllerComponent;\n overlayType?: 'overlay' | 'bottomSheet' | 'modal';\n options?: any;\n}\nexport type OverlayData = {\n current: OverlayId | null; // 현재 열려있는 오버레이 ID\n overlayOrderList: OverlayId[];\n overlayData: Record<OverlayId, OverlayItem>;\n}\nexport type OverlayReducerAction =\n | { type: 'ADD'; overlay: OverlayItem }\n | { type: 'OPEN'; overlayId: string }\n | { type: 'CLOSE'; overlayId: string }\n | { type: 'REMOVE'; overlayId: string }\n | { type: 'CLOSE_ALL' }\n | { type: 'REMOVE_ALL' };\n\n/**\n * 오버레이를 닫거나 제거할 때, 어떤 오버레이를 현재(current)로 지정할지 결정합니다.\n *\n * @description 마지막 오버레이를 닫을 경우, 그 이전 오버레이를 현재로 지정합니다.\n * @description 중간에 있는 오버레이를 닫을 경우, 마지막 오버레이를 현재로 지정합니다.\n *\n * @example open - [1, 2, 3, 4]\n * close 2 => current: 4\n * close 4 => current: 3\n * close 3 => current: 1\n * close 1 => current: null\n *\n * @param overlayOrderList 오버레이 ID가 순서대로 담긴 리스트\n * @param overlayData 오버레이 데이터 맵\n * @param targetOverlayId 닫거나 제거하려는 오버레이의 ID\n * @returns 현재로 지정될 오버레이의 ID, 없으면 null\n */\nexport const determineCurrentOverlayId = (overlayOrderList: OverlayId[], overlayData: Record<OverlayId, OverlayItem>, targetOverlayId: OverlayId): OverlayId | null => {\n // 1단계: 열린 오버레이들만 필터링\n\n const openedOverlayOrderList = overlayOrderList.filter(\n (orderedOverlayId) => overlayData[orderedOverlayId].isOpen === true\n );\n // 2단계: 닫힐 오버레이의 위치 찾기\n const targetIndexInOpenedList = openedOverlayOrderList.findIndex((item) => item === targetOverlayId);\n\n // 3단계: 다음 활성 오버레이 결정\n return targetIndexInOpenedList === openedOverlayOrderList.length - 1\n ? openedOverlayOrderList[targetIndexInOpenedList - 1] ?? null // 마지막이면 이전 것\n : openedOverlayOrderList[openedOverlayOrderList.length - 1] ?? null;// 중간이면 최상위\n\n}\n\n/** 동작 예시:\n * \n *\n * // 상황: 오버레이 [1, 2, 3, 4]가 순서대로 열려있음\n * overlayOrderList = [\"modal-1\", \"modal-2\", \"modal-3\", \"modal-4\"];\n * // 모두 isOpen: true\n *\n * // 케이스 1: 최상위(4번) 닫기\n * determineCurrentOverlayId(list, data, \"modal-4\");\n * // → \"modal-3\" (바로 아래가 활성화)\n *\n * // 케이스 2: 중간(2번) 닫기\n * determineCurrentOverlayId(list, data, \"modal-2\");\n * // → \"modal-4\" (최상위가 여전히 활성)\n *\n * // 케이스 3: 마지막 남은 것 닫기\n * determineCurrentOverlayId([\"modal-1\"], data, \"modal-1\");\n * // → null (더 이상 활성 오버레이 없음)\n */\n\n// 상태 변경 로직\nexport function overlayReducer(state: OverlayData, action: OverlayReducerAction): OverlayData {\n switch (action.type) {\n case 'ADD': {\n const isExisted = state.overlayOrderList.includes(action.overlay.id);\n const existingOverlay = state.overlayData[action.overlay.id];\n\n // 이미 같은 overlayId를 가진 오버레이가 열려있다면, 중복 추가하지 않고 기존 것을 맨 앞으로 가져오기\n if (isExisted && existingOverlay?.isOpen === true) {\n return {\n ...state,\n current: action.overlay.id,\n // 이미 열려있는 오버레이를 맨 앞으로 이동\n overlayOrderList: [...state.overlayOrderList.filter((item) => item !== action.overlay.id), action.overlay.id],\n };\n }\n\n // 같은 overlayId를 가진 오버레이가 존재하지만 닫혀있는 경우, 다시 열기\n if (isExisted && existingOverlay?.isOpen === false) {\n return {\n ...state,\n current: action.overlay.id,\n // 맨 앞으로 이동\n overlayOrderList: [...state.overlayOrderList.filter((item) => item !== action.overlay.id), action.overlay.id],\n overlayData: {\n ...state.overlayData,\n [action.overlay.id]: { ...existingOverlay, isOpen: true, isMounted: true },\n },\n };\n }\n\n // 새로운 오버레이 추가\n return {\n current: action.overlay.id,\n overlayOrderList: [...state.overlayOrderList, action.overlay.id],\n overlayData: {\n ...state.overlayData,\n [action.overlay.id]: action.overlay,\n },\n };\n }\n case 'OPEN': {\n const overlay = state.overlayData[action.overlayId];\n\n // ignore if the overlay don't exist or already open\n if (overlay == null || overlay.isOpen) {\n return state;\n }\n\n return {\n ...state,\n current: action.overlayId,\n // 닫혀있던 오버레이를 다시 열 때 맨 뒤로 이동시켜 최상단에 표시\n overlayOrderList: [...state.overlayOrderList.filter((item) => item !== action.overlayId), action.overlayId],\n overlayData: {\n ...state.overlayData,\n [action.overlayId]: { ...overlay, isOpen: true, isMounted: true },\n },\n };\n }\n case 'CLOSE': {\n const overlay = state.overlayData[action.overlayId];\n\n // ignore if the overlay don't exist or already closed\n if (overlay == null || !overlay.isOpen) {\n return state;\n }\n\n const currentOverlayId = determineCurrentOverlayId(state.overlayOrderList, state.overlayData, action.overlayId);\n\n return {\n ...state,\n current: currentOverlayId,\n overlayData: {\n ...state.overlayData,\n [action.overlayId]: {\n ...state.overlayData[action.overlayId],\n isOpen: false,\n },\n },\n };\n }\n case 'REMOVE': {\n const overlay = state.overlayData[action.overlayId];\n\n // ignore if the overlay don't exist\n if (overlay == null) {\n return state;\n }\n\n const remainingOverlays = state.overlayOrderList.filter((item) => item !== action.overlayId);\n if (state.overlayOrderList.length === remainingOverlays.length) {\n return state;\n }\n\n const copiedOverlayData = { ...state.overlayData };\n delete copiedOverlayData[action.overlayId];\n\n const currentOverlayId = determineCurrentOverlayId(state.overlayOrderList, state.overlayData, action.overlayId);\n\n return {\n current: currentOverlayId,\n overlayOrderList: remainingOverlays,\n overlayData: copiedOverlayData,\n };\n }\n case 'CLOSE_ALL': {\n // ignore if there is no overlay\n if (Object.keys(state.overlayData).length === 0) {\n return state;\n }\n\n return {\n ...state,\n current: null,\n overlayData: Object.keys(state.overlayData).reduce(\n (prev, curr) => ({\n ...prev,\n [curr]: {\n ...state.overlayData[curr],\n isOpen: false,\n } satisfies OverlayItem,\n }),\n {} satisfies Record<string, OverlayItem>\n ),\n };\n }\n case 'REMOVE_ALL': {\n return { current: null, overlayOrderList: [], overlayData: {} };\n }\n }\n}","import { createOverlayProvider } from '../context/provider';\n\nexport const { overlay, OverlayProvider, useCurrentOverlay, useOverlayData } = createOverlayProvider();\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function experimental_createOverlayContext() {\n return createOverlayProvider();\n}"],"mappings":"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","names":["useCallback","useEffect","useReducer","useRef","Platform","React","memo","useEffect","useRef","useCallback","useMemo","memo","useCallback","useEffect","useMemo","useRef","useCallback","useContext","ACTIONS","INITIAL_STATE","createContext","PortalStateContext","PortalDispatchContext","usePortal","hostName","dispatch","useContext","PortalDispatchContext","Error","registerHost","useCallback","type","ACTIONS","REGISTER_HOST","deregisterHost","DEREGISTER_HOST","addUpdatePortal","name","node","ADD_UPDATE_PORTAL","portalName","removePortal","REMOVE_PORTAL","addPortal","updatePortal","PortalComponent","name","_providedName","hostName","handleOnMount","_providedHandleOnMount","handleOnUnmount","_providedHandleOnUnmount","handleOnUpdate","_providedHandleOnUpdate","children","addPortal","addUpdatePortal","removePortal","usePortal","useMemo","nanoid","handleOnMountRef","useRef","handleOnUnmountRef","handleOnUpdateRef","useCallback","current","useEffect","undefined","Portal","memo","displayName","React","memo","useEffect","useContext","usePortalState","hostName","state","useContext","PortalStateContext","Error","PortalHostComponent","name","state","usePortalState","registerHost","deregisterHost","usePortal","useEffect","React","map","item","node","PortalHost","memo","displayName","React","memo","useReducer","isLoggingEnabled","isDev","Boolean","__DEV__","print","isDev","component","method","params","isLoggingEnabled","message","Object","keys","map","key","join","console","log","filter","Boolean","freeze","registerHost","state","hostName","deregisterHost","addUpdatePortal","portalName","node","index","findIndex","item","name","push","removePortal","print","component","reducer","method","params","splice","action","type","clonedState","ACTIONS","REGISTER_HOST","DEREGISTER_HOST","ADD_UPDATE_PORTAL","REMOVE_PORTAL","PortalProviderComponent","rootHostName","shouldAddRootHost","children","state","dispatch","useReducer","reducer","INITIAL_STATE","React","PortalProvider","memo","displayName","jsx","memo","useRef","useMemo","useEffect","_a","useCallback","React","React","memo","useEffect","useState","View","StyleSheet","Keyboard","jsx","memo","useState","useEffect","Keyboard","View","StyleSheet","React","React","useEffect","useEffect","React","overlayId","React","close","unmount","createContext","useContext","useCurrentOverlay","useOverlayData","overlay","BottomSheetModalProvider","jsx","jsxs","overlay","useCurrentOverlay","useOverlayData","OverlayProvider","useReducer","useRef","useEffect","useCallback","overlayId","Platform","BottomSheetModalProvider","_a"]}
|
|
1
|
+
{"version":3,"sources":["../src/context/provider/index.tsx","../src/context/provider/content-overlay-controller.tsx","../src/context/provider/bottom-sheet-controller.tsx","../node_modules/@gorhom/portal/lib/module/components/portal/Portal.tsx","../node_modules/nanoid/non-secure/index.js","../node_modules/@gorhom/portal/lib/module/hooks/usePortal.ts","../node_modules/@gorhom/portal/lib/module/state/constants.ts","../node_modules/@gorhom/portal/lib/module/contexts/portal.ts","../node_modules/@gorhom/portal/lib/module/components/portalHost/PortalHost.tsx","../node_modules/@gorhom/portal/lib/module/hooks/usePortalState.ts","../node_modules/@gorhom/portal/lib/module/components/portalProvider/PortalProvider.tsx","../node_modules/@gorhom/portal/lib/module/utilities/logger.ts","../node_modules/@gorhom/portal/lib/module/state/reducer.ts","../src/context/provider/modal-controller.tsx","../src/event.ts","../src/utils/create-use-external-events.ts","../src/utils/emitter.ts","../src/utils/random-id.ts","../src/utils/get-component-name.ts","../src/utils/create-safe-context.ts","../src/context/context.ts","../src/context/reducer.ts","../src/utils/create-overlay-context.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useReducer,\n useRef,\n type PropsWithChildren,\n} from \"react\";\nimport { BackHandler, Platform, View } from \"react-native\";\nimport { ContentOverlayController } from \"./content-overlay-controller\";\nimport { ContentBottomSheetController } from \"./bottom-sheet-controller\";\nimport { ContentModalController } from \"./modal-controller\";\nimport { type OverlayEvent, createOverlay } from \"../../event\";\nimport { randomId } from \"../../utils/random-id\";\nimport { createOverlaySafeContext } from \"../context\";\nimport { overlayReducer } from \"../reducer\";\nimport { GestureHandlerRootView } from \"react-native-gesture-handler\";\nimport { BottomSheetModalProvider } from \"@gorhom/bottom-sheet\";\nimport { PortalProvider, PortalHost } from \"@gorhom/portal\";\n\nexport function createOverlayProvider() {\n const overlayId = randomId();\n const { useOverlayEvent, ...overlay } = createOverlay(overlayId);\n\n const { OverlayContextProvider, useCurrentOverlay, useOverlayData } =\n createOverlaySafeContext();\n\n function OverlayProvider({ children }: PropsWithChildren) {\n const [overlayState, overlayDispatch] = useReducer(overlayReducer, {\n current: null,\n overlayOrderList: [],\n overlayData: {},\n });\n const overlayStateRef = useRef(overlayState);\n\n useEffect(() => {\n overlayStateRef.current = overlayState;\n }, [overlayState]);\n\n // Overlay 이벤트 핸들러들\n const overlayOpen: OverlayEvent[\"open\"] = useCallback(\n ({\n controller,\n overlayId,\n componentKey,\n componentName,\n overlayType = \"overlay\",\n options,\n }) => {\n overlayDispatch({\n type: \"ADD\",\n overlay: {\n id: overlayId,\n componentKey,\n componentName,\n isOpen: true,\n isMounted: true,\n controller: controller,\n overlayType,\n options,\n },\n });\n },\n []\n );\n\n const close = useCallback((overlayId: string) => {\n overlayDispatch({ type: \"CLOSE\", overlayId });\n }, []);\n\n const unmount = useCallback((overlayId: string) => {\n overlayDispatch({ type: \"REMOVE\", overlayId });\n }, []);\n\n const closeAll = useCallback(() => {\n overlayDispatch({ type: \"CLOSE_ALL\" });\n }, []);\n\n const unmountAll = useCallback(() => {\n overlayDispatch({ type: \"REMOVE_ALL\" });\n }, []);\n\n // 이벤트 리스너 등록\n useOverlayEvent({\n open: overlayOpen,\n close,\n unmount,\n closeAll,\n unmountAll,\n });\n\n useEffect(() => {\n return () => {\n overlayDispatch({ type: \"REMOVE_ALL\" });\n };\n }, []);\n\n useEffect(() => {\n if (Platform.OS !== \"android\") {\n return;\n }\n\n const onHardwareBackPress = () => {\n const { overlayOrderList, overlayData } = overlayStateRef.current;\n\n for (let idx = overlayOrderList.length - 1; idx >= 0; idx -= 1) {\n const currentOverlayId = overlayOrderList[idx];\n const overlayItem = overlayData[currentOverlayId];\n\n if (!overlayItem?.isOpen) {\n continue;\n }\n\n if (\n overlayItem.overlayType === \"modal\" ||\n overlayItem.overlayType === \"bottomSheet\"\n ) {\n overlayDispatch({ type: \"REMOVE\", overlayId: currentOverlayId });\n return true;\n }\n }\n\n return false;\n };\n\n const subscription = BackHandler.addEventListener(\n \"hardwareBackPress\",\n onHardwareBackPress\n );\n\n return () => {\n subscription.remove();\n };\n }, [overlayDispatch, overlayState.overlayOrderList]);\n\n return (\n <GestureHandlerRootView style={{ flex: 1 }}>\n <PortalProvider>\n <BottomSheetModalProvider>\n <OverlayContextProvider value={overlayState}>\n {children}\n\n {/* 1) Modal/Overlay 먼저 렌더: BottomSheet가 열려있으면 모달은 숨김 */}\n {overlayState.overlayOrderList.map((item) => {\n const overlayItem = overlayState.overlayData[item];\n const {\n id: currentOverlayId,\n componentKey,\n isOpen,\n controller: Controller,\n overlayType,\n options,\n } = overlayItem;\n\n if (overlayType === \"bottomSheet\") return null;\n\n // hasOpenBottomSheet 계산 (모달은 항상 마운트 유지, 대신 '가려짐' 상태만 전달)\n const hasOpenBottomSheet = overlayState.overlayOrderList.some(\n (id) =>\n overlayState.overlayData[id]?.overlayType ===\n \"bottomSheet\" && overlayState.overlayData[id]?.isOpen\n );\n\n if (overlayType === \"modal\") {\n const sameTypeOverlays = overlayState.overlayOrderList.filter(\n (id) =>\n overlayState.overlayData[id]?.overlayType === \"modal\" &&\n overlayState.overlayData[id]?.isOpen\n );\n const isTopModal =\n sameTypeOverlays[sameTypeOverlays.length - 1] ===\n currentOverlayId;\n const shouldShow = isOpen && isTopModal; // ★ 더 이상 닫지 않음\n\n return (\n <ContentModalController\n key={componentKey}\n isOpen={isOpen}\n controller={Controller as any}\n overlayId={currentOverlayId}\n overlayDispatch={overlayDispatch}\n overlayOrderList={overlayState.overlayOrderList}\n options={{\n ...options,\n coveredByBottomSheet: hasOpenBottomSheet,\n }}\n />\n );\n }\n\n // fallback: overlay\n return (\n <ContentOverlayController\n key={componentKey}\n isOpen={isOpen}\n controller={Controller as any}\n overlayId={currentOverlayId}\n overlayDispatch={overlayDispatch}\n />\n );\n })}\n\n {/* 2) BottomSheet는 항상 마지막에 렌더 */}\n {overlayState.overlayOrderList.map((item) => {\n const overlayItem = overlayState.overlayData[item];\n const {\n id: currentOverlayId,\n componentKey,\n isOpen,\n controller: Controller,\n overlayType,\n options,\n } = overlayItem;\n\n if (overlayType !== \"bottomSheet\") return null;\n\n const sameTypeOverlays = overlayState.overlayOrderList.filter(\n (id) =>\n overlayState.overlayData[id]?.overlayType ===\n \"bottomSheet\" && overlayState.overlayData[id]?.isOpen\n );\n const isTopBottomSheet =\n sameTypeOverlays[sameTypeOverlays.length - 1] ===\n currentOverlayId;\n const shouldShow = isOpen && isTopBottomSheet;\n\n return (\n <ContentBottomSheetController\n key={componentKey}\n isOpen={isOpen}\n controller={Controller as any}\n overlayId={currentOverlayId}\n overlayDispatch={overlayDispatch}\n overlayOrderList={overlayState.overlayOrderList}\n options={options}\n />\n );\n })}\n\n {/* Portal hosts for modals, ordered by overlayOrderList index (controls stacking) */}\n {overlayState.overlayOrderList.map((id, idx) => (\n <PortalHost\n key={`overlay-modal-${idx}`}\n name={`overlay-modal-${idx}`}\n />\n ))}\n </OverlayContextProvider>\n </BottomSheetModalProvider>\n </PortalProvider>\n </GestureHandlerRootView>\n );\n }\n\n return {\n overlay,\n OverlayProvider,\n useCurrentOverlay,\n useOverlayData,\n };\n}\n","import React, { type FC, memo, useEffect, type Dispatch } from \"react\";\nimport { Modal } from \"react-native\";\nimport { type OverlayReducerAction } from \"../reducer\";\n\ntype OverlayControllerProps = {\n overlayId: string;\n isOpen: boolean;\n close: () => void;\n unmount: () => void;\n};\n\ntype OverlayAsyncControllerProps<T> = Omit<OverlayControllerProps, \"close\"> & {\n close: (param: T) => void;\n};\n\nexport type OverlayControllerComponent = FC<OverlayControllerProps>;\nexport type OverlayAsyncControllerComponent<T> = FC<\n OverlayAsyncControllerProps<T>\n>;\n\ntype ContentOverlayControllerProps = {\n isOpen: boolean;\n overlayId: string;\n overlayDispatch: Dispatch<OverlayReducerAction>;\n controller: OverlayControllerComponent;\n};\n\nexport const ContentOverlayController = memo(\n ({\n isOpen,\n overlayId,\n overlayDispatch,\n controller: Controller,\n }: ContentOverlayControllerProps) => {\n useEffect(() => {\n setImmediate(() => {\n overlayDispatch({ type: \"OPEN\", overlayId });\n });\n }, [overlayDispatch, overlayId]);\n\n const handleClose = () => {\n overlayDispatch({ type: \"CLOSE\", overlayId });\n // 커스텀 애니메이션을 위한 짧은 딜레이 후 메모리에서 제거\n setTimeout(() => {\n overlayDispatch({ type: \"REMOVE\", overlayId });\n }, 200);\n };\n\n return (\n <Controller\n isOpen={isOpen}\n overlayId={overlayId}\n close={handleClose}\n unmount={() => overlayDispatch({ type: \"REMOVE\", overlayId })}\n />\n );\n }\n);\n","import React, {\n type FC,\n memo,\n useEffect,\n useRef,\n type Dispatch,\n useCallback,\n useState,\n useMemo,\n} from \"react\";\nimport BottomSheet, {\n BottomSheetModal,\n BottomSheetView,\n BottomSheetFlatList,\n BottomSheetScrollView,\n BottomSheetBackdrop,\n BottomSheetModalProvider,\n BottomSheetTextInput,\n BottomSheetFooterProps,\n} from \"@gorhom/bottom-sheet\";\n\nimport {\n StyleProp,\n ViewStyle,\n ListRenderItem,\n View,\n StyleSheet,\n Platform,\n Keyboard,\n} from \"react-native\";\nimport { useReducedMotion, Easing } from \"react-native-reanimated\";\nimport { type OverlayReducerAction } from \"../reducer\";\nimport { Portal } from \"@gorhom/portal\";\n\ntype BottomSheetControllerProps<T = any> = {\n overlayId: string;\n isOpen: boolean;\n close: () => void;\n unmount: () => void;\n snapPoints?: (string | number)[];\n enablePanDownToClose?: boolean;\n // Enhanced features\n header?: React.ReactNode;\n footer?: React.ReactNode;\n children?: React.ReactNode;\n // FlatList support\n isFlatList?: boolean;\n data?: ArrayLike<T> | null | undefined;\n renderItem?: ListRenderItem<T> | null | undefined;\n keyExtractor?: ((item: T, index: number) => string) | undefined;\n contentContainerStyle?: StyleProp<ViewStyle> | undefined;\n ItemSeparatorComponent?: React.ComponentType<any> | null | undefined;\n flatListHeader?: React.ReactNode;\n flatListFooter?: React.ReactNode;\n // Backdrop\n enableBackdrop?: boolean;\n backdropOpacity?: number;\n onBackdropPress?: () => void;\n // Dynamic sizing\n enableDynamicSizing?: boolean;\n // Scrolling\n enableScrolling?: boolean;\n // Styling\n backgroundStyle?: StyleProp<ViewStyle>;\n handleStyle?: StyleProp<ViewStyle>;\n // Loading & empty state\n isLoading?: boolean;\n emptyText?: string;\n extraData?: any;\n};\n\nexport type BottomSheetControllerComponent<T = any> = FC<\n BottomSheetControllerProps<T>\n>;\n\ntype ContentBottomSheetControllerProps = {\n isOpen: boolean;\n overlayId: string;\n overlayDispatch: Dispatch<OverlayReducerAction>;\n controller: BottomSheetControllerComponent | React.ReactElement;\n overlayOrderList: string[];\n options?: {\n snapPoints?: (string | number)[];\n enablePanDownToClose?: boolean;\n enableBackdrop?: boolean;\n backdropOpacity?: number;\n enableDynamicSizing?: boolean;\n backgroundStyle?: StyleProp<ViewStyle>;\n handleStyle?: StyleProp<ViewStyle>;\n keyboardBehavior?: \"interactive\" | \"extend\" | \"fillParent\";\n keyboardBlurBehavior?: \"restore\" | \"none\";\n androidKeyboardInputMode?: \"adjustResize\" | \"adjustPan\";\n closeAllOnGestureClose?: boolean;\n closeFunction?: () => void;\n isHandleClose?: boolean;\n [key: string]: any;\n };\n};\n\nexport const ContentBottomSheetController = memo(\n ({\n isOpen,\n overlayId,\n overlayDispatch,\n controller: Controller,\n overlayOrderList,\n options = {},\n }: ContentBottomSheetControllerProps) => {\n const bottomSheetRef = useRef<BottomSheet>(null);\n const reducedMotion = useReducedMotion();\n const isClosingRef = useRef(false);\n const closeTimerRef = useRef<NodeJS.Timeout | null>(null);\n\n // 빠른 닫힘 애니메이션 설정\n const animationConfigs = useMemo(\n () => ({\n duration: 200, // 200ms로 빠르게\n easing: Easing.out(Easing.cubic),\n }),\n []\n );\n\n // Use react-native-keyboard-controller for keyboard tracking (number type)\n const [keyboardHeight, setKeyboardHeight] = useState(0);\n const isKeyboardActiveRef = useRef(false);\n\n // 키보드 상태 감지 (빠른 반응을 위해 ref 사용)\n useEffect(() => {\n const keyboardWillShowListener = Keyboard.addListener(\n Platform.OS === \"ios\" ? \"keyboardWillShow\" : \"keyboardDidShow\",\n (e) => {\n isKeyboardActiveRef.current = true;\n setKeyboardHeight(e.endCoordinates.height);\n }\n );\n const keyboardWillHideListener = Keyboard.addListener(\n Platform.OS === \"ios\" ? \"keyboardWillHide\" : \"keyboardDidHide\",\n () => {\n isKeyboardActiveRef.current = false;\n setKeyboardHeight(0);\n }\n );\n\n return () => {\n keyboardWillShowListener.remove();\n keyboardWillHideListener.remove();\n };\n }, []);\n\n const getZIndex = () => {\n const index = overlayOrderList.indexOf(overlayId);\n // bottomSheet는 항상 modal보다 앞에 나오도록 훨씬 높은 zIndex 사용\n return 1000 + index;\n };\n\n // --- Android keyboard handling defaults ---\n // On Android, the sheet won't move with the keyboard unless:\n // 1) Activity windowSoftInputMode = \"adjustResize\"\n // 2) bottom-sheet uses keyboardBehavior=\"extend\"\n // 3) Text inputs inside sheet use BottomSheetTextInput\n\n const {\n snapPoints,\n enablePanDownToClose = true,\n enableBackdrop = true,\n backdropOpacity = 0.5,\n enableDynamicSizing = true,\n backgroundStyle = {},\n handleStyle = {},\n keyboardBehavior = Platform.OS === \"android\" ? \"extend\" : \"interactive\",\n keyboardBlurBehavior = \"restore\",\n androidKeyboardInputMode = \"adjustResize\",\n closeAllOnGestureClose = false,\n isHandleClose = true,\n closeFunction,\n ...restOptions\n } = options;\n\n useEffect(() => {\n if (isOpen) {\n // 바텀시트가 열릴 때 플래그와 타이머 초기화\n isClosingRef.current = false;\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n\n const rafId = requestAnimationFrame(() => {\n bottomSheetRef.current?.expand();\n overlayDispatch({ type: \"OPEN\", overlayId });\n });\n return () => cancelAnimationFrame(rafId);\n } else {\n // bottomSheetRef.current?.close();\n }\n }, [isOpen, overlayDispatch, overlayId]);\n\n // 컴포넌트 언마운트 시 타이머 정리\n useEffect(() => {\n return () => {\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n isClosingRef.current = false;\n };\n }, []);\n\n // 키보드가 열려있다면 먼저 닫고, 그 다음 바텀시트 닫기\n const handleClose = useCallback(() => {\n // 이미 닫히는 중이면 무시 (중복 클릭 방지)\n if (isClosingRef.current) {\n return;\n }\n isClosingRef.current = true;\n\n // 기존 타이머가 있다면 정리\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n\n // 키보드가 활성화되어 있으면 먼저 키보드를 닫기\n if (keyboardHeight > 0) {\n Keyboard.dismiss();\n // 키보드 닫히는 애니메이션 시간을 최소화\n closeTimerRef.current = setTimeout(() => {\n closeTimerRef.current = null;\n\n if (closeAllOnGestureClose) {\n overlayDispatch({ type: \"REMOVE_ALL\" });\n } else {\n overlayDispatch({ type: \"REMOVE\", overlayId });\n }\n\n if (closeFunction) {\n closeFunction();\n }\n\n // 작업 완료 후 플래그 리셋\n isClosingRef.current = false;\n }, 50);\n return;\n }\n\n // 키보드가 활성화되어 있지 않으면 즉시 바텀시트 닫기\n // requestAnimationFrame으로 한 프레임만 대기 후 즉시 제거\n requestAnimationFrame(() => {\n if (closeAllOnGestureClose) {\n overlayDispatch({ type: \"REMOVE_ALL\" });\n } else {\n overlayDispatch({ type: \"REMOVE\", overlayId });\n }\n if (closeFunction) {\n closeFunction();\n }\n\n // 작업 완료 후 플래그 리셋\n isClosingRef.current = false;\n });\n }, [\n overlayDispatch,\n overlayId,\n closeAllOnGestureClose,\n closeFunction,\n keyboardHeight,\n ]);\n\n // 백드롭 렌더링\n const renderBackdrop = useCallback(\n (props: any) => (\n <BottomSheetBackdrop\n {...props}\n appearsOnIndex={1}\n disappearsOnIndex={-1}\n opacity={backdropOpacity}\n // pressBehavior=\"close\"\n onPress={handleClose}\n />\n ),\n [backdropOpacity, handleClose]\n );\n\n // callbacks\n const handleSheetChange = useCallback((index: number) => {}, []);\n const getLayerIndex = () => {\n return Math.max(0, overlayOrderList.indexOf(overlayId));\n };\n if (!isOpen) return null;\n\n return (\n <Portal hostName={`overlay-modal-${getLayerIndex()}`}>\n <BottomSheet\n style={[{ zIndex: getZIndex() }]}\n ref={bottomSheetRef}\n onChange={handleSheetChange}\n android_keyboardInputMode={androidKeyboardInputMode}\n keyboardBehavior={keyboardBehavior}\n snapPoints={enableDynamicSizing ? undefined : snapPoints}\n enablePanDownToClose={enablePanDownToClose}\n onClose={isHandleClose ? handleClose : undefined}\n bottomInset={Platform.OS === \"android\" ? keyboardHeight : 0}\n keyboardBlurBehavior={keyboardBlurBehavior}\n animationConfigs={animationConfigs}\n // index={0}\n backdropComponent={enableBackdrop ? renderBackdrop : undefined}\n backgroundStyle={[\n {\n borderTopLeftRadius: 16,\n borderTopRightRadius: 16,\n },\n backgroundStyle,\n ]}\n handleStyle={[\n {\n backgroundColor: \"transparent\",\n borderTopLeftRadius: 16,\n borderTopRightRadius: 16,\n },\n handleStyle,\n ]}\n enableDynamicSizing={enableDynamicSizing}\n animateOnMount={!reducedMotion}\n >\n {React.isValidElement(Controller)\n ? React.cloneElement(Controller as React.ReactElement<any>, {\n close: () => overlayDispatch({ type: \"CLOSE\", overlayId }),\n unmount: () => overlayDispatch({ type: \"REMOVE\", overlayId }),\n })\n : React.createElement(Controller as any, {\n isOpen,\n overlayId,\n snapPoints,\n enablePanDownToClose,\n close: () => overlayDispatch({ type: \"CLOSE\", overlayId }),\n unmount: () => overlayDispatch({ type: \"REMOVE\", overlayId }),\n ...restOptions,\n })}\n </BottomSheet>\n </Portal>\n );\n }\n);\n","import { memo, useCallback, useEffect, useMemo, useRef } from 'react';\nimport { nanoid } from 'nanoid/non-secure';\nimport { usePortal } from '../../hooks/usePortal';\nimport type { PortalProps } from './types';\n\nconst PortalComponent = ({\n name: _providedName,\n hostName,\n handleOnMount: _providedHandleOnMount,\n handleOnUnmount: _providedHandleOnUnmount,\n handleOnUpdate: _providedHandleOnUpdate,\n children,\n}: PortalProps) => {\n //#region hooks\n const { addPortal: addUpdatePortal, removePortal } = usePortal(hostName);\n //#endregion\n\n //#region variables\n const name = useMemo(() => _providedName || nanoid(), [_providedName]);\n //#endregion\n\n //#region refs\n const handleOnMountRef = useRef<Function>();\n const handleOnUnmountRef = useRef<Function>();\n const handleOnUpdateRef = useRef<Function>();\n //#endregion\n\n //#region callbacks\n const handleOnMount = useCallback(() => {\n if (_providedHandleOnMount) {\n _providedHandleOnMount(() => addUpdatePortal(name, children));\n } else {\n addUpdatePortal(name, children);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [_providedHandleOnMount, addUpdatePortal]);\n handleOnMountRef.current = handleOnMount;\n\n const handleOnUnmount = useCallback(() => {\n if (_providedHandleOnUnmount) {\n _providedHandleOnUnmount(() => removePortal(name));\n } else {\n removePortal(name);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [_providedHandleOnUnmount, removePortal]);\n handleOnUnmountRef.current = handleOnUnmount;\n\n const handleOnUpdate = useCallback(() => {\n if (_providedHandleOnUpdate) {\n _providedHandleOnUpdate(() => addUpdatePortal(name, children));\n } else {\n addUpdatePortal(name, children);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [_providedHandleOnUpdate, addUpdatePortal, children]);\n handleOnUpdateRef.current = handleOnUpdate;\n //#endregion\n\n //#region effects\n useEffect(() => {\n handleOnMountRef.current?.();\n return () => {\n handleOnUnmountRef.current?.();\n\n // remove callbacks refs\n handleOnMountRef.current = undefined;\n handleOnUnmountRef.current = undefined;\n handleOnUpdateRef.current = undefined;\n };\n }, []);\n useEffect(() => {\n handleOnUpdateRef.current?.();\n }, [children]);\n //#endregion\n\n return null;\n};\n\nexport const Portal = memo(PortalComponent);\nPortal.displayName = 'Portal';\n","let urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\nlet customAlphabet = (alphabet, defaultSize = 21) => {\n return (size = defaultSize) => {\n let id = ''\n let i = size | 0\n while (i--) {\n id += alphabet[(Math.random() * alphabet.length) | 0]\n }\n return id\n }\n}\nlet nanoid = (size = 21) => {\n let id = ''\n let i = size | 0\n while (i--) {\n id += urlAlphabet[(Math.random() * 64) | 0]\n }\n return id\n}\nexport { nanoid, customAlphabet }\n","import { ReactNode, useCallback, useContext } from 'react';\nimport { ACTIONS } from '../state/constants';\nimport { PortalDispatchContext } from '../contexts/portal';\n\nexport const usePortal = (hostName: string = 'root') => {\n const dispatch = useContext(PortalDispatchContext);\n\n if (dispatch === null) {\n throw new Error(\n \"'PortalDispatchContext' cannot be null, please add 'PortalProvider' to the root component.\"\n );\n }\n\n //#region methods\n const registerHost = useCallback(() => {\n dispatch({\n type: ACTIONS.REGISTER_HOST,\n hostName: hostName,\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const deregisterHost = useCallback(() => {\n dispatch({\n type: ACTIONS.DEREGISTER_HOST,\n hostName: hostName,\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const addUpdatePortal = useCallback((name: string, node: ReactNode) => {\n dispatch({\n type: ACTIONS.ADD_UPDATE_PORTAL,\n hostName,\n portalName: name,\n node,\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const removePortal = useCallback((name: string) => {\n dispatch({\n type: ACTIONS.REMOVE_PORTAL,\n hostName,\n portalName: name,\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n //#endregion\n\n return {\n registerHost,\n deregisterHost,\n addPortal: addUpdatePortal,\n updatePortal: addUpdatePortal,\n removePortal,\n };\n};\n","enum ACTIONS {\n REGISTER_HOST,\n DEREGISTER_HOST,\n ADD_UPDATE_PORTAL,\n REMOVE_PORTAL,\n}\n\nconst INITIAL_STATE = {};\n\nexport { ACTIONS, INITIAL_STATE };\n","import { createContext } from 'react';\nimport type { ActionTypes } from '../state/types';\nimport type { PortalType } from '../types';\n\nexport const PortalStateContext = createContext<Record<\n string,\n Array<PortalType>\n> | null>(null);\nexport const PortalDispatchContext =\n createContext<React.Dispatch<ActionTypes> | null>(null);\n","import React, { memo, useEffect } from 'react';\nimport { usePortalState } from '../../hooks/usePortalState';\nimport { usePortal } from '../../hooks/usePortal';\nimport type { PortalHostProps } from './types';\n\nconst PortalHostComponent = ({ name }: PortalHostProps) => {\n //#region hooks\n const state = usePortalState(name);\n const { registerHost, deregisterHost } = usePortal(name);\n //#endregion\n\n //#region effects\n useEffect(() => {\n registerHost();\n return () => {\n deregisterHost();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n //#endregion\n\n //#region render\n return <>{state.map(item => item.node)}</>;\n //#endregion\n};\n\nexport const PortalHost = memo(PortalHostComponent);\nPortalHost.displayName = 'PortalHost';\n","import { useContext } from 'react';\nimport { PortalStateContext } from '../contexts/portal';\n\nexport const usePortalState = (hostName: string) => {\n const state = useContext(PortalStateContext);\n\n if (state === null) {\n throw new Error(\n \"'PortalStateContext' cannot be null, please add 'PortalProvider' to the root component.\"\n );\n }\n\n return state[hostName] || [];\n};\n","import React, { memo, useReducer } from 'react';\nimport { PortalHost } from '../portalHost/PortalHost';\nimport {\n PortalDispatchContext,\n PortalStateContext,\n} from '../../contexts/portal';\nimport { INITIAL_STATE } from '../../state/constants';\nimport { reducer } from '../../state/reducer';\nimport type { PortalProviderProps } from './types';\n\nconst PortalProviderComponent = ({\n rootHostName = 'root',\n shouldAddRootHost = true,\n children,\n}: PortalProviderProps) => {\n const [state, dispatch] = useReducer(reducer, INITIAL_STATE);\n return (\n <PortalDispatchContext.Provider value={dispatch}>\n <PortalStateContext.Provider value={state}>\n {children}\n {shouldAddRootHost && <PortalHost name={rootHostName} />}\n </PortalStateContext.Provider>\n </PortalDispatchContext.Provider>\n );\n};\n\nexport const PortalProvider = memo(PortalProviderComponent);\nPortalProvider.displayName = 'PortalProvider';\n","interface PrintOptions {\n component?: string;\n method?: string;\n params?: Record<string, any> | string | number | boolean;\n}\n\ntype Print = (options: PrintOptions) => void;\n\nlet isLoggingEnabled = false;\n\n// __DEV__ global is by default not defined in React Native Web builds\nconst isDev = Boolean(typeof __DEV__ !== 'undefined' && __DEV__)\n\nconst enableLogging = () => {\n if (!isDev) {\n console.warn('[Portal] could not enable logging on production!');\n return;\n }\n isLoggingEnabled = true;\n};\n\nlet print: Print = () => {};\n\nif (isDev) {\n print = ({ component, method, params }) => {\n if (!isLoggingEnabled) {\n return;\n }\n let message = '';\n\n if (typeof params === 'object') {\n message = Object.keys(params)\n .map(key => `${key}:${params[key]}`)\n .join(' ');\n } else {\n message = `${params ?? ''}`;\n }\n console.log(\n `[Portal::${[component, method].filter(Boolean).join('::')}]`,\n message\n );\n };\n}\n\nObject.freeze(print);\n\nexport { print, enableLogging };\n","import { ACTIONS } from './constants';\nimport { print } from '../utilities/logger';\nimport type { PortalType } from '../types';\nimport type {\n ActionTypes,\n AddUpdatePortalAction,\n RemovePortalAction,\n} from './types';\n\nconst registerHost = (\n state: Record<string, Array<PortalType>>,\n hostName: string\n) => {\n if (!(hostName in state)) {\n state[hostName] = [];\n }\n return state;\n};\n\nconst deregisterHost = (\n state: Record<string, Array<PortalType>>,\n hostName: string\n) => {\n delete state[hostName];\n return state;\n};\n\nconst addUpdatePortal = (\n state: Record<string, Array<PortalType>>,\n hostName: string,\n portalName: string,\n node: any\n) => {\n if (!(hostName in state)) {\n state = registerHost(state, hostName);\n }\n\n /**\n * updated portal, if it was already added.\n */\n const index = state[hostName].findIndex(item => item.name === portalName);\n if (index !== -1) {\n state[hostName][index].node = node;\n } else {\n state[hostName].push({\n name: portalName,\n node,\n });\n }\n return state;\n};\n\nconst removePortal = (\n state: Record<string, Array<PortalType>>,\n hostName: string,\n portalName: string\n) => {\n if (!(hostName in state)) {\n print({\n component: reducer.name,\n method: removePortal.name,\n params: `Failed to remove portal '${portalName}', '${hostName}' was not registered!`,\n });\n return state;\n }\n\n const index = state[hostName].findIndex(item => item.name === portalName);\n if (index !== -1) state[hostName].splice(index, 1);\n return state;\n};\n\nexport const reducer = (\n state: Record<string, Array<PortalType>>,\n action: ActionTypes\n) => {\n const { type } = action;\n let clonedState = { ...state };\n switch (type) {\n case ACTIONS.REGISTER_HOST:\n return registerHost(clonedState, action.hostName);\n case ACTIONS.DEREGISTER_HOST:\n return deregisterHost(clonedState, action.hostName);\n case ACTIONS.ADD_UPDATE_PORTAL:\n return addUpdatePortal(\n clonedState,\n action.hostName,\n (action as AddUpdatePortalAction).portalName,\n (action as AddUpdatePortalAction).node\n );\n case ACTIONS.REMOVE_PORTAL:\n return removePortal(\n clonedState,\n action.hostName,\n (action as RemovePortalAction).portalName\n );\n default:\n return state;\n }\n};\n","// modal-controller.tsx\nimport React, { type FC, memo, useEffect, useState } from \"react\";\nimport {\n View,\n Animated,\n StyleSheet,\n Dimensions,\n Pressable,\n Keyboard,\n} from \"react-native\";\nimport { Portal } from \"@gorhom/portal\";\nimport { type OverlayReducerAction } from \"../reducer\";\n\ntype ModalControllerProps = {\n overlayId: string;\n isOpen: boolean;\n close: () => void;\n unmount: () => void;\n modalType?: \"center\" | \"bottom\" | \"top\" | \"left\" | \"right\";\n backdropOpacity?: number;\n animationType?: \"none\" | \"slide\" | \"fade\";\n swipeDirection?:\n | \"up\"\n | \"down\"\n | \"left\"\n | \"right\"\n | Array<\"up\" | \"down\" | \"left\" | \"right\">;\n};\n\nexport type ModalControllerComponent<T = {}> = FC<ModalControllerProps & T>;\n\ntype ContentModalControllerProps = {\n isOpen: boolean;\n overlayId: string;\n overlayDispatch: React.Dispatch<OverlayReducerAction>;\n controller: ModalControllerComponent | React.ReactElement;\n overlayOrderList: string[];\n options?: {\n modalType?: \"center\" | \"bottom\" | \"top\" | \"left\" | \"right\";\n backdropOpacity?: number;\n animationType?: \"none\" | \"slide\" | \"fade\";\n swipeDirection?:\n | \"up\"\n | \"down\"\n | \"left\"\n | \"right\"\n | Array<\"up\" | \"down\" | \"left\" | \"right\">;\n closeFunction?: () => void;\n // coveredByBottomSheet?: boolean;\n };\n};\n\nconst { width: SCREEN_WIDTH, height: SCREEN_HEIGHT } = Dimensions.get(\"window\");\n\nexport const ContentModalController = memo(\n ({\n isOpen,\n overlayId,\n overlayDispatch,\n controller: Controller,\n overlayOrderList,\n options = {},\n }: ContentModalControllerProps) => {\n const {\n modalType = \"center\",\n backdropOpacity = 0.5,\n animationType = \"fade\",\n swipeDirection,\n closeFunction,\n } = options;\n\n const [backdropAnimation] = useState(new Animated.Value(0));\n const [contentAnimation] = useState(new Animated.Value(0));\n const [mounted, setMounted] = useState<boolean>(isOpen);\n const [isClosing, setIsClosing] = useState(false);\n\n useEffect(() => {\n if (isOpen) {\n // ensure mounted before playing open animation\n if (!mounted) setMounted(true);\n setImmediate(() => {\n overlayDispatch({ type: \"OPEN\", overlayId });\n });\n Animated.parallel([\n Animated.timing(backdropAnimation, {\n toValue: 1,\n duration: 300,\n useNativeDriver: true,\n }),\n Animated.timing(contentAnimation, {\n toValue: 1,\n duration: 300,\n useNativeDriver: true,\n }),\n ]).start();\n } else {\n // play close animation, then unmount to avoid touch blocking\n Animated.parallel([\n Animated.timing(backdropAnimation, {\n toValue: 0,\n duration: 200,\n useNativeDriver: true,\n }),\n Animated.timing(contentAnimation, {\n toValue: 0,\n duration: 200,\n useNativeDriver: true,\n }),\n ]).start(() => {\n setMounted(false);\n // 애니메이션 끝나면 메모리에서 완전히 제거\n overlayDispatch({ type: \"REMOVE\", overlayId });\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen]);\n\n const handleClose = () => {\n // 이미 닫히는 중이면 무시 (중복 클릭 방지)\n if (isClosing) {\n return;\n }\n setIsClosing(true);\n\n // 키보드가 열려있다면 먼저 닫기\n Keyboard.dismiss();\n\n // 즉시 모달 닫기 (requestAnimationFrame으로 한 프레임만 대기)\n requestAnimationFrame(() => {\n overlayDispatch({ type: \"REMOVE\", overlayId });\n\n if (closeFunction) {\n closeFunction();\n }\n });\n };\n\n const getLayerIndex = () => {\n return Math.max(0, overlayOrderList.indexOf(overlayId));\n };\n\n const getZIndex = () => {\n const index = overlayOrderList.indexOf(overlayId);\n // modal은 bottomSheet보다 앞에 나오도록 더 높은 zIndex 사용\n return 1000 + index;\n };\n\n const getContainerStyle = () => {\n switch (modalType) {\n case \"bottom\":\n return styles.bottomContainer;\n case \"top\":\n return styles.topContainer;\n case \"left\":\n return styles.leftContainer;\n case \"right\":\n return styles.rightContainer;\n default:\n return styles.centerContainer;\n }\n };\n\n const getContentAnimationStyle = () => {\n const baseOpacity = { opacity: contentAnimation };\n\n switch (modalType) {\n case \"bottom\":\n return {\n ...baseOpacity,\n transform: [\n {\n translateY: contentAnimation.interpolate({\n inputRange: [0, 1],\n outputRange: [SCREEN_HEIGHT, 0],\n }),\n },\n ],\n };\n case \"top\":\n return {\n ...baseOpacity,\n transform: [\n {\n translateY: contentAnimation.interpolate({\n inputRange: [0, 1],\n outputRange: [-SCREEN_HEIGHT, 0],\n }),\n },\n ],\n };\n case \"left\":\n return {\n ...baseOpacity,\n transform: [\n {\n translateX: contentAnimation.interpolate({\n inputRange: [0, 1],\n outputRange: [-SCREEN_WIDTH, 0],\n }),\n },\n ],\n };\n case \"right\":\n return {\n ...baseOpacity,\n transform: [\n {\n translateX: contentAnimation.interpolate({\n inputRange: [0, 1],\n outputRange: [SCREEN_WIDTH, 0],\n }),\n },\n ],\n };\n default:\n if (animationType === \"slide\") {\n return {\n ...baseOpacity,\n transform: [\n {\n scale: contentAnimation.interpolate({\n inputRange: [0, 1],\n outputRange: [0.8, 1],\n }),\n },\n ],\n };\n }\n return baseOpacity;\n }\n };\n // const isCovered = !!options?.coveredByBottomSheet;\n // const isHidden = isCovered;\n\n if (!mounted) return null;\n\n return (\n <Portal hostName={`overlay-modal-${getLayerIndex()}`}>\n <View\n style={[styles.absoluteContainer]}\n pointerEvents={isOpen ? \"box-none\" : \"none\"}\n importantForAccessibility={isOpen ? \"auto\" : \"no-hide-descendants\"}\n >\n <Pressable\n style={StyleSheet.absoluteFill}\n onPress={handleClose}\n disabled={!isOpen}\n >\n <Animated.View\n pointerEvents=\"none\"\n style={[\n styles.backdrop,\n {\n backgroundColor: `rgba(0, 0, 0, ${backdropOpacity})`,\n opacity: backdropAnimation,\n },\n ]}\n />\n </Pressable>\n\n <Animated.View\n style={[getContainerStyle(), getContentAnimationStyle()]}\n pointerEvents=\"box-none\"\n >\n <View pointerEvents=\"box-none\">\n {React.isValidElement(Controller)\n ? React.cloneElement(Controller as React.ReactElement<any>, {\n close: () => overlayDispatch({ type: \"CLOSE\", overlayId }),\n unmount: () =>\n overlayDispatch({ type: \"REMOVE\", overlayId }),\n })\n : React.createElement(Controller as any, {\n isOpen,\n overlayId,\n modalType,\n backdropOpacity,\n animationType,\n swipeDirection,\n close: () => overlayDispatch({ type: \"CLOSE\", overlayId }),\n unmount: () =>\n overlayDispatch({ type: \"REMOVE\", overlayId }),\n })}\n </View>\n </Animated.View>\n </View>\n </Portal>\n );\n }\n);\n\nconst styles = StyleSheet.create({\n absoluteContainer: {\n ...StyleSheet.absoluteFillObject,\n },\n backdrop: {\n ...StyleSheet.absoluteFillObject,\n },\n centerContainer: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"center\",\n paddingHorizontal: 20,\n },\n bottomContainer: {\n flex: 1,\n justifyContent: \"flex-end\",\n },\n topContainer: {\n flex: 1,\n justifyContent: \"flex-start\",\n },\n leftContainer: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"flex-start\",\n },\n rightContainer: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"flex-end\",\n },\n});\n","// 사용자가 실제로 사용하는 API 를 만드는 팩토리\n// overlay.open(), overlay.close 등\n\nimport React from \"react\";\nimport {\n OverlayAsyncControllerComponent,\n OverlayControllerComponent,\n} from \"./context/provider/content-overlay-controller\";\nimport { BottomSheetControllerComponent } from \"./context/provider/bottom-sheet-controller\";\nimport { ModalControllerComponent } from \"./context/provider/modal-controller\";\nimport { createUseExternalEvents } from \"./utils/create-use-external-events\";\nimport { randomId } from \"./utils/random-id\";\nimport { getComponentName } from \"./utils/get-component-name\";\nimport { BottomSheetFooterProps } from \"@gorhom/bottom-sheet\";\nimport { StyleProp, ViewStyle } from \"react-native\";\n\nexport type OverlayEvent = {\n open: (args: {\n controller:\n | OverlayControllerComponent\n | BottomSheetControllerComponent\n | ModalControllerComponent\n | React.ReactElement;\n overlayId: string;\n componentKey: string;\n componentName?: string;\n overlayType?: \"overlay\" | \"bottomSheet\" | \"modal\";\n options?: any;\n }) => void;\n close: (overlayId: string) => void;\n unmount: (overlayId: string) => void;\n closeAll: () => void;\n unmountAll: () => void;\n};\n\ntype OpenOverlayOptions = {\n overlayId?: string;\n overlayType?: \"overlay\" | \"bottomSheet\" | \"modal\";\n // BottomSheet options\n snapPoints?: (string | number)[];\n enablePanDownToClose?: boolean;\n closeAllOnGestureClose?: boolean;\n // Modal options\n modalType?: \"center\" | \"bottom\" | \"top\" | \"left\" | \"right\";\n backdropOpacity?: number;\n keyboardBehavior?: \"interactive\" | \"extend\" | \"fillParent\";\n keyboardBlurBehavior?: \"restore\" | \"none\";\n androidKeyboardInputMode?: \"adjustResize\" | \"adjustPan\";\n enableDynamicSizing?: boolean;\n closeFunction?: () => void;\n isHandleClose?: boolean;\n // Styling options\n backgroundStyle?: StyleProp<ViewStyle>;\n handleStyle?: StyleProp<ViewStyle>;\n\n animationType?:\n | \"none\"\n | \"slide\"\n | \"fade\"\n | \"bounceIn\"\n | \"bounceInDown\"\n | \"bounceInUp\"\n | \"bounceInLeft\"\n | \"bounceInRight\"\n | \"bounceOut\"\n | \"bounceOutDown\"\n | \"bounceOutUp\"\n | \"bounceOutLeft\"\n | \"bounceOutRight\"\n | \"fadeIn\"\n | \"fadeInDown\"\n | \"fadeInDownBig\"\n | \"fadeInUp\"\n | \"fadeInUpBig\"\n | \"fadeInLeft\"\n | \"fadeInLeftBig\"\n | \"fadeInRight\"\n | \"fadeInRightBig\"\n | \"fadeOut\"\n | \"fadeOutDown\"\n | \"fadeOutDownBig\"\n | \"fadeOutUp\"\n | \"fadeOutUpBig\"\n | \"fadeOutLeft\"\n | \"fadeOutLeftBig\"\n | \"fadeOutRight\"\n | \"fadeOutRightBig\";\n swipeDirection?:\n | \"up\"\n | \"down\"\n | \"left\"\n | \"right\"\n | Array<\"up\" | \"down\" | \"left\" | \"right\">;\n footerComponent?: React.FC<BottomSheetFooterProps>;\n};\n// id 받아\nexport function createOverlay(overlayId: string) {\n const [useOverlayEvent, createEvent] = createUseExternalEvents<OverlayEvent>(\n `${overlayId}/overlay-kit`\n );\n\n const open = (\n controller:\n | OverlayControllerComponent\n | BottomSheetControllerComponent\n | ModalControllerComponent\n | React.ReactElement,\n options?: OpenOverlayOptions\n ) => {\n const overlayId = options?.overlayId ?? randomId();\n const componentKey = randomId();\n const overlayType = options?.overlayType ?? \"overlay\";\n const componentName = getComponentName(controller);\n\n const dispatchOpenEvent = createEvent(\"open\");\n\n // 옵션에서 overlayType과 overlayId를 제외한 나머지를 options로 전달\n const { overlayId: _, overlayType: __, ...restOptions } = options || {};\n\n // JSX 엘리먼트인 경우 wrapper 컴포넌트로 감싸기\n let finalController;\n if (React.isValidElement(controller)) {\n finalController = (props: any) => {\n return React.cloneElement(controller as React.ReactElement, {\n ...(controller.props || {}),\n ...props,\n close: props.close,\n unmount: props.unmount,\n });\n };\n } else {\n finalController = controller;\n }\n\n dispatchOpenEvent({\n controller: finalController,\n overlayId,\n componentKey,\n componentName,\n overlayType,\n options: restOptions,\n });\n return overlayId;\n };\n\n // openAsync는 모든 overlay 타입에서 사용 가능\n const openAsync = async <T>(\n controller:\n | OverlayAsyncControllerComponent<T>\n | BottomSheetControllerComponent\n | ModalControllerComponent\n | React.ReactElement\n | ((props: any) => any),\n options?: OpenOverlayOptions\n ) => {\n return new Promise<T>((resolve) => {\n const wrappedController = (overlayProps: any) => {\n const close = (param?: T) => {\n resolve(param as T);\n overlayProps.close();\n };\n const unmount = (param?: T) => {\n resolve(param as T);\n overlayProps.unmount();\n };\n const props = { ...overlayProps, close, unmount };\n\n // JSX 엘리먼트인 경우 처리\n if (React.isValidElement(controller)) {\n return React.cloneElement(controller as React.ReactElement, {\n ...(controller.props || {}),\n ...props,\n });\n }\n\n // 함수인 경우 호출\n if (typeof controller === \"function\") {\n return controller(props);\n }\n\n // 기타 컴포넌트 타입인 경우\n return controller;\n };\n\n open(wrappedController, options);\n });\n };\n const close = createEvent(\"close\");\n const unmount = createEvent(\"unmount\");\n const closeAll = createEvent(\"closeAll\");\n const unmountAll = createEvent(\"unmountAll\");\n return {\n open,\n openAsync,\n close,\n unmount,\n closeAll,\n unmountAll,\n useOverlayEvent,\n };\n}\n","import { useEffect } from \"react\";\nimport { createEmitter } from \"./emitter\";\n\nconst emitter = createEmitter();\n\n// React Native에서는 useEffect를 사용 (useLayoutEffect 대신)\nfunction useClientEffect(...args: Parameters<typeof useEffect>) {\n // RN에서는 항상 useEffect 실행\n useEffect(...args);\n}\n\n// 단순한 wrapper 함수\n// emitter.emit을 한번 감싼 이유는 나중에 로깅, 디버깅 등 추가 기능을 넣기 위함\nfunction dispatchEvent<Detail>(type: string, detail?: Detail) {\n emitter.emit(type, detail);\n}\n\n// 메인 팩토리 함수\n// 사용 예\n// createUseExternalEvents<OverlayEvents>('overlay-kit')\n// prefix의 역할:\n// - 'overlay-kit' → 실제 이벤트명은 overlay-kit:open, overlay-kit:close\n// - 네임스페이스로 이벤트 충돌 방지\n\nfunction createUseExternalEvents<\n EventHandlers extends Record<string, (params: any) => void>\n>(prefix: string) {\n function useExternalEvents(events: EventHandlers) {\n // 변환 과정:\n // 입력:\n // events = {\n // open: (data) => console.log('열기', data),\n // close: (id) => console.log('닫기', id)\n // }\n\n // 변환 결과:\n // handlers = {\n // 'overlay-kit:open': (event) => events.open(event),\n // 'overlay-kit:close': (event) => events.close(event)\n // }\n\n const handlers = Object.keys(events).reduce<Record<string, () => void>>(\n (prev, eventKey) => {\n const currentEventKeys = `${prefix}:${eventKey}`;\n\n return {\n ...prev,\n [currentEventKeys]: function (event: unknown) {\n events[eventKey](event);\n } as () => void,\n };\n },\n {}\n );\n\n useClientEffect(() => {\n Object.keys(handlers).forEach((eventKey) => {\n emitter.off(eventKey, handlers[eventKey]); // 🔥 기존 핸들러 제거\n // (중복 방지)\n emitter.on(eventKey, handlers[eventKey]); // 🔥 새로운 핸들러 등록\n });\n\n // 🧹 컴포넌트 언마운트시 정리\n return () =>\n Object.keys(handlers).forEach((eventKey) => {\n emitter.off(eventKey, handlers[eventKey]);\n });\n }, [handlers]);\n }\n\n // 타입 분석:\n // EventKey = 'open' | 'close' | 'closeAll'\n // Parameters<EventHandlers['open']> = [data: {component: Component, id:\n // string}]\n\n // const openEvent = createEvent('open');\n // openEvent의 타입: (data: {component: Component, id: string}) => void\n\n // openEvent({component: MyModal, id: '123'});\n // → dispatchEvent('overlay-kit:open', {component: MyModal, id: '123'})\n\n // payload[0]을 사용하는 이유:\n // 함수 호출: openEvent(arg1, arg2, arg3)\n // payload = [arg1, arg2, arg3]\n // payload[0] = arg1 (첫 번째 인자만 이벤트 데이터로 전달)\n\n function createEvent<EventKey extends keyof EventHandlers>(event: EventKey) {\n return (...payload: Parameters<EventHandlers[EventKey]>) =>\n dispatchEvent(`${prefix}:${String(event)}`, payload[0]);\n }\n\n return [useExternalEvents, createEvent] as const;\n}\n\n// 💡 이 패턴의 천재적인 점\n\n// 1. React 외부에서 React 내부 제어: overlay.open() 같은 명령형 API 가능\n// 2. 타입 안전성: TypeScript로 이벤트 타입 완벽 추론\n// 3. 메모리 안전: React Hook 생명주기와 완벽 동기화\n// 4. 플랫폼 호환: 웹/RN 모두 지원\n// 5. 네임스페이스: 이벤트 충돌 방지\n\nexport { createUseExternalEvents };\n","\n// 이벤트 이름\nexport type EventType = string | symbol;\n\n// 이벤트 핸들러\nexport type Handler<T = unknown> = (event: T) => void;\nexport type WildcardHandler<T = Record<string, unknown>> = (type: keyof T, event: T[keyof T]) => void;\n\n// 이벤트 핸들러 목록\nexport type EventHandlerList<T = unknown> = Array<Handler<T>>;\nexport type WildCardEventHandlerList<T = Record<string, unknown>> = Array<WildcardHandler<T>>;\n\n// 이벤트 핸들러 맵\nexport type EventHandlerMap<Events extends Record<EventType, unknown>> = Map<\n keyof Events | '*',\n EventHandlerList<Events[keyof Events]> | WildCardEventHandlerList<Events>\n>;\n\n// 이벤트 발행기\nexport interface Emitter<Events extends Record<EventType, unknown>> {\n all: EventHandlerMap<Events>;\n\n on<Key extends keyof Events>(type: Key, handler: Handler<Events[Key]>): void;\n on(type: '*', handler: WildcardHandler<Events>): void;\n\n off<Key extends keyof Events>(type: Key, handler?: Handler<Events[Key]>): void;\n off(type: '*', handler: WildcardHandler<Events>): void;\n\n emit<Key extends keyof Events>(type: Key, event: Events[Key]): void;\n emit<Key extends keyof Events>(type: undefined extends Events[Key] ? Key : never): void;\n}\n\nexport function createEmitter<Events extends Record<EventType, unknown>>(\n all?: EventHandlerMap<Events>\n): Emitter<Events> {\n type GenericEventHandler = Handler<Events[keyof Events]> | WildcardHandler<Events>;\n all = all || new Map();\n\n return {\n all,\n on<Key extends keyof Events>(type: Key, handler: GenericEventHandler) {\n const handlers: Array<GenericEventHandler> | undefined = all!.get(type);\n if (handlers) {\n handlers.push(handler);\n } else {\n all!.set(type, [handler] as EventHandlerList<Events[keyof Events]>);\n }\n },\n off<Key extends keyof Events>(type: Key, handler?: GenericEventHandler) {\n const handlers: Array<GenericEventHandler> | undefined = all!.get(type);\n if (handlers) {\n if (handler) {\n handlers.splice(handlers.indexOf(handler) >>> 0, 1);\n } else {\n all!.set(type, []);\n }\n }\n },\n emit<Key extends keyof Events>(type: Key, evt?: Events[Key]) {\n let handlers = all!.get(type);\n if (handlers) {\n (handlers as EventHandlerList<Events[keyof Events]>).slice().forEach((handler) => {\n handler(evt!);\n });\n }\n\n handlers = all!.get('*');\n if (handlers) {\n (handlers as WildCardEventHandlerList<Events>).slice().forEach((handler) => {\n handler(type, evt!);\n });\n }\n },\n };\n}","export function randomId() {\n return `overlay-kit-${Math.random().toString(36).slice(2, 11)}`;\n}","import React from 'react';\n\n/**\n * React 컴포넌트나 함수로부터 이름을 추출합니다.\n * 디버깅 목적으로 사용됩니다.\n */\nexport function getComponentName(controller: any): string {\n // 1. displayName 우선 (개발자가 명시적으로 설정한 이름)\n if (controller?.displayName) {\n return controller.displayName;\n }\n\n // 2. React element인 경우\n if (React.isValidElement(controller)) {\n const type = controller.type as any;\n if (type?.displayName) return type.displayName;\n if (type?.name && type.name !== 'anonymous') return type.name;\n }\n\n // 3. 함수/컴포넌트의 name 속성\n if (typeof controller === 'function') {\n if (controller.name && controller.name !== 'anonymous') {\n return controller.name;\n }\n }\n\n // 4. 래핑된 컴포넌트 (forwardRef, memo 등)\n if (controller?.type?.displayName) {\n return controller.type.displayName;\n }\n if (controller?.type?.name && controller.type.name !== 'anonymous') {\n return controller.type.name;\n }\n\n // 5. Fallback\n return 'Anonymous';\n}\n","import { type Provider, createContext, useContext } from 'react';\n\ntype NullSymbolType = typeof NullSymbol;\nconst NullSymbol = Symbol('Null');\n\nexport type CreateContextReturn<T> = [Provider<T>, () => T];\n\nexport function createSafeContext<T>(displayName?: string): CreateContextReturn<T> {\n const Context = createContext<T | NullSymbolType>(NullSymbol);\n Context.displayName = displayName ?? 'SafeContext';\n\n function useSafeContext() {\n const context = useContext(Context);\n\n if (context === NullSymbol) {\n const error = new Error(`[${Context.displayName}]: Provider not found.`);\n error.name = '[Error] Context';\n\n throw error;\n }\n\n return context;\n }\n\n return [Context.Provider as any, useSafeContext];\n}\n","import { createSafeContext } from '../utils/create-safe-context';\nimport { type OverlayData } from './reducer';\n\n\nexport function createOverlaySafeContext() {\n const [OverlayContextProvider, useOverlayContext] = createSafeContext<OverlayData>('overlay-kit/OverlayContext');\n\n function useCurrentOverlay() {\n return useOverlayContext().current;\n }\n\n function useOverlayData() {\n return useOverlayContext().overlayData;\n }\n\n return { OverlayContextProvider, useCurrentOverlay, useOverlayData };\n}\n","import { OverlayControllerComponent } from \"./provider/content-overlay-controller\";\nimport { BottomSheetControllerComponent } from \"./provider/bottom-sheet-controller\";\nimport { ModalControllerComponent } from \"./provider/modal-controller\";\n\ntype OverlayId = string;\ntype OverlayItem = {\n /**\n * @description 오버레이 고유한 ID\n */\n id : OverlayId;\n /**\n * @description 오버레이 컴포넌트의 고유한 키\n * 컴포넌트가 언마운트시 사용됩니다.\n */\n componentKey: string;\n /**\n * @description 컴포넌트 이름 (디버깅용)\n */\n componentName?: string;\n isOpen: boolean;\n isMounted: boolean;\n controller: OverlayControllerComponent | BottomSheetControllerComponent | ModalControllerComponent;\n overlayType?: 'overlay' | 'bottomSheet' | 'modal';\n options?: any;\n}\nexport type OverlayData = {\n current: OverlayId | null; // 현재 열려있는 오버레이 ID\n overlayOrderList: OverlayId[];\n overlayData: Record<OverlayId, OverlayItem>;\n}\nexport type OverlayReducerAction =\n | { type: 'ADD'; overlay: OverlayItem }\n | { type: 'OPEN'; overlayId: string }\n | { type: 'CLOSE'; overlayId: string }\n | { type: 'REMOVE'; overlayId: string }\n | { type: 'CLOSE_ALL' }\n | { type: 'REMOVE_ALL' };\n\n/**\n * 오버레이를 닫거나 제거할 때, 어떤 오버레이를 현재(current)로 지정할지 결정합니다.\n *\n * @description 마지막 오버레이를 닫을 경우, 그 이전 오버레이를 현재로 지정합니다.\n * @description 중간에 있는 오버레이를 닫을 경우, 마지막 오버레이를 현재로 지정합니다.\n *\n * @example open - [1, 2, 3, 4]\n * close 2 => current: 4\n * close 4 => current: 3\n * close 3 => current: 1\n * close 1 => current: null\n *\n * @param overlayOrderList 오버레이 ID가 순서대로 담긴 리스트\n * @param overlayData 오버레이 데이터 맵\n * @param targetOverlayId 닫거나 제거하려는 오버레이의 ID\n * @returns 현재로 지정될 오버레이의 ID, 없으면 null\n */\nexport const determineCurrentOverlayId = (overlayOrderList: OverlayId[], overlayData: Record<OverlayId, OverlayItem>, targetOverlayId: OverlayId): OverlayId | null => {\n // 1단계: 열린 오버레이들만 필터링\n\n const openedOverlayOrderList = overlayOrderList.filter(\n (orderedOverlayId) => overlayData[orderedOverlayId].isOpen === true\n );\n // 2단계: 닫힐 오버레이의 위치 찾기\n const targetIndexInOpenedList = openedOverlayOrderList.findIndex((item) => item === targetOverlayId);\n\n // 3단계: 다음 활성 오버레이 결정\n return targetIndexInOpenedList === openedOverlayOrderList.length - 1\n ? openedOverlayOrderList[targetIndexInOpenedList - 1] ?? null // 마지막이면 이전 것\n : openedOverlayOrderList[openedOverlayOrderList.length - 1] ?? null;// 중간이면 최상위\n\n}\n\n/** 동작 예시:\n * \n *\n * // 상황: 오버레이 [1, 2, 3, 4]가 순서대로 열려있음\n * overlayOrderList = [\"modal-1\", \"modal-2\", \"modal-3\", \"modal-4\"];\n * // 모두 isOpen: true\n *\n * // 케이스 1: 최상위(4번) 닫기\n * determineCurrentOverlayId(list, data, \"modal-4\");\n * // → \"modal-3\" (바로 아래가 활성화)\n *\n * // 케이스 2: 중간(2번) 닫기\n * determineCurrentOverlayId(list, data, \"modal-2\");\n * // → \"modal-4\" (최상위가 여전히 활성)\n *\n * // 케이스 3: 마지막 남은 것 닫기\n * determineCurrentOverlayId([\"modal-1\"], data, \"modal-1\");\n * // → null (더 이상 활성 오버레이 없음)\n */\n\n// 상태 변경 로직\nexport function overlayReducer(state: OverlayData, action: OverlayReducerAction): OverlayData {\n switch (action.type) {\n case 'ADD': {\n const isExisted = state.overlayOrderList.includes(action.overlay.id);\n const existingOverlay = state.overlayData[action.overlay.id];\n\n // 이미 같은 overlayId를 가진 오버레이가 열려있다면, 중복 추가하지 않고 기존 것을 맨 앞으로 가져오기\n if (isExisted && existingOverlay?.isOpen === true) {\n return {\n ...state,\n current: action.overlay.id,\n // 이미 열려있는 오버레이를 맨 앞으로 이동\n overlayOrderList: [...state.overlayOrderList.filter((item) => item !== action.overlay.id), action.overlay.id],\n };\n }\n\n // 같은 overlayId를 가진 오버레이가 존재하지만 닫혀있는 경우, 다시 열기\n if (isExisted && existingOverlay?.isOpen === false) {\n return {\n ...state,\n current: action.overlay.id,\n // 맨 앞으로 이동\n overlayOrderList: [...state.overlayOrderList.filter((item) => item !== action.overlay.id), action.overlay.id],\n overlayData: {\n ...state.overlayData,\n [action.overlay.id]: { ...existingOverlay, isOpen: true, isMounted: true },\n },\n };\n }\n\n // 새로운 오버레이 추가\n return {\n current: action.overlay.id,\n overlayOrderList: [...state.overlayOrderList, action.overlay.id],\n overlayData: {\n ...state.overlayData,\n [action.overlay.id]: action.overlay,\n },\n };\n }\n case 'OPEN': {\n const overlay = state.overlayData[action.overlayId];\n\n // ignore if the overlay don't exist or already open\n if (overlay == null || overlay.isOpen) {\n return state;\n }\n\n return {\n ...state,\n current: action.overlayId,\n // 닫혀있던 오버레이를 다시 열 때 맨 뒤로 이동시켜 최상단에 표시\n overlayOrderList: [...state.overlayOrderList.filter((item) => item !== action.overlayId), action.overlayId],\n overlayData: {\n ...state.overlayData,\n [action.overlayId]: { ...overlay, isOpen: true, isMounted: true },\n },\n };\n }\n case 'CLOSE': {\n const overlay = state.overlayData[action.overlayId];\n\n // ignore if the overlay don't exist or already closed\n if (overlay == null || !overlay.isOpen) {\n return state;\n }\n\n const currentOverlayId = determineCurrentOverlayId(state.overlayOrderList, state.overlayData, action.overlayId);\n\n return {\n ...state,\n current: currentOverlayId,\n overlayData: {\n ...state.overlayData,\n [action.overlayId]: {\n ...state.overlayData[action.overlayId],\n isOpen: false,\n },\n },\n };\n }\n case 'REMOVE': {\n const overlay = state.overlayData[action.overlayId];\n\n // ignore if the overlay don't exist\n if (overlay == null) {\n return state;\n }\n\n const remainingOverlays = state.overlayOrderList.filter((item) => item !== action.overlayId);\n if (state.overlayOrderList.length === remainingOverlays.length) {\n return state;\n }\n\n const copiedOverlayData = { ...state.overlayData };\n delete copiedOverlayData[action.overlayId];\n\n const currentOverlayId = determineCurrentOverlayId(state.overlayOrderList, state.overlayData, action.overlayId);\n\n return {\n current: currentOverlayId,\n overlayOrderList: remainingOverlays,\n overlayData: copiedOverlayData,\n };\n }\n case 'CLOSE_ALL': {\n // ignore if there is no overlay\n if (Object.keys(state.overlayData).length === 0) {\n return state;\n }\n\n return {\n ...state,\n current: null,\n overlayData: Object.keys(state.overlayData).reduce(\n (prev, curr) => ({\n ...prev,\n [curr]: {\n ...state.overlayData[curr],\n isOpen: false,\n } satisfies OverlayItem,\n }),\n {} satisfies Record<string, OverlayItem>\n ),\n };\n }\n case 'REMOVE_ALL': {\n return { current: null, overlayOrderList: [], overlayData: {} };\n }\n }\n}","import { createOverlayProvider } from '../context/provider';\n\nexport const { overlay, OverlayProvider, useCurrentOverlay, useOverlayData } = createOverlayProvider();\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function experimental_createOverlayContext() {\n return createOverlayProvider();\n}"],"mappings":"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","names":["useCallback","useEffect","useReducer","useRef","Platform","React","memo","useEffect","useRef","useCallback","useMemo","memo","useCallback","useEffect","useMemo","useRef","useCallback","useContext","ACTIONS","INITIAL_STATE","createContext","PortalStateContext","PortalDispatchContext","usePortal","hostName","dispatch","useContext","PortalDispatchContext","Error","registerHost","useCallback","type","ACTIONS","REGISTER_HOST","deregisterHost","DEREGISTER_HOST","addUpdatePortal","name","node","ADD_UPDATE_PORTAL","portalName","removePortal","REMOVE_PORTAL","addPortal","updatePortal","PortalComponent","name","_providedName","hostName","handleOnMount","_providedHandleOnMount","handleOnUnmount","_providedHandleOnUnmount","handleOnUpdate","_providedHandleOnUpdate","children","addPortal","addUpdatePortal","removePortal","usePortal","useMemo","nanoid","handleOnMountRef","useRef","handleOnUnmountRef","handleOnUpdateRef","useCallback","current","useEffect","undefined","Portal","memo","displayName","React","memo","useEffect","useContext","usePortalState","hostName","state","useContext","PortalStateContext","Error","PortalHostComponent","name","state","usePortalState","registerHost","deregisterHost","usePortal","useEffect","React","map","item","node","PortalHost","memo","displayName","React","memo","useReducer","isLoggingEnabled","isDev","Boolean","__DEV__","print","isDev","component","method","params","isLoggingEnabled","message","Object","keys","map","key","join","console","log","filter","Boolean","freeze","registerHost","state","hostName","deregisterHost","addUpdatePortal","portalName","node","index","findIndex","item","name","push","removePortal","print","component","reducer","method","params","splice","action","type","clonedState","ACTIONS","REGISTER_HOST","DEREGISTER_HOST","ADD_UPDATE_PORTAL","REMOVE_PORTAL","PortalProviderComponent","rootHostName","shouldAddRootHost","children","state","dispatch","useReducer","reducer","INITIAL_STATE","React","PortalProvider","memo","displayName","jsx","memo","useRef","useMemo","useEffect","_a","useCallback","React","React","memo","useEffect","useState","View","StyleSheet","Keyboard","jsx","memo","useState","useEffect","Keyboard","View","StyleSheet","React","React","useEffect","useEffect","React","overlayId","React","close","unmount","createContext","useContext","useCurrentOverlay","useOverlayData","overlay","BottomSheetModalProvider","jsx","jsxs","overlay","useCurrentOverlay","useOverlayData","OverlayProvider","useReducer","useRef","useEffect","useCallback","overlayId","Platform","BottomSheetModalProvider","_a"]}
|