import { useEffect, useState } from 'react'; /** * Creates an object URL for a Blob/File and revokes it when the source changes * or the component unmounts. Returns null when given null. */ export function useObjectUrl(source: Blob | null): string | null { const [url, setUrl] = useState(null); useEffect(() => { if (!source) return; const objectUrl = URL.createObjectURL(source); // Intended external-resource publish to sync, not a render cascade. // eslint-disable-next-line react-hooks/set-state-in-effect setUrl(objectUrl); return () => { URL.revokeObjectURL(objectUrl); setUrl(null); // in cleanup, not the effect body — so no suppression needed }; }, [source]); return source ? url : null; }