@@ -305,7 +339,7 @@ const VpsManager = ({ details, orderId, onRefresh, onClose }) => {
// ============================================================================
// COMPOSANT 4 : WEB MANAGER (HestiaCP & Day-2 Operations)
// ============================================================================
-const WebManager = ({ details, orderId, onRefresh, onOpenSso }) => {
+const WebManager = ({ details, orderId, onRefresh, onOpenSso, onAlert }) => {
const [isEditingDomain, setIsEditingDomain] = useState(false);
const [newDomain, setNewDomain] = useState(details.domain);
const [isUpdating, setIsUpdating] = useState(false);
@@ -328,10 +362,10 @@ const WebManager = ({ details, orderId, onRefresh, onOpenSso }) => {
if (data.status === 'success') {
setIsEditingDomain(false);
if (onRefresh) onRefresh();
- alert("Domaine web mis à jour avec succès sur le serveur HestiaCP !");
- } else alert("Erreur: " + data.error);
+ onAlert("Succès", "Domaine web mis à jour avec succès sur le serveur HestiaCP !", "success");
+ } else onAlert("Erreur", data.error, "error");
} catch (err) {
- alert("Erreur de connexion avec l'API.");
+ onAlert("Erreur", "Erreur de connexion avec l'API.", "error");
} finally { setIsUpdating(false); }
};
@@ -346,10 +380,10 @@ const WebManager = ({ details, orderId, onRefresh, onOpenSso }) => {
const data = await response.json();
if (data.status === 'success') {
setSslStatus('success');
- alert("Certificat SSL Let's Encrypt généré !");
+ onAlert("SSL Validé", "Certificat SSL Let's Encrypt généré !", "success");
} else {
setSslStatus('error');
- alert("Échec Let's Encrypt. Vérifiez vos DNS.");
+ onAlert("Erreur DNS", "Échec Let's Encrypt. Vérifiez vos DNS.", "error");
}
} catch (e) { setSslStatus('error'); }
};
@@ -360,11 +394,9 @@ const WebManager = ({ details, orderId, onRefresh, onOpenSso }) => {
const secureHash = Math.random().toString(36).slice(-8) + Math.random().toString(36).slice(-4).toUpperCase();
const rollingPassword = `Nx${secureHash}`;
await resetHostingPassword(orderId, rollingPassword);
-
- // On déclenche le modal SSO du composant parent
onOpenSso({ username: details.username, password: rollingPassword, url: 'https://panel.gise.be/login/' });
} catch (err) {
- alert("Erreur lors de la génération du SSO HestiaCP.");
+ onAlert("Erreur Métal", "Erreur lors de la génération du SSO HestiaCP.", "error");
} finally {
setIsGeneratingSso(false);
}
@@ -438,11 +470,15 @@ export default function Services() {
const [newVpcName, setNewVpcName] = useState("");
const [isConnecting, setIsConnecting] = useState(null);
const [ssoVault, setSsoVault] = useState(null);
- const [activeServiceModal, setActiveServiceModal] = useState(null); // Gère VPS et WEB
+ const [activeServiceModal, setActiveServiceModal] = useState(null);
+ const [customAlert, setCustomAlert] = useState(null); // Gère les pop-ups personnalisés
const { vpcs, createVPC, deleteVPC, assignToVPC, removeFromVPC } = useVPC();
- // Fonction extraite pour pouvoir être rappelée par les Managers
+ const triggerAlert = (title, message, type = "info") => {
+ setCustomAlert({ title, message, type });
+ };
+
const fetchServices = useCallback(async () => {
try {
const data = await getMyServices();
@@ -495,12 +531,11 @@ export default function Services() {
} else if (isDB) {
window.open('https://pma.gise.be/', '_blank');
} else if (isVPS || isWeb) {
- // Pour VPS et Web, on récupère les détails frais et on ouvre le Modal Générique
const freshDetails = await getHostingServiceDetails(service.id);
setActiveServiceModal({ type: isVPS ? 'vps' : 'web', data: service, details: freshDetails });
}
} catch (err) {
- alert("Échec du protocole : " + err.message);
+ triggerAlert("Erreur d'Orchestration", "Échec du protocole : " + err.message, "error");
} finally {
setIsConnecting(null);
}
@@ -521,7 +556,7 @@ export default function Services() {
@@ -540,7 +575,7 @@ export default function Services() {
{vpc.name.toUpperCase()}
{vpcServices.length} INSTANCES