// Dependencies import orderBy from 'lodash.orderby' import { measurements } from 'site/prebuild/design-measurements.mjs' import { siteConfig } from 'site/site.config.mjs' import { capitalize } from 'shared/utils.mjs' // Hooks import { useState, useEffect } from 'react' import { useTranslation } from 'next-i18next' import { useAccount } from 'shared/hooks/use-account.mjs' import { useBackend } from 'shared/hooks/use-backend.mjs' // Components import { SetCandidate, ns as setNs } from 'shared/components/sets/set-candidate.mjs' import { CuratedSetCandidate } from 'shared/components/sets/curated-set-candidate.mjs' import { PopoutWrapper } from 'shared/components/wrappers/popout.mjs' import { Tag } from 'shared/components/tag.mjs' import { FilterIcon } from 'shared/components/icons.mjs' export const ns = setNs export const CuratedSetPicker = ({ design, language }) => { // Hooks const { account, token } = useAccount() const backend = useBackend(token) const { t } = useTranslation('sets') // State const [curatedSets, setCuratedSets] = useState([]) const [filter, setFilter] = useState([]) const [tags, setTags] = useState([]) const [reload, setReload] = useState(0) // Force a refresh const refresh = () => setReload(reload + 1) // Effects useEffect(() => { const getCuratedSets = async () => { const result = await backend.getCuratedSets() if (result.success) { const all = [] const allTags = new Set() for (const set of result.data.curatedSets) { all.push(set) for (const tag of set[`tags${capitalize(language)}`]) allTags.add(tag) } setCuratedSets(all) setTags([...allTags]) } } getCuratedSets() }, [reload]) const addFilter = (tag) => { const newFilter = [...filter, tag] setFilter(newFilter) } const removeFilter = (tag) => { const newFilter = filter.filter((t) => t !== tag) setFilter(newFilter) } const applyFilter = () => { const newList = new Set() for (const set of curatedSets) { const setTags = [] for (const lang of siteConfig.languages) { const key = `tags${capitalize(lang)}` setTags.push(...set[key]) } let match = 0 for (const tag of filter) { if (setTags.includes(tag)) match++ } if (match === filter.length) newList.add(set) } return [...newList] } const list = applyFilter() // Need to sort designs by their translated title const translated = {} for (const d of list) translated[t(`${d}.t`)] = d return ( <>
{t('fsmtm')}