@ckb-ccc/connector 0.0.9-alpha.2 → 0.0.10-alpha.1

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 (76) hide show
  1. package/dist/assets/chains/index.d.ts +1 -0
  2. package/dist/assets/chains/index.d.ts.map +1 -1
  3. package/dist/assets/chains/index.js +1 -0
  4. package/dist/barrel.d.ts +2 -1
  5. package/dist/barrel.d.ts.map +1 -1
  6. package/dist/barrel.js +2 -1
  7. package/dist/components/button-pill.d.ts +7 -0
  8. package/dist/components/button-pill.d.ts.map +1 -0
  9. package/dist/components/button-pill.js +54 -0
  10. package/dist/components/button.d.ts +7 -0
  11. package/dist/components/button.d.ts.map +1 -0
  12. package/dist/components/button.js +60 -0
  13. package/dist/components/copy-button.d.ts +10 -0
  14. package/dist/components/copy-button.d.ts.map +1 -0
  15. package/dist/components/copy-button.js +76 -0
  16. package/dist/components/dialog.d.ts +8 -0
  17. package/dist/components/dialog.d.ts.map +1 -0
  18. package/dist/components/dialog.js +103 -0
  19. package/dist/components/index.d.ts +5 -0
  20. package/dist/components/index.d.ts.map +1 -0
  21. package/dist/components/index.js +4 -0
  22. package/dist/connector/index.d.ts +8 -21
  23. package/dist/connector/index.d.ts.map +1 -1
  24. package/dist/connector/index.js +59 -496
  25. package/dist/scenes/connected.d.ts +12 -1
  26. package/dist/scenes/connected.d.ts.map +1 -1
  27. package/dist/scenes/connected.js +204 -59
  28. package/dist/scenes/index.d.ts +2 -3
  29. package/dist/scenes/index.d.ts.map +1 -1
  30. package/dist/scenes/index.js +2 -3
  31. package/dist/scenes/{connecting.d.ts → selecting/connecting.d.ts} +1 -1
  32. package/dist/scenes/selecting/connecting.d.ts.map +1 -0
  33. package/dist/scenes/{connecting.js → selecting/connecting.js} +5 -5
  34. package/dist/scenes/selecting/index.d.ts +19 -0
  35. package/dist/scenes/selecting/index.d.ts.map +1 -0
  36. package/dist/scenes/selecting/index.js +164 -0
  37. package/dist/scenes/{signers.d.ts → selecting/signers.d.ts} +1 -1
  38. package/dist/scenes/selecting/signers.d.ts.map +1 -0
  39. package/dist/scenes/{signers.js → selecting/signers.js} +6 -7
  40. package/dist/scenes/{wallets.d.ts → selecting/wallets.d.ts} +1 -1
  41. package/dist/scenes/selecting/wallets.d.ts.map +1 -0
  42. package/dist/scenes/{wallets.js → selecting/wallets.js} +3 -3
  43. package/dist/signers/index.d.ts +28 -0
  44. package/dist/signers/index.d.ts.map +1 -0
  45. package/dist/signers/index.js +104 -0
  46. package/package.json +3 -3
  47. package/src/assets/chains/index.ts +1 -0
  48. package/src/barrel.ts +3 -1
  49. package/src/components/button-pill.ts +48 -0
  50. package/src/components/button.ts +54 -0
  51. package/src/components/copy-button.ts +69 -0
  52. package/src/components/dialog.ts +97 -0
  53. package/src/components/index.ts +4 -0
  54. package/src/connector/index.ts +67 -596
  55. package/src/scenes/connected.ts +197 -68
  56. package/src/scenes/index.ts +2 -3
  57. package/src/scenes/{connecting.ts → selecting/connecting.ts} +6 -6
  58. package/src/scenes/selecting/index.ts +181 -0
  59. package/src/scenes/{signers.ts → selecting/signers.ts} +7 -8
  60. package/src/scenes/{wallets.ts → selecting/wallets.ts} +4 -4
  61. package/src/signers/index.ts +186 -0
  62. package/dist/assets/chains/ckb.sm.svg.d.ts +0 -2
  63. package/dist/assets/chains/ckb.sm.svg.d.ts.map +0 -1
  64. package/dist/assets/chains/ckb.sm.svg.js +0 -2
  65. package/dist/assets/copy.svg.d.ts +0 -2
  66. package/dist/assets/copy.svg.d.ts.map +0 -1
  67. package/dist/assets/copy.svg.js +0 -2
  68. package/dist/events/index.d.ts +0 -7
  69. package/dist/events/index.d.ts.map +0 -1
  70. package/dist/events/index.js +0 -10
  71. package/dist/scenes/connecting.d.ts.map +0 -1
  72. package/dist/scenes/signers.d.ts.map +0 -1
  73. package/dist/scenes/wallets.d.ts.map +0 -1
  74. package/src/assets/chains/ckb.sm.svg.ts +0 -5
  75. package/src/assets/copy.svg.ts +0 -5
  76. package/src/events/index.ts +0 -11
@@ -1,22 +1,14 @@
1
1
  import { ccc } from "@ckb-ccc/ccc";
2
- import { html } from "lit";
2
+ import { css, html, LitElement, PropertyValues } from "lit";
3
+ import { customElement, property, state } from "lit/decorators.js";
3
4
  import { CKB_SVG } from "../assets/chains";
4
- import { COPY_SVG } from "../assets/copy.svg";
5
5
  import { DISCONNECT_SVG } from "../assets/diconnect.svg";
6
- import { signerTypeToIcon } from "./signers";
7
-
8
- function copyAddress(address?: string) {
9
- if (!address) {
10
- return;
11
- }
12
-
13
- return window.navigator.clipboard.writeText(address);
14
- }
6
+ import { signerTypeToIcon } from "./selecting/signers";
15
7
 
16
8
  export function formatString(
17
9
  str: string | undefined,
18
- l = 7,
19
- r = 5,
10
+ l = 9,
11
+ r = 6,
20
12
  ): string | undefined {
21
13
  if (str && str.length > l + r + 3) {
22
14
  return `${str.slice(0, l)}...${str.slice(-r)}`;
@@ -24,61 +16,198 @@ export function formatString(
24
16
  return str;
25
17
  }
26
18
 
27
- export function generateConnectedScene(
28
- wallet: ccc.Wallet,
29
- signer: ccc.SignerInfo,
30
- recommendedAddress: string | undefined,
31
- internalAddress: string | undefined,
32
- balance: ccc.Num | undefined,
33
- disconnect: () => void,
34
- ) {
35
- return [
36
- undefined,
37
- html`
38
- <div class="position-relative">
39
- <img
40
- class="connecting-wallet-icon"
41
- src=${wallet.icon}
42
- alt=${wallet.name}
43
- />
44
- <img
45
- class="connected-type-icon"
46
- src=${signerTypeToIcon(signer.signer.type)}
47
- alt=${signer.signer.type}
19
+ @customElement("ccc-connected-scene")
20
+ export class ConnectedScene extends LitElement {
21
+ @property()
22
+ public wallet?: ccc.Wallet;
23
+ @property()
24
+ public signer?: ccc.Signer;
25
+
26
+ @state()
27
+ private recommendedAddress?: string;
28
+ @state()
29
+ private internalAddress?: string;
30
+ @state()
31
+ private balance?: ccc.Num;
32
+
33
+ willUpdate(changedProperties: PropertyValues<this>): void {
34
+ if (changedProperties.has("signer") && this.signer) {
35
+ this.signer
36
+ .getRecommendedAddress()
37
+ .then((v) => (this.recommendedAddress = v));
38
+ this.signer.getInternalAddress().then((v) => (this.internalAddress = v));
39
+ this.signer.getBalance().then((v) => (this.balance = v));
40
+ }
41
+ }
42
+
43
+ render() {
44
+ const { wallet, signer, internalAddress, balance, recommendedAddress } =
45
+ this;
46
+ if (!wallet || !signer) {
47
+ return html`<div></div>`;
48
+ }
49
+
50
+ return html`
51
+ <ccc-dialog>
52
+ <div class="position-relative">
53
+ <img
54
+ class="connecting-wallet-icon"
55
+ src=${wallet.icon}
56
+ alt=${wallet.name}
57
+ />
58
+ <img
59
+ class="connected-type-icon"
60
+ src=${signerTypeToIcon(signer.type)}
61
+ alt=${signer.type}
62
+ />
63
+ </div>
64
+
65
+ <ccc-copy-button
66
+ value=${recommendedAddress}
67
+ class="text-bold fs-xl mt-2"
68
+ >
69
+ ${formatString(recommendedAddress)}
70
+ </ccc-copy-button>
71
+ <div class="text-bold fs-md">
72
+ ${ccc.fixedPointToString(balance ?? ccc.Zero)} CKB
73
+ </div>
74
+ <ccc-copy-button
75
+ value=${internalAddress}
76
+ class="text-bold text-tip fs-md"
77
+ style="margin-top: 0.5rem"
48
78
  >
49
- </img>
50
- </div>
51
-
52
- <div class="flex align-center mt-2">
53
- <span class="text-bold fs-xl">${formatString(internalAddress)}</span>
54
- <img class="cursor-pointer copy-btn" src=${COPY_SVG} alt="copy" @click=${() => copyAddress(internalAddress)}/>
55
- </div>
56
- <div class="text-bold fs-md">${ccc.fixedPointToString(balance ?? ccc.Zero)} CKB</div>
57
- <div class="flex align-center">
58
- <span class="text-bold text-tip fs-md">${formatString(recommendedAddress, 13, 7)}</span>
59
- <img class="cursor-pointer copy-btn-sm" src=${COPY_SVG} alt="copy" @click=${() => copyAddress(recommendedAddress)}/>
60
- </div>
61
-
62
- <button
63
- class="btn-primary mt-2"
64
- @click=${disconnect}
65
- >
66
- <img
67
- src=${DISCONNECT_SVG}
68
- alt="disconnect"
69
- />
70
- Disconnect
71
- </button>
72
-
73
- <div class="switch-btn-container align-center flex justify-center mt-1">
74
- <div class="switch-line"></div>
75
- <div class="switch-content flex align-center ml-2 mr-2 fs-sm">
76
- <img class="mr-1 sm-chain-logo" src=${CKB_SVG} alt="Nervos Network">
77
- ${signer.signer.client.addressPrefix === "ckb" ? "Mainnet" : "Testnet"}
78
- ${["ckb", "ckt"].includes(signer.signer.client.addressPrefix) ? "" : ` ${signer.signer.client.addressPrefix}`}
79
+ ${formatString(internalAddress, 11, 9)}
80
+ </ccc-copy-button>
81
+
82
+ <ccc-button
83
+ class="mt-2"
84
+ @click=${() => this.dispatchEvent(new Event("disconnect"))}
85
+ >
86
+ <img src=${DISCONNECT_SVG} alt="disconnect" />
87
+ Disconnect
88
+ </ccc-button>
89
+
90
+ <div class="switch-btn-container">
91
+ <div class="switch-line"></div>
92
+ <div class="switch-content ml-2 mr-2 fs-sm">
93
+ <img
94
+ class="mr-1 sm-chain-logo"
95
+ src=${CKB_SVG}
96
+ alt="Nervos Network"
97
+ />
98
+ ${signer.client.addressPrefix === "ckb" ? "Mainnet" : "Testnet"}
99
+ ${["ckb", "ckt"].includes(signer.client.addressPrefix)
100
+ ? ""
101
+ : ` ${signer.client.addressPrefix}`}
102
+ </div>
103
+ <div class="switch-line"></div>
79
104
  </div>
80
- <div class="switch-line"></div>
81
- </div>
82
- `,
83
- ];
105
+ </ccc-dialog>
106
+ `;
107
+ }
108
+
109
+ static styles = css`
110
+ :host {
111
+ width: 100%;
112
+ display: flex;
113
+ flex-direction: column;
114
+ align-items: center;
115
+ }
116
+ .text-bold {
117
+ font-weight: bold;
118
+ }
119
+
120
+ .text-tip {
121
+ color: var(--tip-color);
122
+ }
123
+
124
+ .fs-sm {
125
+ font-size: 0.8rem;
126
+ }
127
+ .fs-md {
128
+ font-size: 1rem;
129
+ }
130
+ .fs-xl {
131
+ font-size: 1.5rem;
132
+ }
133
+
134
+ .mt-1 {
135
+ margin-top: 0.7rem;
136
+ }
137
+ .mt-2 {
138
+ margin-top: 1rem;
139
+ }
140
+ .ml-2 {
141
+ margin-left: 1em;
142
+ }
143
+ .mr-1 {
144
+ margin-right: 0.7rem;
145
+ }
146
+ .mr-2 {
147
+ margin-right: 1rem;
148
+ }
149
+
150
+ .connecting-wallet-icon {
151
+ width: 5rem;
152
+ height: 5rem;
153
+ border-radius: 1rem;
154
+ }
155
+
156
+ .position-relative {
157
+ position: relative;
158
+ }
159
+
160
+ .connected-type-icon {
161
+ position: absolute;
162
+ width: 1.5rem;
163
+ height: 1.5rem;
164
+ right: -0.5rem;
165
+ bottom: -0.5rem;
166
+ }
167
+
168
+ .switch-btn-container {
169
+ width: 100%;
170
+ margin-top: 1.2rem;
171
+ margin-bottom: 0.2rem;
172
+ display: flex;
173
+ justify-content: center;
174
+ align-items: center;
175
+ }
176
+
177
+ .switch-content {
178
+ display: flex;
179
+ align-items: center;
180
+ }
181
+
182
+ .switch-line {
183
+ flex: 1;
184
+ height: 1px;
185
+ background-color: var(--divider);
186
+ }
187
+
188
+ .switching-status-dot {
189
+ width: 0.5rem;
190
+ height: 0.5rem;
191
+ background: #0f0;
192
+ border-radius: 50%;
193
+ }
194
+
195
+ .copy-btn {
196
+ width: 1.5rem;
197
+ height: 1.5rem;
198
+ }
199
+
200
+ .copy-btn-sm {
201
+ width: 1rem;
202
+ height: 1rem;
203
+ }
204
+
205
+ .sm-chain-logo {
206
+ width: 1.125rem;
207
+ }
208
+ `;
209
+
210
+ updated() {
211
+ this.dispatchEvent(new Event("updated", { bubbles: true, composed: true }));
212
+ }
84
213
  }
@@ -1,3 +1,2 @@
1
- export * from "./connecting";
2
- export * from "./signers";
3
- export * from "./wallets";
1
+ import "./connected";
2
+ import "./selecting";
@@ -1,7 +1,7 @@
1
1
  import { ccc } from "@ckb-ccc/ccc";
2
2
  import { html } from "lit";
3
- import { RETRY_SVG } from "../assets/retry.svg";
4
- import { WalletWithSigners } from "../types";
3
+ import { RETRY_SVG } from "../../assets/retry.svg";
4
+ import { WalletWithSigners } from "../../types";
5
5
 
6
6
  export function generateConnectingScene(
7
7
  wallet: WalletWithSigners,
@@ -16,7 +16,7 @@ export function generateConnectingScene(
16
16
  wallet.name,
17
17
  html`
18
18
  <img
19
- class="connecting-wallet-icon mb-1"
19
+ class="connecting-wallet-icon mb-1 mt-1"
20
20
  src=${wallet.icon}
21
21
  alt=${wallet.name}
22
22
  />
@@ -28,13 +28,13 @@ export function generateConnectingScene(
28
28
  <span class="text-tip text-center"
29
29
  >${error ?? "Confirm connection in the wallet"}</span
30
30
  >
31
- <button
32
- class="btn-secondary mt-2 mb-2"
31
+ <ccc-button-pill
32
+ class="mt-2"
33
33
  @click=${() => onSignerSelected(wallet, signer)}
34
34
  >
35
35
  <img src=${RETRY_SVG} alt="retry" />
36
36
  Try again
37
- </button>
37
+ </ccc-button-pill>
38
38
  `,
39
39
  ];
40
40
  }
@@ -0,0 +1,181 @@
1
+ import { ccc } from "@ckb-ccc/ccc";
2
+ import { css, html, LitElement } from "lit";
3
+ import { customElement, property, state } from "lit/decorators.js";
4
+ import { WalletWithSigners } from "../../types";
5
+ import { generateConnectingScene } from "./connecting";
6
+ import { generateSignersScene } from "./signers";
7
+ import { generateWalletsScene } from "./wallets";
8
+
9
+ export class ConnectedEvent extends Event {
10
+ constructor(
11
+ public readonly walletName: string,
12
+ public readonly signerName: string,
13
+ ) {
14
+ super("connected");
15
+ }
16
+ }
17
+
18
+ @customElement("ccc-selecting-scene")
19
+ export class SelectingScene extends LitElement {
20
+ @property()
21
+ public wallets?: WalletWithSigners[];
22
+
23
+ @state()
24
+ private selectedWallet?: WalletWithSigners;
25
+ @state()
26
+ private selectedSigner?: ccc.SignerInfo;
27
+ @state()
28
+ private connectingError?: string;
29
+
30
+ render() {
31
+ const [title, body] = (() => {
32
+ if (!this.selectedWallet) {
33
+ return generateWalletsScene(
34
+ this.wallets ?? [],
35
+ (wallet) => {
36
+ this.selectedWallet = wallet;
37
+ },
38
+ this.signerSelectedHandler,
39
+ );
40
+ }
41
+ if (!this.selectedSigner) {
42
+ return generateSignersScene(
43
+ this.selectedWallet,
44
+ this.signerSelectedHandler,
45
+ );
46
+ }
47
+
48
+ return generateConnectingScene(
49
+ this.selectedWallet,
50
+ this.selectedSigner,
51
+ this.connectingError,
52
+ this.signerSelectedHandler,
53
+ );
54
+ })();
55
+
56
+ return html`<ccc-dialog
57
+ header=${title}
58
+ ?canBack=${this.selectedSigner || this.selectedWallet}
59
+ @close=${() => {
60
+ this.onClose();
61
+ }}
62
+ @back=${() => {
63
+ if (
64
+ !this.selectedSigner ||
65
+ (this.selectedWallet && this.selectedWallet.signers.length <= 1)
66
+ ) {
67
+ this.selectedWallet = undefined;
68
+ }
69
+ this.selectedSigner = undefined;
70
+ this.connectingError = undefined;
71
+ }}
72
+ >
73
+ ${body}
74
+ </ccc-dialog>`;
75
+ }
76
+
77
+ public onClose() {
78
+ this.selectedWallet = undefined;
79
+ this.selectedSigner = undefined;
80
+ this.connectingError = undefined;
81
+ }
82
+
83
+ private signerSelectedHandler = (
84
+ wallet: WalletWithSigners,
85
+ signerInfo: ccc.SignerInfo,
86
+ ) => {
87
+ this.connectingError = undefined;
88
+ this.selectedWallet = wallet;
89
+ this.selectedSigner = signerInfo;
90
+ (async () => {
91
+ const { signer } = signerInfo;
92
+ try {
93
+ await signer.connect();
94
+ } catch (error) {
95
+ if (typeof error !== "object" || error === null) {
96
+ this.connectingError = JSON.stringify(error);
97
+ return;
98
+ }
99
+
100
+ if (!("message" in error)) {
101
+ this.connectingError = "Unknown error";
102
+ return;
103
+ }
104
+
105
+ const message = error.message;
106
+ if (typeof message === "string") {
107
+ this.connectingError = message;
108
+ return;
109
+ }
110
+
111
+ this.connectingError = JSON.stringify(message);
112
+ }
113
+ if (!(await signer.isConnected())) {
114
+ return;
115
+ }
116
+
117
+ this.dispatchEvent(new Event("close", { bubbles: true, composed: true }));
118
+ this.dispatchEvent(new ConnectedEvent(wallet.name, signerInfo.name));
119
+ })();
120
+ };
121
+
122
+ static styles = css`
123
+ :host {
124
+ display: block;
125
+ }
126
+
127
+ .text-bold {
128
+ font-weight: bold;
129
+ }
130
+
131
+ .text-tip {
132
+ color: var(--tip-color);
133
+ }
134
+
135
+ .mb-1 {
136
+ margin-bottom: 0.7rem;
137
+ }
138
+ .mb-2 {
139
+ margin-bottom: 1rem;
140
+ }
141
+ .mt-1 {
142
+ margin-top: 0.7rem;
143
+ }
144
+ .mt-2 {
145
+ margin-top: 1rem;
146
+ }
147
+ .ml-1 {
148
+ margin-left: 0.7rem;
149
+ }
150
+ .ml-2 {
151
+ margin-left: 1em;
152
+ }
153
+ .mr-1 {
154
+ margin-right: 0.7rem;
155
+ }
156
+ .mr-2 {
157
+ margin-right: 1rem;
158
+ }
159
+
160
+ .wallet-icon {
161
+ width: 4rem;
162
+ height: 4rem;
163
+ margin-bottom: 0.5rem;
164
+ border-radius: 0.8rem;
165
+ }
166
+
167
+ .connecting-wallet-icon {
168
+ width: 5rem;
169
+ height: 5rem;
170
+ border-radius: 1rem;
171
+ }
172
+
173
+ .text-center {
174
+ text-align: center;
175
+ }
176
+ `;
177
+
178
+ updated() {
179
+ this.dispatchEvent(new Event("updated", { bubbles: true, composed: true }));
180
+ }
181
+ }
@@ -1,9 +1,8 @@
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, CKB_SVG, ETH_SVG } from "../assets/chains";
5
- import { NOSTR_SVG } from "../assets/chains/nostr.svg";
6
- import { WalletWithSigners } from "../types";
4
+ import { BTC_SVG, CKB_SVG, ETH_SVG, NOSTR_SVG } from "../../assets/chains";
5
+ import { WalletWithSigners } from "../../types";
7
6
 
8
7
  export function signerTypeToIcon(type: ccc.SignerType): string {
9
8
  return {
@@ -25,14 +24,14 @@ export function generateSignersScene(
25
24
  "Select a Chain",
26
25
 
27
26
  html`
28
- <img class="wallet-icon" src=${wallet.icon} alt=${wallet.name} />
29
- <span class="mb-2">${wallet.name}</span>
27
+ <img class="wallet-icon mt-1" src=${wallet.icon} alt=${wallet.name} />
28
+ <span class="mb-1">${wallet.name}</span>
30
29
  ${repeat(
31
30
  wallet.signers,
32
31
  (signer) => signer.name,
33
32
  (signer) => html`
34
- <button
35
- class="btn-primary mb-1"
33
+ <ccc-button
34
+ class="mt-1"
36
35
  @click=${async () => {
37
36
  onSignerSelected(wallet, signer);
38
37
  }}
@@ -42,7 +41,7 @@ export function generateSignersScene(
42
41
  alt=${signer.signer.type}
43
42
  />
44
43
  ${signer.name}
45
- </button>
44
+ </ccc-button>
46
45
  `,
47
46
  )}
48
47
  `,
@@ -1,7 +1,7 @@
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 { WalletWithSigners } from "../types";
4
+ import { WalletWithSigners } from "../../types";
5
5
 
6
6
  export function generateWalletsScene(
7
7
  wallets: WalletWithSigners[],
@@ -17,8 +17,8 @@ export function generateWalletsScene(
17
17
  wallets,
18
18
  (wallet) => wallet.name,
19
19
  (wallet) => html`
20
- <button
21
- class="btn-primary mb-1"
20
+ <ccc-button
21
+ class="mt-1"
22
22
  @click=${async () => {
23
23
  if (wallet.signers.length === 1) {
24
24
  onSignerSelected(wallet, wallet.signers[0]);
@@ -29,7 +29,7 @@ export function generateWalletsScene(
29
29
  >
30
30
  <img src=${wallet.icon} alt=${wallet.name} />
31
31
  ${wallet.name}
32
- </button>
32
+ </ccc-button>
33
33
  `,
34
34
  ),
35
35
  ];