Skip to content

Commit f98c289

Browse files
committed
refactor: wrap upload button with form to reset it easily after upload
1 parent 78795d1 commit f98c289

File tree

2 files changed

+35
-36
lines changed

2 files changed

+35
-36
lines changed

src/script/page/message-list/AssetUploadButton.test.tsx

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,36 +32,35 @@ jest.mock('../../Config', () => ({
3232
const pngFile = new File(['(⌐□_□)'], 'chucknorris.png', {type: 'image/png'});
3333

3434
describe('AssetUploadButton', () => {
35-
it('Does call onSelectFiles with uploaded file', async () => {
35+
it('Does call onSelectFiles with uploaded file', () => {
3636
const onSelectFiles = jest.fn();
3737

38-
const {getByTestId} = render(<AssetUploadButton onSelectFiles={onSelectFiles} />);
38+
const {container} = render(<AssetUploadButton onSelectFiles={onSelectFiles} />);
39+
const fileInput = container.querySelector('input[type="file"]') as HTMLInputElement;
3940

40-
const fileInput = getByTestId('conversation-input-bar-files') as HTMLInputElement;
4141
fireEvent.change(fileInput, {
4242
target: {files: [pngFile]},
4343
});
4444

4545
expect(onSelectFiles).toHaveBeenCalledWith([pngFile]);
4646
});
4747

48-
it('Does reset file input after upload', async () => {
48+
it('Does reset a form with input after upload', () => {
4949
const onSelectFiles = jest.fn();
5050

51-
const {getByTestId} = render(<AssetUploadButton onSelectFiles={onSelectFiles} />);
51+
const {container} = render(<AssetUploadButton onSelectFiles={onSelectFiles} />);
5252

53-
const getFileInput = () => getByTestId('conversation-input-bar-files') as HTMLInputElement;
54-
let fileInput = getFileInput();
53+
const form = container.querySelector('form');
54+
jest.spyOn(form!, 'reset');
55+
56+
const fileInput = container.querySelector('input[type="file"]') as HTMLInputElement;
5557

5658
fireEvent.change(fileInput, {
5759
target: {files: [pngFile]},
5860
});
5961

60-
expect(fileInput.files?.[0].name).toEqual(pngFile.name);
6162
expect(onSelectFiles).toHaveBeenCalledWith([pngFile]);
62-
63-
//input did reset we grab new reference
64-
fileInput = getFileInput();
65-
expect(fileInput.files).toHaveLength(0);
63+
expect(fileInput.files?.[0].name).toEqual(pngFile.name);
64+
expect(form!.reset).toHaveBeenCalled();
6665
});
6766
});

src/script/page/message-list/AssetUploadButton.tsx

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
*
1818
*/
1919

20-
import {useState, useRef} from 'react';
20+
import {useRef} from 'react';
2121
import {Config} from '../../Config';
2222
import {t} from 'Util/LocalizerUtil';
2323
import Icon from 'Components/Icon';
@@ -27,9 +27,9 @@ interface AssetUploadButtonProps {
2727
}
2828

2929
export const AssetUploadButton = ({onSelectFiles}: AssetUploadButtonProps) => {
30-
const [inputKey, setInputKey] = useState(Date.now());
3130
const acceptedFileTypes = Config.getConfig().FEATURE.ALLOWED_FILE_UPLOAD_EXTENSIONS.join(',');
3231
const fileRef = useRef<HTMLInputElement>(null!);
32+
const formRef = useRef<HTMLFormElement>(null);
3333

3434
const handleFileChange = (event: React.ChangeEvent<HTMLInputElement>) => {
3535
const {files} = event.target;
@@ -40,30 +40,30 @@ export const AssetUploadButton = ({onSelectFiles}: AssetUploadButtonProps) => {
4040

4141
onSelectFiles(Array.from(files));
4242

43-
//reset file input's value by re-rendering the component
44-
setInputKey(Date.now());
43+
//reset file input's value resetting form wrapper
44+
formRef.current?.reset();
4545
};
4646

4747
return (
48-
<button
49-
type="button"
50-
aria-label={t('tooltipConversationFile')}
51-
title={t('tooltipConversationFile')}
52-
className="conversation-button controls-right-button no-radius file-button"
53-
onClick={() => fileRef.current?.click()}
54-
data-uie-name="do-share-file"
55-
>
56-
<Icon.Attachment />
57-
<input
58-
key={inputKey}
59-
ref={fileRef}
60-
accept={acceptedFileTypes ?? null}
61-
id="conversation-input-bar-files"
62-
data-uie-name="conversation-input-bar-files"
63-
tabIndex={-1}
64-
onChange={handleFileChange}
65-
type="file"
66-
/>
67-
</button>
48+
<form ref={formRef}>
49+
<button
50+
type="button"
51+
aria-label={t('tooltipConversationFile')}
52+
title={t('tooltipConversationFile')}
53+
className="conversation-button controls-right-button no-radius file-button"
54+
onClick={() => fileRef.current?.click()}
55+
data-uie-name="do-share-file"
56+
>
57+
<Icon.Attachment />
58+
<input
59+
ref={fileRef}
60+
accept={acceptedFileTypes ?? null}
61+
id="conversation-input-bar-files"
62+
tabIndex={-1}
63+
onChange={handleFileChange}
64+
type="file"
65+
/>
66+
</button>
67+
</form>
6868
);
6969
};

0 commit comments

Comments
 (0)