import { ActionIcon, Badge, Box, Menu, Text, Tooltip } from '@mantine/core'; import { useDisclosure } from '@mantine/hooks'; import { IconAd, IconAdOff, IconEdit, IconHistory, IconMenu, IconTrash } from '@tabler/icons-react'; import _ from 'lodash'; import { useMemo, useRef, useState } from 'react'; import { deleteBid, deletesBid, getBids, toggleBid } from '../apis/bid'; import { BidModal, ShowHistoriesModal } from '../components/bid'; import Table from '../lib/table/table'; import { IColumn, TRefTableFn } from '../lib/table/type'; import { useConfirmStore } from '../lib/zustand/use-confirm'; import { IBid } from '../system/type'; import { formatTime } from '../utils'; import { mappingStatusColors } from '../system/constants'; export default function Bids() { const refTableFn: TRefTableFn = useRef({}); const [clickData, setClickData] = useState(null); const { setConfirm } = useConfirmStore(); const [openedHistories, historiesModel] = useDisclosure(false); const [openedBid, bidModal] = useDisclosure(false); const columns: IColumn[] = [ { key: 'id', title: 'ID', typeFilter: 'number', }, { key: 'lot_id', title: 'Lot ID', typeFilter: 'text', }, { key: 'model', title: 'Model', typeFilter: 'text', }, { key: 'quantity', title: 'Qty', typeFilter: 'number', }, { key: 'step_price', title: 'Step price', typeFilter: 'number', }, { key: 'max_price', title: 'Max price', typeFilter: 'number', }, { key: 'current_price', title: 'Current price', typeFilter: 'number', }, { key: 'histories', title: 'Current bid', typeFilter: 'none', renderRow(row) { const bidPrice = _.maxBy(row.histories, 'price'); return {bidPrice ? bidPrice.price : 'None'}; }, }, { key: 'start_bid_time', title: 'Start bid', typeFilter: 'text', renderRow(row) { return ( ); }, }, { key: 'close_time', title: 'Close time', typeFilter: 'text', renderRow(row) { return ( ); }, }, { key: 'status', title: 'Status', typeFilter: 'text', renderRow(row) { return ( {row.status} ); }, }, { key: 'updated_at', title: 'Update at', typeFilter: 'none', renderRow(row) { return {formatTime(row.updated_at)}; }, }, ]; const handleDelete = (bid: IBid) => { setConfirm({ title: 'Delete ?', message: 'This bid will be delete', handleOk: async () => { await deleteBid(bid); if (refTableFn.current?.fetchData) { refTableFn.current.fetchData(); } }, }); }; const handleToggleBid = async (bid: IBid) => { const isEnable = bid.status === 'biding' ? true : bid.status === 'out-bid' ? false : true; setConfirm({ title: (isEnable ? 'Disable ' : 'Enable ') + 'ID: ' + bid.id, message: 'This bid will be ' + (isEnable ? 'disable ' : 'enable '), handleOk: async () => { await toggleBid(bid); if (refTableFn.current?.fetchData) { refTableFn.current.fetchData(); } }, okButton: { value: isEnable ? 'Disable ' : 'Enable ', color: isEnable ? 'red' : 'blue', }, }); }; const table = useMemo(() => { return ( { bidModal.open(); }, }, { key: 'delete', title: 'Delete', callback: (data) => { if (!data.length) return; setConfirm({ title: 'Delete', message: `${data.length} will be delete`, handleOk: async () => { const result = await deletesBid(data); if (!result) return; if (refTableFn.current.fetchData) { refTableFn.current.fetchData(); } }, }); }, disabled: (data) => data.length <= 0, }, ], }} refTableFn={refTableFn} striped showLoading={true} highlightOnHover styleDefaultHead={{ justifyContent: 'flex-start', width: 'fit-content', }} options={{ query: getBids, pathToData: 'data.data', keyOptions: { last_page: 'lastPage', per_page: 'perPage', from: 'from', to: 'to', total: 'total', }, }} rows={[]} withColumnBorders showChooses={true} withTableBorder columns={columns} actions={{ title: Action, body: (row) => { return ( { setClickData(row); bidModal.open(); }} leftSection={} > Edit { setClickData(row); historiesModel.open(); }} leftSection={} > Histories handleToggleBid(row)} leftSection={row.status === 'biding' ? : } > {row.status === 'biding' ? 'Disable' : 'Enable'} handleDelete(row)} leftSection={}> Delete ); }, }} rowKey="id" /> ); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return ( {table} { historiesModel.close(); setClickData(null); }} data={clickData} /> { if (refTableFn.current?.fetchData) { refTableFn.current.fetchData(); } setClickData(null); }} opened={openedBid} onClose={() => { bidModal.close(); setClickData(null); }} data={clickData} /> ); }