import { APPWRITE_ALMEIRA_CONFIG } from '@/lib/appwrite'; import { createSessionClient } from '@/lib/appwrite.server'; import { Query } from 'node-appwrite'; import Link from 'next/link'; import { MessageCircle } from 'lucide-react'; import { Settings } from '@/types/settings'; export default async function NewsTicker() { let tickerItems: any[] = []; try { let client: any = await createSessionClient(); if (!client) { const { createAdminClient } = await import('@/lib/appwrite.server'); client = await createAdminClient(); } if (!client) throw new Error("No Appwrite client available"); // 1. Fetch 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 tickerCount = settings.ticker_count || 10; // 2. Fetch News (NOTICIA) const typeRes = await client.databases.listDocuments(APPWRITE_ALMEIRA_CONFIG.databaseId, 'publication_types', [ Query.equal('codigo', 'NOTICIA') ]); if (typeRes.documents.length > 0) { const firstType = typeRes.documents[0]; const typeId = firstType?.$id; if (!typeId) throw new Error("Could not find typeId for NOTICIA"); const postsRes = await client.databases.listDocuments(APPWRITE_ALMEIRA_CONFIG.databaseId, 'posts', [ Query.equal('tipo_publicacion_id', typeId), Query.equal('estado', 'Publicado'), Query.orderDesc('fecha_publicacion'), Query.limit(tickerCount) ]); // Resolve Media const mediaIds = postsRes.documents.map((p: any) => p.imagen_destacada_id).filter((id: any) => id && typeof id === 'string'); const mediaMap = new Map(); if (mediaIds.length > 0) { const mediaRes = await client.databases.listDocuments(APPWRITE_ALMEIRA_CONFIG.databaseId, 'media', [ Query.equal('$id', mediaIds) ]); mediaRes.documents.forEach((m: any) => mediaMap.set(m.$id, m)); } postsRes.documents.forEach((post: any) => { const media = mediaMap.get(post.imagen_destacada_id); let imagenUrl = post.og_image_url || null; if (media) { imagenUrl = `${APPWRITE_ALMEIRA_CONFIG.endpoint}/storage/buckets/${media.bucket_id}/files/${media.file_id}/preview?project=${APPWRITE_ALMEIRA_CONFIG.projectId}`; } tickerItems.push({ type: 'news', id: post.$id, titulo: post.titulo, slug: post.slug || post.$id, imagenUrl }); }); } // 3. Fetch Approved WhatsApp Messages try { const waRes = await client.databases.listDocuments(APPWRITE_ALMEIRA_CONFIG.databaseId, 'whatsapp_messages', [ Query.equal('status', 'approved'), Query.orderDesc('timestamp'), Query.limit(5) ]); waRes.documents.forEach((msg: any) => { tickerItems.push({ type: 'whatsapp', id: msg.$id, titulo: `${msg.sender_name}: ${msg.content}`, slug: null, imagenUrl: msg.avatar || null }); }); } catch (waError) { console.warn("Skipping WhatsApp messages in ticker:", waError); } } catch (e) { console.error("Ticker fetch error", e); } if (tickerItems.length === 0) return null; return (
{/* Doble render para bucle infinito visual */} {[...tickerItems, ...tickerItems].map((item, idx) => { const isWA = item.type === 'whatsapp'; const Content = (
{isWA ? (
) : ( item.imagenUrl && ( // eslint-disable-next-line @next/next/no-img-element {item.titulo} ) )} {isWA && COMUNIDAD} {item.titulo.length > 80 ? item.titulo.substring(0, 80) + '...' : item.titulo}
); if (item.slug) { return {Content}; } return
{Content}
; })}