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.

59 lines
1.3 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
  1. import { writable } from "svelte/store";
  2. import stuffLogClient from "../clients/stufflog";
  3. import type { LogFilter, LogResult } from "../models/log";
  4. interface ProjectStoreData {
  5. loading: boolean
  6. stale: boolean
  7. logs: LogResult[]
  8. filter: LogFilter
  9. }
  10. function createLogStore() {
  11. const {update, subscribe} = writable<ProjectStoreData>({
  12. loading: false,
  13. stale: true,
  14. logs: [],
  15. filter: {},
  16. });
  17. let lastLoad = 0;
  18. let spamPoints = 10;
  19. return {
  20. subscribe,
  21. markStale() {
  22. update(v => ({...v, stale: true}));
  23. },
  24. async load(filter: LogFilter) {
  25. update(v => ({...v, loading: true, filter}));
  26. // Prevent too much spammery when tweaking the date.
  27. const timeSince = Date.now() - lastLoad;
  28. if (timeSince < 3000) {
  29. if (timeSince < 1000) {
  30. spamPoints -= 1;
  31. }
  32. if (spamPoints <= 0) {
  33. await new Promise(resolve => setTimeout(resolve, 3000 - timeSince));
  34. spamPoints = 10;
  35. }
  36. } else {
  37. spamPoints = 10;
  38. }
  39. lastLoad = Date.now();
  40. const logs = await stuffLogClient.listLogs(filter);
  41. update(v => ({...v, loading: false, stale: false, logs: logs.reverse()}));
  42. },
  43. }
  44. }
  45. const logStore = createLogStore();
  46. export const fpLogStore = createLogStore();
  47. export default logStore;