/* eslint-disable @typescript-eslint/no-explicit-any */ import { useState, useEffect } from "react"; import Head from "next/head"; import Image from "next/image"; import PocketBase from "pocketbase"; import { fluxgore, gothampro } from "@/utils/fonts"; const pb = new PocketBase("https://base.mossport.info"); interface FormData { name: string; phone: string; email: string; carBrand: string; carModel: string; description: string; } interface Application { id: string; data: FormData; images: string[]; type: string; status?: string; approved?: boolean; created: string; } function ExhibitionApplicationsPage() { const [pendingApplications, setPendingApplications] = useState( [] ); const [approvedApplications, setApprovedApplications] = useState< Application[] >([]); const [selectedImage, setSelectedImage] = useState(null); const [loading, setLoading] = useState(true); const [processingId, setProcessingId] = useState(null); const [isAuthenticated, setIsAuthenticated] = useState(false); const [credentials, setCredentials] = useState({ email: "", password: "" }); const [authError, setAuthError] = useState(""); const [activeTab, setActiveTab] = useState<"pending" | "approved">("pending"); useEffect(() => { // Проверяем, авторизован ли пользователь if (pb.authStore.isValid) { setIsAuthenticated(true); fetchApplications(); } else { setLoading(false); } }, []); const handleLogin = async (e: React.FormEvent) => { e.preventDefault(); setAuthError(""); try { await pb.admins.authWithPassword(credentials.email, credentials.password); setIsAuthenticated(true); setLoading(true); await fetchApplications(); } catch (error) { console.error("Auth error:", error); setAuthError("Неверный email или пароль"); } }; const handleLogout = () => { pb.authStore.clear(); setIsAuthenticated(false); setPendingApplications([]); setApprovedApplications([]); }; const fetchApplications = async () => { try { // Fetch pending applications - exclude both approved and rejected const pendingRecords = await pb.collection("forms").getFullList({ filter: 'type = "exhibition" && approved != true && status != "rejected"', sort: "-created", }); // Fetch approved applications const approvedRecords = await pb.collection("forms").getFullList({ filter: 'type = "exhibition" && approved = true', sort: "-created", }); const formatApplications = (records: any[]) => records.map((record: any) => ({ id: record.id, data: typeof record.data === "string" ? JSON.parse(record.data) : record.data, images: record.images || [], type: record.type, status: record.status || "pending", approved: record.approved || false, created: record.created, })); setPendingApplications(formatApplications(pendingRecords)); setApprovedApplications(formatApplications(approvedRecords)); } catch (error) { console.error("Error fetching applications:", error); // Detailed error logging if ( typeof error === "object" && error !== null && "response" in error && typeof (error as any).response === "object" ) { console.error("Response status:", (error as any).response.status); console.error("Response data:", (error as any).response.data); } if (typeof error === "object" && error !== null && "data" in error) { console.error("Error data:", (error as any).data); } if (error instanceof Error && error.message.includes("403")) { setAuthError("Недостаточно прав доступа"); handleLogout(); } } finally { setLoading(false); } }; const handleApprove = async (id: string) => { setProcessingId(id); try { await pb.collection("forms").update(id, { status: "approved", approved: true, }); // Move from pending to approved const approvedApp = pendingApplications.find((app) => app.id === id); if (approvedApp) { approvedApp.status = "approved"; approvedApp.approved = true; setApprovedApplications((prev) => [approvedApp, ...prev]); setPendingApplications((prev) => prev.filter((app) => app.id !== id)); } alert("Заявка одобрена!"); } catch (error) { console.error("Error approving application:", error); alert("Ошибка при одобрении заявки"); } finally { setProcessingId(null); } }; const handleReject = async (id: string) => { setProcessingId(id); try { await pb.collection("forms").update(id, { status: "rejected", approved: false, }); setPendingApplications((prev) => prev.filter((app) => app.id !== id)); alert("Заявка отклонена!"); } catch (error) { console.error("Error rejecting application:", error); alert("Ошибка при отклонении заявки"); } finally { setProcessingId(null); } }; const getImageUrl = (record: Application, filename: string) => { const url = `${pb.baseUrl}/api/files/forms/${record.id}/${filename}`; if (pb.authStore.token) { const separator = url.includes("?") ? "&" : "?"; return `${url}${separator}token=${pb.authStore.token}`; } return url; }; const renderApplicationCard = ( application: Application, showActions = true ) => (
{/* Личная информация */}

Информация об участнике

Имя: {application.data.name}
Телефон: {application.data.phone}
Email: {application.data.email}
{/* Информация об автомобиле для выставки */}

Автомобиль для выставки

Марка: {application.data.carBrand}
Модель: {application.data.carModel}
{application.data.description && (
Описание: {application.data.description}
)}
{/* Фотографии */} {application.images.length > 0 && (

Фотографии для выставки ({application.images.length})

{application.images.map((image, index) => { const imageUrl = getImageUrl(application, image); return (
setSelectedImage(imageUrl)} > {`Фото
Увеличить
); })}
)} {/* Дата подачи заявки и статус */}
Заявка подана:{" "} {new Date(application.created).toLocaleString("ru-RU")}
{application.approved && (
Одобрено
)}
{/* Кнопки действий */} {showActions && (
)}
); // Форма авторизации if (!isAuthenticated) { return (

Панель администратора

Войдите для доступа к заявкам на выставку

setCredentials((prev) => ({ ...prev, email: e.target.value, })) } />
setCredentials((prev) => ({ ...prev, password: e.target.value, })) } />
{authError && (
{authError}
)}
); } if (loading) { return (
Загрузка...
); } return (
Заявки на выставку автомобилей - Модерация {/* Header */}

Заявки на выставку автомобилей

{/* Tabs */}
{/* Content */}
{activeTab === "pending" ? ( pendingApplications.length === 0 ? (

Нет ожидающих заявок

Все заявки обработаны

) : (
{pendingApplications.map((application) => renderApplicationCard(application, true) )}
) ) : approvedApplications.length === 0 ? (

Нет одобренных заявок

Пока нет одобренных заявок

) : (
{approvedApplications.map((application) => renderApplicationCard(application, false) )}
)}
{/* Модальное окно для увеличенного изображения */} {selectedImage && (
setSelectedImage(null)} >
e.stopPropagation()} >
Увеличенное фото { console.error("Modal image failed to load:", selectedImage); setSelectedImage(null); }} />

Нажмите вне изображения или на × чтобы закрыть

)}
); } export default ExhibitionApplicationsPage;