import { useState, useEffect, useMemo } from 'react' import { Canvas, Button, TextInput } from 'datocms-react-ui' import { RenderModalCtx } from 'datocms-plugin-sdk' import SaleorClient, { Config, Products, Node } from '../../classes/SaleorClient' import ProductBlock from '../ProductBlock' import useDebounce from '../../utils/useDebounce' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { faMagnifyingGlass, faCheck } from '@fortawesome/free-solid-svg-icons' import classNames from 'classnames' import s from './styles.module.css' type PropTypes = { ctx: RenderModalCtx } type FetchResult = { products: Products productVariants: Products } export default function ProductModal({ ctx }: PropTypes) { const config: Config = ctx.parameters.config as Config { /* Init Client */ } const client = useMemo(() => new SaleorClient(config), [config]) const [products, setProducts] = useState<{ edges: Node[] }>({ edges: [] }) const [selected, setSelected] = useState() const [sku, setSku] = useState('') const debouncedValue = useDebounce(sku, 500) { /* Handle Search */ } useEffect(() => { if (sku) { const fetchData = async () => { await client.productsMatching(sku).then(({ products, productVariants }: FetchResult) => { const result = { edges: [...products.edges, ...productVariants.edges] } setProducts(result) { /* Reset selected if it doesn't appear in the new searched array */ } if (selected && !result.edges.find((product) => product.node.id === selected.node.id)) { setSelected(undefined) } }) } fetchData().catch(console.error) } else { setProducts({ edges: [] }) setSelected(undefined) } }, [debouncedValue, sku, client]) { /* Set Selected */ } const handleSelect = (e: React.MouseEvent, product: Node) => { setSelected(product) } /* On Close Modal */ const handleClose = (e: React.MouseEvent, selected: Node) => { ctx.resolve(selected) } return ( {/* Search input */}
setSku(newValue)} />
{/* Display Result */} {products.edges.length > 0 && (
{products.edges.map((product: Node) => (
handleSelect(e, product)} >
))}
)} {selected && ( )}
) }