@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.
- package/dist/cdn/foxy-customer-api.js +1 -1
- package/dist/cdn/foxy-customer-portal.js +14 -14
- package/dist/cdn/foxy-store-form.js +1 -1
- package/dist/cdn/shared-d0363ae9.js +1 -0
- package/dist/cdn/translations/country/zh-CN.json +248 -0
- package/dist/cdn/translations/country/zh-HK.json +245 -0
- package/dist/cdn/translations/customer-portal/de.json +1 -0
- package/dist/cdn/translations/customer-portal/en.json +1 -0
- package/dist/cdn/translations/customer-portal/es.json +1 -0
- package/dist/cdn/translations/customer-portal/fr.json +1 -0
- package/dist/cdn/translations/customer-portal/nl.json +1 -0
- package/dist/cdn/translations/customer-portal/pl.json +1 -0
- package/dist/cdn/translations/customer-portal/sv.json +1 -0
- package/dist/cdn/translations/customer-portal/zh-HK.json +1182 -0
- package/dist/cdn/translations/customer-portal/zh-hk.json +1 -0
- package/dist/elements/public/CustomerApi/CustomerApi.d.ts +9 -3
- package/dist/elements/public/CustomerApi/CustomerApi.js +3 -1
- package/dist/elements/public/CustomerApi/CustomerApi.js.map +1 -1
- package/dist/elements/public/CustomerPortal/CustomerPortal.d.ts +36 -0
- package/dist/elements/public/CustomerPortal/CustomerPortal.js +23 -9
- package/dist/elements/public/CustomerPortal/CustomerPortal.js.map +1 -1
- package/dist/elements/public/CustomerPortal/InternalCustomerPortalPasswordResetView.js +9 -0
- package/dist/elements/public/CustomerPortal/InternalCustomerPortalPasswordResetView.js.map +1 -1
- package/dist/elements/public/StoreForm/StoreForm.js +2 -2
- package/dist/elements/public/StoreForm/StoreForm.js.map +1 -1
- package/package.json +1 -1
- package/dist/cdn/shared-1d0839af.js +0 -1
|
@@ -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<
|
|
47
|
-
|
|
48
|
-
|
|
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.
|
|
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=${
|
|
69
|
-
|
|
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":";;AAAA,OAAO,EAAwC,IAAI,EAAE,MAAM,aAAa,CAAC;AAEzE,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,sCAAmC;AACzD,OAAO,EAAE,cAAc,EAAE,qCAAkC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,wCAAqC;AACjE,OAAO,EAAE,iBAAiB,EAAE,kDAA+C;AAC3E,OAAO,EAAE,WAAW,EAAE,yCAAsC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAE3D,MAAM,OAAO,cAAe,SAAQ,iBAAiB,CACnD,cAAc,CAAC,WAAW,CAAC,EAC3B,iBAAiB,CAClB;IAHD;;
|
|
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;
|
|
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:
|
|
226
|
-
this.__jsonWebhookKeyGeneratorOptions = { length:
|
|
225
|
+
this.__singleWebhookKeyGeneratorOptions = { length: 90, separator: '' };
|
|
226
|
+
this.__jsonWebhookKeyGeneratorOptions = { length: 90, separator: '' };
|
|
227
227
|
this.__useSingleWebhookKeyGetValue = () => {
|
|
228
228
|
var _a;
|
|
229
229
|
try {
|