Loggest thine Stuff
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

61 lines
1.5 KiB

2 years ago
2 years ago
2 years ago
2 years ago
  1. <script lang="ts" context="module">
  2. const contextKey = {ctx: "projectListCtx"};
  3. interface ProjectListContextData {
  4. projects: Readable<ProjectEntry[]>,
  5. reloadProjectList(): Promise<void>,
  6. };
  7. const fallback: ProjectListContextData = {
  8. projects: readable([]),
  9. reloadProjectList: () => Promise.resolve()
  10. };
  11. export function getProjectListContext() {
  12. return getContext(contextKey) as ProjectListContextData || fallback
  13. }
  14. </script>
  15. <script lang="ts">
  16. import { readable, writable, type Readable } from "svelte/store";
  17. import { getContext, setContext } from "svelte";
  18. import { sl3 } from "$lib/clients/sl3";
  19. import { getScopeContext } from "./ScopeContext.svelte";
  20. import type { ProjectEntry } from "$lib/models/project";
  21. import { getStores } from "$app/stores";
  22. export let projects: ProjectEntry[];
  23. const {scope} = getScopeContext();
  24. const {page} = getStores();
  25. let projectWritable = writable<ProjectEntry[]>(projects);
  26. let loading = false;
  27. let lastSet = projects;
  28. setContext<ProjectListContextData>(contextKey, {
  29. projects: {subscribe: projectWritable.subscribe},
  30. reloadProjectList,
  31. });
  32. async function reloadProjectList() {
  33. if (loading) {
  34. return
  35. }
  36. try {
  37. const newProjects = await sl3(fetch, $page.stuff.idToken).listProjects($scope.id)
  38. projectWritable.set(newProjects);
  39. } catch(_) {}
  40. loading = false;
  41. }
  42. $: {
  43. if (lastSet !== projects) {
  44. projectWritable.set(projects);
  45. lastSet = projects;
  46. }
  47. }
  48. </script>
  49. <slot></slot>