@roochnetwork/rooch-sdk-kit
Version:
Rooch SDK Kit
909 lines (846 loc) • 33.5 kB
JavaScript
// src/hooks/client/useCurrentNetwork.ts
function useCurrentNetwork() {
return useRoochContext().network;
}
// src/hooks/client/useRoochContext.ts
import { useContext as useContext4 } from "react";
// src/provider/clientProvider.tsx
import { createContext as createContext4, useMemo, useState } from "react";
import {
getRoochNodeUrl,
RoochClient
} from "@roochnetwork/rooch-sdk";
// src/hooks/useSessionsStore.ts
import { useContext as useContext3 } from "react";
import { useStore as useStore2 } 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;
};
// src/constants/styleDataAttribute.ts
var styleDataAttributeName = "data-sdk-kit";
var styleDataAttributeSelector = `[${styleDataAttributeName}]`;
var styleDataAttribute = { [styleDataAttributeName]: "" };
// src/provider/roochProvider.tsx
import { jsx as jsx2, jsxs } from "react/jsx-runtime";
var RoochContext = createContext2(null);
// src/provider/walletProvider.tsx
import { useCallback, createContext as createContext3, useEffect, useRef as useRef2 } from "react";
import { BitcoinAddress } from "@roochnetwork/rooch-sdk";
// src/hooks/wallet/useWalletStore.ts
import { useContext as useContext2 } from "react";
import { useStore } from "zustand";
function useWalletStore(selector) {
const store = useContext2(WalletContext);
if (!store) {
throw new Error("Could not find WalletContext. Ensure that you have set up the WalletProvider.");
}
return useStore(store, selector);
}
// src/provider/walletProvider.tsx
import { jsx as jsx3 } from "react/jsx-runtime";
var WalletContext = createContext3(null);
// src/hooks/useSessionsStore.ts
function useSessionStore(selector) {
const store = useContext3(RoochContext);
if (!store) {
throw new Error(
"Could not find RoochSessionContext. Ensure that you have set up the RoochClientProvider."
);
}
return useStore2(store, selector);
}
// src/provider/clientProvider.tsx
import { jsx as jsx4 } from "react/jsx-runtime";
var ClientContext = createContext4(null);
var DEFAULT_NETWORKS = {
localnet: { url: getRoochNodeUrl("localnet") }
};
// src/hooks/client/useRoochContext.ts
function useRoochContext() {
const context = useContext4(ClientContext);
if (!context) {
throw new Error(
"Could not find RoochClientContext. Ensure that you have set up the RoochClientProvider."
);
}
return context;
}
// 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/wallet/useConnectWallet.ts
import { useMutation } from "@tanstack/react-query";
// src/hooks/useSessions.ts
function useSessions() {
return useSessionStore(
(state) => state.sessions.sort((a, b) => b.getCreateTime() - a.getCreateTime())
);
}
// 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 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/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/components/connect-modal/ConnectModal.tsx
import * as Dialog2 from "@radix-ui/react-dialog";
import clsx6 from "clsx";
import { useEffect as useEffect2, useMemo as useMemo2, useState as useState5 } from "react";
// src/components/icons/BackIcon.tsx
import { jsx as jsx5 } from "react/jsx-runtime";
function BackIcon(props) {
return /* @__PURE__ */ jsx5("svg", { width: 24, height: 24, fill: "none", xmlns: "http://www.w3.org/2000/svg", ...props, children: /* @__PURE__ */ jsx5(
"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
import { Slot } from "@radix-ui/react-slot";
import clsx from "clsx";
import { forwardRef } from "react";
// src/components/ui/Heading.css.ts
import { createRuntimeFn as _7a468 } from "@vanilla-extract/recipes/createRuntimeFn";
var headingVariants = _7a468({ 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
import { jsx as jsx6 } from "react/jsx-runtime";
var Heading = forwardRef(
({
children,
className,
asChild = false,
as: Tag = "h1",
size,
weight,
truncate,
...headingProps
}, forwardedRef) => {
return /* @__PURE__ */ jsx6(
Slot,
{
...headingProps,
ref: forwardedRef,
className: clsx(headingVariants({ size, weight, truncate }), className),
children: asChild ? children : /* @__PURE__ */ jsx6(Tag, { children })
}
);
}
);
Heading.displayName = "Heading";
// src/components/ui/IconButton.tsx
import { Slot as Slot2 } from "@radix-ui/react-slot";
import clsx2 from "clsx";
import { forwardRef as forwardRef2 } from "react";
// src/components/ui/IconButton.css.ts
var container = "IconButton_container__5zr4fg0";
// src/components/ui/IconButton.tsx
import { jsx as jsx7 } from "react/jsx-runtime";
var IconButton = forwardRef2(
({ className, asChild = false, ...props }, forwardedRef) => {
const Comp = asChild ? Slot2 : "button";
return /* @__PURE__ */ jsx7(Comp, { ...props, className: clsx2(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
import { Slot as Slot3 } from "@radix-ui/react-slot";
import clsx3 from "clsx";
import { forwardRef as forwardRef3 } from "react";
// src/components/ui/Button.css.ts
import { createRuntimeFn as _7a4682 } from "@vanilla-extract/recipes/createRuntimeFn";
var buttonVariants = _7a4682({ 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
import { jsx as jsx8 } from "react/jsx-runtime";
var Button = forwardRef3(
({ className, variant, size, asChild = false, ...props }, forwardedRef) => {
const Comp = asChild ? Slot3 : "button";
return /* @__PURE__ */ jsx8(
Comp,
{
...props,
className: clsx3(buttonVariants({ variant, size }), className),
ref: forwardedRef
}
);
}
);
Button.displayName = "Button";
// src/components/ui/Text.tsx
import { Slot as Slot4 } from "@radix-ui/react-slot";
import clsx4 from "clsx";
import { forwardRef as forwardRef4 } from "react";
// src/components/ui/Text.css.ts
import { createRuntimeFn as _7a4683 } from "@vanilla-extract/recipes/createRuntimeFn";
var textVariants = _7a4683({ 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
import { jsx as jsx9 } from "react/jsx-runtime";
var Text = forwardRef4(
({
children,
className,
asChild = false,
as: Tag = "div",
size,
weight,
color,
mono,
...textProps
}, forwardedRef) => {
return /* @__PURE__ */ jsx9(
Slot4,
{
...textProps,
ref: forwardedRef,
className: clsx4(textVariants({ size, weight, color, mono }), className),
children: asChild ? children : /* @__PURE__ */ jsx9(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
import { jsx as jsx10, jsxs as jsxs2 } from "react/jsx-runtime";
function ConnectionStatus({
selectedWallet,
info,
hadConnectionError,
onRetryConnection
}) {
return /* @__PURE__ */ jsxs2("div", { className: container2, children: [
selectedWallet.getName() && /* @__PURE__ */ jsx10(
"img",
{
className: walletIcon,
src: selectedWallet.getIcon(),
alt: `${selectedWallet.getName()} logo`
}
),
/* @__PURE__ */ jsx10("div", { className: title2, children: /* @__PURE__ */ jsxs2(Heading, { as: "h2", size: "xl", children: [
"Opening ",
selectedWallet.getName()
] }) }),
/* @__PURE__ */ jsxs2("div", { className: connectionStatus, children: [
hadConnectionError ? /* @__PURE__ */ jsx10(Text, { color: "danger", children: "Connection failed" }) : /* @__PURE__ */ jsx10(Text, { color: "muted", children: "Confirm connection in the wallet..." }),
info ? info.map((item, i) => /* @__PURE__ */ jsx10(Text, { color: "warning", children: item }, i)) : null
] }),
hadConnectionError ? /* @__PURE__ */ jsx10("div", { className: retryButtonContainer, children: /* @__PURE__ */ jsx10(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
import { jsx as jsx11, jsxs as jsxs3 } from "react/jsx-runtime";
function InfoSection({ title: title5, children }) {
return /* @__PURE__ */ jsxs3("section", { className: container3, children: [
/* @__PURE__ */ jsx11(Heading, { as: "h3", size: "sm", weight: "normal", children: title5 }),
/* @__PURE__ */ jsx11(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
import { jsx as jsx12, jsxs as jsxs4 } from "react/jsx-runtime";
function WhatIsAWallet() {
return /* @__PURE__ */ jsxs4("div", { className: container4, children: [
/* @__PURE__ */ jsx12(Heading, { as: "h2", children: "What is a Wallet" }),
/* @__PURE__ */ jsxs4("div", { className: content, children: [
/* @__PURE__ */ jsx12(InfoSection, { title: "Easy Login", children: "No need to create new accounts and passwords for every website. Just connect your wallet and get going." }),
/* @__PURE__ */ jsx12(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
import { jsx as jsx13, jsxs as jsxs5 } from "react/jsx-runtime";
function InstallStatus({ selectedWallet }) {
return /* @__PURE__ */ jsxs5("div", { className: container5, children: [
selectedWallet.getName() && /* @__PURE__ */ jsx13(
"img",
{
className: walletIcon2,
src: selectedWallet.getIcon(),
alt: `${selectedWallet.getName()} logo`
}
),
/* @__PURE__ */ jsx13("div", { className: title3, children: /* @__PURE__ */ jsxs5(Heading, { as: "h2", size: "xl", children: [
"Opening ",
selectedWallet.getName()
] }) }),
/* @__PURE__ */ jsx13("div", { className: installStatus, children: /* @__PURE__ */ jsx13(Text, { color: "danger", children: "undetected Wallet" }) }),
/* @__PURE__ */ jsx13("div", { className: installButtonContainer, children: /* @__PURE__ */ jsx13(
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
import { clsx as clsx5 } from "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
import { Fragment, jsx as jsx14, jsxs as jsxs6 } from "react/jsx-runtime";
function WalletListItem({
name,
icon,
onClick,
isSelected = false,
isInstalled = false,
isDetecting = false
}) {
return /* @__PURE__ */ jsx14("li", { className: container7, children: /* @__PURE__ */ jsxs6(
"button",
{
className: clsx5(walletItem, { [selectedWalletItem]: isSelected }),
type: "button",
onClick,
children: [
icon && typeof icon === "string" ? /* @__PURE__ */ jsx14("img", { className: walletIcon3, src: icon, alt: `${name} logo` }) : icon,
/* @__PURE__ */ jsx14(Heading, { size: "md", truncate: true, asChild: true, children: /* @__PURE__ */ jsx14("div", { children: name }) }),
/* @__PURE__ */ jsx14(
"span",
{
className: clsx5(walletStatus, {
[installedStatus]: isInstalled && !isDetecting || name === "Local",
[notInstalledStatus]: !isInstalled && !isDetecting,
[detectingStatus]: isDetecting && name !== "Local"
}),
children: isDetecting && name !== "Local" ? /* @__PURE__ */ jsx14(Fragment, { children: /* @__PURE__ */ jsx14("span", { className: loadingSpinner }) }) : isInstalled ? "Installed" : "Uninstalled"
}
)
]
}
) });
}
// src/components/connect-modal/wallet-list/WalletList.tsx
import { jsx as jsx15 } from "react/jsx-runtime";
function WalletList({
wallets,
selectedWalletName,
onSelect,
walletStatus: walletStatus2,
isDetecting
}) {
return /* @__PURE__ */ jsx15("ul", { className: container6, children: wallets.map((wallet) => /* @__PURE__ */ jsx15(
WalletListItem,
{
name: wallet.getName(),
icon: wallet.getIcon(),
isSelected: wallet.getName() === selectedWalletName,
isInstalled: walletStatus2.get(wallet.getName()),
isDetecting,
onClick: () => onSelect(wallet)
},
wallet.getName()
)) });
}
// src/components/ui/Modal.tsx
import { useState as useState3 } from "react";
import * as Dialog from "@radix-ui/react-dialog";
// 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
import { Slot as Slot5 } from "@radix-ui/react-slot";
import { forwardRef as forwardRef5 } from "react";
import { jsx as jsx16 } from "react/jsx-runtime";
var StyleMarker = forwardRef5(({ children, ...props }, forwardedRef) => /* @__PURE__ */ jsx16(Slot5, { ref: forwardedRef, ...props, ...styleDataAttribute, children }));
StyleMarker.displayName = "StyleMarker";
// src/components/ProgressProvider.tsx
import { createContext as createContext5, useCallback as useCallback2, useContext as useContext5, useState as useState2 } from "react";
// src/components/fauct-modal/views/FaucetView.css.ts
var progressBar = "FaucetView_progressBar__1ff62y03";
// src/components/ui/Progress.tsx
import { jsx as jsx17 } from "react/jsx-runtime";
function Progress() {
const { progress } = useProgress();
return /* @__PURE__ */ jsx17("div", { className: progressBar, style: { width: `${progress}%` } });
}
// src/components/ProgressProvider.tsx
import { jsx as jsx18, jsxs as jsxs7 } from "react/jsx-runtime";
var ProgressProviderContext = createContext5(null);
var ProgressProvider = ({ children }) => {
const [progress, setProgress] = useState2(0);
const [loading, setLoading] = useState2(false);
const start = useCallback2(() => {
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 = useCallback2((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__ */ jsxs7(ProgressProviderContext.Provider, { value: { loading, progress, start, finish }, children: [
children,
loading && /* @__PURE__ */ jsx18(Progress, {})
] });
};
var useProgress = () => {
const ctx = useContext5(ProgressProviderContext);
if (!ctx) {
throw new Error("useSubscribeToError must be used within a GlobalProvider");
}
return ctx;
};
// src/components/icons/CloseIcon.tsx
import { jsx as jsx19 } from "react/jsx-runtime";
function CloseIcon(props) {
return /* @__PURE__ */ jsx19("svg", { width: 10, height: 10, fill: "none", xmlns: "http://www.w3.org/2000/svg", ...props, children: /* @__PURE__ */ jsx19(
"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
import { jsx as jsx20, jsxs as jsxs8 } from "react/jsx-runtime";
function Modal({ trigger, children, open, defaultOpen, onOpenChange }) {
const [isModalOpen, setModalOpen] = useState3(open ?? defaultOpen);
const handleOpenChange = (open2) => {
setModalOpen(open2);
onOpenChange?.(open2);
};
return /* @__PURE__ */ jsxs8(Dialog.Root, { open: open ?? isModalOpen, onOpenChange: handleOpenChange, children: [
/* @__PURE__ */ jsx20(Dialog.Trigger, { asChild: true, children: trigger }),
/* @__PURE__ */ jsx20(Dialog.Portal, { children: /* @__PURE__ */ jsx20(StyleMarker, { children: /* @__PURE__ */ jsx20(Dialog.Overlay, { className: overlay, children: /* @__PURE__ */ jsxs8(Dialog.Content, { className: content2, "aria-describedby": void 0, children: [
/* @__PURE__ */ jsx20(ProgressProvider, { children }),
/* @__PURE__ */ jsx20(Dialog.Close, { className: closeButtonContainer, asChild: true, children: /* @__PURE__ */ jsx20(IconButton, { type: "button", "aria-label": "Close", children: /* @__PURE__ */ jsx20(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
import { useState as useState4 } from "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
import { jsx as jsx21, jsxs as jsxs9 } from "react/jsx-runtime";
function SwitchNetworkView({
wallet,
onSuccess,
targetNetWork,
switchNetwork
}) {
const { start, finish, loading } = useProgress();
const [error, setError] = useState4(false);
const [support, setSupport] = useState4(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__ */ jsxs9("div", { className: container8, children: [
wallet.getName() && /* @__PURE__ */ jsx21(
"img",
{
className: walletIcon4,
src: wallet.getIcon(),
alt: `${wallet.getName()} logo`
}
),
/* @__PURE__ */ jsx21("div", { className: title4, children: /* @__PURE__ */ jsxs9(Heading, { as: "h2", size: "xl", children: [
"Check ",
wallet.getName()
] }) }),
/* @__PURE__ */ jsxs9("div", { className: connectionStatus2, children: [
/* @__PURE__ */ jsx21(Text, { color: "danger", children: !loading ? `${error ? "Switch failed" : `Wallet network is not ${targetNetWork}`}` : "being processed..." }),
/* @__PURE__ */ jsx21(Text, { color: "muted", children: !loading ? `Please ${error ? "manually" : ""} switch the wallet network to ${targetNetWork}` : "" })
] }),
/* @__PURE__ */ jsx21("div", { className: retryButtonContainer2, children: /* @__PURE__ */ jsx21(
Button,
{
disabled: loading,
type: "button",
variant: "outline",
onClick: () => support ? switch2Network() : refresh(),
children: support ? error ? "Retry Switch" : "Switch" : "Refresh"
}
) })
] });
}
// src/components/connect-modal/ConnectModal.tsx
import { jsx as jsx22, jsxs as jsxs10 } from "react/jsx-runtime";
function ConnectModal({
trigger,
open,
defaultOpen,
onOpenChange,
onSuccess
}) {
const wallets = useWallets();
const { mutateAsync, isError } = useConnectWallet();
const roochNetwork = useCurrentNetwork();
const [isModalOpen, setModalOpen] = useState5(open ?? defaultOpen);
const [currentView, setCurrentView] = useState5();
const [targetNetwork, setTargetNetwork] = useState5();
const [selectedWallet, setSelectedWallet] = useState5();
const [walletStatus2, setWalletStatus] = useState5(/* @__PURE__ */ new Map());
const [isDetecting, setIsDetecting] = useState5(false);
useEffect2(() => {
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 = useMemo2(() => {
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__ */ jsx22(WhatIsAWallet, {});
break;
case "switch-network":
modalContent = /* @__PURE__ */ jsx22(
SwitchNetworkView,
{
wallet: selectedWallet,
targetNetWork: targetNetwork,
switchNetwork,
onSuccess: () => connectWallet(selectedWallet)
}
);
break;
case "connection-status":
modalContent = /* @__PURE__ */ jsx22(
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__ */ jsx22(InstallStatus, { selectedWallet });
break;
default:
modalContent = /* @__PURE__ */ jsx22(WhatIsAWallet, {});
}
return /* @__PURE__ */ jsxs10(
Modal,
{
trigger,
open: isModalOpen,
defaultOpen,
onOpenChange,
children: [
/* @__PURE__ */ jsxs10(
"div",
{
className: clsx6(walletListContainer, {
[walletListContainerWithViewSelected]: !!currentView
}),
children: [
/* @__PURE__ */ jsxs10("div", { className: walletListContent, children: [
/* @__PURE__ */ jsx22(Dialog2.Title, { className: title, asChild: true, children: /* @__PURE__ */ jsx22(Heading, { as: "h2", children: "Connect a Wallet" }) }),
/* @__PURE__ */ jsx22(
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__ */ jsx22(
"button",
{
className: whatIsAWalletButton,
onClick: () => setCurrentView("what-is-a-wallet"),
type: "button",
children: "What is a Wallet?"
}
)
]
}
),
/* @__PURE__ */ jsxs10(
"div",
{
className: clsx6(viewContainer, {
[selectedViewContainer]: !!currentView
}),
children: [
/* @__PURE__ */ jsx22("div", { className: backButtonContainer, children: /* @__PURE__ */ jsx22(IconButton, { type: "button", "aria-label": "Back", onClick: () => resetSelection(), children: /* @__PURE__ */ jsx22(BackIcon, {}) }) }),
modalContent
]
}
)
]
}
);
}
// src/components/WalletGuard.tsx
import { Fragment as Fragment2, jsx as jsx23 } from "react/jsx-runtime";
function WalletGuard({ children, onClick }) {
const { status } = useCurrentWallet();
return /* @__PURE__ */ jsx23(Fragment2, { children: status === "connected" ? /* @__PURE__ */ jsx23(
"button",
{
style: {
all: "unset",
cursor: "pointer"
},
onClick,
children
}
) : /* @__PURE__ */ jsx23(ConnectModal, { trigger: children, onSuccess: onClick }) });
}
export {
WalletGuard
};
//# sourceMappingURL=WalletGuard.js.map