index.tsx 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import React, { useCallback, useEffect } from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import { useForm } from 'react-hook-form';
  4. import AdminGeneralSecurityContainer from '~/client/services/AdminGeneralSecurityContainer';
  5. import { toastSuccess, toastError } from '~/client/util/toastr';
  6. import { withUnstatedContainers } from '../../../UnstatedUtils';
  7. import { CommentManageRightsSettings } from './CommentManageRightsSettings';
  8. import { PageAccessRightsSettings } from './PageAccessRightsSettings';
  9. import { PageDeleteRightsSettings } from './PageDeleteRightsSettings';
  10. import { PageListDisplaySettings } from './PageListDisplaySettings';
  11. import { SessionMaxAgeSettings } from './SessionMaxAgeSettings';
  12. import { UserHomepageDeletionSettings } from './UserHomepageDeletionSettings';
  13. type FormData = {
  14. sessionMaxAge: string;
  15. };
  16. type Props = {
  17. adminGeneralSecurityContainer: AdminGeneralSecurityContainer;
  18. };
  19. const SecuritySettingComponent: React.FC<Props> = ({ adminGeneralSecurityContainer }) => {
  20. const { t } = useTranslation('admin');
  21. const { register, handleSubmit, reset } = useForm<FormData>();
  22. // Initialize form with current sessionMaxAge value
  23. useEffect(() => {
  24. reset({
  25. sessionMaxAge: adminGeneralSecurityContainer.state.sessionMaxAge || '',
  26. });
  27. }, [reset, adminGeneralSecurityContainer.state.sessionMaxAge]);
  28. const onSubmit = useCallback(async(data: FormData) => {
  29. try {
  30. // Update sessionMaxAge from form data
  31. await adminGeneralSecurityContainer.setSessionMaxAge(data.sessionMaxAge);
  32. // Save all security settings
  33. await adminGeneralSecurityContainer.updateGeneralSecuritySetting();
  34. toastSuccess(t('security_settings.updated_general_security_setting'));
  35. }
  36. catch (err) {
  37. toastError(err);
  38. }
  39. }, [adminGeneralSecurityContainer, t]);
  40. if (adminGeneralSecurityContainer.state.retrieveError != null) {
  41. return (
  42. <div>
  43. <p>
  44. {t('Error occurred')} : {adminGeneralSecurityContainer.state.retrieveError}
  45. </p>
  46. </div>
  47. );
  48. }
  49. return (
  50. <div data-testid="admin-security-setting">
  51. <h2 className="border-bottom mb-5">{t('security_settings.security_settings')}</h2>
  52. <form onSubmit={handleSubmit(onSubmit)}>
  53. <div className="vstack gap-3">
  54. <PageListDisplaySettings adminGeneralSecurityContainer={adminGeneralSecurityContainer} t={t} />
  55. <PageAccessRightsSettings adminGeneralSecurityContainer={adminGeneralSecurityContainer} t={t} />
  56. <PageDeleteRightsSettings adminGeneralSecurityContainer={adminGeneralSecurityContainer} t={t} />
  57. <UserHomepageDeletionSettings adminGeneralSecurityContainer={adminGeneralSecurityContainer} t={t} />
  58. <CommentManageRightsSettings adminGeneralSecurityContainer={adminGeneralSecurityContainer} t={t} />
  59. <SessionMaxAgeSettings register={register} t={t} />
  60. <div className="text-center text-md-start offset-md-3 col-md-5">
  61. <button
  62. type="submit"
  63. className="btn btn-primary"
  64. disabled={adminGeneralSecurityContainer.state.retrieveError != null}
  65. >
  66. {t('Update')}
  67. </button>
  68. </div>
  69. </div>
  70. </form>
  71. </div>
  72. );
  73. };
  74. export const SecuritySetting = withUnstatedContainers(SecuritySettingComponent, [AdminGeneralSecurityContainer]);