SignalMod / frontend /src /components /SuggestedRail.tsx
Ruperth's picture
feat: localise the Watch flow and stop the player from auto-playing
38ee3c1
Raw
History Blame Contribute Delete
1.52 kB
import { useI18n } from "../i18n/I18nContext";
import type { SuggestedVideo } from "../types/api";
type Props = {
videos: SuggestedVideo[];
activeId: string | null;
loadingId: string | null;
onSelect: (video: SuggestedVideo) => void;
};
export function SuggestedRail({ videos, activeId, loadingId, onSelect }: Props) {
const { t } = useI18n();
return (
<aside className="suggested-rail">
<p className="rail-title">{t.watch.upNext}</p>
{videos.map((v) => (
<button
key={v.id}
type="button"
className={`suggested-card ${activeId === v.id ? "active" : ""}`}
onClick={() => onSelect(v)}
disabled={loadingId === v.id}
>
<img
src={v.thumbnail_url}
alt=""
className="suggested-thumb"
onError={(e) => {
const img = e.currentTarget;
if (!img.dataset.fallback) {
img.dataset.fallback = "1";
img.src = `https://i.ytimg.com/vi/${v.id}/hqdefault.jpg`;
}
}}
/>
<div className="suggested-info">
<p className="suggested-title">{v.title}</p>
<p className="suggested-channel">{v.channel_title}</p>
{!v.embeddable && <span className="embed-badge">{t.watch.externalOnly}</span>}
{loadingId === v.id && <span className="loading-tag">{t.watch.loadingComments}</span>}
</div>
</button>
))}
</aside>
);
}