Skip to content

Commit 40d6d45

Browse files
committed
add datapack store
1 parent 8b2d1fc commit 40d6d45

File tree

3 files changed

+60
-7
lines changed

3 files changed

+60
-7
lines changed

src/datapack.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ export async function loadDatapack(file: File): Promise<Datapack | string> {
4848
if (modules.has(Modules.DPCONFIG)) config = await loadDpConfig(zip);
4949

5050
return {
51-
id: mcmeta.pack.id,
51+
id: mcmeta.pack.id || file.name,
5252
name: mcmeta.pack.name,
5353
description: mcmeta.pack.description,
5454
icon,

src/datapackStore.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { type Datapack } from "./datapack";
2+
3+
export class DatapacksChangedEvent extends CustomEvent<ReadonlyArray<Datapack>> {
4+
constructor(datapacks: ReadonlyArray<Datapack>) {
5+
super("datapacksChanged", { detail: datapacks });
6+
}
7+
}
8+
9+
class DatapackStore extends EventTarget {
10+
private datapacks = new Map<string, Datapack>();
11+
12+
getAll(): ReadonlyArray<Datapack> {
13+
return Array.from(this.datapacks.values());
14+
}
15+
16+
add(dp: Datapack | Datapack[]) {
17+
let changed = false;
18+
19+
for (const pack of Array.isArray(dp) ? dp : [dp]) {
20+
if (!this.datapacks.has(pack.id)) {
21+
this.datapacks.set(pack.id, pack);
22+
changed = true;
23+
}
24+
}
25+
26+
if (changed) this.notifyChange();
27+
}
28+
29+
remove(dp: string | string[]) {
30+
let changed = false;
31+
32+
for (const id of Array.isArray(dp) ? dp : [dp]) {
33+
if (this.datapacks.delete(id)) {
34+
changed = true;
35+
}
36+
}
37+
38+
if (changed) this.notifyChange();
39+
}
40+
41+
private notifyChange() {
42+
this.dispatchEvent(new DatapacksChangedEvent(this.getAll()));
43+
}
44+
}
45+
46+
export const datapackStore = new DatapackStore();

src/main.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,32 @@
11
import { type Datapack, loadDatapack } from "./datapack";
2+
import { DatapacksChangedEvent, datapackStore } from "./datapackStore";
23

34
const fileUploadElement = document.getElementById("input")!;
45
fileUploadElement.addEventListener("change", onFileUploaded, { passive: true });
6+
datapackStore.addEventListener("datapacksChanged", updateDatapackDisplay, { passive: true });
57

68
async function onFileUploaded(e: Event) {
79
const fileList = (e.target as HTMLInputElement).files;
810
if (!fileList) return;
911

12+
console.time("loadDatapacks");
1013
const acceptedTypes = ["application/zip", "application/java-archive"];
1114
const zipFiles = Array.from(fileList).filter((file) => acceptedTypes.includes(file.type));
1215
const datapacks = await Promise.all(zipFiles.map(loadDatapack));
16+
const validDatapacks = datapacks.filter((dp) => dp instanceof Object);
17+
console.timeEnd("loadDatapacks");
1318

14-
console.log(datapacks);
19+
datapackStore.add(validDatapacks);
20+
}
1521

16-
const dpDisplayElement = datapacks
17-
.filter((dp) => dp instanceof Object)
18-
.map(createDatapackDisplayElement);
22+
function updateDatapackDisplay(event: Event) {
23+
const { detail } = event as DatapacksChangedEvent;
24+
const dpDisplayElement = detail.map(createDatapackDisplayElement);
1925

20-
document.getElementById("datapack-display")!.innerHTML = "";
26+
const datapackDisplay = document.getElementById("datapack-display")!;
27+
datapackDisplay.innerHTML = "";
2128
dpDisplayElement.forEach((element) => {
22-
document.getElementById("datapack-display")!.appendChild(element);
29+
datapackDisplay.appendChild(element);
2330
});
2431
}
2532

0 commit comments

Comments
 (0)