import { APPWRITE_ALMEIRA_CONFIG } from '@/lib/appwrite'; import { createAdminClient, getLoggedInUser } from '@/lib/appwrite.server'; import { Query } from 'node-appwrite'; import { NewsCard } from '@/components/NewsCard'; import { GlobalSidebar, hasSidebarContent } from '@/components/AdWrappers'; import { Sparkles } from 'lucide-react'; import { Settings } from '@/types/settings'; import { Post, MediaItem } from '@/types/publications'; async function fetchClasificadosData() { try { const client = await createAdminClient(); // 1. Settings const settingsRes = await client.databases.listDocuments(APPWRITE_ALMEIRA_CONFIG.databaseId, 'settings', []); const settings = (settingsRes.documents.length > 0 ? settingsRes.documents[0] : { ticker_count: 10, rotation_seconds: 5, feed_news_count: 12, show_news_date: true }) as Settings; const postsCount = settings.feed_news_count || 12; const cardSettings = { showCategory: settings.news_card_show_category ?? false, showFooterDate: settings.show_news_date !== false, showFooterButton: settings.news_card_show_footer_button ?? true, footerText: settings.news_card_footer_text || "" }; // 2. Get CLASIFICADO type ID const typeRes = await client.databases.listDocuments(APPWRITE_ALMEIRA_CONFIG.databaseId, 'publication_types', [ Query.equal('codigo', 'CLASIFICADO') ]); let posts: Post[] = []; if (typeRes.documents.length > 0) { const firstType = typeRes.documents[0]; const typeId = firstType?.$id; if (!typeId) return { posts: [], cardSettings }; const postsRes = await client.databases.listDocuments(APPWRITE_ALMEIRA_CONFIG.databaseId, 'posts', [ Query.equal('tipo_publicacion_id', typeId), Query.equal('estado', ['Publicado', 'publicado']), Query.orderDesc('fecha_publicacion'), Query.limit(postsCount * 2) ]); const now = new Date(); posts = postsRes.documents.filter((post: any) => { if (!post.fecha_finalizacion) return true; return new Date(post.fecha_finalizacion) >= now; }).slice(0, postsCount) as unknown as Post[]; // 3. Resolve Media const mediaIds = posts.map(p => p.imagen_destacada_id).filter(id => id && typeof id === 'string') as string[]; if (mediaIds.length > 0) { const mediaRes = await client.databases.listDocuments(APPWRITE_ALMEIRA_CONFIG.databaseId, 'media', [ Query.equal('$id', mediaIds) ]); const mediaMap = new Map(mediaRes.documents.map(m => [m.$id, m as unknown as MediaItem])); posts = posts.map(p => JSON.parse(JSON.stringify({ ...p, resolved_media: mediaMap.get(p.imagen_destacada_id as string) }))); } else { posts = JSON.parse(JSON.stringify(posts)); } } return { posts, cardSettings }; } catch (e) { console.error("Clasificados fetch error", e); return { posts: [], cardSettings: { showCategory: false, showFooterDate: true, showFooterButton: true, footerText: "" } }; } } export default async function ClasificadosPage() { const { posts, cardSettings } = await fetchClasificadosData(); const hasSidebar = await hasSidebarContent(); const rawUser = await getLoggedInUser(); const user = rawUser ? JSON.parse(JSON.stringify(rawUser)) : null; const isAdmin = (user as any)?.labels?.includes('admin') || (user as any)?.labels?.includes('editor') || user?.$id === 'admin-emergency'; return (
{/* Sci-Fi Hero Section */}

MERCADO DE
CLASIFICADOS

El primer portal transaccional de medios impulsado por inteligencia artificial. Compra, venta y servicios en tu comunidad al instante con total seguridad.

Explorar Mercado
Avisos

Anuncios Recientes

{posts.length === 0 ? (

Sin Anuncios Recientes

El mercado se encuentra a la espera de nuevas ofertas globales.

) : (
{posts.map((post) => { const PROJECT_ID = process.env.NEXT_PUBLIC_APPWRITE_PROJECT_ID || '69b84df5003bd8957c5c'; const ENDPOINT = process.env.NEXT_PUBLIC_APPWRITE_ENDPOINT || 'https://appwrite.almeira.com.co/v1'; let imagenUrl = post.og_image_url || null; const mediaObj = post.resolved_media || (typeof post.imagen_destacada_id === 'object' ? post.imagen_destacada_id : null) as MediaItem | null; if (mediaObj) { imagenUrl = `${ENDPOINT}/storage/buckets/${mediaObj.bucket_id}/files/${mediaObj.file_id}/view?project=${PROJECT_ID}&width=800&height=800&quality=85`; } return ( ]*>?/gm, '').substring(0, 150) + '...'} tipo="Aviso" fecha={post.fecha_publicacion || post.$createdAt} imagenUrl={imagenUrl} showCategory={cardSettings.showCategory} showFooterDate={cardSettings.showFooterDate} showFooterButton={cardSettings.showFooterButton} footerText={cardSettings.footerText} imageAspect="aspect-square" isAdmin={isAdmin} /> ) })}
)}
{hasSidebar && ( )}
); }