Skip to content

Commit d6cad1f

Browse files
committed
file upload to use the updated on change ref, in case the onChange uses a state/prop dependency
1 parent 554b471 commit d6cad1f

File tree

1 file changed

+17
-8
lines changed

1 file changed

+17
-8
lines changed

src/controls/file-upload.tsx

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,23 @@ interface iProps {
3333
export const FileUpload = React.forwardRef<HTMLButtonElement, (iProps)>((props, ref) => {
3434
const classes = useStyles();
3535
const hiddenFileInput = React.useRef(null);
36+
const onChangeRef = React.useRef(props.onChange);
37+
const asBase64Ref = React.useRef(props.asBase64);
38+
3639
const isMulti = props.allowMultiple === true;
3740
const icon = props.icon || <ArrowUploadRegular />;
3841
const title = isNotEmptyString(props.title) ? props.title : `Drop or select ${isMulti ? 'files' : 'file'}`;
3942

43+
//keep onChange up to date
44+
React.useEffect(() => {
45+
onChangeRef.current = props.onChange;
46+
}, [props.onChange]);
47+
//keep onChange up to date
48+
React.useEffect(() => {
49+
asBase64Ref.current = props.asBase64;
50+
}, [props.asBase64]);
51+
52+
4053
const onGotFiles = React.useCallback(async (rawFiles: FileList) => {
4154
let errors: string[] = [];
4255
let acceptedFiles: File[] = [];
@@ -66,18 +79,14 @@ export const FileUpload = React.forwardRef<HTMLButtonElement, (iProps)>((props,
6679
}
6780

6881
if (isMulti) {
69-
if (isFunction(props.onChange)) {
70-
props.onChange(acceptedFiles, errors);
71-
}
82+
onChangeRef.current?.(acceptedFiles, errors);
7283
}
7384
else {
7485
const fileUploaded = acceptedFiles[0];
75-
if (isFunction(props.onChange)) {
76-
props.onChange(fileUploaded, errors);
77-
}
86+
onChangeRef.current?.(fileUploaded, errors);
7887
}
7988

80-
if (isFunction(props.asBase64)) {
89+
if (isFunction(asBase64Ref.current)) {
8190
const filesAs64: base64Result[] = [];
8291
for (let i = 0; i < (isMulti ? acceptedFiles.length : 1); i++) {
8392
const currentFile = acceptedFiles[i];
@@ -95,7 +104,7 @@ export const FileUpload = React.forwardRef<HTMLButtonElement, (iProps)>((props,
95104
else errors.push(`Could not read file ${acceptedFiles[i].name}`);
96105
}
97106
}
98-
props.asBase64(filesAs64, errors);
107+
asBase64Ref.current?.(filesAs64, errors);
99108
}
100109
}, useEffectOnlyOnMount);
101110

0 commit comments

Comments
 (0)