gdq-archive/frontend/components/VideoList.tsx

99 lines
2.6 KiB
TypeScript
Raw Normal View History

2020-08-22 20:25:57 +00:00
import React, { ChangeEvent } from 'react';
import FormControl from 'react-bootstrap/FormControl';
import InputGroup from 'react-bootstrap/InputGroup';
import ListGroup from 'react-bootstrap/ListGroup';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { injectIntl, IntlShape } from 'react-intl';
import VideoListItem from './VideoListItem';
import Filter from './Filter';
import { VideoEntry } from '../util/datatypes/VideoList';
interface VideoListProps {
intl: IntlShape,
id: string,
thumbnailServerURL: string,
videos: Array<VideoEntry>,
}
interface VideoListState {
query: string
}
class VideoList extends React.Component<VideoListProps, VideoListState> {
constructor(props: VideoListProps) {
super(props);
this.state = {
query: '',
};
this.onQueryChange = this.onQueryChange.bind(this);
}
onQueryChange({ target }: ChangeEvent<HTMLInputElement>) {
this.setState({
query: target.value,
});
}
render() {
const { query } = this.state;
const {
intl,
id,
thumbnailServerURL,
videos,
} = this.props;
return (
<div>
<InputGroup>
<InputGroup.Prepend>
<InputGroup.Text id="search-prepend">
<FontAwesomeIcon icon="search" />
</InputGroup.Text>
</InputGroup.Prepend>
<FormControl
placeholder={intl.formatMessage({ id: 'VideoList.Search.Placeholder', defaultMessage: 'Type something to search here…' })}
aria-label={intl.formatMessage({ id: 'VideoList.Search.Label', defaultMessage: 'Search' })}
aria-describedby="search-prepend"
value={query}
onChange={this.onQueryChange}
/>
</InputGroup>
<ListGroup>
<Filter
items={videos}
query={query}
keys={['title', 'fileName']}
output={(filteredVideos) => filteredVideos.map(({
item: {
duration,
fileName,
title,
sourceVideoStart,
sourceVideoEnd,
},
refIndex: index,
}) => (
2021-01-03 17:52:55 +00:00
<VideoListItem
key={index}
duration={duration}
id={id}
thumbnailServerURL={thumbnailServerURL}
fileName={fileName}
title={title}
sourceVideoStart={sourceVideoStart}
sourceVideoEnd={sourceVideoEnd}
/>
))}
2020-08-22 20:25:57 +00:00
/>
</ListGroup>
</div>
);
}
}
export default injectIntl(VideoList);