import { useEffect, useState } from "react" import { createFileRoute } from "@tanstack/react-router" import { getStreamByUsername, type StreamPageData } from "@/lib/stream/db" import { VideoPlayer } from "@/components/VideoPlayer" import { CloudflareStreamPlayer } from "@/components/CloudflareStreamPlayer" import { resolveStreamPlayback } from "@/lib/stream/playback" import { JazzProvider } from "@/lib/jazz/provider" import { ViewerCount } from "@/components/ViewerCount" export const Route = createFileRoute("/$username")({ ssr: false, component: StreamPage, }) // Cloudflare Stream HLS URL const HLS_URL = "https://customer-xctsztqzu046isdc.cloudflarestream.com/bb7858eafc85de6c92963f3817477b5d/manifest/video.m3u8" const NIKIV_PLAYBACK = resolveStreamPlayback({ hlsUrl: HLS_URL }) // Hardcoded user for nikiv const NIKIV_DATA: StreamPageData = { user: { id: "nikiv", name: "Nikita", username: "nikiv", image: null, }, stream: { id: "nikiv-stream", title: "Live Coding", description: "Building in public", is_live: false, // Set to true when actually streaming viewer_count: 0, hls_url: HLS_URL, playback: NIKIV_PLAYBACK, thumbnail_url: null, started_at: null, }, } function StreamPage() { const { username } = Route.useParams() const [data, setData] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [streamReady, setStreamReady] = useState(false) useEffect(() => { let isActive = true const setReadySafe = (ready: boolean) => { if (isActive) { setStreamReady(ready) } } const setDataSafe = (next: StreamPageData | null) => { if (isActive) { setData(next) } } const setLoadingSafe = (next: boolean) => { if (isActive) { setLoading(next) } } const setErrorSafe = (next: string | null) => { if (isActive) { setError(next) } } setReadySafe(false) // Special handling for nikiv - hardcoded stream if (username === "nikiv") { setDataSafe(NIKIV_DATA) setLoadingSafe(false) if (NIKIV_PLAYBACK?.type === "hls") { fetch(NIKIV_PLAYBACK.url) .then((res) => setReadySafe(res.ok)) .catch(() => setReadySafe(false)) } return () => { isActive = false } } const loadData = async () => { setLoadingSafe(true) setErrorSafe(null) try { const result = await getStreamByUsername(username) setDataSafe(result) const playback = result?.stream?.playback if (playback?.type === "hls") { const res = await fetch(playback.url) setReadySafe(res.ok) } else { setReadySafe(false) } } catch (err) { setErrorSafe("Failed to load stream") console.error(err) } finally { setLoadingSafe(false) } } loadData() return () => { isActive = false } }, [username]) if (loading) { return (
Loading...
) } if (error) { return (

Error

{error}

) } if (!data) { return (

User not found

This username doesn't exist or hasn't set up streaming.

) } const { user, stream } = data const playback = stream?.playback const showPlayer = playback?.type === "cloudflare" || (playback?.type === "hls" && streamReady) return (
{/* Viewer count overlay */}
{stream?.is_live && playback && showPlayer ? ( playback.type === "cloudflare" ? (
setStreamReady(true)} /> {!streamReady && (
🔴

Connecting to stream...

)}
) : ( ) ) : stream?.is_live && playback ? (
🔴

Connecting to stream...

) : (
{username === "nikiv" ? ( nikiv.dev ) : (

Not streaming

)}
)}
) }