src/views/Blog/useBlog.js (88 lines of code) (raw):
import { useEffect, useState, useRef } from "react";
import dayjs from "dayjs";
import { getBlogs } from "../../api/getBlogs";
export const useBlog = (locale) => {
const [blogs, setBlogs] = useState([]);
const [categorys, setCategorys] = useState([
{ label: "By Category", children: [] },
{ label: "By Time", children: [] },
]);
const [loading, setLoading] = useState(false);
const [checked, setChecked] = useState([]);
const cachedBlogs = useRef([]);
const handleBlogs = async () => {
if (loading) return;
setLoading(true);
const result = await getBlogs(locale);
let _blogs = [];
const _categorys = [
{ label: "By Category", children: [] },
{ label: "By Time", children: [] },
];
const _time = new Set();
result.forEach((item) => {
_categorys[0].children.push({
label: item.label,
value: item.type,
});
if (item.children) {
item.children.forEach((slip) => {
const temp = { ...slip, type: item.type, typeLabel: item.label };
if (dayjs(slip.dateStr).isValid()) {
_time.add(dayjs(slip.dateStr).year());
temp.year = dayjs(slip.dateStr).year();
}
_blogs.push(temp);
});
}
});
_time.forEach((time) => {
_categorys[1].children.push({ label: time, value: time });
});
_blogs = _blogs.sort(
(a, b) => dayjs(b.dateStr).valueOf() - dayjs(a.dateStr).valueOf()
);
setBlogs(_blogs);
setCategorys(_categorys);
cachedBlogs.current = _blogs;
setLoading(false);
};
const filterBlogs = (value) => {
const years = value.filter((item) => Number(item) === item);
setBlogs(
cachedBlogs.current.filter((blog) => {
if (value.length === 0) return true;
return (
value.includes(blog.type) &&
(!years.length || value.includes(blog.year))
);
})
);
};
const onCheckboxChange = (e, value) => {
const list = checked.slice();
if (e.target.checked) {
list.push(value);
} else {
const i = list.indexOf(value);
list.splice(i, 1);
}
setChecked(list);
filterBlogs(list);
};
const onClear = () => {
setChecked([]);
setBlogs(cachedBlogs.current);
};
useEffect(() => {
handleBlogs();
// eslint-disable-next-line
}, []);
return {
blogs,
categorys,
loading,
checked,
onCheckboxChange,
onClear,
};
};