Files
classroomio/apps/embeds/src/widgets/course-widget/widget.svelte
T

48 lines
1.4 KiB
Svelte
Raw Normal View History

2026-04-27 11:40:38 +01:00
<script lang="ts">
import { onMount } from 'svelte';
import type { TWidgetPayload } from '@cio/utils/validation/widget';
import { CourseWidget } from '@cio/ui/custom/widget-layouts';
const DEFAULT_API_BASE_URL = 'https://api.classroomio.com';
let { publicKey, apiBaseUrl = DEFAULT_API_BASE_URL }: { publicKey: string; apiBaseUrl?: string } = $props();
let payload = $state<TWidgetPayload | null>(null);
let errorMessage = $state('');
async function loadPayload() {
try {
errorMessage = '';
const response = await fetch(
`${(apiBaseUrl || DEFAULT_API_BASE_URL).replace(/\/$/, '')}/widgets/${publicKey}/payload`
);
const result = (await response.json()) as { success?: boolean; data?: TWidgetPayload; error?: string };
if (!response.ok || !result.success || !result.data) {
throw new Error(result.error || 'Failed to load widget');
}
payload = result.data;
} catch (error) {
errorMessage = error instanceof Error ? error.message : 'Failed to load widget';
}
}
onMount(() => {
void loadPayload();
});
</script>
{#if errorMessage}
<div class="cio-widget-shell cio-widget-error">
<p>{errorMessage}</p>
</div>
{:else if !payload}
<div class="cio-widget-shell cio-widget-loading">
<div class="cio-widget-spinner" aria-hidden="true"></div>
</div>
{:else}
<CourseWidget {payload} />
{/if}