import Icon from '../common/Icon';
import { compareCrew } from '../../helpers/Crew';
import {
+ getHTHSignupLink,
getSGLanguages,
getSGSignupLink,
+ hasHTHRestream,
hasPassed,
hasSGRestream,
} from '../../helpers/Episode';
const showCommentators = React.useMemo(() =>
commentators.length || (!hasPassed(episode) && (
canApplyForEpisode(user, episode, 'commentary') ||
+ hasHTHRestream(episode) ||
hasSGRestream(episode)
))
, [commentators, episode, user]);
const showTracker = React.useMemo(() =>
trackers.length || (!hasPassed(episode) && (
canApplyForEpisode(user, episode, 'tracking') ||
+ hasHTHRestream(episode) ||
hasSGRestream(episode)
))
, [episode, trackers, user]);
+ const showHthSignup = React.useMemo(() =>
+ !hasPassed(episode) && hasHTHRestream(episode)
+ , [episode]);
+
const showSgSignup = React.useMemo(() =>
!hasPassed(episode) && hasSGRestream(episode)
, [episode]);
</Button>
</div>
: null}
+ {showHthSignup ?
+ <div className="button-bar m-2">
+ <Button
+ href={getHTHSignupLink(episode, 'de', 'commentator')}
+ target="_blank"
+ variant="outline-secondary"
+ >
+ {t('episodes.hthSignUp')}
+ </Button>
+ </div>
+ : null}
{showSgSignup ?
<div className="button-bar m-2">
{sgLanguages.map(lang =>
</Button>
</div>
: null}
+ {showHthSignup ?
+ <div className="button-bar m-2">
+ <Button
+ href={getHTHSignupLink(episode, 'de', 'tracker')}
+ target="_blank"
+ variant="outline-secondary"
+ >
+ {t('episodes.hthSignUp')}
+ </Button>
+ </div>
+ : null}
{showSgSignup ?
<div className="button-bar m-2">
{sgLanguages.map(lang =>
import MultiLink from './MultiLink';
import Players from './Players';
import Icon from '../common/Icon';
-import { hasPassed, hasSGRestream, isActive } from '../../helpers/Episode';
+import { hasHTHRestream, hasPassed, hasSGRestream, isActive } from '../../helpers/Episode';
import { getLink } from '../../helpers/Event';
import {
canApplyForEpisode,
: null}
{(episode.crew && episode.crew.length) || (!hasPassed(episode) && (
hasSGRestream(episode)
+ || hasHTHRestream(episode)
|| canApplyForEpisode(user, episode, 'commentary')
|| canApplyForEpisode(user, episode, 'tracking')
)) ?
c.pivot && (c.pivot.accept_comms || c.pivot.accept_tracker));
};
+export const getHTHSignupLink = episode =>
+ `https://hth.zeldaspeedruns.com/event/${episode.ext_info.handle}/races/${episode.ext_id.substr(4)}/signups`;
+
export const getSGLanguages = episode => {
if (!episode || !episode.channels) return [];
const sgChannels = episode.channels.filter(
export const getSGSignupLink = (episode, lang, role) =>
`https://speedgaming.org/${lang}/${role}/signup/${episode.ext_id.substr(3)}/`;
+export const hasHTHRestream = episode => {
+ if (!episode?.ext_id || !episode.ext_id.startsWith('hth:') || !episode.ext_info?.handle || episode.do_not_restream) return false;
+ return true;
+};
+
export const hasPassed = episode => {
if (!episode || !episode.start) return false;
const now = moment();
estimatePreview: '{{ estimate }} Std.',
estimatePreviewWithEnd: '{{ estimate }} Std. (endet {{ end, LL LT }} Uhr)',
extSyncWarning: 'Achtung: Diese Episopde wird mit einer externen Datenquelle synchronisiert und Änderungen können überschrieben werden!',
+ hthSignUp: 'HTH Anmeldung',
missingStreams: 'Fehlende Runner-Streams',
players: {
name_override: 'Abweichender Name',
estimatePreview: '{{ estimate }}h',
estimatePreviewWithEnd: '{{ estimate }}h (ends {{ end, LL LT }})',
extSyncWarning: 'Warning: This episode is synchronized to an external data source. Changes may be overwritten!',
+ hthSignUp: 'HTH Signup',
missingStreams: 'Missing runner streams',
players: {
name_override: 'Name override',