import { type JSX, useCallback, useEffect, useState } from 'react'; import { LoadingSpinner } from '@growi/ui/dist/components'; import { useTranslation } from 'next-i18next'; import { apiv3Put } from '~/client/util/apiv3-client'; import { toastError, toastSuccess } from '~/client/util/toastr'; import { useSWRxAppSettings } from '~/stores/admin/app-settings'; import AdminUpdateButtonRow from '../Common/AdminUpdateButtonRow'; import { ConfirmModal } from './ConfirmModal'; const PageBulkExportSettings = (): JSX.Element => { const { t } = useTranslation(['admin', 'commons']); const { data, error, mutate } = useSWRxAppSettings(); const [isBulkExportPagesEnabled, setIsBulkExportPagesEnabled] = useState( data?.isBulkExportPagesEnabled, ); const [ bulkExportDownloadExpirationSeconds, setBulkExportDownloadExpirationSeconds, ] = useState(data?.bulkExportDownloadExpirationSeconds); const [isReloadModalOpen, setReloadModalOpen] = useState(false); const changeBulkExportDownloadExpirationSeconds = ( bulkExportDownloadExpirationDays: number, ) => { const bulkExportDownloadExpirationSeconds = bulkExportDownloadExpirationDays * 24 * 60 * 60; setBulkExportDownloadExpirationSeconds(bulkExportDownloadExpirationSeconds); }; const onSubmitHandler = useCallback(async () => { // Only the enable flag affects the page-side export menu visibility, which // is hydrated once per page load and therefore needs a reload to reflect. // The expiration period is read server-side, so a reload prompt is unneeded. const isEnabledFlagChanged = isBulkExportPagesEnabled !== data?.isBulkExportPagesEnabled; try { await apiv3Put('/app-settings/page-bulk-export-settings', { isBulkExportPagesEnabled, bulkExportDownloadExpirationSeconds, }); toastSuccess( t('commons:toaster.update_successed', { target: t('app_setting.page_bulk_export_settings'), }), ); if (isEnabledFlagChanged) { setReloadModalOpen(true); } } catch (err) { toastError(err); } mutate(); }, [ isBulkExportPagesEnabled, bulkExportDownloadExpirationSeconds, data, mutate, t, ]); useEffect(() => { if (data?.useOnlyEnvVarForFileUploadType) { setIsBulkExportPagesEnabled(data?.envIsBulkExportPagesEnabled); } else { setIsBulkExportPagesEnabled(data?.isBulkExportPagesEnabled); } setBulkExportDownloadExpirationSeconds( data?.bulkExportDownloadExpirationSeconds, ); }, [data]); const isLoading = data === undefined && error === undefined; return ( <> {isLoading && (
)} {!isLoading && ( <>

{t('admin:app_setting.page_bulk_export_explanation')}
{t('admin:app_setting.page_bulk_export_warning')}

setIsBulkExportPagesEnabled(e.target.checked) } />
{data?.useOnlyEnvVarsForIsBulkExportPagesEnabled && (

)}
)} { window.location.reload(); return Promise.resolve(); }} onCancel={() => setReloadModalOpen(false)} /> ); }; export default PageBulkExportSettings;