import { exportPatterns, importPatterns, loadAndSetFeaturedPatterns, loadAndSetPublicPatterns, patternFilterName, useActivePattern, useViewingPatternData, userPattern, } from '../../../user_pattern_utils.mjs'; import { useMemo } from 'react'; import { getMetadata } from '../../../metadata_parser.js'; import { useExamplePatterns } from '../../useExamplePatterns.jsx'; import { parseJSON, isUdels } from '../../util.mjs'; import { ButtonGroup } from './Forms.jsx'; import { settingsMap, useSettings } from '../../../settings.mjs'; import { Pagination } from '../pagination/Pagination.jsx'; import { useState } from 'react'; import { useDebounce } from '../usedebounce.jsx'; import { cn } from 'tailwind_utils.mjs'; export function PatternLabel({ pattern } /* : { pattern: Tables<'code'> } */) { const meta = useMemo(() => getMetadata(pattern.code), [pattern]); let title = meta.title; if (title == null) { const date = new Date(pattern.created_at); if (!isNaN(date)) { title = date.toLocaleDateString(); } } if (title == null) { title = pattern.hash; } if (title == null) { title = 'unnamed'; } const author = Array.isArray(meta.by) ? meta.by.join(',') : 'Anonymous'; return <>{`${pattern.id}: ${title} by ${author.slice(0, 100)}`.slice(0, 60)}; } function PatternButton({ showOutline, onClick, pattern, showHiglight }) { return ( ); } function PatternButtons({ patterns, activePattern, onClick, started }) { const viewingPatternStore = useViewingPatternData(); const viewingPatternData = parseJSON(viewingPatternStore); const viewingPatternID = viewingPatternData.id; return (
{Object.values(patterns ?? {}) .reverse() .map((pattern) => { const id = pattern.id; return ( onClick(id)} /> ); })}
); } function ActionButton({ children, onClick, label, labelIsHidden }) { return ( ); } const updateCodeWindow = (context, patternData, reset = false) => { context.handleUpdate(patternData, reset); }; const autoResetPatternOnChange = !isUdels(); function UserPatterns({ context }) { const activePattern = useActivePattern(); const viewingPatternStore = useViewingPatternData(); const viewingPatternData = parseJSON(viewingPatternStore); const { userPatterns, patternFilter } = useSettings(); const viewingPatternID = viewingPatternData?.id; return (
{ const { data } = userPattern.createAndAddToDB(); updateCodeWindow(context, data); }} /> { const { data } = userPattern.duplicate(viewingPatternData); updateCodeWindow(context, data); }} /> { const { data } = userPattern.delete(viewingPatternID); updateCodeWindow(context, { ...data, collection: userPattern.collection }); }} /> { const { data } = userPattern.clearAll(); updateCodeWindow(context, data); }} />
{patternFilter === patternFilterName.user && ( updateCodeWindow( context, { ...userPatterns[id], collection: userPattern.collection }, autoResetPatternOnChange, ) } patterns={userPatterns} started={context.started} activePattern={activePattern} viewingPatternID={viewingPatternID} /> )}
); } function PatternPageWithPagination({ patterns, patternOnClick, context, paginationOnChange, initialPage }) { const [page, setPage] = useState(initialPage); const debouncedPageChange = useDebounce(() => { paginationOnChange(page); }); const onPageChange = (pageNum) => { setPage(pageNum); debouncedPageChange(); }; const activePattern = useActivePattern(); return (
patternOnClick(id)} started={context.started} patterns={patterns} activePattern={activePattern} />
); } let featuredPageNum = 1; function FeaturedPatterns({ context }) { const examplePatterns = useExamplePatterns(); const collections = examplePatterns.collections; const patterns = collections.get(patternFilterName.featured); return ( { updateCodeWindow( context, { ...patterns[id], collection: patternFilterName.featured }, autoResetPatternOnChange, ); }} paginationOnChange={async (pageNum) => { await loadAndSetFeaturedPatterns(pageNum - 1); featuredPageNum = pageNum; }} /> ); } let latestPageNum = 1; function LatestPatterns({ context }) { const examplePatterns = useExamplePatterns(); const collections = examplePatterns.collections; const patterns = collections.get(patternFilterName.public); return ( { updateCodeWindow(context, { ...patterns[id], collection: patternFilterName.public }, autoResetPatternOnChange); }} paginationOnChange={async (pageNum) => { await loadAndSetPublicPatterns(pageNum - 1); latestPageNum = pageNum; }} /> ); } function PublicPatterns({ context }) { const { patternFilter } = useSettings(); if (patternFilter === patternFilterName.featured) { return ; } return ; } export function PatternsTab({ context }) { const { patternFilter } = useSettings(); return (
settingsMap.setKey('patternFilter', value)} items={patternFilterName} > {patternFilter === patternFilterName.user ? ( ) : ( )}
); }