diff --git a/gui/app/components/ModTable.tsx b/gui/app/components/ModTable.tsx index c823e6b..8c2aea1 100644 --- a/gui/app/components/ModTable.tsx +++ b/gui/app/components/ModTable.tsx @@ -1,4 +1,7 @@ +import { MOD_ENDPOINT } from "@/api/ENDPOINTS"; +import { Mod } from "@/types/mod"; import { + Button, Checkbox, Table, TableBody, @@ -7,8 +10,33 @@ import { TableHeadCell, TableRow, } from "flowbite-react"; +import { HiDownload, HiTrash } from "react-icons/hi"; +import { toast } from "react-toastify"; + +export const ModTable = (props: { + mods: Mod[]; + updatePack: () => void; + packID: string; +}) => { + async function deleteMod(slug: string, title: string) { + if (!window) return; + if (window.confirm(`Delete mod ${title}?`)) { + const res = await fetch(MOD_ENDPOINT("deleteMod", props.packID, slug)); + const data = await res.json(); + + if (data.status != "ok") { + toast.error(data.message, { + autoClose: 2500, + closeOnClick: true, + draggable: true, + }); + return; + } + + props.updatePack(); + } + } -export const ModTable = () => { return (
@@ -17,395 +45,66 @@ export const ModTable = () => { - Product name - Color - Category - Price + Icon + Title + Version + Developer + Source + Source URL - Edit + Actions - - - - - - Apple MacBook Pro 17 - - Sliver - Laptop - $2999 - - - Edit - - - - - - - - - Microsoft Surface Pro - - White - Laptop PC - $1999 - - - Edit - - - - - - - - - Magic Mouse 2 - - Black - Accessories - $99 - - - Edit - - - - - - - - - Magic Mouse 2 - - Black - Accessories - $99 - - - Edit - - - - - - - - - Magic Mouse 2 - - Black - Accessories - $99 - - - Edit - - - - - - - - - Magic Mouse 2 - - Black - Accessories - $99 - - - Edit - - - - - - - - - Magic Mouse 2 - - Black - Accessories - $99 - - - Edit - - - - - - - - - Magic Mouse 2 - - Black - Accessories - $99 - - - Edit - - - - - - - - - Magic Mouse 2 - - Black - Accessories - $99 - - - Edit - - - - - - - - - Magic Mouse 2 - - Black - Accessories - $99 - - - Edit - - - - - - - - - Magic Mouse 2 - - Black - Accessories - $99 - - - Edit - - - - - - - - - Magic Mouse 2 - - Black - Accessories - $99 - - - Edit - - - - - - - - - Magic Mouse 2 - - Black - Accessories - $99 - - - Edit - - - - - - - - - Magic Mouse 2 - - Black - Accessories - $99 - - - Edit - - - - - - - - - Magic Mouse 2 - - Black - Accessories - $99 - - - Edit - - - - - - - - - Magic Mouse 2 - - Black - Accessories - $99 - - - Edit - - - - - - - - - Magic Mouse 2 - - Black - Accessories - $99 - - - Edit - - - - - - - - - Magic Mouse 2 - - Black - Accessories - $99 - - - Edit - - - - - - - - - Magic Mouse 2 - - Black - Accessories - $99 - - - Edit - - - - - - - - - Magic Mouse 2 - - Black - Accessories - $99 - - - Edit - - + {props.mods && + props.mods.length > 0 && + props.mods.map((mod) => { + return ( + + + + + + {/* eslint-disable-next-line @next/next/no-img-element */} + + + + {mod.title} + + {mod.file.version} + {mod.developers.join(", ")} + {mod.source} + {mod.url} + +
+ + +
+
+
+ ); + })} + + + + + + + + +
diff --git a/gui/app/pack/page.tsx b/gui/app/pack/page.tsx index 3a99b38..bdcac6e 100644 --- a/gui/app/pack/page.tsx +++ b/gui/app/pack/page.tsx @@ -18,11 +18,9 @@ import { Modal, ModalBody, ModalFooter, ModalHeader } from "flowbite-react"; import { HiDownload, HiPlusCircle, HiTrash } from "react-icons/hi"; import { ModTable } from "../components/ModTable"; import { toast } from "react-toastify"; -import { Mod } from "@/types/mod"; export default function PackPage() { const [packData, setPackData] = useState(null); - const [packMods, setPackMods] = useState([]); const [packDataLoading, setPackDataLoading] = useState(true); const router = useRouter(); const id = useSearchParams().get("id") || ""; @@ -43,15 +41,15 @@ export default function PackPage() { // version: null, // }); + async function _getPacksData() { + const res = await fetch(PACK_ENDPOINT("getPack", id)); + if (!res.ok) router.push("/404"); + const data: Pack = await res.json(); + setPackData(data); + setPackDataLoading(false); + } + useEffect(() => { - async function _getPacksData() { - const res = await fetch(PACK_ENDPOINT("getPack", id)); - if (!res.ok) router.push("/404"); - const data: Pack = await res.json(); - setPackData(data); - setPackMods(data.mods); - setPackDataLoading(false); - } if (id) { _getPacksData(); } else { @@ -205,7 +203,6 @@ export default function PackPage() { return; } - setPackMods([...packMods, data.mod]); toast.update(tid, { render: data.message, type: "success", @@ -214,7 +211,9 @@ export default function PackPage() { closeOnClick: true, draggable: true, }); - setModUrl({ ...modUrl, value: "" }) + setModUrl({ ...modUrl, value: "" }); + + _getPacksData(); } return ( @@ -253,7 +252,15 @@ export default function PackPage() {

by {packData.author}

-
+
+
+

+ {packData.mods.length} mods +

+

+ v{packData.modpackVersion} +

+
@@ -267,7 +274,7 @@ export default function PackPage() {
- +
)} diff --git a/src/api/pack.py b/src/api/pack.py index 5002308..c6fdbde 100644 --- a/src/api/pack.py +++ b/src/api/pack.py @@ -106,3 +106,31 @@ def addMod(id): "mod": mod.get("mod"), } ) + + +@apiPack.route("//mod//delete", methods=["GET"]) +def deleteMod(id, slug): + pack = {} + with open(f"{PACKS_FOLDER}/{id}/packfile.json") as fp: + pack = json.load(fp) + fp.close() + + for mod in pack.get("mods"): + if mod.get("slug") == slug: + pack["mods"].remove(mod) + pack["modpackVersion"] += 1 + if os.path.exists( + f"{PACKS_FOLDER}/{id}/mods/{mod.get('file').get('filename')}" + ): + os.remove(f"{PACKS_FOLDER}/{id}/mods/{mod.get('file').get('filename')}") + + with open(f"{PACKS_FOLDER}/{id}/packfile.json", mode="w", encoding="utf-8") as fp: + json.dump(pack, fp) + fp.close() + + return jsonify( + { + "status": "ok", + "message": f"mod {slug} has been removed", + } + )