{"version":3,"file":"AutoReloadOverlayBlocker.mjs","sources":["../../../admin/src/components/AutoReloadOverlayBlocker.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Flex, Typography, Link } from '@strapi/design-system';\nimport { Clock, ArrowClockwise } from '@strapi/icons';\nimport { createPortal } from 'react-dom';\nimport { MessageDescriptor, useIntl } from 'react-intl';\nimport { styled, keyframes } from 'styled-components';\n\n/**\n * TODO: realistically a lot of this logic is isolated to the `core/admin` package.\n * However, we want to expose the `useAutoReloadOverlayBlocker` hook to the plugins.\n *\n * Therefore, in V5 we should move this logic back to the `core/admin` package & export\n * the hook from that package and re-export here. For now, let's keep it all together\n * because it's easier to diagnose and we're not using a million refs because we don't\n * understand what's going on.\n */\nexport interface AutoReloadOverlayBlockerConfig {\n title?: string;\n description?: string;\n icon?: 'reload' | 'time';\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface AutoReloadOverlayBlockerContextValue {\n lockAppWithAutoreload: (config?: AutoReloadOverlayBlockerConfig) => void;\n unlockAppWithAutoreload: () => void;\n}\n\nconst AutoReloadOverlayBlockerContext = React.createContext({\n lockAppWithAutoreload: () => {},\n unlockAppWithAutoreload: () => {},\n});\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface AutoReloadOverlayBlockerProviderProps {\n children: React.ReactNode;\n}\n\nconst MAX_ELAPSED_TIME = 300 * 1000;\n\nconst AutoReloadOverlayBlockerProvider = ({ children }: AutoReloadOverlayBlockerProviderProps) => {\n const [isOpen, setIsOpen] = React.useState(false);\n const [config, setConfig] = React.useState({});\n const [failed, setFailed] = React.useState(false);\n\n const lockAppWithAutoreload = React.useCallback((config: AutoReloadOverlayBlockerConfig = {}) => {\n setIsOpen(true);\n setConfig(config);\n }, []);\n\n const unlockAppWithAutoreload = React.useCallback(() => {\n setIsOpen(false);\n setConfig({});\n }, []);\n\n // eslint-disable-next-line consistent-return\n React.useEffect(() => {\n if (isOpen) {\n const timeout = setTimeout(() => {\n setFailed(true);\n }, MAX_ELAPSED_TIME);\n\n return () => {\n clearTimeout(timeout);\n };\n }\n }, [isOpen]);\n\n let displayedIcon = config?.icon || 'reload';\n\n let description = {\n id: config?.description || 'components.OverlayBlocker.description',\n defaultMessage:\n \"You're using a feature that needs the server to restart. The page will reload automatically.\",\n };\n\n let title = {\n id: config?.title || 'components.OverlayBlocker.title',\n defaultMessage: 'Waiting for restart',\n };\n\n if (failed) {\n displayedIcon = 'time';\n\n description = {\n id: 'components.OverlayBlocker.description.serverError',\n defaultMessage: 'The server should have restarted, please check your logs in the terminal.',\n };\n\n title = {\n id: 'components.OverlayBlocker.title.serverError',\n defaultMessage: 'The restart is taking longer than expected',\n };\n }\n\n const autoReloadValue = React.useMemo(\n () => ({\n lockAppWithAutoreload,\n unlockAppWithAutoreload,\n }),\n [lockAppWithAutoreload, unlockAppWithAutoreload]\n );\n\n return (\n \n \n {children}\n \n );\n};\n\ninterface BlockerProps {\n displayedIcon: string;\n description: MessageDescriptor;\n isOpen: boolean;\n title: MessageDescriptor;\n}\n\nconst Blocker = ({ displayedIcon, description, title, isOpen }: BlockerProps) => {\n const { formatMessage } = useIntl();\n\n // eslint-disable-next-line no-undef\n return isOpen && globalThis?.document?.body\n ? createPortal(\n \n \n \n {formatMessage(title)}\n \n \n {formatMessage(description)}\n \n \n {displayedIcon === 'reload' && (\n \n \n \n )}\n {displayedIcon === 'time' && (\n \n \n \n )}\n \n \n {formatMessage({\n id: 'global.documentation',\n defaultMessage: 'Read the documentation',\n })}\n \n \n ,\n // eslint-disable-next-line no-undef\n globalThis.document.body\n )\n : null;\n};\n\nconst rotation = keyframes`\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(359deg);\n }\n `;\n\nconst LoaderReload = styled(ArrowClockwise)`\n animation: ${rotation} 1s infinite linear;\n`;\n\nconst Overlay = styled(Flex)`\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n /* TODO: set this up in the theme for consistence z-index values */\n z-index: 1140;\n padding-top: 16rem;\n\n & > * {\n position: relative;\n z-index: 1;\n }\n\n &:before {\n content: '';\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: ${({ theme }) => theme.colors.neutral0};\n opacity: 0.9;\n }\n`;\n\nconst IconBox = styled(Box)`\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n svg {\n > path {\n fill: ${({ theme }) => theme.colors.primary600} !important;\n }\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * Hook\n * -----------------------------------------------------------------------------------------------*/\n\nconst useAutoReloadOverlayBlocker = () => React.useContext(AutoReloadOverlayBlockerContext);\n\nexport { AutoReloadOverlayBlockerProvider, useAutoReloadOverlayBlocker };\n"],"names":["AutoReloadOverlayBlockerContext","React","createContext","lockAppWithAutoreload","unlockAppWithAutoreload","MAX_ELAPSED_TIME","AutoReloadOverlayBlockerProvider","children","isOpen","setIsOpen","useState","config","setConfig","failed","setFailed","useCallback","useEffect","timeout","setTimeout","clearTimeout","displayedIcon","icon","description","id","defaultMessage","title","autoReloadValue","useMemo","_jsxs","Provider","value","_jsx","Blocker","formatMessage","useIntl","globalThis","document","body","createPortal","Overlay","direction","alignItems","gap","Flex","Typography","tag","variant","textColor","fontSize","fontWeight","IconBox","padding","background","borderColor","LoaderReload","width","height","Clock","Box","marginTop","Link","href","isExternal","rotation","keyframes","styled","ArrowClockwise","theme","colors","neutral0","primary600","useAutoReloadOverlayBlocker","useContext"],"mappings":"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"}