forked from Dshield-xyz/Dshield
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathWalletProvider.tsx
More file actions
127 lines (115 loc) · 3.46 KB
/
Copy pathWalletProvider.tsx
File metadata and controls
127 lines (115 loc) · 3.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
"use client";
import {
createContext,
useCallback,
useContext,
useLayoutEffect,
useRef,
useState,
type ReactNode,
} from "react";
import { StellarWalletsKit, type Networks } from "@creit.tech/stellar-wallets-kit";
import { getNetworkPassphrase, getDevKeypair, devSignTransaction } from "@/lib/stellar";
import { FreighterModule } from "@creit.tech/stellar-wallets-kit/modules/freighter";
import { xBullModule } from "@creit.tech/stellar-wallets-kit/modules/xbull";
import { LobstrModule } from "@creit.tech/stellar-wallets-kit/modules/lobstr";
import { HanaModule } from "@creit.tech/stellar-wallets-kit/modules/hana";
import { AlbedoModule } from "@creit.tech/stellar-wallets-kit/modules/albedo";
interface WalletContextType {
address: string | null;
connect: () => Promise<void>;
disconnect: () => void;
signTransaction: (xdr: string) => Promise<string>;
isConnecting: boolean;
}
const WalletContext = createContext<WalletContextType>({
address: null,
connect: async () => {},
disconnect: () => {},
signTransaction: async () => "",
isConnecting: false,
});
export function useWallet() {
return useContext(WalletContext);
}
export function WalletProvider({ children }: { children: ReactNode }) {
const initialized = useRef(false);
const [address, setAddress] = useState<string | null>(null);
const [isConnecting, setIsConnecting] = useState(false);
/* eslint-disable react-hooks/set-state-in-effect */
useLayoutEffect(() => {
if (initialized.current) return;
initialized.current = true;
const devKeypair = getDevKeypair();
if (devKeypair) {
const addr = devKeypair.publicKey();
localStorage.setItem("dshield_wallet", addr);
setAddress(addr);
} else {
const saved = localStorage.getItem("dshield_wallet");
if (saved) {
setAddress(saved);
}
}
const passphrase = getNetworkPassphrase();
StellarWalletsKit.init({
network: passphrase as Networks,
selectedWalletId: "freighter",
modules: [
new FreighterModule(),
new xBullModule(),
new LobstrModule(),
new HanaModule(),
new AlbedoModule(),
],
});
}, []);
/* eslint-enable react-hooks/set-state-in-effect */
const connect = useCallback(async () => {
setIsConnecting(true);
try {
const devKeypair = getDevKeypair();
if (devKeypair) {
const addr = devKeypair.publicKey();
setAddress(addr);
localStorage.setItem("dshield_wallet", addr);
} else {
const { address: addr } = await StellarWalletsKit.authModal();
setAddress(addr);
localStorage.setItem("dshield_wallet", addr);
}
} catch {
// user closed modal
} finally {
setIsConnecting(false);
}
}, []);
const disconnect = useCallback(async () => {
try {
await StellarWalletsKit.disconnect();
} catch {
// ignore
}
setAddress(null);
localStorage.removeItem("dshield_wallet");
}, []);
const signTransaction = useCallback(
async (xdr: string): Promise<string> => {
if (getDevKeypair()) {
return devSignTransaction(xdr);
}
const { signedTxXdr } = await StellarWalletsKit.signTransaction(xdr, {
networkPassphrase: getNetworkPassphrase(),
});
return signedTxXdr;
},
[],
);
return (
<WalletContext.Provider
value={{ address, connect, disconnect, signTransaction, isConnecting }}
>
{children}
</WalletContext.Provider>
);
}