UNPKG

@roochnetwork/rooch-sdk-kit

Version:
170 lines (160 loc) 5.15 kB
// src/provider/clientProvider.tsx import { createContext as createContext3, useMemo as useMemo2, useState } from "react"; import { getRoochNodeUrl, RoochClient as RoochClient2 } from "@roochnetwork/rooch-sdk"; // src/provider/useDefaultClient.ts import { useCallback, useMemo } from "react"; import { ErrorValidateInvalidAccountAuthKey, ErrorValidateSessionIsExpired, isRoochClient, RoochClient } from "@roochnetwork/rooch-sdk"; // src/hooks/useSessionsStore.ts import { useContext as useContext2 } from "react"; import { useStore } from "zustand"; // src/provider/roochProvider.tsx import { createContext as createContext2, useRef } from "react"; // src/provider/globalProvider.tsx import { createContext, useContext } from "react"; import { jsx } from "react/jsx-runtime"; var GlobalContext = createContext(null); var useTriggerError = () => { const ctx = useContext(GlobalContext); if (!ctx) { throw new Error("useTriggerError must be used within a GlobalProvider"); } return ctx.triggerError; }; var useTriggerRequest = () => { const ctx = useContext(GlobalContext); if (!ctx) { throw new Error("useTriggerError must be used within a GlobalProvider"); } return ctx.triggerRequest; }; // src/provider/roochProvider.tsx import { jsx as jsx2, jsxs } from "react/jsx-runtime"; var RoochContext = createContext2(null); // src/hooks/useSessionsStore.ts function useSessionStore(selector) { const store = useContext2(RoochContext); if (!store) { throw new Error( "Could not find RoochSessionContext. Ensure that you have set up the RoochClientProvider." ); } return useStore(store, selector); } // src/http/httpTransport.ts import { RoochHTTPTransport } from "@roochnetwork/rooch-sdk"; var HTTPTransport = class extends RoochHTTPTransport { constructor(options, requestErrorCallback) { super(options); this.requestCallback = requestErrorCallback; } async request(input) { let result; try { if (input.method === "rooch_executeRawTransaction") { this.requestCallback("requesting"); } result = await super.request(input); if (input.method === "rooch_executeRawTransaction") { this.requestCallback("success"); } return result; } catch (e) { if ("code" in e) { this.requestCallback("error", { code: e.code, message: e.message }); } throw e; } } }; // src/provider/useDefaultClient.ts var DEFAULT_CREATE_CLIENT = (_name, config, requestErrorCallback) => { if (isRoochClient(config)) { return config; } config.transport = new HTTPTransport( { url: config.url.toString() }, requestErrorCallback ); return new RoochClient(config); }; function useDefaultClient(params) { const { currentNetwork, networks } = params; const currentSession = useSessionStore((state) => state.currentSession); const removeSession = useSessionStore((state) => state.removeSession); const triggerError = useTriggerError(); const triggerRequest = useTriggerRequest(); const _requestErrorCallback = useCallback( (state, error) => { try { if (state === "error") { if (error.code === ErrorValidateInvalidAccountAuthKey || error.code === ErrorValidateSessionIsExpired) { if (currentSession) { removeSession(currentSession); } } triggerError(error); } triggerRequest(state); } catch (e) { console.error(e); } }, [triggerError, currentSession, removeSession, triggerRequest] ); return useMemo(() => { return DEFAULT_CREATE_CLIENT(currentNetwork, networks[currentNetwork], _requestErrorCallback); }, [currentNetwork, networks, _requestErrorCallback]); } // src/provider/clientProvider.tsx import { jsx as jsx3 } from "react/jsx-runtime"; var ClientContext = createContext3(null); var DEFAULT_NETWORKS = { localnet: { url: getRoochNodeUrl("localnet") } }; function RoochClientProvider(props) { const { onNetworkChange, network, children } = props; const networks = props.networks ?? DEFAULT_NETWORKS; const [selectedNetwork, setSelectedNetwork] = useState( props.network ?? props.defaultNetwork ?? Object.keys(networks)[0] ); const currentNetwork = props.network ?? selectedNetwork; const client = useDefaultClient({ currentNetwork, networks }); const ctx = useMemo2(() => { return { client, network: currentNetwork, networks, config: networks[currentNetwork] instanceof RoochClient2 ? null : networks[currentNetwork], selectNetwork: (newNetwork) => { if (currentNetwork === newNetwork) { return; } if (!network && newNetwork !== selectedNetwork) { setSelectedNetwork(newNetwork); } onNetworkChange?.(newNetwork); } }; }, [client, currentNetwork, networks, network, selectedNetwork, onNetworkChange]); return /* @__PURE__ */ jsx3(ClientContext.Provider, { value: ctx, children }); } export { ClientContext, RoochClientProvider }; //# sourceMappingURL=clientProvider.js.map