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
Python 51.9%
TypeScript 32.7%
JavaScript 4.8%
CSS 4.1%
Shell 2.9%
HTML 1.8%
SQL 1.5%
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