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 type { Metadata } from 'next';
|
||||||
import { Playfair_Display, Lora, Fragment_Mono } from 'next/font/google';
|
import { Playfair_Display, Lora, Fragment_Mono } from 'next/font/google';
|
||||||
|
import Script from 'next/script';
|
||||||
import './globals.css';
|
import './globals.css';
|
||||||
|
|
||||||
const playfair = Playfair_Display({
|
const playfair = Playfair_Display({
|
||||||
@@ -58,20 +59,11 @@ export default function RootLayout({
|
|||||||
suppressHydrationWarning
|
suppressHydrationWarning
|
||||||
>
|
>
|
||||||
<head>
|
<head>
|
||||||
<script
|
<Script
|
||||||
|
id="theme-init"
|
||||||
|
strategy="beforeInteractive"
|
||||||
dangerouslySetInnerHTML={{
|
dangerouslySetInnerHTML={{
|
||||||
__html: `
|
__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){}})();`,
|
||||||
(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) {}
|
|
||||||
})();
|
|
||||||
`,
|
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</head>
|
</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';
|
'use client';
|
||||||
import { Gift, CreditCard, Truck, Heart } from 'lucide-react';
|
|
||||||
import type { Metadata } from 'next';
|
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
import Link from 'next/link';
|
||||||
title: 'Fazer uma Doação',
|
import { Gift, CreditCard, Heart } from 'lucide-react';
|
||||||
description: 'Doa ração, brinquedos ou apoio financeiro a canis parceiros PetLink em Portugal.',
|
|
||||||
};
|
|
||||||
|
|
||||||
const donationTypes = [
|
const donationTypes = [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
'use client';
|
||||||
|
|
||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
import { PawPrint, Heart } from 'lucide-react';
|
import { PawPrint, Heart } from 'lucide-react';
|
||||||
|
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ export default function SideMenu({ open, onClose }: SideMenuProps) {
|
|||||||
const isDark = document.documentElement.classList.toggle('dark');
|
const isDark = document.documentElement.classList.toggle('dark');
|
||||||
document.documentElement.setAttribute('data-theme', isDark ? 'dark' : 'light');
|
document.documentElement.setAttribute('data-theme', isDark ? 'dark' : 'light');
|
||||||
setDark(isDark);
|
setDark(isDark);
|
||||||
try { localStorage.setItem('pawlink-theme', isDark ? 'dark' : 'light'); } catch (_) {}
|
try { localStorage.setItem('petlink-theme', isDark ? 'dark' : 'light'); } catch (_) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
const menuItems = [
|
const menuItems = [
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
|
// lib/db/prisma.ts
|
||||||
import { PrismaClient } from '@prisma/client';
|
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 };
|
const globalForPrisma = globalThis as unknown as { prisma: PrismaClient };
|
||||||
|
|
||||||
export const prisma =
|
export const prisma =
|
||||||
globalForPrisma.prisma ||
|
globalForPrisma.prisma ||
|
||||||
new PrismaClient({
|
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;
|
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:
|
// prisma.config.ts
|
||||||
// npm install --save-dev prisma dotenv
|
// Carregar .env.local manualmente (dotenv v17 tem API diferente em ESM/CJS)
|
||||||
import "dotenv/config";
|
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";
|
import { defineConfig } from "prisma/config";
|
||||||
|
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
@@ -9,6 +27,9 @@ export default defineConfig({
|
|||||||
path: "prisma/migrations",
|
path: "prisma/migrations",
|
||||||
},
|
},
|
||||||
datasource: {
|
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
|
// prisma/schema.prisma
|
||||||
|
|
||||||
generator client {
|
generator client {
|
||||||
provider = "prisma-client-js"
|
provider = "prisma-client-js"
|
||||||
output = "../node_modules/.prisma/client"
|
output = "../node_modules/.prisma/client"
|
||||||
|
engineType = "binary"
|
||||||
}
|
}
|
||||||
|
|
||||||
datasource db {
|
datasource db {
|
||||||
|
|||||||
Reference in New Issue
Block a user