import React, { useMemo, useCallback, useState, type JSX, } from 'react'; import { useAtomValue } from 'jotai'; import { useTranslation } from 'next-i18next'; import dynamic from 'next/dynamic'; import { Modal, ModalBody, ModalHeader, } from 'reactstrap'; import { useIsGuestUser, useIsReadOnlyUser, useIsSharedUser } from '~/states/context'; import { disableLinkSharingAtom } from '~/states/server-configurations'; import { useDeviceLargerThanLg } from '~/states/ui/device'; import { usePageAccessoriesModalStatus, usePageAccessoriesModalActions, PageAccessoriesModalContents } from '~/states/ui/modal/page-accessories'; import { CustomNavDropdown, CustomNavTab } from '../CustomNavigation/CustomNav'; import CustomTabContent from '../CustomNavigation/CustomTabContent'; import ExpandOrContractButton from '../ExpandOrContractButton'; import { useAutoOpenModalByQueryParam } from './hooks'; import styles from './PageAccessoriesModal.module.scss'; const PageAttachment = dynamic(() => import('./PageAttachment'), { ssr: false }); const PageHistory = dynamic(() => import('./PageHistory').then(mod => mod.PageHistory), { ssr: false }); const ShareLink = dynamic(() => import('./ShareLink').then(mod => mod.ShareLink), { ssr: false }); interface PageAccessoriesModalSubstanceProps { isWindowExpanded: boolean; setIsWindowExpanded: (expanded: boolean) => void; } const PageAccessoriesModalSubstance = ({ isWindowExpanded, setIsWindowExpanded }: PageAccessoriesModalSubstanceProps): JSX.Element => { const { t } = useTranslation(); const isSharedUser = useIsSharedUser(); const isGuestUser = useIsGuestUser(); const isReadOnlyUser = useIsReadOnlyUser(); const isLinkSharingDisabled = useAtomValue(disableLinkSharingAtom); const [isDeviceLargerThanLg] = useDeviceLargerThanLg(); const status = usePageAccessoriesModalStatus(); const { close, selectContents } = usePageAccessoriesModalActions(); useAutoOpenModalByQueryParam(); // Memoize heavy navTabMapping calculation const navTabMapping = useMemo(() => { return { [PageAccessoriesModalContents.PageHistory]: { Icon: () => history, Content: () => { return ; }, i18n: t('History'), isLinkEnabled: () => !isGuestUser && !isSharedUser, }, [PageAccessoriesModalContents.Attachment]: { Icon: () => attachment, Content: () => { return ; }, i18n: t('attachment_data'), }, [PageAccessoriesModalContents.ShareLink]: { Icon: () => share, Content: () => { return ; }, i18n: t('share_links.share_link_management'), isLinkEnabled: () => !isGuestUser && !isReadOnlyUser && !isSharedUser && !isLinkSharingDisabled, }, }; }, [t, close, isGuestUser, isReadOnlyUser, isSharedUser, isLinkSharingDisabled]); // Memoize expand/contract handlers const expandWindow = useCallback(() => setIsWindowExpanded(true), [setIsWindowExpanded]); const contractWindow = useCallback(() => setIsWindowExpanded(false), [setIsWindowExpanded]); const buttons = useMemo(() => ( ), [close, isWindowExpanded, expandWindow, contractWindow]); if (status == null || status.activatedContents == null) { return <>; } return ( <> {isDeviceLargerThanLg && ( )} {!isDeviceLargerThanLg && ( )} ); }; export const PageAccessoriesModal = (): JSX.Element => { const status = usePageAccessoriesModalStatus(); const { close } = usePageAccessoriesModalActions(); const [isWindowExpanded, setIsWindowExpanded] = useState(false); if (status == null) { return <>; } return ( {status.isOpened && } ); };