import { useState, useEffect } from 'react' import { useAccount } from 'shared/hooks/use-account.mjs' import { useBackend } from 'shared/hooks/use-backend.mjs' import { useTranslation } from 'next-i18next' import Link from 'next/link' import { freeSewingConfig as conf, controlLevels } from 'shared/config/freesewing.config.mjs' import { DesignIcon, MeasieIcon, SignoutIcon, UserIcon, UnitsIcon, I18nIcon, ShowcaseIcon, ChatIcon, EmailIcon, KeyIcon, BookmarkIcon, CompareIcon, PrivacyIcon, ControlIcon, LockIcon, NewsletterIcon, ShieldIcon, FingerprintIcon, GitHubIcon, InstagramIcon, MastodonIcon, TwitterIcon, TwitchIcon, TikTokIcon, LinkIcon, TrashIcon, RedditIcon, ExportIcon, CloseIcon, ReloadIcon, OkIcon, NoIcon, } from 'shared/components/icons.mjs' import { cloudflareImageUrl, capitalize } from 'shared/utils.mjs' import { ControlScore } from 'shared/components/control/score.mjs' export const ns = ['account', 'i18n'] const itemIcons = { bookmarks: , sets: , patterns: , apikeys: , username: , email: , bio: , img: , language: , units: , compare: , consent: , control: , mfa: , newsletter: , password: , github: , instagram: , mastodon: , twitter: , twitch: , tiktok: , website: , reddit: , } const itemClasses = 'flex flex-row items-center justify-between bg-opacity-10 p-2 px-4 rounded mb-1' const AccountLink = ({ href, title, children, color = 'secondary' }) => ( {children} ) const YesNo = ({ check }) => check ? ( ) : ( ) export const AccountLinks = () => { const { account, signOut, control } = useAccount() const { t } = useTranslation(ns) const backend = useBackend() const [bookmarks, setBookmarks] = useState([]) const [sets, setSets] = useState([]) const [patterns, setPatterns] = useState([]) const [apikeys, setApikeys] = useState([]) useEffect(() => { const getUserData = async () => { const result = await backend.getUserData(account.id) if (result.success) { setApikeys(result.data.data.apikeys) setBookmarks(result.data.data.bookmarks) setPatterns(result.data.data.patterns) setSets(result.data.data.sets) } } getUserData() }, [account.id]) const btnClasses = 'btn capitalize flex flex-row justify-between' if (!account.username) return null const itemPreviews = { apikeys: apikeys?.length || 0, bookmarks: bookmarks?.length || 0, sets: sets?.length || 0, patterns: patterns?.length || 0, username: account.username, email: account.email, bio: {account.bio.slice(0, 15)}…, img: ( ), language: t(`i18n:${account.language}`), units: t(account.imperial ? 'imperialUnits' : 'metricUnits'), newsletter: , compare: , consent: , control: , github: account.data.githubUsername || account.data.githubEmail || , password: account.passwordType === 'v3' ? ( ) : ( ), mfa: , } for (const social of Object.keys(conf.account.fields.identities).filter((i) => i !== 'github')) itemPreviews[social] = account.data[social] || ( ) return (

{t('data')}

{Object.keys(conf.account.fields.data).map((item) => controlLevels[item] > control ? null : (
{itemIcons[item]} {t(`your${capitalize(item)}`)}
{itemPreviews[item]}
) )}
{control > 1 && (

{t('info')}

{Object.keys(conf.account.fields.info).map((item) => controlLevels[item] > control ? null : (
{itemIcons[item]} {t(item)}
{itemPreviews[item]}
) )}
{t('userId')}
{account.id}
)}

{t('settings')}

{Object.keys(conf.account.fields.settings).map((item) => controlLevels[item] > control ? null : (
{itemIcons[item]} {t(item)}
{itemPreviews[item]}
) )}
{control > 2 && (

{t('linkedIdentities')}

{Object.keys(conf.account.fields.identities).map((item) => controlLevels[item] > control ? null : (
{itemIcons[item]} {t(item)}
{itemPreviews[item]}
) )}
)} {control > 1 && (

{t('security')}

{Object.keys(conf.account.fields.security).map((item) => controlLevels[item] > control ? null : (
{itemIcons[item]} {t(item)}
{itemPreviews[item]}
) )}
)} {control > 1 && (

{t('actions')}

{control > 2 && ( {t('reload')} )} {control > 2 && ( {t('export')} )} {control > 3 && ( {t('restrict')} )} {t('remove')}
)}
{control > 1 && ( {t('yourProfile')} )}
) }