Files
timeline-frontend/src/components/Hooks/useFetchImageUrl.ts
2025-12-26 15:12:49 +08:00

55 lines
1.4 KiB
TypeScript

import { useRequest } from '@umijs/max';
import { useEffect, useRef, useState } from 'react';
import {fetchImageLowRes} from "@/services/file/api";
// 简单内存缓存,避免因虚拟滚动重复请求同一张图片
const imageUrlCache = new Map<string, string>();
const useFetchImageUrl = (imageInstanceId: string) => {
const [imageUrl, setImageUrl] = useState("error");
const retryRef = useRef(0);
const { data: response, run, loading } = useRequest(
() => fetchImageLowRes(imageInstanceId),
{
manual: true,
onSuccess: (data) => {
if (data) {
const objectUrl = URL.createObjectURL(data);
imageUrlCache.set(imageInstanceId, objectUrl);
setImageUrl(objectUrl);
} else {
setImageUrl("error");
}
retryRef.current = 0;
},
onError: () => {
if (retryRef.current < 2) {
retryRef.current += 1;
run();
} else {
setImageUrl("error");
imageUrlCache.set(imageInstanceId, "error");
retryRef.current = 0;
}
},
},
);
useEffect(() => {
if (imageInstanceId) {
retryRef.current = 0;
const cached = imageUrlCache.get(imageInstanceId);
if (cached) {
setImageUrl(cached);
} else {
run();
}
} else {
setImageUrl("error");
}
}, [imageInstanceId, run]);
return {imageUrl, loading};
};
export default useFetchImageUrl;