From b3f496269ca67a4bbfd160219e3c136d17bd75ac Mon Sep 17 00:00:00 2001 From: ZGaetano Date: Tue, 14 Apr 2026 10:04:11 -0400 Subject: [PATCH] feat: wire per-port SCTE35, 8-port grid, multi-destination defaults --- frontend/src/App.tsx | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index aee93aa..55df05f 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -16,7 +16,7 @@ export default function App() { const wsUrl = `ws://${window.location.host}/ws`; const { isConnected, lastMessage } = useWebSocket(wsUrl); - const { startRecording, stopRecording, injectSCTE35 } = useRecorder(); + const { startRecording, stopRecording, injectSCTE35, injectSCTE35ForPort } = useRecorder(); // Clock useEffect(() => { @@ -58,6 +58,15 @@ export default function App() { await injectSCTE35(eventId, durationSeconds); }; + const handleInjectSCTE35ForPort = async ( + portIndex: number, + eventId: number, + durationSeconds: number, + srtDestinationUrl?: string + ) => { + await injectSCTE35ForPort(portIndex, eventId, durationSeconds, srtDestinationUrl); + }; + const handleSelectPort = (portIndex: number) => { setSelectedPort(prev => (prev === portIndex ? null : portIndex)); }; @@ -120,7 +129,7 @@ export default function App() { -
+
{/* ── SECTION LABEL ── */}
@@ -134,13 +143,8 @@ export default function App() {
- {/* ── PORT CARDS ── */} -
+ {/* ── PORT CARDS (8-port grid: 4x2) ── */} +
{ports.length === 0 ? (
)) )} @@ -198,7 +203,7 @@ export default function App() {
- {/* SCTE-35 */} + {/* Global SCTE-35 panel */}
- Ad Break Injection + Ad Break — All Ports SCTE-35 / 104 @@ -236,9 +241,14 @@ export default function App() { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: translateY(0); } } - .ports-grid { grid-template-columns: repeat(4, 1fr); } - @media (max-width: 1100px) { .ports-grid { grid-template-columns: repeat(2, 1fr) !important; } } - @media (max-width: 600px) { .ports-grid { grid-template-columns: 1fr !important; } } + .ports-grid { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 14px; + } + @media (max-width: 1300px) { .ports-grid { grid-template-columns: repeat(4, 1fr); } } + @media (max-width: 900px) { .ports-grid { grid-template-columns: repeat(2, 1fr); } } + @media (max-width: 500px) { .ports-grid { grid-template-columns: 1fr; } } `}
); @@ -253,6 +263,7 @@ function defaultConfig(portIndex: number): RecorderConfig { recording_path: `/recordings/port_${portIndex}_{timestamp}.mxf`, srt_enabled: false, srt_destination: '', + srt_destinations: [], preview_enabled: true, }; }