CustomizeTitle.tsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import type { FC } from 'react';
  2. import React, { useCallback, useEffect } from 'react';
  3. import { useTranslation } from 'next-i18next';
  4. import { useForm } from 'react-hook-form';
  5. import { Card, CardBody } from 'reactstrap';
  6. import { apiv3Put } from '~/client/util/apiv3-client';
  7. import { toastSuccess, toastError } from '~/client/util/toastr';
  8. import { useCustomTitleTemplate } from '~/states/global';
  9. import AdminUpdateButtonRow from '../Common/AdminUpdateButtonRow';
  10. export const CustomizeTitle: FC = () => {
  11. const { t } = useTranslation('admin');
  12. const customTitleTemplate = useCustomTitleTemplate();
  13. const {
  14. register,
  15. handleSubmit,
  16. reset,
  17. } = useForm();
  18. // Sync form with store data
  19. useEffect(() => {
  20. reset({
  21. customizeTitle: customTitleTemplate ?? '',
  22. });
  23. }, [customTitleTemplate, reset]);
  24. const onSubmit = useCallback(async(data) => {
  25. try {
  26. await apiv3Put('/customize-setting/customize-title', {
  27. customizeTitle: data.customizeTitle,
  28. });
  29. toastSuccess(t('toaster.update_successed', { target: t('admin:customize_settings.custom_title'), ns: 'commons' }));
  30. }
  31. catch (err) {
  32. toastError(err);
  33. }
  34. }, [t]);
  35. return (
  36. <React.Fragment>
  37. <div className="row">
  38. <div className="col-12">
  39. <h2 className="admin-setting-header">{t('admin:customize_settings.custom_title')}</h2>
  40. </div>
  41. <div className="col-12">
  42. <Card className="card custom-card bg-body-tertiary mb-3">
  43. <CardBody className="px-0 py-2">
  44. {/* eslint-disable react/no-danger */}
  45. <p dangerouslySetInnerHTML={{ __html: t('admin:customize_settings.custom_title_detail') }} />
  46. <ul>
  47. <li>
  48. <span dangerouslySetInnerHTML={{ __html: t('admin:customize_settings.custom_title_detail_placeholder1') }} />
  49. </li>
  50. <li>
  51. <span dangerouslySetInnerHTML={{ __html: t('admin:customize_settings.custom_title_detail_placeholder2') }} />
  52. </li>
  53. <li>
  54. <span dangerouslySetInnerHTML={{ __html: t('admin:customize_settings.custom_title_detail_placeholder3') }} />
  55. </li>
  56. </ul>
  57. {/* eslint-enable react/no-danger */}
  58. </CardBody>
  59. </Card>
  60. </div>
  61. {/* TODO i18n */}
  62. <div className="form-text text-muted col-12 mb-3">
  63. Default Value: <code>&#123;&#123;pagename&#125;&#125; - &#123;&#123;sitename&#125;&#125;</code>
  64. <br />
  65. Default Output Example: <code className="xml">&lt;title&gt;Page name - My GROWI&lt;&#047;title&gt;</code>
  66. </div>
  67. <form onSubmit={handleSubmit(onSubmit)}>
  68. <div className="col-12">
  69. <input
  70. className="form-control"
  71. {...register('customizeTitle')}
  72. />
  73. </div>
  74. <div className="col-12">
  75. <AdminUpdateButtonRow type="submit" disabled={false} />
  76. </div>
  77. </form>
  78. </div>
  79. </React.Fragment>
  80. );
  81. };