import React, { useCallback, useEffect, useState } from "react"; import { http, getActiveBase, BACKEND_URL, getSessionToken } from "../lib/api"; import { frontendUrl } from "../lib/paths"; import { Github, Link2, Unlink, RefreshCw } from "lucide-react"; import { toast } from "sonner"; const PROVIDER_ICONS = { github: Github, google: () => ( ), }; export default function ConnectedAccountsPanel() { const [accounts, setAccounts] = useState([]); const [loading, setLoading] = useState(true); const [busy, setBusy] = useState(null); const load = useCallback(async () => { setLoading(true); try { const r = await http.get("/connections"); setAccounts(r.data?.accounts || []); } catch (e) { toast.error(e?.response?.data?.detail || "Impossible de charger les comptes"); } finally { setLoading(false); } }, []); useEffect(() => { load(); }, [load]); const connect = (provider) => { const base = (getActiveBase() || BACKEND_URL || "").replace(/\/$/, ""); if (!base) { toast.error("Backend indisponible"); return; } const returnUrl = frontendUrl("/auth/connections/callback"); const qs = new URLSearchParams({ return_url: returnUrl }); const session = getSessionToken(); if (session) qs.set("session", session); window.location.href = `${base}/api/oauth/${provider}/start?${qs.toString()}`; }; const disconnect = async (provider) => { if (!window.confirm(`Déconnecter ${provider} ?`)) return; setBusy(provider); try { await http.delete(`/connections/${provider}`); toast.success("Compte déconnecté"); await load(); } catch (e) { toast.error(e?.response?.data?.detail || "Erreur"); } finally { setBusy(null); } }; if (loading) { return (
Lie GitHub ou Google pour qu'Émo agisse avec tes comptes (tokens côté serveur uniquement).
{acc.label || acc.provider}
{connected && display ? (Connecté en tant que {display}
) : configured ? (Non connecté
) : ({acc.message || "Configure keys on server"}
)}