WhitelistInput.tsx 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import { useCallback, useRef } from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import type AdminMarkDownContainer from '~/client/services/AdminMarkDownContainer';
  4. import { tagNames as recommendedTagNames, attributes as recommendedAttributes } from '~/services/renderer/recommended-whitelist';
  5. type Props ={
  6. adminMarkDownContainer: AdminMarkDownContainer
  7. }
  8. export const WhitelistInput = (props: Props): JSX.Element => {
  9. const { t } = useTranslation('admin');
  10. const { adminMarkDownContainer } = props;
  11. const tagNamesRef = useRef<HTMLTextAreaElement>(null);
  12. const attrsRef = useRef<HTMLTextAreaElement>(null);
  13. const clickRecommendTagButtonHandler = useCallback(() => {
  14. if (tagNamesRef.current == null) {
  15. return;
  16. }
  17. const tagWhitelist = recommendedTagNames.join(',');
  18. tagNamesRef.current.value = tagWhitelist;
  19. adminMarkDownContainer.setState({ tagWhitelist });
  20. }, [adminMarkDownContainer]);
  21. const clickRecommendAttrButtonHandler = useCallback(() => {
  22. if (attrsRef.current == null) {
  23. return;
  24. }
  25. const attrWhitelist = JSON.stringify(recommendedAttributes);
  26. attrsRef.current.value = attrWhitelist;
  27. adminMarkDownContainer.setState({ attrWhitelist });
  28. }, [adminMarkDownContainer]);
  29. return (
  30. <>
  31. <div className="mt-4">
  32. <div className="d-flex justify-content-between">
  33. {t('markdown_settings.xss_options.tag_names')}
  34. <p id="btn-import-tags" className="btn btn-sm btn-primary" onClick={clickRecommendTagButtonHandler}>
  35. {t('markdown_settings.xss_options.import_recommended', { target: 'Tags' })}
  36. </p>
  37. </div>
  38. <textarea
  39. ref={tagNamesRef}
  40. className="form-control xss-list"
  41. name="recommendedTags"
  42. rows={6}
  43. cols={40}
  44. defaultValue={adminMarkDownContainer.state.tagWhitelist}
  45. onChange={(e) => { adminMarkDownContainer.setState({ tagWhitelist: e.target.value }) }}
  46. />
  47. </div>
  48. <div className="mt-4">
  49. <div className="d-flex justify-content-between">
  50. {t('markdown_settings.xss_options.tag_attributes')}
  51. <p id="btn-import-tags" className="btn btn-sm btn-primary" onClick={clickRecommendAttrButtonHandler}>
  52. {t('markdown_settings.xss_options.import_recommended', { target: 'Attrs' })}
  53. </p>
  54. </div>
  55. <textarea
  56. ref={attrsRef}
  57. className="form-control xss-list"
  58. name="recommendedAttrs"
  59. rows={6}
  60. cols={40}
  61. defaultValue={adminMarkDownContainer.state.attrWhitelist}
  62. onChange={(e) => { adminMarkDownContainer.setState({ attrWhitelist: e.target.value }) }}
  63. />
  64. </div>
  65. </>
  66. );
  67. };