From 6047f20dca828d25f51a576c715dba49982f4bdd Mon Sep 17 00:00:00 2001 From: Usman Baig Date: Mon, 19 Jan 2026 13:31:43 +0100 Subject: [PATCH] fix: update rrweb player dimensions and styles for improved appearance --- app/sites/[id]/replays/[replayId]/page.tsx | 126 +++++++++++---------- 1 file changed, 69 insertions(+), 57 deletions(-) diff --git a/app/sites/[id]/replays/[replayId]/page.tsx b/app/sites/[id]/replays/[replayId]/page.tsx index a2b7ad4..67fd026 100644 --- a/app/sites/[id]/replays/[replayId]/page.tsx +++ b/app/sites/[id]/replays/[replayId]/page.tsx @@ -7,6 +7,11 @@ import { getReplay, getReplayData, deleteReplay, formatDuration, type SessionRep import { toast } from 'sonner' import LoadingOverlay from '@/components/LoadingOverlay' import type { eventWithTime } from '@rrweb/types' +import 'rrweb-player/dist/style.css' + +// Fixed player dimensions (16:9 aspect ratio) +const PLAYER_WIDTH = 880 +const PLAYER_HEIGHT = 495 function formatDate(dateString: string) { const date = new Date(dateString) @@ -41,8 +46,6 @@ export default function ReplayViewerPage() { const [loading, setLoading] = useState(true) const [loadingData, setLoadingData] = useState(false) const [playerReady, setPlayerReady] = useState(false) - const [isPlaying, setIsPlaying] = useState(false) - const [speed, setSpeed] = useState(1) const [showDeleteModal, setShowDeleteModal] = useState(false) const playerContainerRef = useRef(null) @@ -52,12 +55,12 @@ export default function ReplayViewerPage() { useEffect(() => { const init = async () => { try { - const [siteData, replayData] = await Promise.all([ + const [siteData, replayInfo] = await Promise.all([ getSite(siteId), getReplay(siteId, replayId) ]) setSite(siteData) - setReplay(replayData) + setReplay(replayInfo) } catch (error: unknown) { toast.error('Failed to load replay') } finally { @@ -98,35 +101,22 @@ export default function ReplayViewerPage() { playerContainerRef.current.innerHTML = '' } - // Calculate dimensions - use container width and maintain aspect ratio - const containerWidth = playerContainerRef.current!.clientWidth - const containerHeight = Math.max(500, Math.min(700, window.innerHeight - 300)) - - // Create player with proper scaling + // Create player with fixed dimensions const player = new rrwebPlayer.default({ target: playerContainerRef.current!, props: { events: replayData, - width: containerWidth, - height: containerHeight, + width: PLAYER_WIDTH, + height: PLAYER_HEIGHT, autoPlay: false, showController: true, - speed: speed, skipInactive: true, showWarning: false, showDebug: false, - // Enable responsive scaling - UNSAFE_replayCanvas: false, }, }) playerRef.current = player - - // Listen for player events - player.addEventListener('pause', () => setIsPlaying(false)) - player.addEventListener('start', () => setIsPlaying(true)) - player.addEventListener('finish', () => setIsPlaying(false)) - setPlayerReady(true) } catch (error) { console.error('Failed to initialize player:', error) @@ -138,19 +128,11 @@ export default function ReplayViewerPage() { return () => { if (playerRef.current) { - // Cleanup player playerRef.current = null } } }, [replayData]) - // Update speed - useEffect(() => { - if (playerRef.current && typeof (playerRef.current as { setSpeed?: (s: number) => void }).setSpeed === 'function') { - (playerRef.current as { setSpeed: (s: number) => void }).setSpeed(speed) - } - }, [speed]) - const handleDelete = async () => { try { await deleteReplay(siteId, replayId) @@ -193,20 +175,21 @@ export default function ReplayViewerPage() {
{/* Player */} -
+
- {/* Player Container */} + {/* Player Container - Fixed size */}
{loadingData ? (
-
- Loading replay data... +
+ Loading replay data...
) : !replayData || replayData.length === 0 ? ( -
+
🎬

No replay data available

This session may not have recorded any events.

@@ -214,39 +197,28 @@ export default function ReplayViewerPage() { ) : null}
- {/* Custom Controls */} + {/* Session info bar */} {playerReady && ( -
-
- Playback Speed: -
- {[0.5, 1, 2, 4].map((s) => ( - - ))} -
-
-
+
+
{replay.events_count} events • {formatDuration(replay.duration_ms)}
+
+ {replay.is_skeleton_mode && ( + + Skeleton Mode + + )} +
)}
{/* Session Info Sidebar */} -
+

Session Details

@@ -254,7 +226,7 @@ export default function ReplayViewerPage() {
Session ID -

{replay.session_id}

+

{replay.session_id}

@@ -354,6 +326,46 @@ export default function ReplayViewerPage() {
)} + + {/* Custom styles for rrweb player */} +
) }