From 25ced0c2f601928de006e1647148502163924d8c Mon Sep 17 00:00:00 2001 From: adevopg Date: Wed, 15 Jul 2026 13:03:32 +0000 Subject: [PATCH] =?UTF-8?q?web:=20la=20p=C3=A1gina=20de=20creadores=20de?= =?UTF-8?q?=20contenido=20(el=20men=C3=BA=20VIDEOS),=20que=20daba=20404?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SiteHeader enlazaba /content-creators y esa página no existía en Next: el menú VIDEOS llevaba a un 404. Réplica del partial Django `partials/videos.html`, con sus clases del tema (cc-box, cc-avatar, cc-name...). Lee el primer registro de home_contentcreator, igual que la vista de Django. La descripción es HTML de CKEditor (lo edita un admin), así que se sanea con `cleanPostHtml`, la misma allowlist que los mensajes del foro. Comprobado metiendo un a propósito: no aparece en el HTML servido. Dos arreglos sobre el diseño de Django, que copiaba tal cual: - El título va SIEMPRE. Django lo metía dentro del `if content_creator`, así que sin datos la página quedaba con un

suelto, sin cabecera ni caja. Ahora sin creador sale el título de la sección y el aviso centrado en su box-content. - Los enlaces de YouTube/Facebook se salían por abajo de la caja. El tema le da a `.cc-box` una altura FIJA de 172px contando con el content-box del navegador, y el border-box de Tailwind le restaba el padding y el borde: 24px menos de alto útil. Es el mismo caso que .item-box en la tienda. Medido: la caja pasa de 172 a 196px de alto y los enlaces dejan de desbordar. Verificado con un creador de prueba (borrado después): /es/ y /en/ dan 200, el título, el avatar, el iframe y los enlaces caen dentro de la caja, y con la tabla vacía sale el mismo texto que Django. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../app/[locale]/content-creators/page.tsx | 106 ++++++++++++++++++ web-next/app/globals.css | 7 ++ web-next/lib/content-creator.ts | 45 ++++++++ web-next/messages/en.json | 6 + web-next/messages/es.json | 6 + 5 files changed, 170 insertions(+) create mode 100644 web-next/app/[locale]/content-creators/page.tsx create mode 100644 web-next/lib/content-creator.ts diff --git a/web-next/app/[locale]/content-creators/page.tsx b/web-next/app/[locale]/content-creators/page.tsx new file mode 100644 index 0000000..356e037 --- /dev/null +++ b/web-next/app/[locale]/content-creators/page.tsx @@ -0,0 +1,106 @@ +import type { Metadata } from 'next' +import { getTranslations, setRequestLocale } from 'next-intl/server' +import { getContentCreator } from '@/lib/content-creator' +import { cleanPostHtml } from '@/lib/forum-sanitize' + +export const dynamic = 'force-dynamic' + +export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }): Promise { + const { locale } = await params + const t = await getTranslations({ locale, namespace: 'Misc' }) + return { title: t('creators.pageTitle') } +} + +/** + * Creadores de contenido (el menú VIDEOS) — réplica del partial Django + * `partials/videos.html`. Enseña el primer creador de `home_contentcreator`, y + * si no hay ninguno, el mismo aviso que Django. + */ +export default async function ContentCreatorsPage({ params }: { params: Promise<{ locale: string }> }) { + const { locale } = await params + setRequestLocale(locale) + const t = await getTranslations('Misc') + const cc = await getContentCreator() + + return ( +

+
+
+ {/* El título va SIEMPRE, haya creadores o no: Django lo metía dentro + del `if` y sin datos la página quedaba con un

suelto, sin + cabecera ni caja. Sin creador se usa el título de la sección. */} +

+

{cc ? cc.title : t('creators.pageTitle')}

+
+ {!cc ? ( +
+
+
+

{t('creators.empty')}

+
+
+
+ ) : ( + <> +
+
+ {/* La descripción es HTML de CKEditor (lo edita un admin): se + sanea con la misma allowlist que los mensajes del foro. */} +
+
+
+ + {(cc.youtubeVideoUrl || cc.avatarImageUrl) && ( +
+
+ {cc.avatarImageUrl && ( + // eslint-disable-next-line @next/next/no-img-element + Avatar + )} + {cc.youtubeVideoUrl && ( +