import React, { useState, useEffect } from 'react'; import axios from 'axios'; import { Button, Input, Progress, message, Upload, Modal, List, Image as AntImage } from 'antd'; import { UploadOutlined, PictureOutlined } from '@ant-design/icons'; import { useAuth } from '../context/AuthContext'; interface ImageQuota { daily_limit: number; used: number; remaining: number; daily_limit_display: string; used_display: string; remaining_display: string; } interface UploadedImage { id: number; title: string; url: string; uploaded_at: string; file_size_display: string; } interface ImageUploaderProps { onImageSelect: (imageUrl: string) => void; } const ImageUploader: React.FC = ({ onImageSelect }) => { const [isModalVisible, setIsModalVisible] = useState(false); const [images, setImages] = useState([]); const [quota, setQuota] = useState(null); const [uploading, setUploading] = useState(false); const { authToken } = useAuth(); const fetchImages = async () => { try { const response = await axios.get('/api/content/images/', { headers: { Authorization: `Bearer ${authToken}` } }); setImages(response.data); } catch (error) { message.error('Failed to fetch images'); } }; const fetchQuota = async () => { try { const response = await axios.get('/api/content/images/quota/', { headers: { Authorization: `Bearer ${authToken}` } }); setQuota(response.data); } catch (error) { message.error('Failed to fetch quota information'); } }; useEffect(() => { if (isModalVisible) { fetchImages(); fetchQuota(); } }, [isModalVisible]); const handleUpload = async (file: File) => { const formData = new FormData(); formData.append('image', file); formData.append('title', file.name); try { setUploading(true); await axios.post('/api/content/images/', formData, { headers: { 'Content-Type': 'multipart/form-data', Authorization: `Bearer ${authToken}` } }); message.success('Upload successful'); fetchImages(); fetchQuota(); } catch (error: any) { if (error.response?.data?.image) { message.error(error.response.data.image[0]); } else { message.error('Upload failed'); } } finally { setUploading(false); } }; const handleImageSelect = (url: string) => { onImageSelect(url); setIsModalVisible(false); }; return ( <> setIsModalVisible(false)} footer={null} width={800} >
{ handleUpload(file); return false; }} showUploadList={false} >
{quota && (

Daily Upload Quota

`${quota.used_display} / ${quota.daily_limit_display}`} />
)} (
{item.file_size_display}
)} />
); }; export default ImageUploader;