UNPKG

@roochnetwork/rooch-sdk-kit

Version:
1,018 lines (948 loc) 40.1 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; 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 __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/components/SessionKeyGuard.tsx var SessionKeyGuard_exports = {}; __export(SessionKeyGuard_exports, { SessionKeyGuard: () => SessionKeyGuard }); module.exports = __toCommonJS(SessionKeyGuard_exports); // src/components/connect-modal/ConnectModal.tsx var Dialog2 = __toESM(require("@radix-ui/react-dialog"), 1); var import_clsx6 = __toESM(require("clsx"), 1); var import_react16 = require("react"); // src/components/icons/BackIcon.tsx var import_jsx_runtime = require("react/jsx-runtime"); function BackIcon(props) { return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { width: 24, height: 24, fill: "none", xmlns: "http://www.w3.org/2000/svg", ...props, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)( "path", { d: "M7.57 12.262c0 .341.13.629.403.895l5.175 5.059c.204.205.45.307.751.307.609 0 1.101-.485 1.101-1.087 0-.293-.123-.574-.349-.8L10.14 12.27l4.511-4.375A1.13 1.13 0 0 0 15 7.087C15 6.485 14.508 6 13.9 6c-.295 0-.54.103-.752.308l-5.175 5.058c-.28.28-.404.56-.404.896Z", fill: "currentColor" } ) }); } // src/components/ui/Heading.tsx var import_react_slot = require("@radix-ui/react-slot"); var import_clsx = __toESM(require("clsx"), 1); var import_react = require("react"); // src/components/ui/Heading.css.ts var import_createRuntimeFn = require("@vanilla-extract/recipes/createRuntimeFn"); var headingVariants = (0, import_createRuntimeFn.createRuntimeFn)({ defaultClassName: "Heading__1v58k1t0", variantClassNames: { size: { sm: "Heading_headingVariants_size_sm__1v58k1t1", md: "Heading_headingVariants_size_md__1v58k1t2", lg: "Heading_headingVariants_size_lg__1v58k1t3", xl: "Heading_headingVariants_size_xl__1v58k1t4" }, weight: { normal: "Heading_headingVariants_weight_normal__1v58k1t5", bold: "Heading_headingVariants_weight_bold__1v58k1t6" }, truncate: { true: "Heading_headingVariants_truncate_true__1v58k1t7" } }, defaultVariants: { size: "lg", weight: "bold" }, compoundVariants: [] }); // src/components/ui/Heading.tsx var import_jsx_runtime2 = require("react/jsx-runtime"); var Heading = (0, import_react.forwardRef)( ({ children, className, asChild = false, as: Tag = "h1", size, weight, truncate, ...headingProps }, forwardedRef) => { return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)( import_react_slot.Slot, { ...headingProps, ref: forwardedRef, className: (0, import_clsx.default)(headingVariants({ size, weight, truncate }), className), children: asChild ? children : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Tag, { children }) } ); } ); Heading.displayName = "Heading"; // src/components/ui/IconButton.tsx var import_react_slot2 = require("@radix-ui/react-slot"); var import_clsx2 = __toESM(require("clsx"), 1); var import_react2 = require("react"); // src/components/ui/IconButton.css.ts var container = "IconButton_container__5zr4fg0"; // src/components/ui/IconButton.tsx var import_jsx_runtime3 = require("react/jsx-runtime"); var IconButton = (0, import_react2.forwardRef)( ({ className, asChild = false, ...props }, forwardedRef) => { const Comp = asChild ? import_react_slot2.Slot : "button"; return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Comp, { ...props, className: (0, import_clsx2.default)(container, className), ref: forwardedRef }); } ); IconButton.displayName = "Button"; // src/components/connect-modal/ConnectModal.css.ts var backButtonContainer = "ConnectModal_backButtonContainer__yocf846"; var selectedViewContainer = "ConnectModal_selectedViewContainer__yocf845"; var title = "ConnectModal_title__yocf841"; var viewContainer = "ConnectModal_viewContainer__yocf844"; var walletListContainer = "ConnectModal_walletListContainer__yocf849"; var walletListContainerWithViewSelected = "ConnectModal_walletListContainerWithViewSelected__yocf84a"; var walletListContent = "ConnectModal_walletListContent__yocf848"; var whatIsAWalletButton = "ConnectModal_whatIsAWalletButton__yocf843"; // src/components/ui/Button.tsx var import_react_slot3 = require("@radix-ui/react-slot"); var import_clsx3 = __toESM(require("clsx"), 1); var import_react3 = require("react"); // src/components/ui/Button.css.ts var import_createRuntimeFn2 = require("@vanilla-extract/recipes/createRuntimeFn"); var buttonVariants = (0, import_createRuntimeFn2.createRuntimeFn)({ defaultClassName: "Button_buttonVariants__1vdhm2g0", variantClassNames: { variant: { primary: "Button_buttonVariants_variant_primary__1vdhm2g1", outline: "Button_buttonVariants_variant_outline__1vdhm2g2" }, size: { md: "Button_buttonVariants_size_md__1vdhm2g3", lg: "Button_buttonVariants_size_lg__1vdhm2g4" } }, defaultVariants: { variant: "primary", size: "md" }, compoundVariants: [] }); // src/components/ui/Button.tsx var import_jsx_runtime4 = require("react/jsx-runtime"); var Button = (0, import_react3.forwardRef)( ({ className, variant, size, asChild = false, ...props }, forwardedRef) => { const Comp = asChild ? import_react_slot3.Slot : "button"; return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)( Comp, { ...props, className: (0, import_clsx3.default)(buttonVariants({ variant, size }), className), ref: forwardedRef } ); } ); Button.displayName = "Button"; // src/components/ui/Text.tsx var import_react_slot4 = require("@radix-ui/react-slot"); var import_clsx4 = __toESM(require("clsx"), 1); var import_react4 = require("react"); // src/components/ui/Text.css.ts var import_createRuntimeFn3 = require("@vanilla-extract/recipes/createRuntimeFn"); var textVariants = (0, import_createRuntimeFn3.createRuntimeFn)({ defaultClassName: "Text__1utg4wj0", variantClassNames: { size: { sm: "Text_textVariants_size_sm__1utg4wj1" }, weight: { normal: "Text_textVariants_weight_normal__1utg4wj2", medium: "Text_textVariants_weight_medium__1utg4wj3", bold: "Text_textVariants_weight_bold__1utg4wj4" }, color: { muted: "Text_textVariants_color_muted__1utg4wj5", danger: "Text_textVariants_color_danger__1utg4wj6", warning: "Text_textVariants_color_warning__1utg4wj7" }, mono: { true: "Text_textVariants_mono_true__1utg4wj8" } }, defaultVariants: { size: "sm", weight: "normal" }, compoundVariants: [] }); // src/components/ui/Text.tsx var import_jsx_runtime5 = require("react/jsx-runtime"); var Text = (0, import_react4.forwardRef)( ({ children, className, asChild = false, as: Tag = "div", size, weight, color, mono, ...textProps }, forwardedRef) => { return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)( import_react_slot4.Slot, { ...textProps, ref: forwardedRef, className: (0, import_clsx4.default)(textVariants({ size, weight, color, mono }), className), children: asChild ? children : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Tag, { children }) } ); } ); Text.displayName = "Text"; // src/components/connect-modal/views/ConnectionStatus.css.ts var connectionStatus = "ConnectionStatus_connectionStatus__l246a63"; var container2 = "ConnectionStatus_container__l246a60"; var retryButtonContainer = "ConnectionStatus_retryButtonContainer__l246a64"; var title2 = "ConnectionStatus_title__l246a62"; var walletIcon = "ConnectionStatus_walletIcon__l246a61"; // src/components/connect-modal/views/ConnectionStatus.tsx var import_jsx_runtime6 = require("react/jsx-runtime"); function ConnectionStatus({ selectedWallet, info, hadConnectionError, onRetryConnection }) { return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: container2, children: [ selectedWallet.getName() && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)( "img", { className: walletIcon, src: selectedWallet.getIcon(), alt: `${selectedWallet.getName()} logo` } ), /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: title2, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(Heading, { as: "h2", size: "xl", children: [ "Opening ", selectedWallet.getName() ] }) }), /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: connectionStatus, children: [ hadConnectionError ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Text, { color: "danger", children: "Connection failed" }) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Text, { color: "muted", children: "Confirm connection in the wallet..." }), info ? info.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Text, { color: "warning", children: item }, i)) : null ] }), hadConnectionError ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: retryButtonContainer, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Button, { type: "button", variant: "outline", onClick: () => onRetryConnection(selectedWallet), children: "Retry Connection" }) }) : null ] }); } // src/components/connect-modal/InfoSection.css.ts var container3 = "InfoSection_container__1tyxmhu0"; // src/components/connect-modal/InfoSection.tsx var import_jsx_runtime7 = require("react/jsx-runtime"); function InfoSection({ title: title5, children }) { return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("section", { className: container3, children: [ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Heading, { as: "h3", size: "sm", weight: "normal", children: title5 }), /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Text, { weight: "medium", color: "muted", children }) ] }); } // src/components/connect-modal/views/WhatIsAWallet.css.ts var container4 = "WhatIsAWallet_container__18x371x0"; var content = "WhatIsAWallet_content__18x371x1"; // src/components/connect-modal/views/WhatIsAWallet.tsx var import_jsx_runtime8 = require("react/jsx-runtime"); function WhatIsAWallet() { return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: container4, children: [ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Heading, { as: "h2", children: "What is a Wallet" }), /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: content, children: [ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(InfoSection, { title: "Easy Login", children: "No need to create new accounts and passwords for every website. Just connect your wallet and get going." }), /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(InfoSection, { title: "Store your Digital Assets", children: "Send, receive, store, and display your digital assets like NFTs & coins." }) ] }) ] }); } // src/components/connect-modal/views/InstallStatus.css.ts var container5 = "InstallStatus_container__1hlwsco0"; var installButtonContainer = "InstallStatus_installButtonContainer__1hlwsco4"; var installStatus = "InstallStatus_installStatus__1hlwsco3"; var title3 = "InstallStatus_title__1hlwsco2"; var walletIcon2 = "InstallStatus_walletIcon__1hlwsco1"; // src/components/connect-modal/views/InstallStatus.tsx var import_jsx_runtime9 = require("react/jsx-runtime"); function InstallStatus({ selectedWallet }) { return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: container5, children: [ selectedWallet.getName() && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)( "img", { className: walletIcon2, src: selectedWallet.getIcon(), alt: `${selectedWallet.getName()} logo` } ), /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: title3, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(Heading, { as: "h2", size: "xl", children: [ "Opening ", selectedWallet.getName() ] }) }), /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: installStatus, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Text, { color: "danger", children: "undetected Wallet" }) }), /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: installButtonContainer, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)( Button, { type: "button", variant: "outline", onClick: () => window.open(selectedWallet.getInstallUrl(), "_blank"), children: "Install" } ) }) ] }); } // src/components/connect-modal/wallet-list/WalletList.css.ts var container6 = "WalletList_container__1wac1dp0"; // src/components/connect-modal/wallet-list/WalletListItem.tsx var import_clsx5 = require("clsx"); // src/components/connect-modal/wallet-list/WalletListItem.css.ts var container7 = "WalletListItem_container__1i3e7c00"; var detectingStatus = "WalletListItem_detectingStatus__1i3e7c07"; var installedStatus = "WalletListItem_installedStatus__1i3e7c05"; var loadingSpinner = "WalletListItem_loadingSpinner__1i3e7c09"; var notInstalledStatus = "WalletListItem_notInstalledStatus__1i3e7c06"; var selectedWalletItem = "WalletListItem_selectedWalletItem__1i3e7c02"; var walletIcon3 = "WalletListItem_walletIcon__1i3e7c03"; var walletItem = "WalletListItem_walletItem__1i3e7c01"; var walletStatus = "WalletListItem_walletStatus__1i3e7c04"; // src/components/connect-modal/wallet-list/WalletListItem.tsx var import_jsx_runtime10 = require("react/jsx-runtime"); function WalletListItem({ name, icon, onClick, isSelected = false, isInstalled = false, isDetecting = false }) { return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("li", { className: container7, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)( "button", { className: (0, import_clsx5.clsx)(walletItem, { [selectedWalletItem]: isSelected }), type: "button", onClick, children: [ icon && typeof icon === "string" ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("img", { className: walletIcon3, src: icon, alt: `${name} logo` }) : icon, /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Heading, { size: "md", truncate: true, asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { children: name }) }), /* @__PURE__ */ (0, import_jsx_runtime10.jsx)( "span", { className: (0, import_clsx5.clsx)(walletStatus, { [installedStatus]: isInstalled && !isDetecting || name === "Local", [notInstalledStatus]: !isInstalled && !isDetecting, [detectingStatus]: isDetecting && name !== "Local" }), children: isDetecting && name !== "Local" ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_jsx_runtime10.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: loadingSpinner }) }) : isInstalled ? "Installed" : "Uninstalled" } ) ] } ) }); } // src/components/connect-modal/wallet-list/WalletList.tsx var import_jsx_runtime11 = require("react/jsx-runtime"); function WalletList({ wallets, selectedWalletName, onSelect, walletStatus: walletStatus2, isDetecting }) { return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("ul", { className: container6, children: wallets.map((wallet) => /* @__PURE__ */ (0, import_jsx_runtime11.jsx)( WalletListItem, { name: wallet.getName(), icon: wallet.getIcon(), isSelected: wallet.getName() === selectedWalletName, isInstalled: walletStatus2.get(wallet.getName()), isDetecting, onClick: () => onSelect(wallet) }, wallet.getName() )) }); } // src/hooks/wallet/useConnectWallet.ts var import_react_query2 = require("@tanstack/react-query"); // src/hooks/wallet/useWalletStore.ts var import_react11 = require("react"); var import_zustand2 = require("zustand"); // src/provider/roochProvider.tsx var import_react8 = require("react"); // src/provider/clientProvider.tsx var import_react7 = require("react"); var import_rooch_sdk = require("@roochnetwork/rooch-sdk"); // src/hooks/useSessionsStore.ts var import_react5 = require("react"); var import_zustand = require("zustand"); function useSessionStore(selector) { const store = (0, import_react5.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/provider/globalProvider.tsx var import_react6 = require("react"); var import_jsx_runtime12 = require("react/jsx-runtime"); var GlobalContext = (0, import_react6.createContext)(null); var useTriggerError = () => { const ctx = (0, import_react6.useContext)(GlobalContext); if (!ctx) { throw new Error("useTriggerError must be used within a GlobalProvider"); } return ctx.triggerError; }; // src/provider/clientProvider.tsx var import_jsx_runtime13 = require("react/jsx-runtime"); var ClientContext = (0, import_react7.createContext)(null); var DEFAULT_NETWORKS = { localnet: { url: (0, import_rooch_sdk.getRoochNodeUrl)("localnet") } }; // src/constants/styleDataAttribute.ts var styleDataAttributeName = "data-sdk-kit"; var styleDataAttributeSelector = `[${styleDataAttributeName}]`; var styleDataAttribute = { [styleDataAttributeName]: "" }; // src/provider/roochProvider.tsx var import_jsx_runtime14 = require("react/jsx-runtime"); var RoochContext = (0, import_react8.createContext)(null); // src/provider/walletProvider.tsx var import_react10 = require("react"); var import_rooch_sdk2 = require("@roochnetwork/rooch-sdk"); // src/hooks/client/useCurrentNetwork.ts function useCurrentNetwork() { return useRoochContext().network; } // src/hooks/client/useRoochContext.ts var import_react9 = require("react"); function useRoochContext() { const context = (0, import_react9.useContext)(ClientContext); if (!context) { throw new Error( "Could not find RoochClientContext. Ensure that you have set up the RoochClientProvider." ); } return context; } // src/hooks/client/useRoochClient.ts function useRoochClient() { return useRoochContext().client; } // src/constants/walletMutationKeys.ts function formMutationKeyFn(baseEntity) { return function mutationKeyFn(additionalKeys = []) { return [{ ...walletMutationKeys.all, baseEntity }, ...additionalKeys]; }; } var walletMutationKeys = { all: { baseScope: "wallet" }, connectWallet: formMutationKeyFn("connect-wallet"), autoConnectWallet: formMutationKeyFn("auto-connect-wallet"), switchAccount: formMutationKeyFn("switch-account"), createSessionKey: formMutationKeyFn("create-session-key") }; // src/hooks/useCurrentSession.ts function useCurrentSession() { return useSessionStore((state) => state.currentSession); } // src/hooks/wallet/useCurrentAddress.ts function useCurrentAddress() { return useWalletStore((state) => state.currentAddress); } // src/hooks/wallet/useCurrentWallet.ts function useCurrentWallet() { const currentWallet = useWalletStore((state) => state.currentWallet); const connectionStatus3 = useWalletStore((state) => state.connectionStatus); switch (connectionStatus3) { case "connecting": return { status: connectionStatus3, wallet: currentWallet, isDisconnected: false, isConnecting: true, isConnected: false }; case "disconnected": return { status: connectionStatus3, wallet: currentWallet, isDisconnected: true, isConnecting: false, isConnected: false }; case "connected": { return { status: connectionStatus3, wallet: currentWallet, isDisconnected: false, isConnecting: false, isConnected: true }; } } } // src/hooks/wallet/useWallets.ts function useWallets() { return useWalletStore((state) => state.wallets); } // src/hooks/useSessions.ts function useSessions() { return useSessionStore( (state) => state.sessions.sort((a, b) => b.getCreateTime() - a.getCreateTime()) ); } // src/hooks/useCreateSession.ts var import_react_query = require("@tanstack/react-query"); // src/error/walletErrors.ts var WalletNotConnectedError = class extends Error { }; // src/hooks/useCreateSession.ts function useCreateSessionKey({ mutationKey, ...mutationOptions } = {}) { const client = useRoochClient(); const { wallet } = useCurrentWallet(); const setCurrentSession = useSessionStore((state) => state.setCurrentSession); const triggerError = useTriggerError(); return (0, import_react_query.useMutation)({ mutationKey: walletMutationKeys.createSessionKey(mutationKey), mutationFn: async (args) => { const signer = args.signer || wallet; if (!signer) { throw new WalletNotConnectedError("No wallet is connected."); } try { const sessionAccount = await client.createSession({ signer, sessionArgs: args }); setCurrentSession(sessionAccount); return sessionAccount; } catch (error) { if ("code" in error && "message" in error) { triggerError(error); } throw error; } }, ...mutationOptions }); } // src/provider/walletProvider.tsx var import_jsx_runtime15 = require("react/jsx-runtime"); var WalletContext = (0, import_react10.createContext)(null); // src/hooks/wallet/useWalletStore.ts function useWalletStore(selector) { const store = (0, import_react11.useContext)(WalletContext); if (!store) { throw new Error("Could not find WalletContext. Ensure that you have set up the WalletProvider."); } return (0, import_zustand2.useStore)(store, selector); } // src/hooks/wallet/useConnectWallet.ts function useConnectWallet({ mutationKey, ...mutationOptions } = {}) { const sessions = useSessions(); const setCurrentSession = useSessionStore((state) => state.setCurrentSession); const setWalletConnected = useWalletStore((state) => state.setWalletConnected); const setWalletDisconnected = useWalletStore((state) => state.setWalletDisconnected); const setConnectionStatus = useWalletStore((state) => state.setConnectionStatus); const triggerError = useTriggerError(); return (0, import_react_query2.useMutation)({ mutationKey: walletMutationKeys.connectWallet(mutationKey), mutationFn: async ({ wallet }) => { try { setConnectionStatus("connecting"); const connectAddress = await wallet.connect(); const selectedAddress = connectAddress[0]; setWalletConnected(wallet, connectAddress, selectedAddress); const cur = sessions.find( (item) => item.getRoochAddress().toStr() === selectedAddress?.genRoochAddress().toStr() ); setCurrentSession(cur); return connectAddress; } catch (error) { setWalletDisconnected(); if ("code" in error && "message" in error) { triggerError(error); } throw error; } }, ...mutationOptions }); } // src/components/ui/Modal.tsx var import_react14 = require("react"); var Dialog = __toESM(require("@radix-ui/react-dialog"), 1); // src/components/ui/Modal.css.ts var closeButtonContainer = "Modal_closeButtonContainer__1c5z17f2"; var content2 = "Modal_content__1c5z17f1"; var overlay = "Modal_overlay__1c5z17f0"; // src/components/styling/StyleMarker.tsx var import_react_slot5 = require("@radix-ui/react-slot"); var import_react12 = require("react"); var import_jsx_runtime16 = require("react/jsx-runtime"); var StyleMarker = (0, import_react12.forwardRef)(({ children, ...props }, forwardedRef) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_react_slot5.Slot, { ref: forwardedRef, ...props, ...styleDataAttribute, children })); StyleMarker.displayName = "StyleMarker"; // src/components/ProgressProvider.tsx var import_react13 = require("react"); // src/components/fauct-modal/views/FaucetView.css.ts var progressBar = "FaucetView_progressBar__1ff62y03"; // src/components/ui/Progress.tsx var import_jsx_runtime17 = require("react/jsx-runtime"); function Progress() { const { progress } = useProgress(); return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: progressBar, style: { width: `${progress}%` } }); } // src/components/ProgressProvider.tsx var import_jsx_runtime18 = require("react/jsx-runtime"); var ProgressProviderContext = (0, import_react13.createContext)(null); var ProgressProvider = ({ children }) => { const [progress, setProgress] = (0, import_react13.useState)(0); const [loading, setLoading] = (0, import_react13.useState)(false); const start = (0, import_react13.useCallback)(() => { setLoading(true); setProgress(0); const interval = setInterval(() => { setProgress((prev) => { const nextProgress = prev + 10; if (nextProgress >= 70) { clearInterval(interval); } return Math.min(nextProgress, 70); }); }, 100); }, []); const finish = (0, import_react13.useCallback)((callback) => { const interval = setInterval(() => { setProgress((prev) => { const nextProgress = prev + 5; if (nextProgress >= 100) { clearInterval(interval); setTimeout(() => { setLoading(false); if (callback) { callback(); } }, 300); } return Math.min(nextProgress, 100); }); }, 50); }, []); return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(ProgressProviderContext.Provider, { value: { loading, progress, start, finish }, children: [ children, loading && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Progress, {}) ] }); }; var useProgress = () => { const ctx = (0, import_react13.useContext)(ProgressProviderContext); if (!ctx) { throw new Error("useSubscribeToError must be used within a GlobalProvider"); } return ctx; }; // src/components/icons/CloseIcon.tsx var import_jsx_runtime19 = require("react/jsx-runtime"); function CloseIcon(props) { return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("svg", { width: 10, height: 10, fill: "none", xmlns: "http://www.w3.org/2000/svg", ...props, children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)( "path", { d: "M9.708.292a.999.999 0 0 0-1.413 0l-3.289 3.29L1.717.291A.999.999 0 0 0 .305 1.705l3.289 3.289-3.29 3.289a.999.999 0 1 0 1.413 1.412l3.29-3.289 3.288 3.29a.999.999 0 0 0 1.413-1.413l-3.29-3.29 3.29-3.288a.999.999 0 0 0 0-1.413Z", fill: "currentColor" } ) }); } // src/components/ui/Modal.tsx var import_jsx_runtime20 = require("react/jsx-runtime"); function Modal({ trigger, children, open, defaultOpen, onOpenChange }) { const [isModalOpen, setModalOpen] = (0, import_react14.useState)(open ?? defaultOpen); const handleOpenChange = (open2) => { setModalOpen(open2); onOpenChange?.(open2); }; return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(Dialog.Root, { open: open ?? isModalOpen, onOpenChange: handleOpenChange, children: [ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(Dialog.Trigger, { asChild: true, children: trigger }), /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(Dialog.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(StyleMarker, { children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(Dialog.Overlay, { className: overlay, children: /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(Dialog.Content, { className: content2, "aria-describedby": void 0, children: [ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(ProgressProvider, { children }), /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(Dialog.Close, { className: closeButtonContainer, asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(IconButton, { type: "button", "aria-label": "Close", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(CloseIcon, {}) }) }) ] }) }) }) }) ] }); } // src/components/switch-network-modal/views/SwitchNetworkView.css.ts var connectionStatus2 = "SwitchNetworkView_connectionStatus__e4ayqy3"; var container8 = "SwitchNetworkView_container__e4ayqy0"; var retryButtonContainer2 = "SwitchNetworkView_retryButtonContainer__e4ayqy4"; var title4 = "SwitchNetworkView_title__e4ayqy2"; var walletIcon4 = "SwitchNetworkView_walletIcon__e4ayqy1"; // src/components/switch-network-modal/views/SwitchNetworkView.tsx var import_react15 = require("react"); // src/components/util/wallet.ts var NETWORK_MAP = { mainnet: "livenet", testnet: "testnet", devnet: void 0, localnet: void 0 }; var checkWalletNetwork = async (wallet, roochNetwork) => { try { const walletNetwork = await wallet.getNetwork(); const target = NETWORK_MAP[roochNetwork]; if (target && walletNetwork !== target) { return target; } } catch (_) { } return void 0; }; // src/components/switch-network-modal/views/SwitchNetworkView.tsx var import_jsx_runtime21 = require("react/jsx-runtime"); function SwitchNetworkView({ wallet, onSuccess, targetNetWork, switchNetwork }) { const { start, finish, loading } = useProgress(); const [error, setError] = (0, import_react15.useState)(false); const [support, setSupport] = (0, import_react15.useState)(true); const roochNetwork = useCurrentNetwork(); const switch2Network = () => { start(); switchNetwork(wallet, targetNetWork).catch((e) => { if ("message" in e && e.message.includes("not support")) { setSupport(false); } setError(true); }).finally(() => { finish(); }); }; const refresh = () => { start(); checkWalletNetwork(wallet, roochNetwork).then((result) => { if (!result) { onSuccess(); } }).finally(() => finish()); }; return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: container8, children: [ wallet.getName() && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)( "img", { className: walletIcon4, src: wallet.getIcon(), alt: `${wallet.getName()} logo` } ), /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: title4, children: /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(Heading, { as: "h2", size: "xl", children: [ "Check ", wallet.getName() ] }) }), /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: connectionStatus2, children: [ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(Text, { color: "danger", children: !loading ? `${error ? "Switch failed" : `Wallet network is not ${targetNetWork}`}` : "being processed..." }), /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(Text, { color: "muted", children: !loading ? `Please ${error ? "manually" : ""} switch the wallet network to ${targetNetWork}` : "" }) ] }), /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: retryButtonContainer2, children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)( Button, { disabled: loading, type: "button", variant: "outline", onClick: () => support ? switch2Network() : refresh(), children: support ? error ? "Retry Switch" : "Switch" : "Refresh" } ) }) ] }); } // src/components/connect-modal/ConnectModal.tsx var import_jsx_runtime22 = require("react/jsx-runtime"); function ConnectModal({ trigger, open, defaultOpen, onOpenChange, onSuccess }) { const wallets = useWallets(); const { mutateAsync, isError } = useConnectWallet(); const roochNetwork = useCurrentNetwork(); const [isModalOpen, setModalOpen] = (0, import_react16.useState)(open ?? defaultOpen); const [currentView, setCurrentView] = (0, import_react16.useState)(); const [targetNetwork, setTargetNetwork] = (0, import_react16.useState)(); const [selectedWallet, setSelectedWallet] = (0, import_react16.useState)(); const [walletStatus2, setWalletStatus] = (0, import_react16.useState)(/* @__PURE__ */ new Map()); const [isDetecting, setIsDetecting] = (0, import_react16.useState)(false); (0, import_react16.useEffect)(() => { setIsDetecting(true); const checkWallets = async () => { for (const item of wallets) { const result = await item.checkInstalled(); setWalletStatus((prev) => { const newS = new Map(prev); newS.set(item.getName(), result); return newS; }); } setIsDetecting(false); }; checkWallets(); }, [wallets, setWalletStatus]); const sortedWallet = (0, import_react16.useMemo)(() => { return wallets.toSorted((a, b) => { if (a.getName() === "Local") { walletStatus2.set(a.getName(), true); return -1; } return Number(walletStatus2.get(b.getName())) - Number(walletStatus2.get(a.getName())); }); }, [wallets, walletStatus2]); const resetSelection = () => { setSelectedWallet(void 0); setCurrentView(void 0); }; const handleOpenChange = (open2) => { if (!open2) { resetSelection(); } setModalOpen(open2); onOpenChange?.(open2); }; const switchNetwork = async (wallet, target) => { wallet.switchNetwork(target).then(() => { connectWallet(wallet); }); }; const handleSelectedWallet = async (wallet) => { if (wallet.getName() === "OneKey") { connectWallet(wallet); return; } const target = await checkWalletNetwork(wallet, roochNetwork); if (target) { setTargetNetwork(target); setCurrentView("switch-network"); } else { connectWallet(wallet); } }; const connectWallet = (wallet) => { setCurrentView("connection-status"); mutateAsync({ wallet }).then(() => { if (onSuccess) { onSuccess(); } handleOpenChange(false); }); }; let modalContent; switch (currentView) { case "what-is-a-wallet": modalContent = /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(WhatIsAWallet, {}); break; case "switch-network": modalContent = /* @__PURE__ */ (0, import_jsx_runtime22.jsx)( SwitchNetworkView, { wallet: selectedWallet, targetNetWork: targetNetwork, switchNetwork, onSuccess: () => connectWallet(selectedWallet) } ); break; case "connection-status": modalContent = /* @__PURE__ */ (0, import_jsx_runtime22.jsx)( ConnectionStatus, { selectedWallet, hadConnectionError: isError, info: ( // TODO: Better solutions are needed to deal with it walletStatus2.get("OneKey") && walletStatus2.get("UniSat") && selectedWallet?.getName() === "UniSat" ? [ "If UniSat does not work!", "Disable One Key Wallet, Refresh the page and try again." ] : void 0 ), onRetryConnection: connectWallet } ); break; case "install-status": modalContent = /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(InstallStatus, { selectedWallet }); break; default: modalContent = /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(WhatIsAWallet, {}); } return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)( Modal, { trigger, open: isModalOpen, defaultOpen, onOpenChange, children: [ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)( "div", { className: (0, import_clsx6.default)(walletListContainer, { [walletListContainerWithViewSelected]: !!currentView }), children: [ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: walletListContent, children: [ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(Dialog2.Title, { className: title, asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(Heading, { as: "h2", children: "Connect a Wallet" }) }), /* @__PURE__ */ (0, import_jsx_runtime22.jsx)( WalletList, { walletStatus: walletStatus2, wallets: sortedWallet, selectedWalletName: selectedWallet?.getName(), isDetecting, onSelect: (wallet) => { if (selectedWallet?.getName() !== wallet.getName()) { setSelectedWallet(wallet); if (walletStatus2.get(wallet.getName())) { handleSelectedWallet(wallet); } else { setCurrentView("install-status"); } } } } ) ] }), /* @__PURE__ */ (0, import_jsx_runtime22.jsx)( "button", { className: whatIsAWalletButton, onClick: () => setCurrentView("what-is-a-wallet"), type: "button", children: "What is a Wallet?" } ) ] } ), /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)( "div", { className: (0, import_clsx6.default)(viewContainer, { [selectedViewContainer]: !!currentView }), children: [ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: backButtonContainer, children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(IconButton, { type: "button", "aria-label": "Back", onClick: () => resetSelection(), children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(BackIcon, {}) }) }), modalContent ] } ) ] } ); } // src/components/SessionKeyGuard.tsx var import_jsx_runtime23 = require("react/jsx-runtime"); function SessionKeyGuard({ children, sessionConf, onClick }) { const session = useCurrentSession(); const curSession = useCurrentSession(); const curAddress = useCurrentAddress(); const _sessionConf = useSessionStore((state) => state.sessionConf); const { mutate } = useCreateSessionKey(); const handleCreateSession = () => { if (curSession && !curSession.isSessionExpired()) { onClick(); return; } const _conf = _sessionConf || sessionConf; if (_conf) { mutate({ ..._conf }); } else { onClick(); } }; return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_jsx_runtime23.Fragment, { children: curAddress ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)( Button, { asChild: true, onClick: () => { handleCreateSession(); }, children } ) : /* @__PURE__ */ (0, import_jsx_runtime23.jsx)( ConnectModal, { trigger: children, onSuccess: () => { if (!session) { handleCreateSession(); } } } ) }); } //# sourceMappingURL=SessionKeyGuard.js.map