@ckb-ccc/connector 0.0.4-alpha.8 → 0.0.5-alpha.0

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.
Files changed (111) hide show
  1. package/README.md +6 -0
  2. package/dist/advancedBarrel.d.ts +1 -0
  3. package/dist/advancedBarrel.d.ts.map +1 -1
  4. package/dist/advancedBarrel.js +1 -0
  5. package/dist/assets/chains/ckb.svg.d.ts +2 -0
  6. package/dist/assets/chains/ckb.svg.d.ts.map +1 -0
  7. package/dist/assets/chains/ckb.svg.js +2 -0
  8. package/dist/assets/chains/index.d.ts +1 -0
  9. package/dist/assets/chains/index.d.ts.map +1 -1
  10. package/dist/assets/chains/index.js +1 -0
  11. package/dist/assets/joy-id.svg.d.ts +2 -0
  12. package/dist/assets/joy-id.svg.d.ts.map +1 -0
  13. package/dist/assets/joy-id.svg.js +2 -0
  14. package/dist/assets/metamask.svg.d.ts +2 -0
  15. package/dist/assets/metamask.svg.d.ts.map +1 -0
  16. package/dist/assets/metamask.svg.js +2 -0
  17. package/dist/barrel.d.ts +1 -2
  18. package/dist/barrel.d.ts.map +1 -1
  19. package/dist/barrel.js +1 -2
  20. package/dist/connector/index.d.ts +19 -8
  21. package/dist/connector/index.d.ts.map +1 -1
  22. package/dist/connector/index.js +162 -59
  23. package/dist/events/index.d.ts +1 -12
  24. package/dist/events/index.d.ts.map +1 -1
  25. package/dist/events/index.js +2 -15
  26. package/dist/scenes/connecting.d.ts +2 -1
  27. package/dist/scenes/connecting.d.ts.map +1 -1
  28. package/dist/scenes/signers.d.ts +2 -1
  29. package/dist/scenes/signers.d.ts.map +1 -1
  30. package/dist/scenes/signers.js +3 -2
  31. package/dist/scenes/wallets.d.ts +2 -1
  32. package/dist/scenes/wallets.d.ts.map +1 -1
  33. package/dist/scenes/wallets.js +44 -9
  34. package/dist/types/index.d.ts +10 -0
  35. package/dist/types/index.d.ts.map +1 -0
  36. package/dist/types/index.js +1 -0
  37. package/dist.commonjs/advanced.d.ts +3 -0
  38. package/dist.commonjs/advanced.d.ts.map +1 -0
  39. package/dist.commonjs/advanced.js +56 -0
  40. package/dist.commonjs/advancedBarrel.d.ts +4 -0
  41. package/dist.commonjs/advancedBarrel.d.ts.map +1 -0
  42. package/dist.commonjs/advancedBarrel.js +35 -0
  43. package/dist.commonjs/assets/chains/btc.svg.d.ts +2 -0
  44. package/dist.commonjs/assets/chains/btc.svg.d.ts.map +1 -0
  45. package/dist.commonjs/assets/chains/btc.svg.js +7 -0
  46. package/dist.commonjs/assets/chains/eth.svg.d.ts +2 -0
  47. package/dist.commonjs/assets/chains/eth.svg.d.ts.map +1 -0
  48. package/dist.commonjs/assets/chains/eth.svg.js +7 -0
  49. package/dist.commonjs/assets/chains/index.d.ts +3 -0
  50. package/dist.commonjs/assets/chains/index.d.ts.map +1 -0
  51. package/dist.commonjs/assets/chains/index.js +34 -0
  52. package/dist.commonjs/assets/close.svg.d.ts +2 -0
  53. package/dist.commonjs/assets/close.svg.d.ts.map +1 -0
  54. package/dist.commonjs/assets/close.svg.js +7 -0
  55. package/dist.commonjs/assets/okx.svg.d.ts +2 -0
  56. package/dist.commonjs/assets/okx.svg.d.ts.map +1 -0
  57. package/dist.commonjs/assets/okx.svg.js +7 -0
  58. package/dist.commonjs/assets/retry.svg.d.ts +2 -0
  59. package/dist.commonjs/assets/retry.svg.d.ts.map +1 -0
  60. package/dist.commonjs/assets/retry.svg.js +7 -0
  61. package/dist.commonjs/assets/uni-sat.svg.d.ts +2 -0
  62. package/dist.commonjs/assets/uni-sat.svg.d.ts.map +1 -0
  63. package/dist.commonjs/assets/uni-sat.svg.js +7 -0
  64. package/dist.commonjs/assets/utils.d.ts +2 -0
  65. package/dist.commonjs/assets/utils.d.ts.map +1 -0
  66. package/dist.commonjs/assets/utils.js +7 -0
  67. package/dist.commonjs/barrel.d.ts +4 -0
  68. package/dist.commonjs/barrel.d.ts.map +1 -0
  69. package/dist.commonjs/barrel.js +35 -0
  70. package/dist.commonjs/connector/index.d.ts +33 -0
  71. package/dist.commonjs/connector/index.d.ts.map +1 -0
  72. package/dist.commonjs/connector/index.js +452 -0
  73. package/dist.commonjs/events/index.d.ts +4 -0
  74. package/dist.commonjs/events/index.d.ts.map +1 -0
  75. package/dist.commonjs/events/index.js +9 -0
  76. package/dist.commonjs/index.d.ts +3 -0
  77. package/dist.commonjs/index.d.ts.map +1 -0
  78. package/dist.commonjs/index.js +56 -0
  79. package/dist.commonjs/scenes/connecting.d.ts +10 -0
  80. package/dist.commonjs/scenes/connecting.d.ts.map +1 -0
  81. package/dist.commonjs/scenes/connecting.js +27 -0
  82. package/dist.commonjs/scenes/index.d.ts +4 -0
  83. package/dist.commonjs/scenes/index.d.ts.map +1 -0
  84. package/dist.commonjs/scenes/index.js +35 -0
  85. package/dist.commonjs/scenes/signers.d.ts +11 -0
  86. package/dist.commonjs/scenes/signers.d.ts.map +1 -0
  87. package/dist.commonjs/scenes/signers.js +39 -0
  88. package/dist.commonjs/scenes/wallets.d.ts +8 -0
  89. package/dist.commonjs/scenes/wallets.d.ts.map +1 -0
  90. package/dist.commonjs/scenes/wallets.js +30 -0
  91. package/dist.commonjs/tsconfig.commonjs.tsbuildinfo +1 -0
  92. package/dist.commonjs/types/index.d.ts +5 -0
  93. package/dist.commonjs/types/index.d.ts.map +1 -0
  94. package/dist.commonjs/types/index.js +2 -0
  95. package/package.json +3 -3
  96. package/src/advancedBarrel.ts +1 -0
  97. package/src/assets/chains/ckb.svg.ts +5 -0
  98. package/src/assets/chains/index.ts +1 -0
  99. package/src/assets/joy-id.svg.ts +5 -0
  100. package/src/assets/metamask.svg.ts +5 -0
  101. package/src/barrel.ts +1 -2
  102. package/src/connector/index.ts +217 -69
  103. package/src/events/index.ts +2 -20
  104. package/src/scenes/connecting.ts +6 -2
  105. package/src/scenes/signers.ts +9 -4
  106. package/src/scenes/wallets.ts +69 -22
  107. package/src/types/index.ts +11 -0
  108. package/dist/status/index.d.ts +0 -6
  109. package/dist/status/index.d.ts.map +0 -1
  110. package/dist/status/index.js +0 -6
  111. package/src/status/index.ts +0 -5
@@ -1,105 +1,243 @@
1
1
  import { ccc } from "@ckb-ccc/ccc";
2
- import { LitElement, css, html } from "lit";
2
+ import { LitElement, PropertyValues, css, html } from "lit";
3
3
  import { customElement, property, state } from "lit/decorators.js";
4
4
  import { CLOSE_SVG } from "../assets/close.svg";
5
+ import { JOY_ID_SVG } from "../assets/joy-id.svg";
5
6
  import { OKX_SVG } from "../assets/okx.svg";
6
7
  import { UNI_SAT_SVG } from "../assets/uni-sat.svg";
7
- import { CloseEvent, SignerChangedEvent, StatusChangedEvent } from "../events";
8
+ import { WillUpdateEvent } from "../events";
8
9
  import {
9
10
  generateConnectingScene,
10
11
  generateSignersScene,
11
12
  generateWalletsScene,
12
13
  } from "../scenes";
13
- import { ConnectorStatus } from "../status";
14
+ import { WalletWithSigners } from "../types";
15
+
16
+ enum Scene {
17
+ SelectingWallets = "SelectingWallets",
18
+ SelectingSigners = "SelectingSigners",
19
+ Connecting = "Connecting",
20
+ Connected = "Connected",
21
+ }
14
22
 
15
23
  @customElement("ccc-connector")
16
24
  export class WebComponentConnector extends LitElement {
17
25
  @state()
18
- private wallets: ccc.Wallet[] = [];
19
- private existedEip6963: string[] = [];
26
+ private wallets: WalletWithSigners[] = [];
20
27
 
21
- @property()
28
+ private resetListeners: (() => void)[] = [];
29
+
30
+ @state()
22
31
  public isOpen: boolean = false;
32
+ public setIsOpen(isOpen: boolean) {
33
+ this.isOpen = isOpen;
34
+ }
23
35
 
24
36
  @property()
37
+ public client: ccc.Client = new ccc.ClientPublicTestnet();
38
+ public setClient(client: ccc.Client) {
39
+ this.client = client;
40
+ }
41
+
42
+ @state()
43
+ private scene: Scene = Scene.SelectingWallets;
44
+ @state()
45
+ private selectedWallet?: WalletWithSigners;
46
+ @state()
47
+ private selectedSigner?: ccc.SignerInfo;
48
+
49
+ @state()
50
+ private walletName?: string;
51
+ @state()
52
+ private signerName?: string;
53
+ @state()
25
54
  public wallet?: ccc.Wallet;
26
- @property()
55
+ @state()
27
56
  public signer?: ccc.SignerInfo;
28
- @property()
29
- public status: ConnectorStatus = ConnectorStatus.SelectingSigner;
57
+ private prepareSigner() {
58
+ (async () => {
59
+ if (this.signer && (await this.signer.signer.isConnected())) {
60
+ this.scene = Scene.Connected;
61
+ return;
62
+ }
63
+
64
+ this.wallet = undefined;
65
+ this.signer = undefined;
66
+ this.scene = Scene.SelectingWallets;
67
+ })();
68
+ }
69
+
70
+ public disconnect() {
71
+ this.signer?.signer?.disconnect();
72
+ this.walletName = undefined;
73
+ this.signerName = undefined;
74
+ this.saveConnection();
75
+ }
76
+
77
+ private loadConnection() {
78
+ const {
79
+ signerName,
80
+ walletName,
81
+ }: { signerName?: string; walletName?: string } = JSON.parse(
82
+ window.localStorage.getItem("ccc-connection-info") ?? "{}",
83
+ );
84
+
85
+ this.signerName = signerName;
86
+ this.walletName = walletName;
87
+ }
88
+
89
+ private saveConnection() {
90
+ window.localStorage.setItem(
91
+ "ccc-connection-info",
92
+ JSON.stringify({
93
+ signerName: this.signerName,
94
+ walletName: this.walletName,
95
+ }),
96
+ );
97
+ }
30
98
 
31
99
  connectedCallback(): void {
32
100
  super.connectedCallback();
101
+ this.loadConnection();
102
+ this.reloadSigners();
103
+ }
104
+
105
+ willUpdate(changedProperties: PropertyValues): void {
106
+ if (changedProperties.has("client")) {
107
+ this.reloadSigners();
108
+ }
109
+ if (
110
+ changedProperties.has("walletName") ||
111
+ changedProperties.has("wallets")
112
+ ) {
113
+ this.wallet = this.wallets.find(({ name }) => name === this.walletName);
114
+ }
115
+ if (
116
+ changedProperties.has("signerName") ||
117
+ changedProperties.has("wallet")
118
+ ) {
119
+ const wallet = this.wallets.find(({ name }) => name === this.walletName);
120
+ this.signer = wallet?.signers.find(
121
+ ({ name }) => name === this.signerName,
122
+ );
123
+ }
124
+ if (changedProperties.has("signer")) {
125
+ this.prepareSigner();
126
+ }
127
+
128
+ this.dispatchEvent(new WillUpdateEvent());
129
+ }
130
+
131
+ private reloadSigners() {
132
+ this.wallets = [];
133
+
134
+ (async () => {
135
+ if (!this.signer) {
136
+ return;
137
+ }
33
138
 
34
- const client = new ccc.ClientPublicTestnet();
35
- const uniSatSigner = ccc.UniSat.getUniSatSigner(client);
139
+ this.signer = {
140
+ ...this.signer,
141
+ signer: await this.signer.signer.replaceClient(this.client),
142
+ };
143
+ })();
144
+
145
+ this.resetListeners.forEach((listener) => listener());
146
+ this.resetListeners = [];
147
+
148
+ ccc.JoyId.getJoyIdSigners(this.client).forEach(({ signer, type, name }) => {
149
+ this.addSigner("JoyID", name, JOY_ID_SVG, type, signer);
150
+ });
151
+
152
+ const uniSatSigner = ccc.UniSat.getUniSatSigner(this.client);
36
153
  if (uniSatSigner) {
37
- this.addSigner("UniSat", UNI_SAT_SVG, ccc.SignerType.BTC, uniSatSigner);
154
+ this.addSigner(
155
+ "UniSat",
156
+ "BTC",
157
+ UNI_SAT_SVG,
158
+ ccc.SignerType.BTC,
159
+ uniSatSigner,
160
+ );
38
161
  }
39
162
 
40
- const okxBitcoinSigner = ccc.Okx.getOKXBitcoinSigner(client);
163
+ const okxBitcoinSigner = ccc.Okx.getOKXBitcoinSigner(this.client);
41
164
  if (okxBitcoinSigner) {
42
165
  this.addSigner(
43
166
  "OKX Wallet",
167
+ "BTC",
44
168
  OKX_SVG,
45
169
  ccc.SignerType.BTC,
46
170
  okxBitcoinSigner,
47
171
  );
48
172
  }
49
173
 
50
- const eip6963Manager = new ccc.Eip6963.SignerFactory(client);
51
- eip6963Manager.subscribeSigners((signer) => {
52
- if (this.existedEip6963.indexOf(signer.detail.info.uuid) !== -1) {
53
- return;
54
- }
55
- this.existedEip6963.push(signer.detail.info.uuid);
56
- this.addSigner(
57
- `${signer.detail.info.name}`,
58
- signer.detail.info.icon,
59
- ccc.SignerType.EVM,
60
- signer,
61
- );
62
- });
174
+ const eip6963Manager = new ccc.Eip6963.SignerFactory(this.client);
175
+ this.resetListeners.push(
176
+ eip6963Manager.subscribeSigners((signer) => {
177
+ this.addSigner(
178
+ `${signer.detail.info.name}`,
179
+ "EVM",
180
+ signer.detail.info.icon,
181
+ ccc.SignerType.EVM,
182
+ signer,
183
+ );
184
+ }),
185
+ );
63
186
  }
64
187
 
65
- addSigner(
66
- name: string,
188
+ private addSigner(
189
+ walletName: string,
190
+ signerName: string,
67
191
  icon: string,
68
192
  type: ccc.SignerType,
69
193
  signer: ccc.Signer,
70
194
  ) {
71
- const wallet = this.wallets.find((wallet) => wallet.name === name);
72
- if (wallet) {
73
- wallet.signers.push({ type, signer });
74
- this.wallets = [...this.wallets];
75
- } else {
76
- this.wallets = [
77
- ...this.wallets,
78
- {
79
- name,
80
- icon,
81
- signers: [{ type, signer }],
82
- },
83
- ];
195
+ let updated = false;
196
+ const wallets = this.wallets.map((wallet) => {
197
+ if (wallet.name !== walletName) {
198
+ return wallet;
199
+ }
200
+
201
+ updated = true;
202
+ return {
203
+ ...wallet,
204
+ signers: [...wallet.signers, { type, name: signerName, signer }],
205
+ };
206
+ });
207
+
208
+ if (!updated) {
209
+ wallets.push({
210
+ name: walletName,
211
+ icon,
212
+ signers: [{ type, name: signerName, signer }],
213
+ });
84
214
  }
215
+
216
+ this.wallets = wallets;
85
217
  }
86
218
 
87
219
  render() {
88
220
  const [title, body] = (() => {
89
- if (!this.wallet) {
221
+ if (this.scene === Scene.SelectingWallets || !this.selectedWallet) {
90
222
  return generateWalletsScene(
91
223
  this.wallets,
92
- this.onWalletSelected,
93
- this.onSignerSelected,
224
+ (wallet) => {
225
+ this.selectedWallet = wallet;
226
+ this.scene = Scene.SelectingSigners;
227
+ },
228
+ this.signerSelectedHandler,
94
229
  );
95
230
  }
96
- if (!this.signer) {
97
- return generateSignersScene(this.wallet, this.onSignerSelected);
231
+ if (this.scene === Scene.SelectingSigners || !this.selectedSigner) {
232
+ return generateSignersScene(
233
+ this.selectedWallet,
234
+ this.signerSelectedHandler,
235
+ );
98
236
  }
99
237
  return generateConnectingScene(
100
- this.wallet,
101
- this.signer,
102
- this.onSignerSelected,
238
+ this.selectedWallet,
239
+ this.selectedSigner,
240
+ this.signerSelectedHandler,
103
241
  );
104
242
  })();
105
243
 
@@ -111,7 +249,6 @@ export class WebComponentConnector extends LitElement {
111
249
  --btn-primary: #f8f8f8;
112
250
  --btn-primary-hover: #efeeee;
113
251
  --btn-secondary: #ddd;
114
- --btn-icon: #e9e4de;
115
252
  color: #1e1e1e;
116
253
  --tip-color: #666;
117
254
  }
@@ -120,7 +257,7 @@ export class WebComponentConnector extends LitElement {
120
257
  class="background"
121
258
  @click=${(event: Event) => {
122
259
  if (event.target === event.currentTarget) {
123
- this.onClose();
260
+ this.closedHandler();
124
261
  }
125
262
  }}
126
263
  >
@@ -128,30 +265,45 @@ export class WebComponentConnector extends LitElement {
128
265
  <div class="header text-bold fs-big">
129
266
  <div class="back"></div>
130
267
  ${title}
131
- <img class="close" src=${CLOSE_SVG} @click=${this.onClose} />
268
+ <img class="close" src=${CLOSE_SVG} @click=${this.closedHandler} />
132
269
  </div>
133
270
  <div class="body">${body}</div>
134
271
  </div>
135
272
  </div>`;
136
273
  }
137
274
 
138
- private onClose = () => {
139
- this.dispatchEvent(new SignerChangedEvent());
140
- this.dispatchEvent(new CloseEvent());
141
- };
142
-
143
- private onWalletSelected = (wallet: ccc.Wallet) => {
144
- this.dispatchEvent(new SignerChangedEvent(wallet, this.signer));
275
+ private closedHandler = () => {
276
+ if (
277
+ [
278
+ Scene.SelectingSigners,
279
+ Scene.SelectingWallets,
280
+ Scene.Connecting,
281
+ ].includes(this.scene)
282
+ ) {
283
+ this.scene = Scene.SelectingWallets;
284
+ this.selectedSigner = undefined;
285
+ this.selectedWallet = undefined;
286
+ }
287
+ this.isOpen = false;
145
288
  };
146
289
 
147
- private onSignerSelected = (wallet: ccc.Wallet, signer: ccc.SignerInfo) => {
148
- this.dispatchEvent(new StatusChangedEvent(ConnectorStatus.Connecting));
149
- this.dispatchEvent(new SignerChangedEvent(wallet, signer));
150
-
290
+ private signerSelectedHandler = (
291
+ wallet: WalletWithSigners,
292
+ signer: ccc.SignerInfo,
293
+ ) => {
294
+ this.scene = Scene.Connecting;
295
+ this.selectedWallet = wallet;
296
+ this.selectedSigner = signer;
151
297
  (async () => {
152
298
  await signer.signer.connect();
153
- this.dispatchEvent(new StatusChangedEvent(ConnectorStatus.Idle));
154
- this.dispatchEvent(new CloseEvent());
299
+ if (!(await signer.signer.isConnected())) {
300
+ return;
301
+ }
302
+ this.scene = Scene.Connected;
303
+ this.walletName = wallet.name;
304
+ this.signerName = signer.name;
305
+ this.saveConnection();
306
+ this.closedHandler();
155
307
  })();
156
308
  };
157
309
 
@@ -252,8 +404,6 @@ export class WebComponentConnector extends LitElement {
252
404
  width: 2rem;
253
405
  height: 2rem;
254
406
  margin-right: 1rem;
255
- border-radius: 0.4rem;
256
- background: var(--btn-icon);
257
407
  }
258
408
 
259
409
  .btn-primary:hover {
@@ -279,8 +429,6 @@ export class WebComponentConnector extends LitElement {
279
429
  width: 4rem;
280
430
  height: 4rem;
281
431
  margin-bottom: 0.5rem;
282
- border-radius: 0.8rem;
283
- background: var(--btn-icon);
284
432
  }
285
433
 
286
434
  .connecting-wallet-icon {
@@ -1,23 +1,5 @@
1
- import { ccc } from "@ckb-ccc/ccc";
2
- import { ConnectorStatus } from "../status";
3
-
4
- export class SignerChangedEvent extends Event {
5
- constructor(
6
- public readonly wallet?: ccc.Wallet,
7
- public readonly signerInfo?: ccc.SignerInfo,
8
- ) {
9
- super("signerChanged", { composed: true });
10
- }
11
- }
12
-
13
- export class StatusChangedEvent extends Event {
14
- constructor(public readonly status: ConnectorStatus) {
15
- super("statusChanged", { composed: true });
16
- }
17
- }
18
-
19
- export class CloseEvent extends Event {
1
+ export class WillUpdateEvent extends Event {
20
2
  constructor() {
21
- super("close", { composed: true });
3
+ super("willUpdate", { composed: true });
22
4
  }
23
5
  }
@@ -1,11 +1,15 @@
1
1
  import { ccc } from "@ckb-ccc/ccc";
2
2
  import { html } from "lit";
3
3
  import { RETRY_SVG } from "../assets/retry.svg";
4
+ import { WalletWithSigners } from "../types";
4
5
 
5
6
  export function generateConnectingScene(
6
- wallet: ccc.Wallet,
7
+ wallet: WalletWithSigners,
7
8
  signer: ccc.SignerInfo,
8
- onSignerSelected: (wallet: ccc.Wallet, signer: ccc.SignerInfo) => unknown,
9
+ onSignerSelected: (
10
+ wallet: WalletWithSigners,
11
+ signer: ccc.SignerInfo,
12
+ ) => unknown,
9
13
  ) {
10
14
  return [
11
15
  wallet.name,
@@ -1,18 +1,23 @@
1
1
  import { ccc } from "@ckb-ccc/ccc";
2
2
  import { html } from "lit";
3
3
  import { repeat } from "lit/directives/repeat.js";
4
- import { BTC_SVG, ETH_SVG } from "../assets/chains";
4
+ import { BTC_SVG, CKB_SVG, ETH_SVG } from "../assets/chains";
5
+ import { WalletWithSigners } from "../types";
5
6
 
6
7
  export function signerTypeToIcon(type: ccc.SignerType): string {
7
8
  return {
8
9
  [ccc.SignerType.BTC]: BTC_SVG,
9
10
  [ccc.SignerType.EVM]: ETH_SVG,
11
+ [ccc.SignerType.CKB]: CKB_SVG,
10
12
  }[type];
11
13
  }
12
14
 
13
15
  export function generateSignersScene(
14
- wallet: ccc.Wallet,
15
- onSignerSelected: (wallet: ccc.Wallet, signer: ccc.SignerInfo) => unknown,
16
+ wallet: WalletWithSigners,
17
+ onSignerSelected: (
18
+ wallet: WalletWithSigners,
19
+ signer: ccc.SignerInfo,
20
+ ) => unknown,
16
21
  ) {
17
22
  return [
18
23
  "Select a Chain",
@@ -31,7 +36,7 @@ export function generateSignersScene(
31
36
  }}
32
37
  >
33
38
  <img src=${signerTypeToIcon(signer.type)} alt=${signer.type} />
34
- ${signer.type}
39
+ ${signer.name}
35
40
  </button>
36
41
  `,
37
42
  )}
@@ -1,32 +1,79 @@
1
1
  import { ccc } from "@ckb-ccc/ccc";
2
2
  import { html } from "lit";
3
3
  import { repeat } from "lit/directives/repeat.js";
4
+ import { METAMASK_SVG } from "../assets/metamask.svg";
5
+ import { OKX_SVG } from "../assets/okx.svg";
6
+ import { UNI_SAT_SVG } from "../assets/uni-sat.svg";
7
+ import { WalletInfo, WalletWithSigners } from "../types";
4
8
 
5
9
  export function generateWalletsScene(
6
- wallets: ccc.Wallet[],
7
- onWalletSelected: (wallet: ccc.Wallet) => unknown,
8
- onSignerSelected: (wallet: ccc.Wallet, signer: ccc.SignerInfo) => unknown,
10
+ wallets: WalletWithSigners[],
11
+ onWalletSelected: (wallet: WalletWithSigners) => unknown,
12
+ onSignerSelected: (
13
+ wallet: WalletWithSigners,
14
+ signer: ccc.SignerInfo,
15
+ ) => unknown,
9
16
  ) {
17
+ const recommendedWallets = [
18
+ {
19
+ name: "MetaMask",
20
+ icon: METAMASK_SVG,
21
+ downloadLink: `https://metamask.app.link/dapp/${window.location.href}`,
22
+ },
23
+ {
24
+ name: "OKX Wallet",
25
+ icon: OKX_SVG,
26
+ downloadLink: "https://www.okx.com/zh-hans/download",
27
+ },
28
+ {
29
+ name: "UniSat",
30
+ icon: UNI_SAT_SVG,
31
+ downloadLink: "https://unisat.io/",
32
+ },
33
+ ];
34
+
35
+ const missingWallets = recommendedWallets.filter(
36
+ (recommendedWallet) =>
37
+ !wallets.some((wallet) => wallet.name === recommendedWallet.name),
38
+ );
39
+
40
+ const additionalButtons = missingWallets.map(
41
+ (wallet: WalletInfo) => html`
42
+ <button
43
+ class="btn-primary mb-1"
44
+ @click=${() => {
45
+ window.open(wallet.downloadLink, "_blank");
46
+ }}
47
+ >
48
+ <img src=${wallet.icon} alt=${wallet.name} />
49
+ ${wallet.name}
50
+ </button>
51
+ `,
52
+ );
53
+
10
54
  return [
11
55
  "Connect Wallet",
12
- repeat(
13
- wallets,
14
- (wallet) => wallet.name,
15
- (wallet) => html`
16
- <button
17
- class="btn-primary mb-1"
18
- @click=${async () => {
19
- if (wallet.signers.length === 1) {
20
- onSignerSelected(wallet, wallet.signers[0]);
21
- } else {
22
- onWalletSelected(wallet);
23
- }
24
- }}
25
- >
26
- <img src=${wallet.icon} alt=${wallet.name} />
27
- ${wallet.name}
28
- </button>
29
- `,
30
- ),
56
+ html`
57
+ ${repeat(
58
+ wallets,
59
+ (wallet) => wallet.name,
60
+ (wallet) => html`
61
+ <button
62
+ class="btn-primary mb-1"
63
+ @click=${async () => {
64
+ if (wallet.signers.length === 1) {
65
+ onSignerSelected(wallet, wallet.signers[0]);
66
+ } else {
67
+ onWalletSelected(wallet);
68
+ }
69
+ }}
70
+ >
71
+ <img src=${wallet.icon} alt=${wallet.name} />
72
+ ${wallet.name}
73
+ </button>
74
+ `,
75
+ )}
76
+ ${additionalButtons}
77
+ `,
31
78
  ];
32
79
  }
@@ -0,0 +1,11 @@
1
+ import { ccc } from "@ckb-ccc/ccc";
2
+
3
+ export type WalletWithSigners = ccc.Wallet & {
4
+ signers: ccc.SignerInfo[];
5
+ };
6
+
7
+ export interface WalletInfo {
8
+ name: string;
9
+ icon: string;
10
+ downloadLink: string;
11
+ }
@@ -1,6 +0,0 @@
1
- export declare enum ConnectorStatus {
2
- SelectingSigner = "SelectingSigner",
3
- Connecting = "Connecting",
4
- Idle = "Idle"
5
- }
6
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/status/index.ts"],"names":[],"mappings":"AAAA,oBAAY,eAAe;IACzB,eAAe,oBAAoB;IACnC,UAAU,eAAe;IACzB,IAAI,SAAS;CACd"}
@@ -1,6 +0,0 @@
1
- export var ConnectorStatus;
2
- (function (ConnectorStatus) {
3
- ConnectorStatus["SelectingSigner"] = "SelectingSigner";
4
- ConnectorStatus["Connecting"] = "Connecting";
5
- ConnectorStatus["Idle"] = "Idle";
6
- })(ConnectorStatus || (ConnectorStatus = {}));
@@ -1,5 +0,0 @@
1
- export enum ConnectorStatus {
2
- SelectingSigner = "SelectingSigner",
3
- Connecting = "Connecting",
4
- Idle = "Idle",
5
- }