perf: more efficient data store

This commit is contained in:
Aleksi Lassila
2025-02-15 02:51:03 +02:00
parent 3d723a7bb8
commit 8f83a34b35

View File

@@ -1,32 +1,29 @@
import { derived, get, writable } from 'svelte/store';
import { get, writable } from 'svelte/store';
import { tmdbApi, type TmdbMovieFull2, type TmdbSeriesFull2 } from '../apis/tmdb/tmdb-api';
import { awaitAppInitialization, reiverrApiNew, user } from './user.store';
type AwaitableStoreValue<TData> = {
loading: boolean;
data?: TData;
promise: Promise<TData>;
};
export function useRequest<TResponse>(fn: () => Promise<TResponse>) {
async function _createPromise() {
return awaitAppInitialization().then(() => fn());
}
const initialPromise = _createPromise();
const store = writable<AwaitableStoreValue<TResponse>>({
loading: true,
data: undefined,
promise: initialPromise
const promise = writable(initialPromise);
const isLoading = writable(true);
const data = writable<TResponse | undefined>(undefined);
initialPromise.then((d) => {
data.set(d);
isLoading.set(false);
});
initialPromise.then((data) => store.update((s) => ({ ...s, loading: false, data })));
async function refresh() {
store.update((s) => ({ ...s, loading: true }));
isLoading.set(true);
return _createPromise().then((data) => {
store.set({ loading: false, data, promise: Promise.resolve(data) });
return data;
return _createPromise().then((d) => {
data.set(d);
promise.set(Promise.resolve(d));
isLoading.set(false);
return d;
});
}
@@ -40,10 +37,6 @@ export function useRequest<TResponse>(fn: () => Promise<TResponse>) {
});
}
const data = derived(store, (s) => s.data);
const isLoading = derived(store, (s) => s.loading);
const promise = derived(store, (s) => s.promise);
return {
subscribe: data.subscribe,
isLoading,