import { Badge, Box, Button, Image, Text, Tooltip } from "@mantine/core"; import { useDisclosure } from "@mantine/hooks"; import moment from "moment"; import { useEffect, useState } from "react"; import { Socket } from "socket.io-client"; import { getImagesWorking } from "../../apis/bid"; import { useStatusToolStore } from "../../lib/zustand/use-status-tool-store"; import { IBid, IWebBid } from "../../system/type"; import { cn, extractDomainSmart, findNearestClosingChild, isTimeReached, stringToColor, subtractSeconds } from "../../utils"; import ShowImageModal from "./show-image-modal"; export interface IWorkingPageProps { data: (IBid | IWebBid) & { type: string }; socket: Socket; } export default function WorkingPage({ data, socket }: IWorkingPageProps) { const fallbackSrc = "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRGh5WFH8TOIfRKxUrIgJZoDCs1yvQ4hIcppw&s"; const [opened, { open, close }] = useDisclosure(false); const [imageSrc, setImageSrc] = useState(null); const [lastUpdate, setLastUpdate] = useState(null); const [payloadLoginStatus, setPayloadLoginStatus] = useState<{ data: IWebBid; login_status: boolean; } | null>(null); const { statusTool } = useStatusToolStore(); function isIBid(obj: IBid | IWebBid): obj is IBid { return "name" in obj; } const renderUrl = ( { type, id }: (IBid | IWebBid) & { type: string }, name: string ) => { return `${import.meta.env.VITE_BASE_URL}bids/status-working/${type .replace("_", "-") .toLowerCase()}/${id}/${name}`; }; const extractTime = (filename: string) => { return Number(filename.split("-")[0]) || 0; }; const statusLabel = () => { if ( statusTool && statusTool === "online" && payloadLoginStatus?.login_status ) { return "logined"; } return !statusTool || statusTool !== "online" ? "Unknown" : "logout"; }; useEffect(() => { const updateImage = ({ type, id, filename, }: { type: string; filename: string; id: IBid["id"]; }) => { if (type == data.type && id == data.id) { setLastUpdate(new Date(extractTime(filename))); setImageSrc(renderUrl(data, filename)); } }; socket.on("working", updateImage); return () => { socket.off("working", updateImage); }; // eslint-disable-next-line react-hooks/exhaustive-deps }, [socket, data.id, data.type]); useEffect(() => { const onLoginStatus = (data: { data: IWebBid; login_status: boolean }) => { setPayloadLoginStatus(data); }; const origin_url = isIBid(data) ? data.web_bid.origin_url : data.origin_url; socket.on(`login-status.${origin_url}`, onLoginStatus); return () => { socket.off(`login-status.${origin_url}`, onLoginStatus); }; }, [data, socket]); useEffect(() => { (async () => { const result = await getImagesWorking(data); if (!result || !result.data) return; const filename = result.data[0]; setImageSrc(renderUrl(data, filename)); setLastUpdate(new Date(extractTime(filename))); })(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); if(!isIBid(data)){ console.log(data) } return ( <> {isIBid(data) ? data.name : "Tracking page"} {isIBid(data) && ( {`Max price: $${data.max_price}`} )} {isIBid(data) && ( {`Current price: $${data.current_price}`} )} {moment(lastUpdate).format("HH:mm:ss DD/MM/YYYY")} {!isIBid(data) && {`TT: ${moment(subtractSeconds(findNearestClosingChild(data)?.close_time || '', data.early_tracking_seconds)).format( "HH:mm:ss DD/MM/YYYY" )}`}} {isIBid(data) && ( {`CLT: ${moment(data.close_time).format( "HH:mm:ss DD/MM/YYYY" )}`} )} {isIBid(data) && data.close_time && !isTimeReached( subtractSeconds( data.close_time, data.web_bid?.early_tracking_seconds || 0 ) ) && ( {`TT: ${moment( subtractSeconds( data.close_time, data.web_bid?.early_tracking_seconds || 0 ) ).format("HH:mm:ss DD/MM/YYYY")}`} )} {statusLabel()} {isIBid(data) ? extractDomainSmart(data.web_bid.origin_url) : extractDomainSmart(data.origin_url)} ); }