Skip to content

Commit 12f1815

Browse files
committed
Extension loading spinner and current wallet icon
1 parent 90fef96 commit 12f1815

File tree

5 files changed

+129
-31
lines changed

5 files changed

+129
-31
lines changed
Loading

packages/sado-connect/src/components/PostConnectButton/index.tsx

+18-8
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ import { Fragment } from "react";
44
import ChevronDownIcon from "../../assets/chevron-down.svg";
55
import { TruncateMiddle } from "../../utils/text-helper";
66
import LogoutIcon from "../../assets/logout.svg";
7-
import { useSadoContext } from "../../providers/SadoContext";
7+
import { Wallet, useSadoContext } from "../../providers/SadoContext";
8+
import UnisatWalletIcon from "../../assets/unisat-wallet.svg";
9+
import XverseWalletIcon from "../../assets/xverse-wallet.svg";
810

911
interface PostConnectButtonProp {
1012
address: string;
@@ -17,7 +19,7 @@ export function PostConnectButton({
1719
network,
1820
onViewWallet,
1921
}: PostConnectButtonProp) {
20-
const { disconnectWallet } = useSadoContext();
22+
const { disconnectWallet, wallet } = useSadoContext();
2123

2224
return (
2325
<Menu
@@ -27,12 +29,20 @@ export function PostConnectButton({
2729
{({ open }) => (
2830
<>
2931
<Menu.Button className="sado-wallet-connected-button">
30-
<Avatar
31-
size={28}
32-
variant="beam"
33-
name={address}
34-
colors={["#1C2DCB", "#F226B8"]}
35-
/>
32+
<div className="wallet-identifier-container">
33+
<Avatar
34+
size={28}
35+
variant="beam"
36+
name={address}
37+
colors={["#1C2DCB", "#F226B8"]}
38+
/>
39+
<img
40+
src={
41+
wallet === Wallet.XVERSE ? XverseWalletIcon : UnisatWalletIcon
42+
}
43+
alt={`${wallet} is connected`}
44+
/>
45+
</div>
3646

3747
<section className="address-container">
3848
<p className="address">{TruncateMiddle(address)}</p>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import { useState } from "react";
2+
import ChevronRightIcon from "../../assets/chevron-right.svg";
3+
import LoadingIcon from "../../assets/loading.svg";
4+
5+
interface WalletButtonProp {
6+
name: string;
7+
onConnect: () => Promise<boolean>;
8+
icon: string;
9+
imageClassOverride?: string;
10+
setErrorMessage: (msg: string) => void;
11+
}
12+
13+
export function WalletButton({
14+
name,
15+
onConnect,
16+
icon,
17+
imageClassOverride,
18+
setErrorMessage,
19+
}: WalletButtonProp) {
20+
const [loading, setLoading] = useState(false);
21+
return (
22+
<button
23+
type="button"
24+
className="wallet-option-button"
25+
onClick={async () => {
26+
setLoading(true);
27+
const timeout = (resolve) => setTimeout(() => resolve("timeout"), 5000);
28+
const success = await Promise.race([onConnect(), new Promise(timeout)]);
29+
if (success === "timeout") {
30+
setErrorMessage(
31+
"No wallet pop-up? The extension is not responding. Try reloading your browser.",
32+
);
33+
} else {
34+
setLoading(false);
35+
}
36+
}}
37+
>
38+
<img
39+
src={icon}
40+
className={imageClassOverride}
41+
alt={`Connect ${name} Wallet`}
42+
/>
43+
<span className="wallet-option-label">{name}</span>
44+
{loading ? (
45+
<img
46+
src={LoadingIcon}
47+
width={40}
48+
alt={`${name} wallet extension is loading`}
49+
/>
50+
) : (
51+
<img src={ChevronRightIcon} alt="Chevron Right" />
52+
)}
53+
</button>
54+
);
55+
}

packages/sado-connect/src/components/SelectWalletModal/index.tsx

+19-23
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ import { Dialog, Transition } from "@headlessui/react";
22
import { Fragment, useEffect, useState } from "react";
33
import { AddressFormats, ordit } from "@sadoprotocol/ordit-sdk";
44
import CloseModalIcon from "../../assets/close-modal.svg";
5-
import ChevronRightIcon from "../../assets/chevron-right.svg";
65
import UnisatWalletIcon from "../../assets/unisat-wallet.svg";
76
import XverseWalletIcon from "../../assets/xverse-wallet.svg";
87
import { useSadoContext, Wallet } from "../../providers/SadoContext";
98
import {
109
UNISAT_WALLET_CHROME_EXTENSION_URL,
1110
XVERSE_WALLET_CHROME_EXTENSION_URL,
1211
} from "../../utils/constant";
12+
import { WalletButton } from "./WalletButton";
1313

1414
interface SelectWalletModalProp {
1515
isOpen: boolean;
@@ -67,6 +67,7 @@ export function SelectWalletModal({
6767

6868
window.unisat.addListener("accountsChanged", onConnectUnisatWallet);
6969
closeModal();
70+
return true;
7071
} catch (err: any) {
7172
if (err.message === "Unisat not installed.") {
7273
window.open(
@@ -77,10 +78,12 @@ export function SelectWalletModal({
7778
}
7879
setErrorMessage(err.message ?? err.toString());
7980
console.error("Error while connecting to UniSat wallet", err);
81+
return false;
8082
}
8183
};
8284
const onConnectXverseWallet = async () => {
8385
try {
86+
setErrorMessage("");
8487
const xverse = await ordit.xverse.getAddresses({
8588
network,
8689
});
@@ -114,6 +117,7 @@ export function SelectWalletModal({
114117
payments: nestedSegwit.format as AddressFormats,
115118
});
116119
closeModal();
120+
return true;
117121
} catch (err: any) {
118122
if (err?.message === "Xverse not installed.") {
119123
window.open(
@@ -124,6 +128,7 @@ export function SelectWalletModal({
124128
}
125129
setErrorMessage(err.toString());
126130
console.error("Error while connecting to Xverse wallet", err);
131+
return false;
127132
}
128133
};
129134

@@ -183,29 +188,20 @@ export function SelectWalletModal({
183188
<section className="panel-content-container">
184189
{isChromium ? (
185190
<section className="panel-content-inner-container">
186-
<button
187-
type="button"
188-
className="wallet-option-button"
189-
onClick={async () => {
190-
await onConnectUnisatWallet();
191-
}}
192-
>
193-
<img src={UnisatWalletIcon} alt="Unisat Wallet" />
194-
<span className="wallet-option-label">Unisat</span>
195-
<img src={ChevronRightIcon} alt="Chevron Right" />
196-
</button>
191+
<WalletButton
192+
name="Unisat"
193+
onConnect={onConnectUnisatWallet}
194+
icon={UnisatWalletIcon}
195+
setErrorMessage={setErrorMessage}
196+
/>
197197
<hr className="horizontal-separator" />
198-
<button
199-
type="button"
200-
className="wallet-option-button"
201-
onClick={async () => {
202-
await onConnectXverseWallet();
203-
}}
204-
>
205-
<img src={XverseWalletIcon} alt="Xverse Wallet" />
206-
<span className="wallet-option-label">Xverse</span>
207-
<img src={ChevronRightIcon} alt="Chevron Right" />
208-
</button>
198+
<WalletButton
199+
name="Xverse"
200+
imageClassOverride="xverse-icon"
201+
onConnect={onConnectXverseWallet}
202+
icon={XverseWalletIcon}
203+
setErrorMessage={setErrorMessage}
204+
/>
209205
</section>
210206
) : (
211207
<Dialog.Description className="unsupported-browser-message">

packages/sado-connect/src/components/SelectWalletModal/style.css

+25
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,31 @@
123123
cursor: pointer;
124124
}
125125

126+
.waiting-cursor {
127+
cursor: wait !important;
128+
}
129+
130+
.xverse-icon {
131+
width: 30px;
132+
padding: 5px;
133+
}
134+
135+
.wallet-identifier-container {
136+
position: relative;
137+
display: inline-block;
138+
}
139+
140+
.wallet-identifier-container img {
141+
position: absolute;
142+
bottom: 4px;
143+
right: 0;
144+
width: 7px;
145+
border-radius: 50%;
146+
background-color: black;
147+
object-fit: cover;
148+
padding: 3px;
149+
}
150+
126151
.sado-connect-wallet-modal .wallet-option-button:hover {
127152
background: rgba(255, 255, 255, 0.1);
128153
}

0 commit comments

Comments
 (0)