From b10d9c515b3fb88c25c8aaa01b87fdce8f0000d1 Mon Sep 17 00:00:00 2001 From: syoul Date: Sun, 23 Nov 2025 19:22:34 +0100 Subject: [PATCH] =?UTF-8?q?Simplification=20compl=C3=A8te=20de=20l'app=20-?= =?UTF-8?q?=20Suppression=20admin/WiFi/bungalow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Suppression de toute la partie admin (routes, composants, API) - Suppression du WiFi et du numéro de bungalow - Simplification de l'accueil (logo, météo, message statique) - App 100% statique maintenant - Redirection simple vers /accueil - Nettoyage des hooks et types inutilisés --- app/accueil/page.tsx | 50 +- app/admin/login/page.tsx | 92 - app/admin/page.tsx | 97 - app/api/admin/clients/route.ts | 132 - app/page.tsx | 117 +- components/accueil/WifiCard.tsx | 129 - components/admin/AdminLayout.tsx | 34 - components/admin/ClientForm.tsx | 264 - components/admin/ClientList.tsx | 179 - components/admin/QRCodeDisplay.tsx | 100 - deploy/.env.example | 5 + deploy/.next/BUILD_ID | 1 + deploy/.next/app-build-manifest.json | 88 + deploy/.next/app-path-routes-manifest.json | 1 + deploy/.next/build-manifest.json | 32 + deploy/.next/cache/eslint/.cache_afsi2w | 1 + .../webpack/client-development/0.pack.gz | Bin 0 -> 44274 bytes .../webpack/client-development/index.pack.gz | Bin 0 -> 2193 bytes .../cache/webpack/client-production/0.pack | Bin 0 -> 19848795 bytes .../webpack/client-production/index.pack | Bin 0 -> 2893624 bytes .../webpack/edge-server-production/0.pack | Bin 0 -> 274 bytes .../webpack/edge-server-production/index.pack | Bin 0 -> 9472 bytes .../cache/webpack/server-production/0.pack | Bin 0 -> 17397410 bytes .../webpack/server-production/index.pack | Bin 0 -> 3346820 bytes deploy/.next/export-marker.json | 1 + deploy/.next/images-manifest.json | 1 + deploy/.next/next-minimal-server.js.nft.json | 1 + deploy/.next/next-server.js.nft.json | 1 + deploy/.next/package.json | 1 + deploy/.next/prerender-manifest.json | 1 + deploy/.next/react-loadable-manifest.json | 14 + deploy/.next/required-server-files.json | 1 + deploy/.next/server/app-paths-manifest.json | 12 + deploy/.next/server/app/_not-found.html | 1 + deploy/.next/server/app/_not-found.meta | 6 + deploy/.next/server/app/_not-found.rsc | 11 + deploy/.next/server/app/_not-found/page.js | 1 + .../server/app/_not-found/page.js.nft.json | 1 + .../page_client-reference-manifest.js | 1 + deploy/.next/server/app/accueil.html | 1 + deploy/.next/server/app/accueil.meta | 5 + deploy/.next/server/app/accueil.rsc | 9 + deploy/.next/server/app/accueil/page.js | 1 + .../.next/server/app/accueil/page.js.nft.json | 1 + .../accueil/page_client-reference-manifest.js | 1 + deploy/.next/server/app/admin.html | 1 + deploy/.next/server/app/admin.meta | 5 + deploy/.next/server/app/admin.rsc | 9 + deploy/.next/server/app/admin/login.html | 1 + deploy/.next/server/app/admin/login.meta | 5 + deploy/.next/server/app/admin/login.rsc | 9 + deploy/.next/server/app/admin/login/page.js | 1 + .../server/app/admin/login/page.js.nft.json | 1 + .../login/page_client-reference-manifest.js | 1 + deploy/.next/server/app/admin/page.js | 29 + .../.next/server/app/admin/page.js.nft.json | 1 + .../admin/page_client-reference-manifest.js | 1 + .../server/app/api/admin/clients/route.js | 12 + .../app/api/admin/clients/route.js.nft.json | 1 + deploy/.next/server/app/explorer.html | 1 + deploy/.next/server/app/explorer.meta | 5 + deploy/.next/server/app/explorer.rsc | 9 + deploy/.next/server/app/explorer/page.js | 1 + .../server/app/explorer/page.js.nft.json | 1 + .../page_client-reference-manifest.js | 1 + deploy/.next/server/app/index.html | 1 + deploy/.next/server/app/index.meta | 5 + deploy/.next/server/app/index.rsc | 9 + deploy/.next/server/app/infos.html | 1 + deploy/.next/server/app/infos.meta | 5 + deploy/.next/server/app/infos.rsc | 15 + deploy/.next/server/app/infos/page.js | 1 + .../.next/server/app/infos/page.js.nft.json | 1 + .../infos/page_client-reference-manifest.js | 1 + deploy/.next/server/app/mana-tracker.html | 1 + deploy/.next/server/app/mana-tracker.meta | 5 + deploy/.next/server/app/mana-tracker.rsc | 16 + deploy/.next/server/app/mana-tracker/page.js | 1 + .../server/app/mana-tracker/page.js.nft.json | 1 + .../page_client-reference-manifest.js | 1 + deploy/.next/server/app/offline.html | 1 + deploy/.next/server/app/offline.meta | 5 + deploy/.next/server/app/offline.rsc | 8 + deploy/.next/server/app/offline/page.js | 1 + .../.next/server/app/offline/page.js.nft.json | 1 + .../offline/page_client-reference-manifest.js | 1 + deploy/.next/server/app/page.js | 1 + deploy/.next/server/app/page.js.nft.json | 1 + .../app/page_client-reference-manifest.js | 1 + deploy/.next/server/chunks/174.js | 1 + deploy/.next/server/chunks/180.js | 1 + deploy/.next/server/chunks/207.js | 1 + deploy/.next/server/chunks/276.js | 2 + deploy/.next/server/chunks/341.js | 1 + deploy/.next/server/chunks/682.js | 6 + deploy/.next/server/chunks/698.js | 1 + deploy/.next/server/chunks/740.js | 2 + deploy/.next/server/chunks/87.js | 1 + deploy/.next/server/chunks/933.js | 1 + deploy/.next/server/chunks/99.js | 1 + deploy/.next/server/chunks/font-manifest.json | 1 + deploy/.next/server/font-manifest.json | 1 + .../server/functions-config-manifest.json | 1 + .../interception-route-rewrite-manifest.js | 1 + .../.next/server/middleware-build-manifest.js | 1 + deploy/.next/server/middleware-manifest.json | 6 + .../middleware-react-loadable-manifest.js | 1 + deploy/.next/server/next-font-manifest.js | 1 + deploy/.next/server/next-font-manifest.json | 1 + deploy/.next/server/pages-manifest.json | 1 + deploy/.next/server/pages/404.html | 1 + deploy/.next/server/pages/500.html | 1 + deploy/.next/server/pages/_app.js | 1 + deploy/.next/server/pages/_app.js.nft.json | 1 + deploy/.next/server/pages/_document.js | 1 + .../.next/server/pages/_document.js.nft.json | 1 + deploy/.next/server/pages/_error.js | 1 + deploy/.next/server/pages/_error.js.nft.json | 1 + .../.next/server/server-reference-manifest.js | 1 + .../server/server-reference-manifest.json | 1 + deploy/.next/server/webpack-runtime.js | 1 + .../3c87ZLiEKCTo7fN65B1s7/_buildManifest.js | 1 + .../3c87ZLiEKCTo7fN65B1s7/_ssgManifest.js | 1 + .../static/chunks/117-81b684a50b4e5a2c.js | 2 + .../static/chunks/130-fbdba5ec657d70e2.js | 1 + .../static/chunks/147.f0c63fadc263cdbf.js | 1 + .../static/chunks/659-547b5910f7777d12.js | 1 + .../static/chunks/80.c30ab4050c6d10af.js | 1 + .../static/chunks/876-74e3127f7295a7cc.js | 1 + .../app/_not-found/page-93c891698b4decca.js | 1 + .../app/accueil/page-eeceff806dc9e963.js | 1 + .../app/admin/login/page-64d4a547eaf512e7.js | 1 + .../chunks/app/admin/page-be00d3b5e7fb599b.js | 1 + .../app/explorer/page-94fbb37299b728f0.js | 1 + .../chunks/app/infos/page-9c23965cb3e698cb.js | 1 + .../chunks/app/layout-012feff5f2309838.js | 1 + .../app/mana-tracker/page-190454f13d1cd3f9.js | 1 + .../app/offline/page-c706c75d3862967d.js | 1 + .../chunks/app/page-66582cb216c486f4.js | 1 + .../chunks/fd9d1056-f29a34e8cb4f1ac5.js | 1 + .../chunks/framework-f66176bb897dc684.js | 1 + .../static/chunks/main-98da237dfd0126ae.js | 1 + .../chunks/main-app-be78d15d42f0ba33.js | 1 + .../chunks/pages/_app-72b849fbd24ac258.js | 1 + .../chunks/pages/_error-7ba65e1336b92748.js | 1 + .../chunks/polyfills-42372ed130431b0a.js | 1 + deploy/.next/static/chunks/polyfills.js | 1 + .../static/chunks/webpack-272d92e0b8f870de.js | 1 + deploy/.next/static/css/37740839d02c8860.css | 3 + .../static/development/_buildManifest.js | 1 + .../.next/static/development/_ssgManifest.js | 1 + .../static/media/19cfc7226ec3afaa-s.woff2 | Bin 0 -> 19044 bytes .../static/media/21350d82a1f187e9-s.woff2 | Bin 0 -> 18744 bytes .../static/media/8e9860b6e62d6359-s.woff2 | Bin 0 -> 85272 bytes .../static/media/ba9851c3c22cd980-s.woff2 | Bin 0 -> 25844 bytes .../static/media/c5fe6dc8356a8c31-s.woff2 | Bin 0 -> 11272 bytes .../static/media/df0a9ae256c0569c-s.woff2 | Bin 0 -> 10280 bytes .../static/media/e4af272ccee01ff0-s.p.woff2 | Bin 0 -> 48432 bytes deploy/.next/trace | 25 + deploy/.next/types/app/accueil/page.ts | 79 + deploy/.next/types/app/admin/login/page.ts | 79 + deploy/.next/types/app/admin/page.ts | 79 + .../types/app/api/admin/clients/route.ts | 343 + deploy/.next/types/app/explorer/page.ts | 79 + deploy/.next/types/app/infos/page.ts | 79 + deploy/.next/types/app/layout.ts | 79 + deploy/.next/types/app/mana-tracker/page.ts | 79 + deploy/.next/types/app/offline/page.ts | 79 + deploy/.next/types/app/page.ts | 79 + deploy/.next/types/package.json | 1 + deploy/DEPLOY.md | 58 + deploy/data/.gitkeep | 2 + deploy/next.config.js | 19 + deploy/package-lock.json | 7062 +++++++++++++++++ deploy/package.json | 36 + deploy/public/ICONS_README.md | 14 + deploy/public/LOGO_README.md | 29 + deploy/public/data/excursions.json | 30 + deploy/public/data/infos.json | 72 + deploy/public/data/notifications.json | 19 + deploy/public/data/places.json | 166 + deploy/public/data/sun-times.json | 18 + deploy/public/data/tides.json | 36 + deploy/public/favicon.ico | 1 + deploy/public/logo-relais-marama.svg | 50 + deploy/public/manifest.json | 25 + deploy/public/sw.js | 147 + deploy/start.sh | 8 + lib/admin/auth.ts | 15 - lib/admin/client-utils.ts | 101 - lib/config.ts | 5 +- lib/data/clients.json | 13 - lib/hooks/useClientData.ts | 110 - lib/types/client.ts | 20 - next.config.js | 10 +- 195 files changed, 9355 insertions(+), 1441 deletions(-) delete mode 100644 app/admin/login/page.tsx delete mode 100644 app/admin/page.tsx delete mode 100644 app/api/admin/clients/route.ts delete mode 100644 components/accueil/WifiCard.tsx delete mode 100644 components/admin/AdminLayout.tsx delete mode 100644 components/admin/ClientForm.tsx delete mode 100644 components/admin/ClientList.tsx delete mode 100644 components/admin/QRCodeDisplay.tsx create mode 100644 deploy/.env.example create mode 100644 deploy/.next/BUILD_ID create mode 100644 deploy/.next/app-build-manifest.json create mode 100644 deploy/.next/app-path-routes-manifest.json create mode 100644 deploy/.next/build-manifest.json create mode 100644 deploy/.next/cache/eslint/.cache_afsi2w create mode 100644 deploy/.next/cache/webpack/client-development/0.pack.gz create mode 100644 deploy/.next/cache/webpack/client-development/index.pack.gz create mode 100644 deploy/.next/cache/webpack/client-production/0.pack create mode 100644 deploy/.next/cache/webpack/client-production/index.pack create mode 100644 deploy/.next/cache/webpack/edge-server-production/0.pack create mode 100644 deploy/.next/cache/webpack/edge-server-production/index.pack create mode 100644 deploy/.next/cache/webpack/server-production/0.pack create mode 100644 deploy/.next/cache/webpack/server-production/index.pack create mode 100644 deploy/.next/export-marker.json create mode 100644 deploy/.next/images-manifest.json create mode 100644 deploy/.next/next-minimal-server.js.nft.json create mode 100644 deploy/.next/next-server.js.nft.json create mode 100644 deploy/.next/package.json create mode 100644 deploy/.next/prerender-manifest.json create mode 100644 deploy/.next/react-loadable-manifest.json create mode 100644 deploy/.next/required-server-files.json create mode 100644 deploy/.next/server/app-paths-manifest.json create mode 100644 deploy/.next/server/app/_not-found.html create mode 100644 deploy/.next/server/app/_not-found.meta create mode 100644 deploy/.next/server/app/_not-found.rsc create mode 100644 deploy/.next/server/app/_not-found/page.js create mode 100644 deploy/.next/server/app/_not-found/page.js.nft.json create mode 100644 deploy/.next/server/app/_not-found/page_client-reference-manifest.js create mode 100644 deploy/.next/server/app/accueil.html create mode 100644 deploy/.next/server/app/accueil.meta create mode 100644 deploy/.next/server/app/accueil.rsc create mode 100644 deploy/.next/server/app/accueil/page.js create mode 100644 deploy/.next/server/app/accueil/page.js.nft.json create mode 100644 deploy/.next/server/app/accueil/page_client-reference-manifest.js create mode 100644 deploy/.next/server/app/admin.html create mode 100644 deploy/.next/server/app/admin.meta create mode 100644 deploy/.next/server/app/admin.rsc create mode 100644 deploy/.next/server/app/admin/login.html create mode 100644 deploy/.next/server/app/admin/login.meta create mode 100644 deploy/.next/server/app/admin/login.rsc create mode 100644 deploy/.next/server/app/admin/login/page.js create mode 100644 deploy/.next/server/app/admin/login/page.js.nft.json create mode 100644 deploy/.next/server/app/admin/login/page_client-reference-manifest.js create mode 100644 deploy/.next/server/app/admin/page.js create mode 100644 deploy/.next/server/app/admin/page.js.nft.json create mode 100644 deploy/.next/server/app/admin/page_client-reference-manifest.js create mode 100644 deploy/.next/server/app/api/admin/clients/route.js create mode 100644 deploy/.next/server/app/api/admin/clients/route.js.nft.json create mode 100644 deploy/.next/server/app/explorer.html create mode 100644 deploy/.next/server/app/explorer.meta create mode 100644 deploy/.next/server/app/explorer.rsc create mode 100644 deploy/.next/server/app/explorer/page.js create mode 100644 deploy/.next/server/app/explorer/page.js.nft.json create mode 100644 deploy/.next/server/app/explorer/page_client-reference-manifest.js create mode 100644 deploy/.next/server/app/index.html create mode 100644 deploy/.next/server/app/index.meta create mode 100644 deploy/.next/server/app/index.rsc create mode 100644 deploy/.next/server/app/infos.html create mode 100644 deploy/.next/server/app/infos.meta create mode 100644 deploy/.next/server/app/infos.rsc create mode 100644 deploy/.next/server/app/infos/page.js create mode 100644 deploy/.next/server/app/infos/page.js.nft.json create mode 100644 deploy/.next/server/app/infos/page_client-reference-manifest.js create mode 100644 deploy/.next/server/app/mana-tracker.html create mode 100644 deploy/.next/server/app/mana-tracker.meta create mode 100644 deploy/.next/server/app/mana-tracker.rsc create mode 100644 deploy/.next/server/app/mana-tracker/page.js create mode 100644 deploy/.next/server/app/mana-tracker/page.js.nft.json create mode 100644 deploy/.next/server/app/mana-tracker/page_client-reference-manifest.js create mode 100644 deploy/.next/server/app/offline.html create mode 100644 deploy/.next/server/app/offline.meta create mode 100644 deploy/.next/server/app/offline.rsc create mode 100644 deploy/.next/server/app/offline/page.js create mode 100644 deploy/.next/server/app/offline/page.js.nft.json create mode 100644 deploy/.next/server/app/offline/page_client-reference-manifest.js create mode 100644 deploy/.next/server/app/page.js create mode 100644 deploy/.next/server/app/page.js.nft.json create mode 100644 deploy/.next/server/app/page_client-reference-manifest.js create mode 100644 deploy/.next/server/chunks/174.js create mode 100644 deploy/.next/server/chunks/180.js create mode 100644 deploy/.next/server/chunks/207.js create mode 100644 deploy/.next/server/chunks/276.js create mode 100644 deploy/.next/server/chunks/341.js create mode 100644 deploy/.next/server/chunks/682.js create mode 100644 deploy/.next/server/chunks/698.js create mode 100644 deploy/.next/server/chunks/740.js create mode 100644 deploy/.next/server/chunks/87.js create mode 100644 deploy/.next/server/chunks/933.js create mode 100644 deploy/.next/server/chunks/99.js create mode 100644 deploy/.next/server/chunks/font-manifest.json create mode 100644 deploy/.next/server/font-manifest.json create mode 100644 deploy/.next/server/functions-config-manifest.json create mode 100644 deploy/.next/server/interception-route-rewrite-manifest.js create mode 100644 deploy/.next/server/middleware-build-manifest.js create mode 100644 deploy/.next/server/middleware-manifest.json create mode 100644 deploy/.next/server/middleware-react-loadable-manifest.js create mode 100644 deploy/.next/server/next-font-manifest.js create mode 100644 deploy/.next/server/next-font-manifest.json create mode 100644 deploy/.next/server/pages-manifest.json create mode 100644 deploy/.next/server/pages/404.html create mode 100644 deploy/.next/server/pages/500.html create mode 100644 deploy/.next/server/pages/_app.js create mode 100644 deploy/.next/server/pages/_app.js.nft.json create mode 100644 deploy/.next/server/pages/_document.js create mode 100644 deploy/.next/server/pages/_document.js.nft.json create mode 100644 deploy/.next/server/pages/_error.js create mode 100644 deploy/.next/server/pages/_error.js.nft.json create mode 100644 deploy/.next/server/server-reference-manifest.js create mode 100644 deploy/.next/server/server-reference-manifest.json create mode 100644 deploy/.next/server/webpack-runtime.js create mode 100644 deploy/.next/static/3c87ZLiEKCTo7fN65B1s7/_buildManifest.js create mode 100644 deploy/.next/static/3c87ZLiEKCTo7fN65B1s7/_ssgManifest.js create mode 100644 deploy/.next/static/chunks/117-81b684a50b4e5a2c.js create mode 100644 deploy/.next/static/chunks/130-fbdba5ec657d70e2.js create mode 100644 deploy/.next/static/chunks/147.f0c63fadc263cdbf.js create mode 100644 deploy/.next/static/chunks/659-547b5910f7777d12.js create mode 100644 deploy/.next/static/chunks/80.c30ab4050c6d10af.js create mode 100644 deploy/.next/static/chunks/876-74e3127f7295a7cc.js create mode 100644 deploy/.next/static/chunks/app/_not-found/page-93c891698b4decca.js create mode 100644 deploy/.next/static/chunks/app/accueil/page-eeceff806dc9e963.js create mode 100644 deploy/.next/static/chunks/app/admin/login/page-64d4a547eaf512e7.js create mode 100644 deploy/.next/static/chunks/app/admin/page-be00d3b5e7fb599b.js create mode 100644 deploy/.next/static/chunks/app/explorer/page-94fbb37299b728f0.js create mode 100644 deploy/.next/static/chunks/app/infos/page-9c23965cb3e698cb.js create mode 100644 deploy/.next/static/chunks/app/layout-012feff5f2309838.js create mode 100644 deploy/.next/static/chunks/app/mana-tracker/page-190454f13d1cd3f9.js create mode 100644 deploy/.next/static/chunks/app/offline/page-c706c75d3862967d.js create mode 100644 deploy/.next/static/chunks/app/page-66582cb216c486f4.js create mode 100644 deploy/.next/static/chunks/fd9d1056-f29a34e8cb4f1ac5.js create mode 100644 deploy/.next/static/chunks/framework-f66176bb897dc684.js create mode 100644 deploy/.next/static/chunks/main-98da237dfd0126ae.js create mode 100644 deploy/.next/static/chunks/main-app-be78d15d42f0ba33.js create mode 100644 deploy/.next/static/chunks/pages/_app-72b849fbd24ac258.js create mode 100644 deploy/.next/static/chunks/pages/_error-7ba65e1336b92748.js create mode 100644 deploy/.next/static/chunks/polyfills-42372ed130431b0a.js create mode 100644 deploy/.next/static/chunks/polyfills.js create mode 100644 deploy/.next/static/chunks/webpack-272d92e0b8f870de.js create mode 100644 deploy/.next/static/css/37740839d02c8860.css create mode 100644 deploy/.next/static/development/_buildManifest.js create mode 100644 deploy/.next/static/development/_ssgManifest.js create mode 100644 deploy/.next/static/media/19cfc7226ec3afaa-s.woff2 create mode 100644 deploy/.next/static/media/21350d82a1f187e9-s.woff2 create mode 100644 deploy/.next/static/media/8e9860b6e62d6359-s.woff2 create mode 100644 deploy/.next/static/media/ba9851c3c22cd980-s.woff2 create mode 100644 deploy/.next/static/media/c5fe6dc8356a8c31-s.woff2 create mode 100644 deploy/.next/static/media/df0a9ae256c0569c-s.woff2 create mode 100644 deploy/.next/static/media/e4af272ccee01ff0-s.p.woff2 create mode 100644 deploy/.next/trace create mode 100644 deploy/.next/types/app/accueil/page.ts create mode 100644 deploy/.next/types/app/admin/login/page.ts create mode 100644 deploy/.next/types/app/admin/page.ts create mode 100644 deploy/.next/types/app/api/admin/clients/route.ts create mode 100644 deploy/.next/types/app/explorer/page.ts create mode 100644 deploy/.next/types/app/infos/page.ts create mode 100644 deploy/.next/types/app/layout.ts create mode 100644 deploy/.next/types/app/mana-tracker/page.ts create mode 100644 deploy/.next/types/app/offline/page.ts create mode 100644 deploy/.next/types/app/page.ts create mode 100644 deploy/.next/types/package.json create mode 100644 deploy/DEPLOY.md create mode 100644 deploy/data/.gitkeep create mode 100644 deploy/next.config.js create mode 100644 deploy/package-lock.json create mode 100644 deploy/package.json create mode 100644 deploy/public/ICONS_README.md create mode 100644 deploy/public/LOGO_README.md create mode 100644 deploy/public/data/excursions.json create mode 100644 deploy/public/data/infos.json create mode 100644 deploy/public/data/notifications.json create mode 100644 deploy/public/data/places.json create mode 100644 deploy/public/data/sun-times.json create mode 100644 deploy/public/data/tides.json create mode 100644 deploy/public/favicon.ico create mode 100644 deploy/public/logo-relais-marama.svg create mode 100644 deploy/public/manifest.json create mode 100644 deploy/public/sw.js create mode 100755 deploy/start.sh delete mode 100644 lib/admin/auth.ts delete mode 100644 lib/admin/client-utils.ts delete mode 100644 lib/data/clients.json delete mode 100644 lib/hooks/useClientData.ts delete mode 100644 lib/types/client.ts diff --git a/app/accueil/page.tsx b/app/accueil/page.tsx index 9d9ebf9..9c27d67 100644 --- a/app/accueil/page.tsx +++ b/app/accueil/page.tsx @@ -1,53 +1,37 @@ "use client"; -import { Suspense } from "react"; import dynamic from "next/dynamic"; import Layout from "@/components/layout/Layout"; -import WifiCard from "@/components/accueil/WifiCard"; import Logo from "@/components/Logo"; -import { useClientData } from "@/lib/hooks/useClientData"; +import { config } from "@/lib/config"; const WeatherWidget = dynamic(() => import("@/components/accueil/WeatherWidget"), { - loading: () =>
, + loading: () =>
, ssr: false, }); -function AccueilContent() { - const { bungalowNumber, gerantMessage, loading } = useClientData(); - - if (loading) { - return ( - -
-
-
- - ); - } - +export default function AccueilPage() { return (
-

+

Ia Ora Na

-

- Bienvenue au Bungalow {bungalowNumber} +

+ Bienvenue à la Pension Marama

- - -
-

+
+

Le mot du gérant

-

- {gerantMessage} +

+ {config.gerantMessage}

@@ -55,17 +39,3 @@ function AccueilContent() { ); } -export default function AccueilPage() { - return ( - -
-
-
- - }> - - - ); -} - diff --git a/app/admin/login/page.tsx b/app/admin/login/page.tsx deleted file mode 100644 index 2d63f69..0000000 --- a/app/admin/login/page.tsx +++ /dev/null @@ -1,92 +0,0 @@ -"use client"; - -import { useState } from "react"; -import { useRouter } from "next/navigation"; -import { Button } from "@/components/ui/button"; -import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card"; -import Logo from "@/components/Logo"; - -export default function AdminLoginPage() { - const [password, setPassword] = useState(""); - const [error, setError] = useState(""); - const [loading, setLoading] = useState(false); - const router = useRouter(); - - const handleSubmit = async (e: React.FormEvent) => { - e.preventDefault(); - setError(""); - setLoading(true); - - // Vérification simple côté client (la vraie vérification se fait côté serveur) - // Pour l'instant, on stocke le mot de passe dans localStorage - localStorage.setItem("adminPassword", password); - - // Test avec une requête API - try { - const response = await fetch("/api/admin/clients", { - headers: { - Authorization: `Bearer ${password}`, - }, - }); - - if (response.ok) { - router.push("/admin"); - } else if (response.status === 404) { - // API non disponible (mode statique/APK) - accepter quand même - // Le mot de passe sera vérifié côté serveur lors des vraies requêtes - router.push("/admin"); - } else { - setError("Mot de passe incorrect"); - localStorage.removeItem("adminPassword"); - } - } catch (err) { - // Erreur réseau (API non disponible en mode statique/APK) - // Accepter quand même et rediriger - // Le mot de passe sera vérifié côté serveur lors des vraies requêtes - console.warn("API non disponible (mode statique), connexion acceptée localement"); - router.push("/admin"); - } finally { - setLoading(false); - } - }; - - return ( -
- - -
- -
- Administration -
- -
-
- - setPassword(e.target.value)} - className="w-full px-4 py-2 border border-gray-300 rounded-xl focus:ring-2 focus:ring-primary focus:border-transparent" - required - /> -
- - {error && ( -
- {error} -
- )} - - -
-
-
-
- ); -} - diff --git a/app/admin/page.tsx b/app/admin/page.tsx deleted file mode 100644 index e25ab0d..0000000 --- a/app/admin/page.tsx +++ /dev/null @@ -1,97 +0,0 @@ -"use client"; - -import { useState, useEffect } from "react"; -import { useRouter } from "next/navigation"; -import AdminLayout from "@/components/admin/AdminLayout"; -import ClientForm from "@/components/admin/ClientForm"; -import ClientList from "@/components/admin/ClientList"; -import { Button } from "@/components/ui/button"; -import { Plus } from "lucide-react"; -import { Client } from "@/lib/types/client"; - -export default function AdminPage() { - const [showForm, setShowForm] = useState(false); - const [editingClient, setEditingClient] = useState(); - const [refreshKey, setRefreshKey] = useState(0); - const router = useRouter(); - - useEffect(() => { - // Vérifier si l'admin est connecté - const adminPassword = localStorage.getItem("adminPassword"); - if (!adminPassword) { - router.push("/admin/login"); - return; - } - - // Tester la connexion avec l'API (si disponible) - // Si l'API n'est pas disponible (APK statique), on continue quand même - fetch("/api/admin/clients", { - headers: { - Authorization: `Bearer ${adminPassword}`, - }, - }) - .then((res) => { - if (!res.ok && res.status !== 404) { - // Si erreur autre que 404 (API non disponible), déconnecter - if (res.status === 401 || res.status === 403) { - localStorage.removeItem("adminPassword"); - router.push("/admin/login"); - } - } - // Si 404, c'est normal en mode statique (API non disponible) - // On continue l'affichage - }) - .catch(() => { - // Erreur réseau (API non disponible en mode statique) - // C'est normal pour l'APK, on continue - }); - }, [router]); - - const handleNewClient = () => { - setEditingClient(undefined); - setShowForm(true); - }; - - const handleEdit = (client: Client) => { - setEditingClient(client); - setShowForm(true); - }; - - const handleSuccess = () => { - setShowForm(false); - setEditingClient(undefined); - setRefreshKey((k) => k + 1); - }; - - const handleCancel = () => { - setShowForm(false); - setEditingClient(undefined); - }; - - return ( - -
-
-

Gestion des clients

- {!showForm && ( - - )} -
- - {showForm ? ( - - ) : ( - setRefreshKey((k) => k + 1)} /> - )} -
-
- ); -} - diff --git a/app/api/admin/clients/route.ts b/app/api/admin/clients/route.ts deleted file mode 100644 index 9b78cd7..0000000 --- a/app/api/admin/clients/route.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { NextRequest, NextResponse } from "next/server"; -import { writeFile, readFile, mkdir } from "fs/promises"; -import { existsSync } from "fs"; -import path from "path"; -import { Client, ClientInput } from "@/lib/types/client"; - -// Mot de passe admin (à changer en production via variable d'environnement) -const ADMIN_PASSWORD = process.env.ADMIN_PASSWORD || "admin123"; - -// Chemin vers le fichier de stockage -const DATA_DIR = path.join(process.cwd(), "data"); -const CLIENTS_FILE = path.join(DATA_DIR, "clients.json"); - -// Vérifier l'authentification -function verifyAuth(request: NextRequest): boolean { - const authHeader = request.headers.get("authorization"); - if (!authHeader) return false; - - const token = authHeader.replace("Bearer ", ""); - return token === ADMIN_PASSWORD; -} - -// Charger les clients depuis le fichier -async function loadClients(): Promise { - try { - if (!existsSync(CLIENTS_FILE)) { - // Créer le répertoire et le fichier si nécessaire - if (!existsSync(DATA_DIR)) { - await mkdir(DATA_DIR, { recursive: true }); - } - await writeFile(CLIENTS_FILE, JSON.stringify([], null, 2)); - return []; - } - - const data = await readFile(CLIENTS_FILE, "utf-8"); - return JSON.parse(data); - } catch (error) { - console.error("Erreur lecture clients:", error); - return []; - } -} - -// Sauvegarder les clients dans le fichier -async function saveClients(clients: Client[]): Promise { - try { - if (!existsSync(DATA_DIR)) { - await mkdir(DATA_DIR, { recursive: true }); - } - await writeFile(CLIENTS_FILE, JSON.stringify(clients, null, 2)); - } catch (error) { - console.error("Erreur sauvegarde clients:", error); - throw error; - } -} - -// GET - Récupérer tous les clients -export async function GET(request: NextRequest) { - if (!verifyAuth(request)) { - return NextResponse.json({ error: "Non autorisé" }, { status: 401 }); - } - - try { - const clients = await loadClients(); - return NextResponse.json(clients); - } catch (error) { - console.error("Erreur GET clients:", error); - return NextResponse.json( - { error: "Erreur serveur" }, - { status: 500 } - ); - } -} - -// POST - Créer un nouveau client -export async function POST(request: NextRequest) { - if (!verifyAuth(request)) { - return NextResponse.json({ error: "Non autorisé" }, { status: 401 }); - } - - try { - const input: ClientInput = await request.json(); - - // Validation - if (!input.email || !input.bungalowNumber) { - return NextResponse.json( - { error: "Email et numéro de bungalow requis" }, - { status: 400 } - ); - } - - const clients = await loadClients(); - - // Vérifier si l'email existe déjà - if (clients.some(c => c.email === input.email)) { - return NextResponse.json( - { error: "Un client avec cet email existe déjà" }, - { status: 409 } - ); - } - - // Créer le nouveau client - const newClient: Client = { - id: `client-${Date.now()}`, - token: generateToken(), - email: input.email, - bungalowNumber: input.bungalowNumber, - wifiName: input.wifiName || "Lagon-WiFi", - wifiPassword: input.wifiPassword || "", - gerantMessage: input.gerantMessage || "Bienvenue dans notre pension de famille !", - createdAt: new Date().toISOString(), - updatedAt: new Date().toISOString(), - }; - - clients.push(newClient); - await saveClients(clients); - - return NextResponse.json(newClient, { status: 201 }); - } catch (error) { - console.error("Erreur POST client:", error); - return NextResponse.json( - { error: "Erreur serveur" }, - { status: 500 } - ); - } -} - -// Générer un token unique -function generateToken(): string { - return Math.random().toString(36).substring(2, 15) + - Math.random().toString(36).substring(2, 15); -} - diff --git a/app/page.tsx b/app/page.tsx index cce2376..e3a6af9 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,121 +1,20 @@ "use client"; -import { useEffect, useState } from "react"; +import { useEffect } from "react"; import { useRouter } from "next/navigation"; export default function Home() { const router = useRouter(); - const [checked, setChecked] = useState(false); useEffect(() => { - // Détecter si on est dans l'app admin - let isAdminApp = false; - - if (typeof window !== "undefined") { - const Capacitor = (window as any).Capacitor; - - // Méthode 1: Vérifier l'appId de Capacitor via le package name Android - if (Capacitor) { - try { - const platform = Capacitor.getPlatform(); - - if (platform === "android") { - // En Android, on peut récupérer le package name via Capacitor.getApp() - // APK admin: com.pensionmarama.admin - // APK client: com.pensionmarama.app - const App = Capacitor.Plugins?.App; - if (App) { - App.getInfo().then((info: any) => { - // Le package name est dans info.id ou info.appId - const appId = info.id || info.appId || ""; - if (appId.includes("admin")) { - isAdminApp = true; - } - }).catch(() => { - // Fallback si getInfo() échoue - }); - } - - // Fallback: Vérifier le localStorage (si adminPassword existe, c'est admin) - const hasAdminPassword = localStorage.getItem("adminPassword") !== null; - if (hasAdminPassword) { - isAdminApp = true; - } - } else { - // Pour web, vérifier le localStorage - const hasAdminPassword = localStorage.getItem("adminPassword") !== null; - if (hasAdminPassword) { - isAdminApp = true; - } - } - } catch (e) { - // En cas d'erreur, fallback sur les autres méthodes - console.warn("Erreur lors de la détection Capacitor:", e); - } - } - - // Méthode 2: Vérifier le path ou query string (pour web) - if (!isAdminApp && ( - window.location.pathname.startsWith("/admin") || - window.location.search.includes("admin=true") - )) { - isAdminApp = true; - } - - // Méthode 3: Si on est dans Capacitor Android sans adminPassword, - // on considère que c'est l'app client (redirige vers /accueil) - // Sauf si le pathname commence par /admin - } - - if (isAdminApp) { - // Vérifier si l'admin est connecté - const adminPassword = typeof window !== "undefined" ? - localStorage.getItem("adminPassword") : null; - - if (adminPassword) { - // Tester la connexion (si API disponible) - fetch("/api/admin/clients", { - headers: { - Authorization: `Bearer ${adminPassword}`, - }, - }) - .then((res) => { - if (res.ok) { - router.replace("/admin"); - } else if (res.status === 404) { - // API non disponible (mode statique) - accepter quand même - router.replace("/admin"); - } else { - localStorage.removeItem("adminPassword"); - router.replace("/admin/login"); - } - }) - .catch(() => { - // Erreur réseau (API non disponible en mode statique) - // Accepter quand même et rediriger vers /admin - router.replace("/admin"); - }); - } else { - // Pas de mot de passe, rediriger vers login - router.replace("/admin/login"); - } - } else { - // App client normale - router.replace("/accueil"); - } - setChecked(true); + router.replace("/accueil"); }, [router]); - if (!checked) { - return ( -
-
-

Chargement...

-
+ return ( +
+
+

Redirection...

- ); - } - - return null; +
+ ); } - diff --git a/components/accueil/WifiCard.tsx b/components/accueil/WifiCard.tsx deleted file mode 100644 index 72c67ef..0000000 --- a/components/accueil/WifiCard.tsx +++ /dev/null @@ -1,129 +0,0 @@ -"use client"; - -import { useState, useEffect } from "react"; -import { Wifi, Copy, Check, AlertCircle } from "lucide-react"; -import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card"; -import { Button } from "@/components/ui/button"; -import { useClientData } from "@/lib/hooks/useClientData"; - -export default function WifiCard() { - const { wifiName, wifiPassword, loading } = useClientData(); - const [copied, setCopied] = useState(false); - const [error, setError] = useState(null); - - // Fonction de copie avec fallback pour les navigateurs qui ne supportent pas l'API Clipboard - const copyToClipboard = async (text: string): Promise => { - // Méthode moderne (nécessite HTTPS ou localhost) - if (navigator.clipboard && window.isSecureContext) { - try { - await navigator.clipboard.writeText(text); - return true; - } catch (err) { - console.error("Erreur avec l'API Clipboard:", err); - } - } - - // Fallback pour les navigateurs plus anciens ou contextes non sécurisés - try { - const textArea = document.createElement("textarea"); - textArea.value = text; - textArea.style.position = "fixed"; - textArea.style.left = "-999999px"; - textArea.style.top = "-999999px"; - document.body.appendChild(textArea); - textArea.focus(); - textArea.select(); - - const successful = document.execCommand("copy"); - document.body.removeChild(textArea); - - if (successful) { - return true; - } else { - throw new Error("La commande copy a échoué"); - } - } catch (err) { - console.error("Erreur avec la méthode fallback:", err); - return false; - } - }; - - const handleCopyPassword = async () => { - if (!wifiPassword || wifiPassword.trim() === "") { - setError("Le mot de passe WiFi n'est pas disponible"); - setTimeout(() => setError(null), 3000); - return; - } - - setError(null); - const success = await copyToClipboard(wifiPassword); - - if (success) { - setCopied(true); - setTimeout(() => setCopied(false), 2000); - } else { - setError("Impossible de copier. Veuillez sélectionner manuellement le mot de passe ci-dessous."); - setTimeout(() => setError(null), 5000); - } - }; - - // Afficher le mot de passe en cas d'échec de la copie - const showPasswordFallback = error && error.includes("sélectionner manuellement"); - - return ( - - - - - Connexion WiFi - - - -
-

Nom du réseau

-

{wifiName || "Chargement..."}

-
- - {showPasswordFallback && wifiPassword && ( -
-

- {wifiPassword} -

-
- )} - - {error && !showPasswordFallback && ( -
- -

{error}

-
- )} - - -
-
- ); -} - diff --git a/components/admin/AdminLayout.tsx b/components/admin/AdminLayout.tsx deleted file mode 100644 index d7c9a9e..0000000 --- a/components/admin/AdminLayout.tsx +++ /dev/null @@ -1,34 +0,0 @@ -"use client"; - -import { LogOut } from "lucide-react"; -import { Button } from "@/components/ui/button"; -import { useRouter } from "next/navigation"; -import { ThemeToggle } from "@/components/ThemeToggle"; - -export default function AdminLayout({ children }: { children: React.ReactNode }) { - const router = useRouter(); - - const handleLogout = () => { - localStorage.removeItem("adminPassword"); - router.push("/admin/login"); - }; - - return ( -
-
-
-

Administration

-
- - -
-
-
-
{children}
-
- ); -} - diff --git a/components/admin/ClientForm.tsx b/components/admin/ClientForm.tsx deleted file mode 100644 index ea1ee14..0000000 --- a/components/admin/ClientForm.tsx +++ /dev/null @@ -1,264 +0,0 @@ -"use client"; - -import { useState } from "react"; -import { Button } from "@/components/ui/button"; -import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card"; -import { Client, ClientInput } from "@/lib/types/client"; -import QRCodeDisplay from "./QRCodeDisplay"; -import { Copy, Check } from "lucide-react"; - -interface ClientFormProps { - client?: Client; - onSuccess: () => void; - onCancel: () => void; -} - -export default function ClientForm({ client, onSuccess, onCancel }: ClientFormProps) { - const [formData, setFormData] = useState({ - email: client?.email || "", - bungalowNumber: client?.bungalowNumber || "", - wifiName: client?.wifiName || "Lagon-WiFi", - wifiPassword: client?.wifiPassword || "", - gerantMessage: client?.gerantMessage || "Bienvenue dans notre pension de famille !", - }); - - const [loading, setLoading] = useState(false); - const [error, setError] = useState(null); - const [createdClient, setCreatedClient] = useState(client || null); - const [copied, setCopied] = useState(false); - - const handleSubmit = async (e: React.FormEvent) => { - e.preventDefault(); - setLoading(true); - setError(null); - - try { - const adminPassword = localStorage.getItem("adminPassword") || ""; - const url = client - ? `/api/admin/clients/${client.id}` - : "/api/admin/clients"; - - const method = client ? "PUT" : "POST"; - - const response = await fetch(url, { - method, - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${adminPassword}`, - }, - body: JSON.stringify(formData), - }); - - if (!response.ok) { - const data = await response.json(); - throw new Error(data.error || "Erreur lors de la sauvegarde"); - } - - const data = await response.json(); - setCreatedClient(data); - onSuccess(); - } catch (err: any) { - setError(err.message); - } finally { - setLoading(false); - } - }; - - const getClientUrl = () => { - if (!createdClient) return ""; - const baseUrl = typeof window !== "undefined" ? window.location.origin : ""; - return `${baseUrl}/accueil?token=${createdClient.token}`; - }; - - const handleCopyLink = async () => { - const url = getClientUrl(); - try { - await navigator.clipboard.writeText(url); - setCopied(true); - // Alerte pour confirmer - alert(`✅ Lien copié !\n\n${url}\n\nVous pouvez maintenant le coller (Ctrl+V) pour le partager avec votre client.`); - setTimeout(() => setCopied(false), 3000); - } catch (err) { - console.error("Erreur lors de la copie:", err); - // Fallback pour les navigateurs plus anciens - const textArea = document.createElement("textarea"); - textArea.value = url; - textArea.style.position = "fixed"; - textArea.style.left = "-999999px"; - document.body.appendChild(textArea); - textArea.select(); - try { - const successful = document.execCommand("copy"); - if (successful) { - setCopied(true); - alert(`✅ Lien copié !\n\n${url}\n\nVous pouvez maintenant le coller (Ctrl+V) pour le partager avec votre client.`); - setTimeout(() => setCopied(false), 3000); - } else { - alert(`❌ Copie automatique non supportée.\n\nVeuillez copier manuellement le lien:\n\n${url}`); - } - } catch (e) { - alert(`❌ Copie automatique non supportée.\n\nVeuillez copier manuellement le lien:\n\n${url}`); - } - document.body.removeChild(textArea); - } - }; - - return ( - - - {client ? "Modifier le client" : "Nouveau client"} - - -
-
- - setFormData({ ...formData, email: e.target.value })} - disabled={!!client} - className="w-full px-4 py-2 border border-gray-300 rounded-xl focus:ring-2 focus:ring-primary focus:border-transparent disabled:bg-gray-100" - /> -
- -
- - - setFormData({ ...formData, bungalowNumber: e.target.value }) - } - className="w-full px-4 py-2 border border-gray-300 rounded-xl focus:ring-2 focus:ring-primary focus:border-transparent" - /> -
- -
- - - setFormData({ ...formData, wifiName: e.target.value }) - } - className="w-full px-4 py-2 border border-gray-300 rounded-xl focus:ring-2 focus:ring-primary focus:border-transparent" - /> -
- -
- - - setFormData({ ...formData, wifiPassword: e.target.value }) - } - className="w-full px-4 py-2 border border-gray-300 rounded-xl focus:ring-2 focus:ring-primary focus:border-transparent" - /> -
- -
- -