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.

70 lines
1.8 KiB

  1. <script lang="ts" context="module">
  2. const contextKey = {ctx: "projectListCtx"};
  3. interface ItemListContextData {
  4. items: Readable<Item[]>,
  5. groups: Readable<ItemGroup[]>,
  6. reloadItemList(): Promise<void>,
  7. };
  8. const fallback: ItemListContextData = {
  9. items: readable([]),
  10. groups: readable([]),
  11. reloadItemList: () => Promise.resolve()
  12. };
  13. export function getItemListContext() {
  14. return getContext(contextKey) as ItemListContextData || fallback
  15. }
  16. </script>
  17. <script lang="ts">
  18. import { readable, writable, type Readable } from "svelte/store";
  19. import { getContext, setContext } from "svelte";
  20. import { sl3 } from "$lib/clients/sl3";
  21. import { getScopeContext } from "./ScopeContext.svelte";
  22. import type Item from "$lib/models/item";
  23. import type { ItemFilter, ItemGroup } from "$lib/models/item";
  24. import { getStores } from "$app/stores";
  25. export let items: Item[];
  26. export let groups: ItemGroup[];
  27. export let filter: ItemFilter;
  28. const {scope} = getScopeContext();
  29. const {page} = getStores();
  30. let itemsWritable = writable<Item[]>(items);
  31. let groupsWritable = writable<ItemGroup[]>(groups);
  32. let loading = false;
  33. let lastSet = {items, groups};
  34. setContext<ItemListContextData>(contextKey, {
  35. items: {subscribe: itemsWritable.subscribe},
  36. groups: {subscribe: groupsWritable.subscribe},
  37. reloadItemList,
  38. });
  39. async function reloadItemList() {
  40. if (loading) {
  41. return
  42. }
  43. try {
  44. const res = await sl3(fetch, $page.stuff.idToken).listItems($scope.id, filter, true, {});
  45. itemsWritable.set(res.items);
  46. groupsWritable.set(res.groups);
  47. } catch(_) {}
  48. loading = false;
  49. }
  50. $: {
  51. if (lastSet.items !== items || lastSet.groups !== groups) {
  52. itemsWritable.set(items);
  53. groupsWritable.set(groups);
  54. lastSet = {items, groups};
  55. }
  56. }
  57. </script>
  58. <slot></slot>