2025-01-19 05:24:56 +02:00
|
|
|
<script lang="ts">
|
2025-01-21 13:46:16 +02:00
|
|
|
import { Separator } from '$lib/components/ui/separator/index.js';
|
2025-01-21 13:10:47 +02:00
|
|
|
import LoaderCircle from 'lucide-svelte/icons/loader-circle';
|
2025-01-19 05:24:56 +02:00
|
|
|
import { Button } from '$lib/components/ui/button/index.js';
|
2025-01-21 11:42:52 +02:00
|
|
|
import * as AlertDialog from '$lib/components/ui/alert-dialog/index.js';
|
|
|
|
import { Skeleton } from '$lib/components/ui/skeleton/index.js';
|
2025-01-19 05:24:56 +02:00
|
|
|
import DndGroup from '$lib/components/DNDGroup.svelte';
|
|
|
|
import type { PageData } from './$types';
|
|
|
|
import { enhance } from '$app/forms';
|
2025-01-22 14:21:34 +02:00
|
|
|
import type { AlbumData } from '$lib/types';
|
2025-01-19 05:24:56 +02:00
|
|
|
|
2025-01-21 19:52:19 +02:00
|
|
|
let { data }: { data: PageData; form: FormData } = $props();
|
2025-01-21 11:42:52 +02:00
|
|
|
|
2025-01-21 19:52:19 +02:00
|
|
|
let loading = $state(false);
|
2025-01-22 14:21:34 +02:00
|
|
|
let oldAlbums: AlbumData | undefined = $state();
|
2025-01-21 11:42:52 +02:00
|
|
|
|
2025-01-21 13:10:47 +02:00
|
|
|
// Used when user answers wrong and no new data comes in
|
|
|
|
$effect(() => {
|
|
|
|
if (data.streamed?.albums) {
|
|
|
|
data.streamed.albums.then((data) => {
|
2025-01-22 14:21:34 +02:00
|
|
|
oldAlbums = data as AlbumData;
|
2025-01-21 13:10:47 +02:00
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
2025-01-19 05:24:56 +02:00
|
|
|
</script>
|
|
|
|
|
2025-01-21 13:10:47 +02:00
|
|
|
{#snippet footer(loading: boolean)}
|
2025-01-21 15:22:19 +02:00
|
|
|
<div class="mt-8 flex items-center justify-evenly">
|
|
|
|
<p class="font-title text-lg font-semibold">Skoor: {data.stage}</p>
|
2025-01-21 13:10:47 +02:00
|
|
|
{#if loading}
|
2025-01-21 15:22:19 +02:00
|
|
|
<Button disabled class="min-w-[4.5rem]">
|
2025-01-21 13:10:47 +02:00
|
|
|
<LoaderCircle class="animate-spin" />
|
2025-01-21 15:22:19 +02:00
|
|
|
Oota
|
2025-01-21 13:10:47 +02:00
|
|
|
</Button>
|
|
|
|
{:else}
|
2025-01-21 15:22:19 +02:00
|
|
|
<Button type="submit" class="min-w-[4.5rem]">Saada</Button>
|
2025-01-21 13:10:47 +02:00
|
|
|
{/if}
|
2025-01-21 15:22:19 +02:00
|
|
|
<p class="font-title text-lg font-semibold">Parim: {data.highscore}</p>
|
2025-01-21 13:10:47 +02:00
|
|
|
</div>
|
|
|
|
{/snippet}
|
|
|
|
|
2025-01-22 14:21:34 +02:00
|
|
|
{#snippet playArea(albums: AlbumData | undefined, placeholder = false)}
|
2025-01-21 19:52:19 +02:00
|
|
|
{#if placeholder}
|
2025-01-22 14:21:34 +02:00
|
|
|
{#each { length: 2 }}
|
2025-01-21 19:52:19 +02:00
|
|
|
<section class="grid grid-cols-3 items-center gap-14">
|
2025-01-22 14:21:34 +02:00
|
|
|
{#each { length: 3 }}
|
2025-01-21 19:52:19 +02:00
|
|
|
<Skeleton class="h-[5.25rem] w-full rounded-xl " />
|
|
|
|
{/each}
|
|
|
|
</section>
|
|
|
|
<Separator />
|
|
|
|
{/each}
|
|
|
|
|
|
|
|
<section class="grid grid-cols-3 items-center gap-14">
|
2025-01-22 14:21:34 +02:00
|
|
|
{#each { length: 3 }}
|
2025-01-21 19:52:19 +02:00
|
|
|
<Skeleton class="aspect-square h-auto max-w-full rounded-xl object-cover" />
|
|
|
|
{/each}
|
|
|
|
</section>
|
2025-01-22 14:21:34 +02:00
|
|
|
{:else if albums}
|
2025-01-21 19:52:19 +02:00
|
|
|
<DndGroup items={albums.names} type="names"></DndGroup>
|
|
|
|
<Separator />
|
|
|
|
<DndGroup items={albums.artists} type="artists"></DndGroup>
|
|
|
|
<Separator />
|
|
|
|
<DndGroup items={albums.images} image type="images"></DndGroup>
|
|
|
|
{/if}
|
|
|
|
|
|
|
|
{@render footer(placeholder)}
|
|
|
|
{/snippet}
|
|
|
|
|
|
|
|
<AlertDialog.Root open={data.playing === false}>
|
2025-01-21 11:42:52 +02:00
|
|
|
<AlertDialog.Content>
|
|
|
|
<AlertDialog.Header>
|
|
|
|
<AlertDialog.Title>
|
|
|
|
{#if data?.highscore && data?.stage && data.highscore === data.stage}
|
2025-01-21 13:10:47 +02:00
|
|
|
Uus parim tulemus!
|
2025-01-21 11:42:52 +02:00
|
|
|
{:else}
|
2025-01-21 13:10:47 +02:00
|
|
|
Seekord ei vedanud
|
2025-01-21 11:42:52 +02:00
|
|
|
{/if}
|
|
|
|
</AlertDialog.Title>
|
|
|
|
<AlertDialog.Description>
|
|
|
|
{#if data.stage === 0}
|
2025-01-21 13:46:16 +02:00
|
|
|
Põrusid esimesel katsel.
|
2025-01-21 11:42:52 +02:00
|
|
|
{:else}
|
2025-01-21 13:10:47 +02:00
|
|
|
Vastasid õigesti <strong>{data.stage} korda.</strong>
|
2025-01-21 11:42:52 +02:00
|
|
|
{/if}
|
|
|
|
</AlertDialog.Description>
|
|
|
|
</AlertDialog.Header>
|
|
|
|
<AlertDialog.Footer>
|
|
|
|
<form action="?/restart" method="POST" use:enhance>
|
2025-01-21 13:10:47 +02:00
|
|
|
<AlertDialog.Action type="submit">Uuesti</AlertDialog.Action>
|
2025-01-21 11:42:52 +02:00
|
|
|
</form>
|
|
|
|
</AlertDialog.Footer>
|
|
|
|
</AlertDialog.Content>
|
|
|
|
</AlertDialog.Root>
|
|
|
|
|
2025-01-22 14:21:34 +02:00
|
|
|
<header class="mb-24 flex flex-col items-center font-title">
|
2025-01-21 17:39:17 +02:00
|
|
|
<h1 class="mb-1 scroll-m-20 text-6xl font-extrabold tracking-tight lg:text-7xl">Paku biiti</h1>
|
|
|
|
<p class="text-2xl font-semibold text-muted-foreground">
|
|
|
|
Lohista kokku õiged albumi <span class="text-red-600 dark:text-red-400">nimed</span>,
|
|
|
|
<span class="text-purple-600 dark:text-purple-400">artistid</span> ja
|
|
|
|
<span class="text-blue-600 dark:text-blue-400">pildid</span>.
|
|
|
|
</p>
|
|
|
|
</header>
|
|
|
|
<main class="w-full max-w-4xl">
|
|
|
|
<form
|
|
|
|
action="?/submit"
|
|
|
|
method="POST"
|
|
|
|
use:enhance
|
2025-01-21 19:52:19 +02:00
|
|
|
class="grid w-full gap-4 transition-all {loading || data?.playing === false ? 'grayscale' : ''}"
|
2025-01-21 17:39:17 +02:00
|
|
|
>
|
|
|
|
{#if data?.streamed?.albums}
|
|
|
|
{#await data.streamed.albums}
|
2025-01-22 14:21:34 +02:00
|
|
|
{@render playArea(undefined, true)}
|
2025-01-21 17:39:17 +02:00
|
|
|
{:then albums}
|
2025-01-22 14:21:34 +02:00
|
|
|
{@render playArea(albums as AlbumData)}
|
2025-01-21 17:39:17 +02:00
|
|
|
{/await}
|
|
|
|
{:else}
|
2025-01-21 19:52:19 +02:00
|
|
|
{@render playArea(oldAlbums)}
|
2025-01-21 17:39:17 +02:00
|
|
|
{/if}
|
|
|
|
</form>
|
|
|
|
</main>
|