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.
195 lines
5.1 KiB
195 lines
5.1 KiB
import { useEffect, useRef, useState } from "react";
|
|
import { useUserData } from "../../Hooks/Users";
|
|
import AddUser from "./AddUser";
|
|
import UserTable from "./UserTable";
|
|
import {
|
|
LeftOutlined,
|
|
PlusOutlined,
|
|
RightOutlined,
|
|
SearchOutlined,
|
|
} from "@ant-design/icons";
|
|
import { Select, theme } from "antd";
|
|
// @ts-ignore
|
|
import IconSearch from "../../assets/searchIcon.png";
|
|
//@ts-ignore
|
|
import addicon from "../../assets/addiconpng.png";
|
|
import { Button, Input, Pagination, Space, Typography } from "antd";
|
|
|
|
const User = () => {
|
|
const [page, setPage] = useState(1);
|
|
const [pageSize, setPageSize] = useState<number>(() => {
|
|
const saved = localStorage.getItem("general_pageSize");
|
|
return saved ? Number(saved) : 15;
|
|
});
|
|
const [open, setOpen] = useState(false);
|
|
const [search, setSearch] = useState("");
|
|
const showModal = () => {
|
|
setOpen(true);
|
|
};
|
|
|
|
useEffect(() => {
|
|
localStorage.setItem("general_pageSize", String(pageSize));
|
|
}, [pageSize]);
|
|
|
|
const Next = () => {
|
|
const a = Number(page) + 1;
|
|
setPage(a);
|
|
};
|
|
const Previos = () => {
|
|
Number(page);
|
|
if (page > 1) {
|
|
const a = Number(page) - 1;
|
|
setPage(a);
|
|
}
|
|
};
|
|
|
|
const { data, refetch, isLoading } = useUserData({
|
|
name: search,
|
|
team: "",
|
|
page: page,
|
|
page_size: pageSize,
|
|
});
|
|
|
|
const pageSizeOptions = [15, 20, 30, 40, 50];
|
|
|
|
const handlePageSizeChange = (value: number) => {
|
|
setPageSize(value);
|
|
setPage(1);
|
|
};
|
|
|
|
const timerRef = useRef<NodeJS.Timeout | null>(null);
|
|
const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {
|
|
if (timerRef.current) {
|
|
clearTimeout(timerRef.current);
|
|
}
|
|
|
|
const searchText = e.target.value;
|
|
timerRef.current = setTimeout(() => {
|
|
setSearch(searchText);
|
|
}, 1000);
|
|
};
|
|
const themes = localStorage.getItem("theme") === "true" ? true : false;
|
|
|
|
const { token } = theme.useToken();
|
|
|
|
return (
|
|
<div>
|
|
{open && <AddUser open={open} setOpen={setOpen} refetch={refetch} />}
|
|
<div className="header d-flex">
|
|
<Typography className="title">Users</Typography>
|
|
{/* <button
|
|
className="btn-add d-flex"
|
|
style={{ marginRight: 0 }}
|
|
onClick={showModal}
|
|
>
|
|
<img src={addicon} style={{ marginRight: 8 }} alt="" />
|
|
Invite User
|
|
</button> */}
|
|
<Button
|
|
className="d-flex"
|
|
style={{
|
|
backgroundColor: "#f99e2c",
|
|
color: "white",
|
|
padding: 18,
|
|
}}
|
|
onClick={showModal}
|
|
icon={<PlusOutlined />}
|
|
>
|
|
Invite User
|
|
</Button>
|
|
</div>
|
|
<div className="filter d-flex">
|
|
{/* <div className="search-div">
|
|
<img src={IconSearch} alt="" />
|
|
<input
|
|
className={`search-input-${themes}`}
|
|
type="text"
|
|
placeholder="Search"
|
|
onChange={handleSearchChange}
|
|
/>
|
|
</div> */}
|
|
<div>
|
|
<Input
|
|
placeholder="Search"
|
|
prefix={<SearchOutlined />}
|
|
onChange={handleSearchChange}
|
|
/>
|
|
</div>
|
|
</div>
|
|
<UserTable data={data?.data} isLoading={isLoading} refetch={refetch} />
|
|
|
|
<Space style={{ width: "100%", marginTop: 10 }} 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 User;
|