diff --git a/app.vue b/app.vue
index 814ae35..5dc2c4c 100644
--- a/app.vue
+++ b/app.vue
@@ -25,3 +25,7 @@ onBeforeUnmount(() => {
+
+
diff --git a/components/conceptHeader.vue b/components/conceptHeader.vue
index 4d40716..2ac9902 100644
--- a/components/conceptHeader.vue
+++ b/components/conceptHeader.vue
@@ -41,6 +41,7 @@ const currentGames = computed(() => {
Home
Words
+ Concepts
diff --git a/components/word.vue b/components/word.vue
index 53849c6..fc105d4 100644
--- a/components/word.vue
+++ b/components/word.vue
@@ -40,11 +40,6 @@ async function deleteWord() {
word.loading = false;
}
}
-onMounted(() => {
- setInterval(() => {
- console.log(disabled.value);
- }, 1000);
-});
diff --git a/middleware/auth.global.ts b/middleware/auth.global.ts
index ed4d258..3f30802 100644
--- a/middleware/auth.global.ts
+++ b/middleware/auth.global.ts
@@ -1,6 +1,6 @@
import { useGameStore } from "~/store/game.store";
-const validPaths = ["/", "/rules", "/test", "/words"];
+const validPaths = ["/", "/rules", "/test", "/words", "/concepts"];
export default defineNuxtRouteMiddleware(async (to, from) => {
const config = useRuntimeConfig();
diff --git a/netcode/events b/netcode/events
index fc3f0e1..1473c5c 160000
--- a/netcode/events
+++ b/netcode/events
@@ -1 +1 @@
-Subproject commit fc3f0e1677d2e503dc0b198659e820e092cc654d
+Subproject commit 1473c5c1326a7b5915741973a09f0a0b35a2f641
diff --git a/netcode/handlers/concept.handler.ts b/netcode/handlers/concept.handler.ts
new file mode 100644
index 0000000..5395c6b
--- /dev/null
+++ b/netcode/handlers/concept.handler.ts
@@ -0,0 +1,31 @@
+import { useConceptStore } from "~/store/concepts.store";
+import type {
+ ConceptCreateEvent,
+ ConceptDeleteEvent,
+ ConceptDisableEvent,
+ ConceptEditEvent,
+ ConceptEnableEvent,
+} from "../events/concept.events";
+
+export const handlers = {
+ create: (event: ConceptCreateEvent) => {
+ const conceptStore = useConceptStore();
+ conceptStore.concepts[event.concept.id] = event.concept;
+ },
+ edit: (event: ConceptEditEvent) => {
+ const conceptStore = useConceptStore();
+ conceptStore.concepts[event.concept.id].value = event.concept.value;
+ },
+ delete: (event: ConceptDeleteEvent) => {
+ const conceptStore = useConceptStore();
+ delete conceptStore.concepts[event.id];
+ },
+ // enable: (event: ConceptEnableEvent) => {
+ // const conceptStore = useConceptStore();
+ // conceptStore.concepts[event.id].enabled = true;
+ // },
+ // disable: (event: ConceptDisableEvent) => {
+ // const conceptStore = useConceptStore();
+ // conceptStore.concepts[event.id].enabled = false;
+ // },
+};
diff --git a/package-lock.json b/package-lock.json
index e9a85d7..f1be9a8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13,6 +13,7 @@
"pinia": "^2.3.0",
"reflect-metadata": "^0.2.2",
"vue": "latest",
+ "vue-multiselect": "^3.1.0",
"vue-router": "latest"
}
},
@@ -9502,6 +9503,16 @@
"integrity": "sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==",
"license": "MIT"
},
+ "node_modules/vue-multiselect": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/vue-multiselect/-/vue-multiselect-3.1.0.tgz",
+ "integrity": "sha512-+i/fjTqFBpaay9NP+lU7obBeNaw2DdFDFs4mqhsM0aEtKRdvIf7CfREAx2o2B4XDmPrBt1r7x1YCM3BOMLaUgQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.18.1",
+ "npm": ">= 6.14.15"
+ }
+ },
"node_modules/vue-router": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.0.tgz",
diff --git a/package.json b/package.json
index 3c7a628..baaa492 100644
--- a/package.json
+++ b/package.json
@@ -16,6 +16,7 @@
"pinia": "^2.3.0",
"reflect-metadata": "^0.2.2",
"vue": "latest",
+ "vue-multiselect": "^3.1.0",
"vue-router": "latest"
}
}
diff --git a/pages/concepts.vue b/pages/concepts.vue
new file mode 100644
index 0000000..f00c766
--- /dev/null
+++ b/pages/concepts.vue
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+
diff --git a/pages/index.vue b/pages/index.vue
index a47b3a7..7189812 100644
--- a/pages/index.vue
+++ b/pages/index.vue
@@ -13,8 +13,9 @@ async function createGame() {
loading.value = true;
await lobbyStore
.createGame()
- .then(() => {
+ .then((data) => {
loading.value = false;
+ navigateTo("/game/" + data.id);
})
.catch((e) => {
if (e.data.statusCode == 400) {
diff --git a/store/concepts.store.ts b/store/concepts.store.ts
new file mode 100644
index 0000000..8040142
--- /dev/null
+++ b/store/concepts.store.ts
@@ -0,0 +1,87 @@
+import { defineStore } from "pinia";
+import { subscribe } from "~/netcode";
+import type { ConceptResponseDTO } from "~/netcode/events/dto/conceptresponse.dto";
+import { handlers } from "~/netcode/handlers/concept.handler";
+
+export const useConceptStore = defineStore("concept", {
+ state: () => ({
+ concepts: {} as Record,
+ eventSource: null as null | EventSource,
+ }),
+ actions: {
+ async subscribe() {
+ this.eventSource = subscribe(`/concepts/subscribe`);
+ this.eventSource.addEventListener("message", async (message) => {
+ const data = JSON.parse(message.data);
+ const type = data.type as string;
+ if (type in handlers) {
+ handlers[type as keyof typeof handlers](data);
+ }
+ });
+ },
+ async close() {
+ this.eventSource?.close();
+ },
+ async fetchConceptList() {
+ const config = useRuntimeConfig();
+ const data = await useFetch(
+ config.public.endpoint + `/concepts/all`,
+ {
+ credentials: "include",
+ }
+ );
+ if (data.data.value && !data.error.value) {
+ for (const concept of data.data.value) {
+ this.concepts[concept.id] = concept;
+ }
+ }
+ return data;
+ },
+ async enableConcept(concepts: ConceptResponseDTO) {
+ const config = useRuntimeConfig();
+ const data = await $fetch(
+ config.public.endpoint + `/concepts/` + concepts.id + "/enable",
+ {
+ credentials: "include",
+ method: "PUT",
+ }
+ );
+ // word.enabled = true;
+ // return data;
+ },
+ async disableConcept(concepts: ConceptResponseDTO) {
+ const config = useRuntimeConfig();
+ const data = await $fetch(
+ config.public.endpoint + `/concepts/` + concepts.id + "/disable",
+ {
+ credentials: "include",
+ method: "PUT",
+ }
+ );
+ // word.enabled = false;
+ // return data;
+ },
+
+ async createConcept(value: string) {
+ const config = useRuntimeConfig();
+ const data = await $fetch(
+ config.public.endpoint + `/concepts/`,
+ {
+ credentials: "include",
+ body: { value },
+ method: "POST",
+ }
+ );
+ },
+ async deleteConcept(id: number) {
+ const config = useRuntimeConfig();
+ const data = await $fetch(
+ config.public.endpoint + `/concepts/` + id,
+ {
+ credentials: "include",
+ method: "DELETE",
+ }
+ );
+ },
+ },
+});
diff --git a/store/lobby.store.ts b/store/lobby.store.ts
index 092c35d..14b84da 100644
--- a/store/lobby.store.ts
+++ b/store/lobby.store.ts
@@ -49,7 +49,7 @@ export const useLobbyStore = defineStore("lobby", {
}
);
// this.games[data.id] = data;
- // return data;
+ return data;
},
},
});