import React, { useState, useEffect } from 'react';
import {
ScrollText,
RefreshCw,
Clock,
User,
ChevronDown,
ChevronUp,
CheckCircle2,
XCircle,
Loader,
} from 'lucide-react';
import { getDeployments } from '../utils/api';
import StatusBadge from '../components/StatusBadge';
function formatDate(dateStr) {
if (!dateStr) return 'N/A';
try {
return new Date(dateStr).toLocaleString('fr-FR');
} catch {
return dateStr;
}
}
function DeploymentEntry({ deployment }) {
const [expanded, setExpanded] = useState(false);
const statusIcon = {
success: ,
failed: ,
running: ,
};
return (
setExpanded(!expanded)}
>
{statusIcon[deployment.status] || statusIcon.running}
{deployment.message}
{formatDate(deployment.timestamp)}
{deployment.user && (
{deployment.user}
)}
{deployment.duration && (
Durée: {deployment.duration}s
)}
{expanded ? (
) : (
)}
{expanded && deployment.logs && (
)}
);
}
export default function DeploymentsPage() {
const [deployments, setDeployments] = useState([]);
const [loading, setLoading] = useState(true);
const fetchDeployments = async () => {
setLoading(true);
try {
const res = await getDeployments();
setDeployments(res.data);
} catch (err) {
console.error('Erreur chargement déploiements:', err);
} finally {
setLoading(false);
}
};
useEffect(() => {
fetchDeployments();
const interval = setInterval(fetchDeployments, 10000);
return () => clearInterval(interval);
}, []);
return (
{/* Header */}
Historique des déploiements
Consultez les logs des derniers déploiements
{/* Deployments List */}
{loading && deployments.length === 0 ? (
) : deployments.length === 0 ? (
Aucun déploiement
L'historique des déploiements apparaîtra ici après le premier
redéploiement
) : (
{deployments.map((d) => (
))}
)}
);
}