import { APPWRITE_ALMEIRA_CONFIG } from '@/lib/appwrite'; import { createAdminClient, getLoggedInUser } from '@/lib/appwrite.server'; import { Query } from 'node-appwrite'; import { cookies } from 'next/headers'; import { NewsCard } from '@/components/NewsCard'; import { GlobalSidebar, hasSidebarContent } from '@/components/AdWrappers'; import { RadioTower, Sparkles, ChevronDown } from 'lucide-react'; import { decodeHtmlEntities } from '@/lib/utils'; import { Settings } from '@/types/settings'; import { Post, MediaItem } from '@/types/publications'; async function fetchHomeData(page: number = 1, isAdmin: boolean = false, adminMonth: number | null = null) { try { const client = await createAdminClient(); // 1. Settings const settingsRes = await client.databases.listDocuments(APPWRITE_ALMEIRA_CONFIG.databaseId, 'settings', []); const settings = JSON.parse(JSON.stringify(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. Main News (NOTICIA) const typeRes = await client.databases.listDocuments(APPWRITE_ALMEIRA_CONFIG.databaseId, 'publication_types', [ Query.equal('codigo', 'NOTICIA') ]); let posts: Post[] = []; let totalPages = 1; if (typeRes.documents.length > 0) { const firstType = typeRes.documents[0]; const typeId = firstType?.$id; if (!typeId) return { posts: [], cardSettings, totalPages: 1 }; const offset = (page - 1) * postsCount; const queries = [ Query.equal('tipo_publicacion_id', typeId), Query.orderDesc('fecha_publicacion'), Query.limit(postsCount), Query.offset(offset) ]; if (isAdmin) { queries.push(Query.equal('estado', ['Publicado', 'publicado', 'borrador'])); if (adminMonth) { const currentYear = new Date().getFullYear(); // First day of the selected month const startDate = new Date(currentYear, adminMonth - 1, 1).toISOString(); // First day of the next month const endDate = new Date(currentYear, adminMonth, 1).toISOString(); queries.push(Query.greaterThanEqual('fecha_publicacion', startDate)); queries.push(Query.lessThan('fecha_publicacion', endDate)); } } else { queries.push(Query.equal('estado', ['Publicado', 'publicado'])); } const postsRes = await client.databases.listDocuments(APPWRITE_ALMEIRA_CONFIG.databaseId, 'posts', queries); posts = postsRes.documents as unknown as Post[]; totalPages = Math.ceil(postsRes.total / postsCount); // 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 as string[]) ]); 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: JSON.parse(JSON.stringify(posts)) as Post[], cardSettings, totalPages }; } catch (e) { console.error("Home fetch error", e); return { posts: [], cardSettings: { showCategory: false, showFooterDate: true, showFooterButton: true, footerText: "" }, totalPages: 1 }; } } export const dynamic = "force-dynamic"; export default async function Home(props: { searchParams: Promise<{ [key: string]: string | string[] | undefined }> }) { const searchParams = await props.searchParams; const page = Number(searchParams?.page) || 1; const adminMonth = searchParams?.month ? Number(searchParams.month) : null; 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'; const { posts, cardSettings, totalPages } = await fetchHomeData(page, isAdmin, adminMonth); const hasSidebar = await hasSidebarContent(); const cookieStore = await cookies(); const hasVisited = cookieStore.has('almeira_visited'); return (
{!hasVisited && ( <>