'use client'; import { useState } from 'react'; import { Button } from '@/components/ui/Button'; import { Card, CardHeader, CardContent } from '@/components/ui/Card'; import { Badge } from '@/components/ui/Badge'; import { jiraClient } from '@/clients/jira-client'; import { JiraSyncResult } from '@/services/jira'; interface JiraSyncProps { onSyncComplete?: () => void; className?: string; } export function JiraSync({ onSyncComplete, className = "" }: JiraSyncProps) { const [isConnected, setIsConnected] = useState(null); const [isLoading, setIsLoading] = useState(false); const [isSyncing, setIsSyncing] = useState(false); const [lastSyncResult, setLastSyncResult] = useState(null); const [error, setError] = useState(null); const testConnection = async () => { setIsLoading(true); setError(null); try { const status = await jiraClient.testConnection(); setIsConnected(status.connected); if (!status.connected) { setError(status.message); } } catch (err) { setIsConnected(false); setError(err instanceof Error ? err.message : 'Erreur de connexion'); } finally { setIsLoading(false); } }; const startSync = async () => { setIsSyncing(true); setError(null); try { const result = await jiraClient.syncTasks(); setLastSyncResult(result); if (result.success) { onSyncComplete?.(); } } catch (err) { setError(err instanceof Error ? err.message : 'Erreur de synchronisation'); } finally { setIsSyncing(false); } }; const getConnectionStatus = () => { if (isConnected === null) return null; return isConnected ? ( ✓ Connecté ) : ( ✗ Déconnecté ); }; const getSyncStatus = () => { if (!lastSyncResult) return null; const { success, tasksCreated, tasksUpdated, tasksSkipped, errors } = lastSyncResult; return (
{success ? "✓ Succès" : "⚠ Erreurs"} {new Date().toLocaleTimeString()}
{tasksCreated}
Créées
{tasksUpdated}
Mises à jour
{tasksSkipped}
Ignorées
{errors.length > 0 && (
Erreurs:
{errors.map((err, i) => (
{err}
))}
)}
); }; return (

JIRA SYNC

{getConnectionStatus()}
{/* Test de connexion */}
{/* Messages d'erreur */} {error && (
{error}
)} {/* Résultats de sync */} {getSyncStatus()} {/* Info */}
• Synchronisation unidirectionnelle (Jira → TowerControl)
• Les modifications locales sont préservées
• Seuls les tickets assignés sont synchronisés
); }