feat: widgets and ai chat

This commit is contained in:
Rotimi Best
2026-04-27 11:40:38 +01:00
parent ae1801f85f
commit 5717dd8004
391 changed files with 28177 additions and 22467 deletions
@@ -0,0 +1,47 @@
<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}