diff --git a/gameyfin/src/main/frontend/components/administration/LibraryManagement.tsx b/gameyfin/src/main/frontend/components/administration/LibraryManagement.tsx index df5e1b8..7fb4e0c 100644 --- a/gameyfin/src/main/frontend/components/administration/LibraryManagement.tsx +++ b/gameyfin/src/main/frontend/components/administration/LibraryManagement.tsx @@ -3,7 +3,7 @@ import ConfigFormField from "Frontend/components/administration/ConfigFormField" import withConfigPage from "Frontend/components/administration/withConfigPage"; import Section from "Frontend/components/general/Section"; import * as Yup from 'yup'; -import {Button, Divider, Tooltip, useDisclosure} from "@heroui/react"; +import {addToast, Button, Divider, Tooltip, useDisclosure} from "@heroui/react"; import {Plus} from "@phosphor-icons/react"; import {LibraryEndpoint} from "Frontend/generated/endpoints"; import {LibraryOverviewCard} from "Frontend/components/general/cards/LibraryOverviewCard"; @@ -41,6 +41,24 @@ function LibraryManagementLayout({getConfig, formik}: any) { } return [...prevLibraries, updatedLibrary]; }); + + addToast({ + title: "Library updated", + description: `Library ${library.name} has been updated.`, + color: "success" + }) + } + + async function removeLibrary(library: LibraryDto) { + await LibraryEndpoint.removeLibrary(library.id); + setLibraries((prevLibraries) => { + return prevLibraries.filter((l) => l.id !== library.id); + }); + addToast({ + title: "Library removed", + description: `Library ${library.name} has been removed.`, + color: "success" + }) } return ( @@ -72,7 +90,8 @@ function LibraryManagementLayout({getConfig, formik}: any) { // Aspect ratio of cover = 12/17 -> 5 covers = 60/17 -> 353px * 100px
{libraries.map((library) => - + )}
: "No libraries configured. Add your first library!" diff --git a/gameyfin/src/main/frontend/components/general/cards/LibraryOverviewCard.tsx b/gameyfin/src/main/frontend/components/general/cards/LibraryOverviewCard.tsx index 0747aac..049fe57 100644 --- a/gameyfin/src/main/frontend/components/general/cards/LibraryOverviewCard.tsx +++ b/gameyfin/src/main/frontend/components/general/cards/LibraryOverviewCard.tsx @@ -25,9 +25,10 @@ import LibraryUpdateDto from "Frontend/generated/de/grimsi/gameyfin/libraries/dt import ScanType from "Frontend/generated/de/grimsi/gameyfin/libraries/enums/ScanType"; import {randomGamesFromLibrary} from "Frontend/util/utils"; -export function LibraryOverviewCard({library, updateLibrary}: { +export function LibraryOverviewCard({library, updateLibrary, removeLibrary}: { library: LibraryDto, - updateLibrary: (library: LibraryUpdateDto) => void + updateLibrary: (library: LibraryUpdateDto) => Promise, + removeLibrary: (library: LibraryDto) => Promise }) { const MAX_COVER_COUNT = 5; @@ -103,6 +104,7 @@ export function LibraryOverviewCard({library, updateLibrary}: { isOpen={libraryDetailsModal.isOpen} onOpenChange={libraryDetailsModal.onOpenChange} updateLibrary={updateLibrary} + removeLibrary={removeLibrary} /> ); diff --git a/gameyfin/src/main/frontend/components/general/modals/LibraryDetailsModal.tsx b/gameyfin/src/main/frontend/components/general/modals/LibraryDetailsModal.tsx index e258565..87b82f1 100644 --- a/gameyfin/src/main/frontend/components/general/modals/LibraryDetailsModal.tsx +++ b/gameyfin/src/main/frontend/components/general/modals/LibraryDetailsModal.tsx @@ -2,56 +2,75 @@ import React from "react"; import {Button, Modal, ModalBody, ModalContent, ModalFooter, ModalHeader} from "@heroui/react"; import {Form, Formik} from "formik"; import Input from "Frontend/components/general/input/Input"; -import {LibraryEndpoint} from "Frontend/generated/endpoints"; import LibraryUpdateDto from "Frontend/generated/de/grimsi/gameyfin/libraries/dto/LibraryUpdateDto"; import LibraryDto from "Frontend/generated/de/grimsi/gameyfin/libraries/dto/LibraryDto"; +import Section from "Frontend/components/general/Section"; interface LibraryDetailsModalProps { library: LibraryDto; isOpen: boolean; onOpenChange: () => void; - updateLibrary: (library: LibraryUpdateDto) => void; + updateLibrary: (library: LibraryUpdateDto) => Promise; + removeLibrary: (library: LibraryDto) => Promise; } -export default function LibraryDetailsModal({library, isOpen, onOpenChange, updateLibrary}: LibraryDetailsModalProps) { +export default function LibraryDetailsModal({ + library, + isOpen, + onOpenChange, + updateLibrary, + removeLibrary + }: LibraryDetailsModalProps) { return ( - {(onClose) => ( - { - updateLibrary(values); - onClose(); - }} - > - {(formik: { isSubmitting: any; }) => ( -
- - Edit library - - - - - - - - - -
- )} -
- )} + {(onClose) => { + async function update(values: LibraryUpdateDto) { + await updateLibrary(values); + onClose(); + } + + async function remove(library: LibraryDto) { + await removeLibrary(library); + onClose(); + } + + return ( + update(values)} + > + {(formik: { isSubmitting: any; }) => ( +
+ + Edit library + + + + +
+ + + + + + + + )} + + ) + }} );