diff --git a/TODO.md b/TODO.md index a74038a..2fedee8 100644 --- a/TODO.md +++ b/TODO.md @@ -81,7 +81,7 @@ ## Баги -- некоторые страницы можно открыть без авторизации, но они будут пустые +- ... ## Другое diff --git a/app/pages/Bookmarks.tsx b/app/pages/Bookmarks.tsx index 0e03385..36909f9 100644 --- a/app/pages/Bookmarks.tsx +++ b/app/pages/Bookmarks.tsx @@ -7,9 +7,13 @@ const fetcher = (...args: any) => import { useUserStore } from "#/store/auth"; import { BookmarksList } from "#/api/utils"; import { ENDPOINTS } from "#/api/config"; +import { useRouter } from "next/navigation"; +import { useEffect } from "react"; export function BookmarksPage() { const token = useUserStore((state) => state.token); + const authState = useUserStore((state) => state.state); + const router = useRouter(); function useFetchReleases(listName: string) { let url: string; @@ -28,19 +32,24 @@ export function BookmarksPage() { const [delayedData] = useFetchReleases("delayed"); const [abandonedData] = useFetchReleases("abandoned"); + useEffect(() => { + if (authState === "finished" && !token) { + router.push("/login"); + } + }, [authState, token]); + return (
- {!watchingData || - !plannedData || - !watchedData || - !delayedData || - !abandonedData ? ( -
- -
- ) : ( - "" - )} + {authState === "loading" && + (!watchingData || + !plannedData || + !watchedData || + !delayedData || + !abandonedData) && ( +
+ +
+ )} {watchingData && watchingData.content && watchingData.content.length > 0 && ( diff --git a/app/pages/BookmarksCategory.tsx b/app/pages/BookmarksCategory.tsx index 59ba022..21c5ee2 100644 --- a/app/pages/BookmarksCategory.tsx +++ b/app/pages/BookmarksCategory.tsx @@ -9,6 +9,13 @@ import { Dropdown, Button } from "flowbite-react"; import { sort } from "./common"; import { ENDPOINTS } from "#/api/config"; import { BookmarksList } from "#/api/utils"; +import { useRouter } from "next/navigation"; + +const DropdownTheme = { + floating: { + target: "w-fit md:min-w-[256px]", + }, +}; const fetcher = async (url: string) => { const res = await fetch(url); @@ -26,8 +33,10 @@ const fetcher = async (url: string) => { export function BookmarksCategoryPage(props: any) { const token = useUserStore((state) => state.token); + const authState = useUserStore((state) => state.state); const [selectedSort, setSelectedSort] = useState(0); const [isLoadingEnd, setIsLoadingEnd] = useState(false); + const router = useRouter(); const getKey = (pageIndex: number, previousPageData: any) => { if (previousPageData && !previousPageData.content.length) return null; @@ -63,12 +72,11 @@ export function BookmarksCategoryPage(props: any) { } }, [scrollPosition]); - const DropdownTheme = { - floating: { - target: - "w-fit bg-blue-600 enabled:hover:bg-blue-700 focus:ring-4 focus:outline-none focus:ring-blue-300 text-center dark:bg-blue-600 dark:enabled:hover:bg-blue-700 dark:focus:ring-blue-800", - }, - }; + useEffect(() => { + if (authState === "finished" && !token) { + router.push("/login"); + } + }, [authState, token]); return (
@@ -80,6 +88,7 @@ export function BookmarksCategoryPage(props: any) { label={sort.values[selectedSort].name} dismissOnClick={true} arrowIcon={false} + color={"blue"} theme={DropdownTheme} > {sort.values.map((item, index) => ( diff --git a/app/pages/Favorites.tsx b/app/pages/Favorites.tsx index 8b46c8e..66fb543 100644 --- a/app/pages/Favorites.tsx +++ b/app/pages/Favorites.tsx @@ -8,6 +8,13 @@ import { useUserStore } from "../store/auth"; import { Dropdown, Button } from "flowbite-react"; import { sort } from "./common"; import { ENDPOINTS } from "#/api/config"; +import { useRouter } from "next/navigation"; + +const DropdownTheme = { + floating: { + target: "w-fit md:min-w-[256px]", + }, +}; const fetcher = async (url: string) => { const res = await fetch(url); @@ -25,8 +32,10 @@ const fetcher = async (url: string) => { export function FavoritesPage() { const token = useUserStore((state) => state.token); + const authState = useUserStore((state) => state.state); const [selectedSort, setSelectedSort] = useState(0); const [isLoadingEnd, setIsLoadingEnd] = useState(false); + const router = useRouter(); const getKey = (pageIndex: number, previousPageData: any) => { if (previousPageData && !previousPageData.content.length) return null; @@ -60,12 +69,11 @@ export function FavoritesPage() { } }, [scrollPosition]); - const DropdownTheme = { - floating: { - target: - "w-fit bg-blue-600 enabled:hover:bg-blue-700 focus:ring-4 focus:outline-none focus:ring-blue-300 text-center dark:bg-blue-600 dark:enabled:hover:bg-blue-700 dark:focus:ring-blue-800", - }, - }; + useEffect(() => { + if (authState === "finished" && !token) { + router.push("/login"); + } + }, [authState, token]); return (
@@ -77,6 +85,7 @@ export function FavoritesPage() { label={sort.values[selectedSort].name} dismissOnClick={true} arrowIcon={false} + color={"blue"} theme={DropdownTheme} > {sort.values.map((item, index) => ( diff --git a/app/pages/History.tsx b/app/pages/History.tsx index e0d1c32..d325ad8 100644 --- a/app/pages/History.tsx +++ b/app/pages/History.tsx @@ -7,6 +7,7 @@ import { useScrollPosition } from "#/hooks/useScrollPosition"; import { useUserStore } from "../store/auth"; import { ENDPOINTS } from "#/api/config"; import { Button } from "flowbite-react"; +import { useRouter } from "next/navigation"; const fetcher = async (url: string) => { const res = await fetch(url); @@ -24,7 +25,9 @@ const fetcher = async (url: string) => { export function HistoryPage() { const token = useUserStore((state) => state.token); + const authState = useUserStore((state) => state.state); const [isLoadingEnd, setIsLoadingEnd] = useState(false); + const router = useRouter(); const getKey = (pageIndex: number, previousPageData: any) => { if (previousPageData && !previousPageData.content.length) return null; @@ -58,6 +61,12 @@ export function HistoryPage() { } }, [scrollPosition]); + useEffect(() => { + if (authState === "finished" && !token) { + router.push("/login"); + } + }, [authState, token]); + return (
{content && content.length > 0 ? ( diff --git a/app/store/auth.ts b/app/store/auth.ts index 1489174..590f1e5 100644 --- a/app/store/auth.ts +++ b/app/store/auth.ts @@ -6,6 +6,7 @@ interface userState { isAuth: boolean user: Object | null token: string | null + state: string, login: (user: Object, token: string) => void logout: () => void checkAuth: () => void @@ -15,12 +16,13 @@ export const useUserStore = create((set, get) => ({ isAuth: false, user: null, token: null, + state: "loading", login: (user: Object, token: string) => { - set({ isAuth: true, user: user, token: token }); + set({ isAuth: true, user: user, token: token, state: "finished" }); }, logout: () => { - set({ isAuth: false, user: null, token: null }); + set({ isAuth: false, user: null, token: null, state: "finished" }); removeJWT(); }, checkAuth: () => {