From f07bcc4660fb6035c0bc5f65188dd46d6646715c Mon Sep 17 00:00:00 2001 From: Juergen Kunz Date: Fri, 12 Sep 2025 07:56:06 +0000 Subject: [PATCH] feat(appstate): Refactor data fetching to use helper for stripping class instances --- ts_web/appstate.ts | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/ts_web/appstate.ts b/ts_web/appstate.ts index a2896bb..fe5cefb 100644 --- a/ts_web/appstate.ts +++ b/ts_web/appstate.ts @@ -2,6 +2,11 @@ import * as plugins from './plugins.js'; import * as domtools from '@design.estate/dees-domtools'; const appstate = new plugins.deesDomtools.plugins.smartstate.Smartstate(); + +// Helper: strip class instances (with circular refs) to plain objects +type IdData = { id: string; data: T }; +const toPlain = (items: Array<{ id: string; data: D }> = []): Array> => + items.map(({ id, data }) => ({ id, data })); export interface ILoginState { identity: plugins.interfaces.data.IIdentity; } @@ -16,7 +21,7 @@ export const loginAction = loginStatePart.createAction<{ username: string; passw const currentState = statePartArg.getState(); let identity: plugins.interfaces.data.IIdentity = null; try { - identity = await apiClient.loginWithUsernameAndPassword(payloadArg.username, payloadArg.password) as any; + identity = await apiClient.loginWithUsernameAndPassword(payloadArg.username, payloadArg.password); } catch (err) { console.log(err); } @@ -102,7 +107,7 @@ export const getAllDataAction = dataState.createAction(async (statePartArg) => { const secretGroups = await apiClient.secretgroup.getSecretGroups(); currentState = { ...currentState, - secretGroups: (secretGroups as any[]).map((sg: any) => ({ id: sg.id, data: sg.data })), + secretGroups: toPlain(secretGroups), }; } catch (err) { console.error('Failed to fetch secret groups:', err); @@ -118,7 +123,7 @@ export const getAllDataAction = dataState.createAction(async (statePartArg) => { const responseSecretBundles = await apiClient.secretbundle.getSecretBundles(); currentState = { ...currentState, - secretBundles: (responseSecretBundles as any[]).map((sb: any) => ({ id: sb.id, data: sb.data })), + secretBundles: toPlain(responseSecretBundles), }; } catch (err) { console.error('Failed to fetch secret bundles:', err); @@ -134,7 +139,7 @@ export const getAllDataAction = dataState.createAction(async (statePartArg) => { const images = await apiClient.image.getImages(); currentState = { ...currentState, - images: (images as any[]).map((im: any) => ({ id: im.id, data: im.data })), + images: toPlain(images), }; } catch (err) { console.error('Failed to fetch images:', err); @@ -150,7 +155,7 @@ export const getAllDataAction = dataState.createAction(async (statePartArg) => { const clusters = await apiClient.cluster.getClusters(); currentState = { ...currentState, - clusters: (clusters as any[]).map((cl: any) => ({ id: cl.id, data: cl.data })), + clusters: toPlain(clusters), } } catch (err) { console.error('Failed to fetch clusters:', err); @@ -166,7 +171,7 @@ export const getAllDataAction = dataState.createAction(async (statePartArg) => { const registries = await apiClient.externalRegistry.getRegistries(); currentState = { ...currentState, - externalRegistries: (registries as any[]).map((r: any) => ({ id: r.id, data: r.data })), + externalRegistries: toPlain(registries), }; } catch (error) { console.error('Failed to fetch external registries:', error); @@ -182,7 +187,7 @@ export const getAllDataAction = dataState.createAction(async (statePartArg) => { const services = await apiClient.services.getServices(); currentState = { ...currentState, - services: (services as any[]).map((s: any) => ({ id: s.id, data: s.data })), + services: toPlain(services), }; } catch (error) { console.error('Failed to fetch services:', error); @@ -324,7 +329,7 @@ export const createImageAction = dataState.createAction( async (statePartArg, payloadArg: { imageName: string, description: string }) => { let currentState = statePartArg.getState(); apiClient.identity = loginStatePart.getState().identity; - await apiClient.image.createImage({ name: payloadArg.imageName, description: payloadArg.description } as any); + await apiClient.image.createImage({ name: payloadArg.imageName, description: payloadArg.description }); currentState = await dataState.dispatchAction(getAllDataAction, null); return currentState; }