sendou.ink/app/features/tournament/components/TournamentStream.tsx
Kalle eae3d529e2
Bracket component rewrite (#1653)
* Remove old code

* Add prefetching

* Elim bracket initial

* Hide rounds with only byes

* Round hiding logic

* Align stuff

* Add TODO

* Adjustments

* Deadline

* Compactify button

* Simulations

* Round robin bracket initial

* eventId -> tournamentId

* seedByTeamId removed

* Couple more TODOs

* RR placements table

* Locking matches

* Extract TournamentStream component

* Bracket streams

* Remove extras for tournament-manager, misc

* Fix E2E tests

* Fix SKALOP_SYSTEM_MESSAGE_URL in env.example

* TODOs

* TODO moved to GitHub

* Handle team changing in match cache invalidation

* Fix streamer seeing undo last score button

* Show "Sub" badge on team roster page

* Show who didn't play yet on match teams preview

* Ranked/unranked badge

* Bracket hover show roster

* Add lock/unlock match test

* Fix score reporting
2024-02-11 10:49:12 +02:00

68 lines
2.1 KiB
TypeScript

import type { SerializeFrom } from "@remix-run/node";
import { Avatar } from "~/components/Avatar";
import { UserIcon } from "~/components/icons/User";
import { twitchThumbnailUrlToSrc } from "~/modules/twitch/utils";
import { twitchUrl } from "~/utils/urls";
import type { TournamentStreamsLoader } from "../routes/to.$id.streams";
import { useTournament } from "../routes/to.$id";
export function TournamentStream({
stream,
withThumbnail = true,
}: {
stream: SerializeFrom<TournamentStreamsLoader>["streams"][number];
withThumbnail?: boolean;
}) {
const tournament = useTournament();
const team = tournament.ctx.teams.find((team) =>
team.members.some((m) => m.userId === stream.userId),
);
const user = team?.members.find((m) => m.userId === stream.userId);
return (
<div key={stream.userId} className="stack sm">
{withThumbnail ? (
<a
href={twitchUrl(stream.twitchUserName)}
target="_blank"
rel="noreferrer"
>
<img
alt=""
src={twitchThumbnailUrlToSrc(stream.thumbnailUrl)}
width={320}
height={180}
/>
</a>
) : null}
<div className="stack md horizontal justify-between">
{user && team ? (
<div className="tournament__stream__user-container">
<Avatar size="xxs" user={user} /> {user.discordName}
<span className="text-theme-secondary">{team.name}</span>
</div>
) : (
<div className="tournament__stream__user-container">
<Avatar size="xxs" url={tournament.logoSrc} />
Cast <span className="text-lighter">{stream.twitchUserName}</span>
</div>
)}
<div className="tournament__stream__viewer-count">
<UserIcon />
{stream.viewerCount}
</div>
</div>
{!withThumbnail ? (
<a
href={twitchUrl(stream.twitchUserName)}
target="_blank"
rel="noreferrer"
className="text-xxs text-semi-bold text-center"
>
Watch now
</a>
) : null}
</div>
);
}