'use client' import React, { useState, useEffect } from 'react' import ObjectGallery from '../../../components/objects/ObjectGallery' import { ObjectData } from '../../../components/objects/ObjectCard' import AnimatedBackground from '../../../components/ui/AnimatedBackground' import { useRouter } from 'next/navigation' import Image from 'next/image' // Универсальная функция для преобразования объекта из бэкенда в ObjectData const transformRawToObjectData = (raw: any): ObjectData => { const rawId = raw?.id ?? raw?.object_id ?? raw?.uuid ?? raw?.name const object_id = typeof rawId === 'number' ? `object_${rawId}` : String(rawId ?? '') const deriveTitle = (): string => { const t = (raw?.title || '').toString().trim() if (t) return t const idStr = String(rawId ?? '').toString() const numMatch = typeof rawId === 'number' ? rawId : (() => { const m = idStr.match(/\d+/); return m ? Number(m[0]) : undefined })() if (typeof numMatch === 'number' && !Number.isNaN(numMatch)) { return `Объект ${numMatch}` } return idStr ? `Объект ${idStr}` : `Объект ${object_id}` } return { object_id, title: deriveTitle(), description: raw?.description ?? `Описание объекта ${raw?.title ?? object_id}`, image: raw?.image ?? null, location: raw?.location ?? raw?.address ?? 'Не указано', floors: Number(raw?.floors ?? 0), area: String(raw?.area ?? ''), type: raw?.type ?? 'object', status: raw?.status ?? 'active', } } const ObjectsPage: React.FC = () => { const [objects, setObjects] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [selectedObjectId, setSelectedObjectId] = useState(null) const router = useRouter() useEffect(() => { const loadData = async () => { setLoading(true) setError(null) try { const url = '/api/get-objects' const res = await fetch(url, { cache: 'no-store' }) const payloadText = await res.text() let payload: any try { payload = JSON.parse(payloadText) } catch { payload = payloadText } console.log('[ObjectsPage] GET /api/get-objects', { status: res.status, payload }) if (!res.ok) { const errorMessage = typeof payload === 'string' ? payload : (payload?.error || 'Не удалось получить данные объектов') if (errorMessage.includes('Authentication required') || res.status === 401) { console.log('[ObjectsPage] Authentication required, redirecting to login') router.push('/login') return } throw new Error(errorMessage) } const data = (payload?.data ?? payload) as any let rawObjectsArray: any[] = [] if (Array.isArray(data)) { rawObjectsArray = data } else if (Array.isArray(data?.objects)) { rawObjectsArray = data.objects } else if (data && typeof data === 'object') { rawObjectsArray = Object.values(data) } const transformedObjects = rawObjectsArray.map(transformRawToObjectData) setObjects(transformedObjects) } catch (err: any) { console.error('Ошибка при загрузке данных объектов:', err) setError(err?.message || 'Произошла неизвестная ошибка') } finally { setLoading(false) } } loadData() }, [router]) const handleObjectSelect = (objectId: string) => { console.log('Object selected:', objectId) setSelectedObjectId(objectId) } if (loading) { return (

Загрузка объектов...

) } if (error) { return (

Ошибка загрузки данных

{error}

Если проблема повторяется, обратитесь к администратору

) } return (
{/* Header */}
AerBIM Logo
Версия: 3.0.0
{/* Main Content */}
{/* Заголовок */}

Выберите объект для работы

{/* Галерея объектов */}
) } export default ObjectsPage