From d5183e0a0d4d1f9cf815af2872ec63a2293e11be Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 27 Nov 2025 20:01:11 -0300 Subject: [PATCH] =?UTF-8?q?feat:=20WhatsApp=20din=C3=A2mico=20do=20CMS=20-?= =?UTF-8?q?=20Criada=20API=20/api/contact-info=20que=20busca=20n=C3=BAmero?= =?UTF-8?q?=20do=20CMS=20-=20Header=20e=20bot=C3=A3o=20flutuante=20agora?= =?UTF-8?q?=20puxam=20n=C3=BAmero=20dinamicamente=20-=20N=C3=BAmero=20padr?= =?UTF-8?q?=C3=A3o:=20(35)=209882-9445?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/app/api/contact-info/route.ts | 68 ++++++++++++++++++++++ frontend/src/components/Header.tsx | 27 +++++++-- frontend/src/components/WhatsAppButton.tsx | 16 ++++- 3 files changed, 104 insertions(+), 7 deletions(-) create mode 100644 frontend/src/app/api/contact-info/route.ts diff --git a/frontend/src/app/api/contact-info/route.ts b/frontend/src/app/api/contact-info/route.ts new file mode 100644 index 0000000..23044d5 --- /dev/null +++ b/frontend/src/app/api/contact-info/route.ts @@ -0,0 +1,68 @@ +import { NextResponse } from 'next/server'; +import prisma from '@/lib/prisma'; + +// Cache em memória para evitar muitas consultas ao banco +let cachedContactInfo: { whatsapp: string; whatsappLink: string } | null = null; +let cacheTime = 0; +const CACHE_TTL = 60 * 1000; // 1 minuto + +export async function GET() { + try { + // Verifica se cache é válido + if (cachedContactInfo && Date.now() - cacheTime < CACHE_TTL) { + return NextResponse.json(cachedContactInfo); + } + + // Busca dados da página de contato + const pageContent = await prisma.pageContent.findUnique({ + where: { + slug_locale: { + slug: 'contato', + locale: 'pt' + } + } + }); + + if (!pageContent || !pageContent.content) { + // Retorna valores padrão + return NextResponse.json({ + whatsapp: '(35) 9882-9445', + whatsappLink: 'https://wa.me/5535988229445' + }); + } + + const content = pageContent.content as { + info?: { + items?: Array<{ + icon?: string; + link?: string; + linkText?: string; + }>; + }; + }; + + // Encontra o item de WhatsApp + const whatsappItem = content.info?.items?.find( + item => item.icon === 'ri-whatsapp-line' || item.link?.includes('wa.me') + ); + + const result = { + whatsapp: whatsappItem?.linkText || '(35) 9882-9445', + whatsappLink: whatsappItem?.link || 'https://wa.me/5535988229445' + }; + + // Atualiza cache + cachedContactInfo = result; + cacheTime = Date.now(); + + return NextResponse.json(result); + } catch (error) { + console.error('Erro ao buscar informações de contato:', error); + + // Retorna valores padrão em caso de erro + return NextResponse.json({ + whatsapp: '(35) 9882-9445', + whatsappLink: 'https://wa.me/5535988229445' + }); + } +} diff --git a/frontend/src/components/Header.tsx b/frontend/src/components/Header.tsx index 5b9b1cc..5caaf79 100644 --- a/frontend/src/components/Header.tsx +++ b/frontend/src/components/Header.tsx @@ -12,12 +12,23 @@ export default function Header() { const { theme, setTheme } = useTheme(); const { locale, setLocale, t } = useLocale(); const [mounted, setMounted] = useState(false); + const [whatsappLink, setWhatsappLink] = useState('https://wa.me/5535988229445'); // Prefixo para links baseado no locale const prefix = locale === 'pt' ? '' : `/${locale}`; useEffect(() => { setMounted(true); + + // Busca o número do WhatsApp do CMS + fetch('/api/contact-info') + .then(res => res.json()) + .then(data => { + if (data.whatsappLink) { + setWhatsappLink(data.whatsappLink); + } + }) + .catch(console.error); }, []); // Prevent scrolling when mobile menu is open @@ -86,13 +97,15 @@ export default function Header() {
- {t('nav.contactUs')} - +
@@ -186,14 +199,16 @@ export default function Header() {
- setIsMobileMenuOpen(false)} className="w-full py-4 bg-primary text-white rounded-xl font-bold text-center flex items-center justify-center gap-2 shadow-lg shadow-primary/20" > {t('nav.contactUs')} - +
{ + // Busca o número do WhatsApp do CMS + fetch('/api/contact-info') + .then(res => res.json()) + .then(data => { + if (data.whatsappLink) { + setWhatsappLink(data.whatsappLink); + } + }) + .catch(console.error); + }, []); return (