import React, { useCallback, useEffect } from 'react'; import { useTranslation, i18n } from 'next-i18next'; import PropTypes from 'prop-types'; import { useForm } from 'react-hook-form'; import { i18n as i18nConfig } from '^/config/next-i18next.config'; import AdminAppContainer from '~/client/services/AdminAppContainer'; import { toastSuccess, toastError } from '~/client/util/toastr'; import loggerFactory from '~/utils/logger'; import { withUnstatedContainers } from '../../UnstatedUtils'; import AdminUpdateButtonRow from '../Common/AdminUpdateButtonRow'; const logger = loggerFactory('growi:appSettings'); const AppSetting = (props) => { const { adminAppContainer } = props; const { t } = useTranslation(['admin', 'commons']); const { register, handleSubmit, reset, } = useForm(); // Reset form when adminAppContainer state changes (e.g., after reload) useEffect(() => { reset({ title: adminAppContainer.state.title || '', confidential: adminAppContainer.state.confidential || '', globalLang: adminAppContainer.state.globalLang || 'en-US', // Convert boolean to string for radio button value isEmailPublishedForNewUser: String(adminAppContainer.state.isEmailPublishedForNewUser ?? true), fileUpload: adminAppContainer.state.fileUpload ?? false, }); }, [ adminAppContainer.state.title, adminAppContainer.state.confidential, adminAppContainer.state.globalLang, adminAppContainer.state.isEmailPublishedForNewUser, adminAppContainer.state.fileUpload, reset, ]); const onSubmit = useCallback(async(data) => { try { // Await all setState completions before API call await Promise.all([ adminAppContainer.changeTitle(data.title), adminAppContainer.changeConfidential(data.confidential), adminAppContainer.changeGlobalLang(data.globalLang), ]); // Convert string 'true'/'false' to boolean const isEmailPublished = data.isEmailPublishedForNewUser === 'true' || data.isEmailPublishedForNewUser === true; await adminAppContainer.changeIsEmailPublishedForNewUserShow(isEmailPublished); await adminAppContainer.updateAppSettingHandler(); toastSuccess(t('commons:toaster.update_successed', { target: t('commons:headers.app_settings') })); } catch (err) { toastError(err); logger.error(err); } }, [adminAppContainer, t]); return (
); }; /** * Wrapper component for using unstated */ const AppSettingWrapper = withUnstatedContainers(AppSetting, [AdminAppContainer]); AppSetting.propTypes = { adminAppContainer: PropTypes.instanceOf(AdminAppContainer).isRequired, }; export default AppSettingWrapper;