import { DocumentDuplicateIcon, PencilSquareIcon, TrashIcon } from '@heroicons/react/20/solid'; import { $featuredPatterns, $publicPatterns, clearUserPatterns, deleteActivePattern, duplicateActivePattern, exportPatterns, importPatterns, useActivePattern, useViewingPattern, useSettings, userPattern, examplePattern, } from '../../settings.mjs'; import { useMemo } from 'react'; import * as tunes from '../tunes.mjs'; import { useStore } from '@nanostores/react'; import { getMetadata } from '../../metadata_parser'; function classNames(...classes) { return classes.filter(Boolean).join(' '); } function PatternButton({ showOutline, onClick, label, showHiglight }) { return ( {label} ); } function PatternButtons({ patterns, activePattern, onClick, viewingPattern, started }) { return (
{Object.entries(patterns).map(([id]) => ( onClick(id)} /> ))}
); } export function PatternsTab({ context }) { const { userPatterns } = useSettings(); const examplePatterns = useMemo(() => examplePattern.getAll(), []); const activePattern = useActivePattern(); const viewingPattern = useViewingPattern(); const updateCodeWindow = (id, code, reset = false) => { context.handleUpdate(id, code, reset); }; const onPatternBtnClick = (id, isExample = false) => { const code = isExample ? examplePatterns[id].code : userPatterns[id].code; // display selected pattern code in the window updateCodeWindow(id, code, isExample); }; const isExample = examplePatterns[viewingPattern] != null; const featuredPatterns = useStore($featuredPatterns); const publicPatterns = useStore($publicPatterns); const isExample = useMemo(() => activePattern && !!tunes[activePattern], [activePattern]); return (
{viewingPattern && (

{viewingPattern}

{!isExample && ( )} {!isExample && ( )}
)}
{featuredPatterns && (

Featured Patterns

{featuredPatterns.map((pattern) => ( { setActivePattern(pattern.hash); context.handleUpdate(pattern.code, true); }} > ))}
)} {publicPatterns && (

Last Creations

{publicPatterns.map((pattern) => ( { setActivePattern(pattern.hash); context.handleUpdate(pattern.code, true); }} > ))}
)}

Examples

onPatternBtnClick(id, true)} started={context.started} patterns={examplePatterns} activePattern={activePattern} viewingPattern={viewingPattern} />

Stock Examples

{Object.entries(tunes).map(([key, tune]) => ( { setActivePattern(key); context.handleUpdate(tune, true); }} > {key} ))}
); } export function PatternLabel({ pattern } /* : { pattern: Tables<'code'> } */) { const meta = useMemo(() => getMetadata(pattern.code), [pattern]); return ( <> {pattern.id}. {meta.title || pattern.hash} by {Array.isArray(meta.by) ? meta.by.join(',') : 'Anonymous'} ); }