import { useState, useEffect } from 'react'; import { getClientProfile, getClientOrders, getOrderService } from '../../services/api'; export default function Dashboard() { const [profile, setProfile] = useState(null); const [orders, setOrders] = useState([]); const [error, setError] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { const fetchDashboardData = async () => { try { // On lance les deux requêtes en même temps pour aller plus vite const profileData = await getClientProfile(); const ordersData = await getClientOrders(); setProfile(profileData); // FOSSBilling renvoie une liste paginée, on prend le tableau 'list' setOrders(ordersData.list || []); } catch (err) { setError(err.message || "Erreur de synchronisation avec le serveur central."); } finally { setLoading(false); } }; fetchDashboardData(); }, []); const cardStyle = { backgroundColor: '#1A1A1A', border: '1px solid #333', padding: '20px', borderRadius: '4px', display: 'flex', flexDirection: 'column', gap: '10px' }; const handleManageInstance = async (orderId) => { try { console.log(`[SYS] Demande d'accès au service #${orderId}...`); const serviceData = await getOrderService(orderId); if (serviceData && serviceData.server && serviceData.server.login_url) { window.open(serviceData.server.login_url, '_blank'); } else if (serviceData && serviceData.server) { console.log(serviceData); // L'URL d'action du formulaire de connexion HestiaCP const hestiaLoginUrl = "https://panel.gise.be/login/"; const username = serviceData.username; const password = serviceData.password; if (!username || !password) { alert("Identifiants introuvables. Le serveur est-il bien provisionné ?"); return; } console.log("[SYS] Création du pont SSO vers HestiaCP..."); // 1. On crée un formulaire invisible const form = document.createElement('form'); form.method = 'POST'; form.action = hestiaLoginUrl; form.target = '_blank'; // Pour ouvrir dans un nouvel onglet // 2. On crée le champ utilisateur (Hestia attend le nom 'user') const userField = document.createElement('input'); userField.type = 'hidden'; userField.name = 'user'; userField.value = username; // 3. On crée le champ mot de passe (Hestia attend le nom 'password') const passField = document.createElement('input'); passField.type = 'hidden'; passField.name = 'password'; passField.value = password; // 4. On assemble et on injecte dans la page form.appendChild(userField); form.appendChild(passField); document.body.appendChild(form); // 5. On valide le formulaire (BAM ! Connexion) form.submit(); // 6. On efface les traces du formulaire fantôme pour la sécurité document.body.removeChild(form); } else { alert("Configuration serveur introuvable pour cette instance."); } } catch (err) { alert(`[ERREUR D'ACCÈS] : ${err.message}`); } }; return (
{/* HEADER DU DASHBOARD */}

CENTRE DE CONTRÔLE GISE

{profile && (
Opérateur : {profile.email}
Crédits : {profile.balance} {profile.currency}
)}
{loading &&

[ Synchronisation des données en cours... ]

} {error && (
[ ERREUR ] : {error}
)} {/* ZONE DES SERVICES ACTIFS */} {!loading && !error && ( <>

INFRASTRUCTURE ACTIVE

{orders.length === 0 ? (
Aucun service actif détecté.

) : (
{orders.map((order) => (
{order.title} {order.status}
Renouvellement : {order.expires_at || 'N/A'}
Montant : {order.total} {order.currency}
))}
)} )}
); }