index.tsx 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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. // Save all security settings with form data
  31. await adminGeneralSecurityContainer.updateGeneralSecuritySetting({
  32. sessionMaxAge: data.sessionMaxAge,
  33. restrictGuestMode: adminGeneralSecurityContainer.state.currentRestrictGuestMode,
  34. pageDeletionAuthority: adminGeneralSecurityContainer.state.currentPageDeletionAuthority,
  35. pageCompleteDeletionAuthority: adminGeneralSecurityContainer.state.currentPageCompleteDeletionAuthority,
  36. pageRecursiveDeletionAuthority: adminGeneralSecurityContainer.state.currentPageRecursiveDeletionAuthority,
  37. pageRecursiveCompleteDeletionAuthority: adminGeneralSecurityContainer.state.currentPageRecursiveCompleteDeletionAuthority,
  38. isAllGroupMembershipRequiredForPageCompleteDeletion: adminGeneralSecurityContainer.state.isAllGroupMembershipRequiredForPageCompleteDeletion,
  39. hideRestrictedByGroup: adminGeneralSecurityContainer.state.currentGroupRestrictionDisplayMode === 'Hidden',
  40. hideRestrictedByOwner: adminGeneralSecurityContainer.state.currentOwnerRestrictionDisplayMode === 'Hidden',
  41. isUsersHomepageDeletionEnabled: adminGeneralSecurityContainer.state.isUsersHomepageDeletionEnabled,
  42. isForceDeleteUserHomepageOnUserDeletion: adminGeneralSecurityContainer.state.isForceDeleteUserHomepageOnUserDeletion,
  43. isRomUserAllowedToComment: adminGeneralSecurityContainer.state.isRomUserAllowedToComment,
  44. });
  45. toastSuccess(t('security_settings.updated_general_security_setting'));
  46. }
  47. catch (err) {
  48. toastError(err);
  49. }
  50. }, [adminGeneralSecurityContainer, t]);
  51. if (adminGeneralSecurityContainer.state.retrieveError != null) {
  52. return (
  53. <div>
  54. <p>
  55. {t('Error occurred')} : {adminGeneralSecurityContainer.state.retrieveError}
  56. </p>
  57. </div>
  58. );
  59. }
  60. return (
  61. <div data-testid="admin-security-setting">
  62. <h2 className="border-bottom mb-5">{t('security_settings.security_settings')}</h2>
  63. <form onSubmit={handleSubmit(onSubmit)}>
  64. <div className="vstack gap-3">
  65. <PageListDisplaySettings adminGeneralSecurityContainer={adminGeneralSecurityContainer} t={t} />
  66. <PageAccessRightsSettings adminGeneralSecurityContainer={adminGeneralSecurityContainer} t={t} />
  67. <PageDeleteRightsSettings adminGeneralSecurityContainer={adminGeneralSecurityContainer} t={t} />
  68. <UserHomepageDeletionSettings adminGeneralSecurityContainer={adminGeneralSecurityContainer} t={t} />
  69. <CommentManageRightsSettings adminGeneralSecurityContainer={adminGeneralSecurityContainer} t={t} />
  70. <SessionMaxAgeSettings register={register} t={t} />
  71. <div className="text-center text-md-start offset-md-3 col-md-5">
  72. <button
  73. type="submit"
  74. className="btn btn-primary"
  75. disabled={adminGeneralSecurityContainer.state.retrieveError != null}
  76. >
  77. {t('Update')}
  78. </button>
  79. </div>
  80. </div>
  81. </form>
  82. </div>
  83. );
  84. };
  85. export const SecuritySetting = withUnstatedContainers(SecuritySettingComponent, [AdminGeneralSecurityContainer]);