@ic-reactor/react 1.1.2 → 1.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -83,13 +83,17 @@ function createActorContext(config = {}) {
83
83
  const { canisterId: defaultCanisterId } = config, defaultConfig = __rest(config, ["canisterId"]);
84
84
  const ActorContext = react_1.default.createContext(null);
85
85
  const ActorProvider = (_a) => {
86
- var { children, canisterId = defaultCanisterId, loadingComponent = react_1.default.createElement("div", null, "Fetching canister...") } = _a, restConfig = __rest(_a, ["children", "canisterId", "loadingComponent"]);
86
+ var { children, canisterId = defaultCanisterId, loadingComponent = react_1.default.createElement("div", null, "Fetching canister..."), authenticatingComponent = react_1.default.createElement("div", null, "Authenticating...") } = _a, restConfig = __rest(_a, ["children", "canisterId", "loadingComponent", "authenticatingComponent"]);
87
87
  if (!canisterId) {
88
88
  throw new Error("canisterId is required");
89
89
  }
90
90
  const config = react_1.default.useMemo(() => (Object.assign(Object.assign({}, defaultConfig), restConfig)), [defaultConfig, restConfig]);
91
- const { fetchError, fetching, hooks } = (0, useActor_1.useActor)(Object.assign({ canisterId }, config));
92
- return (react_1.default.createElement(ActorContext.Provider, { value: hooks }, fetching || hooks === null ? fetchError !== null && fetchError !== void 0 ? fetchError : loadingComponent : children));
91
+ const { fetchError, authenticating, hooks } = (0, useActor_1.useActor)(Object.assign({ canisterId, fetchOnMount: false }, config));
92
+ return (react_1.default.createElement(ActorContext.Provider, { value: hooks }, hooks === null
93
+ ? (fetchError !== null && fetchError !== void 0 ? fetchError : authenticating)
94
+ ? authenticatingComponent
95
+ : loadingComponent
96
+ : children));
93
97
  };
94
98
  ActorProvider.displayName = "ActorProvider";
95
99
  return Object.assign({ ActorProvider }, (0, extractActorContext_1.extractActorContext)(ActorContext));
@@ -93,11 +93,15 @@ const extractAgentContext_1 = require("../helpers/extractAgentContext");
93
93
  * with the Internet Computer blockchain.
94
94
  */
95
95
  const createAgentContext = (config = {}) => {
96
+ const { disableAuthenticateOnMount: defaultDisable } = config, contextOptions = __rest(config, ["disableAuthenticateOnMount"]);
96
97
  const AgentContext = react_1.default.createContext(null);
97
98
  const AgentProvider = (_a) => {
98
- var { children, agentManager: mybeAgentManager } = _a, options = __rest(_a, ["children", "agentManager"]);
99
+ var { children, agentManager: mybeAgentManager, disableAuthenticateOnMount = defaultDisable !== null && defaultDisable !== void 0 ? defaultDisable : false } = _a, options = __rest(_a, ["children", "agentManager", "disableAuthenticateOnMount"]);
99
100
  const hooks = react_1.default.useMemo(() => {
100
- const agentManager = mybeAgentManager !== null && mybeAgentManager !== void 0 ? mybeAgentManager : (0, core_1.createAgentManager)(Object.assign(Object.assign({}, options), config));
101
+ const agentManager = mybeAgentManager !== null && mybeAgentManager !== void 0 ? mybeAgentManager : (0, core_1.createAgentManager)(Object.assign(Object.assign({}, options), contextOptions));
102
+ if (!disableAuthenticateOnMount) {
103
+ agentManager.authenticate();
104
+ }
101
105
  return Object.assign(Object.assign(Object.assign({}, (0, agentHooks_1.agentHooks)(agentManager)), (0, authHooks_1.authHooks)(agentManager)), { agentManager });
102
106
  }, [options]);
103
107
  return (react_1.default.createElement(AgentContext.Provider, { value: hooks }, children));
@@ -4,12 +4,13 @@ export interface AgentContext extends AgentHooksReturnType, AuthHooksReturnType
4
4
  agentManager: AgentManager;
5
5
  }
6
6
  export interface CreateAgentCotextParameters extends AgentManagerParameters {
7
+ disableAuthenticateOnMount?: boolean;
7
8
  }
8
9
  export interface CreateAgentContextReturnType extends AgentHooksReturnType, AuthHooksReturnType {
9
10
  useAgentManager: (agentContext?: React.Context<AgentContext | null>) => AgentManager;
10
11
  AgentProvider: React.FC<AgentProviderProps>;
11
12
  }
12
- export interface AgentProviderProps extends PropsWithChildren, AgentManagerParameters {
13
+ export interface AgentProviderProps extends PropsWithChildren, CreateAgentCotextParameters {
13
14
  agentManager?: AgentManager;
14
15
  }
15
16
  export interface CreateActorContextReturnType<A = BaseActor> extends ActorHooksReturnType<A> {
@@ -18,6 +19,7 @@ export interface CreateActorContextReturnType<A = BaseActor> extends ActorHooksR
18
19
  export interface ActorProviderProps extends CreateActorContextParameters {
19
20
  children?: React.ReactNode | undefined;
20
21
  loadingComponent?: React.ReactNode;
22
+ authenticatingComponent?: React.ReactNode;
21
23
  }
22
24
  export interface CreateActorContextParameters extends Omit<ActorManagerParameters, "idlFactory" | "agentManager" | "canisterId"> {
23
25
  didjsId?: string;
@@ -49,6 +49,9 @@ const DEFAULT_STATE = {
49
49
  const actorHooks = (actorManager) => {
50
50
  const { actorStore, canisterId, visitFunction, callMethod, initialize } = actorManager;
51
51
  const useActorState = () => (Object.assign(Object.assign({}, (0, zustand_1.useStore)(actorStore)), { canisterId }));
52
+ const useVisitService = () => {
53
+ return visitFunction;
54
+ };
52
55
  const useVisitMethod = (functionName) => {
53
56
  return react_1.default.useMemo(() => visitFunction[functionName], [functionName]);
54
57
  };
@@ -102,6 +105,7 @@ const actorHooks = (actorManager) => {
102
105
  useUpdateCall,
103
106
  useActorState,
104
107
  useVisitMethod,
108
+ useVisitService,
105
109
  };
106
110
  };
107
111
  exports.actorHooks = actorHooks;
@@ -43,11 +43,13 @@ function extractActorContext(actorContext) {
43
43
  const useQueryCall = (args) => useActorContext().useQueryCall(args);
44
44
  const useUpdateCall = (args) => useActorContext().useUpdateCall(args);
45
45
  const useVisitMethod = (functionName) => useActorContext().useVisitMethod(functionName);
46
+ const useVisitService = () => useActorContext().useVisitService();
46
47
  return {
47
48
  useActorState,
48
49
  useQueryCall,
49
50
  useUpdateCall,
50
51
  useVisitMethod,
52
+ useVisitService,
51
53
  initialize,
52
54
  };
53
55
  }
@@ -51,7 +51,7 @@ const extractAgentContext = (agentContext) => {
51
51
  useAgent,
52
52
  useAuthState,
53
53
  useAgentState,
54
- useAuth: useAuth,
54
+ useAuth,
55
55
  useAgentManager,
56
56
  useUserPrincipal,
57
57
  };
@@ -67,10 +67,12 @@ export type UseMethodCall<A> = <M extends FunctionName<A>>(args: UseMethodCallPa
67
67
  export type UseQueryCall<A> = <M extends FunctionName<A>>(args: UseQueryCallParameters<A, M>) => UseMethodCallReturnType<A, M>;
68
68
  export type UseUpdateCall<A> = <M extends FunctionName<A>>(args: UseUpdateCallParameters<A, M>) => UseMethodCallReturnType<A, M>;
69
69
  export type UseVisitMethod<A> = <M extends FunctionName<A>>(functionName: M) => VisitService<A>[M];
70
+ export type UseVisitService<A> = () => VisitService<A>;
70
71
  export interface ActorHooksReturnType<A = BaseActor> {
71
72
  initialize: () => Promise<void>;
72
73
  useActorState: () => UseActorState;
73
74
  useQueryCall: UseQueryCall<A>;
74
75
  useUpdateCall: UseUpdateCall<A>;
75
76
  useVisitMethod: UseVisitMethod<A>;
77
+ useVisitService: UseVisitService<A>;
76
78
  }
@@ -2,3 +2,4 @@ export * from "./useActorState";
2
2
  export * from "./useQueryCall";
3
3
  export * from "./useUpdateCall";
4
4
  export * from "./useVisitMethod";
5
+ export * from "./useVisitService";
@@ -18,3 +18,4 @@ __exportStar(require("./useActorState"), exports);
18
18
  __exportStar(require("./useQueryCall"), exports);
19
19
  __exportStar(require("./useUpdateCall"), exports);
20
20
  __exportStar(require("./useVisitMethod"), exports);
21
+ __exportStar(require("./useVisitService"), exports);
@@ -0,0 +1,8 @@
1
+ import { BaseActor } from "../../types";
2
+ /**
3
+ * Memoizes and returns a visit service function for a specific actor method.
4
+ *
5
+ * @param functionName The name of the actor method to visit.
6
+ * @returns The visit service function for the specified method.
7
+ */
8
+ export declare function useVisitService<A = BaseActor>(): import("@ic-reactor/core/dist/classes/actor/types").VisitService<A>;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useVisitService = void 0;
4
+ const hooks_1 = require("./hooks");
5
+ /**
6
+ * Memoizes and returns a visit service function for a specific actor method.
7
+ *
8
+ * @param functionName The name of the actor method to visit.
9
+ * @returns The visit service function for the specified method.
10
+ */
11
+ function useVisitService() {
12
+ return hooks_1.ActorHooks.useVisitService();
13
+ }
14
+ exports.useVisitService = useVisitService;
@@ -6,10 +6,12 @@ export interface UseActorParameters extends Omit<ActorManagerParameters, "idlFac
6
6
  canisterId: string;
7
7
  idlFactory?: IDL.InterfaceFactory;
8
8
  agentContext?: React.Context<AgentContext | null>;
9
+ fetchOnMount?: boolean;
9
10
  didjsCanisterId?: string;
10
11
  }
11
12
  export interface UseActorReturn<A = BaseActor> {
12
13
  hooks: ActorHooksReturnType<A> | null;
13
14
  fetching: boolean;
14
15
  fetchError: string | null;
16
+ authenticating: boolean;
15
17
  }
@@ -25,6 +25,7 @@ const core_1 = require("@ic-reactor/core");
25
25
  const react_1 = require("react");
26
26
  const useAgentManager_1 = require("./agent/useAgentManager");
27
27
  const helpers_1 = require("../helpers");
28
+ const agent_1 = require("./agent");
28
29
  /**
29
30
  * A comprehensive hook that manages both the fetching of Candid interfaces
30
31
  * and the initialization of actor stores for Internet Computer (IC) canisters.
@@ -88,7 +89,7 @@ const helpers_1 = require("../helpers");
88
89
  * ```
89
90
  */
90
91
  const useActor = (config) => {
91
- const { canisterId, idlFactory: maybeIdlFactory, agentContext, didjsCanisterId } = config, actorConfig = __rest(config, ["canisterId", "idlFactory", "agentContext", "didjsCanisterId"]);
92
+ const { canisterId, idlFactory: maybeIdlFactory, agentContext, fetchOnMount = true, didjsCanisterId } = config, actorConfig = __rest(config, ["canisterId", "idlFactory", "agentContext", "fetchOnMount", "didjsCanisterId"]);
92
93
  const [{ idlFactory, fetching, fetchError }, setState] = (0, react_1.useState)({
93
94
  idlFactory: maybeIdlFactory,
94
95
  fetching: false,
@@ -126,16 +127,29 @@ const useActor = (config) => {
126
127
  });
127
128
  }
128
129
  }), [canisterId, didjsCanisterId]);
129
- // Automatically fetch Candid if not already fetched or provided.
130
- (0, react_1.useEffect)(() => agentManager.subscribeAgent(fetchCandid, !maybeIdlFactory), [fetchCandid, agentManager]);
130
+ (0, react_1.useEffect)(() => {
131
+ if (maybeIdlFactory) {
132
+ setState(() => ({
133
+ idlFactory: maybeIdlFactory,
134
+ fetching: false,
135
+ fetchError: null,
136
+ }));
137
+ return;
138
+ }
139
+ const unsubscribe = agentManager.subscribeAgent(fetchCandid, fetchOnMount);
140
+ return unsubscribe;
141
+ }, [agentManager, fetchOnMount]);
142
+ const authenticating = (0, agent_1.useAuthState)().authenticating;
131
143
  const hooks = (0, react_1.useMemo)(() => {
132
144
  if (!idlFactory)
133
145
  return null;
146
+ if (authenticating)
147
+ return null;
134
148
  const actorManager = (0, core_1.createActorManager)(Object.assign({ agentManager,
135
149
  idlFactory,
136
150
  canisterId }, actorConfig));
137
151
  return (0, helpers_1.actorHooks)(actorManager);
138
- }, [canisterId, idlFactory]);
139
- return { hooks, fetching, fetchError };
152
+ }, [canisterId, authenticating, idlFactory]);
153
+ return { hooks, authenticating, fetching, fetchError };
140
154
  };
141
155
  exports.useActor = useActor;
package/dist/index.d.ts CHANGED
@@ -7,4 +7,4 @@ export * from "./hooks";
7
7
  export * as helpers from "./helpers";
8
8
  export * as types from "./types";
9
9
  export * as core from "./core";
10
- export * as utils from "@ic-reactor/core/dist/utils";
10
+ export * as utils from "./utils";
package/dist/index.js CHANGED
@@ -36,4 +36,4 @@ __exportStar(require("./hooks"), exports);
36
36
  exports.helpers = __importStar(require("./helpers"));
37
37
  exports.types = __importStar(require("./types"));
38
38
  exports.core = __importStar(require("./core"));
39
- exports.utils = __importStar(require("@ic-reactor/core/dist/utils"));
39
+ exports.utils = __importStar(require("./utils"));
@@ -0,0 +1 @@
1
+ export * from "@ic-reactor/core/dist/utils";
package/dist/utils.js ADDED
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("@ic-reactor/core/dist/utils"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ic-reactor/react",
3
- "version": "1.1.2",
3
+ "version": "1.1.4",
4
4
  "description": "A React library for interacting with Internet Computer canisters",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -26,7 +26,7 @@
26
26
  },
27
27
  "homepage": "https://b3pay.github.io/ic-reactor/modules/react.html",
28
28
  "scripts": {
29
- "test": "npx jest",
29
+ "test": "NODE_OPTIONS=\"$NODE_OPTIONS --experimental-vm-modules\" npx jest",
30
30
  "start": "tsc watch",
31
31
  "build": "npx tsc",
32
32
  "clean": "npx rimraf dist && npx rimraf umd"
@@ -47,5 +47,5 @@
47
47
  "react": ">=16.8",
48
48
  "zustand": "4.5"
49
49
  },
50
- "gitHead": "036b4b03b8cc9b1e40ece8f8b16d9ce084634192"
50
+ "gitHead": "0055703885730f86a837f2e2f3f6b6f49bb3cc68"
51
51
  }