diff --git a/frontend/app/bookmarks/page.js b/frontend/app/bookmarks/page.js new file mode 100644 index 0000000..7d4300f --- /dev/null +++ b/frontend/app/bookmarks/page.js @@ -0,0 +1,113 @@ +"use client"; + +import { getData } from "@/app/api/api-utils"; +import { endpoints } from "@/app/api/config"; +import { useEffect, useState, useCallback } from "react"; +import { usePathname, useRouter } from "next/navigation"; +import { useSearchParams } from "next/navigation"; +import ReleasesOverview from "@/app/components/ReleasesOverview/ReleasesOverview"; +import { useUserStore } from "@/app/store/user-store"; +import { LogInNeeded } from "@/app/components/LogInNeeded/LogInNeeded"; + +export default function Bookmarks() { + const router = useRouter(); + const pathname = usePathname(); + const userStore = useUserStore(); + + const [list, setList] = useState(); + const [releases, setReleases] = useState(); + const [page, setPage] = useState(0); + + const searchParams = useSearchParams(); + const createQueryString = useCallback( + (name, value) => { + const params = new URLSearchParams(searchParams.toString()); + params.set(name, value); + + return params.toString(); + }, + [searchParams], + ); + + // set list on initial page load + useEffect(() => { + const query = searchParams.get("list"); + if (query) { + setList(query); + } else { + setList("watching"); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + async function fetchData(list, page = 0) { + if (userStore.token) { + const url = `${endpoints.user.bookmarks[list]}?page=${page}&token=${userStore.token}`; + const data = await getData(url); + + // Handle initial load (page 0) or subsequent pagination + if (page === 0) { + setReleases(data.content); + } else { + setReleases([...releases, ...data.content]); + } + } + } + + useEffect(() => { + if (list) { + router.push(pathname + "?" + createQueryString("list", list)); + setReleases(null); + setPage(0); + fetchData(list); // Call fetchData here + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [list, userStore.token]); + + useEffect(() => { + if (list && releases) { + fetchData(list, page); // Use fetchData for pagination + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [page]); + + const chips = [ + { + title: "Смотрю", + list: "watching", + }, + { + title: "В планах", + list: "planned", + }, + { + title: "Просмотрено", + list: "watched", + }, + { + title: "Отложено", + list: "delayed", + }, + { + title: "Заброшено", + list: "abandoned", + }, + ]; + + return ( + <> + {!userStore.isAuth ? ( + + ) : ( + + )} + + ); +}