Refactor: Full-width support for Clasificados

This commit is contained in:
Carlos (Almeira) 2026-03-26 15:56:38 -05:00
parent 4f1bc2b3ba
commit f71879da9c

View File

@ -2,6 +2,7 @@ import { APPWRITE_ALMEIRA_CONFIG } from '@/lib/appwrite';
import { createAdminClient } from '@/lib/appwrite.server'; import { createAdminClient } from '@/lib/appwrite.server';
import { Query } from 'node-appwrite'; import { Query } from 'node-appwrite';
import { NewsCard } from '@/components/NewsCard'; import { NewsCard } from '@/components/NewsCard';
import { GlobalSidebar, hasSidebarContent } from '@/components/AdWrappers';
import { Sparkles } from 'lucide-react'; import { Sparkles } from 'lucide-react';
async function fetchClasificadosData() { async function fetchClasificadosData() {
@ -56,6 +57,7 @@ async function fetchClasificadosData() {
export default async function ClasificadosPage() { export default async function ClasificadosPage() {
const { posts, cardSettings } = await fetchClasificadosData(); const { posts, cardSettings } = await fetchClasificadosData();
const hasSidebar = await hasSidebarContent();
return ( return (
<main className="animate-fade-in relative min-h-screen"> <main className="animate-fade-in relative min-h-screen">
@ -84,55 +86,65 @@ export default async function ClasificadosPage() {
</div> </div>
</section> </section>
<section id="noticias" className="container mx-auto px-4 py-20 relative z-10"> <section id="noticias" className="container mx-auto px-4 py-20 relative z-10 w-full">
<div className="flex flex-col md:flex-row justify-between items-end mb-12 gap-6"> <div className="flex flex-col lg:flex-row gap-8 w-full items-start">
<div> <div className="flex-1 w-full relative">
<div className="flex items-center gap-3 mb-2"> <div className="flex flex-col md:flex-row justify-between items-end mb-12 gap-6">
<div className="w-12 h-1 bg-gradient-to-r from-purple-400 to-blue-600 rounded-full"></div> <div>
<span className="text-purple-400 font-bold tracking-widest uppercase text-sm">Avisos</span> <div className="flex items-center gap-3 mb-2">
</div> <div className="w-12 h-1 bg-gradient-to-r from-purple-400 to-blue-600 rounded-full"></div>
<h2 className="text-4xl font-outfit font-black text-white">Anuncios <span className="text-transparent bg-clip-text bg-gradient-to-r from-white to-slate-500">Recientes</span></h2> <span className="text-purple-400 font-bold tracking-widest uppercase text-sm">Avisos</span>
</div> </div>
</div> <h2 className="text-4xl font-outfit font-black text-white">Anuncios <span className="text-transparent bg-clip-text bg-gradient-to-r from-white to-slate-500">Recientes</span></h2>
</div>
{posts.length === 0 ? (
<div className="w-full py-20 flex flex-col items-center justify-center border border-white/5 rounded-3xl glass-panel relative overflow-hidden">
<div className="p-6 rounded-full bg-slate-800/80 mb-6 border border-white/10 relative z-10">
<Sparkles size={48} className="text-purple-500" />
</div> </div>
<h3 className="text-2xl font-black font-outfit text-white mb-2 relative z-10">Sin Anuncios Recientes</h3>
<p className="text-slate-400 relative z-10">El mercado se encuentra a la espera de nuevas ofertas globales.</p>
</div>
) : (
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
{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;
if (post.resolved_media) { {posts.length === 0 ? (
imagenUrl = `${ENDPOINT}/storage/buckets/${post.resolved_media.bucket_id}/files/${post.resolved_media.file_id}/preview?project=${PROJECT_ID}&width=800&height=500&quality=85`; <div className="w-full py-20 flex flex-col items-center justify-center border border-white/5 rounded-3xl glass-panel relative overflow-hidden">
} <div className="p-6 rounded-full bg-slate-800/80 mb-6 border border-white/10 relative z-10">
<Sparkles size={48} className="text-purple-500" />
</div>
<h3 className="text-2xl font-black font-outfit text-white mb-2 relative z-10">Sin Anuncios Recientes</h3>
<p className="text-slate-400 relative z-10">El mercado se encuentra a la espera de nuevas ofertas globales.</p>
</div>
) : (
<div className={`grid grid-cols-1 md:grid-cols-2 ${hasSidebar ? 'lg:grid-cols-2 xl:grid-cols-3' : 'lg:grid-cols-3 xl:grid-cols-4'} gap-6`}>
{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;
return ( if (post.resolved_media) {
<NewsCard imagenUrl = `${ENDPOINT}/storage/buckets/${post.resolved_media.bucket_id}/files/${post.resolved_media.file_id}/preview?project=${PROJECT_ID}&width=800&height=500&quality=85`;
key={post.$id} }
id={post.$id}
slug={post.slug || post.$id} return (
titulo={post.titulo} <NewsCard
resumen={post.resumen_redes || post.contenido?.replace(/<[^>]*>?/gm, '').substring(0, 150) + '...'} key={post.$id}
tipo="Aviso" id={post.$id}
fecha={post.fecha_publicacion || post.$createdAt} slug={post.slug || post.$id}
imagenUrl={imagenUrl} titulo={post.titulo}
showCategory={cardSettings.showCategory} resumen={post.resumen_redes || post.contenido?.replace(/<[^>]*>?/gm, '').substring(0, 150) + '...'}
showFooterDate={cardSettings.showFooterDate} tipo="Aviso"
showFooterButton={cardSettings.showFooterButton} fecha={post.fecha_publicacion || post.$createdAt}
footerText={cardSettings.footerText} imagenUrl={imagenUrl}
/> showCategory={cardSettings.showCategory}
) showFooterDate={cardSettings.showFooterDate}
})} showFooterButton={cardSettings.showFooterButton}
</div> footerText={cardSettings.footerText}
)} />
)
})}
</div>
)}
</div>
{hasSidebar && (
<aside className="w-full lg:w-[320px] xl:w-[360px] shrink-0 mt-8 lg:mt-0 sticky top-24">
<GlobalSidebar />
</aside>
)}
</div>
</section> </section>
</main> </main>
); );