diff --git a/app/components/CollectionInfo/CollectionInfoControls.tsx b/app/components/CollectionInfo/CollectionInfoControls.tsx index ccbe41f..d14c39c 100644 --- a/app/components/CollectionInfo/CollectionInfoControls.tsx +++ b/app/components/CollectionInfo/CollectionInfoControls.tsx @@ -1,9 +1,11 @@ "use client"; -import { Card, Button } from "flowbite-react"; +import { Card, Button, useThemeMode } from "flowbite-react"; import { useState } from "react"; import { useUserStore } from "#/store/auth"; import { ENDPOINTS } from "#/api/config"; import { useRouter } from "next/navigation"; +import { tryCatchAPI } from "#/api/utils"; +import { toast } from "react-toastify"; export const CollectionInfoControls = (props: { isFavorite: boolean; @@ -12,36 +14,124 @@ export const CollectionInfoControls = (props: { isPrivate: boolean; }) => { const [isFavorite, setIsFavorite] = useState(props.isFavorite); + const [isUpdating, setIsUpdating] = useState(false); + const theme = useThemeMode(); + const userStore = useUserStore(); const router = useRouter(); async function _addToFavorite() { - if (userStore.user) { - setIsFavorite(!isFavorite); - if (isFavorite) { - fetch( - `${ENDPOINTS.collection.favoriteCollections}/delete/${props.id}?token=${userStore.token}` - ); - } else { - fetch( - `${ENDPOINTS.collection.favoriteCollections}/add/${props.id}?token=${userStore.token}` - ); + async function _FavCol(url: string) { + setIsUpdating(true); + const tid = toast.loading( + isFavorite ? + "Удаляем коллекцию из избранного..." + : "Добавляем коллекцию в избранное...", + { + position: "bottom-center", + hideProgressBar: true, + closeOnClick: false, + pauseOnHover: false, + draggable: false, + theme: theme.mode == "light" ? "light" : "dark", + } + ); + const { data, error } = await tryCatchAPI(fetch(url)); + + if (error) { + toast.update(tid, { + render: + isFavorite ? + "Ошибка удаления коллекции из избранного" + : "Ошибка добавления коллекции в избранное", + type: "error", + autoClose: 2500, + isLoading: false, + closeOnClick: true, + draggable: true, + }); + setIsUpdating(false); + return; } + + toast.update(tid, { + render: + isFavorite ? + "Коллекция удалена из избранного" + : "Коллекция добавлена в избранное", + type: "success", + autoClose: 2500, + isLoading: false, + closeOnClick: true, + draggable: true, + }); + + setIsUpdating(false); + setIsFavorite(!isFavorite); + } + + if (userStore.token) { + let url = `${ENDPOINTS.collection.favoriteCollections}/add/${props.id}?token=${userStore.token}`; + if (isFavorite) { + url = `${ENDPOINTS.collection.favoriteCollections}/delete/${props.id}?token=${userStore.token}`; + } + _FavCol(url); } } async function _deleteCollection() { - if (userStore.user) { - fetch( + async function _DelCol(url: string) { + setIsUpdating(true); + const tid = toast.loading("Удаляем коллекцию...", { + position: "bottom-center", + hideProgressBar: true, + closeOnClick: false, + pauseOnHover: false, + draggable: false, + theme: theme.mode == "light" ? "light" : "dark", + }); + const { data, error } = await tryCatchAPI(fetch(url)); + + if (error) { + toast.update(tid, { + render: "Ошибка удаления коллекции", + type: "error", + autoClose: 2500, + isLoading: false, + closeOnClick: true, + draggable: true, + }); + setIsUpdating(false); + return; + } + + toast.update(tid, { + render: `Коллекция удалена`, + type: "success", + autoClose: 2500, + isLoading: false, + closeOnClick: true, + draggable: true, + }); + + setIsUpdating(false); + router.push("/collections"); + } + + if (userStore.token) { + _DelCol( `${ENDPOINTS.collection.delete}/${props.id}?token=${userStore.token}` ); - router.push("/collections"); } } return ( - diff --git a/app/pages/CreateCollection.tsx b/app/pages/CreateCollection.tsx index ef7ab5f..3fc5290 100644 --- a/app/pages/CreateCollection.tsx +++ b/app/pages/CreateCollection.tsx @@ -213,7 +213,10 @@ export const CreateCollectionPage = () => { } toast.update(tid, { - render: mode === "edit" ? `Коллекция ${collectionInfo.title} обновлена` : `Коллекция ${collectionInfo.title} создана`, + render: + mode === "edit" ? + `Коллекция ${collectionInfo.title} обновлена` + : `Коллекция ${collectionInfo.title} создана`, type: "success", autoClose: 2500, isLoading: false, @@ -511,12 +514,31 @@ export const ReleasesEditModal = (props: { function _addRelease(release: any) { if (props.releasesIds.length == 100) { - alert("Достигнуто максимальное количество релизов в коллекции - 100"); + toast.error( + "Достигнуто максимальное количество релизов в коллекции - 100", + { + position: "bottom-center", + hideProgressBar: true, + type: "error", + autoClose: 2500, + isLoading: false, + closeOnClick: true, + draggable: true, + } + ); return; } if (props.releasesIds.includes(release.id)) { - alert("Релиз уже добавлен в коллекцию"); + toast.error("Релиз уже добавлен в коллекцию", { + position: "bottom-center", + hideProgressBar: true, + type: "error", + autoClose: 2500, + isLoading: false, + closeOnClick: true, + draggable: true, + }); return; } @@ -541,7 +563,7 @@ export const ReleasesEditModal = (props: { className="max-w-full mx-auto" onSubmit={(e) => { e.preventDefault(); - props.setReleases([]); + setContent([]); setQuery(e.target[0].value.trim()); }} > @@ -586,12 +608,12 @@ export const ReleasesEditModal = (props: { -
+
{content.map((release) => { return (
- {isLoading && } + {isLoading && ( +
+ +
+ )} {error &&
Произошла ошибка
}