import { FC, useEffect, useMemo, useState } from 'react' import { Flex, Box, Text } from '../primitives' import { faChevronDown } from '@fortawesome/free-solid-svg-icons' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { CollapsibleContent, CollapsibleRoot, slideDown, slideUp, } from '../primitives/Collapsible' import * as CollapsiblePrimitive from '@radix-ui/react-collapsible' import { Execute } from '@reservoir0x/reservoir-sdk' import { BatchListingData } from './BatchListModal' import { styled } from '@stitches/react' import { Marketplace } from './BatchListings' import LoadingSpinner from 'components/common/LoadingSpinner' import optimizeImage from 'utils/optimizeImage' const Img = styled('img', { height: 24, width: 24, borderRadius: 4, objectFit: 'cover', '& + img': { marginLeft: -10, }, }) type Props = { item: NonNullable[0]['items']>[0] batchListingData: BatchListingData[] selectedMarketplaces: Marketplace[] open?: boolean } export const ApprovalCollapsible: FC = ({ item, batchListingData, selectedMarketplaces, open, }) => { const [collapsibleOpen, setCollapsibleOpen] = useState(false) let isComplete = item.status == 'complete' const orderIndexes = item?.orderIndexes || [] const marketplacesSeekingApproval = useMemo(() => { let uniqueMarketplaces: Marketplace[] = [] orderIndexes.forEach((orderIndex) => { if (batchListingData[orderIndex]) { const listing = batchListingData[orderIndex].listing const marketplace = selectedMarketplaces.find( (m) => m.orderbook === listing.orderbook ) if ( marketplace && !uniqueMarketplaces.find( (uniqueMarketplace) => uniqueMarketplace.orderbook === marketplace.orderbook ) ) { uniqueMarketplaces.push(marketplace) } } }) return uniqueMarketplaces }, [orderIndexes, item, batchListingData]) const marketplaceNames = useMemo(() => { return marketplacesSeekingApproval .map((marketplace) => marketplace.name) .join(' and ') }, [marketplacesSeekingApproval]) const collectionImage: string = useMemo(() => { const token = batchListingData[orderIndexes[0]]?.token?.token return ( optimizeImage(token?.collection?.imageUrl, 250) || token?.imageSmall || '' ) }, [batchListingData, orderIndexes]) const collectionName = batchListingData[orderIndexes[0]]?.token?.token?.collection?.name || 'collection' useEffect(() => { if (open !== undefined && open !== collapsibleOpen) { setCollapsibleOpen(open) } }, [open]) useEffect(() => { if (isComplete) { setCollapsibleOpen(false) } }, [isComplete]) if (batchListingData[orderIndexes[0]] == undefined) { return null } return ( { setCollapsibleOpen(open) }} open={collapsibleOpen} css={{ backgroundColor: '$gray3', width: '100%' }} > Approve Collection {marketplacesSeekingApproval.map((marketplace) => ( ))} Approve {collectionName} on {marketplaceNames} {item.txHashes && item.status == 'incomplete' ? ( ) : null} ) }