From 7e3759927f899527741a53f4b276fec7a419bf68 Mon Sep 17 00:00:00 2001 From: AleksDw Date: Sun, 1 Jun 2025 17:13:47 +0200 Subject: [PATCH] Add applying to event --- WebApp/ts/eventView.ts | 54 +++++++++++++++++++++----- WebApp/ts/generalUseHelpers.ts | 13 ++++++- WebApp/wwwroot/js/eventView.js | 37 +++++++++++++++++- WebApp/wwwroot/js/generalUseHelpers.js | 10 +++++ WebApp/wwwroot/view.html | 3 +- 5 files changed, 104 insertions(+), 13 deletions(-) diff --git a/WebApp/ts/eventView.ts b/WebApp/ts/eventView.ts index 922d950..2224456 100644 --- a/WebApp/ts/eventView.ts +++ b/WebApp/ts/eventView.ts @@ -1,4 +1,4 @@ -import { getEvent, getMyAccount, unhideElementById } from './generalUseHelpers.js'; +import { getEvent, getMyAccount, unhideElementById, getMyRegisteredEventIds } from './generalUseHelpers.js'; const queryString = window.location.search; const urlParams = new URLSearchParams(queryString); @@ -9,6 +9,7 @@ document.addEventListener("DOMContentLoaded", async () => { var container = document.getElementById("mainContainer"); const modifyBtn = document.getElementById("editBtn"); const removeBtn = document.getElementById("removeBtn"); + const applyBtn = document.getElementById("applyBtn"); var org_id: number = -1; try { @@ -28,11 +29,11 @@ document.addEventListener("DOMContentLoaded", async () => { try { if (eventId) thisEvent = await getEvent(eventId); } catch (err) { - if (container !== null) container.innerHTML = `

To wydarzenie nie istnieje! Powrót ->

`; + if (container !== null) container.innerHTML = `

To wydarzenie nie istnieje! Powr�t ->

`; } if (thisEvent == null) { - if (container !== null) container.innerHTML = `

B³¹d we wczytywaniu wydarzenia. Powrót ->

`; + if (container !== null) container.innerHTML = `

Błąd we wczytywaniu wydarzenia. Powrót ->

`; } else { const titleText = document.getElementById( "titleText") as HTMLElement; @@ -51,13 +52,20 @@ document.addEventListener("DOMContentLoaded", async () => { organizerText.innerHTML = "Organized by: " + thisEvent.organisationName; if (org_id == thisEvent.organisationId) { - // U¿ytkownik jest organizacj¹, która - // stworzy³a to wydarzenie + // Użytkownik jest organizacjÄ…, która + // stworzyÅ‚a to wydarzenie unhideElementById(document, "editBtn"); unhideElementById(document, "removeBtn"); } else if (org_id == -1) { - // U¿ytkownik jest wolontariuszem - unhideElementById(document, "applyBtn"); + // Użytkownik jest wolontariuszem + const registeredIds = await getMyRegisteredEventIds(); + const isRegistered = registeredIds.includes(Number(eventId)); + + if (isRegistered) { + unhideElementById(document, "leaveBtn"); + } else { + unhideElementById(document, "applyBtn"); + } } unhideElementById(document, "mainContainer"); @@ -76,7 +84,7 @@ document.addEventListener("DOMContentLoaded", async () => { if (!confirmed) return; try { - // Wysy³a ¿¹danie DELETE do API + // WysyÅ‚a żądanie DELETE do API const response = await fetch(`/api/events/${eventId}`, { method: "DELETE" }); @@ -94,4 +102,32 @@ document.addEventListener("DOMContentLoaded", async () => { }); } -}); \ No newline at end of file + if (applyBtn) { + applyBtn.addEventListener("click", async (e) => { + try { + const response = await fetch(`/api/events/join/${eventId}`, { + method: "POST", + headers: { + "Content-Type": "application/json" + }, + }); + + const result: { + success: boolean; + error_msg?: string; + } = await response.json(); + + if (result.success) { + (applyBtn as HTMLButtonElement).disabled = true; + (applyBtn as HTMLButtonElement).textContent = "Applied Succesfully"; + } else { + alert(`Error: ${result.error_msg ?? "Unknown error occurred."}`); + } + } catch (error) { + console.error("Failed to apply:", error); + alert("Failed to apply due to a network or server error."); + } + }); + } + +}); diff --git a/WebApp/ts/generalUseHelpers.ts b/WebApp/ts/generalUseHelpers.ts index f89acfc..8e24a74 100644 --- a/WebApp/ts/generalUseHelpers.ts +++ b/WebApp/ts/generalUseHelpers.ts @@ -36,9 +36,20 @@ export async function getEvent(id: string): Promise { export async function getMyAccount(): Promise { const res = await fetch("/api/auth/my_account"); if (!res.ok) { - throw Error("U¿ytkownik niezalogowany!"); + throw Error("U�ytkownik niezalogowany!"); } const data = await res.json(); return data; } +export async function getMyRegisteredEventIds(): Promise { + const res = await fetch("/api/auth/my_events"); + + if (!res.ok) { + throw Error("Użytkownik niezalogowany!"); + } + + const events = await res.json(); + + return events.map((event: { eventId: number }) => event.eventId); +} diff --git a/WebApp/wwwroot/js/eventView.js b/WebApp/wwwroot/js/eventView.js index 3b88e16..bb72dfe 100644 --- a/WebApp/wwwroot/js/eventView.js +++ b/WebApp/wwwroot/js/eventView.js @@ -7,7 +7,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; -import { getEvent, getMyAccount, unhideElementById } from './generalUseHelpers.js'; +import { getEvent, getMyAccount, unhideElementById, getMyRegisteredEventIds } from './generalUseHelpers.js'; const queryString = window.location.search; const urlParams = new URLSearchParams(queryString); const eventId = urlParams.get('event'); @@ -15,6 +15,7 @@ document.addEventListener("DOMContentLoaded", () => __awaiter(void 0, void 0, vo var container = document.getElementById("mainContainer"); const modifyBtn = document.getElementById("editBtn"); const removeBtn = document.getElementById("removeBtn"); + const applyBtn = document.getElementById("applyBtn"); var org_id = -1; try { var user = yield getMyAccount(); @@ -63,7 +64,14 @@ document.addEventListener("DOMContentLoaded", () => __awaiter(void 0, void 0, vo } else if (org_id == -1) { // Użytkownik jest wolontariuszem - unhideElementById(document, "applyBtn"); + const registeredIds = yield getMyRegisteredEventIds(); + const isRegistered = registeredIds.includes(Number(eventId)); + if (isRegistered) { + unhideElementById(document, "leaveBtn"); + } + else { + unhideElementById(document, "applyBtn"); + } } unhideElementById(document, "mainContainer"); } @@ -96,4 +104,29 @@ document.addEventListener("DOMContentLoaded", () => __awaiter(void 0, void 0, vo } })); } + if (applyBtn) { + applyBtn.addEventListener("click", (e) => __awaiter(void 0, void 0, void 0, function* () { + var _b; + try { + const response = yield fetch(`/api/events/join/${eventId}`, { + method: "POST", + headers: { + "Content-Type": "application/json" + }, + }); + const result = yield response.json(); + if (result.success) { + applyBtn.disabled = true; + applyBtn.textContent = "Applied Succesfully"; + } + else { + alert(`Error: ${(_b = result.error_msg) !== null && _b !== void 0 ? _b : "Unknown error occurred."}`); + } + } + catch (error) { + console.error("Failed to apply:", error); + alert("Failed to apply due to a network or server error."); + } + })); + } })); diff --git a/WebApp/wwwroot/js/generalUseHelpers.js b/WebApp/wwwroot/js/generalUseHelpers.js index 137fd53..264c476 100644 --- a/WebApp/wwwroot/js/generalUseHelpers.js +++ b/WebApp/wwwroot/js/generalUseHelpers.js @@ -35,3 +35,13 @@ export function getMyAccount() { return data; }); } +export function getMyRegisteredEventIds() { + return __awaiter(this, void 0, void 0, function* () { + const res = yield fetch("/api/auth/my_events"); + if (!res.ok) { + throw Error("Użytkownik niezalogowany!"); + } + const events = yield res.json(); + return events.map((event) => event.eventId); + }); +} diff --git a/WebApp/wwwroot/view.html b/WebApp/wwwroot/view.html index 9fb655e..3f804b0 100644 --- a/WebApp/wwwroot/view.html +++ b/WebApp/wwwroot/view.html @@ -1,4 +1,4 @@ - + @@ -64,6 +64,7 @@


+