CustomizeCssSetting.tsx 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import React, { useCallback, useEffect, type JSX } from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import { useForm } from 'react-hook-form';
  4. import { Card, CardBody } from 'reactstrap';
  5. import AdminCustomizeContainer from '~/client/services/AdminCustomizeContainer';
  6. import { toastSuccess, toastError } from '~/client/util/toastr';
  7. import { withUnstatedContainers } from '../../UnstatedUtils';
  8. import AdminUpdateButtonRow from '../Common/AdminUpdateButtonRow';
  9. type Props = {
  10. adminCustomizeContainer: AdminCustomizeContainer
  11. }
  12. const CustomizeCssSetting = (props: Props): JSX.Element => {
  13. const { adminCustomizeContainer } = props;
  14. const { t } = useTranslation();
  15. const {
  16. register,
  17. handleSubmit,
  18. reset,
  19. } = useForm();
  20. // Sync form with container state
  21. useEffect(() => {
  22. reset({
  23. customizeCss: adminCustomizeContainer.state.currentCustomizeCss || '',
  24. });
  25. }, [adminCustomizeContainer.state.currentCustomizeCss, reset]);
  26. const onSubmit = useCallback(async(data) => {
  27. try {
  28. // Update container state before API call
  29. await adminCustomizeContainer.changeCustomizeCss(data.customizeCss);
  30. await adminCustomizeContainer.updateCustomizeCss();
  31. toastSuccess(t('toaster.update_successed', { target: t('admin:customize_settings.custom_css'), ns: 'commons' }));
  32. }
  33. catch (err) {
  34. toastError(err);
  35. }
  36. }, [t, adminCustomizeContainer]);
  37. return (
  38. <React.Fragment>
  39. <div className="row">
  40. <div className="col-12">
  41. <h2 className="admin-setting-header">{t('admin:customize_settings.custom_css')}</h2>
  42. <Card className="card custom-card bg-body-tertiary my-3">
  43. <CardBody className="px-0 py-2">
  44. { t('admin:customize_settings.write_css') }<br />
  45. { t('admin:customize_settings.reflect_change') }
  46. </CardBody>
  47. </Card>
  48. <form onSubmit={handleSubmit(onSubmit)}>
  49. <div>
  50. <textarea
  51. className="form-control"
  52. rows={8}
  53. {...register('customizeCss')}
  54. />
  55. </div>
  56. <AdminUpdateButtonRow type="submit" disabled={adminCustomizeContainer.state.retrieveError != null} />
  57. </form>
  58. </div>
  59. </div>
  60. </React.Fragment>
  61. );
  62. };
  63. const CustomizeCssSettingWrapper = withUnstatedContainers(CustomizeCssSetting, [AdminCustomizeContainer]);
  64. export default CustomizeCssSettingWrapper;