@@ -144,73 +144,76 @@ const ScreenReaderOnly = styled.span`
144144 overflow: hidden;
145145` ;
146146
147- // ============================================================================
148- // UTILITY HOOKS
149- // ============================================================================
150-
151-
152- const useFileSrc = ( file : File | undefined ) => {
153- const [ src , setSrc ] = useState < string | undefined > ( ) ;
154- const lastFileRef = useRef < File > ( ) ;
155-
156- useEffect ( ( ) => {
157- if ( ! file || file === lastFileRef . current ) return ;
158-
159- const objectUrl = URL . createObjectURL ( file ) ;
160- setSrc ( objectUrl ) ;
161- lastFileRef . current = file ;
162-
163- return ( ) => {
164- URL . revokeObjectURL ( objectUrl ) ;
165- } ;
166- } , [ file ] ) ;
167-
168- return src ;
169- } ;
170-
171-
172147
173148const useAttachmentSrc = ( ) => {
149+ // Listen only to image-type attachments
174150 const attachment = useAttachment (
175- useCallback ( ( a : any ) => {
176- if ( a . type !== "image" ) return undefined ;
177- return a ;
178- } , [ ] )
151+ useCallback ( ( a : any ) => ( a . type === "image" ? a : undefined ) , [ ] )
179152 ) ;
180153
181154 const [ src , setSrc ] = useState < string | undefined > ( ) ;
182- const lastAttachmentRef = useRef < any > ( ) ;
183155
184- useEffect ( ( ) => {
185- if ( ! attachment || attachment === lastAttachmentRef . current ) return ;
156+ // Keep track of the last generated object URL so that we can revoke it
157+ const objectUrlRef = useRef < string | undefined > ( ) ;
158+ const lastAttachmentIdRef = useRef < string | undefined > ( ) ;
186159
187- // Handle new/pending attachments with File objects
188- if ( attachment . file && attachment . file instanceof File ) {
189- const objectUrl = URL . createObjectURL ( attachment . file ) ;
190- setSrc ( objectUrl ) ;
191- lastAttachmentRef . current = attachment ;
160+ useEffect ( ( ) => {
161+ // If the same attachment is rendered again, do nothing
162+ if ( ! attachment || attachment . id === lastAttachmentIdRef . current ) return ;
163+
164+ // Clean up any previous object URL
165+ if ( objectUrlRef . current ) {
166+ try {
167+ URL . revokeObjectURL ( objectUrlRef . current ) ;
168+ } catch {
169+ /* ignore */
170+ }
171+ objectUrlRef . current = undefined ;
172+ }
192173
193- return ( ) => {
194- URL . revokeObjectURL ( objectUrl ) ;
195- } ;
174+ // ------------------------------------------------------------------
175+ // 1. New (local) File object – generate a temporary ObjectURL
176+ // ------------------------------------------------------------------
177+ if ( attachment . file instanceof File ) {
178+ const url = URL . createObjectURL ( attachment . file ) ;
179+ objectUrlRef . current = url ;
180+ setSrc ( url ) ;
181+ lastAttachmentIdRef . current = attachment . id ;
182+ return ;
196183 }
197184
198- // Handle saved attachments with base64 data
199- const imageContent = attachment . content ?. find ( ( c : any ) => c . type === "image" ) ;
200- if ( imageContent ?. image ) {
201- setSrc ( imageContent . image ) ;
202- lastAttachmentRef . current = attachment ;
185+ // ------------------------------------------------------------------
186+ // 2. Restored attachment coming from storage – use stored base64 image
187+ // ------------------------------------------------------------------
188+ const imgPart = attachment . content ?. find ( ( p : any ) => p . type === "image" ) ;
189+ if ( imgPart ?. image ) {
190+ setSrc ( imgPart . image as string ) ;
191+ lastAttachmentIdRef . current = attachment . id ;
203192 return ;
204193 }
205194
206- // If no valid source found, clear the src
195+ // ------------------------------------------------------------------
196+ // 3. No usable preview – clear src
197+ // ------------------------------------------------------------------
207198 setSrc ( undefined ) ;
208- lastAttachmentRef . current = attachment ;
199+ lastAttachmentIdRef . current = attachment . id ;
209200 } , [ attachment ] ) ;
210201
202+ /* Cleanup when the component using this hook unmounts */
203+ useEffect ( ( ) => {
204+ return ( ) => {
205+ if ( objectUrlRef . current ) {
206+ try {
207+ URL . revokeObjectURL ( objectUrlRef . current ) ;
208+ } catch {
209+ /* ignore */
210+ }
211+ }
212+ } ;
213+ } , [ ] ) ;
214+
211215 return src ;
212216} ;
213-
214217// ============================================================================
215218// ATTACHMENT COMPONENTS
216219// ============================================================================
0 commit comments