{"version":3,"file":"index.mjs","sources":[""],"sourcesContent":["import type { ReactElement, FC } from \"react\";\r\nimport {\r\n  useImperativeHandle,\r\n  useEffect,\r\n  useRef,\r\n  useMemo,\r\n  useLayoutEffect,\r\n  useState, useCallback,\r\n} from \"react\";\r\nimport type {\r\n  IModal, TModals, TModalInstance, TModalRef, TModalContext,\r\n} from \"./config/types\";\r\nimport { ModalContext } from \"./context\";\r\nimport { ModalCtrl } from \"./ui/ModalCtrl\";\r\nimport { ModalInner } from \"./ui/ModalInner\";\r\nimport { ModalWrapper } from \"./ui/ModalWrapper\";\r\nimport { Core } from \"../../plugins/core\";\r\nimport type { TAction } from \"../../plugins/modals/config/types\";\r\nimport type { IComponentBaseProps } from \"../../types/components/index\";\r\nimport { useCN } from \"../../utils/react/useCN\";\r\nimport { useIsSSR } from \"../../utils/react/useIsSSR\";\r\nimport \"./style.pcss\";\r\n\r\n/**\r\n * Компонент модального окна\r\n * @returns {ReactElement}\r\n */\r\nconst Modal: FC<IModal & IComponentBaseProps> = ({\r\n  baseClass = \"modal\",\r\n  extraClasses = {},\r\n  extraAttrs = {},\r\n  children = null,\r\n  id,\r\n  ref,\r\n  isOpen = false,\r\n  isInline = false,\r\n  footerSlot = null,\r\n  headerSlot = null,\r\n  titleSlot = null,\r\n  ctrlSlot = null,\r\n  onAction = null,\r\n  async,\r\n  assets,\r\n  fancyboxCfg,\r\n  preset,\r\n  cfg = {},\r\n}): ReactElement => {\r\n\r\n  // SSR mode?\r\n  const { isSSR } = useIsSSR();\r\n\r\n  // Wrapper ref\r\n  const templateRef = useRef(null);\r\n\r\n  // Fancybox\r\n  const plugin = useMemo<TModalInstance>(() => {\r\n    return (Core.instance as unknown as Core)?.getPluginInstance(\"Modals\") as TModalInstance;\r\n  }, []);\r\n\r\n  // Actual state\r\n  const [ isModalOpen, setIsModalOpen ] = useState<boolean>(isOpen);\r\n\r\n  // Opening state\r\n  const [ isLoading, setIsLoading ] = useState<boolean>(false);\r\n\r\n  // Prev state\r\n  const prevOpen = useRef<boolean>(isModalOpen);\r\n\r\n  // Parsed config\r\n  const parsedCfg = useMemo<string>(() => {\r\n    const {\r\n      redirectAfterClose = null, isReloadAfterClose = false,\r\n    } = cfg;\r\n    return JSON.stringify(({\r\n      redirectAfterClose, isReloadAfterClose,\r\n    }));\r\n  }, [ cfg ]);\r\n\r\n  // Classnames\r\n  const { getCN } = useCN(baseClass);\r\n\r\n  // Modal action handler\r\n  const onActionHandler = useCallback((data: TAction) => {\r\n    const { action } = data;\r\n    if (action === \"close\") {\r\n      setIsLoading(false);\r\n      setIsModalOpen(false);\r\n      prevOpen.current = false;\r\n    }\r\n    if (typeof onAction === \"function\") {\r\n      onAction(data);\r\n    }\r\n  }, [ onAction ]);\r\n\r\n  useEffect(() => {\r\n    if (isOpen !== prevOpen.current) {\r\n      setIsModalOpen(isOpen);\r\n    }\r\n  }, [ isOpen ]);\r\n\r\n  useLayoutEffect(() => {\r\n    if (isModalOpen !== prevOpen.current && !isLoading) {\r\n      if (plugin) {\r\n        const staticMethods = (plugin.constructor as TModals);\r\n        if (isModalOpen) { // open modal via Fancybox\r\n          if (!staticMethods.isOpen(id)) {\r\n            staticMethods.getOpen({\r\n              id,\r\n              src: \"#\" + id,\r\n              assets,\r\n              async,\r\n              type: \"inline\" as const,\r\n              onAction: onActionHandler,\r\n              fancyboxCfg,\r\n            })\r\n              .then(() => {\r\n                prevOpen.current = true;\r\n                return Promise.resolve();\r\n              })\r\n              .catch(() => {\r\n                prevOpen.current = false;\r\n                return Promise.reject();\r\n              })\r\n              .finally(() => {\r\n                setIsLoading(false);\r\n              });\r\n          }\r\n        } else { // close modal via Fancybox\r\n          if (staticMethods.isOpen(id)) {\r\n            staticMethods.getClose(id)\r\n              .catch(() => {\r\n                return Promise.resolve();\r\n              })\r\n              .finally(() => {\r\n                prevOpen.current = false;\r\n              });\r\n          }\r\n        }\r\n      } else {\r\n        console.error(`[Modals] Attempt to use \"Modal\" element without plugin. Please run \"Modals\" in \"Core\" first`);\r\n      }\r\n    }\r\n  }, [ isModalOpen, isLoading ]);\r\n\r\n  useLayoutEffect(() => {\r\n    return () => {\r\n      if (plugin) {\r\n        const staticMethods = (plugin.constructor as TModals);\r\n        if (staticMethods.isOpen(id)) {\r\n          staticMethods.getClose(id)\r\n            .catch(() => {\r\n              return Promise.resolve();\r\n            })\r\n            .finally(() => {\r\n              setIsLoading(false);\r\n            });\r\n        }\r\n      }\r\n    };\r\n  }, []);\r\n\r\n  useImperativeHandle(ref, (): TModalRef => ({\r\n    el: templateRef.current,\r\n    ref: { current: null },\r\n    utils: null,\r\n    getData: () => null,\r\n    stateActions: {\r\n      setIsOpen: (isOpen = true) => setIsModalOpen(isOpen),\r\n    },\r\n  }), []);\r\n\r\n  const contextValue = useMemo<TModalContext>(() => ({\r\n    getCN, id, plugin, cfg, footerSlot, titleSlot, headerSlot, preset,\r\n  }), [ plugin, parsedCfg, footerSlot, titleSlot, headerSlot, preset ]);\r\n\r\n  return (\r\n    <ModalContext value={contextValue}>\r\n      <ModalWrapper isInline={isSSR ? isInline : true} ref={templateRef} hidden={true} aria-hidden={\"true\"} id={id}\r\n        data-js-modal={parsedCfg} className={getCN(\"\", extraClasses)} {...extraAttrs}>\r\n        <div className={getCN(\"inner\")}>\r\n          <ModalCtrl>{ctrlSlot}</ModalCtrl>\r\n          <div className={getCN(\"body\")}>\r\n            <ModalInner>\r\n              {children}\r\n            </ModalInner>\r\n          </div>\r\n        </div>\r\n      </ModalWrapper>\r\n    </ModalContext>\r\n  );\r\n};\r\n\r\nexport type { IModal };\r\n\r\nexport {\r\n  Modal,\r\n};\r\n"],"names":["Modal","baseClass","extraClasses","extraAttrs","children","id","ref","isOpen","isInline","footerSlot","headerSlot","titleSlot","ctrlSlot","onAction","async","assets","fancyboxCfg","preset","cfg","isSSR","useIsSSR","templateRef","useRef","plugin","useMemo","Core","instance","getPluginInstance","isModalOpen","setIsModalOpen","useState","isLoading","setIsLoading","prevOpen","parsedCfg","redirectAfterClose","isReloadAfterClose","JSON","stringify","getCN","useCN","onActionHandler","useCallback","data","action","current","useEffect","useLayoutEffect","staticMethods","constructor","getOpen","src","type","then","Promise","resolve","catch","reject","finally","getClose","console","error","useImperativeHandle","el","utils","getData","stateActions","setIsOpen","contextValue","_jsx","ModalContext","value","ModalWrapper","hidden","className","_jsxs","ModalCtrl","ModalInner"],"mappings":"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"}