From 648755c50b9488da77cefa6a64448248feffb0e5 Mon Sep 17 00:00:00 2001 From: amalcaraz Date: Wed, 20 Dec 2023 19:39:40 +0100 Subject: [PATCH] fix: improvents in performance reducing requests --- package-lock.json | 14 +-- package.json | 2 +- src/components/common/Viewport/cmp.tsx | 6 +- src/domain/file.ts | 5 +- src/domain/node.ts | 27 ++++-- .../useRequestEntity/useRequestAlephNodes.ts | 90 +++++++++++++++++++ src/hooks/common/useStoreEntitiesRequest.ts | 10 +-- 7 files changed, 128 insertions(+), 26 deletions(-) create mode 100644 src/hooks/common/useRequestEntity/useRequestAlephNodes.ts diff --git a/package-lock.json b/package-lock.json index ffbda3c..30faeed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "name": "front-aleph-account-page", "version": "0.2.15", "dependencies": { - "@aleph-front/aleph-core": "^1.13.15", + "@aleph-front/aleph-core": "^1.13.16", "@fortawesome/fontawesome-svg-core": "^6.3.0", "@helia/unixfs": "^1.4.1", "@hookform/resolvers": "^3.1.1", @@ -187,9 +187,9 @@ } }, "node_modules/@aleph-front/aleph-core": { - "version": "1.13.15", - "resolved": "https://registry.npmjs.org/@aleph-front/aleph-core/-/aleph-core-1.13.15.tgz", - "integrity": "sha512-TkDN1RqcrtI2pJr1FtQW2FkwrkBw4Zm+SEdfY0tkuS3JtbHDKLzg6+VqwIpvSU4chR9ExLfMxja0KZFE6DVOcA==", + "version": "1.13.16", + "resolved": "https://registry.npmjs.org/@aleph-front/aleph-core/-/aleph-core-1.13.16.tgz", + "integrity": "sha512-b98+KkFTdOG8uXI9W3YTuRuOn+6FyLBqoLg6InZIiB7HBER+/WLr8W7jaG7YutXM5XzGeZNm4ocQ/Y8BlgelqQ==", "dependencies": { "@monaco-editor/react": "^4.4.6", "react-transition-group": "^4.4.5" @@ -14137,9 +14137,9 @@ } }, "@aleph-front/aleph-core": { - "version": "1.13.15", - "resolved": "https://registry.npmjs.org/@aleph-front/aleph-core/-/aleph-core-1.13.15.tgz", - "integrity": "sha512-TkDN1RqcrtI2pJr1FtQW2FkwrkBw4Zm+SEdfY0tkuS3JtbHDKLzg6+VqwIpvSU4chR9ExLfMxja0KZFE6DVOcA==", + "version": "1.13.16", + "resolved": "https://registry.npmjs.org/@aleph-front/aleph-core/-/aleph-core-1.13.16.tgz", + "integrity": "sha512-b98+KkFTdOG8uXI9W3YTuRuOn+6FyLBqoLg6InZIiB7HBER+/WLr8W7jaG7YutXM5XzGeZNm4ocQ/Y8BlgelqQ==", "requires": { "@monaco-editor/react": "^4.4.6", "react-transition-group": "^4.4.5" diff --git a/package.json b/package.json index 3d7c760..f384899 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "lint:fix": "next lint --fix" }, "dependencies": { - "@aleph-front/aleph-core": "^1.13.15", + "@aleph-front/aleph-core": "^1.13.16", "@fortawesome/fontawesome-svg-core": "^6.3.0", "@helia/unixfs": "^1.4.1", "@hookform/resolvers": "^3.1.1", diff --git a/src/components/common/Viewport/cmp.tsx b/src/components/common/Viewport/cmp.tsx index b303978..8cb8903 100644 --- a/src/components/common/Viewport/cmp.tsx +++ b/src/components/common/Viewport/cmp.tsx @@ -1,15 +1,13 @@ import { ViewportProps } from './types' import { StyledViewport } from './styles' import { memo } from 'react' -import { useRequestCCNs } from '@/hooks/common/useRequestEntity/useRequestCCNs' -import { useRequestCRNs } from '@/hooks/common/useRequestEntity/useRequestCRNs' import { useRequestRewards } from '@/hooks/common/useRequestEntity/useRequestRewards' import { useRequestCCNsFeed } from '@/hooks/common/useRequestEntity/useRequestCCNsFeed' import { useRequestRewardsFeed } from '@/hooks/common/useRequestEntity/useRequestRewardsFeed' +import { useRequestAlephNodes } from '@/hooks/common/useRequestEntity/useRequestAlephNodes' export const Viewport = ({ children }: ViewportProps) => { - useRequestCCNs({}) - useRequestCRNs({}) + useRequestAlephNodes({}) useRequestRewards({}) useRequestCCNsFeed() diff --git a/src/domain/file.ts b/src/domain/file.ts index a79340d..00480f1 100644 --- a/src/domain/file.ts +++ b/src/domain/file.ts @@ -106,11 +106,14 @@ export class FileManager { async uploadFile(fileObject: File): Promise { if (!this.account) throw new Error('Invalid account') + // @note: Quick temporal fix to upload files + const buffer = Buffer.from(await fileObject.arrayBuffer()) + const message = await store.Publish({ account: this.account, channel, APIServer: apiServer, - fileObject, + fileObject: buffer, }) return message.content.item_hash diff --git a/src/domain/node.ts b/src/domain/node.ts index 6737179..102300a 100644 --- a/src/domain/node.ts +++ b/src/domain/node.ts @@ -203,10 +203,11 @@ export class NodeManager { async getCCNNodes(): Promise { const res = await this.fetchAllNodes() - const { crns } = res - let { ccns } = res + let { ccns, crns } = res - ccns = this.parseResourceNodes(ccns, crns) + crns = this.parseResourceNodes(crns) + + ccns = this.parseChildrenResourceNodes(ccns, crns) ccns = await this.parseScores(ccns, false) ccns = await this.parseMetrics(ccns, false) @@ -218,6 +219,8 @@ export class NodeManager { const { ccns } = res let { crns } = res + crns = this.parseResourceNodes(crns) + crns = this.parseParentNodes(crns, ccns) crns = await this.parseScores(crns, true) crns = await this.parseMetrics(crns, true) @@ -231,7 +234,9 @@ export class NodeManager { const { timestamp } = response let { ccns, crns } = response - ccns = this.parseResourceNodes(ccns, crns) + crns = this.parseResourceNodes(crns) + + ccns = this.parseChildrenResourceNodes(ccns, crns) ccns = await this.parseScores(ccns, false) ccns = await this.parseMetrics(ccns, false) @@ -265,7 +270,9 @@ export class NodeManager { let crns: CRN[] = resource_nodes let ccns: CCN[] = nodes - ccns = this.parseResourceNodes(ccns, crns) + crns = this.parseResourceNodes(crns) + + ccns = this.parseChildrenResourceNodes(ccns, crns) ccns = await this.parseScores(ccns, false) ccns = await this.parseMetrics(ccns, false) @@ -606,7 +613,15 @@ export class NodeManager { return lastVersion.outdated === node.metricsData?.version } - protected parseResourceNodes(ccns: CCN[], crns: CRN[]): CCN[] { + protected parseResourceNodes(crns: CRN[]): CRN[] { + return crns.map((crn) => { + // @note: some nodes has {locked: ""} + crn.locked = !!crn.locked + return crn + }) + } + + protected parseChildrenResourceNodes(ccns: CCN[], crns: CRN[]): CCN[] { const crnsMap = crns.reduce((ac, cu) => { if (!cu.parent) return ac diff --git a/src/hooks/common/useRequestEntity/useRequestAlephNodes.ts b/src/hooks/common/useRequestEntity/useRequestAlephNodes.ts new file mode 100644 index 0000000..5f95672 --- /dev/null +++ b/src/hooks/common/useRequestEntity/useRequestAlephNodes.ts @@ -0,0 +1,90 @@ +import { useMemo } from 'react' +import { CCN, CRN, NodeLastVersions, NodeManager } from '@/domain/node' +import { useAppState } from '@/contexts/appState' +import { useAppStoreRequest } from '../useStoreRequest' +import { useRequest } from '@aleph-front/aleph-core' +import { EntitySetAction } from '@/store/entity' + +export type UseRequestAlephNodesProps = { + triggerDeps?: unknown[] +} + +export type UseRequestAlephNodesReturn = { + ccns?: CCN[] + crns?: CRN[] + ccnLastVersion?: NodeLastVersions + crnLastVersion?: NodeLastVersions +} + +export function useRequestAlephNodes({ + triggerDeps, +}: UseRequestAlephNodesProps): UseRequestAlephNodesReturn { + const [appState, dispatch] = useAppState() + const { account } = appState.account + const { ccns, crns } = appState + + // @todo: Refactor this (use singleton) + const nodeManager = useMemo(() => new NodeManager(account), [account]) + + const state = useMemo(() => { + return { + data: { + ccns: { data: ccns.entities, loading: ccns.loading, error: ccns.error }, + crns: { data: crns.entities, loading: crns.loading, error: crns.error }, + timestamp: Date.now(), + }, + loading: ccns.loading || crns.loading, + error: ccns.error || crns.error, + } + }, [ccns, crns]) + + const { data } = useRequest({ + state, + setState: (newState) => { + const { ccns, crns } = newState.data || {} + ccns && dispatch(new EntitySetAction({ name: 'ccns', state: ccns })) + crns && dispatch(new EntitySetAction({ name: 'crns', state: crns })) + }, + doRequest: async () => { + const res = await nodeManager.getAllNodes() + return { + ccns: { data: res.ccns, loading: false, error: undefined }, + crns: { data: res.crns, loading: false, error: undefined }, + timestamp: Date.now(), + } + }, + onSuccess: () => null, + flushData: false, + triggerOnMount: true, + triggerDeps, + }) + + // ----------------------------- + + const { data: ccnLastVersion } = useAppStoreRequest({ + name: 'lastCCNVersion', + doRequest: () => nodeManager.getLatestCCNVersion(), + onSuccess: () => null, + onError: () => null, + flushData: false, + triggerOnMount: true, + }) + + // ----------------------------- + + const { data: crnLastVersion } = useAppStoreRequest({ + name: 'lastCRNVersion', + doRequest: () => nodeManager.getLatestCRNVersion(), + onSuccess: () => null, + onError: () => null, + flushData: false, + triggerOnMount: true, + }) + + return { + ccns: data?.ccns.data, + crns: data?.crns.data, + ccnLastVersion, + crnLastVersion, + } +} diff --git a/src/hooks/common/useStoreEntitiesRequest.ts b/src/hooks/common/useStoreEntitiesRequest.ts index d6e2963..db19909 100644 --- a/src/hooks/common/useStoreEntitiesRequest.ts +++ b/src/hooks/common/useStoreEntitiesRequest.ts @@ -1,6 +1,6 @@ import { Dispatch, useMemo } from 'react' import { useAppState } from '@/contexts/appState' -import { EntityAction, EntityActionType, EntityState } from '@/store/entity' +import { EntityAction, EntitySetAction, EntityState } from '@/store/entity' import { StoreState } from '@/store/store' import { UseRequestProps, @@ -41,12 +41,8 @@ export function useStoreEntityRequest({ return useRequest({ state, - setState: (newState) => { - return dispatch({ - type: EntityActionType.ENTITY_SET, - payload: { name, state: newState }, - }) - }, + setState: (newState) => + dispatch(new EntitySetAction({ name, state: newState })), ...props, }) }