diff --git a/app/layout.tsx b/app/layout.tsx index 1e9bf20..a9570fc 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,5 +1,6 @@ import type { Metadata } from 'next'; import { Playfair_Display, Lora, Fragment_Mono } from 'next/font/google'; +import Script from 'next/script'; import './globals.css'; const playfair = Playfair_Display({ @@ -58,20 +59,11 @@ export default function RootLayout({ suppressHydrationWarning >
- diff --git a/app/main/donate/layout.tsx b/app/main/donate/layout.tsx new file mode 100644 index 0000000..0ec52c6 --- /dev/null +++ b/app/main/donate/layout.tsx @@ -0,0 +1,10 @@ +import type { Metadata } from 'next'; + +export const metadata: Metadata = { + title: 'Fazer uma Doação', + description: 'Doa ração, brinquedos ou apoio financeiro a canis parceiros PetLink em Portugal.', +}; + +export default function DonateLayout({ children }: { children: React.ReactNode }) { + return <>{children}>; +} diff --git a/app/main/donate/page.tsx b/app/main/donate/page.tsx index d79fec2..2aeb5aa 100644 --- a/app/main/donate/page.tsx +++ b/app/main/donate/page.tsx @@ -1,11 +1,7 @@ -import Link from 'next/link'; -import { Gift, CreditCard, Truck, Heart } from 'lucide-react'; -import type { Metadata } from 'next'; +'use client'; -export const metadata: Metadata = { - title: 'Fazer uma Doação', - description: 'Doa ração, brinquedos ou apoio financeiro a canis parceiros PetLink em Portugal.', -}; +import Link from 'next/link'; +import { Gift, CreditCard, Heart } from 'lucide-react'; const donationTypes = [ { diff --git a/components/layout/Footer.tsx b/components/layout/Footer.tsx index 017de36..7f9c92c 100644 --- a/components/layout/Footer.tsx +++ b/components/layout/Footer.tsx @@ -1,3 +1,5 @@ +'use client'; + import Link from 'next/link'; import { PawPrint, Heart } from 'lucide-react'; diff --git a/components/layout/SideMenu.tsx b/components/layout/SideMenu.tsx index 410466f..69ab538 100644 --- a/components/layout/SideMenu.tsx +++ b/components/layout/SideMenu.tsx @@ -43,7 +43,7 @@ export default function SideMenu({ open, onClose }: SideMenuProps) { const isDark = document.documentElement.classList.toggle('dark'); document.documentElement.setAttribute('data-theme', isDark ? 'dark' : 'light'); setDark(isDark); - try { localStorage.setItem('pawlink-theme', isDark ? 'dark' : 'light'); } catch (_) {} + try { localStorage.setItem('petlink-theme', isDark ? 'dark' : 'light'); } catch (_) {} }; const menuItems = [ diff --git a/lib/db/prisma.ts b/lib/db/prisma.ts index 0ffdfb4..fce8d87 100644 --- a/lib/db/prisma.ts +++ b/lib/db/prisma.ts @@ -1,11 +1,13 @@ +// lib/db/prisma.ts import { PrismaClient } from '@prisma/client'; +// Evitar múltiplas instâncias em hot-reload do Next.js dev const globalForPrisma = globalThis as unknown as { prisma: PrismaClient }; export const prisma = globalForPrisma.prisma || new PrismaClient({ - log: process.env.NODE_ENV === 'development' ? ['query', 'error', 'warn'] : ['error'], + log: process.env.NODE_ENV === 'development' ? ['error', 'warn'] : ['error'], }); if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma; diff --git a/prisma.config.ts b/prisma.config.ts index 831a20f..0abfb4c 100644 --- a/prisma.config.ts +++ b/prisma.config.ts @@ -1,6 +1,24 @@ -// This file was generated by Prisma, and assumes you have installed the following: -// npm install --save-dev prisma dotenv -import "dotenv/config"; +// prisma.config.ts +// Carregar .env.local manualmente (dotenv v17 tem API diferente em ESM/CJS) +import { readFileSync, existsSync } from 'fs'; +import { resolve } from 'path'; + +function loadEnvFile(filePath: string) { + if (!existsSync(filePath)) return; + const content = readFileSync(filePath, 'utf-8'); + for (const line of content.split('\n')) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith('#')) continue; + const idx = trimmed.indexOf('='); + if (idx === -1) continue; + const key = trimmed.slice(0, idx).trim(); + const val = trimmed.slice(idx + 1).trim().replace(/^["']|["']$/g, ''); + if (!(key in process.env)) process.env[key] = val; + } +} +// .env.local tem precedência — carregar primeiro com override manual +loadEnvFile(resolve('.env.local')); +loadEnvFile(resolve('.env')); import { defineConfig } from "prisma/config"; export default defineConfig({ @@ -9,6 +27,9 @@ export default defineConfig({ path: "prisma/migrations", }, datasource: { - url: process.env["DATABASE_URL"], + // DIRECT_URL para migrações (ligação directa porta 5432) + // DATABASE_URL para runtime (pooler porta 6543) + url: process.env["DIRECT_URL"] ?? process.env["DATABASE_URL"], + // Nota: se DIRECT_URL não estiver definida, usa DATABASE_URL como fallback }, }); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index f35b33e..5c99369 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1,8 +1,9 @@ // prisma/schema.prisma generator client { - provider = "prisma-client-js" - output = "../node_modules/.prisma/client" + provider = "prisma-client-js" + output = "../node_modules/.prisma/client" + engineType = "binary" } datasource db {