Skip to content

Commit 8bfb9db

Browse files
committed
add whitelist lookup
1 parent 2ddc76f commit 8bfb9db

File tree

4 files changed

+140
-0
lines changed

4 files changed

+140
-0
lines changed

src/App.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ export default function App(): React.ReactElement {
6363
<LinkColor>
6464
<Link to="/user">Users</Link>
6565
</LinkColor>
66+
|
67+
<LinkColor>
68+
<Link to="/whitelists">Whitelists</Link>
69+
</LinkColor>
6670
</div>
6771
<div className="w-full md:container md:mx-auto flex flex-col foreground rounded mt-5 p-5">
6872
<Outlet />

src/components/homePage.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@ export default function HomePage(): React.ReactElement {
3939
>
4040
Ticket Menu
4141
</Link>
42+
<Link
43+
to={"/whitelists"}
44+
className="border border-[#555555] rounded p-3 cursor-pointer grow clicky"
45+
>
46+
Whitelist Menu
47+
</Link>
4248

4349
<RoundData />
4450
</div>

src/components/whitelistPanel.tsx

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
import React, { useEffect, useState } from "react";
2+
import { callApi } from "../helpers/api";
3+
import { NameExpand } from "./nameExpand";
4+
import { LinkColor } from "./link";
5+
import { Dialog } from "./dialog";
6+
7+
type WhitelistPlayer = {
8+
id: number;
9+
ckey: string;
10+
whitelistStatus: string;
11+
};
12+
13+
type Filter = {
14+
[index: string]: boolean | undefined;
15+
};
16+
17+
export const WhitelistMenu: React.FC = () => {
18+
const [whitelistees, setWhitelistees] = useState<
19+
WhitelistPlayer[] | undefined
20+
>();
21+
22+
const [categories, setCategories] = useState<string[]>([]);
23+
24+
const [viewFilters, setViewFilters] = useState(false);
25+
const [filter, setFilter] = useState<Filter>({});
26+
27+
useEffect(() => {
28+
if (whitelistees) return;
29+
30+
callApi("/Whitelist").then((value) =>
31+
value.json().then((json: WhitelistPlayer[]) => {
32+
setWhitelistees(json);
33+
34+
json.forEach((whitelistee) => {
35+
whitelistee.whitelistStatus.split("|").forEach((status) => {
36+
setCategories((categories) =>
37+
categories.includes(status) ? categories : [...categories, status]
38+
);
39+
});
40+
});
41+
})
42+
);
43+
}, [whitelistees]);
44+
45+
useEffect(() => {
46+
const obj: Filter = {};
47+
categories.forEach((category) => {
48+
obj[category] = true;
49+
});
50+
setFilter(obj);
51+
}, [categories]);
52+
53+
const clearFilters = () => {
54+
const obj: Filter = {};
55+
categories.forEach((category) => {
56+
obj[category] = false;
57+
});
58+
setFilter(obj);
59+
};
60+
61+
if (!whitelistees) {
62+
return "Loading...";
63+
}
64+
65+
const filteredWhitelistees = whitelistees.filter((whitelistee) => {
66+
const whitelists = whitelistee.whitelistStatus.split("|");
67+
68+
let filtered = true;
69+
70+
whitelists.forEach((whitelist) => {
71+
if (filter[whitelist] == true) {
72+
filtered = false;
73+
}
74+
});
75+
76+
if (filtered) return false;
77+
78+
return true;
79+
});
80+
81+
return (
82+
<div className="flex flex-col gap-3">
83+
<div className="flex flex-row gap-2 flex-wrap">
84+
<LinkColor onClick={() => setViewFilters(true)}>Set Filters</LinkColor>
85+
{viewFilters && (
86+
<Dialog open={viewFilters} toggle={() => setViewFilters(false)}>
87+
<LinkColor className="pl-5" onClick={() => clearFilters()}>
88+
Clear All Filters
89+
</LinkColor>
90+
<div className="flex flex-col gap-1">
91+
{categories.map((category) => (
92+
<div key={category} className="flex flex-row gap-1">
93+
<span>{!filter[category] ? "❌" : "✅"}</span>
94+
<LinkColor
95+
onClick={() => {
96+
if (filter[category]) {
97+
const newFilter = { ...filter };
98+
newFilter[category] = false;
99+
setFilter(newFilter);
100+
} else {
101+
const newFilter = { ...filter };
102+
newFilter[category] = true;
103+
setFilter(newFilter);
104+
}
105+
}}
106+
>
107+
{category}
108+
</LinkColor>
109+
</div>
110+
))}
111+
</div>
112+
</Dialog>
113+
)}
114+
</div>
115+
<div className="flex flex-col gap-2">
116+
{filteredWhitelistees.map((whitelistee) => (
117+
<div key={whitelistee.ckey} className="flex flex-col">
118+
<NameExpand name={whitelistee.ckey} />
119+
{whitelistee.whitelistStatus.split("|").join(" ")}
120+
</div>
121+
))}
122+
</div>
123+
</div>
124+
);
125+
};

src/main.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { Stickybans } from "./components/stickybans";
77
import { Tickets } from "./components/tickets";
88
import HomePage from "./components/homePage";
99
import { createHashRouter, RouterProvider } from "react-router-dom";
10+
import { WhitelistMenu } from "./components/whitelistPanel";
1011

1112
const router = createHashRouter([
1213
{
@@ -38,6 +39,10 @@ const router = createHashRouter([
3839
return params.ckey || "";
3940
},
4041
},
42+
{
43+
path: "/whitelists",
44+
element: <WhitelistMenu />,
45+
},
4146
],
4247
},
4348
]);

0 commit comments

Comments
 (0)