-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnav_fe.nim
179 lines (142 loc) · 5.6 KB
/
nav_fe.nim
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
import mynimlib/[nimjs, icecream, nimThirdweb]
import std/jsfetch
import std/[asyncjs, jsconsole, jsformdata, jsheaders]
import strutils, strformat, tables, sequtils
import dom
import consts
import std/enumerate
import jsony
from std/httpcore import HttpMethod
from std/jsffi import JsObject
from std/sugar import `=>`
import handles
{. emit: """
import {MetaMaskWallet, ethers, WalletConnect, Goerli} from "./thirdweb/dist/thirdweb.js";
""" .}
proc ethereum(w:Window): bool {. importjs: "#.$1"}
proc hasMetaMask(w:Window): bool {. importjs: "#.ethereum.isMetaMask"}
proc show_connect_wallet_or_addr() {.async.}=
if window.ethereum:
if window.hasMetaMask:
if not (await metamaskIsConnected()):
ic "user not connected to metamask"
# show connect wallet btn
connect_wallet_btn.el_strict.rmClass "hidden"
rm_from_local_storage "user_wallet_address".cstring
else:
let metamaskWallet = newMetaMaskWallet()
let address_req = await metamaskWallet.getAddress()
if not address_req.ok:
icr "Could not get address"
icr address_req.err
alert "Could not get address, please refresh the page and try again"
return
# Hide connect wallet btn
connect_wallet_btn.el_strict.toggleHidden()
# Show wallet address btn
let address = address_req.val.get
wallet_address_btn.el_strict.innerHTML = ($address)[0..5] & "..." & ($address)[^5..^1]
wallet_address_btn.el_strict.toggleHidden()
proc showHideModal() =
connect_wallet_modal.el_strict.toggleHidden
if play_card.el.isSome:
play_card.el.get.toggleHidden
connect_wallet_btn.el_strict.toggleHidden()
var metamask_installed = false
window.load(
proc(e: Event) =
if window.ethereum:
if window.hasMetamask:
metamask_installed = true
ic "metamask installed"
connect_wallet_modal_metamask_btn.el_strict.toggleHidden()
)
await show_connect_wallet_or_addr()
close_connect_wallet_modal_btn.el_strict.click(
proc (e:Event) {. async .} =
showHideModal()
)
connect_wallet_btn.el_strict.click(
proc (e:Event) {. async .} =
showHideModal()
)
connect_wallet_modal_metamask_btn.el_strict.click(
proc (e:Event) {. async .} =
let metamaskWallet = newMetaMaskWallet()
let connect_req = await metamaskWallet.connect()
if not connect_req.ok:
if "User rejected the request".cstring in connect_req.err:
ic "User rejected the request"
return
else:
icr connect_req.err
return
ic "metamaskWallet connected"
let address_req = await metamaskWallet.getAddress()
if not address_req.ok:
icr "Could not get address"
icr address_req.err
return
let address = address_req.val.get
ic address
showHideModal()
connect_wallet_btn.el_strict.toggleHidden()
wallet_address_btn.el_strict.innerHTML = ($address)[0..5] & "..." & ($address)[^5..^1]
wallet_address_btn.el_strict.toggleHidden()
window.localStorage.setItem("user_wallet_address".cstring, address)
# If the user manually disconnects the metamaskWallet, we need to
# show the connect metamaskWallet btn
# hide the metamaskWallet address btn
# and remove the user_wallet_address from local storage
)
connect_wallet_modal_cw_btn.el_strict.click(
proc (e:Event) {. async .} =
let options = walletConnectOptions(
qrcode: true,
projectId: consts.wallet_connect_proj_id.cstring,
chains: @[Goerli()],
)
let wallet = newWalletConnectWallet(options)
let connect_req = await wallet.connect()
if not connect_req.ok:
if "User rejected the request".cstring in connect_req.err:
ic "User rejected the request"
return
else:
icr "Could not connect to wallet"
icr connect_req.err
return
ic "wallet connected"
let address_req = await wallet.getAddress()
if not address_req.ok:
icr "Could not get address"
icr address_req.err
return
let address = address_req.val.get
ic address
showHideModal()
connect_wallet_btn.el_strict.toggleHidden()
wallet_address_btn.el_strict.innerHTML = ($address)[0..5] & "..." & ($address)[^5..^1]
wallet_address_btn.el_strict.toggleHidden()
window.localStorage.setItem("user_wallet_address".cstring, address)
)
wallet_address_btn.el_strict.mouseout(
proc (e:Event) =
let address = "user_wallet_address".grab_val_from_local_storage_strict
wallet_address_btn.el_strict.innerHTML = ($address)[0..5] & "..." & ($address)[^5..^1]
)
wallet_address_btn.el_strict.mouseover(
proc (e:Event) =
wallet_address_btn.el_strict.innerHTML = "Disconnect"
)
wallet_address_btn.el_strict.click(
proc (e:Event) {.async.}=
ic "disconnecting wallet"
# let metamaskWallet = newMetaMaskWallet()
# let disconnect_req = await metamaskWallet.disconnect()
# if not disconnect_req.ok:
# icr "Could not disconnect"
# icr disconnect_req.err
# return
# ic "metamaskWallet disconnected"
)