File size: 2,723 Bytes
012b226
 
 
 
 
 
759b9dd
012b226
e0d45d2
012b226
e0d45d2
 
8ebf51a
 
012b226
e0d45d2
012b226
 
dd24c08
012b226
 
 
 
 
 
 
e0d45d2
012b226
8ebf51a
e0d45d2
 
 
 
 
3d2cb9e
e0d45d2
3d2cb9e
e0d45d2
3d2cb9e
 
 
 
 
 
e0d45d2
3d2cb9e
 
 
 
 
e0d45d2
 
 
 
8ebf51a
 
 
 
 
 
 
 
 
012b226
 
759b9dd
e0d45d2
759b9dd
7e89314
759b9dd
012b226
 
8ebf51a
012b226
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<script lang="ts">
	import { onMount } from 'svelte';
	import { createClient } from '@liveblocks/client';
	import type { Client } from '@liveblocks/client';
	import LiveblocksProvider from '$lib/liveblocks/LiveblocksProvider.svelte';
	import RoomProvider from '$lib/liveblocks/RoomProvider.svelte';
	import LoadingIcon from '$lib/Icons/LoadingIcon.svelte';
	import App from '$lib/App.svelte';
	import About from '$lib/About.svelte';
	import { PUBLIC_API_BASE } from '$env/static/public';
	import { selectedRoomID, toggleAbout } from '$lib/store';
	import type { RoomResponse } from '$lib/types';
	import { MAX_CAPACITY, CANVAS_SIZE, FRAME_SIZE } from '$lib/constants';
	import { Status } from '$lib/types';

	let loading = true;
	let client: Client;

	$: roomId = $selectedRoomID;

	onMount(() => {
		// document.addEventListener('wheel', (e) => e.preventDefault(), { passive: false });
		client = createClient({
			authEndpoint: PUBLIC_API_BASE + '/auth'
		});

		updateRooms();
	});

	async function updateRooms() {
		loading = true;
		const roomidParam = new URLSearchParams(window.location.search).get('roomid');
		const res = await fetch(PUBLIC_API_BASE + '/rooms');
		const rooms: RoomResponse[] = await res.json();
		const emptyRoom = rooms.find((room) => room.users_count < MAX_CAPACITY) || null;

		let roomAvailable = false;
		if (roomidParam) {
			const room = rooms.find((room) => room.room_id === roomidParam) || null;
			roomAvailable = room ? room.users_count < MAX_CAPACITY : false;
			if (room && roomAvailable) {
				$selectedRoomID = room.room_id;
				const state = { roomid: room.room_id };
				window.history.replaceState(null, '', '?' + new URLSearchParams(state).toString());
			}
		}
		if (emptyRoom && !roomAvailable) {
			selectedRoomID.set(emptyRoom.room_id);
			const state = { roomid: emptyRoom.room_id };
			window.history.replaceState(null, '', '?' + new URLSearchParams(state).toString());
		}
		loading = false;
		return { rooms };
	}
	const initialPresence = {
		cursor: null,
		frame: {
			x: CANVAS_SIZE.width / 2 - FRAME_SIZE / 2,
			y: CANVAS_SIZE.height / 2 - FRAME_SIZE / 2
		},
		status: Status.dragging,
		currentPrompt: ''
	};
</script>

<About classList={$toggleAbout ? 'flex' : 'hidden'} on:click={() => ($toggleAbout = false)} />

{#if loading}
	<div class="inset-0 fixed bg-white animate-pulse" />
{:else}
	<LiveblocksProvider {client}>
		{#if roomId}
			<RoomProvider id={roomId} {initialPresence}>
				<App />
			</RoomProvider>
		{:else}
			<div class="flex flex-col items-center justify-center h-full">
				<h1 class="text-2xl font-bold">No room selected</h1>
				<p class="text-gray-500">Please select a room in the URL</p>
			</div>
		{/if}
	</LiveblocksProvider>
{/if}