]> git.localhorst.tv Git - alttp.git/blob - resources/js/components/episodes/Item.js
71fe49ed5c6875eb00d34848143160a75576fc02
[alttp.git] / resources / js / components / episodes / Item.js
1 import moment from 'moment';
2 import PropTypes from 'prop-types';
3 import React from 'react';
4 import { Button } from 'react-bootstrap';
5 import { useTranslation } from 'react-i18next';
6
7 import Channels from './Channels';
8 import Crew from './Crew';
9 import MultiLink from './MultiLink';
10 import Players from './Players';
11 import Icon from '../common/Icon';
12 import { canRestreamEpisode } from '../../helpers/permissions';
13 import { withUser } from '../../helpers/UserContext';
14
15 const isActive = episode => {
16         if (!episode.start) return false;
17         const now = moment();
18         const start = moment(episode.start).subtract(10, 'minutes');
19         const end = moment(episode.start).add(episode.estimate, 'seconds');
20         return start.isBefore(now) && end.isAfter(now);
21 };
22
23 const Item = ({ episode, onAddRestream, onEditRestream, user }) => {
24         const { t } = useTranslation();
25
26         const classNames = [
27                 'episodes-item',
28                 'd-flex',
29                 'align-items-start',
30                 'my-3',
31                 'p-2',
32                 'border',
33                 'rounded',
34         ];
35         if (isActive(episode)) {
36                 classNames.push('is-active');
37         }
38
39         const hasChannels = episode.channels && episode.channels.length;
40         const hasPlayers = episode.players && episode.players.length;
41
42         return <div className={classNames.join(' ')}>
43                 <div className="episode-start me-3 fs-4 text-end">
44                         {t('schedule.startTime', { date: new Date(episode.start) })}
45                 </div>
46                 <div className="flex-fill">
47                         <div className="d-flex align-items-start justify-content-between">
48                                 <div>
49                                         {episode.title ?
50                                                 <div className="episode-title fs-4">
51                                                         {episode.title}
52                                                 </div>
53                                         : null}
54                                         {episode.event ?
55                                                 <div className="episode-event">
56                                                         {episode.event.title}
57                                                 </div>
58                                         : null}
59                                 </div>
60                                 <div className="episode-channel-links text-end">
61                                         {hasChannels ?
62                                                 <Channels
63                                                         channels={episode.channels}
64                                                         episode={episode}
65                                                         onEditRestream={onEditRestream}
66                                                 />
67                                         : null}
68                                         {!hasChannels && hasPlayers ?
69                                                 <MultiLink players={episode.players} />
70                                         : null}
71                                         {onAddRestream && canRestreamEpisode(user, episode) ?
72                                                 <div>
73                                                         <Button
74                                                                 onClick={() => onAddRestream(episode)}
75                                                                 variant="outline-secondary"
76                                                         >
77                                                                 <Icon.ADD title="" />
78                                                                 {' '}
79                                                                 {t('episodes.addRestream')}
80                                                         </Button>
81                                                 </div>
82                                         : null}
83                                 </div>
84                         </div>
85                         {hasPlayers ?
86                                 <Players players={episode.players} />
87                         : null}
88                         {episode.crew && episode.crew.length ?
89                                 <Crew crew={episode.crew} />
90                         : null}
91                 </div>
92         </div>;
93 };
94
95 Item.propTypes = {
96         episode: PropTypes.shape({
97                 channels: PropTypes.arrayOf(PropTypes.shape({
98                 })),
99                 crew: PropTypes.arrayOf(PropTypes.shape({
100                 })),
101                 event: PropTypes.shape({
102                         title: PropTypes.string,
103                 }),
104                 players: PropTypes.arrayOf(PropTypes.shape({
105                 })),
106                 start: PropTypes.string,
107                 title: PropTypes.string,
108         }),
109         onAddRestream: PropTypes.func,
110         onEditRestream: PropTypes.func,
111         user: PropTypes.shape({
112         }),
113 };
114
115 export default withUser(Item);