// Config
import { cloudflareImageUrl, capitalize } from '@freesewing/utils'
import { control as controlConfig } from '@freesewing/config'
// Hooks
import React, { useState, useEffect } from 'react'
import { useAccount } from '@freesewing/react/hooks/useAccount'
import { useBackend } from '@freesewing/react/hooks/useBackend'
// Components
import { Link as DefautLink } from '@freesewing/react/components/Link'
import { ControlScore } from '@freesewing/react/components/Control'
import {
MeasurementsSetIcon,
SignoutIcon,
UserIcon,
UnitsIcon,
ShowcaseIcon,
ChatIcon,
EmailIcon,
KeyIcon,
BookmarkIcon,
CompareIcon,
PrivacyIcon,
ControlIcon,
LockIcon,
NewsletterIcon,
ShieldIcon,
FingerprintIcon,
GitHubIcon,
InstagramIcon,
MastodonIcon,
TwitchIcon,
TikTokIcon,
LinkIcon,
TrashIcon,
RedditIcon,
CloseIcon,
ReloadIcon,
NoIcon,
PatternIcon,
BoolYesIcon,
BoolNoIcon,
OkIcon,
WrenchIcon,
UploadIcon,
DownloadIcon,
} from '@freesewing/react/components/Icon'
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 btnClasses = 'tw:daisy-btn tw:capitalize tw:flex tw:flex-row tw:justify-between'
const itemClasses =
'tw:flex tw:flex-row tw:items-center tw:justify-between tw:p-2 tw:px-4 tw:rounded tw:mb-1'
const linkClasses = `tw:hover:bg-secondary/10 tw:max-w-md tw:hover:no-underline tw:text-base-content no-hover-decoration`
const titles = {
apikeys: 'API Keys',
sets: 'Measurements Sets',
patterns: 'Patterns',
img: 'Avatar',
email: 'E-mail Address',
newsletter: 'Newsletter Subscription',
compare: 'Measurements Comparison',
consent: 'Consent & Privacy',
control: 'User Experience',
github: 'GitHub',
mfa: 'Multi-Factor Authentication',
}
const YesNo = ({ check }) => (check ? : )
const t = (input) => input
/**
* The Links component shows all of the links to manage your account
*
* @param {object} props - All the React props
* @param {function} Link - A custom Link component, typically the Docusaurus one, but it's optional
*/
export const Links = ({ Link = false }) => {
// Use custom Link component if available
if (!Link) Link = DefaultLink
// Hooks
const { account, signOut, control } = useAccount()
const backend = useBackend()
// State
const [bookmarks, setBookmarks] = useState([])
const [sets, setSets] = useState([])
const [patterns, setPatterns] = useState([])
const [apikeys, setApikeys] = useState([])
// Effects
useEffect(() => {
const getUserData = async () => {
const [status, body] = await backend.getUserData(account.id)
if (status === 200 && body.result === 'success') {
setApikeys(body.data.apikeys)
setBookmarks(body.data.bookmarks)
setPatterns(body.data.patterns)
setSets(body.data.sets)
}
}
getUserData()
}, [account.id])
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 ? {account.bio.slice(0, 15)}… : '',
img: (
),
units: account.imperial ? 'Imperial' : 'Metric',
newsletter: ,
compare: ,
consent: ,
control: ,
github: account.data.githubUsername || account.data.githubEmail || ,
password: account.passwordType === 'v3' ? : ,
mfa: ,
}
for (const social of Object.keys(controlConfig.account.fields.identities).filter(
(i) => i !== 'github'
))
itemPreviews[social] = account.data[social] || (
)
return (
Your Data
{Object.keys(controlConfig.account.fields.data).map((item) =>
controlConfig.flat[item] > control ? null : (
{itemIcons[item]}
{titles[item] ? titles[item] : capitalize(item)}
{itemPreviews[item]}
)
)}
{control > 1 && (
About You
{Object.keys(controlConfig.account.fields.info).map((item) =>
controlConfig.flat[item] > control ? null : (
{itemIcons[item]}
{titles[item] ? titles[item] : capitalize(item)}
{itemPreviews[item]}
)
)}
)}
Preferences
{Object.keys(controlConfig.account.fields.settings).map((item) =>
controlConfig.flat[item] > control ? null : (
{itemIcons[item]}
{titles[item] ? titles[item] : capitalize(item)}
{itemPreviews[item]}
)
)}
{control > 2 && (
Linked Identities
{Object.keys(controlConfig.account.fields.identities).map((item) =>
controlConfig.flat[item] > control ? null : (
{itemIcons[item]}
{titles[item] ? titles[item] : capitalize(item)}
{itemPreviews[item]}
)
)}
)}
{control > 1 && (
Security
{Object.keys(controlConfig.account.fields.security).map((item) =>
controlConfig.flat[item] > control ? null : (
{itemIcons[item]}
{titles[item] ? titles[item] : capitalize(item)}
{itemPreviews[item]}
)
)}
)}
{control > 1 && (
Actions
{control > 2 && (
Import data
)}
{control > 2 && (
Export your data
)}
{control > 2 && (
Reload account data
)}
{control > 3 && (
Restrict processing of your data
)}
Remove your account
)}
{account.role === 'admin' && (
Administration
)}
{control > 1 && (
Your Profile
)}
signOut()}
>
Sign Out
)
}