mirror of
https://github.com/Radiquum/AniX.git
synced 2025-04-10 02:04:38 +00:00
feat: add continue watching section to the release page
This commit is contained in:
parent
ff2dbdfac1
commit
bdbb8cc548
3 changed files with 98 additions and 4 deletions
90
app/components/ContinueWatching/ContinueWatching.tsx
Normal file
90
app/components/ContinueWatching/ContinueWatching.tsx
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
"use client";
|
||||||
|
|
||||||
|
import { Card } from "flowbite-react";
|
||||||
|
import { ReleaseLinkList } from "#/components/ReleaseLink/ReleaseLinkList";
|
||||||
|
import { useUserStore } from "#/store/auth";
|
||||||
|
import { ENDPOINTS } from "#/api/config";
|
||||||
|
import { BookmarksList, useSWRfetcher } from "#/api/utils";
|
||||||
|
import useSWR from "swr";
|
||||||
|
import { useEffect, useState } from "react";
|
||||||
|
|
||||||
|
export const ContinueWatching = () => {
|
||||||
|
const userStore = useUserStore();
|
||||||
|
|
||||||
|
function useFetchReleases(listName: string) {
|
||||||
|
let url: string;
|
||||||
|
if (userStore.token) {
|
||||||
|
url = `${ENDPOINTS.user.bookmark}/all/${BookmarksList[listName]}/0?sort=1&token=${userStore.token}`;
|
||||||
|
}
|
||||||
|
const { data, isLoading, error } = useSWR(url, useSWRfetcher);
|
||||||
|
return [data, isLoading, error];
|
||||||
|
}
|
||||||
|
|
||||||
|
const [watchingData, watchingLoading, watchingError] =
|
||||||
|
useFetchReleases("watching");
|
||||||
|
const [plannedData, plannedLoading, plannedError] =
|
||||||
|
useFetchReleases("planned");
|
||||||
|
const [delayedData, delayedLoading, delayedError] =
|
||||||
|
useFetchReleases("delayed");
|
||||||
|
|
||||||
|
const [releaseData, setReleaseData] = useState<any[]>([]);
|
||||||
|
|
||||||
|
const firstN = (arr, n = 1) => arr.slice(0, n);
|
||||||
|
function _randomize(array: any[], limit: number) {
|
||||||
|
const toRand = array.slice();
|
||||||
|
let currentIndex = toRand.length;
|
||||||
|
while (currentIndex != 0) {
|
||||||
|
let randomIndex = Math.floor(Math.random() * currentIndex);
|
||||||
|
currentIndex--;
|
||||||
|
[toRand[currentIndex], toRand[randomIndex]] = [
|
||||||
|
toRand[randomIndex],
|
||||||
|
toRand[currentIndex],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
return firstN(toRand, limit);
|
||||||
|
}
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (!watchingLoading && !plannedLoading && !delayedLoading) {
|
||||||
|
const data = [
|
||||||
|
...(watchingData.content || []),
|
||||||
|
...(plannedData.content || []),
|
||||||
|
...(delayedData.content || []),
|
||||||
|
];
|
||||||
|
console.log("loaded data:", data);
|
||||||
|
const randomizedData = _randomize(data, 3);
|
||||||
|
setReleaseData(randomizedData);
|
||||||
|
}
|
||||||
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
|
}, [watchingLoading, plannedLoading, delayedLoading]);
|
||||||
|
|
||||||
|
if (
|
||||||
|
!userStore.isAuth ||
|
||||||
|
watchingLoading ||
|
||||||
|
plannedLoading ||
|
||||||
|
delayedLoading ||
|
||||||
|
releaseData.length == 0
|
||||||
|
)
|
||||||
|
return <></>;
|
||||||
|
|
||||||
|
console.log("randomized data:", releaseData);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Card>
|
||||||
|
<div className="flex justify-between py-2 border-b-2 border-black dark:border-white">
|
||||||
|
<h1>Продолжить просмотр</h1>
|
||||||
|
</div>
|
||||||
|
<div className="flex flex-col gap-4 mt-2">
|
||||||
|
{releaseData.map((release: any) => {
|
||||||
|
return (
|
||||||
|
<ReleaseLinkList
|
||||||
|
key={release.id}
|
||||||
|
{...release}
|
||||||
|
settings={{ showDescription: false }}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</Card>
|
||||||
|
);
|
||||||
|
};
|
|
@ -22,6 +22,7 @@ export const ReleaseLinkList = (props: {
|
||||||
settings?: {
|
settings?: {
|
||||||
showGenres?: boolean;
|
showGenres?: boolean;
|
||||||
showDescription?: boolean;
|
showDescription?: boolean;
|
||||||
|
showOrigTitle?: boolean;
|
||||||
};
|
};
|
||||||
chipsSettings?: {
|
chipsSettings?: {
|
||||||
enabled: boolean;
|
enabled: boolean;
|
||||||
|
@ -49,6 +50,7 @@ export const ReleaseLinkList = (props: {
|
||||||
const settings = {
|
const settings = {
|
||||||
showGenres: true,
|
showGenres: true,
|
||||||
showDescription: true,
|
showDescription: true,
|
||||||
|
showOrigTitle: true,
|
||||||
...props.settings,
|
...props.settings,
|
||||||
};
|
};
|
||||||
const chipsSettings = props.chipsSettings || {};
|
const chipsSettings = props.chipsSettings || {};
|
||||||
|
@ -86,7 +88,7 @@ export const ReleaseLinkList = (props: {
|
||||||
return (
|
return (
|
||||||
<span
|
<span
|
||||||
key={`release_${props.id}_genre_${genre}_${index}`}
|
key={`release_${props.id}_genre_${genre}_${index}`}
|
||||||
className="text-sm font-light dark:text-white"
|
className="text-sm font-light leading-none dark:text-white"
|
||||||
>
|
>
|
||||||
{index > 0 && ", "}
|
{index > 0 && ", "}
|
||||||
{genre}
|
{genre}
|
||||||
|
@ -95,12 +97,12 @@ export const ReleaseLinkList = (props: {
|
||||||
})}
|
})}
|
||||||
</div>
|
</div>
|
||||||
{props.title_ru && (
|
{props.title_ru && (
|
||||||
<p className="text-lg font-bold dark:text-white">
|
<p className="text-lg font-bold line-clamp-2 dark:text-white">
|
||||||
{props.title_ru}
|
{props.title_ru}
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
{props.title_original && (
|
{settings.showOrigTitle && props.title_original && (
|
||||||
<p className="text-sm text-gray-600 dark:text-gray-300">
|
<p className="text-sm text-gray-600 line-clamp-2 dark:text-gray-300">
|
||||||
{props.title_original}
|
{props.title_original}
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
|
|
|
@ -18,6 +18,7 @@ import { CommentsMain } from "#/components/Comments/Comments.Main";
|
||||||
import { InfoLists } from "#/components/InfoLists/InfoLists";
|
import { InfoLists } from "#/components/InfoLists/InfoLists";
|
||||||
import { ENDPOINTS } from "#/api/config";
|
import { ENDPOINTS } from "#/api/config";
|
||||||
import { usePreferencesStore } from "#/store/preferences";
|
import { usePreferencesStore } from "#/store/preferences";
|
||||||
|
import { ContinueWatching } from "#/components/ContinueWatching/ContinueWatching";
|
||||||
|
|
||||||
export const ReleasePage = (props: any) => {
|
export const ReleasePage = (props: any) => {
|
||||||
const userStore = useUserStore();
|
const userStore = useUserStore();
|
||||||
|
@ -167,6 +168,7 @@ export const ReleasePage = (props: any) => {
|
||||||
related_releases={data.release.related_releases}
|
related_releases={data.release.related_releases}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
{userStore.token && <ContinueWatching />}
|
||||||
<div className="block lg:hidden">
|
<div className="block lg:hidden">
|
||||||
<CommentsMain
|
<CommentsMain
|
||||||
release_id={props.id}
|
release_id={props.id}
|
||||||
|
|
Loading…
Add table
Reference in a new issue