@roochnetwork/rooch-sdk-kit
Version:
Rooch SDK Kit
170 lines (160 loc) • 5.15 kB
JavaScript
// 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