From 9296262fdd148af53668f92e0107d4ffd9989fbf Mon Sep 17 00:00:00 2001 From: Daniel Karbach Date: Mon, 2 Feb 2026 14:21:57 +0100 Subject: [PATCH] include hth signup links with episode crew --- resources/js/components/episodes/Crew.jsx | 30 +++++++++++++++++++++++ resources/js/components/episodes/Item.jsx | 3 ++- resources/js/helpers/Episode.js | 8 ++++++ resources/js/i18n/de.js | 1 + resources/js/i18n/en.js | 1 + 5 files changed, 42 insertions(+), 1 deletion(-) diff --git a/resources/js/components/episodes/Crew.jsx b/resources/js/components/episodes/Crew.jsx index c20021a..a0164c6 100644 --- a/resources/js/components/episodes/Crew.jsx +++ b/resources/js/components/episodes/Crew.jsx @@ -7,8 +7,10 @@ import CrewList from './CrewList'; import Icon from '../common/Icon'; import { compareCrew } from '../../helpers/Crew'; import { + getHTHSignupLink, getSGLanguages, getSGSignupLink, + hasHTHRestream, hasPassed, hasSGRestream, } from '../../helpers/Episode'; @@ -38,6 +40,7 @@ const Crew = ({ episode }) => { const showCommentators = React.useMemo(() => commentators.length || (!hasPassed(episode) && ( canApplyForEpisode(user, episode, 'commentary') || + hasHTHRestream(episode) || hasSGRestream(episode) )) , [commentators, episode, user]); @@ -45,10 +48,15 @@ const Crew = ({ episode }) => { 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]); @@ -71,6 +79,17 @@ const Crew = ({ episode }) => { : null} + {showHthSignup ? +
+ +
+ : null} {showSgSignup ?
{sgLanguages.map(lang => @@ -104,6 +123,17 @@ const Crew = ({ episode }) => {
: null} + {showHthSignup ? +
+ +
+ : null} {showSgSignup ?
{sgLanguages.map(lang => diff --git a/resources/js/components/episodes/Item.jsx b/resources/js/components/episodes/Item.jsx index 941faf1..465c4c3 100644 --- a/resources/js/components/episodes/Item.jsx +++ b/resources/js/components/episodes/Item.jsx @@ -10,7 +10,7 @@ import Crew from './Crew'; 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, @@ -154,6 +154,7 @@ const Item = ({ episode }) => { : null} {(episode.crew && episode.crew.length) || (!hasPassed(episode) && ( hasSGRestream(episode) + || hasHTHRestream(episode) || canApplyForEpisode(user, episode, 'commentary') || canApplyForEpisode(user, episode, 'tracking') )) ? diff --git a/resources/js/helpers/Episode.js b/resources/js/helpers/Episode.js index 009865c..ef34cea 100644 --- a/resources/js/helpers/Episode.js +++ b/resources/js/helpers/Episode.js @@ -16,6 +16,9 @@ export const acceptsCrew = episode => { 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( @@ -36,6 +39,11 @@ export const getSGLanguages = episode => { 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(); diff --git a/resources/js/i18n/de.js b/resources/js/i18n/de.js index 34f18c3..53f12f4 100644 --- a/resources/js/i18n/de.js +++ b/resources/js/i18n/de.js @@ -251,6 +251,7 @@ export default { 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', diff --git a/resources/js/i18n/en.js b/resources/js/i18n/en.js index a4b681c..0741973 100644 --- a/resources/js/i18n/en.js +++ b/resources/js/i18n/en.js @@ -251,6 +251,7 @@ export default { 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', -- 2.47.3