// ----------------------------------------------------------------------------- // Author: Simon-Pierre Boucher // Contact: contact@spboucher.ai // Project: Toit-Ka // pages/Profil.tsx : profil utilisateur — carte de membre Groupe KA (KA-ID), // profil Groupe KA en lecture seule (saisi au hub groupe-ka.com), actions. // ----------------------------------------------------------------------------- import { useEffect, useState } from "react"; import { useNavigate } from "react-router-dom"; import { fetchMe, logout } from "../api"; import type { Socials, User } from "../api"; import { Ico } from "../components/Icons"; const fmtEpoch = (ts: number | null | undefined): string => { if (!ts) return "—"; return new Date(ts * 1000).toLocaleDateString("fr-CA", { day: "numeric", month: "long", year: "numeric", }).replace(/^1 /, "1ᵉʳ "); }; const SOCIAL_BASE: Record = { instagram: "https://www.instagram.com/", facebook: "https://www.facebook.com/", x: "https://x.com/", linkedin: "https://www.linkedin.com/in/", tiktok: "https://www.tiktok.com/@", youtube: "https://www.youtube.com/@", }; function socialUrl(key: string, value: string): string { const v = value.trim(); if (/^https?:\/\//i.test(v)) return v; if (key === "website") return `https://${v}`; return (SOCIAL_BASE[key] ?? "https://") + v.replace(/^@/, ""); } const SOCIAL_FIELDS: { key: keyof Socials; label: string }[] = [ { key: "instagram", label: "Instagram" }, { key: "facebook", label: "Facebook" }, { key: "x", label: "X (Twitter)" }, { key: "linkedin", label: "LinkedIn" }, { key: "tiktok", label: "TikTok" }, { key: "youtube", label: "YouTube" }, ]; /** Profil géré au HUB Groupe KA — LECTURE SEULE (édition sur groupe-ka.com). */ function HubProfileSection({ me }: { me: User }) { const socialLinks = SOCIAL_FIELDS.filter((s) => (me.socials?.[s.key] ?? "").trim()); return (

Mon profil Groupe KA

{me.bio &&

{me.bio}

}
{(me.job_title || me.company) && ( {[me.job_title, me.company].filter(Boolean).join(" · ")} )} {me.city && {me.city}} {me.age != null && {me.age} ans} {me.website && ( Site web ↗ )} {socialLinks.map((s) => ( {s.label} ))}
Modifier mon profil sur groupe-ka.com ↗

Votre profil est géré au niveau du groupe : une seule saisie, visible sur toutes les plateformes du Groupe KA.

); } export default function ProfilPage() { const [me, setMe] = useState(undefined); const [copied, setCopied] = useState(false); const nav = useNavigate(); useEffect(() => { fetchMe().then((r) => setMe(r.user)).catch(() => setMe(null)); }, []); const copyKaId = async () => { if (!me?.ka_id) return; try { await navigator.clipboard.writeText(me.ka_id); setCopied(true); setTimeout(() => setCopied(false), 1800); } catch { /* presse-papiers indisponible */ } }; if (me === undefined) { return
Chargement…
; } if (me === null) { return (
Mon compte

Connectez-vous pour votre profil.

Connectez-vous avec votre compte KA ID — vous recevrez votre identifiant de membre, valide dans tout l'écosystème Groupe KA.

Se connecter avec KA ID
); } return (
Mon compte

{me.name ? <>Salut, {me.name.split(" ")[0]}. : <>Votre profil.}

{/* ——— Carte de membre Groupe KA ——— */}
Groupe KA Carte de membre · Groupe KA
KA-ID {me.ka_id || "—"}
{me.name || me.email} {me.role_label && ( {me.role_label} )} Membre depuis le {fmtEpoch(me.created_at)}
{me.picture && ( )}
{/* ——— Informations ——— */}
Nom {me.name || "—"}
Courriel {me.email || "—"}
Identifiant membre {me.ka_id || me.sub}
Connexion KA ID (groupe-ka.com)
{me.city && (
Ville {me.city}
)} {me.role_label && (
Statut {me.role_label}
)}
Membre depuis {fmtEpoch(me.created_at)}
Dernière connexion {fmtEpoch(me.last_login)}
{me.profile_source === "groupe-ka" && } {me.profile_source === "groupe-ka" && me.public && me.public_url && (

Votre profil public :{" "} {me.public_url.replace(/^https?:\/\//, "")} {" "} — la visibilité se gère sur groupe-ka.com/compte.

)}

Votre KA-ID est votre identifiant unique dans l'écosystème{" "} Groupe KA {" "} — il vous suit sur toutes les plateformes du groupe. Toit-Ka ne conserve que les informations de ce profil ; rien d'autre, et jamais revendues.

); }