diff --git a/.env.example b/.env.example index 3f362e7..03ab78b 100644 --- a/.env.example +++ b/.env.example @@ -5,6 +5,7 @@ APP_DEBUG=true APP_URL=http://localhost:8000 APP_PORT=8000 VITE_PORT=5173 +INERTIA_SSR_HOT_URL=http://node:5173 APP_LOCALE=pt_PT APP_FALLBACK_LOCALE=pt_PT diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c01ca2..b52bfa6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,8 @@ Todas as alterações materiais são registadas neste ficheiro. O formato segue - Nome, identidade visual e idioma orientados ao Portal de Reservas. - Configuração padrão alterada para PostgreSQL, Redis, SMTP/Mailpit e Europa/Lisboa. - Configuração de desenvolvimento Vite passa a publicar módulos e HMR em `localhost:5173` e a aceitar explicitamente a origem do portal em `localhost:8000`, corrigindo a página em branco em Docker. +- As mensagens flash globais recebem agora as propriedades diretamente de `withApp`, evitando o uso de `usePage()` fora do contexto Inertia que interrompia o arranque do React. +- SSR de desenvolvimento ligado internamente de PHP para o serviço `node`, com o hostname Docker autorizado no Vite. ### Segurança @@ -32,3 +34,4 @@ Todas as alterações materiais são registadas neste ficheiro. O formato segue - Suite backend: Pint, PHPStan nível 7 e 44 testes Pest (157 asserções). - Frontend: TypeScript, ESLint, Prettier e build Vite de produção. - Stack Docker operacional e endpoint de login acessível através do Nginx. +- Renderização SSR real do login validada, incluindo o conteúdo “Entrar no Portal de Reservas”. diff --git a/compose.yaml b/compose.yaml index 61f67d5..6f6ce77 100644 --- a/compose.yaml +++ b/compose.yaml @@ -15,6 +15,7 @@ x-app: &app MAIL_MAILER: smtp MAIL_HOST: mailpit MAIL_PORT: 1025 + INERTIA_SSR_HOT_URL: http://node:5173 volumes: - .:/var/www/html - vendor:/var/www/html/vendor diff --git a/config/inertia.php b/config/inertia.php index 70f6b9b..537674e 100644 --- a/config/inertia.php +++ b/config/inertia.php @@ -18,6 +18,7 @@ return [ 'ssr' => [ 'enabled' => true, 'url' => 'http://127.0.0.1:13714', + 'hot_url' => env('INERTIA_SSR_HOT_URL'), // 'bundle' => base_path('bootstrap/ssr/ssr.mjs'), ], diff --git a/docs/PROJECT_STATUS.md b/docs/PROJECT_STATUS.md index 2e1d14b..9fc16c1 100644 --- a/docs/PROJECT_STATUS.md +++ b/docs/PROJECT_STATUS.md @@ -55,6 +55,7 @@ Validação concluída em 4 de agosto de 2026: - PostgreSQL 17: `migrate:fresh --seed` concluído, incluindo extensão `btree_gist` e restrição de exclusão temporal; - smoke test HTTP: `/login` respondeu com estado 200 através do Nginx; - Vite em Docker: URL pública, HMR e CORS verificados em `localhost:5173`; corrigida a página em branco causada pela publicação anterior de `0.0.0.0:5173`; +- Inertia SSR: renderização do login validada através do serviço `node`; corrigido o componente de mensagens flash que usava `usePage()` fora do contexto Inertia; - verificação visual no browser integrado: não executada devido a uma política administrativa temporariamente indisponível no browser desta sessão; não foi detetado erro da aplicação. ## Decisões pendentes do contexto institucional diff --git a/docs/RUNBOOK.md b/docs/RUNBOOK.md index c849720..0738e78 100644 --- a/docs/RUNBOOK.md +++ b/docs/RUNBOOK.md @@ -32,6 +32,14 @@ curl -I -H 'Origin: http://localhost:8000' http://localhost:5173/resources/js/ap Ambos devem responder com estado 200 e `Access-Control-Allow-Origin: http://localhost:8000`. Reiniciar o serviço com `docker compose restart node` se o ficheiro `public/hot` estiver desatualizado. +Confirmar também que o HTML inicial já contém conteúdo SSR: + +```bash +curl -s http://localhost:8000/login | grep 'data-server-rendered="true"' +``` + +Se o endpoint Vite devolver um erro SSR, procurar primeiro componentes globais montados em `withApp` que chamem hooks Inertia como `usePage()`. Os elementos irmãos do argumento `app` não pertencem ao respetivo contexto; devem receber as propriedades através do segundo argumento de `withApp`. + ## Atualização de código ```bash diff --git a/resources/js/app.tsx b/resources/js/app.tsx index c0b68b3..1e65e2c 100644 --- a/resources/js/app.tsx +++ b/resources/js/app.tsx @@ -24,11 +24,11 @@ createInertiaApp({ } }, strictMode: true, - withApp(app) { + withApp(app, { page }) { return ( {app} - + ); diff --git a/resources/js/components/flash-messages.tsx b/resources/js/components/flash-messages.tsx index db23908..4449310 100644 --- a/resources/js/components/flash-messages.tsx +++ b/resources/js/components/flash-messages.tsx @@ -1,19 +1,23 @@ -import { usePage } from '@inertiajs/react'; import { useEffect } from 'react'; import { toast } from 'sonner'; -export function FlashMessages() { - const { flash } = usePage().props; +type FlashMessagesProps = { + flash?: { + success?: string | null; + error?: string | null; + }; +}; +export function FlashMessages({ flash }: FlashMessagesProps) { useEffect(() => { - if (flash.success) { + if (flash?.success) { toast.success(flash.success); } - if (flash.error) { + if (flash?.error) { toast.error(flash.error); } - }, [flash.error, flash.success]); + }, [flash?.error, flash?.success]); return null; } diff --git a/resources/js/types/global.d.ts b/resources/js/types/global.d.ts index 69927aa..88b706c 100644 --- a/resources/js/types/global.d.ts +++ b/resources/js/types/global.d.ts @@ -12,7 +12,10 @@ declare module '@inertiajs/core' { sharedPageProps: { name: string; auth: Auth; - flash: { success?: string; error?: string }; + flash: { + success?: string | null; + error?: string | null; + }; sidebarOpen: boolean; [key: string]: unknown; }; diff --git a/vite.config.ts b/vite.config.ts index 6fedea8..3df2dfc 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -11,6 +11,7 @@ export default defineConfig({ host: '0.0.0.0', port: 5173, strictPort: true, + allowedHosts: ['node'], origin: 'http://localhost:5173', cors: { origin: [