@ckb-ccc/connector 0.0.4-alpha.7 → 0.0.4

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 (94) hide show
  1. package/dist/advancedBarrel.d.ts +1 -0
  2. package/dist/advancedBarrel.d.ts.map +1 -1
  3. package/dist/advancedBarrel.js +1 -0
  4. package/dist/barrel.d.ts +1 -2
  5. package/dist/barrel.d.ts.map +1 -1
  6. package/dist/barrel.js +1 -2
  7. package/dist/connector/index.d.ts +23 -9
  8. package/dist/connector/index.d.ts.map +1 -1
  9. package/dist/connector/index.js +149 -54
  10. package/dist/events/index.d.ts +1 -12
  11. package/dist/events/index.d.ts.map +1 -1
  12. package/dist/events/index.js +2 -15
  13. package/dist/scenes/connecting.d.ts +1 -1
  14. package/dist/scenes/connecting.d.ts.map +1 -1
  15. package/dist/scenes/signers.d.ts +2 -1
  16. package/dist/scenes/signers.d.ts.map +1 -1
  17. package/dist/scenes/wallets.d.ts +2 -1
  18. package/dist/scenes/wallets.d.ts.map +1 -1
  19. package/dist/types/index.d.ts +5 -0
  20. package/dist/types/index.d.ts.map +1 -0
  21. package/dist/types/index.js +1 -0
  22. package/dist.commonjs/advanced.d.ts +3 -0
  23. package/dist.commonjs/advanced.d.ts.map +1 -0
  24. package/dist.commonjs/advanced.js +56 -0
  25. package/dist.commonjs/advancedBarrel.d.ts +4 -0
  26. package/dist.commonjs/advancedBarrel.d.ts.map +1 -0
  27. package/dist.commonjs/advancedBarrel.js +35 -0
  28. package/dist.commonjs/assets/chains/btc.svg.d.ts +2 -0
  29. package/dist.commonjs/assets/chains/btc.svg.d.ts.map +1 -0
  30. package/dist.commonjs/assets/chains/btc.svg.js +7 -0
  31. package/dist.commonjs/assets/chains/eth.svg.d.ts +2 -0
  32. package/dist.commonjs/assets/chains/eth.svg.d.ts.map +1 -0
  33. package/dist.commonjs/assets/chains/eth.svg.js +7 -0
  34. package/dist.commonjs/assets/chains/index.d.ts +3 -0
  35. package/dist.commonjs/assets/chains/index.d.ts.map +1 -0
  36. package/dist.commonjs/assets/chains/index.js +34 -0
  37. package/dist.commonjs/assets/close.svg.d.ts +2 -0
  38. package/dist.commonjs/assets/close.svg.d.ts.map +1 -0
  39. package/dist.commonjs/assets/close.svg.js +7 -0
  40. package/dist.commonjs/assets/okx.svg.d.ts +2 -0
  41. package/dist.commonjs/assets/okx.svg.d.ts.map +1 -0
  42. package/dist.commonjs/assets/okx.svg.js +7 -0
  43. package/dist.commonjs/assets/retry.svg.d.ts +2 -0
  44. package/dist.commonjs/assets/retry.svg.d.ts.map +1 -0
  45. package/dist.commonjs/assets/retry.svg.js +7 -0
  46. package/dist.commonjs/assets/uni-sat.svg.d.ts +2 -0
  47. package/dist.commonjs/assets/uni-sat.svg.d.ts.map +1 -0
  48. package/dist.commonjs/assets/uni-sat.svg.js +7 -0
  49. package/dist.commonjs/assets/utils.d.ts +2 -0
  50. package/dist.commonjs/assets/utils.d.ts.map +1 -0
  51. package/dist.commonjs/assets/utils.js +7 -0
  52. package/dist.commonjs/barrel.d.ts +4 -0
  53. package/dist.commonjs/barrel.d.ts.map +1 -0
  54. package/dist.commonjs/barrel.js +35 -0
  55. package/dist.commonjs/connector/index.d.ts +33 -0
  56. package/dist.commonjs/connector/index.d.ts.map +1 -0
  57. package/dist.commonjs/connector/index.js +452 -0
  58. package/dist.commonjs/events/index.d.ts +4 -0
  59. package/dist.commonjs/events/index.d.ts.map +1 -0
  60. package/dist.commonjs/events/index.js +9 -0
  61. package/dist.commonjs/index.d.ts +3 -0
  62. package/dist.commonjs/index.d.ts.map +1 -0
  63. package/dist.commonjs/index.js +56 -0
  64. package/dist.commonjs/scenes/connecting.d.ts +10 -0
  65. package/dist.commonjs/scenes/connecting.d.ts.map +1 -0
  66. package/dist.commonjs/scenes/connecting.js +27 -0
  67. package/dist.commonjs/scenes/index.d.ts +4 -0
  68. package/dist.commonjs/scenes/index.d.ts.map +1 -0
  69. package/dist.commonjs/scenes/index.js +35 -0
  70. package/dist.commonjs/scenes/signers.d.ts +11 -0
  71. package/dist.commonjs/scenes/signers.d.ts.map +1 -0
  72. package/dist.commonjs/scenes/signers.js +39 -0
  73. package/dist.commonjs/scenes/wallets.d.ts +8 -0
  74. package/dist.commonjs/scenes/wallets.d.ts.map +1 -0
  75. package/dist.commonjs/scenes/wallets.js +30 -0
  76. package/dist.commonjs/tsconfig.commonjs.tsbuildinfo +1 -0
  77. package/dist.commonjs/types/index.d.ts +5 -0
  78. package/dist.commonjs/types/index.d.ts.map +1 -0
  79. package/dist.commonjs/types/index.js +2 -0
  80. package/package.json +3 -3
  81. package/src/advancedBarrel.ts +1 -0
  82. package/src/barrel.ts +1 -2
  83. package/src/connector/index.ts +199 -66
  84. package/src/events/index.ts +2 -20
  85. package/src/scenes/connecting.ts +4 -1
  86. package/src/scenes/signers.ts +6 -2
  87. package/src/scenes/wallets.ts +2 -1
  88. package/src/types/index.ts +5 -0
  89. package/tsconfig.base.json +21 -0
  90. package/tsconfig.commonjs.json +8 -0
  91. package/dist/status/index.d.ts +0 -6
  92. package/dist/status/index.d.ts.map +0 -1
  93. package/dist/status/index.js +0 -6
  94. package/src/status/index.ts +0 -5
@@ -1,43 +1,171 @@
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
5
  import { OKX_SVG } from "../assets/okx.svg";
6
6
  import { UNI_SAT_SVG } from "../assets/uni-sat.svg";
7
- import { CloseEvent, SignerChangedEvent, StatusChangedEvent } from "../events";
7
+ import { WillUpdateEvent } from "../events";
8
8
  import {
9
9
  generateConnectingScene,
10
10
  generateSignersScene,
11
11
  generateWalletsScene,
12
12
  } from "../scenes";
13
- import { ConnectorStatus } from "../status";
13
+ import { WalletWithSigners } from "../types";
14
14
 
15
15
  @customElement("ccc-connector")
16
16
  export class WebComponentConnector extends LitElement {
17
17
  @state()
18
- private wallets: ccc.Wallet[] = [];
19
- private existedEip6963: string[] = [];
18
+ private wallets: WalletWithSigners[] = [];
20
19
 
21
- @property()
20
+ private resetListeners: (() => void)[] = [];
21
+
22
+ @state()
22
23
  public isOpen: boolean = false;
24
+ public setIsOpen(isOpen: boolean) {
25
+ this.isOpen = isOpen;
26
+ }
23
27
 
24
28
  @property()
25
- public wallet?: ccc.Wallet;
26
- @property()
29
+ public client: ccc.Client = new ccc.ClientPublicTestnet();
30
+ public setClient(client: ccc.Client) {
31
+ this.client = client;
32
+ }
33
+
34
+ @state()
35
+ private walletName?: string;
36
+ @state()
37
+ private signerType?: ccc.SignerType;
38
+ @state()
39
+ private selectedWallet?: WalletWithSigners;
40
+ private updateWallet() {
41
+ this.selectedWallet = this.wallets.find(
42
+ (wallet) => this.walletName === wallet.name,
43
+ );
44
+ }
45
+ @state()
46
+ private selectedSigner?: ccc.SignerInfo;
47
+ private updateSigner() {
48
+ this.selectedSigner = this.selectedWallet?.signers.find(
49
+ ({ type }) => type === this.signerType,
50
+ );
51
+ }
52
+ @state()
53
+ public wallet?: WalletWithSigners;
54
+ @state()
27
55
  public signer?: ccc.SignerInfo;
28
- @property()
29
- public status: ConnectorStatus = ConnectorStatus.SelectingSigner;
56
+ private canConnect = false;
57
+ private prepareSigner() {
58
+ (async () => {
59
+ if (!this.selectedSigner) {
60
+ this.wallet = undefined;
61
+ this.signer = undefined;
62
+ return;
63
+ }
64
+
65
+ if (!(await this.selectedSigner.signer.isConnected())) {
66
+ if (!this.canConnect) {
67
+ this.disconnect();
68
+ return;
69
+ }
70
+ await this.selectedSigner.signer.connect();
71
+ }
72
+
73
+ this.saveConnection();
74
+ this.wallet = this.selectedWallet;
75
+ this.signer = this.selectedSigner;
76
+ this.closedHandler();
77
+ })();
78
+ }
79
+
80
+ public disconnect() {
81
+ this.walletName = undefined;
82
+ this.wallet = undefined;
83
+ this.signerType = undefined;
84
+ this.signer = undefined;
85
+ this.saveConnection();
86
+ }
87
+
88
+ private loadConnection() {
89
+ const {
90
+ signerType,
91
+ walletName,
92
+ }: { signerType?: ccc.SignerType; walletName?: string } = JSON.parse(
93
+ window.localStorage.getItem("ccc-connection-info") ?? "{}",
94
+ );
95
+
96
+ this.signerType = signerType;
97
+ this.walletName = walletName;
98
+ }
99
+
100
+ private saveConnection() {
101
+ window.localStorage.setItem(
102
+ "ccc-connection-info",
103
+ JSON.stringify({
104
+ signerType: this.signerType,
105
+ walletName: this.walletName,
106
+ }),
107
+ );
108
+ }
30
109
 
31
110
  connectedCallback(): void {
32
111
  super.connectedCallback();
112
+ this.loadConnection();
113
+ this.reloadSigners();
114
+ }
115
+
116
+ willUpdate(changedProperties: PropertyValues): void {
117
+ if (changedProperties.has("client")) {
118
+ this.reloadSigners();
119
+ }
120
+ if (
121
+ changedProperties.has("walletName") ||
122
+ changedProperties.has("wallets")
123
+ ) {
124
+ this.updateWallet();
125
+ }
126
+ if (
127
+ changedProperties.has("signerType") ||
128
+ changedProperties.has("selectedWallet")
129
+ ) {
130
+ this.updateSigner();
131
+ }
132
+ if (changedProperties.has("selectedSigner")) {
133
+ this.prepareSigner();
134
+ }
33
135
 
34
- const client = new ccc.ClientPublicTestnet();
35
- const uniSatSigner = ccc.UniSat.getUniSatSigner(client);
136
+ this.dispatchEvent(new WillUpdateEvent());
137
+ }
138
+
139
+ private reloadSigners() {
140
+ this.wallets = [];
141
+
142
+ (async () => {
143
+ if (!this.selectedSigner) {
144
+ return;
145
+ }
146
+
147
+ const newSigner = await this.selectedSigner.signer.replaceClient(
148
+ this.client,
149
+ );
150
+ if (newSigner) {
151
+ this.selectedSigner = {
152
+ ...this.selectedSigner,
153
+ signer: newSigner,
154
+ };
155
+ } else {
156
+ this.disconnect();
157
+ }
158
+ })();
159
+
160
+ this.resetListeners.forEach((listener) => listener());
161
+ this.resetListeners = [];
162
+
163
+ const uniSatSigner = ccc.UniSat.getUniSatSigner(this.client);
36
164
  if (uniSatSigner) {
37
165
  this.addSigner("UniSat", UNI_SAT_SVG, ccc.SignerType.BTC, uniSatSigner);
38
166
  }
39
167
 
40
- const okxBitcoinSigner = ccc.Okx.getOKXBitcoinSigner(client);
168
+ const okxBitcoinSigner = ccc.Okx.getOKXBitcoinSigner(this.client);
41
169
  if (okxBitcoinSigner) {
42
170
  this.addSigner(
43
171
  "OKX Wallet",
@@ -47,59 +175,68 @@ export class WebComponentConnector extends LitElement {
47
175
  );
48
176
  }
49
177
 
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
- });
178
+ const eip6963Manager = new ccc.Eip6963.SignerFactory(this.client);
179
+ this.resetListeners.push(
180
+ eip6963Manager.subscribeSigners((signer) => {
181
+ this.addSigner(
182
+ `${signer.detail.info.name}`,
183
+ signer.detail.info.icon,
184
+ ccc.SignerType.EVM,
185
+ signer,
186
+ );
187
+ }),
188
+ );
63
189
  }
64
190
 
65
- addSigner(
191
+ private addSigner(
66
192
  name: string,
67
193
  icon: string,
68
194
  type: ccc.SignerType,
69
195
  signer: ccc.Signer,
70
196
  ) {
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
- ];
197
+ let updated = false;
198
+ const wallets = this.wallets.map((wallet) => {
199
+ if (wallet.name !== name) {
200
+ return wallet;
201
+ }
202
+
203
+ updated = true;
204
+ return {
205
+ ...wallet,
206
+ signers: [...wallet.signers, { type, signer }],
207
+ };
208
+ });
209
+
210
+ if (!updated) {
211
+ wallets.push({
212
+ name,
213
+ icon,
214
+ signers: [{ type, signer }],
215
+ });
84
216
  }
217
+
218
+ this.wallets = wallets;
85
219
  }
86
220
 
87
221
  render() {
88
222
  const [title, body] = (() => {
89
- if (!this.wallet) {
223
+ if (!this.selectedWallet) {
90
224
  return generateWalletsScene(
91
225
  this.wallets,
92
- this.onWalletSelected,
93
- this.onSignerSelected,
226
+ this.signerSelectedHandler,
227
+ this.signerSelectedHandler,
94
228
  );
95
229
  }
96
- if (!this.signer) {
97
- return generateSignersScene(this.wallet, this.onSignerSelected);
230
+ if (!this.selectedSigner) {
231
+ return generateSignersScene(
232
+ this.selectedWallet,
233
+ this.signerSelectedHandler,
234
+ );
98
235
  }
99
236
  return generateConnectingScene(
100
- this.wallet,
101
- this.signer,
102
- this.onSignerSelected,
237
+ this.selectedWallet,
238
+ this.selectedSigner,
239
+ this.signerSelectedHandler,
103
240
  );
104
241
  })();
105
242
 
@@ -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,31 +265,27 @@ 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 (this.signer === undefined) {
277
+ this.disconnect();
278
+ }
279
+ this.isOpen = false;
145
280
  };
146
281
 
147
- private onSignerSelected = (wallet: ccc.Wallet, signer: ccc.SignerInfo) => {
148
- this.dispatchEvent(new StatusChangedEvent(ConnectorStatus.Connecting));
149
- this.dispatchEvent(new SignerChangedEvent(wallet, signer));
150
-
151
- (async () => {
152
- await signer.signer.connect();
153
- this.dispatchEvent(new StatusChangedEvent(ConnectorStatus.Idle));
154
- this.dispatchEvent(new CloseEvent());
155
- })();
282
+ private signerSelectedHandler = (
283
+ wallet?: ccc.Wallet,
284
+ signer?: ccc.SignerInfo,
285
+ ) => {
286
+ this.walletName = wallet?.name;
287
+ this.signerType = signer?.type;
288
+ this.canConnect = true;
156
289
  };
157
290
 
158
291
  static styles = css`
@@ -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
  }
@@ -5,7 +5,10 @@ import { RETRY_SVG } from "../assets/retry.svg";
5
5
  export function generateConnectingScene(
6
6
  wallet: ccc.Wallet,
7
7
  signer: ccc.SignerInfo,
8
- onSignerSelected: (wallet: ccc.Wallet, signer: ccc.SignerInfo) => unknown,
8
+ onSignerSelected: (
9
+ wallet: ccc.Wallet | undefined,
10
+ signer: ccc.SignerInfo,
11
+ ) => unknown,
9
12
  ) {
10
13
  return [
11
14
  wallet.name,
@@ -2,6 +2,7 @@ import { ccc } from "@ckb-ccc/ccc";
2
2
  import { html } from "lit";
3
3
  import { repeat } from "lit/directives/repeat.js";
4
4
  import { BTC_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 {
@@ -11,8 +12,11 @@ export function signerTypeToIcon(type: ccc.SignerType): string {
11
12
  }
12
13
 
13
14
  export function generateSignersScene(
14
- wallet: ccc.Wallet,
15
- onSignerSelected: (wallet: ccc.Wallet, signer: ccc.SignerInfo) => unknown,
15
+ wallet: WalletWithSigners,
16
+ onSignerSelected: (
17
+ wallet: ccc.Wallet | undefined,
18
+ signer: ccc.SignerInfo,
19
+ ) => unknown,
16
20
  ) {
17
21
  return [
18
22
  "Select a Chain",
@@ -1,9 +1,10 @@
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
5
 
5
6
  export function generateWalletsScene(
6
- wallets: ccc.Wallet[],
7
+ wallets: WalletWithSigners[],
7
8
  onWalletSelected: (wallet: ccc.Wallet) => unknown,
8
9
  onSignerSelected: (wallet: ccc.Wallet, signer: ccc.SignerInfo) => unknown,
9
10
  ) {
@@ -0,0 +1,5 @@
1
+ import { ccc } from "@ckb-ccc/ccc";
2
+
3
+ export type WalletWithSigners = ccc.Wallet & {
4
+ signers: ccc.SignerInfo[];
5
+ };
@@ -0,0 +1,21 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "es2020",
4
+ "incremental": true,
5
+ "allowJs": true,
6
+ "importHelpers": false,
7
+ "declaration": true,
8
+ "declarationMap": true,
9
+ "experimentalDecorators": true,
10
+ "useDefineForClassFields": false,
11
+ "esModuleInterop": true,
12
+ "strict": true,
13
+ "noImplicitAny": true,
14
+ "strictBindCallApply": true,
15
+ "strictNullChecks": true,
16
+ "alwaysStrict": true,
17
+ "noFallthroughCasesInSwitch": true,
18
+ "forceConsistentCasingInFileNames": true
19
+ },
20
+ "include": ["src/**/*"]
21
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "./tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "module": "NodeNext",
5
+ "moduleResolution": "NodeNext",
6
+ "outDir": "./dist.commonjs"
7
+ }
8
+ }
@@ -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
- }