// ----------------------------------------------------------------------------- // Fabri-Ka — Agrégateur de produits québécois // Auteur : Simon-Pierre Boucher — contact@spboucher.ai // pages/Profile.tsx : profil utilisateur — carte de membre Groupe KA (KA-ID), // profil Groupe KA en lecture seule (bio, emploi, ville, âge, site, réseaux // sociaux — géré sur groupe-ka.com), informations du compte, actions // ----------------------------------------------------------------------------- import { useEffect, useState } from 'react' import { useNavigate } from 'react-router-dom' import { fetchMe, logout, type Me, type Socials } from '../api' 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/@', } const SOCIAL_LABELS: { 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' }, ] /** « @pseudo » ou « pseudo » -> URL complète de la plateforme ; URL laissée telle quelle */ 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(/^@/, '') } /** Profil géré au HUB Groupe KA — LECTURE SEULE (l'édition se fait sur * groupe-ka.com/compte, une seule saisie pour les huit plateformes). */ function HubProfileSection({ me }: { me: Me }) { const socials = SOCIAL_LABELS.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 ↗ )} {socials.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 les huit plateformes du groupe.

) } export default function Profile() { const [me, setMe] = useState(undefined) // undefined = chargement const [copied, setCopied] = useState(false) const navigate = 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 : tant pis */ } } if (me === undefined) { return (

Chargement…

) } if (me === null) { return (

Mon profil

Connectez-vous avec votre compte KA ID — le même identifiant de membre sur toutes les plateformes du Groupe KA.

Se connecter avec KA ID
) } return (

{me.name ? <>Salut, {me.name.split(' ')[0]}. : <>Mon 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)}
{me.picture && ( )}
{/* ——— Profil Groupe KA (lecture seule, géré sur groupe-ka.com) ——— */} {me.profile_source === 'groupe-ka' && } {/* ——— Informations ——— */}
Nom {me.name || '—'}
Courriel {me.email || '—'}
Identifiant membre {me.ka_id}
Connexion {me.provider === 'google' ? 'Compte Google (via KA ID)' : 'KA ID (groupe-ka.com)'}
Membre depuis {fmtEpoch(me.created)}
Dernière connexion {fmtEpoch(me.last_login)}

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

{/* ——— Actions ——— */}
) }