SPB Git forge

spb/trouve-ka

Public ★ Pinned

Trouve-KA — moteur de recherche web indépendant, Québec-first. Crawler distribué, index OpenSearch, ranking bilingue, galerie d'images. En prod : www.trouve-ka.com

40commits 1branches 0releases
9.2 MBsize
maindefault branch
23 days agolast push
Python 51.9% TypeScript 32.7% JavaScript 4.8% CSS 4.1% Shell 2.9% HTML 1.8% SQL 1.5%
2.4 KB · 86 lines tsx
Raw Blame History
1/**2 * Trouve-KA — bouton compte KA ID (header)3 * Author: Simon-Pierre Boucher4 * Contact: contact@spboucher.ai5 *6 * « Se connecter avec KA » : délègue l'identité au hub groupe-ka.com via7 * /api/auth/ka/login (SSO KA ID). Une fois connecté : nom + déconnexion.8 * La création de compte se fait TOUJOURS sur le hub (groupe-ka.com/connexion).9 */1011"use client";1213import { useEffect, useState } from "react";14import { usePathname } from "next/navigation";1516type KaUser = {17  ka_id: string;18  email: string;19  name: string;20  picture: string;21};2223export function AuthButton() {24  const [user, setUser] = useState<KaUser | null>(null);25  const [ready, setReady] = useState(false);26  const pathname = usePathname();2728  useEffect(() => {29    let active = true;30    fetch("/api/auth/me", { cache: "no-store" })31      .then((r) => (r.ok ? r.json() : { user: null }))32      .then((d: { user: KaUser | null }) => {33        if (active) setUser(d.user);34      })35      .catch(() => {})36      .finally(() => {37        if (active) setReady(true);38      });39    return () => {40      active = false;41    };42  }, []);4344  const logout = async () => {45    try {46      await fetch("/api/auth/logout", { method: "POST" });47    } catch {48      /* réseau indisponible : on recharge quand même */49    }50    location.reload();51  };5253  if (!ready) {54    return <span className="inline-block h-[44px] w-[150px]" aria-hidden="true" />;55  }5657  if (user) {58    return (59      <span className="flex items-center gap-2">60        <span61          className="gk-display hidden max-w-[140px] truncate text-[13px] font-bold text-ink sm:inline"62          title={user.email || user.ka_id}63        >64          {user.name || "Membre KA"}65        </span>66        <button67          type="button"68          onClick={logout}69          className="gk-display inline-flex min-h-[44px] items-center rounded-full border-[1.5px] border-ink bg-surface px-4 text-[13px] font-bold text-ink transition-colors hover:bg-[var(--accent-soft)]"70        >71          Se déconnecter72        </button>73      </span>74    );75  }7677  return (78    <a79      href={`/api/auth/ka/login?next=${encodeURIComponent(pathname || "/")}`}80      className="gk-display inline-flex min-h-[44px] items-center whitespace-nowrap rounded-full border-[1.5px] border-ink bg-[var(--btn-primary-bg)] px-4 text-[13px] font-bold text-[var(--btn-primary-fg)] transition-colors hover:bg-[var(--btn-primary-hover)]"81    >82      Se connecter avec KA83    </a>84  );85}86