all repos — kōi @ e252fb0b8f069ac47108b7307af4ab921d5b7ff7

Minimalist task manager

src/pages/Home.svelte (view raw)

 1<script lang="ts">
 2  import {
 3    getDefaultSession,
 4    handleIncomingRedirect,
 5    fetch,
 6  } from "@inrupt/solid-client-authn-browser";
 7  import { onMount } from "svelte";
 8  import TasksFeed from "../lib/components/TasksFeed.svelte";
 9  import NewTask from "../lib/components/NewTask.svelte";
10  import tasksStore from "../lib/store/tasksStore";
11  import podInfo from "../lib/store/podInfoStore";
12  import {
13    getPodUrlAll,
14    getSolidDataset,
15    getThingAll,
16  } from "@inrupt/solid-client";
17  import Profile from "../lib/components/Profile.svelte";
18  import { thingToTask } from "../lib/models/task";
19
20  let { navigate }: PageProps = $props();
21  let sessionInfo = $state(getDefaultSession()?.info);
22
23  onMount(async () => {
24    const info = await handleIncomingRedirect({
25      restorePreviousSession: true,
26    });
27    if (!info?.isLoggedIn) navigate("/login");
28    else if (!info?.webId)
29      console.error(`Invalid info received from Pod. No WebId found.`);
30    else {
31      sessionInfo = info;
32
33      // Load pod info
34      const pods = await getPodUrlAll(sessionInfo?.webId, { fetch: fetch });
35      const firstPod = pods?.[0];
36      if (firstPod) $podInfo.podUrl = firstPod;
37
38      // Load tasks dataset from pod
39      const tasksDataset = await getSolidDataset(`${firstPod}/tasks/default`, {
40        fetch: fetch,
41      });
42      $podInfo.tasksDataset = tasksDataset;
43
44      // Init tasks store
45      const things = getThingAll(tasksDataset);
46      const tasks = things.map(thingToTask);
47      tasksStore.set(tasks);
48    }
49  });
50</script>
51
52<main class="w-3xl max-w-full mx-auto p-4">
53  {#if sessionInfo.isLoggedIn}
54    <div class="flex justify-between">
55      <h1 class="text-2xl mb-4">kōi</h1>
56      <Profile />
57    </div>
58    <TasksFeed tasks={$tasksStore} />
59    <NewTask />
60  {:else}
61    <div class="flex flex-col items-center mt-8 gap-4">
62      <span class="loading loading-spinner loading-xl"></span>
63      <span>Connexion au pod</span>
64    </div>
65  {/if}
66</main>