Viewing File: /home/markqprx/iniasli.pro/client/ui/icon-picker/icon-picker.tsx

import React, {Suspense} from 'react';
import {IconTree} from '../../icons/create-svg-icon';
import {iconGridStyle} from './icon-grid-style';
import {TextField} from '../forms/input-field/text-field/text-field';
import {Skeleton} from '../skeleton/skeleton';
import {useTrans} from '../../i18n/use-trans';
import {AnimatePresence, m} from 'framer-motion';
import {opacityAnimation} from '../animation/opacity-animation';

const skeletons = [...Array(60).keys()];

const IconList = React.lazy(() => import('./icon-list'));

interface IconListProps {
  onIconSelected: (icon: IconTree[] | null) => void;
}
export default function IconPicker({onIconSelected}: IconListProps) {
  const {trans} = useTrans();
  const [value, setValue] = React.useState('');

  return (
    <div className="py-4">
      <TextField
        className="mb-20"
        value={value}
        onChange={e => {
          setValue(e.target.value);
        }}
        placeholder={trans({message: 'Search icons...'})}
      />
      <AnimatePresence mode="wait">
        <Suspense
          fallback={
            <m.div {...opacityAnimation} className={iconGridStyle.grid}>
              {skeletons.map((_, index) => (
                <div className={iconGridStyle.button} key={index}>
                  <Skeleton variant="rect" />
                </div>
              ))}
            </m.div>
          }
        >
          <m.div {...opacityAnimation} className={iconGridStyle.grid}>
            <IconList searchQuery={value} onIconSelected={onIconSelected} />
          </m.div>
        </Suspense>
      </AnimatePresence>
    </div>
  );
}
Back to Directory File Manager