import React, { useCallback, useEffect } from 'react'; import { useTranslation } from 'next-i18next'; import PropTypes from 'prop-types'; import { useForm } from 'react-hook-form'; import AdminMarkDownContainer from '~/client/services/AdminMarkDownContainer'; import { toastSuccess, toastError } from '~/client/util/toastr'; import { RehypeSanitizeType } from '~/interfaces/services/rehype-sanitize'; import { tagNames as recommendedTagNames, attributes as recommendedAttributes } from '~/services/renderer/recommended-whitelist'; import loggerFactory from '~/utils/logger'; import { withUnstatedContainers } from '../../UnstatedUtils'; import AdminUpdateButtonRow from '../Common/AdminUpdateButtonRow'; import { WhitelistInput } from './WhitelistInput'; const logger = loggerFactory('growi:importer'); const XssForm = (props) => { const { t, adminMarkDownContainer } = props; const { xssOption, tagWhitelist, attrWhitelist, retrieveError, } = adminMarkDownContainer.state; const { register, handleSubmit, reset, setValue, } = useForm(); // Sync form with container state useEffect(() => { reset({ tagWhitelist, attrWhitelist, }); }, [reset, tagWhitelist, attrWhitelist]); const onClickSubmit = useCallback(async(data) => { try { await adminMarkDownContainer.setState({ tagWhitelist: data.tagWhitelist ?? '' }); await adminMarkDownContainer.setState({ attrWhitelist: data.attrWhitelist ?? '' }); await adminMarkDownContainer.updateXssSetting(); toastSuccess(t('toaster.update_successed', { target: t('markdown_settings.xss_header'), ns: 'commons' })); } catch (err) { toastError(err); logger.error(err); } }, [adminMarkDownContainer, t]); const xssOptions = useCallback(() => { const rehypeRecommendedTags = recommendedTagNames.join(','); const rehypeRecommendedAttributes = JSON.stringify(recommendedAttributes); return (