@miden-sdk/miden-wallet-adapter-reactui 0.17.3 → 0.17.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/AGENTS.md CHANGED
@@ -58,7 +58,14 @@ network and permissions on `WalletProvider` or `MidenFiSignerProvider`.
58
58
  **The modal connects on its own.** `WalletModal` fires `connect()` from a
59
59
  layout effect whenever a wallet is selected, so opening it with a selection
60
60
  already stored starts a handshake immediately, and selecting an entry connects
61
- rather than just recording a choice.
61
+ rather than just recording a choice. Bread while `Loadable` is the exception.
62
+ In a phone browser the modal shows an "Open in Bread" button in place of the
63
+ Chrome Web Store badge, and tapping it, or Bread's entry in the list, selects
64
+ Bread and calls its `openInBread()` inside the tap, because the handoff to the
65
+ Bread app only works from a tap. If the wallet turns out to be injected
66
+ already, the adapter moves to `Installed` and the modal connects it through
67
+ the provider like any other. Any other `Loadable` wallet is selected like the
68
+ rest.
62
69
 
63
70
  **`WalletModalProvider` mounts the modal only while visible.** Open it with
64
71
  `useWalletModal().setVisible(true)`. While open, page scroll is locked, Escape
@@ -3,10 +3,13 @@ import { useCallback, useLayoutEffect, useMemo, useRef, useState } from "react";
3
3
  import { createPortal } from "react-dom";
4
4
  import { AllowedPrivateData, PrivateDataPermission, WalletAdapterNetwork, WalletReadyState, } from "@miden-sdk/miden-wallet-adapter-base";
5
5
  import { useWallet } from "@miden-sdk/miden-wallet-adapter-react";
6
- import { MidenWalletName } from "@miden-sdk/miden-wallet-adapter-miden";
6
+ import { MidenWalletName, } from "@miden-sdk/miden-wallet-adapter-miden";
7
7
  import { useWalletModal } from "./useWalletModal";
8
8
  import { WalletListItem } from "./WalletListItem";
9
9
  import { DiscoverMidenMessage } from "./DiscoverMidenMessage";
10
+ function opensInBread({ adapter, readyState }) {
11
+ return (adapter.name === MidenWalletName && readyState === WalletReadyState.Loadable);
12
+ }
10
13
  export const WalletModal = ({ className = "", container = "body", privateDataPermission, network, allowedPrivateData, }) => {
11
14
  const ref = useRef(null);
12
15
  const { wallets, select, connect, wallet } = useWallet();
@@ -53,6 +56,13 @@ export const WalletModal = ({ className = "", container = "body", privateDataPer
53
56
  select(walletName);
54
57
  handleClose(event);
55
58
  }, [select, handleClose]);
59
+ const handleOpenInBreadClick = useCallback((event, { adapter }) => {
60
+ // The browser lets a page open an app only from inside the tap, so the
61
+ // handoff can't wait for the effect that select() drives.
62
+ select(adapter.name);
63
+ adapter.openInBread();
64
+ handleClose(event);
65
+ }, [select, handleClose]);
56
66
  const handleTabKey = useCallback((event) => {
57
67
  const node = ref.current;
58
68
  if (!node)
@@ -103,7 +113,8 @@ export const WalletModal = ({ className = "", container = "body", privateDataPer
103
113
  }, [hideModal, handleTabKey]);
104
114
  useLayoutEffect(() => setPortal(document.querySelector(container)), [container]);
105
115
  useLayoutEffect(() => {
106
- if (wallet) {
116
+ // A Loadable Bread is handed off by its Open in Bread button, from the tap.
117
+ if (wallet && !opensInBread(wallet)) {
107
118
  connect(privateDataPermission || PrivateDataPermission.UponRequest, network || WalletAdapterNetwork.Testnet, allowedPrivateData ?? AllowedPrivateData.None).catch((e) => {
108
119
  console.log({ e });
109
120
  });
@@ -111,6 +122,8 @@ export const WalletModal = ({ className = "", container = "body", privateDataPer
111
122
  }, [wallet, privateDataPermission, network, allowedPrivateData, connect]);
112
123
  return (portal &&
113
124
  createPortal(_jsxs("div", { "aria-labelledby": "wallet-adapter-modal-title", "aria-modal": "true", className: `wallet-adapter-modal ${fadeIn && "wallet-adapter-modal-fade-in"} ${className}`, ref: ref, role: "dialog", children: [_jsx("div", { className: "wallet-adapter-modal-container", children: _jsxs("div", { className: "wallet-adapter-modal-wrapper", children: [_jsxs("div", { className: "wallet-adapter-modal-title", children: ["Connect a Wallet", _jsx("button", { onClick: handleClose, className: "wallet-adapter-modal-button-close", children: _jsx("svg", { width: "14", height: "14", children: _jsx("path", { d: "M14 12.461 8.3 6.772l5.234-5.233L12.006 0 6.772 5.234 1.54 0 0 1.539l5.234 5.233L0 12.006l1.539 1.528L6.772 8.3l5.69 5.7L14 12.461z" }) }) })] }), installedWallets.length ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "wallet-adapter-modal-content", children: ["Connect your Bread Wallet and start exploring its powerful features now!", _jsx("hr", {})] }), _jsxs("ul", { className: "wallet-adapter-modal-list", children: [_jsx("span", { className: "wallet-adapter-modal-list-section-title", children: "Recommended" }), _jsx(WalletListItem, { handleClick: (event) => handleWalletClick(event, getStartedWallet.adapter.name), wallet: getStartedWallet }, getStartedWallet.adapter.name), (otherInstalledWallets.length > 0 ||
114
- otherWallets.length > 0) && (_jsxs(_Fragment, { children: [_jsx("hr", {}), _jsx("span", { className: "wallet-adapter-modal-list-section-title", children: "Other wallets" }), otherInstalledWallets.map((wallet) => (_jsx(WalletListItem, { handleClick: (event) => handleWalletClick(event, wallet.adapter.name), wallet: wallet }, wallet.adapter.name))), otherWallets.map((wallet) => (_jsx(WalletListItem, { handleClick: (event) => handleWalletClick(event, wallet.adapter.name), wallet: wallet }, wallet.adapter.name)))] }))] })] })) : (_jsx(_Fragment, { children: _jsxs("div", { className: "wallet-adapter-modal-middle", children: [_jsx(DiscoverMidenMessage, {}), _jsx("a", { href: getStartedWallet.adapter.url, target: "_blank", rel: "noopener noreferrer", className: "wallet-adapter-modal-chrome-badge", children: _jsx("img", { src: "https://developer.chrome.com/static/docs/webstore/branding/image/HRs9MPufa1J1h5glNhut.png", alt: "Available in the Chrome Web Store" }) })] }) }))] }) }), _jsx("div", { className: "wallet-adapter-modal-overlay", onMouseDown: handleClose })] }), portal));
125
+ otherWallets.length > 0) && (_jsxs(_Fragment, { children: [_jsx("hr", {}), _jsx("span", { className: "wallet-adapter-modal-list-section-title", children: "Other wallets" }), otherInstalledWallets.map((wallet) => (_jsx(WalletListItem, { handleClick: (event) => handleWalletClick(event, wallet.adapter.name), wallet: wallet }, wallet.adapter.name))), otherWallets.map((wallet) => (_jsx(WalletListItem, { handleClick: (event) => opensInBread(wallet)
126
+ ? handleOpenInBreadClick(event, wallet)
127
+ : handleWalletClick(event, wallet.adapter.name), wallet: wallet }, wallet.adapter.name)))] }))] })] })) : (_jsx(_Fragment, { children: _jsxs("div", { className: "wallet-adapter-modal-middle", children: [_jsx(DiscoverMidenMessage, {}), opensInBread(getStartedWallet) ? (_jsx("button", { type: "button", className: "wallet-adapter-modal-middle-button", onClick: (event) => handleOpenInBreadClick(event, getStartedWallet), children: "Open in Bread" })) : (_jsx("a", { href: getStartedWallet.adapter.url, target: "_blank", rel: "noopener noreferrer", className: "wallet-adapter-modal-chrome-badge", children: _jsx("img", { src: "https://developer.chrome.com/static/docs/webstore/branding/image/HRs9MPufa1J1h5glNhut.png", alt: "Available in the Chrome Web Store" }) }))] }) }))] }) }), _jsx("div", { className: "wallet-adapter-modal-overlay", onMouseDown: handleClose })] }), portal));
115
128
  };
116
129
  //# sourceMappingURL=WalletModal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WalletModal.js","sourceRoot":"","sources":["../src/WalletModal.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EAEpB,gBAAgB,GACjB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAU,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAU9D,MAAM,CAAC,MAAM,WAAW,GAAyB,CAAC,EAChD,SAAS,GAAG,EAAE,EACd,SAAS,GAAG,MAAM,EAClB,qBAAqB,EACrB,OAAO,EACP,kBAAkB,GACnB,EAAE,EAAE;IACH,MAAM,GAAG,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IACzC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IACzD,MAAM,EAAE,UAAU,EAAE,GAAG,cAAc,EAAE,CAAC;IACxC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAiB,IAAI,CAAC,CAAC;IAE3D,MAAM,CAAC,gBAAgB,EAAE,YAAY,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE;QACpD,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,CAAC,UAAU,KAAK,gBAAgB,CAAC,WAAW,EAAE,CAAC;gBACvD,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3B,CAAC;iBAAM,IAAI,MAAM,CAAC,UAAU,KAAK,gBAAgB,CAAC,QAAQ,EAAE,CAAC;gBAC3D,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxB,CAAC;iBAAM,IAAI,MAAM,CAAC,UAAU,KAAK,gBAAgB,CAAC,SAAS,EAAE,CAAC;gBAC5D,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAED,OAAO,CAAC,SAAS,EAAE,CAAC,GAAG,QAAQ,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC;IACpD,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,EAAE;QACpC,OAAO,gBAAgB,CAAC,MAAM;YAC5B,CAAC,CAAC,oEAAoE;gBACpE,gBAAgB,CAAC,CAAC,CAAE;YACtB,CAAC,CAAC,OAAO,CAAC,IAAI,CACV,CAAC,MAAyC,EAAE,EAAE,CAC5C,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,eAAe,CAC1C;gBACC,oEAAoE;gBACpE,YAAY,CAAC,CAAC,CAAE,CAAC;IACzB,CAAC,EAAE,CAAC,gBAAgB,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;IAE9C,MAAM,qBAAqB,GAAG,OAAO,CAAC,GAAG,EAAE;QACzC,OAAO,gBAAgB,CAAC,MAAM,CAC5B,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAClE,CAAC;IACJ,CAAC,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAEzC,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;QACjC,SAAS,CAAC,KAAK,CAAC,CAAC;QACjB,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3C,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,MAAM,WAAW,GAAG,WAAW,CAC7B,CAAC,KAAiB,EAAE,EAAE;QACpB,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,SAAS,EAAE,CAAC;IACd,CAAC,EACD,CAAC,SAAS,CAAC,CACZ,CAAC;IAEF,MAAM,iBAAiB,GAAG,WAAW,CACnC,CAAC,KAAiB,EAAE,UAAsB,EAAE,EAAE;QAC5C,MAAM,CAAC,UAAU,CAAC,CAAC;QACnB,WAAW,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC,EACD,CAAC,MAAM,EAAE,WAAW,CAAC,CACtB,CAAC;IAEF,MAAM,YAAY,GAAG,WAAW,CAC9B,CAAC,KAAoB,EAAE,EAAE;QACvB,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC;QACzB,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,uCAAuC;QACvC,MAAM,iBAAiB,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC1D,oEAAoE;QACpE,MAAM,YAAY,GAAG,iBAAiB,CAAC,CAAC,CAAE,CAAC;QAC3C,oEAAoE;QACpE,MAAM,WAAW,GAAG,iBAAiB,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;QAErE,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,sGAAsG;YACtG,IAAI,QAAQ,CAAC,aAAa,KAAK,YAAY,EAAE,CAAC;gBAC5C,WAAW,CAAC,KAAK,EAAE,CAAC;gBACpB,KAAK,CAAC,cAAc,EAAE,CAAC;YACzB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,qGAAqG;YACrG,IAAI,QAAQ,CAAC,aAAa,KAAK,WAAW,EAAE,CAAC;gBAC3C,YAAY,CAAC,KAAK,EAAE,CAAC;gBACrB,KAAK,CAAC,cAAc,EAAE,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC,EACD,CAAC,GAAG,CAAC,CACN,CAAC;IAEF,eAAe,CAAC,GAAG,EAAE;QACnB,MAAM,aAAa,GAAG,CAAC,KAAoB,EAAE,EAAE;YAC7C,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC3B,SAAS,EAAE,CAAC;YACd,CAAC;iBAAM,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC;gBAC/B,YAAY,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;QACH,CAAC,CAAC;QAEF,wBAAwB;QACxB,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5D,+CAA+C;QAC/C,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACrC,6BAA6B;QAC7B,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACxC,4BAA4B;QAC5B,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;QAEzD,OAAO,GAAG,EAAE;YACV,8CAA8C;YAC9C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;YACxC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;QAC9D,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;IAE9B,eAAe,CACb,GAAG,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,EAClD,CAAC,SAAS,CAAC,CACZ,CAAC;IAEF,eAAe,CAAC,GAAG,EAAE;QACnB,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CACL,qBAAqB,IAAI,qBAAqB,CAAC,WAAW,EAC1D,OAAO,IAAI,oBAAoB,CAAC,OAAO,EACvC,kBAAkB,IAAI,kBAAkB,CAAC,IAAI,CAC9C,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;gBACZ,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACrB,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,qBAAqB,EAAE,OAAO,EAAE,kBAAkB,EAAE,OAAO,CAAC,CAAC,CAAC;IAE1E,OAAO,CACL,MAAM;QACN,YAAY,CACV,kCACkB,4BAA4B,gBACjC,MAAM,EACjB,SAAS,EAAE,wBACT,MAAM,IAAI,8BACZ,IAAI,SAAS,EAAE,EACf,GAAG,EAAE,GAAG,EACR,IAAI,EAAC,QAAQ,aAEb,cAAK,SAAS,EAAC,gCAAgC,YAC7C,eAAK,SAAS,EAAC,8BAA8B,aAC3C,eAAK,SAAS,EAAC,4BAA4B,iCAEzC,iBACE,OAAO,EAAE,WAAW,EACpB,SAAS,EAAC,mCAAmC,YAE7C,cAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,YACzB,eAAM,CAAC,EAAC,qIAAqI,GAAG,GAC5I,GACC,IACL,EACL,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CACzB,8BACE,eAAK,SAAS,EAAC,8BAA8B,yFAG3C,cAAM,IACF,EACN,cAAI,SAAS,EAAC,2BAA2B,aACvC,eAAM,SAAS,EAAC,yCAAyC,4BAElD,EACP,KAAC,cAAc,IAEb,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CACrB,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,EAEzD,MAAM,EAAE,gBAAgB,IAJnB,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAKlC,EACD,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC;gDAChC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAC5B,8BACE,cAAM,EACN,eAAM,SAAS,EAAC,yCAAyC,8BAElD,EACN,qBAAqB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CACrC,KAAC,cAAc,IAEb,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CACrB,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAE/C,MAAM,EAAE,MAAM,IAJT,MAAM,CAAC,OAAO,CAAC,IAAI,CAKxB,CACH,CAAC,EACD,YAAY,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAC5B,KAAC,cAAc,IAEb,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CACrB,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAE/C,MAAM,EAAE,MAAM,IAJT,MAAM,CAAC,OAAO,CAAC,IAAI,CAKxB,CACH,CAAC,IACD,CACJ,IACE,IACJ,CACJ,CAAC,CAAC,CAAC,CACF,4BACE,eAAK,SAAS,EAAC,6BAA6B,aAC1C,KAAC,oBAAoB,KAAG,EACxB,YACE,IAAI,EAAE,gBAAgB,CAAC,OAAO,CAAC,GAAG,EAClC,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,SAAS,EAAC,mCAAmC,YAE7C,cACE,GAAG,EAAC,2FAA2F,EAC/F,GAAG,EAAC,mCAAmC,GACvC,GACA,IACA,GACL,CACJ,IACG,GACF,EACN,cACE,SAAS,EAAC,8BAA8B,EACxC,WAAW,EAAE,WAAW,GACxB,IACE,EACN,MAAM,CACP,CACF,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import type { FC, MouseEvent } from \"react\";\nimport { useCallback, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n AllowedPrivateData,\n PrivateDataPermission,\n WalletAdapterNetwork,\n WalletName,\n WalletReadyState,\n} from \"@miden-sdk/miden-wallet-adapter-base\";\nimport { useWallet, Wallet } from \"@miden-sdk/miden-wallet-adapter-react\";\nimport { MidenWalletName } from \"@miden-sdk/miden-wallet-adapter-miden\";\nimport { useWalletModal } from \"./useWalletModal\";\nimport { WalletListItem } from \"./WalletListItem\";\nimport { DiscoverMidenMessage } from \"./DiscoverMidenMessage\";\n\nexport interface WalletModalProps {\n className?: string;\n container?: string;\n privateDataPermission?: PrivateDataPermission;\n network?: WalletAdapterNetwork;\n allowedPrivateData?: AllowedPrivateData;\n}\n\nexport const WalletModal: FC<WalletModalProps> = ({\n className = \"\",\n container = \"body\",\n privateDataPermission,\n network,\n allowedPrivateData,\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n const { wallets, select, connect, wallet } = useWallet();\n const { setVisible } = useWalletModal();\n const [fadeIn, setFadeIn] = useState(false);\n const [portal, setPortal] = useState<Element | null>(null);\n\n const [installedWallets, otherWallets] = useMemo(() => {\n const installed: Wallet[] = [];\n const notDetected: Wallet[] = [];\n const loadable: Wallet[] = [];\n\n for (const wallet of wallets) {\n if (wallet.readyState === WalletReadyState.NotDetected) {\n notDetected.push(wallet);\n } else if (wallet.readyState === WalletReadyState.Loadable) {\n loadable.push(wallet);\n } else if (wallet.readyState === WalletReadyState.Installed) {\n installed.push(wallet);\n }\n }\n\n return [installed, [...loadable, ...notDetected]];\n }, [wallets]);\n\n const getStartedWallet = useMemo(() => {\n return installedWallets.length\n ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n installedWallets[0]!\n : wallets.find(\n (wallet: { adapter: { name: WalletName } }) =>\n wallet.adapter.name === MidenWalletName\n ) ||\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n otherWallets[0]!;\n }, [installedWallets, wallets, otherWallets]);\n\n const otherInstalledWallets = useMemo(() => {\n return installedWallets.filter(\n (wallet) => wallet.adapter.name !== getStartedWallet.adapter.name\n );\n }, [installedWallets, getStartedWallet]);\n\n const hideModal = useCallback(() => {\n setFadeIn(false);\n setTimeout(() => setVisible(false), 150);\n }, [setVisible]);\n\n const handleClose = useCallback(\n (event: MouseEvent) => {\n event.preventDefault();\n hideModal();\n },\n [hideModal]\n );\n\n const handleWalletClick = useCallback(\n (event: MouseEvent, walletName: WalletName) => {\n select(walletName);\n handleClose(event);\n },\n [select, handleClose]\n );\n\n const handleTabKey = useCallback(\n (event: KeyboardEvent) => {\n const node = ref.current;\n if (!node) return;\n\n // here we query all focusable elements\n const focusableElements = node.querySelectorAll(\"button\");\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const firstElement = focusableElements[0]!;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const lastElement = focusableElements[focusableElements.length - 1]!;\n\n if (event.shiftKey) {\n // if going backward by pressing tab and firstElement is active, shift focus to last focusable element\n if (document.activeElement === firstElement) {\n lastElement.focus();\n event.preventDefault();\n }\n } else {\n // if going forward by pressing tab and lastElement is active, shift focus to first focusable element\n if (document.activeElement === lastElement) {\n firstElement.focus();\n event.preventDefault();\n }\n }\n },\n [ref]\n );\n\n useLayoutEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n hideModal();\n } else if (event.key === \"Tab\") {\n handleTabKey(event);\n }\n };\n\n // Get original overflow\n const { overflow } = window.getComputedStyle(document.body);\n // Hack to enable fade in animation after mount\n setTimeout(() => setFadeIn(true), 0);\n // Prevent scrolling on mount\n document.body.style.overflow = \"hidden\";\n // Listen for keydown events\n window.addEventListener(\"keydown\", handleKeyDown, false);\n\n return () => {\n // Re-enable scrolling when component unmounts\n document.body.style.overflow = overflow;\n window.removeEventListener(\"keydown\", handleKeyDown, false);\n };\n }, [hideModal, handleTabKey]);\n\n useLayoutEffect(\n () => setPortal(document.querySelector(container)),\n [container]\n );\n\n useLayoutEffect(() => {\n if (wallet) {\n connect(\n privateDataPermission || PrivateDataPermission.UponRequest,\n network || WalletAdapterNetwork.Testnet,\n allowedPrivateData ?? AllowedPrivateData.None\n ).catch((e) => {\n console.log({ e });\n });\n }\n }, [wallet, privateDataPermission, network, allowedPrivateData, connect]);\n\n return (\n portal &&\n createPortal(\n <div\n aria-labelledby=\"wallet-adapter-modal-title\"\n aria-modal=\"true\"\n className={`wallet-adapter-modal ${\n fadeIn && \"wallet-adapter-modal-fade-in\"\n } ${className}`}\n ref={ref}\n role=\"dialog\"\n >\n <div className=\"wallet-adapter-modal-container\">\n <div className=\"wallet-adapter-modal-wrapper\">\n <div className=\"wallet-adapter-modal-title\">\n Connect a Wallet\n <button\n onClick={handleClose}\n className=\"wallet-adapter-modal-button-close\"\n >\n <svg width=\"14\" height=\"14\">\n <path d=\"M14 12.461 8.3 6.772l5.234-5.233L12.006 0 6.772 5.234 1.54 0 0 1.539l5.234 5.233L0 12.006l1.539 1.528L6.772 8.3l5.69 5.7L14 12.461z\" />\n </svg>\n </button>\n </div>\n {installedWallets.length ? (\n <>\n <div className=\"wallet-adapter-modal-content\">\n Connect your Bread Wallet and start exploring its powerful\n features now!\n <hr />\n </div>\n <ul className=\"wallet-adapter-modal-list\">\n <span className=\"wallet-adapter-modal-list-section-title\">\n Recommended\n </span>\n <WalletListItem\n key={getStartedWallet.adapter.name}\n handleClick={(event) =>\n handleWalletClick(event, getStartedWallet.adapter.name)\n }\n wallet={getStartedWallet}\n />\n {(otherInstalledWallets.length > 0 ||\n otherWallets.length > 0) && (\n <>\n <hr />\n <span className=\"wallet-adapter-modal-list-section-title\">\n Other wallets\n </span>\n {otherInstalledWallets.map((wallet) => (\n <WalletListItem\n key={wallet.adapter.name}\n handleClick={(event) =>\n handleWalletClick(event, wallet.adapter.name)\n }\n wallet={wallet}\n />\n ))}\n {otherWallets.map((wallet) => (\n <WalletListItem\n key={wallet.adapter.name}\n handleClick={(event) =>\n handleWalletClick(event, wallet.adapter.name)\n }\n wallet={wallet}\n />\n ))}\n </>\n )}\n </ul>\n </>\n ) : (\n <>\n <div className=\"wallet-adapter-modal-middle\">\n <DiscoverMidenMessage />\n <a\n href={getStartedWallet.adapter.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"wallet-adapter-modal-chrome-badge\"\n >\n <img\n src=\"https://developer.chrome.com/static/docs/webstore/branding/image/HRs9MPufa1J1h5glNhut.png\"\n alt=\"Available in the Chrome Web Store\"\n />\n </a>\n </div>\n </>\n )}\n </div>\n </div>\n <div\n className=\"wallet-adapter-modal-overlay\"\n onMouseDown={handleClose}\n />\n </div>,\n portal\n )\n );\n};\n"]}
1
+ {"version":3,"file":"WalletModal.js","sourceRoot":"","sources":["../src/WalletModal.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { FC, MouseEvent } from \"react\";\nimport { useCallback, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n AllowedPrivateData,\n PrivateDataPermission,\n WalletAdapterNetwork,\n WalletName,\n WalletReadyState,\n} from \"@miden-sdk/miden-wallet-adapter-base\";\nimport { useWallet, Wallet } from \"@miden-sdk/miden-wallet-adapter-react\";\nimport {\n MidenWalletName,\n type MidenWalletAdapter,\n} from \"@miden-sdk/miden-wallet-adapter-miden\";\nimport { useWalletModal } from \"./useWalletModal\";\nimport { WalletListItem } from \"./WalletListItem\";\nimport { DiscoverMidenMessage } from \"./DiscoverMidenMessage\";\n\nexport interface WalletModalProps {\n className?: string;\n container?: string;\n privateDataPermission?: PrivateDataPermission;\n network?: WalletAdapterNetwork;\n allowedPrivateData?: AllowedPrivateData;\n}\n\nfunction opensInBread({ adapter, readyState }: Wallet): boolean {\n return (\n adapter.name === MidenWalletName && readyState === WalletReadyState.Loadable\n );\n}\n\nexport const WalletModal: FC<WalletModalProps> = ({\n className = \"\",\n container = \"body\",\n privateDataPermission,\n network,\n allowedPrivateData,\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n const { wallets, select, connect, wallet } = useWallet();\n const { setVisible } = useWalletModal();\n const [fadeIn, setFadeIn] = useState(false);\n const [portal, setPortal] = useState<Element | null>(null);\n\n const [installedWallets, otherWallets] = useMemo(() => {\n const installed: Wallet[] = [];\n const notDetected: Wallet[] = [];\n const loadable: Wallet[] = [];\n\n for (const wallet of wallets) {\n if (wallet.readyState === WalletReadyState.NotDetected) {\n notDetected.push(wallet);\n } else if (wallet.readyState === WalletReadyState.Loadable) {\n loadable.push(wallet);\n } else if (wallet.readyState === WalletReadyState.Installed) {\n installed.push(wallet);\n }\n }\n\n return [installed, [...loadable, ...notDetected]];\n }, [wallets]);\n\n const getStartedWallet = useMemo(() => {\n return installedWallets.length\n ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n installedWallets[0]!\n : wallets.find(\n (wallet: { adapter: { name: WalletName } }) =>\n wallet.adapter.name === MidenWalletName\n ) ||\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n otherWallets[0]!;\n }, [installedWallets, wallets, otherWallets]);\n\n const otherInstalledWallets = useMemo(() => {\n return installedWallets.filter(\n (wallet) => wallet.adapter.name !== getStartedWallet.adapter.name\n );\n }, [installedWallets, getStartedWallet]);\n\n const hideModal = useCallback(() => {\n setFadeIn(false);\n setTimeout(() => setVisible(false), 150);\n }, [setVisible]);\n\n const handleClose = useCallback(\n (event: MouseEvent) => {\n event.preventDefault();\n hideModal();\n },\n [hideModal]\n );\n\n const handleWalletClick = useCallback(\n (event: MouseEvent, walletName: WalletName) => {\n select(walletName);\n handleClose(event);\n },\n [select, handleClose]\n );\n\n const handleOpenInBreadClick = useCallback(\n (event: MouseEvent, { adapter }: Wallet) => {\n // The browser lets a page open an app only from inside the tap, so the\n // handoff can't wait for the effect that select() drives.\n select(adapter.name);\n (adapter as MidenWalletAdapter).openInBread();\n handleClose(event);\n },\n [select, handleClose]\n );\n\n const handleTabKey = useCallback(\n (event: KeyboardEvent) => {\n const node = ref.current;\n if (!node) return;\n\n // here we query all focusable elements\n const focusableElements = node.querySelectorAll(\"button\");\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const firstElement = focusableElements[0]!;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const lastElement = focusableElements[focusableElements.length - 1]!;\n\n if (event.shiftKey) {\n // if going backward by pressing tab and firstElement is active, shift focus to last focusable element\n if (document.activeElement === firstElement) {\n lastElement.focus();\n event.preventDefault();\n }\n } else {\n // if going forward by pressing tab and lastElement is active, shift focus to first focusable element\n if (document.activeElement === lastElement) {\n firstElement.focus();\n event.preventDefault();\n }\n }\n },\n [ref]\n );\n\n useLayoutEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n hideModal();\n } else if (event.key === \"Tab\") {\n handleTabKey(event);\n }\n };\n\n // Get original overflow\n const { overflow } = window.getComputedStyle(document.body);\n // Hack to enable fade in animation after mount\n setTimeout(() => setFadeIn(true), 0);\n // Prevent scrolling on mount\n document.body.style.overflow = \"hidden\";\n // Listen for keydown events\n window.addEventListener(\"keydown\", handleKeyDown, false);\n\n return () => {\n // Re-enable scrolling when component unmounts\n document.body.style.overflow = overflow;\n window.removeEventListener(\"keydown\", handleKeyDown, false);\n };\n }, [hideModal, handleTabKey]);\n\n useLayoutEffect(\n () => setPortal(document.querySelector(container)),\n [container]\n );\n\n useLayoutEffect(() => {\n // A Loadable Bread is handed off by its Open in Bread button, from the tap.\n if (wallet && !opensInBread(wallet)) {\n connect(\n privateDataPermission || PrivateDataPermission.UponRequest,\n network || WalletAdapterNetwork.Testnet,\n allowedPrivateData ?? AllowedPrivateData.None\n ).catch((e) => {\n console.log({ e });\n });\n }\n }, [wallet, privateDataPermission, network, allowedPrivateData, connect]);\n\n return (\n portal &&\n createPortal(\n <div\n aria-labelledby=\"wallet-adapter-modal-title\"\n aria-modal=\"true\"\n className={`wallet-adapter-modal ${\n fadeIn && \"wallet-adapter-modal-fade-in\"\n } ${className}`}\n ref={ref}\n role=\"dialog\"\n >\n <div className=\"wallet-adapter-modal-container\">\n <div className=\"wallet-adapter-modal-wrapper\">\n <div className=\"wallet-adapter-modal-title\">\n Connect a Wallet\n <button\n onClick={handleClose}\n className=\"wallet-adapter-modal-button-close\"\n >\n <svg width=\"14\" height=\"14\">\n <path d=\"M14 12.461 8.3 6.772l5.234-5.233L12.006 0 6.772 5.234 1.54 0 0 1.539l5.234 5.233L0 12.006l1.539 1.528L6.772 8.3l5.69 5.7L14 12.461z\" />\n </svg>\n </button>\n </div>\n {installedWallets.length ? (\n <>\n <div className=\"wallet-adapter-modal-content\">\n Connect your Bread Wallet and start exploring its powerful\n features now!\n <hr />\n </div>\n <ul className=\"wallet-adapter-modal-list\">\n <span className=\"wallet-adapter-modal-list-section-title\">\n Recommended\n </span>\n <WalletListItem\n key={getStartedWallet.adapter.name}\n handleClick={(event) =>\n handleWalletClick(event, getStartedWallet.adapter.name)\n }\n wallet={getStartedWallet}\n />\n {(otherInstalledWallets.length > 0 ||\n otherWallets.length > 0) && (\n <>\n <hr />\n <span className=\"wallet-adapter-modal-list-section-title\">\n Other wallets\n </span>\n {otherInstalledWallets.map((wallet) => (\n <WalletListItem\n key={wallet.adapter.name}\n handleClick={(event) =>\n handleWalletClick(event, wallet.adapter.name)\n }\n wallet={wallet}\n />\n ))}\n {otherWallets.map((wallet) => (\n <WalletListItem\n key={wallet.adapter.name}\n handleClick={(event) =>\n opensInBread(wallet)\n ? handleOpenInBreadClick(event, wallet)\n : handleWalletClick(event, wallet.adapter.name)\n }\n wallet={wallet}\n />\n ))}\n </>\n )}\n </ul>\n </>\n ) : (\n <>\n <div className=\"wallet-adapter-modal-middle\">\n <DiscoverMidenMessage />\n {opensInBread(getStartedWallet) ? (\n <button\n type=\"button\"\n className=\"wallet-adapter-modal-middle-button\"\n onClick={(event) =>\n handleOpenInBreadClick(event, getStartedWallet)\n }\n >\n Open in Bread\n </button>\n ) : (\n <a\n href={getStartedWallet.adapter.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"wallet-adapter-modal-chrome-badge\"\n >\n <img\n src=\"https://developer.chrome.com/static/docs/webstore/branding/image/HRs9MPufa1J1h5glNhut.png\"\n alt=\"Available in the Chrome Web Store\"\n />\n </a>\n )}\n </div>\n </>\n )}\n </div>\n </div>\n <div\n className=\"wallet-adapter-modal-overlay\"\n onMouseDown={handleClose}\n />\n </div>,\n portal\n )\n );\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@miden-sdk/miden-wallet-adapter-reactui",
3
- "version": "0.17.3",
3
+ "version": "0.17.5",
4
4
  "description": "React UI Components for connecting Miden-compatible wallets to your dApp.",
5
5
  "module": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -17,15 +17,17 @@
17
17
  "author": "Miden Contributors",
18
18
  "license": "MIT",
19
19
  "dependencies": {
20
- "@miden-sdk/miden-wallet-adapter-base": "0.17.3",
21
- "@miden-sdk/miden-wallet-adapter-react": "0.17.3",
22
- "@miden-sdk/miden-wallet-adapter-miden": "0.17.3"
20
+ "@miden-sdk/miden-wallet-adapter-miden": "0.17.5",
21
+ "@miden-sdk/miden-wallet-adapter-base": "0.17.5",
22
+ "@miden-sdk/miden-wallet-adapter-react": "0.17.5"
23
23
  },
24
24
  "devDependencies": {
25
25
  "@types/react-dom": "^19.0.4",
26
26
  "copyfiles": "^2.4.1",
27
+ "jsdom": "^24.0.0",
27
28
  "react": "^19.1.1",
28
- "react-dom": "^19.1.1"
29
+ "react-dom": "^19.1.1",
30
+ "vitest": "^1.0.0"
29
31
  },
30
32
  "peerDependencies": {
31
33
  "@types/react": "^19.0.0",
@@ -39,8 +41,10 @@
39
41
  "homepage": "https://github.com/0xMiden/web-sdk",
40
42
  "scripts": {
41
43
  "build": "tsc && pnpm run copy-files",
44
+ "typecheck": "tsc --noEmit -p tsconfig.test.json",
42
45
  "clean": "rimraf dist/ node_modules/",
43
46
  "copy-files": "copyfiles styles.css dist/",
44
- "doc": "typedoc --disableSources --plugin typedoc-plugin-markdown"
47
+ "doc": "typedoc --disableSources --plugin typedoc-plugin-markdown",
48
+ "test": "vitest run"
45
49
  }
46
50
  }