import type { LivestreamStore } from "@streamplace/core";
import { useCallback, useMemo, useState } from "react";
import { useTranslation } from "react-i18next";
import { useStore } from "zustand";
import { useShallow } from "zustand/react/shallow";
import { Player } from "../../components/player/player";
import { useFullscreen } from "../../contexts/fullscreen-context";
import type { Liveness } from "../../hooks/use-liveness-state";
import { captureError } from "../../lib/log";
import { useStore as useAppStore } from "../../lib/store";
import { getStreamplaceUrl } from "../../lib/streamplace-url";
import { DanmuOverlay } from "./danmu-overlay";
import { PlayerOffline } from "./player-offline";
import { UserOffline } from "./user-offline";
const DANMU_KEY = "danmu-enabled";
function readDanmuPreference(): boolean {
try {
return localStorage.getItem(DANMU_KEY) === "true";
} catch {
return false;
}
}
function writeDanmuPreference(enabled: boolean) {
try {
localStorage.setItem(DANMU_KEY, String(enabled));
} catch {
// ignore
}
}
type Segment = { width: number; height: number } | null;
type Problem = { code: string; severity: string; message: string };
export function VideoSection({
store,
user,
liveness,
}: {
store: LivestreamStore;
user: string;
liveness: Liveness;
}) {
const [showDanmu, setShowDanmu] = useState(readDanmuPreference);
const handleDanmuChange = useCallback((enabled: boolean) => {
setShowDanmu(enabled);
writeDanmuPreference(enabled);
}, []);
// Danmu tuning preferences from the shared store (settings page).
const danmuOpacity = useAppStore((s) => s.danmuOpacity);
const danmuSpeed = useAppStore((s) => s.danmuSpeed);
const danmuLaneCount = useAppStore((s) => s.danmuLaneCount);
const danmuMaxMessages = useAppStore((s) => s.danmuMaxMessages);
const state = useStore(
store,
useShallow((s) => ({
livestream: s.livestream,
problems: s.problems,
websocketConnected: s.websocketConnected,
segment: s.segment,
})),
);
const { playlistUrl, thumbnailUrl } = useMemo(() => {
const base = getStreamplaceUrl();
return {
playlistUrl: `${base}/xrpc/place.stream.playback.getLivePlaylist?streamer=${encodeURIComponent(user)}`,
thumbnailUrl: `${base}/api/playback/${encodeURIComponent(user)}/stream.jpg`,
};
}, [user]);
return (
{t("reconnecting")}
{t("stream-may-resume")}