mirror of
https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend
synced 2025-12-31 09:37:15 +01:00
feat: add data access and feature libraries for return process, including models, schemas, and routes
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
export * from './lib/idb.storage-provider';
|
||||
export * from './lib/local.storage-provider';
|
||||
export * from './lib/session.storage-provider';
|
||||
export * from './lib/signal-store-feature';
|
||||
export * from './lib/storage-provider';
|
||||
export * from './lib/storage';
|
||||
|
||||
26
libs/core/storage/src/lib/signal-store-feature.ts
Normal file
26
libs/core/storage/src/lib/signal-store-feature.ts
Normal file
@@ -0,0 +1,26 @@
|
||||
import { Type } from '@angular/core';
|
||||
import { getState, patchState, signalStoreFeature, withHooks, withMethods } from '@ngrx/signals';
|
||||
import { StorageProvider } from './storage-provider';
|
||||
import { injectStorage } from './storage';
|
||||
|
||||
export function withStorage(storageKey: string, storageProvider: Type<StorageProvider>) {
|
||||
return signalStoreFeature(
|
||||
withMethods((store, storage = injectStorage(storageProvider)) => ({
|
||||
storeState: () => {
|
||||
const state = getState(store);
|
||||
storage.set(storageKey, state);
|
||||
},
|
||||
restoreState: async () => {
|
||||
const data = await storage.get(storageKey);
|
||||
if (data) {
|
||||
patchState(store, data);
|
||||
}
|
||||
},
|
||||
})),
|
||||
withHooks((store) => ({
|
||||
onInit() {
|
||||
store.restoreState();
|
||||
},
|
||||
})),
|
||||
);
|
||||
}
|
||||
@@ -18,7 +18,7 @@ export class Storage {
|
||||
return this.storageProvider.set(key, value);
|
||||
}
|
||||
|
||||
async get<T>(token: string | object, schema?: z.ZodType<T>): Promise<T | undefined> {
|
||||
async get<T>(token: string | object, schema?: z.ZodType<T>): Promise<T | unknown> {
|
||||
let key: string;
|
||||
|
||||
if (typeof token === 'string') {
|
||||
@@ -31,13 +31,13 @@ export class Storage {
|
||||
if (schema) {
|
||||
return await schema.parse(data);
|
||||
}
|
||||
return undefined;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
const storageMap = new WeakMap<Type<StorageProvider>, Storage>();
|
||||
|
||||
export function storage(storageProvider: Type<StorageProvider>): Storage {
|
||||
export function injectStorage(storageProvider: Type<StorageProvider>): Storage {
|
||||
if (storageMap.has(storageProvider)) {
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
return storageMap.get(storageProvider)!;
|
||||
|
||||
Reference in New Issue
Block a user