import React, { memo, useCallback, useMemo, useState } from 'react' import { LazyIllustration } from '../../components/lazy-illustration/LazyIllustration' import { illustrationNames } from '../../generated/illustrationAssets' const debounce =

( callback: (...args: P[]) => unknown, wait: number, ) => { let timeoutId: number return (...args: P[]) => { if (timeoutId) { window.clearTimeout(timeoutId) } timeoutId = window.setTimeout(() => { callback(...args) }, wait) } } const IllustrationItem = memo( ({ children, name, copyText, onClick, }: React.PropsWithChildren<{ name: string copyText: string onClick: () => void }>) => { return (

  • ) }, ) const IllustrationLibrary = ({ filter, }: { filter?: 'filled' | 'outlined' }) => { const [query, setQuery] = useState('') const [copiedIllustration, setCopiedIllustration] = useState( null, ) const illustrationList = useMemo(() => { const predicate = filter !== undefined ? (name: string) => name.toLowerCase().includes(filter) : () => true return illustrationNames .filter(name => !name.endsWith('Animation')) .filter(name => predicate(name)) }, [filter]) const copyToClipboard = useCallback((illustrationName: string) => { const importStatement = `import ${illustrationName} from '@payfit/unity-illustrations/assets/${illustrationName}'` navigator.clipboard .writeText(importStatement) .then(() => { setCopiedIllustration(illustrationName) setTimeout(() => { setCopiedIllustration(null) }, 5000) }) .catch((error: unknown) => { console.error('Failed to copy: ', error) }) }, []) const updateSearchQuery = debounce((illustrationName: string) => { setQuery(illustrationName) }, 150) const illustrationListMatchingSearch = illustrationList.filter( illustrationName => illustrationName.toLowerCase().includes(query.toLowerCase()), ) return (

    Illustration Gallery

    Click on any illustration to copy its import path to the clipboard.

    { updateSearchQuery(e.target.value) }} />
      {illustrationListMatchingSearch.map(name => { return ( { copyToClipboard(name) }} > ) })}
    ) } export default IllustrationLibrary