From 0bf1d68d9fbddd48515dd95913b6a584e16e6991 Mon Sep 17 00:00:00 2001
From: grimsi <9295182+grimsi@users.noreply.github.com>
Date: Sun, 11 May 2025 15:42:01 +0200
Subject: [PATCH] Update frontend after library deletion
---
.../administration/LibraryManagement.tsx | 23 ++++-
.../general/cards/LibraryOverviewCard.tsx | 6 +-
.../general/modals/LibraryDetailsModal.tsx | 95 +++++++++++--------
3 files changed, 82 insertions(+), 42 deletions(-)
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; }) => (
-
- )}
-
- )}
+ {(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; }) => (
+
+ )}
+
+ )
+ }}
);