Ajout du système d'administration avec token unique et QR code
- 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
This commit is contained in:
96
lib/hooks/useClientData.ts
Normal file
96
lib/hooks/useClientData.ts
Normal file
@ -0,0 +1,96 @@
|
||||
"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]);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user