@ckb-ccc/connector 0.0.3 → 0.0.4-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 (66) hide show
  1. package/README.md +32 -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/btc.svg.d.ts +2 -0
  6. package/dist/assets/chains/btc.svg.d.ts.map +1 -0
  7. package/dist/assets/chains/btc.svg.js +2 -0
  8. package/dist/assets/chains/eth.svg.d.ts +2 -0
  9. package/dist/assets/chains/eth.svg.d.ts.map +1 -0
  10. package/dist/assets/chains/eth.svg.js +2 -0
  11. package/dist/assets/chains/index.d.ts +3 -0
  12. package/dist/assets/chains/index.d.ts.map +1 -0
  13. package/dist/assets/chains/index.js +2 -0
  14. package/dist/assets/close.svg.d.ts +2 -0
  15. package/dist/assets/close.svg.d.ts.map +1 -0
  16. package/dist/assets/close.svg.js +2 -0
  17. package/dist/assets/retry.svg.d.ts +2 -0
  18. package/dist/assets/retry.svg.d.ts.map +1 -0
  19. package/dist/assets/retry.svg.js +2 -0
  20. package/dist/barrel.d.ts +1 -0
  21. package/dist/barrel.d.ts.map +1 -1
  22. package/dist/barrel.js +1 -0
  23. package/dist/connector/index.d.ts +19 -0
  24. package/dist/connector/index.d.ts.map +1 -0
  25. package/dist/connector/index.js +271 -0
  26. package/dist/events/index.d.ts +15 -0
  27. package/dist/events/index.d.ts.map +1 -0
  28. package/dist/events/index.js +18 -0
  29. package/dist/scenes/connecting.d.ts +3 -0
  30. package/dist/scenes/connecting.d.ts.map +1 -0
  31. package/dist/scenes/connecting.js +23 -0
  32. package/dist/scenes/index.d.ts +4 -0
  33. package/dist/scenes/index.d.ts.map +1 -0
  34. package/dist/scenes/index.js +3 -0
  35. package/dist/scenes/signers.d.ts +4 -0
  36. package/dist/scenes/signers.d.ts.map +1 -0
  37. package/dist/scenes/signers.js +30 -0
  38. package/dist/scenes/wallets.d.ts +3 -0
  39. package/dist/scenes/wallets.d.ts.map +1 -0
  40. package/dist/scenes/wallets.js +23 -0
  41. package/dist/status/index.d.ts +6 -0
  42. package/dist/status/index.d.ts.map +1 -0
  43. package/dist/status/index.js +6 -0
  44. package/package.json +5 -5
  45. package/src/advancedBarrel.ts +1 -0
  46. package/src/assets/chains/btc.svg.ts +5 -0
  47. package/src/assets/chains/eth.svg.ts +5 -0
  48. package/src/assets/chains/index.ts +2 -0
  49. package/src/assets/close.svg.ts +5 -0
  50. package/src/assets/retry.svg.ts +5 -0
  51. package/src/barrel.ts +1 -0
  52. package/src/connector/index.ts +292 -0
  53. package/src/events/index.ts +23 -0
  54. package/src/scenes/connecting.ts +29 -0
  55. package/src/scenes/index.ts +3 -0
  56. package/src/scenes/signers.ts +40 -0
  57. package/src/scenes/wallets.ts +32 -0
  58. package/src/status/index.ts +5 -0
  59. package/dist/connector.d.ts +0 -9
  60. package/dist/connector.d.ts.map +0 -1
  61. package/dist/connector.js +0 -160
  62. package/dist/events.d.ts +0 -9
  63. package/dist/events.d.ts.map +0 -1
  64. package/dist/events.js +0 -11
  65. package/src/connector.ts +0 -156
  66. package/src/events.ts +0 -13
@@ -0,0 +1,5 @@
1
+ import { encodeSvgToImgSrc } from "../utils";
2
+
3
+ export const BTC_SVG = encodeSvgToImgSrc(
4
+ '<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" height="64" width="64" version="1.1"><link xmlns="" type="text/css" rel="stylesheet" id="dark-mode-custom-link"/><link xmlns="" type="text/css" rel="stylesheet" id="dark-mode-general-link"/><style xmlns="" lang="en" type="text/css" id="dark-mode-custom-style"/><style xmlns="" lang="en" type="text/css" id="dark-mode-native-style"/><style xmlns="" lang="en" type="text/css" id="dark-mode-native-sheet"/><script xmlns=""/><g transform="translate(0.00630876,-0.00301984)"><path fill="#f7931a" d="m63.033,39.744c-4.274,17.143-21.637,27.576-38.782,23.301-17.138-4.274-27.571-21.638-23.295-38.78,4.272-17.145,21.635-27.579,38.775-23.305,17.144,4.274,27.576,21.64,23.302,38.784z"/><path fill="#FFF" d="m46.103,27.444c0.637-4.258-2.605-6.547-7.038-8.074l1.438-5.768-3.511-0.875-1.4,5.616c-0.923-0.23-1.871-0.447-2.813-0.662l1.41-5.653-3.509-0.875-1.439,5.766c-0.764-0.174-1.514-0.346-2.242-0.527l0.004-0.018-4.842-1.209-0.934,3.75s2.605,0.597,2.55,0.634c1.422,0.355,1.679,1.296,1.636,2.042l-1.638,6.571c0.098,0.025,0.225,0.061,0.365,0.117-0.117-0.029-0.242-0.061-0.371-0.092l-2.296,9.205c-0.174,0.432-0.615,1.08-1.609,0.834,0.035,0.051-2.552-0.637-2.552-0.637l-1.743,4.019,4.569,1.139c0.85,0.213,1.683,0.436,2.503,0.646l-1.453,5.834,3.507,0.875,1.439-5.772c0.958,0.26,1.888,0.5,2.798,0.726l-1.434,5.745,3.511,0.875,1.453-5.823c5.987,1.133,10.489,0.676,12.384-4.739,1.527-4.36-0.076-6.875-3.226-8.515,2.294-0.529,4.022-2.038,4.483-5.155zm-8.022,11.249c-1.085,4.36-8.426,2.003-10.806,1.412l1.928-7.729c2.38,0.594,10.012,1.77,8.878,6.317zm1.086-11.312c-0.99,3.966-7.1,1.951-9.082,1.457l1.748-7.01c1.982,0.494,8.365,1.416,7.334,5.553z"/></g><script xmlns=""/></svg>',
5
+ );
@@ -0,0 +1,5 @@
1
+ import { encodeSvgToImgSrc } from "../utils";
2
+
3
+ export const ETH_SVG = encodeSvgToImgSrc(
4
+ '<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_46_558)"><circle cx="16" cy="16" r="16" fill="#627EEA"/><path d="M15.9957 20.4203L9.14282 16.3876L15.9957 5.14258V20.4203Z" fill="white"/><path d="M15.9957 26.8573L9.30029 17.396L15.9957 21.3511V26.8573Z" fill="white"/><path d="M16.2319 20.4203L23.0849 16.3876L16.2319 5.14258V20.4203Z" fill="#C1CCF7"/><path d="M16.3107 26.8573L23.0848 17.396L16.3107 21.3511V26.8573Z" fill="#C1CCF7"/></g><defs><clipPath id="clip0_46_558"><rect width="32" height="32" fill="white"/></clipPath></defs></svg>',
5
+ );
@@ -0,0 +1,2 @@
1
+ export * from "./btc.svg";
2
+ export * from "./eth.svg";
@@ -0,0 +1,5 @@
1
+ import { encodeSvgToImgSrc } from "./utils";
2
+
3
+ export const CLOSE_SVG = encodeSvgToImgSrc(
4
+ '<svg width="12" height="12" viewBox="0 0 12 12" xmlns="http://www.w3.org/2000/svg"><path d="M10.8989 1.0512C10.5085 0.660741 9.87543 0.660703 9.48493 1.05111L5.94897 4.58624L2.41397 1.05124C2.0235 0.660772 1.39043 0.660773 0.999968 1.05124C0.609503 1.4417 0.609503 2.07477 0.999969 2.46524L4.53497 6.00024L0.999968 9.53524C0.609503 9.9257 0.609503 10.5588 0.999968 10.9492C1.39043 11.3397 2.0235 11.3397 2.41397 10.9492L5.94897 7.41424L9.48493 10.9494C9.87543 11.3398 10.5085 11.3397 10.8989 10.9493C11.2894 10.5588 11.2894 9.92568 10.8989 9.5352L7.36397 6.00024L10.8989 2.46528C11.2894 2.07479 11.2894 1.44168 10.8989 1.0512Z"/></svg>',
5
+ );
@@ -0,0 +1,5 @@
1
+ import { encodeSvgToImgSrc } from "./utils";
2
+
3
+ export const RETRY_SVG = encodeSvgToImgSrc(
4
+ '<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M11.398 1.16864C11.0369 1.16864 10.7961 1.41021 10.7961 1.77256V2.37648C10.1941 1.531 9.35141 0.866684 8.38828 0.504333C5.37851 -0.82429 1.82699 0.564725 0.502691 3.58432C-0.821607 6.60392 0.562886 10.167 3.57265 11.4957C6.58242 12.8243 10.1339 11.4353 11.4582 8.41568H11.398C11.398 8.05333 11.1573 7.81176 10.7961 7.81176C10.4349 7.81176 10.1941 8.05333 10.1941 8.41568H10.1339C9.59219 9.32156 8.80965 10.0463 7.78633 10.469C5.31832 11.4957 2.54933 10.2878 1.52601 7.81176C0.502691 5.33569 1.7066 2.49727 4.17461 1.531C6.40183 0.564725 8.93004 1.531 10.1339 3.58432H8.99023C8.62906 3.58432 8.38828 3.82589 8.38828 4.18824C8.38828 4.55059 8.62906 4.79216 8.99023 4.79216H11.398C11.7592 4.79216 12 4.55059 12 4.18824V1.77256C12 1.41021 11.7592 1.16864 11.398 1.16864Z" fill="#1E1E1E"/></svg>',
5
+ );
package/src/barrel.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from "@ckb-ccc/ccc";
2
2
  export * from "./connector";
3
3
  export * from "./events";
4
+ export * from "./status";
@@ -0,0 +1,292 @@
1
+ import { ccc } from "@ckb-ccc/ccc";
2
+ import { LitElement, css, html } from "lit";
3
+ import { customElement, property, state } from "lit/decorators.js";
4
+ import { CLOSE_SVG } from "../assets/close.svg";
5
+ import { OKX_SVG } from "../assets/okx.svg";
6
+ import { UNI_SAT_SVG } from "../assets/uni-sat.svg";
7
+ import { CloseEvent, SignerChangedEvent, StatusChangedEvent } from "../events";
8
+ import {
9
+ generateConnectingScene,
10
+ generateSignersScene,
11
+ generateWalletsScene,
12
+ } from "../scenes";
13
+ import { ConnectorStatus } from "../status";
14
+
15
+ @customElement("ccc-connector")
16
+ export class WebComponentConnector extends LitElement {
17
+ @state()
18
+ private wallets: ccc.Wallet[] = [];
19
+ private existedEip6963: string[] = [];
20
+
21
+ @property()
22
+ public isOpen: boolean = false;
23
+
24
+ @property()
25
+ public wallet?: ccc.Wallet;
26
+ @property()
27
+ public signer?: ccc.SignerInfo;
28
+ @property()
29
+ public status: ConnectorStatus = ConnectorStatus.SelectingSigner;
30
+
31
+ connectedCallback(): void {
32
+ super.connectedCallback();
33
+
34
+ const client = new ccc.ClientPublicTestnet();
35
+ const uniSatSigner = ccc.UniSat.getUniSatSigner(client);
36
+ if (uniSatSigner) {
37
+ this.addSigner("UniSat", UNI_SAT_SVG, ccc.SignerType.BTC, uniSatSigner);
38
+ }
39
+
40
+ const okxBitcoinSigner = ccc.Okx.getOKXBitcoinSigner(client);
41
+ if (okxBitcoinSigner) {
42
+ this.addSigner(
43
+ "OKX Wallet",
44
+ OKX_SVG,
45
+ ccc.SignerType.BTC,
46
+ okxBitcoinSigner,
47
+ );
48
+ }
49
+
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
+ });
63
+ }
64
+
65
+ addSigner(
66
+ name: string,
67
+ icon: string,
68
+ type: ccc.SignerType,
69
+ signer: ccc.Signer,
70
+ ) {
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
+ ];
84
+ }
85
+ }
86
+
87
+ render() {
88
+ const [title, body] = (() => {
89
+ if (!this.wallet) {
90
+ return generateWalletsScene(
91
+ this.wallets,
92
+ this.onWalletSelected,
93
+ this.onSignerSelected,
94
+ );
95
+ }
96
+ if (!this.signer) {
97
+ return generateSignersScene(this.wallet, this.onSignerSelected);
98
+ }
99
+ return generateConnectingScene(
100
+ this.wallet,
101
+ this.signer,
102
+ this.onSignerSelected,
103
+ );
104
+ })();
105
+
106
+ return html`<style>
107
+ :host {
108
+ ${this.isOpen ? "" : "display: none;"}
109
+ --background: #fff;
110
+ --divider: #eee;
111
+ --btn-primary: #f8f8f8;
112
+ --btn-primary-hover: #efeeee;
113
+ --btn-secondary: #ddd;
114
+ --btn-icon: #e9e4de;
115
+ color: #1e1e1e;
116
+ --tip-color: #666;
117
+ }
118
+ </style>
119
+ <div
120
+ class="background"
121
+ @click=${(event: Event) => {
122
+ if (event.target === event.currentTarget) {
123
+ this.onClose();
124
+ }
125
+ }}
126
+ >
127
+ <div class="main">
128
+ <div class="header text-bold fs-big">
129
+ <div class="back"></div>
130
+ ${title}
131
+ <img class="close" src=${CLOSE_SVG} @click=${this.onClose} />
132
+ </div>
133
+ <div class="body">${body}</div>
134
+ </div>
135
+ </div>`;
136
+ }
137
+
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));
145
+ };
146
+
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
+ })();
156
+ };
157
+
158
+ static styles = css`
159
+ :host {
160
+ width: 100vw;
161
+ height: 100vh;
162
+ position: fixed;
163
+ left: 0;
164
+ top: 0;
165
+ }
166
+
167
+ button {
168
+ background: none;
169
+ color: inherit;
170
+ border: none;
171
+ padding: 0;
172
+ font: inherit;
173
+ cursor: pointer;
174
+ outline: inherit;
175
+ }
176
+
177
+ .text-bold {
178
+ font-weight: bold;
179
+ }
180
+
181
+ .text-tip {
182
+ color: var(--tip-color);
183
+ }
184
+
185
+ .fs-big {
186
+ font-size: 1.2rem;
187
+ }
188
+
189
+ .mb-1 {
190
+ margin-bottom: 0.7rem;
191
+ }
192
+ .mb-2 {
193
+ margin-bottom: 1rem;
194
+ }
195
+ .mt-1 {
196
+ margin-top: 0.7rem;
197
+ }
198
+ .mt-2 {
199
+ margin-top: 1rem;
200
+ }
201
+
202
+ .background {
203
+ width: 100%;
204
+ height: 100%;
205
+ background: rgba(18, 19, 24, 0.7);
206
+ }
207
+
208
+ .main {
209
+ position: fixed;
210
+ left: 50%;
211
+ top: 50%;
212
+ transform: translate(-50%, -50%);
213
+ background: var(--background);
214
+ border-radius: 1.2rem;
215
+ }
216
+
217
+ .header {
218
+ display: flex;
219
+ justify-content: space-between;
220
+ align-items: center;
221
+ padding: 1rem 1.3rem;
222
+ border-bottom: 1px solid var(--divider);
223
+ }
224
+
225
+ .close,
226
+ .back {
227
+ width: 0.8rem;
228
+ height: 0.8rem;
229
+ cursor: pointer;
230
+ }
231
+
232
+ .body {
233
+ padding: 1.4rem 1.3rem;
234
+ min-width: 20rem;
235
+ display: flex;
236
+ flex-direction: column;
237
+ align-items: center;
238
+ }
239
+
240
+ .btn-primary {
241
+ width: 100%;
242
+ display: flex;
243
+ align-items: center;
244
+ justify-content: start;
245
+ padding: 0.75rem 1rem;
246
+ background: var(--btn-primary);
247
+ border-radius: 0.4rem;
248
+ transition: background 0.3s ease-in-out;
249
+ }
250
+
251
+ .btn-primary img {
252
+ width: 2rem;
253
+ height: 2rem;
254
+ margin-right: 1rem;
255
+ border-radius: 0.4rem;
256
+ background: var(--btn-icon);
257
+ }
258
+
259
+ .btn-primary:hover {
260
+ background: var(--btn-primary-hover);
261
+ }
262
+
263
+ .btn-secondary {
264
+ display: flex;
265
+ align-items: center;
266
+ padding: 0.25rem 1rem;
267
+ background: var(--btn-secondary);
268
+ border-radius: 9999px;
269
+ transition: background 0.3s ease-in-out;
270
+ }
271
+
272
+ .btn-secondary img {
273
+ width: 0.8rem;
274
+ height: 0.8rem;
275
+ margin-right: 0.5rem;
276
+ }
277
+
278
+ .wallet-icon {
279
+ width: 4rem;
280
+ height: 4rem;
281
+ margin-bottom: 0.5rem;
282
+ border-radius: 0.8rem;
283
+ background: var(--btn-icon);
284
+ }
285
+
286
+ .connecting-wallet-icon {
287
+ width: 5rem;
288
+ height: 5rem;
289
+ border-radius: 1rem;
290
+ }
291
+ `;
292
+ }
@@ -0,0 +1,23 @@
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 {
20
+ constructor() {
21
+ super("close", { composed: true });
22
+ }
23
+ }
@@ -0,0 +1,29 @@
1
+ import { ccc } from "@ckb-ccc/ccc";
2
+ import { html } from "lit";
3
+ import { RETRY_SVG } from "../assets/retry.svg";
4
+
5
+ export function generateConnectingScene(
6
+ wallet: ccc.Wallet,
7
+ signer: ccc.SignerInfo,
8
+ onSignerSelected: (wallet: ccc.Wallet, signer: ccc.SignerInfo) => unknown,
9
+ ) {
10
+ return [
11
+ wallet.name,
12
+ html`
13
+ <img
14
+ class="connecting-wallet-icon mb-1"
15
+ src=${wallet.icon}
16
+ alt=${wallet.name}
17
+ />
18
+ <span class="text-bold">Opening ${wallet.name}...</span>
19
+ <span class="text-tip">Confirm connection in the wallet</span>
20
+ <button
21
+ class="btn-secondary mt-2 mb-2"
22
+ @click=${() => onSignerSelected(wallet, signer)}
23
+ >
24
+ <img src=${RETRY_SVG} alt="retry" />
25
+ Try again
26
+ </button>
27
+ `,
28
+ ];
29
+ }
@@ -0,0 +1,3 @@
1
+ export * from "./connecting";
2
+ export * from "./signers";
3
+ export * from "./wallets";
@@ -0,0 +1,40 @@
1
+ import { ccc } from "@ckb-ccc/ccc";
2
+ import { html } from "lit";
3
+ import { repeat } from "lit/directives/repeat.js";
4
+ import { BTC_SVG, ETH_SVG } from "../assets/chains";
5
+
6
+ export function signerTypeToIcon(type: ccc.SignerType): string {
7
+ return {
8
+ [ccc.SignerType.BTC]: BTC_SVG,
9
+ [ccc.SignerType.EVM]: ETH_SVG,
10
+ }[type];
11
+ }
12
+
13
+ export function generateSignersScene(
14
+ wallet: ccc.Wallet,
15
+ onSignerSelected: (wallet: ccc.Wallet, signer: ccc.SignerInfo) => unknown,
16
+ ) {
17
+ return [
18
+ "Select a Chain",
19
+
20
+ html`
21
+ <img class="wallet-icon" src=${wallet.icon} alt=${wallet.name} />
22
+ <span class="mb-2">${wallet.name}</span>
23
+ ${repeat(
24
+ wallet.signers,
25
+ (signer) => signer.type,
26
+ (signer) => html`
27
+ <button
28
+ class="btn-primary mb-1"
29
+ @click=${async () => {
30
+ onSignerSelected(wallet, signer);
31
+ }}
32
+ >
33
+ <img src=${signerTypeToIcon(signer.type)} alt=${signer.type} />
34
+ ${signer.type}
35
+ </button>
36
+ `,
37
+ )}
38
+ `,
39
+ ];
40
+ }
@@ -0,0 +1,32 @@
1
+ import { ccc } from "@ckb-ccc/ccc";
2
+ import { html } from "lit";
3
+ import { repeat } from "lit/directives/repeat.js";
4
+
5
+ export function generateWalletsScene(
6
+ wallets: ccc.Wallet[],
7
+ onWalletSelected: (wallet: ccc.Wallet) => unknown,
8
+ onSignerSelected: (wallet: ccc.Wallet, signer: ccc.SignerInfo) => unknown,
9
+ ) {
10
+ return [
11
+ "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
+ ),
31
+ ];
32
+ }
@@ -0,0 +1,5 @@
1
+ export enum ConnectorStatus {
2
+ SelectingSigner = "SelectingSigner",
3
+ Connecting = "Connecting",
4
+ Idle = "Idle",
5
+ }
@@ -1,9 +0,0 @@
1
- import { LitElement } from "lit";
2
- export declare class WebComponentConnector extends LitElement {
3
- private signers;
4
- isOpen: boolean;
5
- connectedCallback(): void;
6
- static styles: import("lit").CSSResult;
7
- render(): import("lit").TemplateResult<1>;
8
- }
9
- //# sourceMappingURL=connector.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"connector.d.ts","sourceRoot":"","sources":["../src/connector.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAO5C,qBACa,qBAAsB,SAAQ,UAAU;IAEnD,OAAO,CAAC,OAAO,CAAwB;IAGhC,MAAM,EAAE,OAAO,CAAS;IAE/B,iBAAiB,IAAI,IAAI;IAkDzB,MAAM,CAAC,MAAM,0BAmDX;IAEF,MAAM;CAoCP"}
package/dist/connector.js DELETED
@@ -1,160 +0,0 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- import { ccc } from "@ckb-ccc/ccc";
8
- import { LitElement, css, html } from "lit";
9
- import { customElement, property, state } from "lit/decorators.js";
10
- import { repeat } from "lit/directives/repeat.js";
11
- import { OKX_SVG } from "./assets/okx.svg";
12
- import { UNI_SAT_SVG } from "./assets/uni-sat.svg";
13
- import { CloseEvent, ConnectedEvent } from "./events";
14
- let WebComponentConnector = class WebComponentConnector extends LitElement {
15
- constructor() {
16
- super(...arguments);
17
- this.signers = [];
18
- this.isOpen = false;
19
- }
20
- connectedCallback() {
21
- super.connectedCallback();
22
- const client = new ccc.ClientPublicTestnet();
23
- const uniSatSigner = ccc.UniSat.getUniSatSigner(client);
24
- if (uniSatSigner) {
25
- this.signers = [
26
- ...this.signers,
27
- {
28
- id: "uni-sat",
29
- name: "BTC: UniSat",
30
- icon: UNI_SAT_SVG,
31
- type: ccc.SignerType.UniSat,
32
- signer: uniSatSigner,
33
- },
34
- ];
35
- }
36
- const okxBitcoinSigner = ccc.Okx.getOKXBitcoinSigner(client);
37
- if (okxBitcoinSigner) {
38
- this.signers = [
39
- ...this.signers,
40
- {
41
- id: "okx-bitcoin",
42
- name: "BTC: OKX",
43
- icon: OKX_SVG,
44
- type: ccc.SignerType.OkxBitcoin,
45
- signer: okxBitcoinSigner,
46
- },
47
- ];
48
- }
49
- const eip6963Manager = new ccc.Eip6963.SignerFactory(client);
50
- eip6963Manager.subscribeSigners((signer) => {
51
- if (this.signers.some((s) => s.id === signer.detail.info.uuid)) {
52
- return;
53
- }
54
- this.signers = [
55
- ...this.signers,
56
- {
57
- id: signer.detail.info.uuid,
58
- name: `ETH: ${signer.detail.info.name}`,
59
- icon: signer.detail.info.icon,
60
- type: ccc.SignerType.Eip6963,
61
- signer,
62
- },
63
- ];
64
- });
65
- }
66
- render() {
67
- return html `<style>
68
- :host {
69
- ${this.isOpen ? "" : "display: none;"}
70
- --background: rgba(0, 0, 0, 0.2);
71
- }
72
- </style>
73
- <div
74
- class="background"
75
- @click=${(event) => {
76
- if (event.target === event.currentTarget) {
77
- this.dispatchEvent(new CloseEvent());
78
- }
79
- }}
80
- >
81
- <div class="main">
82
- ${repeat(this.signers, (signer) => signer.id, (signer) => html `
83
- <button
84
- class="wallet-button"
85
- @click=${async () => {
86
- await signer.signer.connect();
87
- this.dispatchEvent(new ConnectedEvent(signer));
88
- this.dispatchEvent(new CloseEvent());
89
- }}
90
- >
91
- <img src=${signer.icon} alt=${signer.name} />
92
- ${signer.name}
93
- </button>
94
- `)}
95
- </div>
96
- </div>`;
97
- }
98
- };
99
- WebComponentConnector.styles = css `
100
- :host {
101
- width: 100vw;
102
- height: 100vh;
103
- position: fixed;
104
- left: 0;
105
- top: 0;
106
- }
107
-
108
- button {
109
- background: none;
110
- color: inherit;
111
- border: none;
112
- padding: 0;
113
- font: inherit;
114
- cursor: pointer;
115
- outline: inherit;
116
- }
117
-
118
- .background {
119
- width: 100%;
120
- height: 100%;
121
- background: var(--background);
122
- }
123
-
124
- .main {
125
- position: fixed;
126
- left: 50%;
127
- top: 50%;
128
- transform: translate(-50%, -50%);
129
- }
130
-
131
- .wallet-button {
132
- width: 100%;
133
- display: flex;
134
- align-items: center;
135
- justify-content: start;
136
- padding: 0.75rem 1.25rem;
137
- color: #fff;
138
- background: #000;
139
- background-image: none;
140
- border-radius: 9999px;
141
- border: none;
142
- margin-bottom: 0.5rem;
143
- }
144
-
145
- .wallet-button img {
146
- width: 1.5rem;
147
- height: 1.5rem;
148
- padding-right: 0.5rem;
149
- }
150
- `;
151
- __decorate([
152
- state()
153
- ], WebComponentConnector.prototype, "signers", void 0);
154
- __decorate([
155
- property()
156
- ], WebComponentConnector.prototype, "isOpen", void 0);
157
- WebComponentConnector = __decorate([
158
- customElement("ccc-connector")
159
- ], WebComponentConnector);
160
- export { WebComponentConnector };
package/dist/events.d.ts DELETED
@@ -1,9 +0,0 @@
1
- import { SignerInfo } from "@ckb-ccc/ccc";
2
- export declare class ConnectedEvent extends Event {
3
- readonly signerInfo: SignerInfo;
4
- constructor(signerInfo: SignerInfo);
5
- }
6
- export declare class CloseEvent extends Event {
7
- constructor();
8
- }
9
- //# sourceMappingURL=events.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,qBAAa,cAAe,SAAQ,KAAK;aACX,UAAU,EAAE,UAAU;gBAAtB,UAAU,EAAE,UAAU;CAGnD;AAED,qBAAa,UAAW,SAAQ,KAAK;;CAIpC"}
package/dist/events.js DELETED
@@ -1,11 +0,0 @@
1
- export class ConnectedEvent extends Event {
2
- constructor(signerInfo) {
3
- super("connected", { composed: true });
4
- this.signerInfo = signerInfo;
5
- }
6
- }
7
- export class CloseEvent extends Event {
8
- constructor() {
9
- super("close", { composed: true });
10
- }
11
- }