feat(frontend): add user favorites page

This commit is contained in:
Kentai Radiquum 2024-05-01 12:13:34 +05:00
parent 332e1d1918
commit 90f2ba54e5
Signed by: Radiquum
GPG key ID: 858E8EE696525EED
4 changed files with 81 additions and 10 deletions

View file

@ -9,7 +9,7 @@ router = APIRouter()
@router.get("", summary="Get user favorites list")
async def GetUserFavorites(request: Request, token: str, page: int = 0):
return await apiRequest(
request, ENDPOINTS["user"]["favorite"], f"/all/{page}", query=f"?token={token}"
request, ENDPOINTS["user"]["favorite"], f"all/{page}", query=f"?token={token}"
)
@ -18,7 +18,7 @@ async def addReleaseToFavorites(request: Request, release_id: int, token: str):
return await apiRequest(
request,
ENDPOINTS["user"]["favorite"],
f"/add/{release_id}",
f"add/{release_id}",
query=f"?token={token}",
)
@ -28,6 +28,6 @@ async def deleteReleaseFromFavorites(request: Request, release_id: int, token: s
return await apiRequest(
request,
ENDPOINTS["user"]["favorite"],
f"/delete/{release_id}",
f"delete/{release_id}",
query=f"?token={token}",
)

View file

@ -20,6 +20,7 @@ export const endpoints = {
delayed: `${API_URL}/bookmarks/delayed`,
abandoned: `${API_URL}/bookmarks/abandoned`,
},
favorites: `${API_URL}/favorites`,
},
release: `${API_URL}/release`,
};

View file

@ -27,13 +27,13 @@ export const NavigationRail = (props) => {
icon: "bookmark",
path: "/bookmarks",
},
//
// {
// title: "Избранное",
// icon: "favorite",
// path: "/favorites",
// },
//
{
title: "Избранное",
icon: "favorite",
path: "/favorites",
},
{
title: "История",
icon: "history",

View file

@ -0,0 +1,70 @@
"use client";
import { LogInNeeded } from "@/app/components/LogInNeeded/LogInNeeded";
import ReleasesOverview from "../components/ReleasesOverview/ReleasesOverview";
import { useUserStore } from "@/app/store/user-store";
import { endpoints } from "../api/config";
import { useEffect, useState } from "react";
import { getData } from "../api/api-utils";
export default function History() {
const userStore = useUserStore();
const [releases, setReleases] = useState();
const [page, setPage] = useState(0);
const [isNextPage, setIsNextPage] = useState(true);
async function fetchData(page = 0) {
if (userStore.token) {
const url = `${endpoints.user.favorites}?page=${page}&token=${userStore.token}`;
const data = await getData(url);
if (data.content.length < 25) {
setIsNextPage(false);
} else {
setIsNextPage(true);
}
// Handle initial load (page 0) or subsequent pagination
if (page === 0) {
setReleases(data.content);
} else {
setReleases([...releases, ...data.content]);
}
}
}
useEffect(() => {
fetchData();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [userStore]);
useEffect(() => {
if (releases) {
fetchData(page); // Use fetchData for pagination
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [page]);
return (
<>
{!userStore.isAuth ? (
<LogInNeeded />
) : releases > 0 ? (
<ReleasesOverview
page={page}
setPage={setPage}
releases={releases}
isNextPage={isNextPage}
/>
) : (
<div className="absolute padding primary center middle small-round">
<i className="extra">sentiment_dissatisfied</i>
<h5>Здесь пока ничего нет.</h5>
<p>Добавьте любимое аниме, что бы его не потерять.</p>
</div>
)}
</>
);
}