Spaces:
Sleeping
Sleeping
File size: 1,172 Bytes
832b480 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
import { useEffect, useMemo, useRef } from "react";
function fingerprint(f: File) {
return `${f.name}::${f.size}::${f.lastModified}`;
}
export function useObjectUrlCache(files: File[]) {
const cacheRef = useRef<Map<string, string>>(new Map());
const keys = useMemo(() => {
return files.map((f) => fingerprint(f));
}, [files]);
// revoke removed keys
useEffect(() => {
const need = new Set(keys);
for (const [key, url] of cacheRef.current.entries()) {
if (!need.has(key)) {
try {
URL.revokeObjectURL(url);
} catch {}
cacheRef.current.delete(key);
}
}
}, [keys]);
// unmount: revoke all
useEffect(() => {
return () => {
for (const url of cacheRef.current.values()) {
try {
URL.revokeObjectURL(url);
} catch {}
}
cacheRef.current.clear();
};
}, []);
const getOrCreate = (file: File) => {
const key = fingerprint(file);
const existed = cacheRef.current.get(key);
if (existed) return existed;
const url = URL.createObjectURL(file);
cacheRef.current.set(key, url);
return url;
};
return { getOrCreate };
}
|