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.
 
 
 
 
 
 

57 lines
1.3 KiB

import { writable } from "svelte/store";
import stuffLogClient from "../clients/stufflog";
import type { LogFilter, LogResult } from "../models/log";
interface ProjectStoreData {
loading: boolean
stale: boolean
logs: LogResult[]
filter: LogFilter
}
function createProjectStore() {
const {update, subscribe} = writable<ProjectStoreData>({
loading: false,
stale: true,
logs: [],
filter: {},
});
let lastLoad = 0;
let spamPoints = 10;
return {
subscribe,
markStale() {
update(v => ({...v, stale: true}));
},
async load(filter: LogFilter) {
update(v => ({...v, loading: true, filter}));
// Prevent too much spammery when tweaking the date.
const timeSince = Date.now() - lastLoad;
if (timeSince < 3000) {
if (timeSince < 1000) {
spamPoints -= 1;
}
if (spamPoints <= 0) {
await new Promise(resolve => setTimeout(resolve, 3000 - timeSince));
spamPoints = 10;
}
} else {
spamPoints = 10;
}
lastLoad = Date.now();
const logs = await stuffLogClient.listLogs(filter);
update(v => ({...v, loading: false, stale: false, logs: logs.reverse()}));
},
}
}
const logStore = createProjectStore();
export default logStore;