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.

58 lines
1.4 KiB

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