+
{#if issues}
{:else if icon}
@@ -25,9 +24,15 @@ let { label, icon, issues, ...props }: Props = $props();
{/if}
- {label}{props.required && "*"}
+ {label}
+ {#if props.required}
+ *
+ {/if}
-
+
+
+ {@render suffix?.()}
+
diff --git a/packages/frontend/src/lib/remotes/bot.remote.ts b/packages/frontend/src/lib/remotes/bot.remote.ts
index 6e77731..d2dd413 100644
--- a/packages/frontend/src/lib/remotes/bot.remote.ts
+++ b/packages/frontend/src/lib/remotes/bot.remote.ts
@@ -1,6 +1,6 @@
-import { form, getRequestEvent } from "$app/server";
+import { form, getRequestEvent, query } from "$app/server";
import { env } from "$env/dynamic/private";
-import { CreateBotSchema } from "@hallmaster/backend/dto";
+import { CreateBotSchema, UpdateBotSchema, type GetBotDto } from "@hallmaster/backend/dto";
import { error, redirect } from "@sveltejs/kit";
export const createBot = form(CreateBotSchema, async (data) => {
@@ -26,3 +26,84 @@ export const createBot = form(CreateBotSchema, async (data) => {
return error(500, "An error occured");
}
});
+
+export const getBot = query
(async () => {
+ const token = getRequestEvent().cookies.get("token");
+
+ const response = await fetch(new URL("/bot", env.API_URL), {
+ method: "GET",
+ headers: {
+ "Content-Type": "application/json",
+ Authorization: `Bearer ${token}`,
+ },
+ });
+
+ switch (response.status) {
+ case 200:
+ return response.json();
+ case 401:
+ return error(401, "Unauthorized");
+ case 404:
+ return error(404, "Bot not found");
+
+ default:
+ return error(500, "An error occured");
+ }
+});
+
+export const updateBotToken = form(UpdateBotSchema.pick({ token: true }), async (token) => {
+ const userToken = getRequestEvent().cookies.get("token");
+
+ const response = await fetch(new URL("/bot", env.API_URL), {
+ method: "PATCH",
+ headers: {
+ "Content-Type": "application/json",
+ Authorization: `Bearer ${userToken}`,
+ },
+ body: JSON.stringify(token),
+ });
+
+ switch (response.status) {
+ case 202:
+ getBot().set(await response.json());
+ return;
+ case 401:
+ return error(401, "Unauthorized");
+ case 404:
+ return error(404, "Bot not found");
+
+ default:
+ console.error(await response.text());
+ return error(500, "An error occured");
+ }
+});
+
+export const updateBotImage = form(
+ UpdateBotSchema.pick({ dockerImage: true }),
+ async (dockerImage) => {
+ const token = getRequestEvent().cookies.get("token");
+
+ const response = await fetch(new URL("/bot", env.API_URL), {
+ method: "PATCH",
+ headers: {
+ "Content-Type": "application/json",
+ Authorization: `Bearer ${token}`,
+ },
+ body: JSON.stringify(dockerImage),
+ });
+
+ switch (response.status) {
+ case 202:
+ getBot().set(await response.json());
+ return;
+ case 401:
+ return error(401, "Unauthorized");
+ case 404:
+ return error(404, "Bot not found");
+
+ default:
+ console.error(await response.text());
+ return error(500, "An error occured");
+ }
+ },
+);
diff --git a/packages/frontend/src/routes/(app)/settings/+layout.svelte b/packages/frontend/src/routes/(app)/settings/+layout.svelte
new file mode 100644
index 0000000..eafde7f
--- /dev/null
+++ b/packages/frontend/src/routes/(app)/settings/+layout.svelte
@@ -0,0 +1,9 @@
+
+
+
+ {@render children()}
+
diff --git a/packages/frontend/src/routes/(app)/settings/+page.svelte b/packages/frontend/src/routes/(app)/settings/+page.svelte
new file mode 100644
index 0000000..72fe28e
--- /dev/null
+++ b/packages/frontend/src/routes/(app)/settings/+page.svelte
@@ -0,0 +1,106 @@
+
+
+Deployment
+
+
diff --git a/packages/frontend/src/routes/(form)/login/+page.svelte b/packages/frontend/src/routes/(form)/login/+page.svelte
index ad395c8..793d6be 100644
--- a/packages/frontend/src/routes/(form)/login/+page.svelte
+++ b/packages/frontend/src/routes/(form)/login/+page.svelte
@@ -11,7 +11,6 @@ import toaster from "$lib/utils/toaster";