"use client"; import { useSession, signOut } from "next-auth/react"; import { useRouter } from "next/navigation"; import { useState, useEffect, FormEvent, ChangeEvent } from "react"; import { Images } from "@/Type/images"; import PreloaderAndSearch from "@/components/PreloaderAndSearch"; import Header from "@/components/Header"; import CookieAlert from "@/components/CookieAlert"; import Link from "next/link"; const API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL || "http://localhost:8000/api/v1"; const MEDIA_BASE_URL = process.env.NEXT_PUBLIC_MEDIA_BASE_URL || "http://localhost:8000/media"; export default function ImageUploadPage() { const { data: session, status } = useSession(); const router = useRouter(); const [selectedFile, setSelectedFile] = useState(null); const [formData, setFormData] = useState({ title: "", format: "avif", width: "", height: "", quality: "", }); const [preview, setPreview] = useState(null); const [uploading, setUploading] = useState(false); const [error, setError] = useState(""); const [success, setSuccess] = useState(false); const [uploadedImage, setUploadedImage] = useState(null); const [imagesList, setImagesList] = useState([]); const [loadingImages, setLoadingImages] = useState(false); const [loading, setLoading] = useState(true); const [copiedUrl, setCopiedUrl] = useState(null); useEffect(() => { if (status === "unauthenticated") { router.push("/auth/login"); } else if (status === "authenticated") { setLoading(false); } }, [status, router]); useEffect(() => { if (status === "authenticated" && session?.accessToken) { fetchImages(); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [status]); const fetchImages = async () => { if (!session?.accessToken) { console.log("No access token available"); return; } setLoadingImages(true); try { console.log("Fetching images from:", `${API_BASE_URL}/images/list/`); const response = await fetch(`${API_BASE_URL}/images/list/`, { method: "GET", headers: { "Content-Type": "application/json", Authorization: `Bearer ${session.accessToken}`, }, }); console.log("Response status:", response.status); if (response.ok) { const data = await response.json(); console.log("Fetched images data:", data); // Eğer paginated response ise results'ı al, değilse direkt array const images = Array.isArray(data) ? data : (data.results || []); console.log("Processed images list:", images); setImagesList(images); } else if (response.status === 401) { console.error("Unauthorized - signing out"); signOut({ callbackUrl: "/auth/login" }); } else { const errorText = await response.text(); console.error("Failed to fetch images:", response.status, errorText); } } catch (err) { console.error("Error fetching images:", err); } finally { setLoadingImages(false); } }; const handleFileChange = (e: ChangeEvent) => { const file = e.target.files?.[0]; if (file) { setSelectedFile(file); setError(""); // Preview oluştur const reader = new FileReader(); reader.onloadend = () => { setPreview(reader.result as string); }; reader.readAsDataURL(file); // Format seçimi kullanıcı tarafından yapılacak, varsayılan avif // Dosya formatını sadece bilgi amaçlı tutuyoruz // Resim boyutlarını al const img = new Image(); img.onload = () => { setFormData(prev => ({ ...prev, width: img.width.toString(), height: img.height.toString(), })); }; img.src = URL.createObjectURL(file); } }; const handleInputChange = (e: ChangeEvent) => { const { name, value } = e.target; setFormData(prev => ({ ...prev, [name]: value, })); }; const handleSubmit = async (e: FormEvent) => { e.preventDefault(); setError(""); setSuccess(false); setUploadedImage(null); if (!selectedFile) { setError("Lütfen bir resim dosyası seçin."); return; } if (!formData.title || formData.title.trim() === "") { setError("Başlık alanı zorunludur."); return; } if (!session?.accessToken) { setError("Oturum açmanız gerekiyor."); return; } setUploading(true); try { const uploadFormData = new FormData(); uploadFormData.append("image", selectedFile); uploadFormData.append("title", formData.title.trim()); uploadFormData.append("format", formData.format); if (formData.width) { uploadFormData.append("width", formData.width); } if (formData.height) { uploadFormData.append("height", formData.height); } if (formData.quality) { uploadFormData.append("quality", formData.quality); } const response = await fetch(`${API_BASE_URL}/images/upload/`, { method: "POST", headers: { Authorization: `Bearer ${session.accessToken}`, }, body: uploadFormData, }); if (response.ok) { const data = await response.json(); setUploadedImage(data); setSuccess(true); setSelectedFile(null); setPreview(null); setFormData({ title: "", format: "avif", width: "", height: "", quality: "", }); // Yeni yüklenen resmi listeye ekle fetchImages(); setTimeout(() => setSuccess(false), 5000); } else if (response.status === 401) { signOut({ callbackUrl: "/auth/login" }); } else { let errorMessage = "Resim yüklenirken bir hata oluştu."; try { const contentType = response.headers.get("content-type"); let errorData: any = {}; if (contentType && contentType.includes("application/json")) { errorData = await response.json(); console.error("API Error Response:", errorData); } else { const text = await response.text(); console.error("API Error Response (text):", text); try { errorData = JSON.parse(text); } catch { errorMessage = text || `Sunucu hatası (${response.status})`; } } // Farklı hata formatlarını kontrol et if (errorData.detail) { errorMessage = Array.isArray(errorData.detail) ? errorData.detail.join(', ') : errorData.detail; } else if (errorData.message) { errorMessage = Array.isArray(errorData.message) ? errorData.message.join(', ') : errorData.message; } else if (errorData.error) { errorMessage = Array.isArray(errorData.error) ? errorData.error.join(', ') : errorData.error; } else if (typeof errorData === 'string') { errorMessage = errorData; } else { // Field-specific errors - Django REST Framework formatı const errorMessages: string[] = []; Object.keys(errorData).forEach(key => { const value = errorData[key]; if (Array.isArray(value)) { errorMessages.push(`${key}: ${value.join(', ')}`); } else if (typeof value === 'string') { errorMessages.push(`${key}: ${value}`); } else if (typeof value === 'object') { errorMessages.push(`${key}: ${JSON.stringify(value)}`); } }); if (errorMessages.length > 0) { errorMessage = errorMessages.join(' | '); } } } catch (parseError) { console.error("Error parsing response:", parseError); errorMessage = `Sunucu hatası (${response.status}): ${response.statusText}`; } setError(errorMessage); } } catch (err) { console.error("Upload error:", err); const errorMessage = err instanceof Error ? err.message : "Bir hata oluştu. Lütfen tekrar deneyin."; setError(errorMessage); } finally { setUploading(false); } }; if (status === "loading" || loading) { return ( <>
Yükleniyor...

Yükleniyor...

); } if (!session) { return null; } return ( <>
{/* Image Upload Section */}

Resim Yükle

Resim dosyanızı yükleyin ve işleyin

{error && (
{error}
)} {success && (
Resim başarıyla yüklendi!
)}
{/* File Input */}
{preview ? (
Preview

{selectedFile?.name}

) : (

PNG, JPG, GIF, WEBP (MAX. 10MB)

)}
{/* Title */}
{/* Format, Width, Height */}
{/* Quality */}
{/* Submit Buttons */}
{/* Uploaded Image Info */} {uploadedImage && (

Yüklenen Resim Bilgileri

ID: {uploadedImage.id}

Başlık: {uploadedImage.title || "N/A"}

Format: {uploadedImage.format}

Boyut: {uploadedImage.width} x {uploadedImage.height} px

Kalite: {uploadedImage.quality}

Dosya Boyutu: {(uploadedImage.size / 1024).toFixed(2)} KB

{uploadedImage.path && ( )} {uploadedImage.processed_path && ( )}
)} {/* Images List */}

Yüklenen Resimler

{loadingImages ? (
Yükleniyor...

Resimler yükleniyor...

) : imagesList.length === 0 ? (

Henüz resim yüklenmemiş.

) : (
{imagesList.map((image) => { // Path'leri tam URL'ye çevir const getImageUrl = (path: string | null | undefined) => { if (!path) return null; // Eğer zaten tam URL ise (http ile başlıyorsa) direkt dön if (path.startsWith('http://') || path.startsWith('https://')) { return path; } // Eğer path sadece dosya adı ise (slash içermiyorsa), processed klasörü altında olabilir if (!path.includes('/')) { return `${MEDIA_BASE_URL}/processed/${path}`; } // Relative path ise media base URL ile birleştir // Path zaten processed/ ile başlıyorsa direkt birleştir return `${MEDIA_BASE_URL}/${path}`; }; // path değeri genellikle processed/ ile başlar ve daha güvenilirdir // processed_path ise bazen sadece dosya adı olabilir const originalUrl = getImageUrl(image.path); const processedUrl = getImageUrl(image.processed_path); // Önce path'i kullan, yoksa processed_path'i dene const imageUrl = originalUrl || processedUrl; console.log("Rendering image:", image.id, "path:", image.path, "processed_path:", image.processed_path, "Final URL:", imageUrl); return (
{imageUrl ? ( {image.title window.open(imageUrl, '_blank')} onError={(e) => { console.error("Image load error for:", imageUrl, "Trying fallback..."); // Eğer ilk URL çalışmazsa, diğer path'i dene const fallbackUrl = originalUrl ? processedUrl : originalUrl; if (fallbackUrl && fallbackUrl !== imageUrl) { e.currentTarget.src = fallbackUrl; } else { e.currentTarget.style.display = 'none'; } }} /> ) : (
)}
{image.title || 'Başlıksız'}
{image.width && image.height ? `${image.width} x ${image.height} px` : 'N/A'}
{image.format ? image.format.toUpperCase() : 'N/A'}
{image.size ? `${(image.size / 1024).toFixed(2)} KB` : 'N/A'}
{originalUrl && ( )} {processedUrl && ( )} {imageUrl && ( )}
{image.created_at ? new Date(image.created_at).toLocaleDateString('tr-TR') : 'N/A'}
); })}
)}
{/* Footer */} {/* Cookie Alert */} {/* Scroll To Top */} ); }