fix: 3 erros React — next/script p/ tema, 'use client' Footer+donate, remover metadata incompatível
This commit is contained in:
@@ -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
|
||||
>
|
||||
<head>
|
||||
<script
|
||||
<Script
|
||||
id="theme-init"
|
||||
strategy="beforeInteractive"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: `
|
||||
(function() {
|
||||
try {
|
||||
var theme = localStorage.getItem('pawlink-theme');
|
||||
var prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
||||
if (theme === 'dark' || (!theme && prefersDark)) {
|
||||
document.documentElement.classList.add('dark');
|
||||
document.documentElement.setAttribute('data-theme', 'dark');
|
||||
}
|
||||
} catch(e) {}
|
||||
})();
|
||||
`,
|
||||
__html: `(function(){try{var t=localStorage.getItem('petlink-theme');var d=window.matchMedia('(prefers-color-scheme: dark)').matches;if(t==='dark'||(!t&&d)){document.documentElement.classList.add('dark');document.documentElement.setAttribute('data-theme','dark');}}catch(e){}})();`,
|
||||
}}
|
||||
/>
|
||||
</head>
|
||||
|
||||
10
app/main/donate/layout.tsx
Normal file
10
app/main/donate/layout.tsx
Normal file
@@ -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}</>;
|
||||
}
|
||||
@@ -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 = [
|
||||
{
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
'use client';
|
||||
|
||||
import Link from 'next/link';
|
||||
import { PawPrint, Heart } from 'lucide-react';
|
||||
|
||||
|
||||
@@ -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 = [
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
},
|
||||
});
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user