1- import React from "react" ;
1+ import React , { useCallback } from "react" ;
22
33import { useCookies } from 'react-cookie' ;
44import io from "socket.io-client" ;
55
66import "./ImageViewer.css" ;
7+ import { base64ToBlob } from "../utils/base64ToBlob" ;
78
89const SERVER_URL = "https://localhost:8443"
910let socket = io ( SERVER_URL )
1011
1112export default function ImageViewer ( { room, isPreview } ) {
12- const [ srcBlob , setSrcBlob ] = React . useState ( null ) ;
13- const [ cookies , setCookie ] = useCookies ( [ "token" ] ) ;
13+ const [ srcUrl , setSrcUrl ] = React . useState ( null ) ;
14+ const [ cookies ] = useCookies ( [ "token" ] ) ;
1415
15- React . useEffect ( ( ) => {
16- socket . on ( 'image' , ( payload ) => {
17- if ( payload . room === room ) {
18- setSrcBlob ( payload . data ) ;
16+ // Stable handler so we can deregister it reliably
17+ const imageHandler = useCallback ( ( payload ) => {
18+ if ( payload . room !== room ) return ;
19+ if ( ! payload . data ) return ;
20+ try {
21+ const blob = base64ToBlob ( payload . data ) ;
22+ const newUrl = URL . createObjectURL ( blob ) ;
23+ // Revoke the previous URL to free memory
24+ if ( srcUrl ) {
25+ URL . revokeObjectURL ( srcUrl ) ;
1926 }
20- } ) ;
27+ setSrcUrl ( newUrl ) ;
28+ } catch ( e ) {
29+ // Silently ignore malformed data
30+ }
31+ } , [ room , srcUrl ] ) ;
32+
33+ React . useEffect ( ( ) => {
34+ // Register listener and join the room
35+ socket . on ( 'image' , imageHandler ) ;
2136 socket . emit ( 'join' , { room, token : cookies . token } ) ;
22- } , [ room ] ) ;
37+
38+ // Cleanup on unmount or when room changes
39+ return ( ) => {
40+ if ( srcUrl ) {
41+ URL . revokeObjectURL ( srcUrl ) ;
42+ }
43+ socket . off ( 'image' , imageHandler ) ;
44+ } ;
45+ } , [ room , cookies . token , imageHandler ] ) ;
2346
2447 return (
2548 < div className = { `imageviewer ${ isPreview ? 'preview' : 'main' } ` } >
26- { srcBlob && < img src = { `data:image/jpeg;base64, ${ srcBlob } ` } alt = { room } /> }
49+ { srcUrl && < img src = { srcUrl } alt = { room } /> }
2750 </ div >
2851 ) ;
2952}
0 commit comments