-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathResourcePage.tsx
More file actions
92 lines (86 loc) · 2.92 KB
/
ResourcePage.tsx
File metadata and controls
92 lines (86 loc) · 2.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import { useEffect, useState } from "react";
import { useParams } from "react-router";
import { JsonData, Entry } from "./types";
import ResourceCard from "./ResourceCard";
import { extractTags, sortEntries } from "./utils";
const ResourcePage = () => {
const { category } = useParams();
const [data, setData] = useState<JsonData | null>(null);
const [entries, setEntries] = useState<Entry[]>([]);
const [tags, setTags] = useState<string[]>([]);
const [filters, setFilters] = useState<string[]>([]);
useEffect(() => {
const fetchData = async () => {
if (category) {
const dataObject = (await import(
`../../data/resources/${category}.json`
)) as { default: JsonData };
return dataObject.default;
} else {
return { pageName: "", entries: [] };
}
};
fetchData()
.then((json) => {
if (json.entries.length > 0) {
setData(json);
setEntries(sortEntries(json.entries));
setTags(extractTags(json.entries));
}
})
.catch(console.error);
}, [category]);
const filterColor = (tag: string) =>
filters.includes(tag) ? "bg-slate-400" : "bg-slate-300";
if (data) {
return (
<>
<section className="w-full bg-background">
<h3 className="my-12 text-center text-4xl text-primary">
{data.pageName}
</h3>
<div className="mb-6 flex w-full flex-col items-center justify-center text-center">
<h4 className="text-xl font-bold text-primary">Categories</h4>
<div className="mt-4 flex w-96 flex-wrap justify-center gap-2 xl:w-[600px]">
{tags.map((t) => (
<div
key={t}
onClick={() => {
setFilters([...filters, t]);
setEntries(entries.filter((e) => e.tags.includes(t)));
}}
>
<button
className={`rounded-xl border-transparent bg-slate-300 px-2 pb-1 ${filterColor(t)}`}
>
{t}
</button>
</div>
))}
{filters.length > 0 && (
<button
className="rounded-xl bg-accent px-2 pb-1 text-primary"
onClick={() => {
setFilters([]);
setEntries(sortEntries(data.entries));
}}
>
Clear filters ×
</button>
)}
</div>
</div>
<div className="flex w-full justify-center pb-12">
<div className="mx-4 flex flex-wrap justify-center gap-6 sm:w-5/6 xl:w-3/4">
{entries.map((e) => (
<ResourceCard entry={e} key={e.title} />
))}
</div>
</div>
</section>
</>
);
}
return <></>;
};
export default ResourcePage;