UNPKG

@roochnetwork/rooch-sdk-kit

Version:
502 lines (484 loc) 15.2 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/provider/roochProvider.tsx var roochProvider_exports = {}; __export(roochProvider_exports, { RoochContext: () => RoochContext, RoochProvider: () => RoochProvider }); module.exports = __toCommonJS(roochProvider_exports); var import_react5 = require("react"); // src/provider/clientProvider.tsx var import_react4 = require("react"); var import_rooch_sdk3 = require("@roochnetwork/rooch-sdk"); // src/provider/useDefaultClient.ts var import_react3 = require("react"); var import_rooch_sdk2 = require("@roochnetwork/rooch-sdk"); // src/hooks/useSessionsStore.ts var import_react2 = require("react"); var import_zustand = require("zustand"); // src/provider/globalProvider.tsx var import_react = require("react"); var import_jsx_runtime = require("react/jsx-runtime"); var RequestEventManager = class { constructor() { this.callbacks = []; } subscribe(callback) { this.callbacks.push(callback); return () => { this.callbacks = this.callbacks.filter((cb) => cb !== callback); }; } trigger(status) { this.callbacks.forEach((callback) => callback(status)); } }; var ErrorEventManager = class { constructor() { this.callbacks = []; } subscribe(callback) { this.callbacks.push(callback); return () => { this.callbacks = this.callbacks.filter((cb) => cb !== callback); }; } trigger(error) { this.callbacks.forEach((callback) => callback(error)); } }; var GlobalContext = (0, import_react.createContext)(null); var GlobalProvider = ({ children }) => { const errorEventManager = new ErrorEventManager(); const requestEventManager = new RequestEventManager(); const triggerError = (error) => { errorEventManager.trigger(error); }; const subscribeOnError = (callback) => { return errorEventManager.subscribe(callback); }; const triggerRequest = (status) => { requestEventManager.trigger(status); }; const subscribeOnRequest = (callback) => { return requestEventManager.subscribe(callback); }; return /* @__PURE__ */ (0, import_jsx_runtime.jsx)( GlobalContext.Provider, { value: { triggerError, subscribeOnError, triggerRequest, subscribeOnRequest }, children } ); }; var useTriggerError = () => { const ctx = (0, import_react.useContext)(GlobalContext); if (!ctx) { throw new Error("useTriggerError must be used within a GlobalProvider"); } return ctx.triggerError; }; var useTriggerRequest = () => { const ctx = (0, import_react.useContext)(GlobalContext); if (!ctx) { throw new Error("useTriggerError must be used within a GlobalProvider"); } return ctx.triggerRequest; }; // src/utils/stateStorage.ts function createInMemoryStore() { const store = /* @__PURE__ */ new Map(); return { getItem(key) { return store.get(key); }, setItem(key, value) { store.set(key, value); }, removeItem(key) { store.delete(key); } }; } function getDefaultStorage(type) { let storage; switch (type) { case 0 /* Session */: storage = typeof window !== "undefined" && window.sessionStorage ? sessionStorage : void 0; break; case 1 /* Local */: storage = typeof window !== "undefined" && window.localStorage ? localStorage : void 0; } if (!storage) { storage = createInMemoryStore(); } return storage; } // src/hooks/useSessionsStore.ts function useSessionStore(selector) { const store = (0, import_react2.useContext)(RoochContext); if (!store) { throw new Error( "Could not find RoochSessionContext. Ensure that you have set up the RoochClientProvider." ); } return (0, import_zustand.useStore)(store, selector); } // src/http/httpTransport.ts var import_rooch_sdk = require("@roochnetwork/rooch-sdk"); var HTTPTransport = class extends import_rooch_sdk.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 ((0, import_rooch_sdk2.isRoochClient)(config)) { return config; } config.transport = new HTTPTransport( { url: config.url.toString() }, requestErrorCallback ); return new import_rooch_sdk2.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 = (0, import_react3.useCallback)( (state, error) => { try { if (state === "error") { if (error.code === import_rooch_sdk2.ErrorValidateInvalidAccountAuthKey || error.code === import_rooch_sdk2.ErrorValidateSessionIsExpired) { if (currentSession) { removeSession(currentSession); } } triggerError(error); } triggerRequest(state); } catch (e) { console.error(e); } }, [triggerError, currentSession, removeSession, triggerRequest] ); return (0, import_react3.useMemo)(() => { return DEFAULT_CREATE_CLIENT(currentNetwork, networks[currentNetwork], _requestErrorCallback); }, [currentNetwork, networks, _requestErrorCallback]); } // src/provider/clientProvider.tsx var import_jsx_runtime2 = require("react/jsx-runtime"); var ClientContext = (0, import_react4.createContext)(null); var DEFAULT_NETWORKS = { localnet: { url: (0, import_rooch_sdk3.getRoochNodeUrl)("localnet") } }; function RoochClientProvider(props) { const { onNetworkChange, network, children } = props; const networks = props.networks ?? DEFAULT_NETWORKS; const [selectedNetwork, setSelectedNetwork] = (0, import_react4.useState)( props.network ?? props.defaultNetwork ?? Object.keys(networks)[0] ); const currentNetwork = props.network ?? selectedNetwork; const client = useDefaultClient({ currentNetwork, networks }); const ctx = (0, import_react4.useMemo)(() => { return { client, network: currentNetwork, networks, config: networks[currentNetwork] instanceof import_rooch_sdk3.RoochClient ? 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__ */ (0, import_jsx_runtime2.jsx)(ClientContext.Provider, { value: ctx, children }); } // src/provider/sessionStore.ts var import_zustand2 = require("zustand"); var import_middleware = require("zustand/middleware"); var import_rooch_sdk4 = require("@roochnetwork/rooch-sdk"); function createSessionStore({ storage, storageKey, sessionConf }) { return (0, import_zustand2.createStore)()( (0, import_middleware.persist)( (set, get) => ({ sessions: [], currentSession: null, sessionConf, addSession(session) { const cache = get().sessions; cache.push(session); set(() => ({ sessions: cache })); }, setCurrentSession(session) { if (!session) { set(() => ({ currentSession: null })); } else { const cache = get().sessions; if (!cache.find((item) => item.getAuthKey() === session.getAuthKey())) { cache.push(session); } set(() => ({ currentSession: session, sessions: cache })); } }, removeSession(session) { const cacheSessions = get().sessions; const cacheCurSession = get().currentSession; set(() => ({ currentSession: cacheCurSession?.getAuthKey() === session.getAuthKey() ? null : cacheCurSession, sessions: cacheSessions.filter((c) => c.getAuthKey() !== session.getAuthKey()) })); } }), { name: storageKey, storage: (0, import_middleware.createJSONStorage)(() => storage, { reviver: (key, value) => { if (key === "sessions") { return value.map((session) => import_rooch_sdk4.Session.fromJson(session)); } return value; } }), partialize: ({ sessions }) => ({ sessions }) } ) ); } // src/components/styling/InjectedThemeStyles.tsx var import_dynamic = require("@vanilla-extract/dynamic"); // src/constants/styleDataAttribute.ts var styleDataAttributeName = "data-sdk-kit"; var styleDataAttributeSelector = `[${styleDataAttributeName}]`; var styleDataAttribute = { [styleDataAttributeName]: "" }; // src/themes/themeContract.ts var import_css = require("@vanilla-extract/css"); var themeContractValues = { blurs: { modalOverlay: "" }, backgroundColors: { primaryButton: "", primaryButtonHover: "", outlineButtonHover: "", walletItemHover: "", walletItemSelected: "", modalOverlay: "", modalPrimary: "", modalSecondary: "", iconButton: "", iconButtonHover: "", dropdownMenu: "", dropdownMenuSeparator: "" }, borderColors: { outlineButton: "" }, colors: { primaryButton: "", outlineButton: "", body: "", bodyMuted: "", bodyDanger: "", bodyWarning: "", iconButton: "" }, radii: { small: "", medium: "", large: "", xlarge: "" }, shadows: { primaryButton: "", walletItemSelected: "" }, fontWeights: { normal: "", medium: "", bold: "" }, fontSizes: { small: "", medium: "", large: "", xlarge: "" }, typography: { fontFamily: "", fontStyle: "", lineHeight: "", letterSpacing: "" } }; var themeVars = (0, import_css.createGlobalThemeContract)( themeContractValues, (_, path) => `dapp-kit-${path.join("-")}` ); // src/components/styling/InjectedThemeStyles.tsx var import_jsx_runtime3 = require("react/jsx-runtime"); function InjectedThemeStyles({ theme }) { const themeStyles = Array.isArray(theme) ? getDynamicThemeStyles(theme) : getStaticThemeStyles(theme); return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)( "style", { precedence: "default", href: "rooch-sdk-kit-theme", dangerouslySetInnerHTML: { __html: themeStyles } } ); } function getDynamicThemeStyles(themes) { return themes.map(({ mediaQuery, selector, variables }) => { const themeStyles = getStaticThemeStyles(variables); const themeStylesWithSelectorPrefix = selector ? `${selector} ${themeStyles}` : themeStyles; return mediaQuery ? `@media ${mediaQuery}{${themeStylesWithSelectorPrefix}}` : themeStylesWithSelectorPrefix; }).join(" "); } function getStaticThemeStyles(theme) { return `${styleDataAttributeSelector} {${cssStringFromTheme(theme)}}`; } function cssStringFromTheme(theme) { return Object.entries((0, import_dynamic.assignInlineVars)(themeVars, theme)).map(([key, value]) => `${key}:${value};`).join(""); } // src/themes/lightTheme.ts var lightTheme = { blurs: { modalOverlay: "blur(0)" }, backgroundColors: { primaryButton: "#F6F7F9", primaryButtonHover: "#F0F2F5", outlineButtonHover: "#F4F4F5", modalOverlay: "rgba(24 36 53 / 20%)", modalPrimary: "white", modalSecondary: "#F7F8F8", iconButton: "transparent", iconButtonHover: "#F0F1F2", dropdownMenu: "#FFFFFF", dropdownMenuSeparator: "#F3F6F8", walletItemSelected: "white", walletItemHover: "#3C424226" }, borderColors: { outlineButton: "#E4E4E7" }, colors: { primaryButton: "#373737", outlineButton: "#373737", iconButton: "#000000", body: "#182435", bodyMuted: "#767A81", bodyDanger: "#FF794B", bodyWarning: "#FF4C4C" }, radii: { small: "6px", medium: "8px", large: "12px", xlarge: "16px" }, shadows: { primaryButton: "0px 4px 12px rgba(0, 0, 0, 0.1)", walletItemSelected: "0px 2px 6px rgba(0, 0, 0, 0.05)" }, fontWeights: { normal: "400", medium: "500", bold: "600" }, fontSizes: { small: "14px", medium: "16px", large: "18px", xlarge: "20px" }, typography: { fontFamily: 'ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"', fontStyle: "normal", lineHeight: "1.3", letterSpacing: "1" } }; // src/provider/roochProvider.tsx var import_jsx_runtime4 = require("react/jsx-runtime"); var DEFAULT_SESSION_STORAGE_KEY = function(_) { return "rooch-sdk-kit:rooch-session-info"; }; var RoochContext = (0, import_react5.createContext)(null); function RoochProvider(props) { const { children, networks, defaultNetwork, theme, sessionConf } = props; const storeRef = (0, import_react5.useRef)( createSessionStore({ storage: getDefaultStorage(1 /* Local */), storageKey: DEFAULT_SESSION_STORAGE_KEY(), sessionConf }) ); return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(RoochContext.Provider, { value: storeRef.current, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(GlobalProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(RoochClientProvider, { networks, defaultNetwork, children: [ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(InjectedThemeStyles, { theme: theme ?? lightTheme }), children ] }) }) }); } //# sourceMappingURL=roochProvider.js.map