diff --git a/auto-bid-admin/src/components/bid/delete-row-action.tsx b/auto-bid-admin/src/components/bid/delete-row-action.tsx index 11f8788..d51c175 100644 --- a/auto-bid-admin/src/components/bid/delete-row-action.tsx +++ b/auto-bid-admin/src/components/bid/delete-row-action.tsx @@ -17,11 +17,13 @@ export default function DeleteRowAction({ setConfirm({ handleOk: async () => { const result = await deletesBid(chooses); + + console.log({ result }); if (!result) return; onDeleted?.(); }, - title: 'Delete', - message: `This action will remove ${chooses.length} products.` + title: "Delete", + message: `This action will remove ${chooses.length} products.`, }); }; diff --git a/auto-bid-admin/src/components/bid/index.ts b/auto-bid-admin/src/components/bid/index.ts index 6d5d9a4..6c3f7f0 100644 --- a/auto-bid-admin/src/components/bid/index.ts +++ b/auto-bid-admin/src/components/bid/index.ts @@ -1,4 +1,2 @@ -export { default as ShowHistoriesModal } from './show-histories-modal'; -export { default as ShowHistoriesBidGraysApiModal } from './show-histories-bid-grays-api-modal'; -export { default as ShowHistoriesBidPicklesApiModal } from './show-histories-bid-pickles-api-modal'; -export { default as BidModal } from './bid-modal'; +export { default as ShowHistoriesModal } from "./show-histories-modal"; +export { default as BidModal } from "./bid-modal"; diff --git a/auto-bid-admin/src/components/bid/show-histories-api/allbids-histories-view.tsx b/auto-bid-admin/src/components/bid/show-histories-api/allbids-histories-view.tsx new file mode 100644 index 0000000..7c9c0d7 --- /dev/null +++ b/auto-bid-admin/src/components/bid/show-histories-api/allbids-histories-view.tsx @@ -0,0 +1,71 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ + +import Table from "../../../lib/table/table"; +import { IColumn } from "../../../lib/table/type"; +import { formatTime } from "../../../utils"; +export interface IGraysHistoriesViewProps { + histories: Record[]; +} + +export default function AllbidsHistoriesView({ + histories, +}: IGraysHistoriesViewProps) { + type BidHistoryEntry = { + row_id: number; + date: string; // ISO datetime string + amount: number; // Số tiền đặt giá + proxyamount: number; // Giá proxy tối đa + bidQty: number; // Số lượng + flashBuy: boolean; // Mua ngay + proxyBid: boolean; // Có phải đấu giá tự động + instantBid: boolean; // Đặt giá ngay + userName: string; // Tên người dùng + bidBidderID: number; // ID người đặt giá + $$hashKey?: string; // Khóa nội bộ Angular (không cần thiết, có thể bỏ hoặc để optional) + }; + + const columns: IColumn[] = [ + { + title: "Username", + key: "userName", + }, + { + title: "Amount", + key: "amount", + }, + { + title: "Proxy amount", + key: "proxyamount", + }, + { + title: "Bid Qty", + key: "bidQty", + }, + { + title: "Bid at", + key: "date", + renderRow(row) { + return {formatTime(row.date)}; + }, + }, + ]; + + return ( + + ); +} diff --git a/auto-bid-admin/src/components/bid/show-histories-api/grays-histories-view.tsx b/auto-bid-admin/src/components/bid/show-histories-api/grays-histories-view.tsx new file mode 100644 index 0000000..17dbfd9 --- /dev/null +++ b/auto-bid-admin/src/components/bid/show-histories-api/grays-histories-view.tsx @@ -0,0 +1,80 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import { useMemo } from "react"; +import { extractNumber, formatTime } from "../../../utils"; +import Table from "../../../lib/table/table"; +import { IColumn } from "../../../lib/table/type"; + +export interface IGraysHistoriesViewProps { + histories: Record[]; +} + +export default function GraysHistoriesView({ + histories, +}: IGraysHistoriesViewProps) { + type BidHistoryEntry = { + row_id: number; + Price: string; + Quantity: number; + WinningQuantity: number; + UserShortAddress: string; + UserInitials: string; + OriginalDate: string; + }; + + const columns: IColumn[] = [ + { + title: "Bidding Details", + key: "UserInitials", + renderRow(row) { + return ( + {`${row["UserInitials"]} - ${row["UserShortAddress"]}`} + ); + }, + }, + { + title: "Bid Time", + key: "OriginalDate", + renderRow(row) { + return ( + + {formatTime( + new Date(extractNumber(row["OriginalDate"]) || 0).toUTCString(), + "HH:mm:ss DD/MM/YYYY" + )} + + ); + }, + }, + { + title: "Bid Price", + key: "Price", + }, + { + title: "Bid Qty", + key: "Quantity", + }, + { + title: "Win Qty", + key: "WinningQuantity", + }, + ]; + + return ( +
+ ); +} diff --git a/auto-bid-admin/src/components/bid/show-histories-api/pickles-histories-view.tsx b/auto-bid-admin/src/components/bid/show-histories-api/pickles-histories-view.tsx new file mode 100644 index 0000000..a654b38 --- /dev/null +++ b/auto-bid-admin/src/components/bid/show-histories-api/pickles-histories-view.tsx @@ -0,0 +1,79 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import { useMemo } from "react"; +import { formatTime } from "../../../utils"; +import { IColumn } from "../../../lib/table/type"; +import Table from "../../../lib/table/table"; + +export interface IGraysHistoriesViewProps { + histories: Record[]; +} + +export default function PicklesHistoriesView({ + histories, +}: IGraysHistoriesViewProps) { + // const rows = useMemo(() => { + // return histories.map((element, index) => ( + // + // {element["bidderAnonName"]} + // {element["actualBid"]} + // + // {formatTime( + // new Date(element["bidTimeInMilliSeconds"]).toUTCString(), + // "HH:mm:ss DD/MM/YYYY" + // )} + // + // + // )); + // }, [histories]); + + type BidHistoryEntry = { + row_id: number; + bidderAnonName: string; + actualBid: number; + bidTimeInMilliSeconds: number; + }; + + const columns: IColumn[] = [ + { + title: "Bidder name", + key: "bidderAnonName", + }, + { + title: "Actual bid", + key: "actualBid", + }, + { + title: "Time", + key: "bidTimeInMilliSeconds", + renderRow(row) { + return ( + + {formatTime( + new Date(row["bidTimeInMilliSeconds"]).toUTCString(), + "HH:mm:ss DD/MM/YYYY" + )} + + ); + }, + }, + ]; + + return ( +
+ ); +} diff --git a/auto-bid-admin/src/components/bid/show-histories-api/show-histories-api-modal.tsx b/auto-bid-admin/src/components/bid/show-histories-api/show-histories-api-modal.tsx new file mode 100644 index 0000000..0093bc1 --- /dev/null +++ b/auto-bid-admin/src/components/bid/show-histories-api/show-histories-api-modal.tsx @@ -0,0 +1,81 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import { LoadingOverlay, Modal, ModalProps } from "@mantine/core"; +import { useCallback, useEffect, useMemo, useState } from "react"; +import { getDetailBidHistories } from "../../../apis/bid-histories"; +import { IBid } from "../../../system/type"; +import GraysHistoriesView from "./grays-histories-view"; +import constants from "../../../constant"; +import PicklesHistoriesView from "./pickles-histories-view"; +import AllbidsHistoriesView from "./allbids-histories-view"; + +export interface IShowHistoriesApiModalProps extends ModalProps { + data: IBid | null; + onUpdated?: () => void; +} + +export default function ShowHistoriesApiModal({ + data, + onUpdated, + ...props +}: IShowHistoriesApiModalProps) { + const [histories, setHistories] = useState[]>([]); + + const [loading, setLoading] = useState(false); + + const handleCallApi = useCallback(async () => { + if (!data?.lot_id) { + setHistories([]); + + return; + } + + setLoading(true); + const response = await getDetailBidHistories(data?.lot_id); + setLoading(false); + + if (response.data && response.data) { + const values = (response.data as Record[]).map( + (item, index) => { + return { + ...item, + row_id: String(index), + }; + } + ); + + setHistories(values); + } + }, [data]); + + useEffect(() => { + handleCallApi(); + }, [handleCallApi]); + + const generateView = useMemo(() => { + switch (data?.web_bid.origin_url) { + case constants.grays: + return ; + case constants.pickles: + return ; + case constants.allbids: + return ; + } + }, [data?.web_bid.origin_url, histories]); + + return ( + BIDDING HISTORY} + centered + > + {generateView} + + + ); +} diff --git a/auto-bid-admin/src/components/bid/show-histories-bid-grays-api-modal.tsx b/auto-bid-admin/src/components/bid/show-histories-bid-grays-api-modal.tsx deleted file mode 100644 index 76b9cdb..0000000 --- a/auto-bid-admin/src/components/bid/show-histories-bid-grays-api-modal.tsx +++ /dev/null @@ -1,78 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -import { LoadingOverlay, Modal, ModalProps, Table } from '@mantine/core'; -import { useCallback, useEffect, useMemo, useState } from 'react'; -import { getDetailBidHistories } from '../../apis/bid-histories'; -import { IBid } from '../../system/type'; -import { extractNumber, formatTime } from '../../utils'; - -export interface IShowHistoriesBidGraysApiModalProps extends ModalProps { - data: IBid | null; - onUpdated?: () => void; -} - -export default function ShowHistoriesBidGraysApiModal({ data, onUpdated, ...props }: IShowHistoriesBidGraysApiModalProps) { - const [histories, setHistories] = useState[]>([]); - - const [loading, setLoading] = useState(false); - - const rows = useMemo(() => { - return histories.map((element, index) => ( - - {`${element['UserInitials']} - ${element['UserShortAddress']}`} - {formatTime(new Date(extractNumber(element['OriginalDate']) || 0).toUTCString(), 'HH:mm:ss DD/MM/YYYY')} - {`AU $${element['Price']}`} - {`${element['Quantity']}`} - {`${element['WinningQuantity']}`} - - )); - }, [histories]); - - const handleCallApi = useCallback(async () => { - if (!data?.lot_id) { - setHistories([]); - - return; - } - - setLoading(true); - const response = await getDetailBidHistories(data?.lot_id); - setLoading(false); - - if (response.data && response.data) { - setHistories(response.data); - } - }, [data]); - - useEffect(() => { - handleCallApi(); - }, [handleCallApi]); - - return ( - BIDDING HISTORY} centered> -
- - - Bidding Details - Bid Time - Bid Price - Bid Qty - Win Qty - - - - {histories.length <= 0 ? ( - - - None - - - ) : ( - rows - )} - -
- - - - ); -} diff --git a/auto-bid-admin/src/constant/index.ts b/auto-bid-admin/src/constant/index.ts index 9daa38e..d9f16e2 100644 --- a/auto-bid-admin/src/constant/index.ts +++ b/auto-bid-admin/src/constant/index.ts @@ -1,8 +1,13 @@ - const constants = { - grays: 'https://www.grays.com', - pickles:'https://www.pickles.com.au' -} +const constants = { + grays: "https://www.grays.com", + pickles: "https://www.pickles.com.au", + allbids: "https://www.allbids.com.au", +}; -export const haveHistories = [constants.grays, constants.pickles] +export const haveHistories = [ + constants.grays, + constants.pickles, + constants.allbids, +]; -export default constants \ No newline at end of file +export default constants; diff --git a/auto-bid-admin/src/pages/bids.tsx b/auto-bid-admin/src/pages/bids.tsx index be6d62d..bde553e 100644 --- a/auto-bid-admin/src/pages/bids.tsx +++ b/auto-bid-admin/src/pages/bids.tsx @@ -21,22 +21,18 @@ import { } 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 constants, { haveHistories } from "../constant"; +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 DeleteRowAction from "../components/bid/delete-row-action"; -import { useChoosesStore } from "../lib/zustand/use-chooses-store"; +import ShowHistoriesApiModal from "../components/bid/show-histories-api/show-histories-api-modal"; export default function Bids() { const refTableFn: TRefTableFn = useRef({}); @@ -47,12 +43,9 @@ export default function Bids() { const { setChooses } = useChoosesStore(); - const [openedHistories, historiesModel] = useDisclosure(false); - const [openedHistoriesGraysApi, historiesGraysApiModel] = - useDisclosure(false); + const [openedHistories, historiesModal] = useDisclosure(false); - const [openedHistoriesPicklesApi, historiesPicklesApiModel] = - useDisclosure(false); + const [openedHistoriesView, openedHistoriesViewModal] = useDisclosure(false); const [openedBid, bidModal] = useDisclosure(false); const columns: IColumn[] = [ @@ -84,7 +77,9 @@ export default function Bids() { title: "Web", typeFilter: "none", renderRow(row) { - return {extractDomainSmart(row.web_bid.origin_url)}; + return ( + {extractDomainSmart(row.web_bid?.origin_url) || "None"} + ); }, }, { @@ -238,28 +233,6 @@ export default function Bids() { }} actionsOptions={{ showMainAction: false, - actions: [ - { - 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, - }, - ], leftActionSession: (