import React from 'react'; import { useQuery } from 'urql'; import './CategoryTree.scss'; import RenderIfTrue from '@components/common/RenderIfTrue.jsx'; import { Folder, Minus, Plus } from 'lucide-react'; export interface CategoryTreeItem { categoryId: number; name: string; hasChildren: boolean; path: Array<{ name: string }>; children?: Array; } const categoriesQuery = ` query Query ($filters: [FilterInput]) { categories (filters: $filters) { items { categoryId, name hasChildren path { name } } } } `; const childrenQuery = ` query Query ($filters: [FilterInput]) { categories (filters: $filters) { items { categoryId, name path { name } hasChildren } } } `; const Skeleton = () => ( ); export interface CategoryItemProps { category: CategoryTreeItem; selectedCategories?: CategoryTreeItem[]; onSelect: (category: CategoryTreeItem) => void; } function CategoryItem({ category, selectedCategories, onSelect }: CategoryItemProps) { const [expanded, setExpanded] = React.useState(false); const [result] = useQuery({ query: childrenQuery, variables: { filters: [{ key: 'parent', operation: 'eq', value: category.categoryId }] }, pause: !expanded }); const { data, fetching, error } = result; if (error) { return (
  • {error.message}
  • ); } const className = selectedCategories?.find( (item) => item.categoryId === category.categoryId ) ? 'flex justify-start gap-2 items-center p-2 rounded-md bg-green-100 transition-colors duration-500' : 'flex justify-start gap-2 items-center p-2 rounded-md hover:bg-gray-100 transition-colors duration-500'; return (
  • {category.hasChildren && ( { e.preventDefault(); setExpanded(!expanded); }} > {expanded ? ( ) : ( )} )} {!category.hasChildren && ( )} { e.preventDefault(); onSelect(category); }} >
    {category.name}
    {data && data.categories.items.length > 0 && expanded && (
      {data.categories.items.map((child) => ( ))}
    )}
  • ); } CategoryItem.defaultProps = { category: {}, selectedCategory: {} }; interface CategoryTreeProps { selectedCategories?: CategoryTreeItem[]; onSelect: (category: CategoryTreeItem) => void; } function CategoryTree({ selectedCategories, onSelect }: CategoryTreeProps) { const [result] = useQuery({ query: categoriesQuery, variables: { filters: [{ key: 'parent', operation: 'eq', value: null }] } }); const { data, fetching, error } = result; if (fetching) { return ; } if (error) { return

    {error.message}

    ; } if (!data || !data.categories || data.categories.items.length === 0) { return
    There is no category
    ; } return ( ); } CategoryTree.defaultProps = { selectedCategories: [] }; export { CategoryTree };