import { CircularProgress, Dialog, DialogActions, DialogContent, DialogTitle, TableBody, TableCell, TableRow, TextField, } from "@material-ui/core"; import ConfirmButton from "@saleor/components/ConfirmButton"; import ResponsiveTable from "@saleor/components/ResponsiveTable"; import TableCellAvatar from "@saleor/components/TableCellAvatar"; import { SearchProductsQuery } from "@saleor/graphql"; import useModalDialogOpen from "@saleor/hooks/useModalDialogOpen"; import useSearchQuery from "@saleor/hooks/useSearchQuery"; import { ConfirmButtonTransitionState } from "@saleor/macaw-ui"; import { maybe } from "@saleor/misc"; import useScrollableDialogStyle from "@saleor/styles/useScrollableDialogStyle"; import { DialogProps, FetchMoreProps, RelayToFlat } from "@saleor/types"; import React, { useEffect } from "react"; import InfiniteScroll from "react-infinite-scroll-component"; import { FormattedMessage, useIntl } from "react-intl"; import BackButton from "../BackButton"; import Checkbox from "../Checkbox"; import { messages } from "./messages"; import { useStyles } from "./styles"; export interface AssignProductDialogFormData { products: RelayToFlat; query: string; } export interface AssignProductDialogProps extends FetchMoreProps, DialogProps { confirmButtonState: ConfirmButtonTransitionState; products: RelayToFlat; selectedIds?: Record; loading: boolean; onFetch: (value: string) => void; onSubmit: (data: string[]) => void; } const scrollableTargetId = "assignProductScrollableDialog"; const AssignProductDialog: React.FC = props => { const { confirmButtonState, hasMore, open, loading, products, onClose, onFetch, onFetchMore, onSubmit, selectedIds, } = props; const classes = useStyles(props); const scrollableDialogClasses = useScrollableDialogStyle({}); const intl = useIntl(); const [query, onQueryChange, queryReset] = useSearchQuery(onFetch); const [productsDict, setProductsDict] = React.useState(selectedIds || {}); useEffect(() => { if (selectedIds) { setProductsDict(prev => { const prevIds = Object.keys(prev); const newIds = Object.keys(selectedIds); const preSelected = newIds .filter(n => !prevIds.includes(n)) .reduce((p, c) => ({ ...p, [c]: true }), {}); return { ...prev, ...preSelected }; }); } }, [selectedIds]); useModalDialogOpen(open, { onOpen: () => { queryReset(); setProductsDict(selectedIds); }, }); const handleSubmit = () => { const selectedProductsAsArray = Object.keys(productsDict) .filter(key => productsDict[key]) .map(key => key); onSubmit(selectedProductsAsArray); }; const handleChange = productId => { setProductsDict(prev => ({ ...prev, [productId]: !prev[productId] ?? true, })); }; return ( , }} /> } scrollableTarget={scrollableTargetId} > {products && products.map(product => { const isSelected = productsDict[product.id] || false; return ( product.thumbnail.url)} /> {product.name} handleChange(product.id)} /> ); })} ); }; AssignProductDialog.displayName = "AssignProductDialog"; export default AssignProductDialog;