Skip to content

Commit 946bf46

Browse files
authored
Allow FileTrigger to accept the same file twice (#5045)
* Allow FileTrigger to accept the same file twice * remove name prop * update stories from onChange to onSelect * remove name from test * update to onSelect in docs * move filetrigger to buttons category in docs
1 parent a6ad964 commit 946bf46

File tree

6 files changed

+25
-25
lines changed

6 files changed

+25
-25
lines changed

packages/@react-spectrum/dropzone/stories/DropZone.stories.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ function Example(props) {
125125
<Content>
126126
<FileTrigger
127127
allowsMultiple
128-
onChange={(e) => {
128+
onSelect={(e) => {
129129
let files = Array.from(e);
130130
let rows = files.map((file, index) => ({name: file.name, type: file.type, id: index}));
131131
setFilledSrc(rows);
@@ -232,7 +232,7 @@ function DropZoneWithButton(props) {
232232
</Heading>
233233
<Content>
234234
<FileTrigger
235-
onChange={(e) => {
235+
onSelect={(e) => {
236236
let files = Array.from(e);
237237
let src = files.map(file => URL.createObjectURL(file));
238238
let type = files.map(file => file.type);

packages/react-aria-components/docs/DropZone.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ function Example() {
261261
return(
262262
<DropZone>
263263
<FileTrigger
264-
onChange={(e) => {
264+
onSelect={(e) => {
265265
let files = Array.from(e);
266266
let urls = files.map((file) => file.name);
267267
setFile(urls);

packages/react-aria-components/docs/FileTrigger.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import Button from '@react-spectrum/docs/pages/assets/component-illustrations/Ac
2424
import Link from '@react-spectrum/docs/pages/assets/component-illustrations/Link.svg';
2525

2626
---
27-
category: Forms
27+
category: Buttons
2828
keywords: [filetrigger, input, aria]
2929
type: component
3030
---
@@ -48,7 +48,7 @@ function Example(){
4848
return (
4949
<>
5050
<FileTrigger
51-
onChange={(e) => {
51+
onSelect={(e) => {
5252
let files = Array.from(e);
5353
let urls = files.map((file) => file.name);
5454
setFile(urls);

packages/react-aria-components/src/FileTrigger.tsx

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,25 +31,27 @@ export interface FileTriggerProps {
3131
/**
3232
* Handler when a user selects a file.
3333
*/
34-
onChange?: (files: FileList | null) => void,
35-
/**
36-
* The name of the input element, used when submitting an HTML form. See [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#htmlattrdefname).
37-
*/
38-
name?: string,
34+
onSelect?: (files: FileList | null) => void,
3935
/**
4036
* The children of the component.
4137
*/
4238
children?: ReactNode
4339
}
4440

4541
function FileTrigger(props: FileTriggerProps, ref: ForwardedRef<HTMLInputElement>) {
46-
let {onChange, acceptedFileTypes, allowsMultiple, defaultCamera, name, children, ...rest} = props;
42+
let {onSelect, acceptedFileTypes, allowsMultiple, defaultCamera, children, ...rest} = props;
4743
let inputRef = useObjectRef(ref);
4844
let domProps = filterDOMProps(rest);
4945

5046
return (
5147
<>
52-
<PressResponder onPress={() => inputRef.current?.click()}>
48+
<PressResponder
49+
onPress={() => {
50+
if (inputRef.current.value) {
51+
inputRef.current.value = '';
52+
}
53+
inputRef.current?.click();
54+
}}>
5355
{children}
5456
</PressResponder>
5557
<Input
@@ -58,10 +60,9 @@ function FileTrigger(props: FileTriggerProps, ref: ForwardedRef<HTMLInputElement
5860
ref={inputRef}
5961
style={{display: 'none'}}
6062
accept={acceptedFileTypes?.toString()}
61-
onChange={(e) => onChange?.(e.target.files)}
63+
onChange={(e) => onSelect?.(e.target.files)}
6264
capture={defaultCamera}
63-
multiple={allowsMultiple}
64-
name={name} />
65+
multiple={allowsMultiple} />
6566
</>
6667
);
6768
}

packages/react-aria-components/stories/index.stories.tsx

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -830,7 +830,7 @@ export const DropzoneExampleWithFileTriggerLink = (props) => (
830830
onDrop={action('OnDrop')}
831831
onDropEnter={action('OnDropEnter')}
832832
onDropExit={action('OnDropExit')}>
833-
<FileTrigger onChange={action('onChange')}>
833+
<FileTrigger onSelect={action('onSelect')}>
834834
<Link>Upload</Link>
835835
</FileTrigger>
836836
</DropZone>
@@ -845,7 +845,7 @@ export const DropzoneExampleWithFileTriggerButton = (props) => (
845845
onDrop={action('OnDrop')}
846846
onDropEnter={action('OnDropEnter')}
847847
onDropExit={action('OnDropExit')}>
848-
<FileTrigger onChange={action('onChange')} >
848+
<FileTrigger onSelect={action('onSelect')} >
849849
<Button>Upload</Button>
850850
</FileTrigger>
851851
</DropZone>
@@ -861,7 +861,7 @@ export const DropzoneExampleWithDraggableAndFileTrigger = (props) => (
861861
onDrop={action('OnDrop')}
862862
onDropEnter={action('OnDropEnter')}
863863
onDropExit={action('OnDropExit')}>
864-
<FileTrigger onChange={action('onChange')} >
864+
<FileTrigger onSelect={action('onSelect')} >
865865
<Button>Browse</Button>
866866
</FileTrigger>
867867
Or drag into here
@@ -879,7 +879,7 @@ export const DropZoneOnlyAcceptPNGWithFileTrigger = (props) => (
879879
onDrop={action('OnDrop')}
880880
onDropEnter={action('OnDropEnter')}
881881
onDropExit={action('OnDropExit')} >
882-
<FileTrigger onChange={action('onChange')} acceptedFileTypes={['image/png']}>
882+
<FileTrigger onSelect={action('onSelect')} acceptedFileTypes={['image/png']}>
883883
<Button>Upload</Button>
884884
</FileTrigger>
885885
</DropZone>
@@ -896,7 +896,7 @@ export const DropZoneWithCaptureMobileOnly = (props) => (
896896
onDrop={action('OnDrop')}
897897
onDropEnter={action('OnDropEnter')}
898898
onDropExit={action('OnDropExit')} >
899-
<FileTrigger onChange={action('onChange')} defaultCamera="environment">
899+
<FileTrigger onSelect={action('onSelect')} defaultCamera="environment">
900900
<Button>Upload</Button>
901901
</FileTrigger>
902902
</DropZone>
@@ -963,16 +963,16 @@ export const DropzoneWithRenderProps = (props) => (
963963

964964
export const FileTriggerButton = (props) => (
965965
<FileTrigger
966-
{...props}
967-
onChange={action('OnChange')} >
966+
onSelect={action('onSelect')}
967+
{...props} >
968968
<Button>Upload</Button>
969969
</FileTrigger>
970970
);
971971

972972
export const FileTriggerLinkAllowsMultiple = (props) => (
973973
<FileTrigger
974974
{...props}
975-
onChange={action('OnChange')}
975+
onSelect={action('onSelect')}
976976
allowsMultiple >
977977
<Link>Select a file</Link>
978978
</FileTrigger>

packages/react-aria-components/test/FileTrigger.test.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,13 +80,12 @@ describe('FileTrigger', () => {
8080
it('should attach a ref to the input', () => {
8181
let ref = React.createRef();
8282
let {getByTestId} = render(
83-
<FileTrigger ref={ref} data-testid="foo" name="foibles">
83+
<FileTrigger ref={ref} data-testid="foo">
8484
<Button>Upload</Button>
8585
</FileTrigger>
8686
);
8787

8888
let input = getByTestId('foo');
8989
expect(ref.current).toBe(input);
90-
expect(input).toHaveAttribute('name', 'foibles');
9190
});
9291
});

0 commit comments

Comments
 (0)