lbry-desktop/ui/component/common/file-list.jsx
Franco Montenegro 329d434c83
Allow only images in modal image uploader. (#7672)
* Allow only images in modal image uploader.

* Set file path and mime in file selector.

* Refactor WebFile.

* Update get-file-from-path to work with folders; fix file-list component.

* Get rid of File | string for filePath property in components.

* Show instant preview while updating channel thumbnail.

* Fix publish.

* Add jpeg and svg to image filter.
2022-09-02 12:43:35 -04:00

74 lines
2 KiB
JavaScript

// @flow
import React from 'react';
import { useRadioState, Radio, RadioGroup } from 'reakit/Radio';
type Props = {
files: Array<File>,
onChange: (File | void) => void,
};
type RadioProps = {
id: string,
label: string,
};
// Same as FormField type="radio" but it works with reakit:
const ForwardedRadio = React.forwardRef((props: RadioProps, ref) => (
<span className="radio">
<input {...props} type="radio" ref={ref} />
<label htmlFor={props.id}>{props.label}</label>
</span>
));
function FileList(props: Props) {
const { files, onChange } = props;
const radio = useRadioState();
const getFile = (value?: string) => {
if (files && files.length) {
return files.find((file: File) => file.name === value);
}
};
React.useEffect(() => {
if (radio.items.length) {
if (!radio.currentId) {
radio.first();
} else {
const first = radio.items[0].ref.current;
// First auto-selection
if (first && first.id === radio.currentId && !radio.state) {
const file = getFile(first.value);
// Update state and select new file
onChange(file);
radio.setState(first.value);
}
if (radio.state) {
// Find selected element
const stop = radio.items.find((item) => item.id === radio.currentId);
const element = stop && stop.ref.current;
// Only update state if new item is selected
if (element && element.value !== radio.state) {
const file = getFile(element.value);
// Select new file and update state
onChange(file);
radio.setState(element.value);
}
}
}
}
}, [radio, onChange]);
return (
<div className={'file-list'}>
<RadioGroup {...radio} aria-label="files">
{files.map(({ name }) => {
return <Radio key={name} {...radio} value={name} label={name} as={ForwardedRadio} />;
})}
</RadioGroup>
</div>
);
}
export default FileList;