1
0
mirror of https://github.com/mgerb/go-discord-bot synced 2026-01-09 08:32:48 +00:00
Files
go-discord-bot/client/app/pages/video-archive/video-archive.tsx
2022-03-29 00:35:45 -05:00

107 lines
2.7 KiB
TypeScript

import { DateTime } from 'luxon';
import { inject, observer } from 'mobx-react';
import React from 'react';
import { EmbeddedYoutube } from '../../components';
import { IVideoArchive, Permissions } from '../../model';
import { ArchiveService } from '../../services/archive.service';
import { AppStore } from '../../stores';
import './video-archive.scss';
interface IProps {
appStore: AppStore;
}
interface IState {
archives: IVideoArchive[];
url: string;
error?: string;
}
@inject('appStore')
@observer
export class VideoArchive extends React.Component<IProps, IState> {
constructor(props: IProps) {
super(props);
this.state = {
archives: [],
url: '',
};
}
componentDidMount() {
this.loadArchives();
}
async loadArchives() {
const archives = await ArchiveService.getVideoArchive();
if (archives) {
this.setState({
archives,
});
}
}
onSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
const { url } = this.state;
this.setState({ error: undefined });
try {
await ArchiveService.postVideoArchive({ url });
} catch (e) {
this.setState({ error: 'Invalid URL' });
return;
}
this.setState({ url: '' });
this.loadArchives();
};
renderForm() {
const { error, url } = this.state;
return (
<form className="flex flex--v-center" onSubmit={this.onSubmit}>
<input
className="input video-archive__text-input"
placeholder="Enter Youtube URL or ID..."
value={url}
onChange={(e) => this.setState({ url: e.target.value })}
/>
<input type="submit" className="button button--primary" style={{ marginLeft: '10px' }} />
{error && (
<span className="color__red" style={{ marginLeft: '5px' }}>
{error}
</span>
)}
</form>
);
}
renderArchives() {
return this.state.archives.map((v, k) => (
<div key={k} className="card video-archive__card test">
<EmbeddedYoutube id={v.youtube_id} />
<div style={{ padding: '10px 10px 0' }}>
<h3 style={{ margin: '0 0 5px' }} className="ellipsis" title={v.title}>
{v.title}
</h3>
<div>
<span className="color__red">{v.uploaded_by}</span> -{' '}
<small>{DateTime.fromISO(v.created_at).toLocaleString()}</small>
</div>
</div>
</div>
));
}
render() {
const { claims } = this.props.appStore;
return (
<div className="content">
{claims && claims.permissions > Permissions.User && this.renderForm()}
<div className="archive-grid">{this.renderArchives()}</div>
</div>
);
}
}