import React, { useState, useEffect } from 'react'; import { api } from '../../config/api'; interface AdminAuthenticatedImageProps extends React.ImgHTMLAttributes { src: string; fallback?: React.ReactNode; } export const AdminAuthenticatedImage: React.FC = ({ src, fallback, alt, ...props }) => { const [imageSrc, setImageSrc] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(false); useEffect(() => { let cancelled = false; const loadImage = async () => { try { setLoading(true); setError(false); // Make authenticated request to get the image const response = await api.get(src, { responseType: 'blob', }); if (!cancelled) { // Create object URL from blob const imageUrl = URL.createObjectURL(response.data); setImageSrc(imageUrl); setLoading(false); } } catch (err: any) { // Image loading failed - handled by error state if (!cancelled) { setError(true); setLoading(false); } } }; if (src) { loadImage(); } // Cleanup function return () => { cancelled = true; if (imageSrc) { URL.revokeObjectURL(imageSrc); } }; }, [src]); if (loading) { return (
); } if (error) { return fallback ? ( <>{fallback} ) : (
Failed to load
); } return {alt}; };