@foxy.io/elements 1.39.0-beta.6 → 1.39.0-beta.8

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 (27) hide show
  1. package/dist/cdn/foxy-customer-api.js +1 -1
  2. package/dist/cdn/foxy-customer-portal.js +14 -14
  3. package/dist/cdn/foxy-store-form.js +1 -1
  4. package/dist/cdn/shared-d0363ae9.js +1 -0
  5. package/dist/cdn/translations/country/zh-CN.json +248 -0
  6. package/dist/cdn/translations/country/zh-HK.json +245 -0
  7. package/dist/cdn/translations/customer-portal/de.json +1 -0
  8. package/dist/cdn/translations/customer-portal/en.json +1 -0
  9. package/dist/cdn/translations/customer-portal/es.json +1 -0
  10. package/dist/cdn/translations/customer-portal/fr.json +1 -0
  11. package/dist/cdn/translations/customer-portal/nl.json +1 -0
  12. package/dist/cdn/translations/customer-portal/pl.json +1 -0
  13. package/dist/cdn/translations/customer-portal/sv.json +1 -0
  14. package/dist/cdn/translations/customer-portal/zh-HK.json +1182 -0
  15. package/dist/cdn/translations/customer-portal/zh-hk.json +1 -0
  16. package/dist/elements/public/CustomerApi/CustomerApi.d.ts +9 -3
  17. package/dist/elements/public/CustomerApi/CustomerApi.js +3 -1
  18. package/dist/elements/public/CustomerApi/CustomerApi.js.map +1 -1
  19. package/dist/elements/public/CustomerPortal/CustomerPortal.d.ts +36 -0
  20. package/dist/elements/public/CustomerPortal/CustomerPortal.js +23 -9
  21. package/dist/elements/public/CustomerPortal/CustomerPortal.js.map +1 -1
  22. package/dist/elements/public/CustomerPortal/InternalCustomerPortalPasswordResetView.js +9 -0
  23. package/dist/elements/public/CustomerPortal/InternalCustomerPortalPasswordResetView.js.map +1 -1
  24. package/dist/elements/public/StoreForm/StoreForm.js +2 -2
  25. package/dist/elements/public/StoreForm/StoreForm.js.map +1 -1
  26. package/package.json +1 -1
  27. package/dist/cdn/shared-1d0839af.js +0 -1
@@ -3,6 +3,7 @@
3
3
  "title": "重置密码",
4
4
  "subtitle": "请立即更新您的密码以确保帐户安全。",
5
5
  "submit": "继续",
6
+ "skip": "暂时不",
6
7
  "password": {
7
8
  "label": "新密码",
8
9
  "placeholder": "必需的",
@@ -43,9 +43,15 @@ export declare class CustomerApi extends CustomerApi_base {
43
43
  };
44
44
  };
45
45
  static readonly SignInEvent: {
46
- new (typeArg: string, eventInitDict?: CustomEventInit<void> | undefined): {
47
- readonly detail: void;
48
- initCustomEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, detailArg: void): void;
46
+ new (typeArg: string, eventInitDict?: CustomEventInit<{
47
+ forcePasswordReset: boolean;
48
+ }> | undefined): {
49
+ readonly detail: {
50
+ forcePasswordReset: boolean;
51
+ };
52
+ initCustomEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, detailArg: {
53
+ forcePasswordReset: boolean;
54
+ }): void;
49
55
  readonly bubbles: boolean;
50
56
  cancelBubble: boolean;
51
57
  readonly cancelable: boolean;
@@ -126,7 +126,9 @@ export class CustomerApi extends ConfigurableMixin(InferrableMixin(LitElement))
126
126
  let body;
127
127
  try {
128
128
  await this.api.signIn(payload.credential);
129
- this.dispatchEvent(new CustomerApi.SignInEvent('signin'));
129
+ const session = JSON.parse(this.api.storage.getItem(API.SESSION));
130
+ const detail = { forcePasswordReset: !!session.force_password_reset };
131
+ this.dispatchEvent(new CustomerApi.SignInEvent('signin', { detail }));
130
132
  this.requestUpdate();
131
133
  status = 200;
132
134
  body = { _links: { self: { href: request.url } }, ...payload };
@@ -1 +1 @@
1
- {"version":3,"file":"CustomerApi.js","sourceRoot":"","sources":["../../../../src/elements/public/CustomerApi/CustomerApi.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, PropertyDeclarations, TemplateResult, html } from 'lit-element';\n\nimport { API } from '@foxy.io/sdk/customer';\nimport { ConfigurableMixin } from '../../../mixins/configurable';\nimport { FetchEvent } from '../NucleonElement/FetchEvent';\nimport { cookieStorage } from './cookieStorage';\nimport { InferrableMixin } from '../../../mixins/inferrable';\n\n/**\n * Element connector for Customer API.\n *\n * @fires CustomerApi#signout - Instance of `CustomerApi.SignOutEvent`. Dispatched on an element when session expires or code 401 is returned.\n * @fires CustomerApi#signin - Instance of `CustomerApi.SignInEvent`. Dispatched on an element once authenticated.\n * @fires CustomerApi#signup - Instance of `CustomerApi.SignUpEvent`. Dispatched on an element once a customer is created (since v1.24.0).\n *\n * @element foxy-customer-api\n * @since 1.4.0\n */\nexport class CustomerApi extends ConfigurableMixin(InferrableMixin(LitElement)) {\n static readonly SignOutEvent = class extends CustomEvent<void> {};\n\n static readonly SignInEvent = class extends CustomEvent<void> {};\n\n static readonly SignUpEvent = class extends CustomEvent<void> {};\n\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n storage: { type: String, noAccessor: true },\n level: { type: Number, noAccessor: true },\n base: { type: String, noAccessor: true },\n };\n }\n\n private __storage: 'session' | 'cookie' | 'local' = 'local';\n\n private __level = 0;\n\n private __base = location.origin;\n\n private __api: API = this.__createAPIInstance();\n\n private __handleFetch = async (originalEvent: Event) => {\n if (!(originalEvent instanceof FetchEvent)) return;\n if (originalEvent.defaultPrevented) return;\n if (originalEvent.composedPath()[0] === this) return;\n\n originalEvent.preventDefault();\n\n const apiEvent = new FetchEvent('fetch', {\n cancelable: true,\n composed: true,\n request: originalEvent.request,\n bubbles: true,\n reject: (reason: unknown) => originalEvent.respondWith(Promise.reject(reason)),\n resolve: (response: Response) => {\n if (apiEvent.request.url === 'foxy://customer-api/session') this.requestUpdate();\n if (response.status === 401) this.requestUpdate();\n originalEvent.respondWith(Promise.resolve(response));\n },\n });\n\n if (this.dispatchEvent(apiEvent)) apiEvent.respondWith(this.__handleRequest(apiEvent.request));\n };\n\n get isLoggedIn(): boolean {\n return !!this.api.storage.getItem(API.SESSION);\n }\n\n /** `FoxySDK.Customer.API` instance used by this element to communicate with the backend. */\n get api(): API {\n return this.__api;\n }\n\n /** Bookmark URL for this API. This is where the tree traversal begins. We also use this URL as a base for relative paths. */\n get base(): string {\n return this.__base;\n }\n\n set base(value: string) {\n this.__base = value;\n this.__api = this.__createAPIInstance();\n }\n\n /** Numeric Consola log level. If omitted, Consola defaults will be used. */\n get level(): number {\n return this.__level;\n }\n\n set level(value: number) {\n this.__level = value;\n this.__api = this.__createAPIInstance();\n }\n\n /** Credentials storage implementing Web Storage API. Access tokens and other related info will be stored here. Defaults to in-memory storage. */\n get storage(): 'session' | 'cookie' | 'local' {\n return this.__storage;\n }\n\n set storage(value: 'session' | 'cookie' | 'local') {\n this.__storage = value;\n this.__api = this.__createAPIInstance();\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('fetch', this.__handleFetch);\n }\n\n render(): TemplateResult {\n return html`\n ${this.renderTemplateOrSlot(this.isLoggedIn ? 'logged-in' : 'logged-out')}\n <slot></slot>\n `;\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('fetch', this.__handleFetch);\n }\n\n private __createAPIInstance() {\n const storageOptions = {\n session: sessionStorage,\n cookie: cookieStorage,\n local: localStorage,\n };\n\n return new API({\n storage: storageOptions[this.storage],\n level: this.level,\n base: new URL(this.base),\n });\n }\n\n private async __handleVirtualAuthSessionDelete() {\n await this.api.signOut();\n\n this.dispatchEvent(new CustomerApi.SignOutEvent('signout'));\n this.requestUpdate();\n\n return new Response();\n }\n\n private async __handleVirtualAuthSessionPost(request: Request) {\n const payload = await request.clone().json();\n if (payload.type !== 'password') throw new Error(`Unknown payload type ${payload.type}`);\n\n let status: number;\n let body: unknown;\n\n try {\n await this.api.signIn(payload.credential);\n\n this.dispatchEvent(new CustomerApi.SignInEvent('signin'));\n this.requestUpdate();\n\n status = 200;\n body = { _links: { self: { href: request.url } }, ...payload };\n } catch (err) {\n if (!(err instanceof API.AuthError)) throw err;\n if (!(err.code === 'UNAUTHORIZED')) throw err;\n\n const virtualAuthError = {\n message: err.message,\n logref: 'unavailable',\n code: 'invalid_credential_error',\n };\n\n status = 401;\n body = { total: 1, _embedded: { 'fx:errors': [virtualAuthError] } };\n }\n\n return new Response(JSON.stringify(body), { status });\n }\n\n private async __handleVirtualAuthSessionAny(request: Request) {\n return new Response(\n JSON.stringify({\n _links: { self: { href: request.url } },\n message: 'POST to this endpoint to sign in',\n })\n );\n }\n\n private async __handleVirtualAuthRecoverPost(request: Request) {\n const payload = await request.clone().json();\n\n if (payload.type === 'email') {\n await this.api.sendPasswordResetEmail(payload.detail);\n return new Response(\n JSON.stringify({\n _links: { self: { href: request.url } },\n email: payload.email,\n })\n );\n } else {\n throw new Error(`Unknown payload type ${payload.type}`);\n }\n }\n\n private async __handleVirtualAuthRecoverAny(request: Request) {\n return new Response(\n JSON.stringify({\n _links: { self: { href: request.url } },\n message: 'POST to this endpoint to request a password reset',\n })\n );\n }\n\n private async __handleVirtualAuthSignUpPost(request: Request) {\n const data = (await request.clone().json()) as {\n verification: { type: 'hcaptcha'; token: string };\n first_name?: string;\n last_name?: string;\n password?: string;\n email: string;\n };\n\n try {\n await this.api.signUp(data);\n } catch (err) {\n if (!(err instanceof API.AuthError)) throw err;\n\n let message: string;\n let status: number;\n\n if (err.code === 'UNAUTHORIZED') {\n message = 'Customer registration is disabled for this store.';\n status = 401;\n } else if (err.code === 'UNAVAILABLE') {\n message = 'This email address is already in use by an existing customer of this store.';\n status = 403;\n } else if (err.code === 'INVALID_FORM') {\n message = 'Client verification failed.';\n status = 400;\n } else {\n throw err;\n }\n\n const body = JSON.stringify({ total: 1, _embedded: { 'fx:errors': [{ message }] } });\n return new Response(body, { status });\n }\n\n if (data.password) await this.api.signIn(data as Required<typeof data>);\n this.requestUpdate();\n this.dispatchEvent(new CustomerApi.SignUpEvent('signup'));\n\n return new Response(\n JSON.stringify({\n _links: { self: { href: request.url } },\n message: 'Account created',\n })\n );\n }\n\n private async __handleVirtualAuthSignUpAny(request: Request) {\n return new Response(\n JSON.stringify({\n _links: { self: { href: request.url } },\n message: 'POST to this endpoint to create an account',\n })\n );\n }\n\n private async __handleRequest(request: Request) {\n const url = request.url;\n const method = request.method;\n\n try {\n if (url.startsWith('foxy://customer-api/session')) {\n if (method === 'DELETE') return this.__handleVirtualAuthSessionDelete();\n if (method === 'POST') return this.__handleVirtualAuthSessionPost(request);\n return this.__handleVirtualAuthSessionAny(request);\n }\n\n if (url.startsWith('foxy://customer-api/recover')) {\n if (method === 'POST') return this.__handleVirtualAuthRecoverPost(request);\n return this.__handleVirtualAuthRecoverAny(request);\n }\n\n if (url.startsWith('foxy://customer-api/signup')) {\n if (method === 'POST') return this.__handleVirtualAuthSignUpPost(request);\n return this.__handleVirtualAuthSignUpAny(request);\n }\n\n const response = await this.api.fetch(request);\n\n if (response.status === 401) {\n this.api.storage.clear();\n this.dispatchEvent(new CustomerApi.SignOutEvent('signout'));\n this.requestUpdate();\n }\n\n return response;\n } catch (err) {\n return new Response(null, { status: 500 });\n }\n }\n}\n"]}
1
+ {"version":3,"file":"CustomerApi.js","sourceRoot":"","sources":["../../../../src/elements/public/CustomerApi/CustomerApi.ts"],"names":[],"mappings":"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","sourcesContent":["import type { StoredSession } from '@foxy.io/sdk/dist/types/customer/types';\n\nimport { LitElement, PropertyDeclarations, TemplateResult, html } from 'lit-element';\n\nimport { API } from '@foxy.io/sdk/customer';\nimport { ConfigurableMixin } from '../../../mixins/configurable';\nimport { FetchEvent } from '../NucleonElement/FetchEvent';\nimport { cookieStorage } from './cookieStorage';\nimport { InferrableMixin } from '../../../mixins/inferrable';\n\n/**\n * Element connector for Customer API.\n *\n * @fires CustomerApi#signout - Instance of `CustomerApi.SignOutEvent`. Dispatched on an element when session expires or code 401 is returned.\n * @fires CustomerApi#signin - Instance of `CustomerApi.SignInEvent`. Dispatched on an element once authenticated.\n * @fires CustomerApi#signup - Instance of `CustomerApi.SignUpEvent`. Dispatched on an element once a customer is created (since v1.24.0).\n *\n * @element foxy-customer-api\n * @since 1.4.0\n */\nexport class CustomerApi extends ConfigurableMixin(InferrableMixin(LitElement)) {\n static readonly SignOutEvent = class extends CustomEvent<void> {};\n\n static readonly SignInEvent = class extends CustomEvent<{ forcePasswordReset: boolean }> {};\n\n static readonly SignUpEvent = class extends CustomEvent<void> {};\n\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n storage: { type: String, noAccessor: true },\n level: { type: Number, noAccessor: true },\n base: { type: String, noAccessor: true },\n };\n }\n\n private __storage: 'session' | 'cookie' | 'local' = 'local';\n\n private __level = 0;\n\n private __base = location.origin;\n\n private __api: API = this.__createAPIInstance();\n\n private __handleFetch = async (originalEvent: Event) => {\n if (!(originalEvent instanceof FetchEvent)) return;\n if (originalEvent.defaultPrevented) return;\n if (originalEvent.composedPath()[0] === this) return;\n\n originalEvent.preventDefault();\n\n const apiEvent = new FetchEvent('fetch', {\n cancelable: true,\n composed: true,\n request: originalEvent.request,\n bubbles: true,\n reject: (reason: unknown) => originalEvent.respondWith(Promise.reject(reason)),\n resolve: (response: Response) => {\n if (apiEvent.request.url === 'foxy://customer-api/session') this.requestUpdate();\n if (response.status === 401) this.requestUpdate();\n originalEvent.respondWith(Promise.resolve(response));\n },\n });\n\n if (this.dispatchEvent(apiEvent)) apiEvent.respondWith(this.__handleRequest(apiEvent.request));\n };\n\n get isLoggedIn(): boolean {\n return !!this.api.storage.getItem(API.SESSION);\n }\n\n /** `FoxySDK.Customer.API` instance used by this element to communicate with the backend. */\n get api(): API {\n return this.__api;\n }\n\n /** Bookmark URL for this API. This is where the tree traversal begins. We also use this URL as a base for relative paths. */\n get base(): string {\n return this.__base;\n }\n\n set base(value: string) {\n this.__base = value;\n this.__api = this.__createAPIInstance();\n }\n\n /** Numeric Consola log level. If omitted, Consola defaults will be used. */\n get level(): number {\n return this.__level;\n }\n\n set level(value: number) {\n this.__level = value;\n this.__api = this.__createAPIInstance();\n }\n\n /** Credentials storage implementing Web Storage API. Access tokens and other related info will be stored here. Defaults to in-memory storage. */\n get storage(): 'session' | 'cookie' | 'local' {\n return this.__storage;\n }\n\n set storage(value: 'session' | 'cookie' | 'local') {\n this.__storage = value;\n this.__api = this.__createAPIInstance();\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('fetch', this.__handleFetch);\n }\n\n render(): TemplateResult {\n return html`\n ${this.renderTemplateOrSlot(this.isLoggedIn ? 'logged-in' : 'logged-out')}\n <slot></slot>\n `;\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('fetch', this.__handleFetch);\n }\n\n private __createAPIInstance() {\n const storageOptions = {\n session: sessionStorage,\n cookie: cookieStorage,\n local: localStorage,\n };\n\n return new API({\n storage: storageOptions[this.storage],\n level: this.level,\n base: new URL(this.base),\n });\n }\n\n private async __handleVirtualAuthSessionDelete() {\n await this.api.signOut();\n\n this.dispatchEvent(new CustomerApi.SignOutEvent('signout'));\n this.requestUpdate();\n\n return new Response();\n }\n\n private async __handleVirtualAuthSessionPost(request: Request) {\n const payload = await request.clone().json();\n if (payload.type !== 'password') throw new Error(`Unknown payload type ${payload.type}`);\n\n let status: number;\n let body: unknown;\n\n try {\n await this.api.signIn(payload.credential);\n\n const session = JSON.parse(this.api.storage.getItem(API.SESSION) as string) as StoredSession;\n const detail = { forcePasswordReset: !!session.force_password_reset };\n\n this.dispatchEvent(new CustomerApi.SignInEvent('signin', { detail }));\n this.requestUpdate();\n\n status = 200;\n body = { _links: { self: { href: request.url } }, ...payload };\n } catch (err) {\n if (!(err instanceof API.AuthError)) throw err;\n if (!(err.code === 'UNAUTHORIZED')) throw err;\n\n const virtualAuthError = {\n message: err.message,\n logref: 'unavailable',\n code: 'invalid_credential_error',\n };\n\n status = 401;\n body = { total: 1, _embedded: { 'fx:errors': [virtualAuthError] } };\n }\n\n return new Response(JSON.stringify(body), { status });\n }\n\n private async __handleVirtualAuthSessionAny(request: Request) {\n return new Response(\n JSON.stringify({\n _links: { self: { href: request.url } },\n message: 'POST to this endpoint to sign in',\n })\n );\n }\n\n private async __handleVirtualAuthRecoverPost(request: Request) {\n const payload = await request.clone().json();\n\n if (payload.type === 'email') {\n await this.api.sendPasswordResetEmail(payload.detail);\n return new Response(\n JSON.stringify({\n _links: { self: { href: request.url } },\n email: payload.email,\n })\n );\n } else {\n throw new Error(`Unknown payload type ${payload.type}`);\n }\n }\n\n private async __handleVirtualAuthRecoverAny(request: Request) {\n return new Response(\n JSON.stringify({\n _links: { self: { href: request.url } },\n message: 'POST to this endpoint to request a password reset',\n })\n );\n }\n\n private async __handleVirtualAuthSignUpPost(request: Request) {\n const data = (await request.clone().json()) as {\n verification: { type: 'hcaptcha'; token: string };\n first_name?: string;\n last_name?: string;\n password?: string;\n email: string;\n };\n\n try {\n await this.api.signUp(data);\n } catch (err) {\n if (!(err instanceof API.AuthError)) throw err;\n\n let message: string;\n let status: number;\n\n if (err.code === 'UNAUTHORIZED') {\n message = 'Customer registration is disabled for this store.';\n status = 401;\n } else if (err.code === 'UNAVAILABLE') {\n message = 'This email address is already in use by an existing customer of this store.';\n status = 403;\n } else if (err.code === 'INVALID_FORM') {\n message = 'Client verification failed.';\n status = 400;\n } else {\n throw err;\n }\n\n const body = JSON.stringify({ total: 1, _embedded: { 'fx:errors': [{ message }] } });\n return new Response(body, { status });\n }\n\n if (data.password) await this.api.signIn(data as Required<typeof data>);\n this.requestUpdate();\n this.dispatchEvent(new CustomerApi.SignUpEvent('signup'));\n\n return new Response(\n JSON.stringify({\n _links: { self: { href: request.url } },\n message: 'Account created',\n })\n );\n }\n\n private async __handleVirtualAuthSignUpAny(request: Request) {\n return new Response(\n JSON.stringify({\n _links: { self: { href: request.url } },\n message: 'POST to this endpoint to create an account',\n })\n );\n }\n\n private async __handleRequest(request: Request) {\n const url = request.url;\n const method = request.method;\n\n try {\n if (url.startsWith('foxy://customer-api/session')) {\n if (method === 'DELETE') return this.__handleVirtualAuthSessionDelete();\n if (method === 'POST') return this.__handleVirtualAuthSessionPost(request);\n return this.__handleVirtualAuthSessionAny(request);\n }\n\n if (url.startsWith('foxy://customer-api/recover')) {\n if (method === 'POST') return this.__handleVirtualAuthRecoverPost(request);\n return this.__handleVirtualAuthRecoverAny(request);\n }\n\n if (url.startsWith('foxy://customer-api/signup')) {\n if (method === 'POST') return this.__handleVirtualAuthSignUpPost(request);\n return this.__handleVirtualAuthSignUpAny(request);\n }\n\n const response = await this.api.fetch(request);\n\n if (response.status === 401) {\n this.api.storage.clear();\n this.dispatchEvent(new CustomerApi.SignOutEvent('signout'));\n this.requestUpdate();\n }\n\n return response;\n } catch (err) {\n return new Response(null, { status: 500 });\n }\n }\n}\n"]}
@@ -8,6 +8,40 @@ declare const CustomerPortal_base: typeof CustomerApi & {
8
8
  };
9
9
  export declare class CustomerPortal extends CustomerPortal_base {
10
10
  #private;
11
+ static readonly PasswordResetEvent: {
12
+ new (typeArg: string, eventInitDict?: CustomEventInit<{
13
+ result: 'skipped' | 'completed';
14
+ }> | undefined): {
15
+ readonly detail: {
16
+ result: 'skipped' | 'completed';
17
+ };
18
+ initCustomEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, detailArg: {
19
+ result: 'skipped' | 'completed';
20
+ }): void;
21
+ readonly bubbles: boolean;
22
+ cancelBubble: boolean;
23
+ readonly cancelable: boolean;
24
+ readonly composed: boolean;
25
+ readonly currentTarget: EventTarget | null;
26
+ readonly defaultPrevented: boolean;
27
+ readonly eventPhase: number;
28
+ readonly isTrusted: boolean;
29
+ returnValue: boolean;
30
+ readonly srcElement: EventTarget | null;
31
+ readonly target: EventTarget | null;
32
+ readonly timeStamp: number;
33
+ readonly type: string;
34
+ composedPath(): EventTarget[];
35
+ initEvent(type: string, bubbles?: boolean | undefined, cancelable?: boolean | undefined): void;
36
+ preventDefault(): void;
37
+ stopImmediatePropagation(): void;
38
+ stopPropagation(): void;
39
+ readonly AT_TARGET: number;
40
+ readonly BUBBLING_PHASE: number;
41
+ readonly CAPTURING_PHASE: number;
42
+ readonly NONE: number;
43
+ };
44
+ };
11
45
  static get properties(): PropertyDeclarations;
12
46
  /** Same as `.columns` property on `foxy-transactions-table`. Sets columns of that table. */
13
47
  transactionsTableColumns: TransactionsTable['columns'];
@@ -31,5 +65,7 @@ export declare class CustomerPortal extends CustomerPortal_base {
31
65
  group: string;
32
66
  render(): TemplateResult;
33
67
  updated(changedProperties: Map<keyof this, unknown>): void;
68
+ private __handlePasswordResetUpdate;
69
+ private __handlePasswordResetSkip;
34
70
  }
35
71
  export {};
@@ -59,20 +59,14 @@ export class CustomerPortal extends TranslatableMixin(ThemeableMixin(CustomerApi
59
59
  settingsHref = undefined;
60
60
  }
61
61
  return this.api.storage.getItem(API.SESSION)
62
- ? !this.skipPasswordReset && this.api.usesTemporaryPassword
62
+ ? !this.skipPasswordReset && this.api.usesTemporaryPassword && __classPrivateFieldGet(this, _temporaryPassword)
63
63
  ? html `
64
64
  <foxy-internal-customer-portal-password-reset-view
65
65
  password-old=${ifDefined((_a = __classPrivateFieldGet(this, _temporaryPassword)) !== null && _a !== void 0 ? _a : void 0)}
66
66
  infer="password-reset"
67
67
  href=${this.base}
68
- @update=${(evt) => {
69
- var _a;
70
- if (((_a = evt.detail) === null || _a === void 0 ? void 0 : _a.result) === UpdateEvent.UpdateResult.ResourceUpdated) {
71
- this.api.usesTemporaryPassword = false;
72
- __classPrivateFieldSet(this, _temporaryPassword, null);
73
- this.requestUpdate();
74
- }
75
- }}
68
+ @update=${this.__handlePasswordResetUpdate}
69
+ @skip=${this.__handlePasswordResetSkip}
76
70
  >
77
71
  </foxy-internal-customer-portal-password-reset-view>
78
72
  `
@@ -106,6 +100,26 @@ export class CustomerPortal extends TranslatableMixin(ThemeableMixin(CustomerApi
106
100
  __classPrivateFieldSet(this, _temporaryPassword, null);
107
101
  }
108
102
  }
103
+ __handlePasswordResetUpdate(evt) {
104
+ var _a;
105
+ if (((_a = evt.detail) === null || _a === void 0 ? void 0 : _a.result) === UpdateEvent.UpdateResult.ResourceUpdated) {
106
+ this.api.usesTemporaryPassword = false;
107
+ __classPrivateFieldSet(this, _temporaryPassword, null);
108
+ this.requestUpdate();
109
+ this.dispatchEvent(new CustomerPortal.PasswordResetEvent('passwordreset', {
110
+ detail: { result: 'completed' },
111
+ }));
112
+ }
113
+ }
114
+ __handlePasswordResetSkip() {
115
+ __classPrivateFieldSet(this, _temporaryPassword, null);
116
+ this.requestUpdate();
117
+ this.dispatchEvent(new CustomerPortal.PasswordResetEvent('passwordreset', {
118
+ detail: { result: 'skipped' },
119
+ }));
120
+ }
109
121
  }
110
122
  _temporaryPassword = new WeakMap();
123
+ CustomerPortal.PasswordResetEvent = class extends CustomEvent {
124
+ };
111
125
  //# sourceMappingURL=CustomerPortal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CustomerPortal.js","sourceRoot":"","sources":["../../../../src/elements/public/CustomerPortal/CustomerPortal.ts"],"names":[],"mappings":"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","sourcesContent":["import { PropertyDeclarations, TemplateResult, html } from 'lit-element';\n\nimport { API } from '@foxy.io/sdk/customer';\nimport { CustomerApi } from '../CustomerApi/CustomerApi';\nimport { ThemeableMixin } from '../../../mixins/themeable';\nimport { TranslatableMixin } from '../../../mixins/translatable';\nimport { TransactionsTable } from '../TransactionsTable/TransactionsTable';\nimport { UpdateEvent } from '../NucleonElement/UpdateEvent';\nimport { ifDefined } from 'lit-html/directives/if-defined';\n\nexport class CustomerPortal extends TranslatableMixin(\n ThemeableMixin(CustomerApi),\n 'customer-portal'\n) {\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n transactionsTableColumns: { attribute: false },\n skipPasswordReset: { type: Boolean, attribute: 'skip-password-reset' },\n embedUrl: { attribute: 'embed-url' },\n group: { type: String },\n };\n }\n\n /** Same as `.columns` property on `foxy-transactions-table`. Sets columns of that table. */\n transactionsTableColumns: TransactionsTable['columns'] = [\n TransactionsTable.priceColumn,\n TransactionsTable.summaryColumn,\n TransactionsTable.statusColumn,\n TransactionsTable.idColumn,\n TransactionsTable.dateColumn,\n TransactionsTable.receiptColumn,\n ];\n\n #temporaryPassword: string | null = null;\n\n /** When set to true, portal won't display Password Reset screen if customer logs in with a temporary password. */\n skipPasswordReset = false;\n\n /**\n * URL of the Payment Card Embed for updating payment method.\n * When set, the payment method will be editable. Otherwise, the customers\n * will only be able to view and delete it.\n *\n * ```html\n * <foxy-customer-portal\n * embed-url=\"https://embed.foxy.io/v1.html?template_set_id=123\"\n * base=\"https://demo.foxycart.com/s/customer/\"\n * >\n * </foxy-customer-portal>\n * ```\n */\n embedUrl: string | null = null;\n\n /** Rumour group. Elements in different groups will not share updates. Empty by default. */\n group = '';\n\n render(): TemplateResult {\n let settingsHref: URL | undefined;\n\n try {\n settingsHref = new URL('./customer_portal_settings', this.base);\n } catch {\n settingsHref = undefined;\n }\n\n return this.api.storage.getItem(API.SESSION)\n ? !this.skipPasswordReset && this.api.usesTemporaryPassword\n ? html`\n <foxy-internal-customer-portal-password-reset-view\n password-old=${ifDefined(this.#temporaryPassword ?? void 0)}\n infer=\"password-reset\"\n href=${this.base}\n @update=${(evt: UpdateEvent) => {\n if (evt.detail?.result === UpdateEvent.UpdateResult.ResourceUpdated) {\n this.api.usesTemporaryPassword = false;\n this.#temporaryPassword = null;\n this.requestUpdate();\n }\n }}\n >\n </foxy-internal-customer-portal-password-reset-view>\n `\n : html`\n <foxy-internal-customer-portal-logged-in-view\n embed-url=${ifDefined(this.embedUrl ?? void 0)}\n customer=${this.base}\n class=\"h-full\"\n infer=\"\"\n href=${ifDefined(settingsHref?.toString())}\n .transactionsTableColumns=${this.transactionsTableColumns}\n >\n </foxy-internal-customer-portal-logged-in-view>\n `\n : html`\n <foxy-internal-customer-portal-logged-out-view\n class=\"h-full\"\n infer=\"\"\n href=${ifDefined(settingsHref?.toString())}\n @password=${(evt: CustomEvent<string | null>) => {\n this.#temporaryPassword = evt.detail;\n }}\n >\n </foxy-internal-customer-portal-logged-out-view>\n `;\n }\n\n updated(changedProperties: Map<keyof this, unknown>): void {\n super.updated(changedProperties);\n const isLoggedIn = this.api.storage.getItem(API.SESSION) !== null;\n if (isLoggedIn && (this.skipPasswordReset || !this.api.usesTemporaryPassword)) {\n this.#temporaryPassword = null;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"CustomerPortal.js","sourceRoot":"","sources":["../../../../src/elements/public/CustomerPortal/CustomerPortal.ts"],"names":[],"mappings":"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","sourcesContent":["import { PropertyDeclarations, TemplateResult, html } from 'lit-element';\n\nimport { API } from '@foxy.io/sdk/customer';\nimport { CustomerApi } from '../CustomerApi/CustomerApi';\nimport { ThemeableMixin } from '../../../mixins/themeable';\nimport { TranslatableMixin } from '../../../mixins/translatable';\nimport { TransactionsTable } from '../TransactionsTable/TransactionsTable';\nimport { UpdateEvent } from '../NucleonElement/UpdateEvent';\nimport { ifDefined } from 'lit-html/directives/if-defined';\n\nexport class CustomerPortal extends TranslatableMixin(\n ThemeableMixin(CustomerApi),\n 'customer-portal'\n) {\n static readonly PasswordResetEvent = class extends CustomEvent<{\n result: 'skipped' | 'completed';\n }> {};\n\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n transactionsTableColumns: { attribute: false },\n skipPasswordReset: { type: Boolean, attribute: 'skip-password-reset' },\n embedUrl: { attribute: 'embed-url' },\n group: { type: String },\n };\n }\n\n /** Same as `.columns` property on `foxy-transactions-table`. Sets columns of that table. */\n transactionsTableColumns: TransactionsTable['columns'] = [\n TransactionsTable.priceColumn,\n TransactionsTable.summaryColumn,\n TransactionsTable.statusColumn,\n TransactionsTable.idColumn,\n TransactionsTable.dateColumn,\n TransactionsTable.receiptColumn,\n ];\n\n #temporaryPassword: string | null = null;\n\n /** When set to true, portal won't display Password Reset screen if customer logs in with a temporary password. */\n skipPasswordReset = false;\n\n /**\n * URL of the Payment Card Embed for updating payment method.\n * When set, the payment method will be editable. Otherwise, the customers\n * will only be able to view and delete it.\n *\n * ```html\n * <foxy-customer-portal\n * embed-url=\"https://embed.foxy.io/v1.html?template_set_id=123\"\n * base=\"https://demo.foxycart.com/s/customer/\"\n * >\n * </foxy-customer-portal>\n * ```\n */\n embedUrl: string | null = null;\n\n /** Rumour group. Elements in different groups will not share updates. Empty by default. */\n group = '';\n\n render(): TemplateResult {\n let settingsHref: URL | undefined;\n\n try {\n settingsHref = new URL('./customer_portal_settings', this.base);\n } catch {\n settingsHref = undefined;\n }\n\n return this.api.storage.getItem(API.SESSION)\n ? !this.skipPasswordReset && this.api.usesTemporaryPassword && this.#temporaryPassword\n ? html`\n <foxy-internal-customer-portal-password-reset-view\n password-old=${ifDefined(this.#temporaryPassword ?? void 0)}\n infer=\"password-reset\"\n href=${this.base}\n @update=${this.__handlePasswordResetUpdate}\n @skip=${this.__handlePasswordResetSkip}\n >\n </foxy-internal-customer-portal-password-reset-view>\n `\n : html`\n <foxy-internal-customer-portal-logged-in-view\n embed-url=${ifDefined(this.embedUrl ?? void 0)}\n customer=${this.base}\n class=\"h-full\"\n infer=\"\"\n href=${ifDefined(settingsHref?.toString())}\n .transactionsTableColumns=${this.transactionsTableColumns}\n >\n </foxy-internal-customer-portal-logged-in-view>\n `\n : html`\n <foxy-internal-customer-portal-logged-out-view\n class=\"h-full\"\n infer=\"\"\n href=${ifDefined(settingsHref?.toString())}\n @password=${(evt: CustomEvent<string | null>) => {\n this.#temporaryPassword = evt.detail;\n }}\n >\n </foxy-internal-customer-portal-logged-out-view>\n `;\n }\n\n updated(changedProperties: Map<keyof this, unknown>): void {\n super.updated(changedProperties);\n const isLoggedIn = this.api.storage.getItem(API.SESSION) !== null;\n if (isLoggedIn && (this.skipPasswordReset || !this.api.usesTemporaryPassword)) {\n this.#temporaryPassword = null;\n }\n }\n\n private __handlePasswordResetUpdate(evt: UpdateEvent) {\n if (evt.detail?.result === UpdateEvent.UpdateResult.ResourceUpdated) {\n this.api.usesTemporaryPassword = false;\n this.#temporaryPassword = null;\n this.requestUpdate();\n this.dispatchEvent(\n new CustomerPortal.PasswordResetEvent('passwordreset', {\n detail: { result: 'completed' },\n })\n );\n }\n }\n\n private __handlePasswordResetSkip() {\n this.#temporaryPassword = null;\n this.requestUpdate();\n this.dispatchEvent(\n new CustomerPortal.PasswordResetEvent('passwordreset', {\n detail: { result: 'skipped' },\n })\n );\n }\n}\n"]}
@@ -60,6 +60,15 @@ export class InternalCustomerPortalPasswordResetView extends TranslatableMixin(I
60
60
  >
61
61
  <foxy-i18n infer="" key="submit"></foxy-i18n>
62
62
  </vaadin-button>
63
+
64
+ <vaadin-button
65
+ class="w-full mt-s"
66
+ theme="tertiary"
67
+ ?disabled=${this.disabled || !this.in('idle')}
68
+ @click=${() => this.dispatchEvent(new CustomEvent('skip'))}
69
+ >
70
+ <foxy-i18n infer="" key="skip"></foxy-i18n>
71
+ </vaadin-button>
63
72
  </div>
64
73
  `;
65
74
  }
@@ -1 +1 @@
1
- {"version":3,"file":"InternalCustomerPortalPasswordResetView.js","sourceRoot":"","sources":["../../../../src/elements/public/CustomerPortal/InternalCustomerPortalPasswordResetView.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAAE,wCAAqC;AACjE,OAAO,EAAE,YAAY,EAAE,oDAAiD;AACxE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAC5D,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,gBAAgB,CAAC;AAYhE,MAAM,OAAO,uCAAwC,SAAQ,iBAAiB,CAAC,YAAY,CAAO;IAAlG;;QA2BE,gBAAW,GAAkB,IAAI,CAAC;QAEjB,uBAAkB,GAAqB;YACtD,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;SACxD,CAAC;IAkDJ,CAAC;IAhFC,MAAM,KAAK,UAAU;QACnB,OAAO;YACL,GAAG,KAAK,CAAC,UAAU;YACnB,WAAW,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE;SAC3C,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,MAAM;QACf,OAAO;YACL,KAAK,CAAC,MAAM;YACZ,GAAG;;;OAIF;SACF,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG;QACZ,OAAO;YACL,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,uBAAuB;YACnD,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,IAAI,uBAAuB;YACpE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,uBAAuB;SAClF,CAAC;IACJ,CAAC;IAQD,UAAU;QACR,OAAO,IAAI,CAAA;;yCAE0B,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,WAAW;;;;2BAI7D,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,gBAAgB;;;;;;;;8BAQjD,IAAI,CAAC,kBAAkB;;;;;;;sBAO/B,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC;mBACpC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE;;;;;KAKjC,CAAC;IACJ,CAAC;IAED,MAAM;;QACJ,IAAI,CAAC,IAAI,CAAC,EAAE,YAAY,QAAE,IAAI,CAAC,WAAW,mCAAI,EAAE,EAAE,CAAC,CAAC;QACpD,KAAK,CAAC,MAAM,EAAE,CAAC;IACjB,CAAC;IAES,KAAK,CAAC,MAAM,CAAiB,GAAG,IAAiC;QACzE,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;QACrC,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO;YAAE,OAAO,KAAK,CAAC,MAAM,CAAU,GAAG,IAAI,CAAC,CAAC;QAEtE,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,CAAO,GAAG,IAAI,CAAC,CAAC;QAE/C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE9B,OAAO,IAA0B,CAAC;IACpC,CAAC;CACF","sourcesContent":["import type { CSSResultArray, PropertyDeclarations, TemplateResult } from 'lit-element';\nimport type { GeneratorOptions } from '../../internal/InternalPasswordControl/generateRandomPassword';\nimport type { NucleonV8N } from '../NucleonElement/types';\nimport type { Resource } from '@foxy.io/sdk/core';\nimport type { Graph } from '@foxy.io/sdk/customer';\n\nimport { TranslatableMixin } from '../../../mixins/translatable';\nimport { InternalForm } from '../../internal/InternalForm/InternalForm';\nimport { html, css } from 'lit-element';\n\nimport checkPasswordStrength from 'check-password-strength';\nconst passwordStrength = checkPasswordStrength.passwordStrength;\n\ntype Data = Resource<\n Graph & {\n props: {\n /** When updating the password using Customer API, these values are required to complete the request. */\n password_old?: string;\n password?: string;\n };\n }\n>;\n\nexport class InternalCustomerPortalPasswordResetView extends TranslatableMixin(InternalForm)<Data> {\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n passwordOld: { attribute: 'password-old' },\n };\n }\n\n static get styles(): CSSResultArray {\n return [\n super.styles,\n css`\n .max-w-25rem {\n max-width: 25rem;\n }\n `,\n ];\n }\n\n static get v8n(): NucleonV8N<Data> {\n return [\n ({ password: v }) => !!v || 'password:v8n_required',\n ({ password: v }) => !v || v.length <= 50 || 'password:v8n_too_long',\n ({ password: v }) => !v || passwordStrength(v).id >= 2 || 'password:v8n_too_weak',\n ];\n }\n\n passwordOld: string | null = null;\n\n private readonly __generatorOptions: GeneratorOptions = {\n checkStrength: value => passwordStrength(value).id >= 2,\n };\n\n renderBody(): TemplateResult {\n return html`\n <div class=\"m-auto max-w-25rem leading-s\">\n <p class=\"text-xxl font-medium ${this.in('busy') ? 'text-disabled' : 'text-body'}\">\n <foxy-i18n infer=\"\" key=\"title\"></foxy-i18n>\n </p>\n\n <p class=\"text-l ${this.in('busy') ? 'text-disabled' : 'text-secondary'}\">\n <foxy-i18n infer=\"\" key=\"subtitle\"></foxy-i18n>\n </p>\n\n <foxy-internal-password-control\n infer=\"password\"\n class=\"mt-m\"\n show-generator\n .generatorOptions=${this.__generatorOptions}\n >\n </foxy-internal-password-control>\n\n <vaadin-button\n class=\"w-full mt-l\"\n theme=\"primary\"\n ?disabled=${this.disabled || !this.in('idle')}\n @click=${() => this.submit()}\n >\n <foxy-i18n infer=\"\" key=\"submit\"></foxy-i18n>\n </vaadin-button>\n </div>\n `;\n }\n\n submit(): void {\n this.edit({ password_old: this.passwordOld ?? '' });\n super.submit();\n }\n\n protected async _fetch<TResult = Data>(...args: Parameters<Window['fetch']>): Promise<TResult> {\n const request = new Request(...args);\n if (request.method !== 'PATCH') return super._fetch<TResult>(...args);\n\n const body = await request.json();\n const data = await super._fetch<Data>(...args);\n\n data.password_old = body.password_old;\n data.password = body.password;\n\n return data as unknown as TResult;\n }\n}\n"]}
1
+ {"version":3,"file":"InternalCustomerPortalPasswordResetView.js","sourceRoot":"","sources":["../../../../src/elements/public/CustomerPortal/InternalCustomerPortalPasswordResetView.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CSSResultArray, PropertyDeclarations, TemplateResult } from 'lit-element';\nimport type { GeneratorOptions } from '../../internal/InternalPasswordControl/generateRandomPassword';\nimport type { NucleonV8N } from '../NucleonElement/types';\nimport type { Resource } from '@foxy.io/sdk/core';\nimport type { Graph } from '@foxy.io/sdk/customer';\n\nimport { TranslatableMixin } from '../../../mixins/translatable';\nimport { InternalForm } from '../../internal/InternalForm/InternalForm';\nimport { html, css } from 'lit-element';\n\nimport checkPasswordStrength from 'check-password-strength';\nconst passwordStrength = checkPasswordStrength.passwordStrength;\n\ntype Data = Resource<\n Graph & {\n props: {\n /** When updating the password using Customer API, these values are required to complete the request. */\n password_old?: string;\n password?: string;\n };\n }\n>;\n\nexport class InternalCustomerPortalPasswordResetView extends TranslatableMixin(InternalForm)<Data> {\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n passwordOld: { attribute: 'password-old' },\n };\n }\n\n static get styles(): CSSResultArray {\n return [\n super.styles,\n css`\n .max-w-25rem {\n max-width: 25rem;\n }\n `,\n ];\n }\n\n static get v8n(): NucleonV8N<Data> {\n return [\n ({ password: v }) => !!v || 'password:v8n_required',\n ({ password: v }) => !v || v.length <= 50 || 'password:v8n_too_long',\n ({ password: v }) => !v || passwordStrength(v).id >= 2 || 'password:v8n_too_weak',\n ];\n }\n\n passwordOld: string | null = null;\n\n private readonly __generatorOptions: GeneratorOptions = {\n checkStrength: value => passwordStrength(value).id >= 2,\n };\n\n renderBody(): TemplateResult {\n return html`\n <div class=\"m-auto max-w-25rem leading-s\">\n <p class=\"text-xxl font-medium ${this.in('busy') ? 'text-disabled' : 'text-body'}\">\n <foxy-i18n infer=\"\" key=\"title\"></foxy-i18n>\n </p>\n\n <p class=\"text-l ${this.in('busy') ? 'text-disabled' : 'text-secondary'}\">\n <foxy-i18n infer=\"\" key=\"subtitle\"></foxy-i18n>\n </p>\n\n <foxy-internal-password-control\n infer=\"password\"\n class=\"mt-m\"\n show-generator\n .generatorOptions=${this.__generatorOptions}\n >\n </foxy-internal-password-control>\n\n <vaadin-button\n class=\"w-full mt-l\"\n theme=\"primary\"\n ?disabled=${this.disabled || !this.in('idle')}\n @click=${() => this.submit()}\n >\n <foxy-i18n infer=\"\" key=\"submit\"></foxy-i18n>\n </vaadin-button>\n\n <vaadin-button\n class=\"w-full mt-s\"\n theme=\"tertiary\"\n ?disabled=${this.disabled || !this.in('idle')}\n @click=${() => this.dispatchEvent(new CustomEvent('skip'))}\n >\n <foxy-i18n infer=\"\" key=\"skip\"></foxy-i18n>\n </vaadin-button>\n </div>\n `;\n }\n\n submit(): void {\n this.edit({ password_old: this.passwordOld ?? '' });\n super.submit();\n }\n\n protected async _fetch<TResult = Data>(...args: Parameters<Window['fetch']>): Promise<TResult> {\n const request = new Request(...args);\n if (request.method !== 'PATCH') return super._fetch<TResult>(...args);\n\n const body = await request.json();\n const data = await super._fetch<Data>(...args);\n\n data.password_old = body.password_old;\n data.password = body.password;\n\n return data as unknown as TResult;\n }\n}\n"]}
@@ -222,8 +222,8 @@ export class StoreForm extends Base {
222
222
  { label: 'option_tls', value: 'tls' },
223
223
  { label: 'option_none', value: '' },
224
224
  ];
225
- this.__singleWebhookKeyGeneratorOptions = { length: 128, separator: '' };
226
- this.__jsonWebhookKeyGeneratorOptions = { length: 64, separator: '' };
225
+ this.__singleWebhookKeyGeneratorOptions = { length: 90, separator: '' };
226
+ this.__jsonWebhookKeyGeneratorOptions = { length: 90, separator: '' };
227
227
  this.__useSingleWebhookKeyGetValue = () => {
228
228
  var _a;
229
229
  try {