a
This commit is contained in:
47
src/lib/stores/cache/users.ts
vendored
Normal file
47
src/lib/stores/cache/users.ts
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
import { getUserById } from "$lib/api/user";
|
||||
import { isErrorResponse, type User } from "$lib/types";
|
||||
import { get, writable, type Writable } from "svelte/store";
|
||||
|
||||
const usersCache: Writable<Map<number, User>> = writable(new Map<number, User>());
|
||||
|
||||
const runningCaches = new Set();
|
||||
|
||||
usersCache.subscribe((users) => {
|
||||
console.log(`Cached users: ${JSON.stringify([...users.values()])}`);
|
||||
})
|
||||
|
||||
export function addUserToCache(user: User) {
|
||||
usersCache.update((users) => users.set(user.id, user));
|
||||
}
|
||||
|
||||
export async function getCachedUser(userId: number): Promise<User | null> {
|
||||
const cachedUser = get(usersCache).get(userId);
|
||||
|
||||
if (cachedUser)
|
||||
return cachedUser;
|
||||
|
||||
if (runningCaches.has(userId)) {
|
||||
return await new Promise((resolve) => {
|
||||
usersCache.subscribe((users) => {
|
||||
console.log(`subsribed called`);
|
||||
const user = users.get(userId);
|
||||
if (user) {
|
||||
runningCaches.delete(userId);
|
||||
resolve(user);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
runningCaches.add(userId);
|
||||
|
||||
const response = await getUserById(userId);
|
||||
if (isErrorResponse(response))
|
||||
return null;
|
||||
|
||||
const user = response as User;
|
||||
|
||||
addUserToCache(user);
|
||||
|
||||
return user;
|
||||
}
|
||||
Reference in New Issue
Block a user