@wix/astro 0.2.14 → 0.2.16

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.
@@ -0,0 +1,11 @@
1
+ import { APIMetadata, PublicMetadata } from '@wix/sdk-types';
2
+ export declare const WixBIHeaderName = "x-wix-bi-gateway";
3
+ export type WixBIHeaderValues = {
4
+ ['environment']: 'js-sdk' | string;
5
+ ['package-name']?: string;
6
+ ['method-fqn']?: string;
7
+ ['entity']?: string;
8
+ };
9
+ export declare function biHeaderGenerator(apiMetadata: APIMetadata, publicMetadata?: PublicMetadata, environment?: string): {
10
+ [WixBIHeaderName]: string;
11
+ };
@@ -0,0 +1,18 @@
1
+ export const WixBIHeaderName = 'x-wix-bi-gateway';
2
+ export function biHeaderGenerator(apiMetadata, publicMetadata, environment) {
3
+ return {
4
+ [WixBIHeaderName]: objectToKeyValue({
5
+ environment: `js-sdk${environment ? `-${environment}` : ``}`,
6
+ 'package-name': apiMetadata.packageName ?? publicMetadata?.PACKAGE_NAME,
7
+ 'method-fqn': apiMetadata.methodFqn,
8
+ entity: apiMetadata.entityFqdn,
9
+ }),
10
+ };
11
+ }
12
+ function objectToKeyValue(input) {
13
+ return Object.entries(input)
14
+ .filter(([_, value]) => Boolean(value))
15
+ .map(([key, value]) => `${key}=${value}`)
16
+ .join(',');
17
+ }
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmktaGVhZGVyLWdlbmVyYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2xvZ2luLWhlbHBlcnMvYmktaGVhZGVyLWdlbmVyYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsa0JBQWtCLENBQUM7QUFTbEQsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixXQUF3QixFQUN4QixjQUErQixFQUMvQixXQUFvQjtJQUVwQixPQUFPO1FBQ0wsQ0FBQyxlQUFlLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQztZQUNsQyxXQUFXLEVBQUUsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUM1RCxjQUFjLEVBQUUsV0FBVyxDQUFDLFdBQVcsSUFBSSxjQUFjLEVBQUUsWUFBWTtZQUN2RSxZQUFZLEVBQUUsV0FBVyxDQUFDLFNBQVM7WUFDbkMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxVQUFVO1NBQy9CLENBQUM7S0FDSCxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsS0FBd0I7SUFDaEQsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztTQUN6QixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3RDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztTQUN4QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixDQUFDIn0=
@@ -0,0 +1,4 @@
1
+ export declare function addListener(eventTarget: any, name: string, fn: Function): void;
2
+ export declare function removeListener(eventTarget: any, name: string, fn: Function): void;
3
+ export declare function loadFrame(src: string): HTMLIFrameElement;
4
+ export declare function addPostMessageListener(state: string): Promise<unknown>;
@@ -0,0 +1,44 @@
1
+ export function addListener(eventTarget, name, fn) {
2
+ if (eventTarget.addEventListener) {
3
+ eventTarget.addEventListener(name, fn);
4
+ }
5
+ else {
6
+ eventTarget.attachEvent('on' + name, fn);
7
+ }
8
+ }
9
+ export function removeListener(eventTarget, name, fn) {
10
+ if (eventTarget.removeEventListener) {
11
+ eventTarget.removeEventListener(name, fn);
12
+ }
13
+ else {
14
+ eventTarget.detachEvent('on' + name, fn);
15
+ }
16
+ }
17
+ export function loadFrame(src) {
18
+ const iframe = document.createElement('iframe');
19
+ iframe.style.display = 'none';
20
+ iframe.src = src;
21
+ return document.body.appendChild(iframe);
22
+ }
23
+ export function addPostMessageListener(state) {
24
+ let responseHandler;
25
+ let timeoutId;
26
+ const msgReceivedOrTimeout = new Promise((resolve, reject) => {
27
+ responseHandler = (e) => {
28
+ if (!e.data || e.data.state !== state) {
29
+ // A message not meant for us
30
+ return;
31
+ }
32
+ resolve(e.data);
33
+ };
34
+ addListener(window, 'message', responseHandler);
35
+ timeoutId = setTimeout(() => {
36
+ reject(new Error('OAuth flow timed out'));
37
+ }, 120000);
38
+ });
39
+ return msgReceivedOrTimeout.finally(() => {
40
+ clearTimeout(timeoutId);
41
+ removeListener(window, 'message', responseHandler);
42
+ });
43
+ }
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWZyYW1lVXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9sb2dpbi1oZWxwZXJzL2lmcmFtZVV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sVUFBVSxXQUFXLENBQUMsV0FBZ0IsRUFBRSxJQUFZLEVBQUUsRUFBWTtJQUN0RSxJQUFJLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ2pDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDekMsQ0FBQztTQUFNLENBQUM7UUFDTixXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsY0FBYyxDQUFDLFdBQWdCLEVBQUUsSUFBWSxFQUFFLEVBQVk7SUFDekUsSUFBSSxXQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUNwQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzVDLENBQUM7U0FBTSxDQUFDO1FBQ04sV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzNDLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLFNBQVMsQ0FBQyxHQUFXO0lBQ25DLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEQsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQzlCLE1BQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBRWpCLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDM0MsQ0FBQztBQUVELE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxLQUFhO0lBQ2xELElBQUksZUFBb0IsQ0FBQztJQUN6QixJQUFJLFNBQWMsQ0FBQztJQUNuQixNQUFNLG9CQUFvQixHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQzNELGVBQWUsR0FBRyxDQUFDLENBQU0sRUFBRSxFQUFFO1lBQzNCLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUssRUFBRSxDQUFDO2dCQUN0Qyw2QkFBNkI7Z0JBQzdCLE9BQU87WUFDVCxDQUFDO1lBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUM7UUFFRixXQUFXLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUVoRCxTQUFTLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUMxQixNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDO1FBQzVDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNiLENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFO1FBQ3ZDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4QixjQUFjLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUNyRCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMifQ==
@@ -0,0 +1,39 @@
1
+ export interface OauthPKCE {
2
+ codeVerifier: string;
3
+ codeChallenge: string;
4
+ state: string;
5
+ }
6
+ export interface OauthData extends OauthPKCE {
7
+ originalUri: string;
8
+ redirectUri: string;
9
+ }
10
+ export interface OauthPKCE {
11
+ codeVerifier: string;
12
+ codeChallenge: string;
13
+ state: string;
14
+ }
15
+ export interface Token {
16
+ value: string;
17
+ }
18
+ export interface AccessToken extends Token {
19
+ expiresAt: number;
20
+ }
21
+ export declare enum TokenRole {
22
+ NONE = "none",
23
+ VISITOR = "visitor",
24
+ MEMBER = "member"
25
+ }
26
+ export interface TokenResponse {
27
+ access_token: string;
28
+ expires_in: number;
29
+ refresh_token: string | null;
30
+ token_type: string;
31
+ scope?: string | null;
32
+ }
33
+ export declare const getMemberTokensForDirectLogin: (sessionToken: string) => Promise<{
34
+ accessToken: AccessToken;
35
+ refreshToken: {
36
+ value: string;
37
+ role: TokenRole;
38
+ };
39
+ }>;
@@ -0,0 +1,117 @@
1
+ import { redirects } from '@wix/redirects';
2
+ import { loadFrame, addPostMessageListener } from './iframeUtils.js';
3
+ import { biHeaderGenerator } from './bi-header-generator.js';
4
+ import { wixContext } from '@wix/sdk-context';
5
+ import { generateRandomCodeVerifier, calculatePKCECodeChallenge, generateRandomState } from 'oauth4webapi';
6
+ const DEFAULT_API_URL = 'www.wixapis.com';
7
+ export var TokenRole;
8
+ (function (TokenRole) {
9
+ TokenRole["NONE"] = "none";
10
+ TokenRole["VISITOR"] = "visitor";
11
+ TokenRole["MEMBER"] = "member";
12
+ })(TokenRole || (TokenRole = {}));
13
+ const generatePKCE = async () => {
14
+ const codeVerifier = generateRandomCodeVerifier();
15
+ const pkceState = await calculatePKCECodeChallenge(codeVerifier);
16
+ return {
17
+ codeChallenge: pkceState,
18
+ codeVerifier: codeVerifier,
19
+ state: generateRandomState(),
20
+ };
21
+ };
22
+ const getAuthorizationUrlWithOptions = async (oauthData, responseMode, prompt, sessionToken) => {
23
+ const { redirectSession } = await redirects.createRedirectSession({
24
+ auth: {
25
+ authRequest: {
26
+ redirectUri: oauthData.redirectUri,
27
+ ...(oauthData.redirectUri && {
28
+ redirectUri: oauthData.redirectUri,
29
+ }),
30
+ codeChallenge: oauthData.codeChallenge,
31
+ codeChallengeMethod: 'S256',
32
+ responseMode,
33
+ responseType: 'code',
34
+ scope: 'offline_access',
35
+ state: oauthData.state,
36
+ clientId: wixContext['clientId'],
37
+ ...(sessionToken && { sessionToken }),
38
+ },
39
+ prompt: redirects.Prompt[prompt],
40
+ },
41
+ });
42
+ return {
43
+ authUrl: redirectSession.fullUrl,
44
+ authorizationEndpoint: redirectSession.urlDetails.endpoint,
45
+ sessionToken: redirectSession.sessionToken,
46
+ };
47
+ };
48
+ const fetchTokens = async (payload, headers = {}) => {
49
+ const res = await fetch(`https://${DEFAULT_API_URL}/oauth2/token`, {
50
+ method: 'POST',
51
+ body: JSON.stringify(payload),
52
+ headers: {
53
+ ...biHeaderGenerator({
54
+ entityFqdn: 'wix.identity.oauth.v1.refresh_token',
55
+ methodFqn: 'wix.identity.oauth2.v1.Oauth2Ng.Token',
56
+ packageName: '@wix/sdk',
57
+ }),
58
+ 'Content-Type': 'application/json',
59
+ ...headers,
60
+ },
61
+ });
62
+ if (res.status !== 200) {
63
+ let responseJson;
64
+ try {
65
+ responseJson = await res.json();
66
+ }
67
+ catch { }
68
+ throw new Error(`Failed to fetch tokens from OAuth API: ${res.statusText}. request id: ${res.headers.get('x-request-id')}. ${responseJson ? `Response: ${JSON.stringify(responseJson)}` : ''}`);
69
+ }
70
+ const json = await res.json();
71
+ return json;
72
+ };
73
+ function getCurrentDate() {
74
+ return Math.floor(Date.now() / 1000);
75
+ }
76
+ function createAccessToken(accessToken, expiresIn) {
77
+ const now = getCurrentDate();
78
+ return { value: accessToken, expiresAt: Number(expiresIn) + now };
79
+ }
80
+ const getMemberTokens = async (code, state, oauthData) => {
81
+ if (!code || !state) {
82
+ throw new Error('Missing code or _state');
83
+ }
84
+ else if (state !== oauthData.state) {
85
+ throw new Error('Invalid _state');
86
+ }
87
+ const tokensResponse = await fetchTokens({
88
+ clientId: wixContext['clientId'],
89
+ grantType: 'authorization_code',
90
+ ...(oauthData.redirectUri && { redirectUri: oauthData.redirectUri }),
91
+ code,
92
+ codeVerifier: oauthData.codeVerifier,
93
+ });
94
+ return {
95
+ accessToken: createAccessToken(tokensResponse.access_token, tokensResponse.expires_in),
96
+ refreshToken: {
97
+ value: tokensResponse.refresh_token,
98
+ role: TokenRole.MEMBER,
99
+ },
100
+ };
101
+ };
102
+ export const getMemberTokensForDirectLogin = async (sessionToken) => {
103
+ const oauthPKCE = await generatePKCE();
104
+ const { authUrl } = await getAuthorizationUrlWithOptions(oauthPKCE, 'web_message', 'none', sessionToken);
105
+ const iframePromise = addPostMessageListener(oauthPKCE.state);
106
+ const iframeEl = loadFrame(authUrl);
107
+ return iframePromise
108
+ .then((res) => {
109
+ return getMemberTokens(res.code, res.state, oauthPKCE);
110
+ })
111
+ .finally(() => {
112
+ if (document.body.contains(iframeEl)) {
113
+ iframeEl.parentElement?.removeChild(iframeEl);
114
+ }
115
+ });
116
+ };
117
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4taGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2xvZ2luLWhlbHBlcnMvbG9naW4taGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzdELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsMEJBQTBCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFM0csTUFBTSxlQUFlLEdBQUcsaUJBQWlCLENBQUM7QUEyQjFDLE1BQU0sQ0FBTixJQUFZLFNBSVg7QUFKRCxXQUFZLFNBQVM7SUFDbkIsMEJBQWEsQ0FBQTtJQUNiLGdDQUFtQixDQUFBO0lBQ25CLDhCQUFpQixDQUFBO0FBQ25CLENBQUMsRUFKVyxTQUFTLEtBQVQsU0FBUyxRQUlwQjtBQUVELE1BQU0sWUFBWSxHQUFHLEtBQUssSUFBd0IsRUFBRTtJQUNsRCxNQUFNLFlBQVksR0FBRywwQkFBMEIsRUFBRSxDQUFDO0lBQ2xELE1BQU0sU0FBUyxHQUFHLE1BQU0sMEJBQTBCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDakUsT0FBTztRQUNMLGFBQWEsRUFBRSxTQUFTO1FBQ3hCLFlBQVksRUFBRSxZQUFZO1FBQzFCLEtBQUssRUFBRSxtQkFBbUIsRUFBRTtLQUM3QixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsTUFBTSw4QkFBOEIsR0FBRyxLQUFLLEVBQzFDLFNBQTZCLEVBQzdCLFlBQWtELEVBQ2xELE1BQXdCLEVBQ3hCLFlBQXFCLEVBQ3JCLEVBQUU7SUFDRixNQUFNLEVBQUUsZUFB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
@@ -0,0 +1,859 @@
1
+ ---
2
+ ---
3
+
4
+ <div class="login-form-wrapper">
5
+ <login-form>
6
+ <form id="loginForm">
7
+ <div class="form-container">
8
+ <h3 id="formTitle">
9
+ <span id="title-login">
10
+ <slot name="title-login">Log In</slot>
11
+ </span>
12
+ <span id="title-signup" style="display: none;">
13
+ <slot name="title-signup">Sign Up</slot>
14
+ </span>
15
+ <span id="title-reset" style="display: none;">
16
+ <slot name="title-reset">Reset Password</slot>
17
+ </span>
18
+ <span id="title-verify" style="display: none;">
19
+ <slot name="title-verify">Email Verification</slot>
20
+ </span>
21
+ <span id="title-success" style="display: none;">
22
+ <slot name="title-success">Success</slot>
23
+ </span>
24
+ </h3>
25
+
26
+ <!-- Success message with animation -->
27
+ <div id="successMessage" style="display: none;">
28
+ <div class="success-animation">
29
+ <svg class="checkmark" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 52 52">
30
+ <circle class="checkmark__circle" cx="26" cy="26" r="25" fill="none"/>
31
+ <path class="checkmark__check" fill="none" d="M14.1 27.2l7.1 7.2 16.7-16.8"/>
32
+ </svg>
33
+ </div>
34
+ <p class="success-title">
35
+ <slot name="success-title">Login Successful!</slot>
36
+ </p>
37
+ <p id="successText">
38
+ <slot name="success-message">You are now logged in.</slot>
39
+ </p>
40
+ </div>
41
+
42
+ <div id="pendingMessage" style="display: none;">
43
+ <p id="pendingText"></p>
44
+ <button id="okButton" type="button">
45
+ <slot name="ok-button">OK</slot>
46
+ </button>
47
+ </div>
48
+
49
+ <!-- General Error Message -->
50
+ <div id="errorMessage" style="display: none;">
51
+ <div class="error-container">
52
+ <svg class="error-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor">
53
+ <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clip-rule="evenodd" />
54
+ </svg>
55
+ <p id="errorText">
56
+ <slot name="error-message">Authentication error. Please try again.</slot>
57
+ </p>
58
+ </div>
59
+ </div>
60
+
61
+ <div id="formFields">
62
+ <!-- Username field (sign up only) -->
63
+ <div id="usernameField" style="display: none;">
64
+ <div class="field-label">
65
+ <label for="username">
66
+ <slot name="username-label">Username</slot>
67
+ </label>
68
+ </div>
69
+ <input
70
+ class={Astro.props["input-class"]}
71
+ id="username"
72
+ name="username"
73
+ type="text"
74
+ required
75
+ />
76
+ </div>
77
+
78
+ <!-- Email field -->
79
+ <div id="emailField">
80
+ <div class="field-label">
81
+ <label for="email">
82
+ <slot name="email-label">Email</slot>
83
+ </label>
84
+ </div>
85
+ <input
86
+ class={Astro.props["input-class"]}
87
+ id="email"
88
+ name="email"
89
+ type="email"
90
+ required
91
+ />
92
+ </div>
93
+
94
+ <!-- Verification code field -->
95
+ <div id="codeField" style="display: none;">
96
+ <div class="field-label">
97
+ <label for="code">
98
+ <slot name="code-label">Code</slot>
99
+ </label>
100
+ </div>
101
+ <input
102
+ class={Astro.props["input-class"]}
103
+ id="code"
104
+ name="code"
105
+ type="number"
106
+ required
107
+ />
108
+ </div>
109
+
110
+ <!-- Password field -->
111
+ <div id="passwordField">
112
+ <div class="field-label">
113
+ <label for="password">
114
+ <slot name="password-label">Password</slot>
115
+ </label>
116
+ </div>
117
+ <input
118
+ class={Astro.props["input-class"]}
119
+ id="password"
120
+ name="password"
121
+ type="password"
122
+ required
123
+ />
124
+ </div>
125
+
126
+ <!-- Forgot password link -->
127
+ <div id="forgotPasswordLink">
128
+ <a id="forgotPassword" href="#">
129
+ <slot name="forgot-password">Forgot password?</slot>
130
+ </a>
131
+ </div>
132
+
133
+ <!-- reCAPTCHA container -->
134
+ <div id="recaptcha-container" style="display: none;"></div>
135
+
136
+ <!-- Submit button -->
137
+ <div class="submit-button-container">
138
+ <button id="submitButton" type="submit" class={Astro.props["button-class"]}>
139
+ <span class="login-text">
140
+ <slot name="button-login">Log In</slot>
141
+ </span>
142
+ <span class="signup-text" style="display: none;">
143
+ <slot name="button-signup">Sign Up</slot>
144
+ </span>
145
+ <span class="reset-text" style="display: none;">
146
+ <slot name="button-reset">Reset</slot>
147
+ </span>
148
+ <span class="verify-text" style="display: none;">
149
+ <slot name="button-verify">Submit</slot>
150
+ </span>
151
+ <span class="loading-text loading-bounce" style="display: none;">
152
+ <slot name="button-loading">Loading</slot><span class="dot">.</span><span class="dot">.</span><span class="dot">.</span>
153
+ </span>
154
+ </button>
155
+ </div>
156
+
157
+ <!-- Toggle login/signup -->
158
+ <div id="toggleStateContainer">
159
+ <span class="login-toggle">
160
+ <slot name="toggle-login-text">Not registered?</slot>
161
+ <a id="toggleState" href="#">
162
+ <slot name="toggle-login-link">Sign up</slot>
163
+ </a>
164
+ </span>
165
+ <span class="signup-toggle" style="display: none;">
166
+ <slot name="toggle-signup-text">Already registered?</slot>
167
+ <a id="toggleState-signup" href="#">
168
+ <slot name="toggle-signup-link">Log in</slot>
169
+ </a>
170
+ </span>
171
+ </div>
172
+ </div>
173
+ </div>
174
+ </form>
175
+ </login-form>
176
+ </div>
177
+
178
+ <style>
179
+ button:disabled {
180
+ opacity: 0.5;
181
+ cursor: not-allowed;
182
+ }
183
+
184
+ /* Success animation styles */
185
+ .success-animation {
186
+ display: flex;
187
+ justify-content: center;
188
+ margin: 20px 0;
189
+ }
190
+
191
+ .checkmark {
192
+ width: 80px;
193
+ height: 80px;
194
+ border-radius: 50%;
195
+ display: block;
196
+ stroke-width: 2;
197
+ stroke: #4BB71B;
198
+ stroke-miterlimit: 10;
199
+ box-shadow: inset 0px 0px 0px #4BB71B;
200
+ animation: fill .4s ease-in-out .4s forwards, scale .3s ease-in-out .9s both;
201
+ }
202
+
203
+ .checkmark__circle {
204
+ stroke-dasharray: 166;
205
+ stroke-dashoffset: 166;
206
+ stroke-width: 2;
207
+ stroke-miterlimit: 10;
208
+ stroke: #4BB71B;
209
+ fill: none;
210
+ animation: stroke 0.6s cubic-bezier(0.65, 0, 0.45, 1) forwards;
211
+ }
212
+
213
+ .checkmark__check {
214
+ transform-origin: 50% 50%;
215
+ stroke-dasharray: 48;
216
+ stroke-dashoffset: 48;
217
+ animation: stroke 0.3s cubic-bezier(0.65, 0, 0.45, 1) 0.8s forwards;
218
+ }
219
+
220
+ @keyframes stroke {
221
+ 100% {
222
+ stroke-dashoffset: 0;
223
+ }
224
+ }
225
+
226
+ @keyframes scale {
227
+ 0%, 100% {
228
+ transform: none;
229
+ }
230
+ 50% {
231
+ transform: scale3d(1.1, 1.1, 1);
232
+ }
233
+ }
234
+
235
+ @keyframes fill {
236
+ 100% {
237
+ box-shadow: inset 0px 0px 0px 30px rgba(75, 183, 27, 0.2);
238
+ }
239
+ }
240
+
241
+
242
+ /* RTL support for Hebrew and other RTL languages */
243
+ :global([dir="rtl"]) .form-container {
244
+ text-align: right;
245
+ }
246
+
247
+ :global([dir="rtl"]) input {
248
+ text-align: right;
249
+ }
250
+
251
+
252
+ /* Loading text on submit button animation */
253
+ .loading-bounce .dot {
254
+ display: inline-block; /* Needed for transform */
255
+ position: relative; /* Or just rely on inline-block default */
256
+ animation: bounce 0.6s infinite ease-in-out alternate;
257
+ }
258
+
259
+ /* Add delays to each dot */
260
+ .loading-bounce .dot:nth-child(1) {
261
+ animation-delay: 0.1s;
262
+ }
263
+
264
+ .loading-bounce .dot:nth-child(2) {
265
+ animation-delay: 0.2s;
266
+ }
267
+
268
+ .loading-bounce .dot:nth-child(3) {
269
+ animation-delay: 0.3s;
270
+ }
271
+
272
+ @keyframes bounce {
273
+ from {
274
+ transform: translateY(0);
275
+ }
276
+ to {
277
+ transform: translateY(-5px); /* Adjust bounce height */
278
+ }
279
+ }
280
+ </style>
281
+
282
+ <script>
283
+ import { authentication, verification, recovery } from '@wix/identity';
284
+ import { getMemberTokensForDirectLogin } from './login-helpers/login-helpers.js';
285
+ import { wixContext } from '@wix/sdk-context';
286
+
287
+ class LoginForm extends HTMLElement {
288
+ constructor() {
289
+ super();
290
+ // States enum
291
+ this.State = {
292
+ LOGIN: 'LOGIN',
293
+ SIGNUP: 'SIGNUP',
294
+ RESET_PASSWORD: 'RESET_PASSWORD',
295
+ EMAIL_VERIFICATION: 'EMAIL_VERIFICATION',
296
+ SUCCESS: 'SUCCESS'
297
+ };
298
+
299
+ // Initialize state variables
300
+ this.state = this.State.LOGIN;
301
+ this.loading = false;
302
+ this.email = '';
303
+ this.code = '';
304
+ this.username = '';
305
+ this.password = '';
306
+ this.pending = { state: false, message: '' };
307
+ this.passwordInvalid = false;
308
+ this.emailInvalid = false;
309
+ this.captcha = '';
310
+ this.error = { state: false, message: '' };
311
+
312
+ // Bind methods to this
313
+ this.resetState = this.resetState.bind(this);
314
+ this.submit = this.submit.bind(this);
315
+ this.updateUI = this.updateUI.bind(this);
316
+ this.handleInputChange = this.handleInputChange.bind(this);
317
+ this.showSuccessMessage = this.showSuccessMessage.bind(this);
318
+ this.showErrorMessage = this.showErrorMessage.bind(this);
319
+ }
320
+
321
+ connectedCallback() {
322
+ // Initial setup
323
+ this.setupEventListenersForStaticElements();
324
+ this.updateUI(); // This will handle dynamic element setup
325
+ }
326
+
327
+ setupEventListenersForStaticElements() {
328
+ // Form submission
329
+ this.querySelector('#loginForm').addEventListener('submit', this.submit);
330
+
331
+ // OK button for messages
332
+ this.querySelector('#okButton').addEventListener('click', () => {
333
+ this.resetState();
334
+ });
335
+
336
+ // Forgot password link
337
+ const forgotPasswordLink = this.querySelector('#forgotPassword');
338
+ if (forgotPasswordLink) {
339
+ forgotPasswordLink.addEventListener('click', (e) => {
340
+ e.preventDefault();
341
+ this.state = this.State.RESET_PASSWORD;
342
+ this.resetState();
343
+ });
344
+ }
345
+
346
+ // Input event listeners for all form fields
347
+ const inputs = this.querySelectorAll('input');
348
+ inputs.forEach(input => {
349
+ input.addEventListener('input', this.handleInputChange);
350
+ });
351
+ }
352
+
353
+ async setupCaptcha() {
354
+ try {
355
+ // Set up recaptcha
356
+ if (!window.grecaptcha && this.state === this.State.SIGNUP) {
357
+ const script = document.createElement('script');
358
+ script.src = "https://www.google.com/recaptcha/enterprise.js";
359
+ document.head.appendChild(script);
360
+
361
+ script.onload = () => {
362
+ window.grecaptcha.enterprise.ready(() => {
363
+ window.grecaptcha.enterprise.render('recaptcha-container', {
364
+ 'sitekey': '6Ld0J8IcAAAAANyrnxzrRlX1xrrdXsOmsepUYosy', // Replace with your actual site key
365
+ 'size': 'normal', // or 'compact' for mobile-friendly
366
+ 'callback': this.onCaptchaChange.bind(this),
367
+ 'expired-callback': () => {
368
+ this.captcha = '';
369
+ this.updateInputValues(); // Update UI without full render
370
+ },
371
+ });
372
+ });
373
+ };
374
+ }
375
+ } catch (error) {
376
+ console.error("Error setting up captcha:", error);
377
+ }
378
+ }
379
+
380
+ resetState() {
381
+ this.loading = false;
382
+ this.pending = { state: false, message: '' };
383
+ this.email = '';
384
+ this.code = '';
385
+ this.passwordInvalid = false;
386
+ this.emailInvalid = false;
387
+ this.username = '';
388
+ this.password = '';
389
+ this.error = { state: false, message: '' };
390
+
391
+ // Reset recaptcha if it exists
392
+ if (this.querySelector('.g-recaptcha') && window.grecaptcha) {
393
+ window.grecaptcha.enterprise.reset();
394
+ }
395
+
396
+ this.updateUI();
397
+ }
398
+
399
+ handleInputChange(event) {
400
+ const { id, value } = event.target;
401
+
402
+ // Clear error message when user starts typing
403
+ if (this.error.state) {
404
+ this.error = { state: false, message: '' };
405
+ this.updateUI();
406
+ }
407
+
408
+ if (id === 'email') {
409
+ this.email = value;
410
+ this.emailInvalid = false;
411
+ } else if (id === 'password') {
412
+ this.password = value;
413
+ this.passwordInvalid = false;
414
+ } else if (id === 'username') {
415
+ this.username = value;
416
+ } else if (id === 'code') {
417
+ this.code = value;
418
+ }
419
+
420
+ // Update UI state without full re-render
421
+ this.updateInputValues();
422
+ }
423
+
424
+ async submit(event) {
425
+ event.preventDefault();
426
+ this.loading = true;
427
+ this.error = { state: false, message: '' }; // Clear any previous errors
428
+ this.updateInputValues(); // Update UI without full render
429
+ this.updateButtonText();
430
+
431
+ let response;
432
+
433
+ try {
434
+ if (this.state === this.State.RESET_PASSWORD) {
435
+ await recovery.sendRecoveryEmail(
436
+ this.email,
437
+ { redirect: { url: window.location.origin, clientId: wixContext['clientId'] as string } }
438
+ );
439
+ this.pending = { message: 'Password reset email sent', state: true };
440
+ this.updateUI(); // Update UI for modal state change
441
+ return;
442
+ }
443
+
444
+ if (this.state === this.State.EMAIL_VERIFICATION) {
445
+ response = await verification.verifyDuringAuthentication(
446
+ this.code,
447
+ { stateToken: this.emailVerificationStateToken },
448
+ );
449
+ } else if (this.state === this.State.LOGIN) {
450
+ response = await authentication.loginV2(
451
+ {
452
+ email: this.email,
453
+ },
454
+ {
455
+ password: this.password,
456
+ }
457
+ );
458
+ } else {
459
+ response = await authentication.registerV2({
460
+ email: this.email,
461
+ },
462
+ {
463
+ password: this.password,
464
+ profile: {
465
+ nickname: this.username,
466
+ },
467
+ captchaTokens: [
468
+ {
469
+ Recaptcha: this.captcha,
470
+ },
471
+ ],
472
+ });
473
+ }
474
+
475
+ // Handle login success
476
+ if (response.state === 'SUCCESS') {
477
+ const tokens = await getMemberTokensForDirectLogin(
478
+ response.sessionToken!
479
+ );
480
+
481
+ // Set cookie
482
+ this.setCookie('wixSession', JSON.stringify(tokens.refreshToken), 2);
483
+
484
+ // Show success animation
485
+ this.showSuccessMessage();
486
+
487
+ // Dispatch a success event that consumers can listen for
488
+ this.dispatchEvent(new CustomEvent('login-success'));
489
+ return;
490
+ }
491
+
492
+ // Handle various states
493
+ if (response.state === 'OWNER_APPROVAL_REQUIRED') {
494
+ this.pending = { message: 'Your account is pending approval', state: true };
495
+ this.updateUI(); // Update UI for state change
496
+ } else if (response.state === 'REQUIRE_EMAIL_VERIFICATION') {
497
+ this.state = this.State.EMAIL_VERIFICATION;
498
+ this.emailVerificationStateToken = response.stateToken;
499
+ this.updateUI(); // Update UI for state change
500
+ } else if (response.state === 'FAILURE') {
501
+ if (response.errorCode === 'invalidPassword') {
502
+ this.passwordInvalid = true;
503
+ this.updateInputValues(); // Update without full render
504
+ } else if (
505
+ response.errorCode === 'invalidEmail' ||
506
+ response.errorCode === 'emailAlreadyExists'
507
+ ) {
508
+ this.emailInvalid = true;
509
+ this.updateInputValues(); // Update without full render
510
+ } else if (response.errorCode === 'resetPassword') {
511
+ this.pending = {
512
+ message: 'Your password requires reset',
513
+ state: true,
514
+ };
515
+ this.updateUI(); // Update UI for state change
516
+ } else {
517
+ // Handle other error codes with a generic message
518
+ this.showErrorMessage();
519
+ const errorElem = this.querySelector('#errorText');
520
+ if (errorElem) {
521
+ errorElem.setAttribute('data-error-code', response.errorCode || 'unknown');
522
+ }
523
+ }
524
+ }
525
+ } catch (error) {
526
+ console.error('Authentication error:', error);
527
+ // Show user-friendly error message
528
+ this.showErrorMessage();
529
+ }
530
+
531
+ // Reset recaptcha
532
+ if (this.querySelector('.g-recaptcha') && window.grecaptcha) {
533
+ window.grecaptcha.reset();
534
+ }
535
+
536
+ this.loading = false;
537
+ this.updateInputValues(); // Update UI without full render
538
+ }
539
+
540
+ // New method to show error message
541
+ showErrorMessage() {
542
+ this.error = { state: true, message: '' };
543
+ this.updateUI();
544
+ }
545
+
546
+ setCookie(name, value, days) {
547
+ // Using a simplified cookie setter for demonstration
548
+ let expires = '';
549
+ if (days) {
550
+ const date = new Date();
551
+ date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
552
+ expires = "; expires=" + date.toUTCString();
553
+ }
554
+ document.cookie = name + "=" + (value || "") + expires + "; path=/";
555
+ }
556
+
557
+ onCaptchaChange(token) {
558
+ this.captcha = token;
559
+ this.updateInputValues(); // Update UI without full render
560
+ }
561
+
562
+ // New method to show success message with animation
563
+ showSuccessMessage() {
564
+ // Update state
565
+ this.state = this.State.SUCCESS;
566
+
567
+ // Update UI to show success message
568
+ this.updateUI();
569
+ }
570
+
571
+ updateUI() {
572
+ // Handle success message visibility first
573
+ const successMessage = this.querySelector('#successMessage');
574
+ if (this.state === this.State.SUCCESS) {
575
+ this.updateTitleVisibility();
576
+
577
+ successMessage.style.display = 'block';
578
+ this.querySelector('#formFields').style.display = 'none';
579
+ this.querySelector('#pendingMessage').style.display = 'none';
580
+ this.querySelector('#errorMessage').style.display = 'none';
581
+ return; // Exit early as we don't need to update other UI parts
582
+ } else {
583
+ successMessage.style.display = 'none';
584
+ }
585
+
586
+ // Update title visibility
587
+ this.updateTitleVisibility();
588
+
589
+ // Handle error message visibility
590
+ const errorMessage = this.querySelector('#errorMessage');
591
+
592
+ if (this.error.state) {
593
+ errorMessage.style.display = 'block';
594
+ } else {
595
+ errorMessage.style.display = 'none';
596
+ }
597
+
598
+ // Handle pending message visibility
599
+ this.updatePendingMessageVisibility();
600
+
601
+ // Update field visibility based on current state
602
+ this.updateFieldVisibility();
603
+
604
+ // Update toggle state link
605
+ this.updateToggleStateLink();
606
+
607
+ // Set up captcha if needed
608
+ if (this.state === this.State.SIGNUP) {
609
+ this.setupCaptcha();
610
+ }
611
+
612
+ // Update input values
613
+ this.updateInputValues();
614
+
615
+ // Update button text
616
+ this.updateButtonText();
617
+ }
618
+
619
+ updateTitleVisibility() {
620
+ // First create a map of all title elements
621
+ const titleMap = {
622
+ [this.State.LOGIN]: this.querySelector('#title-login'),
623
+ [this.State.SIGNUP]: this.querySelector('#title-signup'),
624
+ [this.State.RESET_PASSWORD]: this.querySelector('#title-reset'),
625
+ [this.State.EMAIL_VERIFICATION]: this.querySelector('#title-verify'),
626
+ [this.State.SUCCESS]: this.querySelector('#title-success')
627
+ };
628
+
629
+ // Hide all title elements first
630
+ Object.values(titleMap).forEach(elem => {
631
+ if (elem) elem.style.display = 'none';
632
+ });
633
+
634
+ // Show only the current state's title
635
+ const currentTitleElem = titleMap[this.state];
636
+ if (currentTitleElem) {
637
+ currentTitleElem.style.display = '';
638
+ }
639
+ }
640
+
641
+ updateButtonText() {
642
+ // Hide all button text elements
643
+ const buttonTextElements = {
644
+ login: this.querySelector('.login-text'),
645
+ signup: this.querySelector('.signup-text'),
646
+ reset: this.querySelector('.reset-text'),
647
+ verify: this.querySelector('.verify-text'),
648
+ loading: this.querySelector('.loading-text')
649
+ };
650
+
651
+ // Hide all text elements first
652
+ Object.values(buttonTextElements).forEach(elem => {
653
+ if (elem) elem.style.display = 'none';
654
+ });
655
+
656
+ // Determine which text to show based on state
657
+ const textToShow = this.loading ? 'loading' :
658
+ {
659
+ [this.State.LOGIN]: 'login',
660
+ [this.State.SIGNUP]: 'signup',
661
+ [this.State.RESET_PASSWORD]: 'reset',
662
+ [this.State.EMAIL_VERIFICATION]: 'verify'
663
+ }[this.state];
664
+
665
+ // Show the selected text
666
+ const selectedElement = buttonTextElements[textToShow];
667
+ if (selectedElement) {
668
+ selectedElement.style.display = '';
669
+ }
670
+ }
671
+
672
+ updatePendingMessageVisibility() {
673
+ const pendingMessage = this.querySelector('#pendingMessage');
674
+ const formFields = this.querySelector('#formFields');
675
+
676
+ if (this.pending.state) {
677
+ pendingMessage.style.display = 'block';
678
+ formFields.style.display = 'none';
679
+ this.querySelector('#pendingText').textContent = this.pending.message;
680
+ } else {
681
+ pendingMessage.style.display = 'none';
682
+ formFields.style.display = 'block';
683
+ }
684
+ }
685
+
686
+ updateFieldVisibility() {
687
+ // Username field (only visible during signup)
688
+ const usernameField = this.querySelector('#usernameField');
689
+ const usernameInput = this.querySelector('#username');
690
+ if (this.state === this.State.SIGNUP) {
691
+ usernameField.style.display = 'block';
692
+ usernameInput.setAttribute('required', '');
693
+ } else {
694
+ usernameField.style.display = 'none';
695
+ usernameInput.removeAttribute('required');
696
+ }
697
+
698
+ // Email vs Code field visibility
699
+ const emailField = this.querySelector('#emailField');
700
+ const emailInput = this.querySelector('#email');
701
+ const codeField = this.querySelector('#codeField');
702
+ const codeInput = this.querySelector('#code');
703
+
704
+ if (this.state === this.State.EMAIL_VERIFICATION) {
705
+ emailField.style.display = 'none';
706
+ emailInput.removeAttribute('required');
707
+ codeField.style.display = 'block';
708
+ codeInput.setAttribute('required', '');
709
+ } else {
710
+ emailField.style.display = 'block';
711
+ emailInput.setAttribute('required', '');
712
+ codeField.style.display = 'none';
713
+ codeInput.removeAttribute('required');
714
+ }
715
+
716
+ // Password field visibility
717
+ const passwordField = this.querySelector('#passwordField');
718
+ const passwordInput = this.querySelector('#password');
719
+ if (this.state === this.State.RESET_PASSWORD || this.state === this.State.EMAIL_VERIFICATION) {
720
+ passwordField.style.display = 'none';
721
+ passwordInput.removeAttribute('required');
722
+ } else {
723
+ passwordField.style.display = 'block';
724
+ passwordInput.setAttribute('required', '');
725
+ }
726
+
727
+ // Forgot password link visibility
728
+ const forgotPasswordLink = this.querySelector('#forgotPasswordLink');
729
+ if (this.state === this.State.LOGIN) {
730
+ forgotPasswordLink.style.display = 'block';
731
+ } else {
732
+ forgotPasswordLink.style.display = 'none';
733
+ }
734
+
735
+ // Recaptcha visibility
736
+ const recaptchaContainer = this.querySelector('#recaptcha-container');
737
+ if (this.state === this.State.SIGNUP) {
738
+ recaptchaContainer.style.display = 'block';
739
+ } else {
740
+ recaptchaContainer.style.display = 'none';
741
+ }
742
+ }
743
+
744
+ updateToggleStateLink() {
745
+ const toggleStateContainer = this.querySelector('#toggleStateContainer');
746
+ const loginToggle = this.querySelector('.login-toggle');
747
+ const signupToggle = this.querySelector('.signup-toggle');
748
+
749
+ if (this.state === this.State.RESET_PASSWORD || this.state === this.State.EMAIL_VERIFICATION) {
750
+ toggleStateContainer.style.display = 'none';
751
+ } else {
752
+ toggleStateContainer.style.display = 'block';
753
+
754
+ // Show the appropriate toggle based on state
755
+ if (this.state === this.State.LOGIN) {
756
+ loginToggle.style.display = '';
757
+ signupToggle.style.display = 'none';
758
+
759
+ // Add event listener to login toggle
760
+ const toggleLink = loginToggle.querySelector('#toggleState');
761
+ if (toggleLink) {
762
+ toggleLink.addEventListener('click', (e) => {
763
+ e.preventDefault();
764
+ this.state = this.State.SIGNUP;
765
+ this.updateUI();
766
+ });
767
+ }
768
+ } else {
769
+ loginToggle.style.display = 'none';
770
+ signupToggle.style.display = '';
771
+
772
+ // Add event listener to signup toggle
773
+ const toggleLink = signupToggle.querySelector('#toggleState-signup');
774
+ if (toggleLink) {
775
+ toggleLink.addEventListener('click', (e) => {
776
+ e.preventDefault();
777
+ this.state = this.State.LOGIN;
778
+ this.updateUI();
779
+ });
780
+ }
781
+ }
782
+ }
783
+ }
784
+
785
+ updateInputValues() {
786
+ // Update email input
787
+ const emailInput = this.querySelector('#email');
788
+ if (emailInput) {
789
+ emailInput.value = this.email;
790
+ if (this.emailInvalid) {
791
+ emailInput.classList.add('error');
792
+ } else {
793
+ emailInput.classList.remove('error');
794
+ }
795
+ }
796
+
797
+ // Update password input
798
+ const passwordInput = this.querySelector('#password');
799
+ if (passwordInput) {
800
+ passwordInput.value = this.password;
801
+ if (this.passwordInvalid) {
802
+ passwordInput.classList.add('error');
803
+ } else {
804
+ passwordInput.classList.remove('error');
805
+ }
806
+ }
807
+
808
+ // Update username input
809
+ const usernameInput = this.querySelector('#username');
810
+ if (usernameInput) {
811
+ usernameInput.value = this.username;
812
+ }
813
+
814
+ // Update code input
815
+ const codeInput = this.querySelector('#code');
816
+ if (codeInput) {
817
+ codeInput.value = this.code;
818
+ }
819
+
820
+ // Update submit button state
821
+ const submitButton = this.querySelector('#submitButton');
822
+ if (submitButton) {
823
+ let shouldDisable =
824
+ (!this.email && this.state !== this.State.EMAIL_VERIFICATION) ||
825
+ (!this.password &&
826
+ this.state !== this.State.RESET_PASSWORD &&
827
+ this.state !== this.State.EMAIL_VERIFICATION) ||
828
+ this.loading;
829
+
830
+ // Add captcha check for signup
831
+ if (this.state === this.State.SIGNUP) {
832
+ // For signup, require username and captcha as well
833
+ shouldDisable = shouldDisable ||
834
+ !this.username ||
835
+ !this.captcha; // Make button disabled if captcha is not completed
836
+ }
837
+
838
+ submitButton.disabled = shouldDisable;
839
+ }
840
+ }
841
+
842
+ restoreFocus(activeElementId) {
843
+ if (activeElementId) {
844
+ const elementToFocus = this.querySelector(`#${activeElementId}`);
845
+ if (elementToFocus) {
846
+ elementToFocus.focus();
847
+
848
+ // If it's an input, place cursor at the end
849
+ if (elementToFocus.tagName === 'INPUT' && (elementToFocus.type === 'text' || elementToFocus.type === 'email')) {
850
+ elementToFocus.selectionStart = elementToFocus.selectionEnd = elementToFocus.value.length;
851
+ }
852
+ }
853
+ }
854
+ }
855
+ }
856
+
857
+ // Define the custom element
858
+ customElements.define('login-form', LoginForm);
859
+ </script>
@@ -4,4 +4,5 @@ export { wixBlogLoader };
4
4
  export type { Runtime } from "./entrypoints/server.js";
5
5
  export declare function createIntegration(opts?: {
6
6
  sessionCookieName?: string;
7
+ useWixAuth?: boolean;
7
8
  }): AstroIntegration;
@@ -13,6 +13,7 @@ import { wixSDKContext } from "./vite-plugins/sdk-context.js";
13
13
  export { wixBlogLoader };
14
14
  export function createIntegration(opts = {
15
15
  sessionCookieName: "wixSession",
16
+ useWixAuth: true,
16
17
  }) {
17
18
  const sessionCookieName = opts.sessionCookieName ?? "wixSession";
18
19
  let _config;
@@ -24,26 +25,28 @@ export function createIntegration(opts = {
24
25
  const aRequire = buildResolver(fileURLToPath(import.meta.url), {
25
26
  resolveToAbsolute: true,
26
27
  });
27
- injectRoute({
28
- entrypoint: aRequire("./routes/auth/login"),
29
- pattern: "/api/auth/login",
30
- prerender: false,
31
- });
32
- injectRoute({
33
- entrypoint: aRequire("./routes/auth/logout"),
34
- pattern: "/api/auth/logout",
35
- prerender: false,
36
- });
37
- injectRoute({
38
- entrypoint: aRequire("./routes/auth/callback"),
39
- pattern: "/api/auth/callback",
40
- prerender: false,
41
- });
42
- injectRoute({
43
- entrypoint: aRequire("./routes/auth/logout-callback"),
44
- pattern: "/api/auth/logout-callback",
45
- prerender: false,
46
- });
28
+ if (opts.useWixAuth) {
29
+ injectRoute({
30
+ entrypoint: aRequire("./routes/auth/login"),
31
+ pattern: "/api/auth/login",
32
+ prerender: false,
33
+ });
34
+ injectRoute({
35
+ entrypoint: aRequire("./routes/auth/logout"),
36
+ pattern: "/api/auth/logout",
37
+ prerender: false,
38
+ });
39
+ injectRoute({
40
+ entrypoint: aRequire("./routes/auth/callback"),
41
+ pattern: "/api/auth/callback",
42
+ prerender: false,
43
+ });
44
+ injectRoute({
45
+ entrypoint: aRequire("./routes/auth/logout-callback"),
46
+ pattern: "/api/auth/logout-callback",
47
+ prerender: false,
48
+ });
49
+ }
47
50
  addMiddleware({
48
51
  entrypoint: aRequire("./middleware"),
49
52
  order: "pre",
@@ -223,4 +226,4 @@ export function createIntegration(opts = {
223
226
  },
224
227
  };
225
228
  }
226
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWdyYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW50ZWdyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixtQkFBbUIsR0FDcEIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTVDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFekMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbEMsT0FBTyxFQUFFLFFBQVEsSUFBSSxFQUFFLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsYUFBYSxFQUFFLENBQUM7QUFJekIsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixPQUVJO0lBQ0YsaUJBQWlCLEVBQUUsWUFBWTtDQUNoQztJQUVELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixJQUFJLFlBQVksQ0FBQztJQUVqRSxJQUFJLE9BQW9CLENBQUM7SUFDekIsSUFBSSxZQUFpQyxDQUFDO0lBRXRDLE9BQU87UUFDTCxJQUFJLEVBQUUsWUFBWTtRQUNsQixLQUFLLEVBQUU7WUFDTCxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsRUFDM0IsTUFBTSxFQUNOLFlB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
229
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWdyYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW50ZWdyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixtQkFBbUIsR0FDcEIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTVDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFekMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbEMsT0FBTyxFQUFFLFFBQVEsSUFBSSxFQUFFLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsYUFBYSxFQUFFLENBQUM7QUFJekIsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixPQUdJO0lBQ0YsaUJBQWlCLEVBQUUsWUFBWTtJQUMvQixVQUFVLEVBQUUsSUFBSTtDQUNqQjtJQUVELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixJQUFJLFlBQVksQ0FBQztJQUVqRSxJQUFJLE9BQW9CLENBQUM7SUFDekIsSUFBSSxZQUFpQyxDQUFDO0lBRXRDLE9BQU87UUFDTCxJQUFJLEVBQUUsWUFBWTtRQUNsQixLQUFLLEVBQUU7WUFDTCxvQkFBb0IsRUFBRSxLQUFLLEVB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
@@ -56,7 +56,8 @@ export function wixSDKContext(opts) {
56
56
  clientId: ${JSON.stringify(userLoadedEnv["WIX_CLIENT_ID"])},
57
57
  tokens: getCookieAsJson(${JSON.stringify(opts.sessionCookieName)})?.tokens,
58
58
  }),
59
- })
59
+ }),
60
+ clientId: ${JSON.stringify(userLoadedEnv["WIX_CLIENT_ID"])},
60
61
  };
61
62
  `;
62
63
  }
@@ -64,4 +65,4 @@ export function wixSDKContext(opts) {
64
65
  },
65
66
  };
66
67
  }
67
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2RrLWNvbnRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdml0ZS1wbHVnaW5zL3Nkay1jb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sYUFBYSxNQUFNLGFBQWEsQ0FBQztBQUN4QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxPQUFPLEVBQVUsTUFBTSxNQUFNLENBQUM7QUFHdkMsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUFtQztJQUMvRCxNQUFNLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQztJQUMzQyxNQUFNLHVCQUF1QixHQUFHLElBQUksR0FBRyxlQUFlLENBQUM7SUFFdkQsT0FBTztRQUNMLElBQUksRUFBRSx5QkFBeUI7UUFDL0IsT0FBTyxFQUFFLEtBQUssRUFBRSw0REFBNEQ7UUFFNUUsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRTtZQUN0QixJQUFJLFVBQVU7Z0JBQUUsT0FBTyxDQUFDLGlDQUFpQztZQUN6RCxPQUFPO2dCQUNMLFlBQVksRUFBRTtvQkFDWixPQUFPLEVBQUUsQ0FBQyxlQUFlLENBQUMsRUFBRSwrQ0FBK0M7aUJBQzVFO2FBQ0YsQ0FBQztRQUNKLENBQUM7UUFFRCxTQUFTLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRTtZQUN0QixJQUFJLEdBQUc7Z0JBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxpQ0FBaUM7WUFDdkQsSUFBSSxFQUFFLEtBQUssZUFBZSxFQUFFLENBQUM7Z0JBQzNCLE9BQU8sdUJBQXVCLENBQUM7WUFDakMsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELElBQUksQ0FBQyxFQUFFO1lBQ0wsSUFBSSxFQUFFLEtBQUssdUJBQXVCLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUM1QixhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFDOUI7b0JBQ0UsaUJBQWlCLEVBQUUsSUFBSTtpQkFDeEIsQ0FDRixDQUFDO2dCQUVGLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FDM0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxhQUFhLEVBQ3hDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFDYixFQUFFLENBQ0gsQ0FBQztnQkFDRixNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQkFDbkQsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQ2pDLDRCQUE0QixDQUM3QixDQUFDO2dCQUVKLE9BQU8saUNBQWlDLGNBQWM7aURBQ1gsa0JBQWtCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztnQ0FvQm5DLElBQUksQ0FBQyxTQUFTLENBQ3hCLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FDL0I7OENBQ3lCLElBQUksQ0FBQyxTQUFTLENBQ3RDLElBQUksQ0FBQyxpQkFBaUIsQ0FDdkI7Ozs7aUJBSUosQ0FBQztZQUNaLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyJ9
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2RrLWNvbnRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdml0ZS1wbHVnaW5zL3Nkay1jb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sYUFBYSxNQUFNLGFBQWEsQ0FBQztBQUN4QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxPQUFPLEVBQVUsTUFBTSxNQUFNLENBQUM7QUFHdkMsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUFtQztJQUMvRCxNQUFNLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQztJQUMzQyxNQUFNLHVCQUF1QixHQUFHLElBQUksR0FBRyxlQUFlLENBQUM7SUFFdkQsT0FBTztRQUNMLElBQUksRUFBRSx5QkFBeUI7UUFDL0IsT0FBTyxFQUFFLEtBQUssRUFBRSw0REFBNEQ7UUFFNUUsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRTtZQUN0QixJQUFJLFVBQVU7Z0JBQUUsT0FBTyxDQUFDLGlDQUFpQztZQUN6RCxPQUFPO2dCQUNMLFlBQVksRUFBRTtvQkFDWixPQUFPLEVBQUUsQ0FBQyxlQUFlLENBQUMsRUFBRSwrQ0FBK0M7aUJBQzVFO2FBQ0YsQ0FBQztRQUNKLENBQUM7UUFFRCxTQUFTLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRTtZQUN0QixJQUFJLEdBQUc7Z0JBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxpQ0FBaUM7WUFDdkQsSUFBSSxFQUFFLEtBQUssZUFBZSxFQUFFLENBQUM7Z0JBQzNCLE9BQU8sdUJBQXVCLENBQUM7WUFDakMsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELElBQUksQ0FBQyxFQUFFO1lBQ0wsSUFBSSxFQUFFLEtBQUssdUJBQXVCLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUM1QixhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFDOUI7b0JBQ0UsaUJBQWlCLEVBQUUsSUFBSTtpQkFDeEIsQ0FDRixDQUFDO2dCQUVGLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FDM0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxhQUFhLEVBQ3hDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFDYixFQUFFLENBQ0gsQ0FBQztnQkFDRixNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQkFDbkQsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQ2pDLDRCQUE0QixDQUM3QixDQUFDO2dCQUVKLE9BQU8saUNBQWlDLGNBQWM7aURBQ1gsa0JBQWtCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztnQ0FvQm5DLElBQUksQ0FBQyxTQUFTLENBQ3hCLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FDL0I7OENBQ3lCLElBQUksQ0FBQyxTQUFTLENBQ3RDLElBQUksQ0FBQyxpQkFBaUIsQ0FDdkI7Ozs0QkFHTyxJQUFJLENBQUMsU0FBUyxDQUN4QixhQUFhLENBQUMsZUFBZSxDQUFDLENBQy9COztpQkFFQSxDQUFDO1lBQ1osQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDIn0=
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@wix/astro",
3
3
  "description": "Develop your Astro site on the Wix Platform",
4
- "version": "0.2.14",
4
+ "version": "0.2.16",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "keywords": [
@@ -14,13 +14,14 @@
14
14
  "./loaders": "./dist/loaders/index.js",
15
15
  "./entrypoints/server.js": "./dist/entrypoints/server.js",
16
16
  "./package.json": "./package.json",
17
- "./runtime": "./dist/runtime.js"
17
+ "./runtime": "./dist/runtime.js",
18
+ "./components/login.astro": "./dist/components/login.astro"
18
19
  },
19
20
  "files": [
20
21
  "dist"
21
22
  ],
22
23
  "scripts": {
23
- "build": "tsc",
24
+ "build": "tsc && cp -r src/components/*.astro dist/components/",
24
25
  "test": ":"
25
26
  },
26
27
  "dependencies": {
@@ -30,11 +31,13 @@
30
31
  "@cloudflare/workers-types": "^4.20241224.0",
31
32
  "@wix/blog": "^1.0.345",
32
33
  "@wix/data": "^1.0.194",
34
+ "@wix/identity": "^1.0.125",
33
35
  "@wix/sdk": "^1.15.14",
34
36
  "chalk": "^5.4.1",
35
37
  "esm-resolve": "^1.0.11",
36
38
  "globby": "^14.0.2",
37
39
  "magic-string": "^0.30.17",
40
+ "oauth4webapi": "^3.4.0",
38
41
  "outdent": "^0.8.0",
39
42
  "p-retry": "^6.2.1",
40
43
  "vite": "^6.0.0"