import { ActionIcon, Anchor, Badge, Box, Button, Menu, Text, Tooltip, } from "@mantine/core"; import { useDisclosure } from "@mantine/hooks"; import { IconAd, IconAdOff, IconEdit, IconHammer, IconHistory, IconMenu, IconPlus, IconTrash, } from "@tabler/icons-react"; import _ from "lodash"; import { useMemo, useRef, useState } from "react"; import { deleteBid, getBids, toggleBid } from "../apis/bid"; import { BidModal, ShowHistoriesModal } from "../components/bid"; import DeleteRowAction from "../components/bid/delete-row-action"; import { haveHistories } from "../constant"; import Table from "../lib/table/table"; import { IColumn, TRefTableFn } from "../lib/table/type"; import { useChoosesStore } from "../lib/zustand/use-chooses-store"; import { useConfirmStore } from "../lib/zustand/use-confirm"; import { mappingStatusColors } from "../system/constants"; import { IBid } from "../system/type"; import { extractDomainSmart, formatTime } from "../utils"; import ShowHistoriesApiModal from "../components/bid/show-histories-api/show-histories-api-modal"; export default function Bids() { const refTableFn: TRefTableFn = useRef({}); const [clickData, setClickData] = useState(null); const { setConfirm } = useConfirmStore(); const { setChooses } = useChoosesStore(); const [openedHistories, historiesModal] = useDisclosure(false); const [openedHistoriesView, openedHistoriesViewModal] = useDisclosure(false); const [openedBid, bidModal] = useDisclosure(false); const columns: IColumn[] = [ { key: "id", title: "ID", typeFilter: "number", }, { key: "name", title: "Name", typeFilter: "text", renderRow(row) { return ( {row.name} ); }, }, { key: "web_bid", title: "Web", typeFilter: "none", renderRow(row) { return ( {extractDomainSmart(row.web_bid?.origin_url) || "None"} ); }, }, { key: "lot_id", title: "Lot ID", typeFilter: "none", }, { key: "model", title: "Model", typeFilter: "text", }, { key: "plus_price", title: "Plus price", typeFilter: "none", }, { key: "max_price", title: "Max price", typeFilter: "none", }, { key: "current_price", title: "Current price", typeFilter: "none", }, { key: "reserve_price", title: "Reserve price", typeFilter: "none", }, { 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: "none", renderRow(row) { return ( ); }, }, { key: "close_time_ts", title: "Close time", typeFilter: "date", renderRow(row) { return ( ); }, }, { key: "status", title: "Status", typeFilter: { type: "select", data: [ { label: "Biding", value: "biding", }, { label: "Win bid", value: "win-bid", }, { label: "Out bid", value: "out-bid", }, ], }, renderRow(row) { return ( {row.status} ); }, }, ]; const handleDelete = (bid: IBid) => { setConfirm({ title: "Delete ?", message: `This bid will be delete: ${bid.name || bid.model}`, 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 ( { refTableFn.current?.fetchData?.(); }} /> ), }} 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); historiesModal.open(); }} leftSection={} > Histories {haveHistories.includes(row?.web_bid?.origin_url) && ( { setClickData(row); openedHistoriesViewModal.open(); }} leftSection={} > Bids )} handleToggleBid(row)} leftSection={ row.status === "biding" ? ( ) : ( ) } > {row.status === "biding" ? "Disable" : "Enable"} {/* handleDelete(row)} leftSection={} > Delete */} handleDelete(row)} size={"sm"} color="red" > ); }, }} rowKey="id" /> ); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return ( {table} { historiesModal.close(); setClickData(null); }} data={clickData} /> { if (refTableFn.current?.fetchData) { refTableFn.current.fetchData(); } setClickData(null); }} opened={openedBid} onClose={() => { bidModal.close(); setClickData(null); }} data={clickData} /> {openedHistoriesView && ( { if (refTableFn.current?.fetchData) { refTableFn.current.fetchData(); } setClickData(null); }} opened={true} onClose={() => { openedHistoriesViewModal.close(); setClickData(null); }} data={clickData} /> )} ); }