From e910958b262ddcdfd61a0198b16425a0a84c430b Mon Sep 17 00:00:00 2001 From: PhilReact Date: Sat, 31 May 2025 01:21:14 +0300 Subject: [PATCH] memorize hooks --- src/hooks/useAppInfo.tsx | 39 +++++++------ src/hooks/useIdentifiers.tsx | 98 +++++++++++++++++++++----------- src/hooks/useIndexes.tsx | 9 +-- src/hooks/usePersistentStore.tsx | 6 +- src/hooks/useResourceStatus.tsx | 4 +- src/hooks/useResources.tsx | 7 ++- src/state/publishes.ts | 3 +- 7 files changed, 102 insertions(+), 64 deletions(-) diff --git a/src/hooks/useAppInfo.tsx b/src/hooks/useAppInfo.tsx index 5b46949..af913d7 100644 --- a/src/hooks/useAppInfo.tsx +++ b/src/hooks/useAppInfo.tsx @@ -3,28 +3,33 @@ import { useAuthStore } from "../state/auth"; import { useAppStore } from "../state/app"; import { EnumCollisionStrength, hashWord } from "../utils/encryption"; - export const useAppInfo = (appName?: string, publicSalt?: string) => { - const setAppState = useAppStore((state)=> state.setAppState) - const appNameHashed = useAppStore((state)=> state.appNameHashed) - + const setAppState = useAppStore((state) => state.setAppState); + const appNameHashed = useAppStore((state) => state.appNameHashed); - const handleAppInfoSetup = useCallback(async (name: string, salt: string)=> { - const appNameHashed = await hashWord(name, EnumCollisionStrength.HIGH, salt) + const handleAppInfoSetup = useCallback(async (name: string, salt: string) => { + const appNameHashed = await hashWord( + name, + EnumCollisionStrength.HIGH, + salt + ); setAppState({ appName: name, publicSalt: salt, - appNameHashed - }) - }, []) + appNameHashed, + }); + }, []); - useEffect(()=> { - if(appName && publicSalt){ - handleAppInfoSetup(appName, publicSalt) + useEffect(() => { + if (appName && publicSalt) { + handleAppInfoSetup(appName, publicSalt); } - }, [appName, publicSalt, handleAppInfoSetup]) - return { - appName, - appNameHashed - }; + }, [appName, publicSalt, handleAppInfoSetup]); + return useMemo( + () => ({ + appName, + appNameHashed, + }), + [appName, appNameHashed] + ); }; diff --git a/src/hooks/useIdentifiers.tsx b/src/hooks/useIdentifiers.tsx index 378dbdd..f874023 100644 --- a/src/hooks/useIdentifiers.tsx +++ b/src/hooks/useIdentifiers.tsx @@ -1,42 +1,72 @@ -import React, { useCallback } from "react"; -import { buildIdentifier, buildSearchPrefix, EnumCollisionStrength, hashWord } from "../utils/encryption"; - +import React, { useCallback, useMemo } from "react"; +import { + buildIdentifier, + buildSearchPrefix, + EnumCollisionStrength, + hashWord, +} from "../utils/encryption"; export const useIdentifiers = (publicSalt: string, appName: string) => { + const buildIdentifierFunc = useCallback( + (entityType: string, parentId: string | null) => { + return buildIdentifier(appName, publicSalt, entityType, parentId); + }, + [appName, publicSalt] + ); + const buildSearchPrefixFunc = useCallback( + (entityType: string, parentId: string | null) => { + return buildSearchPrefix(appName, publicSalt, entityType, parentId); + }, + [appName, publicSalt] + ); - const buildIdentifierFunc = useCallback(( entityType: string, - parentId: string | null)=> { - return buildIdentifier(appName, publicSalt, entityType, parentId) - }, [appName, publicSalt]) + const createSingleIdentifier = useCallback( + async (partialIdentifier: string) => { + const appNameHashed = await hashWord( + appName, + EnumCollisionStrength.HIGH, + publicSalt + ); + return appNameHashed + "_" + partialIdentifier; + }, + [appName, publicSalt] + ); - const buildSearchPrefixFunc = useCallback(( entityType: string, - parentId: string | null)=> { - return buildSearchPrefix(appName, publicSalt, entityType, parentId) - }, [appName, publicSalt]) - - const createSingleIdentifier = useCallback(async ( partialIdentifier: string)=> { - const appNameHashed = await hashWord(appName, EnumCollisionStrength.HIGH, publicSalt) - return appNameHashed + '_' + partialIdentifier - }, [appName, publicSalt]) + const hashQortalName = useCallback( + async (qortalName: string) => { + const hashedQortalName = await hashWord( + qortalName, + EnumCollisionStrength.HIGH, + publicSalt + ); + return hashedQortalName; + }, + [publicSalt] + ); - const hashQortalName = useCallback(async ( qortalName: string)=> { - const hashedQortalName = await hashWord(qortalName, EnumCollisionStrength.HIGH, publicSalt) - return hashedQortalName -}, [publicSalt]) + const hashString = useCallback( + async (string: string, strength: EnumCollisionStrength) => { + const hashedQortalName = await hashWord(string, strength, publicSalt); + return hashedQortalName; + }, + [publicSalt] + ); -const hashString = useCallback(async ( string: string, strength: EnumCollisionStrength)=> { - const hashedQortalName = await hashWord(string, strength, publicSalt) -return hashedQortalName -}, [publicSalt]) - - - - return { - buildIdentifier: buildIdentifierFunc, - buildSearchPrefix: buildSearchPrefixFunc, - createSingleIdentifier, - hashQortalName, - hashString - }; + return useMemo( + () => ({ + buildIdentifier: buildIdentifierFunc, + buildSearchPrefix: buildSearchPrefixFunc, + createSingleIdentifier, + hashQortalName, + hashString, + }), + [ + buildIdentifierFunc, + buildSearchPrefixFunc, + createSingleIdentifier, + hashQortalName, + hashString, + ] + ); }; diff --git a/src/hooks/useIndexes.tsx b/src/hooks/useIndexes.tsx index c1e49d6..b65cb35 100644 --- a/src/hooks/useIndexes.tsx +++ b/src/hooks/useIndexes.tsx @@ -1,4 +1,4 @@ -import React, { useCallback } from "react"; +import React, { useCallback, useMemo } from "react"; import { OpenIndex, useIndexStore } from "../state/indexes"; export const useIndexes = () => { @@ -16,7 +16,8 @@ export const useIndexes = () => { [setOpen] ); - return { - openPageIndexManager, - }; + + return useMemo(() => ({ + openPageIndexManager + }), [openPageIndexManager]); }; diff --git a/src/hooks/usePersistentStore.tsx b/src/hooks/usePersistentStore.tsx index 69eb3b0..8029461 100644 --- a/src/hooks/usePersistentStore.tsx +++ b/src/hooks/usePersistentStore.tsx @@ -1,4 +1,4 @@ -import { useCallback } from 'react'; +import { useCallback, useMemo } from 'react'; import { EnumCollisionStrength, hashWord } from '../utils/encryption'; import { db } from '../utils/persistentDb'; @@ -75,7 +75,7 @@ export const usePersistentStore = ( return await db.dynamicData.toArray(); }, []); - return { + return useMemo(() => ({ setTimestamp, getTimestamp, isNewTimestamp, @@ -83,5 +83,5 @@ export const usePersistentStore = ( getData, deleteData, listAllData, - }; + }), [setTimestamp, getTimestamp, isNewTimestamp, saveData, getData, deleteData, listAllData]); }; diff --git a/src/hooks/useResourceStatus.tsx b/src/hooks/useResourceStatus.tsx index 2d61abd..21dff16 100644 --- a/src/hooks/useResourceStatus.tsx +++ b/src/hooks/useResourceStatus.tsx @@ -3,14 +3,14 @@ import { usePublishStore } from "../state/publishes"; import { QortalGetMetadata } from "../types/interfaces/resources"; interface PropsUseResourceStatus { - resource: QortalGetMetadata; + resource: QortalGetMetadata | null; retryAttempts?: number; } export const useResourceStatus = ({ resource, retryAttempts = 15, }: PropsUseResourceStatus) => { - const resourceId = `${resource.service}-${resource.name}-${resource.identifier}`; + const resourceId = !resource ? null : `${resource.service}-${resource.name}-${resource.identifier}`; const status = usePublishStore((state)=> state.getResourceStatus(resourceId)) || null const intervalRef = useRef(null) const timeoutRef = useRef(null) diff --git a/src/hooks/useResources.tsx b/src/hooks/useResources.tsx index 422640d..7452c0e 100644 --- a/src/hooks/useResources.tsx +++ b/src/hooks/useResources.tsx @@ -1,4 +1,4 @@ -import React, { useCallback } from "react"; +import React, { useCallback, useMemo } from "react"; import { QortalMetadata, QortalSearchParams, @@ -341,14 +341,15 @@ export const useResources = (retryAttempts: number = 2) => { - return { + return useMemo(() => ({ fetchResources, addNewResources, updateNewResources, deleteResource, deleteList, fetchResourcesResultsOnly - }; + }), [fetchResources, addNewResources, updateNewResources, deleteResource, deleteList, fetchResourcesResultsOnly]); + }; export const generateCacheKey = (params: QortalSearchParams): string => { diff --git a/src/state/publishes.ts b/src/state/publishes.ts index 79679cc..b431814 100644 --- a/src/state/publishes.ts +++ b/src/state/publishes.ts @@ -34,7 +34,7 @@ interface PublishState { resourceStatus: Record; setResourceStatus: (qortalGetMetadata: QortalGetMetadata, data: ResourceStatus | null) => void; getPublish: (qortalGetMetadata: QortalGetMetadata | null, ignoreExpire?: boolean) => Resource | null; - getResourceStatus: (resourceId: string) => ResourceStatus | null; + getResourceStatus: (resourceId: string | null) => ResourceStatus | null; setPublish: (qortalGetMetadata: QortalGetMetadata, data: Resource | null, customExpiry?: number) => void; clearExpiredPublishes: () => void; publishExpiryDuration: number; // Default expiry duration @@ -91,6 +91,7 @@ export const usePublishStore = create((set, get) => ({ })); }, getResourceStatus: (resourceId) => { + if(!resourceId) return null; const status = get().resourceStatus[resourceId]; return status || null; },