You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
186 lines
5.1 KiB
186 lines
5.1 KiB
import { useEffect, useState } from "react";
|
|
import CallTable from "./CallTable";
|
|
import { useCallData } from "../../Hooks/CallRequests";
|
|
import {
|
|
Button,
|
|
Input,
|
|
Radio,
|
|
RadioChangeEvent,
|
|
Select,
|
|
Space,
|
|
Typography,
|
|
} from "antd";
|
|
import { TCall } from "../../types/CallRequests/TCall";
|
|
import { TSocket } from "../../types/common/TSocket";
|
|
import { LeftOutlined, RightOutlined } from "@ant-design/icons";
|
|
import { theme } from "antd";
|
|
|
|
const Call = ({ socketData }: { socketData: TSocket | undefined }) => {
|
|
const [status, setStatus] = useState("Awaiting");
|
|
const [page, setPage] = useState(1);
|
|
const [pageSize, setPageSize] = useState(10);
|
|
|
|
const [tableData, setTableData] = useState<TCall[]>();
|
|
const { data, isLoading, refetch } = useCallData({
|
|
status: status,
|
|
page: page,
|
|
page_size: pageSize,
|
|
});
|
|
|
|
const pageSizeOptions = [10, 20, 30, 40, 50];
|
|
|
|
const handlePageSizeChange = (value: number) => {
|
|
setPageSize(value);
|
|
setPage(1);
|
|
};
|
|
|
|
// const theme = localStorage.getItem("theme") === "true" ? true : false;
|
|
const { token } = theme.useToken();
|
|
|
|
useEffect(() => {
|
|
setTableData(data?.data);
|
|
}, [data]);
|
|
useEffect(() => {
|
|
let dataStatus = socketData?.callback_request?.status;
|
|
if (socketData?.type === "callback_request") {
|
|
if (status === "Awaiting") {
|
|
setTableData((prev) => {
|
|
if (prev && prev.length >= 15) {
|
|
prev.pop();
|
|
}
|
|
if (dataStatus === "Resolved") {
|
|
const data = (prev || []).filter(
|
|
(b: TCall) => b?.id !== socketData?.callback_request?.id
|
|
);
|
|
return data;
|
|
}
|
|
if (dataStatus === "Awaiting") {
|
|
return [socketData?.callback_request, ...(prev || [])] as TCall[];
|
|
}
|
|
return prev;
|
|
});
|
|
} else if (status === "Resolved") {
|
|
setTableData((prev) => {
|
|
if (prev && prev.length >= 15) {
|
|
prev.pop();
|
|
}
|
|
if (dataStatus === "Awaiting") {
|
|
const data = (prev || []).filter(
|
|
(b: TCall) => b?.id !== socketData?.callback_request?.id
|
|
);
|
|
return data;
|
|
}
|
|
if (dataStatus === "Resolved") {
|
|
return [socketData?.callback_request, ...(prev || [])] as TCall[];
|
|
}
|
|
return prev;
|
|
});
|
|
}
|
|
}
|
|
}, [socketData]);
|
|
|
|
const Next = () => {
|
|
const a = Number(page) + 1;
|
|
setPage(a);
|
|
};
|
|
const Previos = () => {
|
|
Number(page);
|
|
if (page > 1) {
|
|
const a = Number(page) - 1;
|
|
setPage(a);
|
|
}
|
|
};
|
|
|
|
return (
|
|
<div>
|
|
<div>
|
|
<div className="header d-flex">
|
|
<Typography className="title">Call Requests</Typography>
|
|
</div>
|
|
<div className="filter d-flex">
|
|
<Radio.Group
|
|
onChange={(e: RadioChangeEvent) => setStatus(e.target.value)}
|
|
size="middle"
|
|
value={status}
|
|
style={{ marginLeft: 20 }}
|
|
>
|
|
<Radio.Button value={"Awaiting"}>Awaiting</Radio.Button>
|
|
<Radio.Button value={"Resolved"}>Resolved</Radio.Button>
|
|
</Radio.Group>
|
|
</div>
|
|
</div>
|
|
<CallTable data={tableData} isLoading={isLoading} refetch={refetch} />
|
|
|
|
<Space style={{ width: "100%", marginTop: 40 }} direction="vertical">
|
|
<Space
|
|
style={{
|
|
justifyContent: "end",
|
|
position: "fixed",
|
|
bottom: 0,
|
|
left: 0,
|
|
width: "100%",
|
|
backgroundColor: token.colorBgContainer,
|
|
boxShadow: "0 4px 8px rgba(0, 0, 0, 0.4)",
|
|
padding: "10px 0",
|
|
zIndex: 1000,
|
|
}}
|
|
wrap
|
|
>
|
|
<Select
|
|
value={pageSize}
|
|
onChange={handlePageSizeChange}
|
|
style={{ width: 65, marginRight: 16 }}
|
|
options={pageSizeOptions.map((size) => ({
|
|
label: `${size}`,
|
|
value: size,
|
|
}))}
|
|
/>
|
|
|
|
<Button
|
|
onClick={Previos}
|
|
disabled={data?.previous ? false : true}
|
|
style={{
|
|
backgroundColor: token.colorBgContainer,
|
|
color: token.colorText,
|
|
border: "none",
|
|
}}
|
|
>
|
|
<LeftOutlined />
|
|
</Button>
|
|
<Input
|
|
disabled
|
|
style={{
|
|
width: 40,
|
|
textAlign: "center",
|
|
background: token.colorBgContainer,
|
|
border: "1px solid",
|
|
borderColor: token.colorText,
|
|
color: token.colorText,
|
|
}}
|
|
value={page}
|
|
onChange={(e) => {
|
|
let num = e.target.value;
|
|
if (Number(num) && num !== "0") {
|
|
setPage(Number(num));
|
|
}
|
|
}}
|
|
/>
|
|
<Button
|
|
onClick={Next}
|
|
disabled={data?.next ? false : true}
|
|
style={{
|
|
backgroundColor: token.colorBgContainer,
|
|
color: token.colorText,
|
|
border: "none",
|
|
}}
|
|
>
|
|
<RightOutlined />
|
|
</Button>
|
|
</Space>
|
|
</Space>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default Call;
|