// Dependencies import orderBy from 'lodash/orderBy.js' import { capitalize, shortDate } from '@freesewing/utils' // Context import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus' // Hooks import React, { useState, useEffect, useContext } from 'react' import { useBackend } from '@freesewing/react/hooks/useBackend' import { useSelection } from '@freesewing/react/hooks/useSelection' // Components import { TableWrapper } from '@freesewing/react/components/Table' import { PatternCard } from '@freesewing/react/components/Account' import { Link as WebLink } from '@freesewing/react/components/Link' import { BoolNoIcon, BoolYesIcon, PlusIcon, RightIcon, TrashIcon, } from '@freesewing/react/components/Icon' /** * A component to display and manage the list of patterns in the user's account * * @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 Patterns = ({ Link = false }) => { if (!Link) Link = WebLink // State const [patterns, setPatterns] = useState([]) const [refresh, setRefresh] = useState(0) const [order, setOrder] = useState('id') const [desc, setDesc] = useState(false) // Hooks const backend = useBackend() const { setLoadingStatus, LoadingProgress } = useContext(LoadingStatusContext) const { count, selection, setSelection, toggle, toggleAll } = useSelection(patterns) // Effects useEffect(() => { const getPatterns = async () => { setLoadingStatus([true, 'Loading patterns from backend']) const [status, body] = await backend.getPatterns() console.log({ status, body }) if (status === 200) { setPatterns(body.patterns) setLoadingStatus([true, 'Patterns loaded', true, true]) } else setLoadingStatus([false, 'Failed to load patterns from backend', true, true]) } getPatterns() }, [refresh]) // Helper to delete one or more patterns const removeSelectedPatterns = async () => { let i = 0 for (const pattern in selection) { i++ await backend.removePattern(pattern) setLoadingStatus([ true, , ]) } setSelection({}) setRefresh(refresh + 1) setLoadingStatus([true, 'Nailed it', true, true]) } const fields = { id: '#', img: 'Image', name: 'Name', design: 'Design', createdAt: 'Date', public: 'Public', } return ( <>
Create a new pattern
{Object.keys(fields).map((field) => ( ))} {orderBy(patterns, order, desc ? 'desc' : 'asc').map((pattern, i) => ( ))}
toggle(pattern.id)} /> {pattern.id} {pattern.name} {capitalize(pattern.design)} {shortDate(pattern.createdAt)} {pattern.public ? : }
) }