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",
+ }
+ )