|
@@ -1,4 +1,6 @@
|
|
|
-import React, { useCallback, useState, type JSX } from 'react';
|
|
|
|
|
|
|
+import React, {
|
|
|
|
|
+ useCallback, useState, useRef, type JSX,
|
|
|
|
|
+} from 'react';
|
|
|
|
|
|
|
|
import { useAtomValue, useSetAtom } from 'jotai';
|
|
import { useAtomValue, useSetAtom } from 'jotai';
|
|
|
import { useTranslation } from 'react-i18next';
|
|
import { useTranslation } from 'react-i18next';
|
|
@@ -29,7 +31,7 @@ const CustomizeLogoSetting = (): JSX.Element => {
|
|
|
const [isDefaultLogoSelected, setIsDefaultLogoSelected] = useState<boolean>(isDefaultLogo ?? true);
|
|
const [isDefaultLogoSelected, setIsDefaultLogoSelected] = useState<boolean>(isDefaultLogo ?? true);
|
|
|
const [retrieveError, setRetrieveError] = useState<any>();
|
|
const [retrieveError, setRetrieveError] = useState<any>();
|
|
|
const [isImageCropped, setIsImageCropped] = useState<boolean>(false);
|
|
const [isImageCropped, setIsImageCropped] = useState<boolean>(false);
|
|
|
- const [fileInputKey, setFileInputKey] = useState<string>(Date.now().toString());
|
|
|
|
|
|
|
+ const fileInputRef = useRef<HTMLInputElement | null>(null);
|
|
|
|
|
|
|
|
const onSelectFile = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {
|
|
const onSelectFile = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {
|
|
|
const files = e.target.files;
|
|
const files = e.target.files;
|
|
@@ -55,8 +57,10 @@ const CustomizeLogoSetting = (): JSX.Element => {
|
|
|
}
|
|
}
|
|
|
}, [t, isDefaultLogoSelected]);
|
|
}, [t, isDefaultLogoSelected]);
|
|
|
|
|
|
|
|
- const resetFileInput = useCallback(() => {
|
|
|
|
|
- setFileInputKey(Date.now().toString());
|
|
|
|
|
|
|
+ const clearFileInput = useCallback(() => {
|
|
|
|
|
+ if (fileInputRef.current) {
|
|
|
|
|
+ fileInputRef.current.value = '';
|
|
|
|
|
+ }
|
|
|
}, []);
|
|
}, []);
|
|
|
|
|
|
|
|
const onClickDeleteBtn = useCallback(async () => {
|
|
const onClickDeleteBtn = useCallback(async () => {
|
|
@@ -67,14 +71,14 @@ const CustomizeLogoSetting = (): JSX.Element => {
|
|
|
setUploadLogoSrc(null);
|
|
setUploadLogoSrc(null);
|
|
|
setIsImageCropped(false);
|
|
setIsImageCropped(false);
|
|
|
setIsImageCropModalShow(false);
|
|
setIsImageCropModalShow(false);
|
|
|
- resetFileInput();
|
|
|
|
|
|
|
+ clearFileInput();
|
|
|
}
|
|
}
|
|
|
catch (err) {
|
|
catch (err) {
|
|
|
toastError(err);
|
|
toastError(err);
|
|
|
setRetrieveError(err);
|
|
setRetrieveError(err);
|
|
|
throw new Error('Failed to delete logo');
|
|
throw new Error('Failed to delete logo');
|
|
|
}
|
|
}
|
|
|
- }, [setIsCustomizedLogoUploaded, t, setUploadLogoSrc, setIsImageCropped, setIsImageCropModalShow, resetFileInput, setRetrieveError]);
|
|
|
|
|
|
|
+ }, [setIsCustomizedLogoUploaded, t, setUploadLogoSrc, setIsImageCropped, setIsImageCropModalShow, clearFileInput, setRetrieveError]);
|
|
|
|
|
|
|
|
const processImageCompletedHandler = useCallback(async (croppedImage) => {
|
|
const processImageCompletedHandler = useCallback(async (croppedImage) => {
|
|
|
try {
|
|
try {
|
|
@@ -161,7 +165,7 @@ const CustomizeLogoSetting = (): JSX.Element => {
|
|
|
<div className="col-sm-8 col-12">
|
|
<div className="col-sm-8 col-12">
|
|
|
<input
|
|
<input
|
|
|
type="file"
|
|
type="file"
|
|
|
- key={fileInputKey}
|
|
|
|
|
|
|
+ ref={fileInputRef}
|
|
|
onChange={onSelectFile}
|
|
onChange={onSelectFile}
|
|
|
name="brandLogo"
|
|
name="brandLogo"
|
|
|
accept="image/*"
|
|
accept="image/*"
|
|
@@ -184,7 +188,7 @@ const CustomizeLogoSetting = (): JSX.Element => {
|
|
|
src={uploadLogoSrc}
|
|
src={uploadLogoSrc}
|
|
|
onModalClose={() => {
|
|
onModalClose={() => {
|
|
|
if (!isImageCropped) {
|
|
if (!isImageCropped) {
|
|
|
- resetFileInput();
|
|
|
|
|
|
|
+ clearFileInput();
|
|
|
setUploadLogoSrc(null);
|
|
setUploadLogoSrc(null);
|
|
|
}
|
|
}
|
|
|
setIsImageCropModalShow(false);
|
|
setIsImageCropModalShow(false);
|