"use client"; import { useEffect, useRef } from "react"; import type { SubtitleTrack } from "@/app/(main)/tv/components/video-player"; interface UseTvKeyboardOptions { nextChannel: () => void; prevChannel: () => void; toggleSchedule: () => void; toggleFullscreen: () => void; toggleMute: () => void; setShowStats: React.Dispatch>; subtitleTracks: SubtitleTrack[]; setActiveSubtitleTrack: React.Dispatch>; handleDigit: (digit: string) => void; } export function useTvKeyboard(opts: UseTvKeyboardOptions) { const optsRef = useRef(opts); useEffect(() => { optsRef.current = opts; }); useEffect(() => { const handleKey = (e: KeyboardEvent) => { if ( e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement ) return; const o = optsRef.current; switch (e.key) { case "ArrowUp": case "PageUp": e.preventDefault(); o.nextChannel(); break; case "ArrowDown": case "PageDown": e.preventDefault(); o.prevChannel(); break; case "s": case "S": o.setShowStats((v) => !v); break; case "g": case "G": o.toggleSchedule(); break; case "f": case "F": o.toggleFullscreen(); break; case "m": case "M": o.toggleMute(); break; case "c": case "C": if (o.subtitleTracks.length > 0) { o.setActiveSubtitleTrack((prev) => prev === -1 ? o.subtitleTracks[0].id : -1, ); } break; default: if (e.key >= "0" && e.key <= "9") { o.handleDigit(e.key); } } }; window.addEventListener("keydown", handleKey); return () => window.removeEventListener("keydown", handleKey); }, []); }