diff --git a/packages/react/src/context/actor/index.tsx b/packages/react/src/context/actor/index.tsx index 6759d644fa..23b2564b85 100644 --- a/packages/react/src/context/actor/index.tsx +++ b/packages/react/src/context/actor/index.tsx @@ -89,20 +89,9 @@ export const createReActorContext: CreateReActorContext = < args: ActorUseMethodCallArg ) => useActor().useMethodCall(args) - const useServiceFields = () => useActor().useServiceFields() - - const useMethodFields = () => useActor().useMethodFields() - const useMethodField = (functionName: keyof Actor & string) => useActor().useMethodField(functionName) - const useServiceDetails = () => useActor().useServiceDetails() - - const useMethodDetails = () => useActor().useMethodDetails() - - const useMethodDetail = (functionName: keyof Actor & string) => - useActor().useMethodDetail(functionName) - return { ActorContext, ActorProvider, @@ -111,12 +100,7 @@ export const createReActorContext: CreateReActorContext = < useQueryCall, useUpdateCall, useMethodCall, - useServiceFields, - useMethodFields, useMethodField, - useServiceDetails, - useMethodDetails, - useMethodDetail, } as any } @@ -128,10 +112,5 @@ export const { useQueryCall, useUpdateCall, useMethodCall, - useServiceFields, - useMethodFields, useMethodField, - useServiceDetails, - useMethodDetails, - useMethodDetail, } = createReActorContext() diff --git a/packages/react/src/context/actor/types.ts b/packages/react/src/context/actor/types.ts index c5552f3a9e..b56b1d75f2 100644 --- a/packages/react/src/context/actor/types.ts +++ b/packages/react/src/context/actor/types.ts @@ -1,4 +1,3 @@ -import React, { PropsWithChildren } from "react" import { IDL } from "@dfinity/candid" import { ActorSubclass, @@ -10,55 +9,25 @@ import { ActorHooks } from "../../types" export type ActorContextType< Actor = ActorSubclass, - F extends boolean = true, - D extends boolean = true -> = ActorHooks & { - ActorContext: React.Context | null> - useActor: = Actor>() => ActorContextType< - A, - F, - D - > - ActorProvider: React.FC< - ActorProviderProps & { - withServiceFields?: F - withServiceDetails?: D - } - > + F extends boolean = true +> = ActorHooks & { + ActorContext: React.Context | null> + useActor: = Actor>() => ActorContextType + ActorProvider: React.FC } export type CreateReActorContext = { - // When both withServiceFields and withServiceDetails are true - = DefaultActorType>( - options?: Partial & { - withServiceFields: true - withServiceDetails: true - } - ): ActorContextType - - // When withServiceFields is true and withServiceDetails is false or undefined - = DefaultActorType>( - options?: Partial & { - withServiceFields: true - withServiceDetails?: false | undefined - } - ): ActorContextType - - // When withServiceFields is false or undefined and withServiceDetails is true = DefaultActorType>( options?: Partial & { - withServiceFields?: false | undefined - withServiceDetails: true + withVisitor: true } - ): ActorContextType + ): ActorContextType - // When both withServiceFields and withServiceDetails are false or undefined = DefaultActorType>( options?: Partial & { - withServiceFields?: false | undefined - withServiceDetails?: false | undefined + withVisitor?: false | undefined } - ): ActorContextType + ): ActorContextType } export interface CreateActorOptions @@ -73,8 +42,7 @@ export interface CreateActorOptions loadingComponent?: React.ReactNode } -export interface ActorProviderProps - extends PropsWithChildren, - CreateActorOptions { +export interface ActorProviderProps extends CreateActorOptions { + children?: React.ReactNode | undefined loadingComponent?: React.ReactNode } diff --git a/packages/react/src/hooks/actor.ts b/packages/react/src/hooks/actor.ts index 1643ab1b86..e72aa724b2 100644 --- a/packages/react/src/hooks/actor.ts +++ b/packages/react/src/hooks/actor.ts @@ -1,30 +1,17 @@ -import { - type ExtractedServiceFields, - type MethodFields, - type ExtractedServiceDetails, - type ServiceDetails, - type MethodDetails, - ExtractRandomArgs, - ExtractRandomReturns, -} from "@ic-reactor/candid" import { useCallback, useEffect, useMemo, useRef, useState } from "react" import { ActorHookState, type ActorCall, - type ActorHooks, - type ActorUseMethodCallArg, - type ActorUseMethodCallReturn, type UseActorStoreReturn, ActorQueryCall, ActorUpdateCall, + ActorHooks, + ActorUseMethodCallReturn, + ActorUseMethodCallArg, } from "../types" import { useStore } from "zustand" -import { ActorCandidManager } from "@ic-reactor/candid" -import { - ExtractActorMethodArgs, - FunctionName, - FunctionType, -} from "@ic-reactor/store" +import { ActorManager, ExtractedService, FunctionType } from "@ic-reactor/store" +import { ExtractActorMethodArgs, FunctionName } from "@ic-reactor/store" const DEFAULT_STATE = { data: undefined, @@ -34,76 +21,29 @@ const DEFAULT_STATE = { export const getActorHooks = ({ initialize, - serviceFields, - serviceDetails, - withServiceFields, - withServiceDetails, + visitFunction, canisterId, actorStore, callMethod, - transformResult, -}: ActorCandidManager): ActorHooks< - A, - typeof withServiceFields, - typeof withServiceDetails -> => { - type F = typeof withServiceFields - type D = typeof withServiceDetails - +}: ActorManager): ActorHooks => { const useActorStore = (): UseActorStoreReturn => { const actorState = useStore(actorStore, (state) => state) return { ...actorState, canisterId } as UseActorStoreReturn } - const useServiceFields = (): ExtractedServiceFields => { - if (!withServiceFields || !serviceFields) { - throw new Error( - "Service fields not initialized. Pass `withServiceFields` to initialize service fields." - ) - } - - return serviceFields - } - - const useMethodFields = (): MethodFields[] => { - const serviceFields = useServiceFields() - - return useMemo(() => { - return Object.values(serviceFields.methodFields) - }, [serviceFields]) + const useVisitFunction = (): ExtractedService => { + return visitFunction } - const useMethodField = (functionName: FunctionName): MethodFields => { - const serviceMethod = useServiceFields() + const useMethodField = >( + functionName: M + ): ExtractedService[M] => { + const serviceFields = useVisitFunction() return useMemo(() => { - return serviceMethod.methodFields[functionName] - }, [functionName, serviceMethod]) - } - - const useServiceDetails = (): ExtractedServiceDetails => { - if (!withServiceDetails || !serviceDetails) { - throw new Error( - "Service details not initialized. Pass `withServiceDetails` to initialize service fields." - ) - } - - return serviceDetails - } - - const useMethodDetails = (): ServiceDetails => { - const serviceFields = useServiceDetails() - - return serviceFields.methodDetails - } - - const useMethodDetail = (functionName: FunctionName): MethodDetails => { - const serviceMethod = useServiceDetails() - - return useMemo(() => { - return serviceMethod.methodDetails[functionName] - }, [functionName, serviceMethod]) + return serviceFields[functionName] + }, [functionName, serviceFields]) } const useReActorCall: ActorCall = ({ @@ -112,7 +52,6 @@ export const getActorHooks = ({ onLoading, args = [] as unknown as ExtractActorMethodArgs, functionName, - withTransform, throwOnError = false, }) => { type M = typeof functionName @@ -141,17 +80,10 @@ export const getActorHooks = ({ : undefined : undefined - const result = await callMethod( - functionName, - ...(replaceArgs ?? args) - ) - - const data = withTransform - ? transformResult(functionName, result) - : result + const data = await callMethod(functionName, ...(replaceArgs ?? args)) onLoading?.(false) - onSuccess?.(result) + onSuccess?.(data) setState((prevState) => ({ ...prevState, data, loading: false })) return data @@ -210,68 +142,57 @@ export const getActorHooks = ({ const useMethodCall = , T extends FunctionType>( args: ActorUseMethodCallArg - ): ActorUseMethodCallReturn => { - const { functionName } = args - - const field = useMemo( - () => serviceFields?.methodFields[functionName], - [functionName] - ) as MethodFields - - const detail = useMemo( - () => serviceDetails?.methodDetails[functionName], - [functionName] - ) as MethodDetails - - const generateArgs = useCallback(() => { - const randomClass = new ExtractRandomArgs() - return randomClass.generate(field.argTypes, functionName) - }, [field, functionName]) - - const generateReturns = useCallback(() => { - const randomClass = new ExtractRandomReturns() - const data = randomClass.generate(field.returnTypes) - console.log("generateReturns", data, field.returnTypes) - return transformResult(functionName, data.length > 1 ? data : data[0]) - }, [field, functionName]) - - const type = field.functionType ?? detail.functionType - - switch (type) { - case "query": - return { - field, - detail, - generateArgs, - generateReturns, - ...useQueryCall(args as any), - } - case "update": - return { - field, - detail, - generateArgs, - generateReturns, - ...useUpdateCall(args as any), - } - default: - throw new Error(`Invalid type: ${type}`) - } + ): ActorUseMethodCallReturn => { + // const { functionName } = args + // const field = useMemo( + // () => serviceFields?.methodFields[functionName], + // [functionName] + // ) as MethodFields + // const detail = useMemo( + // () => serviceDetails?.methodDetails[functionName], + // [functionName] + // ) as MethodDetails + // const generateArgs = useCallback(() => { + // const randomClass = new ExtractRandomArgs() + // return randomClass.generate(field.argTypes, functionName) + // }, [field, functionName]) + // const generateReturns = useCallback(() => { + // const randomClass = new ExtractRandomReturns() + // const data = randomClass.generate(field.returnTypes) + // console.log("generateReturns", data, field.returnTypes) + // return transformResult(functionName, data.length > 1 ? data : data[0]) + // }, [field, functionName]) + // const type = field.functionType ?? detail.functionType + // switch (type) { + // case "query": + // return { + // field, + // detail, + // generateArgs, + // generateReturns, + // ...useQueryCall(args as any), + // } + // case "update": + // return { + // field, + // detail, + // generateArgs, + // generateReturns, + // ...useUpdateCall(args as any), + // } + // default: + // throw new Error(`Invalid type: ${type}`) + // } + + return { args } as any } return { initialize, useQueryCall, useUpdateCall, - useMethodCall, - useActorStore, - // __Details - useServiceDetails, - useMethodDetails, - useMethodDetail, - // __Fields - useServiceFields, - useMethodFields, useMethodField, + useActorStore, + useMethodCall, } } diff --git a/packages/react/src/hooks/useActorManger.ts b/packages/react/src/hooks/useActorManger.ts index c2c34c9c31..9b7f8769ff 100644 --- a/packages/react/src/hooks/useActorManger.ts +++ b/packages/react/src/hooks/useActorManger.ts @@ -3,11 +3,11 @@ import { ActorSubclass, DefaultActorType, IDL, + createReActorStore, } from "@ic-reactor/store" import { useMemo } from "react" import { AgentContextType, useAgentManager } from "../context/agent" import useDidJs from "./useDidJs" -import { createReActorCandidStore } from "@ic-reactor/candid" interface ActorManagerArgs extends Omit< @@ -48,7 +48,7 @@ export const useActorManager = < if (!idlFactory) { return null } else { - const manager = createReActorCandidStore({ + const manager = createReActorStore({ agentManager, idlFactory, canisterId, diff --git a/packages/react/src/index.ts b/packages/react/src/index.ts index 2870931098..546b953d19 100644 --- a/packages/react/src/index.ts +++ b/packages/react/src/index.ts @@ -53,5 +53,5 @@ export const createReActor: CreateReActor = < getVisitFunction, ...actorHooks, ...authHooks, - } + } as any } diff --git a/packages/react/src/types.ts b/packages/react/src/types.ts index 09c3a9ef85..5315220b79 100644 --- a/packages/react/src/types.ts +++ b/packages/react/src/types.ts @@ -1,11 +1,4 @@ -import type { - MethodFields, - ExtractedServiceFields, - ExtractedServiceDetails, - ServiceDetails, - MethodDetails, - MethodResult, -} from "@ic-reactor/visitor" +import type { MethodFields, MethodResult } from "@ic-reactor/visitor" import type { ActorState, CanisterId, @@ -135,11 +128,9 @@ export type ActorUpdateCall = { export interface ActorUseMethodCallReturn< A, M extends FunctionName, - F extends boolean = false, - D extends boolean = false + F extends boolean = false > { field: F extends true ? MethodFields : undefined - detail: D extends true ? MethodDetails : undefined reset: () => void generateArgs: () => ExtractActorMethodArgs generateReturns: () => MethodResult[] @@ -160,36 +151,27 @@ export type ActorUseMethodCallArg< ? ActorUseQueryArgs> : ActorUseUpdateArgs>) & { withTransform?: boolean } -export type ActorHooks< - A, - F extends boolean = false, - D extends boolean = false -> = ActorDefaultHooks & - (F extends true ? ActorFieldHooks : {}) & - (D extends true ? ActorDetailHooks : {}) +export type ActorHooks = ActorDefaultHooks & + (F extends true ? ActorFieldHooks : {}) export interface ActorFieldHooks { - useServiceFields: () => ExtractedServiceFields - useMethodFields: () => MethodFields[] - useMethodField: (functionName: FunctionName) => MethodFields -} - -export interface ActorDetailHooks { - useServiceDetails: () => ExtractedServiceDetails - useMethodDetails: () => ServiceDetails - useMethodDetail: (functionName: FunctionName) => MethodDetails + // useServiceFields: () => ExtractedServiceFields + // useMethodFields: () => MethodFields[] + useMethodField: >( + functionName: M + ) => ExtractedService[M] } export type UseActorStoreReturn = ActorState & { canisterId: CanisterId } -export interface ActorDefaultHooks { +export interface ActorDefaultHooks { initialize: () => Promise useActorStore: () => UseActorStoreReturn useQueryCall: ActorQueryCall useUpdateCall: ActorUpdateCall useMethodCall: , T extends FunctionType>( args: ActorUseMethodCallArg - ) => ActorUseMethodCallReturn + ) => ActorUseMethodCallReturn } export type GetFunctions = { @@ -203,12 +185,12 @@ export type CreateReActor = { options: CreateReActorOptions & { withVisitor: true } - ): GetFunctions & ActorHooks & AuthHooks + ): GetFunctions & ActorHooks & AuthHooks // When withVisitor are false or undefined ( options: CreateReActorOptions & { withVisitor?: false | undefined } - ): GetFunctions & ActorHooks & AuthHooks + ): GetFunctions & ActorHooks & AuthHooks }