import {useNavigate, useParams} from "react-router"; import React, {useEffect} from "react"; import {addToast, Button} from "@heroui/react"; import {ArrowLeftIcon, CheckIcon} from "@phosphor-icons/react"; import {useSnapshot} from "valtio/react"; import CollectionAdminDto from "Frontend/generated/org/gameyfin/app/collections/dto/CollectionAdminDto"; import {collectionState} from "Frontend/state/CollectionState"; import {Form, Formik} from "formik"; import * as Yup from "yup"; import Input from "Frontend/components/general/input/Input"; import Section from "Frontend/components/general/Section"; import {deepDiff} from "Frontend/util/utils"; import {CollectionEndpoint} from "Frontend/generated/endpoints"; import CollectionUpdateDto from "Frontend/generated/org/gameyfin/app/collections/dto/CollectionUpdateDto"; import TextAreaInput from "Frontend/components/general/input/TextAreaInput"; import CollectionHeader from "Frontend/components/general/covers/CollectionHeader"; import CollectionGamesTable from "Frontend/components/general/modals/CollectionGamesTable"; import CheckboxInput from "Frontend/components/general/input/CheckboxInput"; export default function CollectionManagementView() { const {collectionId} = useParams(); const navigate = useNavigate(); const [collectionSaved, setCollectionSaved] = React.useState(false); const collections = useSnapshot(collectionState); // Parse and validate collectionId early const collectionIdNum = collectionId ? parseInt(collectionId) : null; // Early return if invalid collection ID useEffect(() => { if (!collectionIdNum || (collections.isLoaded && !collections.state[collectionIdNum])) { navigate("/administration/games"); } }, [collections, collectionIdNum, navigate]); // If collectionId is invalid, return null (will redirect via useEffect) if (!collectionIdNum) { return null; } // At this point, collectionIdNum is guaranteed to be a number const collection = collections.state[collectionIdNum] as CollectionAdminDto; async function handleSubmit(values: CollectionUpdateDto): Promise { const changed = deepDiff(collection, values) as CollectionUpdateDto; if (Object.keys(changed).length === 0) return; changed.id = collection.id; await CollectionEndpoint.updateCollection(changed); setCollectionSaved(true); setTimeout(() => setCollectionSaved(false), 2000); } async function deleteCollection(): Promise { try { await CollectionEndpoint.deleteCollection(collection.id); addToast({ title: "Collection deleted", description: `Collection ${collection.name} deleted!`, color: "success" }); navigate("/administration/games"); } catch (e) { addToast({ title: "Error deleting collection", description: `Collection ${collection.name} could not be deleted!`, color: "warning" }); } } return collection && (

Manage Collection

{(formik) => (

Edit collection details

Manage games in collection

)}
); }