X-Git-Url: https://git.localhorst.tv/?a=blobdiff_plain;f=resources%2Fjs%2Fcomponents%2Fresults%2FItem.js;h=2e29d752afd2bd6938e82a5123c3b607bdea7308;hb=147c5f43c5d41fa18e82edb6651fe5a37c789353;hp=0d0d34e81a11553f7535be8a883d1fabb7df378d;hpb=878ceac3fc16d0c611c5002ae5d0605f1a07a8b4;p=alttp.git diff --git a/resources/js/components/results/Item.js b/resources/js/components/results/Item.js index 0d0d34e..2e29d75 100644 --- a/resources/js/components/results/Item.js +++ b/resources/js/components/results/Item.js @@ -1,71 +1,110 @@ import PropTypes from 'prop-types'; -import React from 'react'; -import { withTranslation } from 'react-i18next'; +import React, { useState } from 'react'; +import { Button } from 'react-bootstrap'; +import { useTranslation } from 'react-i18next'; +import DetailDialog from './DetailDialog'; import Icon from '../common/Icon'; import Box from '../users/Box'; -import { formatTime } from '../../helpers/Result'; -import { findResult } from '../../helpers/Participant'; +import { getIcon, getTime } from '../../helpers/Result'; import { maySeeResults } from '../../helpers/permissions'; -import { withUser } from '../../helpers/UserContext'; +import { findResult } from '../../helpers/User'; +import { useUser } from '../../hooks/user'; -const getIcon = (result, index) => { - if (!result || !result.has_finished) { - return ; +const getClassName = result => { + const classNames = ['status']; + if (result && result.has_finished) { + classNames.push('finished'); + if (result.comment) { + classNames.push('has-comment'); + } + } else { + classNames.push('pending'); } - if (result.forfeit) { - return ; - } - if (index === 0) { - return ; - } - if (index === 1) { - return ; + return classNames.join(' '); +}; + +const twitchReg = /^https?:\/\/(www\.)?twitch\.tv/; +const youtubeReg = /^https?:\/\/(www\.)?youtu(\.be|be\.)/; + +const getVoDVariant = result => { + if (!result || !result.vod) return 'outline-secondary'; + if (twitchReg.test(result.vod)) { + return 'twitch'; } - if (index === 2) { - return ; + if (youtubeReg.test(result.vod)) { + return 'outline-youtube'; } - return ; + return 'outline-secondary'; }; -const getTime = (user, tournament, round, result) => { - if (!result || !maySeeResults(user, tournament, round)) { - return null; +const getVoDIcon = result => { + const variant = getVoDVariant(result); + if (variant === 'twitch') { + return ; } - if (result.time) { - return formatTime(result); + if (variant === 'outline-youtube') { + return ; } - if (result.forfeit) { - return 'DNF'; - } - return '?'; + return ; }; const Item = ({ - index, - participant, round, tournament, user, }) => { - const result = findResult(participant, round); + const [showDialog, setShowDialog] = useState(false); + + const { t } = useTranslation(); + const { user: authUser } = useUser(); + + const result = React.useMemo( + () => findResult(user, round), + [round, user], + ); + const maySee = React.useMemo( + () => maySeeResults(authUser, tournament, round), + [authUser, round, tournament], + ); + return
- -
- - {getTime(user, tournament, round, result)} - - {getIcon(result, index)} + +
+ + {maySee && result && result.vod ? + + : null}
+ setShowDialog(false)} + round={round} + show={showDialog} + tournament={tournament} + user={user} + />
; }; Item.propTypes = { - index: PropTypes.number, - participant: PropTypes.shape({ - user: PropTypes.shape({ - }), - }), round: PropTypes.shape({ }), tournament: PropTypes.shape({ @@ -74,4 +113,4 @@ Item.propTypes = { }), }; -export default withTranslation()(withUser(Item)); +export default Item;