import React, { useState, useEffect, useCallback } from 'react'; import PropTypes from 'prop-types'; import { withTranslation } from 'react-i18next'; import { UserPicture } from '@growi/ui'; import { withUnstatedContainers } from '../UnstatedUtils'; import AppContainer from '~/client/services/AppContainer'; import PageContainer from '~/client/services/PageContainer'; import EmptyTrashModal from '../EmptyTrashModal'; import { useCurrentUpdatedAt, useShareLinkId } from '~/stores/context'; import { usePageDeleteModal, usePutBackPageMOdal } from '~/stores/modal'; import { useSWRxPageInfo } from '~/stores/page'; const TrashPageAlert = (props) => { const { t, pageContainer } = props; const { pageId, revisionId, path, isDeleted, lastUpdateUsername, deletedUserName, deletedAt, } = pageContainer.state; const { data: shareLinkId } = useShareLinkId(); /* * TODO: Do not use useSWRxPageInfo on this component * Ideal: use useSWRxPageInfo on TrashPage after applying Next.js * Reference: https://github.com/weseek/growi/pull/5359#discussion_r808381329 */ const { data: pageInfo } = useSWRxPageInfo(pageId ?? null, shareLinkId); const { data: updatedAt } = useCurrentUpdatedAt(); const [isEmptyTrashModalShown, setIsEmptyTrashModalShown] = useState(false); const [isAbleToDeleteCompletely, setIsAbleToDeleteCompletely] = useState(false); useEffect(() => { if (pageInfo != null) { setIsAbleToDeleteCompletely(pageInfo.isAbleToDeleteCompletely); } }, [pageInfo]); const { open: openDeleteModal } = usePageDeleteModal(); const { open: openPutBackPageModal } = usePutBackPageMOdal(); function openEmptyTrashModalHandler() { setIsEmptyTrashModalShown(true); } function closeEmptyTrashModalHandler() { setIsEmptyTrashModalShown(false); } function openPutbackPageModalHandler() { openPutBackPageModal(pageId, path); } const onDeletedHandler = useCallback((pathOrPathsToDelete, isRecursively, isCompletely) => { if (typeof pathOrPathsToDelete !== 'string') { return; } const path = pathOrPathsToDelete; window.location.href = path; }, []); function openPageDeleteModalHandler() { const pageToDelete = { pageId, revisionId, path, }; const isDeleteCompletelyModal = true; openDeleteModal([pageToDelete], isAbleToDeleteCompletely, onDeletedHandler, isDeleteCompletelyModal); } function renderEmptyButton() { return ( ); } function renderTrashPageManagementButtons() { return ( <> ); } function renderModals() { return ( <> ); } return ( <>
This page is in the trash . {isDeleted && ( <>
Deleted by {deletedUserName || lastUpdateUsername} at {deletedAt || updatedAt} )}
{ pageContainer.isAbleToShowEmptyTrashButton && renderEmptyButton()} { pageContainer.isAbleToShowTrashPageManagementButtons && renderTrashPageManagementButtons()}
{renderModals()} ); }; /** * Wrapper component for using unstated */ const TrashPageAlertWrapper = withUnstatedContainers(TrashPageAlert, [AppContainer, PageContainer]); TrashPageAlert.propTypes = { t: PropTypes.func.isRequired, // i18next appContainer: PropTypes.instanceOf(AppContainer).isRequired, pageContainer: PropTypes.instanceOf(PageContainer).isRequired, }; export default withTranslation()(TrashPageAlertWrapper);