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')}
)}
)
}