// 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 DefaultLink } 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 ? : ) /** * A component to manage the user's Instagram handle in their account data * * @component * @param {object} props - All component props * @param {React.Component} props.Link - A framework specific Link component for client-side routing * @returns {JSX.Element} */ 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]}
) )}
Role
{account.role}
ID
{account.id}
)}

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