import type { AuthProvider } from "@reactive-resume/auth/types"; import { Trans } from "@lingui/react/macro"; import { LinkBreakIcon, LinkIcon } from "@phosphor-icons/react"; import { motion } from "motion/react"; import { useCallback, useMemo } from "react"; import { match } from "ts-pattern"; import { Button } from "@reactive-resume/ui/components/button"; import { Separator } from "@reactive-resume/ui/components/separator"; import { getProviderIcon, getProviderName, useAuthAccounts, useAuthProviderActions } from "./hooks"; type SocialProviderSectionProps = { provider: AuthProvider; name?: string; animationDelay?: number; }; export function SocialProviderSection({ provider, name, animationDelay = 0 }: SocialProviderSectionProps) { const { link, unlink } = useAuthProviderActions(); const { hasAccount, getAccountByProviderId } = useAuthAccounts(); const providerName = useMemo(() => name ?? getProviderName(provider), [name, provider]); const providerIcon = useMemo(() => getProviderIcon(provider), [provider]); const account = useMemo(() => getAccountByProviderId(provider), [getAccountByProviderId, provider]); const isConnected = useMemo(() => hasAccount(provider), [hasAccount, provider]); const handleLink = useCallback(async () => { await link(provider); }, [link, provider]); const handleUnlink = useCallback(async () => { if (!account?.accountId) return; await unlink(provider, account.accountId); }, [account, unlink, provider]); return (

{providerIcon} {providerName}

{match(isConnected) .with(true, () => ( )) .with(false, () => ( )) .exhaustive()}
); }