diff --git a/frontend/src/lib/components/Error.svelte b/frontend/src/lib/components/Error.svelte
index 47e6a19..414657e 100644
--- a/frontend/src/lib/components/Error.svelte
+++ b/frontend/src/lib/components/Error.svelte
@@ -1,8 +1,10 @@
-
Error {code}
-
{message}
+
Error {returnError.code}
+
{returnError.message}
diff --git a/frontend/src/lib/components/QueueSlider.svelte b/frontend/src/lib/components/QueueSlider.svelte
index 430a9bc..ec5a647 100644
--- a/frontend/src/lib/components/QueueSlider.svelte
+++ b/frontend/src/lib/components/QueueSlider.svelte
@@ -1,12 +1,12 @@
diff --git a/frontend/src/lib/types.ts b/frontend/src/lib/types.ts
index 3f10d61..7de4960 100644
--- a/frontend/src/lib/types.ts
+++ b/frontend/src/lib/types.ts
@@ -35,3 +35,8 @@ export const parseSuggestion = async function (sugg: any): Promise {
let resp = await SuggestionSchema.parseAsync(sugg)
return resp
}
+
+export type FetchError = {
+ code: number
+ message: string
+}
diff --git a/frontend/src/lib/utils.ts b/frontend/src/lib/utils.ts
new file mode 100644
index 0000000..1babeb9
--- /dev/null
+++ b/frontend/src/lib/utils.ts
@@ -0,0 +1,69 @@
+import { parseSong, parseSuggestion, type FetchError, type Song, type Suggestion } from "./types"
+
+export const joinRoom = async function (roomId: string): Promise<[FetchError | null, string]> {
+ let resp = await fetch("/api/join?room=" + roomId)
+
+ if (resp.status != 200) {
+ return [{ code: 400, message: "Cannot join the room" }, ""]
+ }
+
+ return [null, "test"]
+}
+
+export const getSuggestions = async function (roomId: string): Promise<[FetchError | null, Suggestion[]]> {
+ let resp = await fetch("/api/room/suggestions?room=" + roomId)
+
+ if (resp.status != 200) {
+ return [{ code: 400, message: "Failed to retrieve suggestions" }, []]
+ }
+
+ let json = await resp.json()
+ let suggestions: Suggestion[] = []
+
+ json["songs"].forEach(async (i: any) => {
+ suggestions.push(await parseSuggestion(i))
+ })
+
+ suggestions = suggestions.sort((a, b) => {
+ return a.upvote - b.upvote
+ })
+
+ return [null, suggestions]
+}
+
+export const getQueueSongs = async function (roomId: string): Promise<[FetchError | null, Song[], number]> {
+ let resp = await fetch("/api/queue?room=" + roomId)
+ if (resp.status != 200) {
+ return [{ code: 400, message: "Failed to load queue songs" }, [], 0]
+ }
+
+ let json = await resp.json()
+ let songs: Song[] = []
+
+ json["queue"].forEach(async (i: any) => {
+ songs.push(await parseSong(i))
+ })
+
+ let playingId = json["index"]
+
+ return [null, songs, playingId]
+}
+
+export const triggerPlayNext = async function (roomId: string): Promise<[FetchError | null, Song[], number]> {
+ let resp = await fetch("/api/queue/next?room=" + roomId, { method: "POST" })
+
+ if (resp.status != 200) {
+ return [{ code: 400, message: "Failed to trigger next song playback" }, [], 0]
+ }
+
+ let json = await resp.json()
+
+ let songs: Song[] = []
+
+ if (json["ended"]) {
+ json["queue"].forEach(async (i: any) => {
+ songs.push(await parseSong(i))
+ })
+ }
+ return [null, songs, json["index"]]
+}
diff --git a/frontend/src/routes/admin/[id]/+page.svelte b/frontend/src/routes/admin/[id]/+page.svelte
index 7573aa2..55d93a5 100644
--- a/frontend/src/routes/admin/[id]/+page.svelte
+++ b/frontend/src/routes/admin/[id]/+page.svelte
@@ -1,37 +1,43 @@
+{returnError}
+
-
+
+
diff --git a/frontend/src/routes/admin/[id]/+page.ts b/frontend/src/routes/admin/[id]/+page.ts
new file mode 100644
index 0000000..216a08b
--- /dev/null
+++ b/frontend/src/routes/admin/[id]/+page.ts
@@ -0,0 +1,11 @@
+import { error } from "@sveltejs/kit"
+import type { PageLoad } from "../../room/[id]/$types"
+
+export const load: PageLoad = function ({ params }) {
+ if (params.id) {
+ return {
+ roomId: params.id,
+ }
+ }
+ error(400, "Please provide a room id")
+}
diff --git a/frontend/src/routes/room/[id]/+page.svelte b/frontend/src/routes/room/[id]/+page.svelte
index f3905e6..b238e40 100644
--- a/frontend/src/routes/room/[id]/+page.svelte
+++ b/frontend/src/routes/room/[id]/+page.svelte
@@ -2,71 +2,54 @@
import QueueSlider from "$lib/components/QueueSlider.svelte"
import SuggestionInput from "$lib/components/SuggestionInput.svelte"
import Error from "$lib/components/Error.svelte"
- import { parseSong, parseSuggestion, type Suggestion, type Song } from "$lib/types.js"
+ import { type Suggestion, type Song } from "$lib/types.js"
import { onMount } from "svelte"
import SuggestionList from "$lib/components/SuggestionList.svelte"
+ import { getQueueSongs, getSuggestions, joinRoom } from "$lib/utils.js"
+ import type { FetchError } from "$lib/types.js"
let { data } = $props()
- let songs = $state([])
- let playing = $state(0)
+ let queueSongs = $state([])
+ let playingIndex = $state(0)
let suggestions = $state([])
- let error = $state({ code: 0, message: "" })
+ let returnError = $state()
+
+ let wsUrl = ""
onMount(async () => {
// Join the room
- let resp = await fetch("/api/join?room=" + data.roomId)
- if (resp.status != 200) {
- error = { code: 400, message: "Failed to join the room. Maybe wrong code or location?" }
+ let sugg, queue, index
+ ;[returnError, wsUrl] = await joinRoom(data.roomId)
+ if (returnError) {
return
}
- // Setup websocket connection
-
- // Get room suggestions
-
- resp = await fetch("/api/room/suggestions?room=" + data.roomId)
-
- if (resp.status != 200) {
- error = { code: 500, message: "Failed to retrive suggestions" }
+ ;[returnError, sugg] = await getSuggestions(data.roomId)
+ if (returnError) {
return
}
- let json = await resp.json()
-
- json["songs"].forEach(async (i: any) => {
- suggestions.push(await parseSuggestion(i))
- })
-
- suggestions = suggestions.sort((a, b) => {
- return a.upvote - b.upvote
- })
-
- // Get the room queue
-
- resp = await fetch("/api/queue?room=" + data.roomId)
- if (resp.status != 200) {
- error = { code: 404, message: "Room not found" }
+ ;[returnError, queue, index] = await getQueueSongs(data.roomId)
+ if (returnError) {
return
}
- json = await resp.json()
- json["queue"].forEach(async (i: any) => {
- songs.push(await parseSong(i))
- })
- console.log(songs)
+ queueSongs = queue
+ suggestions = sugg
+ playingIndex = index
})
-{#if error.code != 0}
-
+{#if returnError}
+
{:else}