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.

48 lines
1.1 KiB

  1. import { writable } from "svelte/store";
  2. import stuffLogClient from "../clients/stufflog";
  3. import type { ProjectGroupResult } from "../models/projectgroup";
  4. interface ProjectStoreData {
  5. loading: boolean
  6. stale: boolean
  7. groups: ProjectGroupResult[]
  8. }
  9. function createProjectGroupStore() {
  10. const {update, subscribe} = writable<ProjectStoreData>({
  11. loading: false,
  12. stale: true,
  13. groups: [],
  14. });
  15. return {
  16. subscribe,
  17. markStale() {
  18. update(v => ({...v, stale: true}));
  19. },
  20. async loadOne(id: string) {
  21. update(v => ({...v, loading: true}));
  22. const group = await stuffLogClient.findProjectGroup(id);
  23. update(v => ({...v, loading: false, groups: [
  24. ...v.groups.filter(g => g.id === id),
  25. group,
  26. ]}));
  27. },
  28. fakeRefresh() {
  29. update(v => ({...v, groups: [...v.groups]}))
  30. },
  31. async load() {
  32. update(v => ({...v, loading: true, stale: false}));
  33. const groups = await stuffLogClient.listProjectGroups();
  34. update(v => ({...v, loading: false, groups: groups}));
  35. },
  36. }
  37. }
  38. const projectGroupStore = createProjectGroupStore();
  39. export default projectGroupStore;