import React, { useCallback, useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { toastError, toastSuccess } from '~/client/util/apiNotification'; import { apiv3Delete, apiv3Get, apiv3PostForm, apiv3Put, } from '~/client/util/apiv3-client'; import ImageCropModal from '~/components/Common/ImageCropModal'; import AdminUpdateButtonRow from '../Common/AdminUpdateButtonRow'; const DEFAULT_LOGO = '/images/logo.svg'; const CustomizeLogoSetting = (): JSX.Element => { const { t } = useTranslation(); const [uploadLogoSrc, setUploadLogoSrc] = useState(null); const [isImageCropModalShow, setIsImageCropModalShow] = useState(false); const [isDefaultLogo, setIsDefaultLogo] = useState(true); const [retrieveError, setRetrieveError] = useState(); const [customizedLogoSrc, setCustomizedLogoSrc] = useState< string | null >(null); const retrieveData = useCallback(async() => { try { const response = await apiv3Get('/customize-setting/customize-logo'); const { isDefaultLogo: _isDefaultLogo, customizedLogoSrc } = response.data; const isDefaultLogo = _isDefaultLogo ?? true; setIsDefaultLogo(isDefaultLogo); setCustomizedLogoSrc(customizedLogoSrc); } catch (err) { setRetrieveError(err); throw new Error('Failed to fetch data'); } }, []); useEffect(() => { retrieveData(); }, [retrieveData]); const onSelectFile = useCallback((e: React.ChangeEvent) => { if (e.target.files != null && e.target.files.length > 0) { const reader = new FileReader(); reader.addEventListener('load', () => setUploadLogoSrc(reader.result)); reader.readAsDataURL(e.target.files[0]); setIsImageCropModalShow(true); } }, []); const onClickSubmit = useCallback(async() => { try { const response = await apiv3Put('/customize-setting/customize-logo', { isDefaultLogo, customizedLogoSrc, }); const { customizedParams } = response.data; setIsDefaultLogo(customizedParams.isDefaultLogo); setCustomizedLogoSrc(customizedParams.customizedLogoSrc); toastSuccess(t('toaster.update_successed', { target: t('admin:customize_setting.custom_logo') })); } catch (err) { toastError(err); } }, [t, isDefaultLogo, customizedLogoSrc]); const onClickDeleteBtn = useCallback(async() => { try { await apiv3Delete('/customize-setting/delete-brand-logo'); setCustomizedLogoSrc(null); toastSuccess(t('toaster.update_successed', { target: t('admin:customize_setting.current_logo') })); } catch (err) { toastError(err); setRetrieveError(err); throw new Error('Failed to delete logo'); } }, [t]); const onCropCompleted = useCallback(async(croppedImage) => { try { const formData = new FormData(); formData.append('file', croppedImage); const { data } = await apiv3PostForm('/customize-setting/upload-brand-logo', formData); setCustomizedLogoSrc(data.attachment.filePathProxied); toastSuccess(t('toaster.update_successed', { target: t('admin:customize_setting.current_logo') })); } catch (err) { toastError(err); setRetrieveError(err); throw new Error('Failed to upload brand logo'); } setIsImageCropModalShow(false); }, [t]); return (

{t('admin:customize_setting.custom_logo')}

{ setIsDefaultLogo(true) }} />

{ setIsDefaultLogo(false) }} />

{(customizedLogoSrc != null) && ( )}
setIsImageCropModalShow(false)} onCropCompleted={onCropCompleted} isCircular={false} />
); }; export default CustomizeLogoSetting;