- Implémentation complète du système d'administration (/admin) - Gestion des clients avec base de données JSON - Génération de token unique et QR code pour chaque client - Intégration des données client dans l'application (bungalow, WiFi, message) - Amélioration du composant WifiCard avec fallback de copie - Optimisation du hook useClientData pour chargement immédiat - Ajout de la variable d'environnement ADMIN_PASSWORD
97 lines
2.9 KiB
TypeScript
97 lines
2.9 KiB
TypeScript
"use client";
|
|
|
|
import { useState, useEffect, useMemo } from "react";
|
|
import { useSearchParams } from "next/navigation";
|
|
import { config } from "@/lib/config";
|
|
|
|
export interface ClientData {
|
|
bungalowNumber: string;
|
|
wifiName: string;
|
|
wifiPassword: string;
|
|
gerantMessage: string;
|
|
}
|
|
|
|
const STORAGE_KEY = "clientData";
|
|
|
|
function loadFromStorage(): ClientData | null {
|
|
if (typeof window === "undefined") return null;
|
|
|
|
try {
|
|
const stored = localStorage.getItem(STORAGE_KEY);
|
|
if (stored) {
|
|
return JSON.parse(stored);
|
|
}
|
|
} catch (error) {
|
|
console.error("Erreur lors du chargement depuis localStorage:", error);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
export function useClientData() {
|
|
const searchParams = useSearchParams();
|
|
// Charger immédiatement depuis localStorage pour éviter le délai
|
|
const [clientData, setClientData] = useState<ClientData | null>(() => loadFromStorage());
|
|
const [loading, setLoading] = useState(true);
|
|
|
|
useEffect(() => {
|
|
const loadClientData = async () => {
|
|
// 1. Charger d'abord depuis localStorage pour un affichage immédiat
|
|
const storedData = loadFromStorage();
|
|
if (storedData) {
|
|
setClientData(storedData);
|
|
setLoading(false);
|
|
}
|
|
|
|
// 2. Vérifier s'il y a un token dans l'URL
|
|
const token = searchParams.get("token");
|
|
|
|
if (token) {
|
|
try {
|
|
// 3. Charger les données depuis l'API pour mettre à jour
|
|
const response = await fetch(`/api/client/${token}`);
|
|
if (response.ok) {
|
|
const data = await response.json();
|
|
const clientInfo: ClientData = {
|
|
bungalowNumber: data.bungalowNumber,
|
|
wifiName: data.wifiName,
|
|
wifiPassword: data.wifiPassword,
|
|
gerantMessage: data.gerantMessage,
|
|
};
|
|
|
|
// 4. Sauvegarder dans localStorage
|
|
if (typeof window !== "undefined") {
|
|
localStorage.setItem(STORAGE_KEY, JSON.stringify(clientInfo));
|
|
}
|
|
setClientData(clientInfo);
|
|
} else {
|
|
// Token invalide, garder les données sauvegardées si disponibles
|
|
if (!storedData) {
|
|
setClientData(null);
|
|
}
|
|
}
|
|
} catch (error) {
|
|
console.error("Erreur lors du chargement des données client:", error);
|
|
// En cas d'erreur, garder les données sauvegardées si disponibles
|
|
if (!storedData) {
|
|
setClientData(null);
|
|
}
|
|
}
|
|
}
|
|
|
|
setLoading(false);
|
|
};
|
|
|
|
loadClientData();
|
|
}, [searchParams]);
|
|
|
|
// Retourner les données client ou les valeurs par défaut
|
|
return useMemo(() => ({
|
|
bungalowNumber: clientData?.bungalowNumber || config.bungalowNumber,
|
|
wifiName: clientData?.wifiName || config.wifiName,
|
|
wifiPassword: clientData?.wifiPassword || config.wifiPassword,
|
|
gerantMessage: clientData?.gerantMessage || config.gerantMessage,
|
|
loading,
|
|
}), [clientData, loading]);
|
|
}
|
|
|