@oila/0account 3.4.8 → 3.4.9

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 (95) hide show
  1. package/dist/cjs/index-ef57218a.js +1948 -0
  2. package/dist/cjs/index-ef57218a.js.map +1 -0
  3. package/dist/cjs/index.cjs.js +4 -0
  4. package/dist/cjs/index.cjs.js.map +1 -0
  5. package/dist/cjs/loader.cjs.js +15 -0
  6. package/dist/cjs/loader.cjs.js.map +1 -0
  7. package/dist/cjs/qr-code_2.cjs.entry.js +1550 -0
  8. package/dist/cjs/qr-code_2.cjs.entry.js.map +1 -0
  9. package/dist/cjs/zero-account.cjs.js +25 -0
  10. package/dist/cjs/zero-account.cjs.js.map +1 -0
  11. package/dist/collection/collection-manifest.json +13 -0
  12. package/dist/collection/components/zero-account/enums.js +18 -0
  13. package/dist/collection/components/zero-account/enums.js.map +1 -0
  14. package/dist/collection/components/zero-account/logo.js +6 -0
  15. package/dist/collection/components/zero-account/logo.js.map +1 -0
  16. package/dist/collection/components/zero-account/qrcode.js +111 -0
  17. package/dist/collection/components/zero-account/qrcode.js.map +1 -0
  18. package/dist/collection/components/zero-account/websocket.js +176 -0
  19. package/dist/collection/components/zero-account/websocket.js.map +1 -0
  20. package/dist/collection/components/zero-account/zero-account.css +294 -0
  21. package/dist/collection/components/zero-account/zero-account.e2e.js +26 -0
  22. package/dist/collection/components/zero-account/zero-account.e2e.js.map +1 -0
  23. package/dist/collection/components/zero-account/zero-account.js +402 -0
  24. package/dist/collection/components/zero-account/zero-account.js.map +1 -0
  25. package/dist/collection/components/zero-account/zero-account.spec.js +35 -0
  26. package/dist/collection/components/zero-account/zero-account.spec.js.map +1 -0
  27. package/dist/collection/index.js +2 -0
  28. package/dist/collection/index.js.map +1 -0
  29. package/dist/{zero-account/qr-code.entry.js → collection/utils/qrcode/qrcode.js} +3 -35
  30. package/dist/collection/utils/request.js +45 -0
  31. package/dist/collection/utils/request.js.map +1 -0
  32. package/dist/collection/utils/url.js +43 -0
  33. package/dist/collection/utils/utils.js +16 -0
  34. package/dist/collection/utils/utils.js.map +1 -0
  35. package/dist/collection/utils/utils.spec.js +10 -0
  36. package/dist/collection/utils/utils.spec.js.map +1 -0
  37. package/dist/components/index.d.ts +6 -0
  38. package/dist/components/index.js +3 -0
  39. package/dist/components/index.js.map +1 -0
  40. package/dist/components/qr-code.d.ts +2 -2
  41. package/dist/components/qr-code.js +8 -0
  42. package/dist/components/qr-code.js.map +1 -0
  43. package/dist/components/qrcode.js +1073 -0
  44. package/dist/components/qrcode.js.map +1 -0
  45. package/dist/components/zero-account.d.ts +2 -2
  46. package/dist/components/zero-account.js +535 -0
  47. package/dist/components/zero-account.js.map +1 -0
  48. package/dist/esm/index-798be1d4.js +1919 -0
  49. package/dist/esm/index-798be1d4.js.map +1 -0
  50. package/dist/esm/index.js +3 -0
  51. package/dist/esm/index.js.map +1 -0
  52. package/dist/esm/loader.js +11 -0
  53. package/dist/esm/loader.js.map +1 -0
  54. package/dist/esm/polyfills/core-js.js +11 -0
  55. package/dist/esm/polyfills/dom.js +79 -0
  56. package/dist/esm/polyfills/es5-html-element.js +1 -0
  57. package/dist/esm/polyfills/index.js +34 -0
  58. package/dist/esm/polyfills/system.js +6 -0
  59. package/dist/esm/qr-code_2.entry.js +1545 -0
  60. package/dist/esm/qr-code_2.entry.js.map +1 -0
  61. package/dist/esm/zero-account.js +20 -0
  62. package/dist/esm/zero-account.js.map +1 -0
  63. package/dist/index.cjs.js +1 -0
  64. package/dist/index.js +1 -0
  65. package/dist/types/components/zero-account/enums.d.ts +8 -8
  66. package/dist/types/components/zero-account/logo.d.ts +2 -2
  67. package/dist/types/components/zero-account/qrcode.d.ts +5 -5
  68. package/dist/types/components/zero-account/websocket.d.ts +27 -25
  69. package/dist/types/components/zero-account/zero-account.d.ts +39 -39
  70. package/dist/types/stencil-public-runtime.d.ts +46 -5
  71. package/dist/types/utils/request.d.ts +5 -5
  72. package/dist/types/utils/utils.d.ts +3 -3
  73. package/dist/zero-account/index.esm.js +0 -1
  74. package/dist/zero-account/index.esm.js.map +1 -1
  75. package/dist/zero-account/p-3b6bbcf5.js +3 -0
  76. package/dist/zero-account/p-3b6bbcf5.js.map +1 -0
  77. package/dist/zero-account/p-b6f591cf.entry.js +2 -0
  78. package/dist/zero-account/p-b6f591cf.entry.js.map +1 -0
  79. package/dist/zero-account/zero-account.esm.js +1 -64
  80. package/dist/zero-account/zero-account.esm.js.map +1 -1
  81. package/loader/index.d.ts +1 -1
  82. package/package.json +10 -10
  83. package/dist/zero-account/app-globals-0f993ce5.js +0 -5
  84. package/dist/zero-account/app-globals-0f993ce5.js.map +0 -1
  85. package/dist/zero-account/enums-816340c2.js +0 -21
  86. package/dist/zero-account/enums-816340c2.js.map +0 -1
  87. package/dist/zero-account/enums-e7827156.js +0 -21
  88. package/dist/zero-account/enums-e7827156.js.map +0 -1
  89. package/dist/zero-account/index-57856b47.js +0 -3380
  90. package/dist/zero-account/index-57856b47.js.map +0 -1
  91. package/dist/zero-account/qr-code.entry.js.map +0 -1
  92. package/dist/zero-account/shadow-css-8a6ccf47.js +0 -389
  93. package/dist/zero-account/shadow-css-8a6ccf47.js.map +0 -1
  94. package/dist/zero-account/zero-account.entry.js +0 -1994
  95. package/dist/zero-account/zero-account.entry.js.map +0 -1
@@ -0,0 +1,111 @@
1
+ import qr from "../../utils/qrcode/qrcode";
2
+ import { h } from "@stencil/core";
3
+ import { ErrorCorrectionLevel } from "./enums";
4
+ const QRC = qr.QrCode;
5
+ export class QRCode {
6
+ constructor() {
7
+ this.url = undefined;
8
+ this.level = ErrorCorrectionLevel.M;
9
+ this.class = '';
10
+ this.color = 'black';
11
+ }
12
+ render() {
13
+ const getEcc = (ecc) => {
14
+ ecc = ecc.toUpperCase();
15
+ if (ecc === 'L')
16
+ return QRC.Ecc.LOW;
17
+ if (ecc === 'M')
18
+ return QRC.Ecc.MEDIUM;
19
+ if (ecc === 'Q')
20
+ return QRC.Ecc.QUARTILE;
21
+ return QRC.Ecc.HIGH;
22
+ };
23
+ const ecc = getEcc(this.level);
24
+ const qr = QRC.encodeText(this.url, ecc);
25
+ const qrcode = qr.svgObject();
26
+ return (h("svg", { class: this.class, viewBox: `0 0 ${qrcode.size} ${qrcode.size}` }, h("path", { d: qrcode.path, fill: this.color })));
27
+ }
28
+ static get is() { return "qr-code"; }
29
+ static get properties() {
30
+ return {
31
+ "url": {
32
+ "type": "string",
33
+ "mutable": false,
34
+ "complexType": {
35
+ "original": "string",
36
+ "resolved": "string",
37
+ "references": {}
38
+ },
39
+ "required": true,
40
+ "optional": false,
41
+ "docs": {
42
+ "tags": [],
43
+ "text": ""
44
+ },
45
+ "attribute": "url",
46
+ "reflect": false
47
+ },
48
+ "level": {
49
+ "type": "string",
50
+ "mutable": false,
51
+ "complexType": {
52
+ "original": "ErrorCorrectionLevel",
53
+ "resolved": "ErrorCorrectionLevel.H | ErrorCorrectionLevel.L | ErrorCorrectionLevel.M | ErrorCorrectionLevel.Q",
54
+ "references": {
55
+ "ErrorCorrectionLevel": {
56
+ "location": "import",
57
+ "path": "./enums",
58
+ "id": "src/components/zero-account/enums.ts::ErrorCorrectionLevel"
59
+ }
60
+ }
61
+ },
62
+ "required": false,
63
+ "optional": true,
64
+ "docs": {
65
+ "tags": [],
66
+ "text": ""
67
+ },
68
+ "attribute": "level",
69
+ "reflect": false,
70
+ "defaultValue": "ErrorCorrectionLevel.M"
71
+ },
72
+ "class": {
73
+ "type": "string",
74
+ "mutable": false,
75
+ "complexType": {
76
+ "original": "string",
77
+ "resolved": "string",
78
+ "references": {}
79
+ },
80
+ "required": false,
81
+ "optional": true,
82
+ "docs": {
83
+ "tags": [],
84
+ "text": ""
85
+ },
86
+ "attribute": "class",
87
+ "reflect": false,
88
+ "defaultValue": "''"
89
+ },
90
+ "color": {
91
+ "type": "string",
92
+ "mutable": false,
93
+ "complexType": {
94
+ "original": "string",
95
+ "resolved": "string",
96
+ "references": {}
97
+ },
98
+ "required": false,
99
+ "optional": true,
100
+ "docs": {
101
+ "tags": [],
102
+ "text": ""
103
+ },
104
+ "attribute": "color",
105
+ "reflect": false,
106
+ "defaultValue": "'black'"
107
+ }
108
+ };
109
+ }
110
+ }
111
+ //# sourceMappingURL=qrcode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qrcode.js","sourceRoot":"","sources":["../../../src/components/zero-account/qrcode.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAE/C,MAAM,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC;AAKtB,MAAM,OAAO,MAAM;;;qBAEsB,oBAAoB,CAAC,CAAC;qBACpC,EAAE;qBACF,OAAO;;IAEhC,MAAM;QACJ,MAAM,MAAM,GAAG,CAAC,GAAW,EAAE,EAAE;YAC7B,GAAG,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;YACxB,IAAI,GAAG,KAAK,GAAG;gBAAE,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;YACpC,IAAI,GAAG,KAAK,GAAG;gBAAE,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;YACvC,IAAI,GAAG,KAAK,GAAG;gBAAE,OAAO,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC;YACzC,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;QACtB,CAAC,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE/B,MAAM,EAAE,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC;QAE9B,OAAO,CACL,WAAK,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE;YAClE,YAAM,CAAC,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,GAAI,CACtC,CACP,CAAC;IACJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CACF","sourcesContent":["import qr from '../../utils/qrcode/qrcode';\nimport { Component, h, Prop } from '@stencil/core';\nimport { ErrorCorrectionLevel } from './enums';\n\nconst QRC = qr.QrCode;\n\n@Component({\n tag: 'qr-code',\n})\nexport class QRCode {\n @Prop() url!: string;\n @Prop() level?: ErrorCorrectionLevel = ErrorCorrectionLevel.M;\n @Prop() class?: string = '';\n @Prop() color?: string = 'black';\n\n render() {\n const getEcc = (ecc: string) => {\n ecc = ecc.toUpperCase();\n if (ecc === 'L') return QRC.Ecc.LOW;\n if (ecc === 'M') return QRC.Ecc.MEDIUM;\n if (ecc === 'Q') return QRC.Ecc.QUARTILE;\n return QRC.Ecc.HIGH;\n };\n\n const ecc = getEcc(this.level);\n\n const qr = QRC.encodeText(this.url, ecc);\n const qrcode = qr.svgObject();\n\n return (\n <svg class={this.class} viewBox={`0 0 ${qrcode.size} ${qrcode.size}`}>\n <path d={qrcode.path} fill={this.color} />\n </svg>\n );\n }\n}\n"]}
@@ -0,0 +1,176 @@
1
+ import { Environment } from "./enums";
2
+ import http from "../../utils/request";
3
+ const DEFAULT_CALLBACK_URL = window.location.origin + '/zero/auth';
4
+ const API_URL = 'wss://ws.0account.com/ws';
5
+ const API_URL_STAGING = 'wss://staging.ws.0account.com/ws';
6
+ const PREFIX = '0account';
7
+ const SESSION_ID = 'session-id';
8
+ const SESSION_TOKEN = 'session-token';
9
+ const fromWidgetUUIDUpdated = 'from-widget-uuid-updated';
10
+ // const fromWidgetAuthenticationStarted = 'from-widget-authentication-started';
11
+ const fromWidgetEnsureSession = 'from-widget-ensure-session';
12
+ const toWidgetLogout = 'to-widget-logout';
13
+ const toWidgetApproved = 'to-widget-approved';
14
+ const toAnyError = 'to-any-error';
15
+ // CustomEvents
16
+ const zeroLogout = '0account-logout';
17
+ const zeroAuthenticated = '0account-authenticated';
18
+ // const zeroAuthenticationFailed = '0account-authentication-failed';
19
+ function debounce(func, timeout = 300) {
20
+ let timer;
21
+ return (...args) => {
22
+ clearTimeout(timer);
23
+ timer = setTimeout(() => {
24
+ func.apply(this, args);
25
+ }, timeout);
26
+ };
27
+ }
28
+ export class WS {
29
+ constructor(appId, opts) {
30
+ this.wsURL = API_URL;
31
+ this.callbackURL = DEFAULT_CALLBACK_URL;
32
+ if (!opts.env)
33
+ opts.env = Environment.production;
34
+ this.appId = appId;
35
+ this.uaParser = opts.uaParser;
36
+ this.callbackURL = opts.callbackURL;
37
+ this.updateInterval = opts.updateInterval;
38
+ this.enableWithCredentials = opts.enableWithCredentials;
39
+ this.log = opts.log;
40
+ if (opts.env !== Environment.production)
41
+ this.wsURL = API_URL_STAGING;
42
+ this.init();
43
+ }
44
+ deviceInfo() {
45
+ return {
46
+ appId: this.appId,
47
+ browser: this.uaParser.getBrowser().withFeatureCheck().name,
48
+ os: this.uaParser.getOS().withFeatureCheck().name,
49
+ // TODO: handle these on backend:
50
+ // device: `${this.uaParser.getDevice().vendor} ${this.uaParser.getDevice().model}`,
51
+ // all: this.uaParser.getResult()
52
+ };
53
+ }
54
+ reinit() {
55
+ const retry = debounce(this.init.bind(this), 1000);
56
+ retry();
57
+ }
58
+ init() {
59
+ const onopen = (_) => {
60
+ this.send(fromWidgetEnsureSession, this.deviceInfo());
61
+ };
62
+ const onmessage = (event) => {
63
+ try {
64
+ const data = JSON.parse(event.data);
65
+ this.handleMessage(data);
66
+ }
67
+ catch (e) {
68
+ this.log(e);
69
+ }
70
+ };
71
+ const onerror = (_) => {
72
+ if (this.socket && (this.socket.readyState !== WebSocket.CLOSED
73
+ && this.socket.readyState !== WebSocket.CLOSING)) {
74
+ this.socket.close();
75
+ }
76
+ };
77
+ const onclose = (_) => {
78
+ if (this.socket) {
79
+ this.socket.removeEventListener('open', onopen);
80
+ this.socket.removeEventListener('message', onmessage);
81
+ this.socket.removeEventListener('error', onerror);
82
+ this.socket.removeEventListener('close', onclose);
83
+ delete this.socket;
84
+ }
85
+ this.reinit();
86
+ };
87
+ if (this.socket) {
88
+ this.socket.removeEventListener('open', onopen);
89
+ this.socket.removeEventListener('message', onmessage);
90
+ this.socket.removeEventListener('error', onerror);
91
+ this.socket.removeEventListener('close', onclose);
92
+ }
93
+ this.socket = new WebSocket(this.wsURL);
94
+ this.socket.addEventListener('open', onopen);
95
+ this.socket.addEventListener('message', onmessage);
96
+ this.socket.addEventListener('error', onerror);
97
+ this.socket.addEventListener('close', onclose);
98
+ }
99
+ updateUUID(uuid) {
100
+ this.uuid = uuid;
101
+ this.send(fromWidgetUUIDUpdated, this.deviceInfo());
102
+ }
103
+ send(action, data) {
104
+ if (!this.socket || !this.socket.readyState || this.socket.readyState !== WebSocket.OPEN) {
105
+ const retry = debounce(this.send.bind(this), 1000);
106
+ return retry();
107
+ }
108
+ const msg = {
109
+ action: action,
110
+ timeout: `${this.updateInterval}ms`,
111
+ uuid: this.uuid,
112
+ appId: `${this.appId}`,
113
+ message: {},
114
+ };
115
+ if (action === fromWidgetEnsureSession) {
116
+ const sessionId = localStorage.getItem(`${PREFIX}_${SESSION_ID}`);
117
+ const sessionToken = localStorage.getItem(`${PREFIX}_${SESSION_TOKEN}`);
118
+ if (!sessionId || !sessionToken)
119
+ return;
120
+ msg.sessionId = sessionId;
121
+ msg.sessionToken = sessionToken;
122
+ }
123
+ if (data)
124
+ msg.message = data;
125
+ this.socket.send(JSON.stringify(msg));
126
+ }
127
+ onZeroAuth() {
128
+ if (this.request)
129
+ this.request.abort();
130
+ this.request = http.send(this.callbackURL, {
131
+ enableWithCredentials: this.enableWithCredentials,
132
+ headers: {
133
+ 'x-0account-uuid': this.uuid,
134
+ 'x-0account-auth': 'true',
135
+ },
136
+ }, (responseText) => {
137
+ try {
138
+ const data = JSON.parse(responseText);
139
+ this.dispatchEventAndWsSend(zeroAuthenticated, data);
140
+ }
141
+ catch (err) {
142
+ this.log(err);
143
+ }
144
+ });
145
+ }
146
+ handleMessage(msg) {
147
+ switch (msg.action) {
148
+ case toWidgetApproved:
149
+ this.onZeroAuth();
150
+ localStorage.setItem(`${PREFIX}_${SESSION_ID}`, msg.sessionId);
151
+ localStorage.setItem(`${PREFIX}_${SESSION_TOKEN}`, msg.message);
152
+ break;
153
+ case toWidgetLogout:
154
+ localStorage.removeItem(`${PREFIX}_${SESSION_ID}`);
155
+ localStorage.removeItem(`${PREFIX}_${SESSION_TOKEN}`);
156
+ this.dispatchEvent(zeroLogout);
157
+ break;
158
+ case toAnyError:
159
+ this.log('ws error', msg);
160
+ break;
161
+ default:
162
+ this.log('incorrect action', msg.action, msg);
163
+ }
164
+ }
165
+ dispatchEventAndWsSend(name, data) {
166
+ this.dispatchEvent(name, data);
167
+ this.send('from-widget-' + name, data);
168
+ }
169
+ dispatchEvent(name, data) {
170
+ let event = new CustomEvent(name);
171
+ if (data)
172
+ event = new CustomEvent(name, { detail: data });
173
+ document.dispatchEvent(event);
174
+ }
175
+ }
176
+ //# sourceMappingURL=websocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../../src/components/zero-account/websocket.ts"],"names":[],"mappings":"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","sourcesContent":["import { UAParser } from 'ua-parser-js';\nimport { Environment } from './enums';\nimport http from '../../utils/request';\n\nconst DEFAULT_CALLBACK_URL = window.location.origin + '/zero/auth';\nconst API_URL = 'wss://ws.0account.com/ws';\nconst API_URL_STAGING = 'wss://staging.ws.0account.com/ws';\n\nconst PREFIX = '0account';\nconst SESSION_ID = 'session-id';\nconst SESSION_TOKEN = 'session-token';\n\nconst fromWidgetUUIDUpdated = 'from-widget-uuid-updated';\n// const fromWidgetAuthenticationStarted = 'from-widget-authentication-started';\nconst fromWidgetEnsureSession = 'from-widget-ensure-session';\n\nconst toWidgetLogout = 'to-widget-logout';\nconst toWidgetApproved = 'to-widget-approved';\nconst toAnyError = 'to-any-error';\n// CustomEvents\nconst zeroLogout = '0account-logout';\nconst zeroAuthenticated = '0account-authenticated';\n// const zeroAuthenticationFailed = '0account-authentication-failed';\n\nfunction debounce(func, timeout = 300) {\n let timer;\n return (...args) => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n func.apply(this, args);\n }, timeout);\n };\n}\n\ntype Options = {\n callbackURL: string,\n updateInterval: number,\n enableWithCredentials: boolean,\n uaParser: UAParser,\n log: (...args) => void\n env?: Environment,\n}\n\n\nexport class WS {\n private readonly appId: string;\n private socket: WebSocket;\n private uaParser: UAParser;\n private readonly log: (...args) => void;\n private uuid: string;\n private wsURL = API_URL;\n private callbackURL = DEFAULT_CALLBACK_URL;\n private request: XMLHttpRequest;\n private readonly updateInterval: number;\n private enableWithCredentials: boolean;\n\n constructor(appId: string, opts: Options) {\n if (!opts.env) opts.env = Environment.production\n\n this.appId = appId;\n this.uaParser = opts.uaParser;\n this.callbackURL = opts.callbackURL;\n this.updateInterval = opts.updateInterval;\n this.enableWithCredentials = opts.enableWithCredentials;\n this.log = opts.log;\n if (opts.env !== Environment.production) this.wsURL = API_URL_STAGING;\n this.init();\n }\n\n private deviceInfo() {\n return {\n appId: this.appId,\n browser: this.uaParser.getBrowser().withFeatureCheck().name,\n os: this.uaParser.getOS().withFeatureCheck().name,\n // TODO: handle these on backend:\n // device: `${this.uaParser.getDevice().vendor} ${this.uaParser.getDevice().model}`,\n // all: this.uaParser.getResult()\n };\n }\n\n private reinit() {\n const retry = debounce(this.init.bind(this), 1000)\n retry()\n }\n\n private init() {\n const onopen = (_) => {\n this.send(fromWidgetEnsureSession, this.deviceInfo());\n };\n const onmessage = (event) => {\n try {\n const data = JSON.parse(event.data);\n this.handleMessage(data);\n } catch (e) {\n this.log(e);\n }\n };\n const onerror = (_) => {\n if (this.socket && (this.socket.readyState !== WebSocket.CLOSED\n && this.socket.readyState !== WebSocket.CLOSING)) {\n this.socket.close();\n }\n };\n const onclose = (_) => {\n if (this.socket) {\n this.socket.removeEventListener('open', onopen);\n this.socket.removeEventListener('message', onmessage);\n this.socket.removeEventListener('error', onerror);\n this.socket.removeEventListener('close', onclose);\n delete this.socket;\n }\n this.reinit();\n };\n\n if (this.socket) {\n this.socket.removeEventListener('open', onopen);\n this.socket.removeEventListener('message', onmessage);\n this.socket.removeEventListener('error', onerror);\n this.socket.removeEventListener('close', onclose);\n }\n this.socket = new WebSocket(this.wsURL);\n this.socket.addEventListener('open', onopen);\n this.socket.addEventListener('message', onmessage);\n this.socket.addEventListener('error', onerror);\n this.socket.addEventListener('close', onclose);\n }\n\n updateUUID(uuid: string) {\n this.uuid = uuid;\n this.send(fromWidgetUUIDUpdated, this.deviceInfo());\n }\n\n send(action, data) {\n if (!this.socket || !this.socket.readyState || this.socket.readyState !== WebSocket.OPEN) {\n const retry = debounce(this.send.bind(this), 1000)\n return retry();\n }\n\n const msg: any = {\n action: action,\n timeout: `${this.updateInterval}ms`,\n uuid: this.uuid,\n appId: `${this.appId}`,\n message: {},\n };\n if (action === fromWidgetEnsureSession) {\n const sessionId = localStorage.getItem(`${PREFIX}_${SESSION_ID}`);\n const sessionToken = localStorage.getItem(`${PREFIX}_${SESSION_TOKEN}`);\n if (!sessionId || !sessionToken) return;\n msg.sessionId = sessionId;\n msg.sessionToken = sessionToken;\n }\n\n if (data) msg.message = data;\n this.socket.send(JSON.stringify(msg));\n }\n\n onZeroAuth() {\n if (this.request) this.request.abort();\n this.request = http.send(this.callbackURL,\n {\n enableWithCredentials: this.enableWithCredentials,\n headers: {\n 'x-0account-uuid': this.uuid,\n 'x-0account-auth': 'true',\n },\n },\n (responseText) => {\n try {\n const data = JSON.parse(responseText);\n this.dispatchEventAndWsSend(zeroAuthenticated, data);\n } catch (err) {\n this.log(err);\n }\n },\n );\n }\n\n private handleMessage(msg: any) {\n switch (msg.action) {\n case toWidgetApproved:\n this.onZeroAuth();\n localStorage.setItem(`${PREFIX}_${SESSION_ID}`, msg.sessionId);\n localStorage.setItem(`${PREFIX}_${SESSION_TOKEN}`, msg.message);\n break;\n case toWidgetLogout:\n localStorage.removeItem(`${PREFIX}_${SESSION_ID}`);\n localStorage.removeItem(`${PREFIX}_${SESSION_TOKEN}`);\n this.dispatchEvent(zeroLogout);\n break;\n case toAnyError:\n this.log('ws error', msg);\n break;\n default:\n this.log('incorrect action', msg.action, msg);\n }\n }\n\n private dispatchEventAndWsSend(name, data) {\n this.dispatchEvent(name, data);\n this.send('from-widget-' + name, data);\n }\n\n private dispatchEvent(name: string, data?: any) {\n let event = new CustomEvent(name);\n if (data) event = new CustomEvent(name, { detail: data });\n document.dispatchEvent(event);\n }\n\n}\n"]}
@@ -0,0 +1,294 @@
1
+ :host {
2
+ --primary-color: #7263FA;
3
+ --primary-background-color: #FFF;
4
+ --theme-based-radius: 0px;
5
+ --theme-based-padding: 0px;
6
+
7
+ /* buttons */
8
+ --button-animation-duration: 200ms;
9
+ --text-color: #000;
10
+ --button-border-color: #B2D4FF;
11
+ --button-border-radius: 9999px;
12
+ --button-background-color: var(--primary-background-color);
13
+
14
+ /* modal */
15
+ --modal-logo-border-color: var(--primary-color);
16
+ --modal-animation-duration: 350ms;
17
+ --easing: cubic-bezier(0.16, 1, 0.3, 1);
18
+ /*--easing: ease;*/
19
+
20
+ font-family: sans-serif;
21
+ }
22
+
23
+ .dark {
24
+ --button-background-color: rgb(30, 41, 59);
25
+ --primary-background-color: rgb(30, 41, 59);
26
+ --button-border-color: #FFFFF9;
27
+ --text-color: #FFFFF9;
28
+ --modal-logo-border-color: #CCC;
29
+ --theme-based-radius: 4px;
30
+ --theme-based-padding: 8px;
31
+ }
32
+
33
+ .button {
34
+ font-size: 16px;
35
+ color: var(--text-color);
36
+ cursor: pointer;
37
+ padding: 8px 12px 8px 10px;
38
+ display: flex;
39
+ flex-direction: row;
40
+ align-items: center;
41
+ gap: 6px;
42
+ border: 1px solid var(--button-border-color);
43
+ background-color: var(--button-background-color);
44
+ border-radius: var(--button-border-radius);
45
+ }
46
+
47
+ .button:hover {
48
+ transition: box-shadow var(--button-animation-duration);
49
+ box-shadow: 0 0 3px rgba(0, 0, 0, 0.3);
50
+ /* lighter shade of --button-background-color */
51
+ background: linear-gradient(
52
+ to top,
53
+ rgba(200, 200, 200, 0.1),
54
+ rgba(200, 200, 200, 0.1)
55
+ ) var(--button-background-color)
56
+ }
57
+
58
+ .button:active {
59
+ transition: box-shadow var(--button-animation-duration);
60
+ box-shadow: 0 0 0 rgba(0, 0, 0, 0);
61
+ }
62
+
63
+ .button__logo {
64
+ width: 1.3rem;
65
+ }
66
+
67
+ /* -------- modal --------- */
68
+
69
+ .modal {
70
+ display: flex;
71
+ z-index: 9999;
72
+ justify-content: center;
73
+ align-items: center;
74
+ position: fixed;
75
+ top: 0;
76
+ left: 0;
77
+ width: 100%;
78
+ height: 100%;
79
+ opacity: 1;
80
+ background-color: rgba(0, 0, 0, 0.3);
81
+ transition: opacity var(--modal-animation-duration) var(--easing);
82
+ }
83
+
84
+ .modal--hidden {
85
+ opacity: 0;
86
+ pointer-events: none;
87
+ }
88
+
89
+ .modal__content {
90
+ max-width: 240px;
91
+ border-radius: 4px;
92
+ position: relative;
93
+ display: flex;
94
+ flex-direction: column;
95
+ align-items: center;
96
+ padding: 16px;
97
+ background-color: var(--primary-background-color);
98
+ transform: scale(1);
99
+ transition: transform var(--modal-animation-duration) var(--easing);
100
+ }
101
+
102
+ .modal--hidden .modal__content {
103
+ transform: scale(0.5);
104
+ }
105
+
106
+ .modal__qrcode__container {
107
+ position: relative;
108
+ background-color: white;
109
+ border-radius: var(--theme-based-radius);
110
+ padding: var(--theme-based-padding);
111
+ }
112
+
113
+ .modal__qrcode {
114
+ border-radius: 4px;
115
+ width: 100%;
116
+ height: auto;
117
+ }
118
+
119
+ .modal__logo {
120
+ padding: 8px;
121
+ border: 2px var(--modal-logo-border-color) solid;
122
+ border-radius: var(--button-border-radius);
123
+ background-color: var(--primary-background-color);
124
+ position: absolute;
125
+ width: 16%;
126
+ top: 50%;
127
+ left: 50%;
128
+ transform: translate3d(-50%, -50%, 0);
129
+ }
130
+
131
+ .modal-animated .circle__overlay {
132
+ width: 100%;
133
+ height: 100%;
134
+ }
135
+
136
+ .modal-animated .modal__qrcode {
137
+ filter: blur(2px);
138
+ }
139
+
140
+ .modal-animated .modal__logo {
141
+ border: none;
142
+ animation: spin 2.5s var(--easing) infinite;
143
+ }
144
+
145
+ @keyframes spin {
146
+ 0% {
147
+ transform: translate3d(-50%, -50%, 0) rotate(0deg);
148
+ }
149
+ 50% {
150
+ transform: translate3d(-50%, -50%, 0) rotate(180deg);
151
+ }
152
+ 100% {
153
+ transform: translate3d(-50%, -50%, 0) rotate(360deg);
154
+ }
155
+ }
156
+
157
+ .modal__buttons {
158
+ width: 100%;
159
+ flex-direction: column;
160
+ align-items: center;
161
+ margin-top: 14px;
162
+ display: flex;
163
+ text-align: center;
164
+ }
165
+
166
+ .modal:not(.modal--hidden) .modal__button {
167
+ transform: scale(1) translate3d(0, 0, 0);
168
+ }
169
+
170
+ .modal:not(.modal--hidden) .modal__link {
171
+ transform: scale(1) translate3d(0, 0, 0);
172
+ }
173
+
174
+ .modal__button {
175
+ transform: scale(0) translate3d(0, 150px, 0);
176
+ transition: calc(var(--modal-animation-duration) + 50ms) var(--easing);
177
+ transition-property: scale, transform, background-color;
178
+ cursor: pointer;
179
+ padding: 12px;
180
+ font-size: 14px;
181
+ background-color: var(--primary-color);
182
+ color: white;
183
+ border: none;
184
+ border-radius: 6px;
185
+ width: 100%;
186
+ }
187
+
188
+ .modal__button:hover {
189
+ /* darker shade of --primary-color */
190
+ background: linear-gradient(
191
+ to top,
192
+ rgba(0, 0, 0, 0.1),
193
+ rgba(0, 0, 0, 0.1)
194
+ ) var(--primary-color);
195
+ }
196
+
197
+ .modal__link {
198
+ transform: scale(0) translate3d(0, 150px, 0);
199
+ transition: calc(var(--modal-animation-duration) + 150ms) var(--easing);
200
+ transition-property: scale, transform;
201
+ font-size: 0.8rem;
202
+ padding: 10px 20px 0;
203
+ color: var(--primary-color);
204
+ width: 100%;
205
+ text-decoration: underline rgba(0, 0, 0, 0);
206
+ }
207
+
208
+ .modal__link:hover {
209
+ text-decoration-color:var(--primary-color);
210
+ }
211
+
212
+ .modal__close-button {
213
+ position: absolute;
214
+ top: -26px;
215
+ right: -26px;
216
+ width: 24px;
217
+ height: 24px;
218
+ background-color: rgba(0, 0, 0, 0.1);
219
+ border-radius: 10px;
220
+ cursor: pointer;
221
+ transition: background-color var(--modal-animation-duration) var(--easing);
222
+ }
223
+
224
+ .modal__close-button:hover {
225
+ background-color: rgba(0, 0, 0, 0.3);
226
+ }
227
+
228
+ .modal__close-button:before,
229
+ .modal__close-button:after {
230
+ content: "";
231
+ position: absolute;
232
+ top: 50%;
233
+ left: 50%;
234
+ width: 50%;
235
+ height: 1px;
236
+ background-color: rgba(255, 255, 255, 0.8);
237
+ transform: translate(-50%, -50%) rotate(45deg);
238
+ }
239
+
240
+ .modal__close-button:after {
241
+ transform: translate(-50%, -50%) rotate(-45deg);
242
+ }
243
+
244
+ /* circle ripple */
245
+
246
+ .circle__overlay{
247
+ overflow: hidden;
248
+ top: 50%;
249
+ left: 50%;
250
+ transform: translate(-50%, -50%);
251
+ position: absolute;
252
+ background-color: var(--primary-background-color);
253
+ border-radius: var(--button-border-radius);
254
+ width: 10%;
255
+ height: 10%;
256
+ border: 2px var(--modal-logo-border-color) solid;
257
+ transition: calc(var(--modal-animation-duration) + 200ms) var(--easing);
258
+ transition-property: width, height, opacity;
259
+ }
260
+
261
+ .circle {
262
+ position: absolute;
263
+ top: 50%;
264
+ left: 50%;
265
+ transform: translate(-50%, -50%);
266
+ width: 100px;
267
+ height: 100px;
268
+ border-radius: 50%;
269
+ background-color: #E0E0E0;
270
+ animation: circle__ripple 2s linear infinite;
271
+ }
272
+
273
+ .circle--medium {
274
+ width: 150px;
275
+ height: 150px;
276
+ animation-duration: 2.5s;
277
+ }
278
+
279
+ .circle--large {
280
+ width: 200px;
281
+ height: 200px;
282
+ animation-duration: 3s;
283
+ }
284
+
285
+ @keyframes circle__ripple {
286
+ 0% {
287
+ transform: translate(-50%, -50%) scale(0);
288
+ opacity: 1;
289
+ }
290
+ 100% {
291
+ transform: translate(-50%, -50%) scale(1.5);
292
+ opacity: 0;
293
+ }
294
+ }
@@ -0,0 +1,26 @@
1
+ import { newE2EPage } from "@stencil/core/testing";
2
+ describe('zero-account', () => {
3
+ it('renders', async () => {
4
+ const page = await newE2EPage();
5
+ await page.setContent('<zero-account></zero-account>');
6
+ const element = await page.find('zero-account');
7
+ expect(element).toHaveClass('hydrated');
8
+ });
9
+ it('renders changes to the name data', async () => {
10
+ const page = await newE2EPage();
11
+ await page.setContent('<zero-account></zero-account>');
12
+ const component = await page.find('zero-account');
13
+ const element = await page.find('zero-account >>> div');
14
+ expect(element.textContent).toEqual(`Hello, World! I'm `);
15
+ component.setProperty('first', 'James');
16
+ await page.waitForChanges();
17
+ expect(element.textContent).toEqual(`Hello, World! I'm James`);
18
+ component.setProperty('last', 'Quincy');
19
+ await page.waitForChanges();
20
+ expect(element.textContent).toEqual(`Hello, World! I'm James Quincy`);
21
+ component.setProperty('middle', 'Earl');
22
+ await page.waitForChanges();
23
+ expect(element.textContent).toEqual(`Hello, World! I'm James Earl Quincy`);
24
+ });
25
+ });
26
+ //# sourceMappingURL=zero-account.e2e.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zero-account.e2e.js","sourceRoot":"","sources":["../../../src/components/zero-account/zero-account.e2e.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QACvB,MAAM,IAAI,GAAG,MAAM,UAAU,EAAE,CAAC;QAEhC,MAAM,IAAI,CAAC,UAAU,CAAC,+BAA+B,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAChD,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,IAAI,GAAG,MAAM,UAAU,EAAE,CAAC;QAEhC,MAAM,IAAI,CAAC,UAAU,CAAC,+BAA+B,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACxD,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAE1D,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;QAE/D,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACxC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;QAEtE,SAAS,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACxC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { newE2EPage } from '@stencil/core/testing';\n\ndescribe('zero-account', () => {\n it('renders', async () => {\n const page = await newE2EPage();\n\n await page.setContent('<zero-account></zero-account>');\n const element = await page.find('zero-account');\n expect(element).toHaveClass('hydrated');\n });\n\n it('renders changes to the name data', async () => {\n const page = await newE2EPage();\n\n await page.setContent('<zero-account></zero-account>');\n const component = await page.find('zero-account');\n const element = await page.find('zero-account >>> div');\n expect(element.textContent).toEqual(`Hello, World! I'm `);\n\n component.setProperty('first', 'James');\n await page.waitForChanges();\n expect(element.textContent).toEqual(`Hello, World! I'm James`);\n\n component.setProperty('last', 'Quincy');\n await page.waitForChanges();\n expect(element.textContent).toEqual(`Hello, World! I'm James Quincy`);\n\n component.setProperty('middle', 'Earl');\n await page.waitForChanges();\n expect(element.textContent).toEqual(`Hello, World! I'm James Earl Quincy`);\n });\n});\n"]}