import { ActionIcon, Badge, Box, Menu, Text, Tooltip } from "@mantine/core"; import { useDisclosure } from "@mantine/hooks"; import { IconAd, IconAdOff, IconEdit, IconHammer, 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, ShowHistoriesBidGraysApiModal, ShowHistoriesBidPicklesApiModal, 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 { mappingStatusColors } from "../system/constants"; import { IBid } from "../system/type"; import { formatTime } from "../utils"; import constants, { haveHistories } from "../constant"; export default function Bids() { const refTableFn: TRefTableFn = useRef({}); const [clickData, setClickData] = useState(null); const { setConfirm } = useConfirmStore(); const [openedHistories, historiesModel] = useDisclosure(false); const [openedHistoriesGraysApi, historiesGraysApiModel] = useDisclosure(false); const [openedHistoriesPicklesApi, historiesPicklesApiModel] = useDisclosure(false); const [openedBid, bidModal] = useDisclosure(false); const columns: IColumn[] = [ { key: "id", title: "ID", typeFilter: "number", }, { key: "name", title: "Name", typeFilter: "text", }, { key: "web_bid", title: "Web", typeFilter: "text", renderRow(row) { return {row.web_bid.origin_url}; }, }, { key: "lot_id", title: "Lot ID", typeFilter: "text", }, { key: "model", title: "Model", typeFilter: "text", }, { key: "plus_price", title: "Plus price", typeFilter: "number", }, { key: "max_price", title: "Max price", typeFilter: "number", }, { key: "current_price", title: "Current price", typeFilter: "number", }, { key: "reserve_price", title: "Reserve 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} ); }, }, ]; 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 ( { window.open(row.url, "_blank"); }} tableChildProps={{ trbody: { className: "cursor-pointer", }, }} actionsOptions={{ actions: [ { key: "add", title: "Add", callback: () => { 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 ( e.stopPropagation()} className="flex w-full items-center justify-center" > e.stopPropagation()}> { setClickData(row); bidModal.open(); }} leftSection={} > Edit { setClickData(row); historiesModel.open(); }} leftSection={} > Histories {haveHistories.includes(row?.web_bid.origin_url) && ( { setClickData(row); switch (row.web_bid.origin_url) { case constants.grays: { historiesGraysApiModel.open(); break; } case constants.pickles: { historiesPicklesApiModel.open(); break; } default: { historiesGraysApiModel.open(); } } }} leftSection={} > Bids )} 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} /> {/* Grays */} {openedHistoriesGraysApi && ( { if (refTableFn.current?.fetchData) { refTableFn.current.fetchData(); } setClickData(null); }} opened={openedHistoriesGraysApi} onClose={() => { historiesGraysApiModel.close(); setClickData(null); }} data={clickData} /> )} {openedHistoriesPicklesApi && ( { if (refTableFn.current?.fetchData) { refTableFn.current.fetchData(); } setClickData(null); }} opened={true} onClose={() => { historiesPicklesApiModel.close(); setClickData(null); }} data={clickData} /> )} ); }