abmp-npm 10.3.7 → 10.3.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/backend/http-functions/interests.js +4 -6
- package/backend/login/generate-member-session-token.js +27 -0
- package/backend/login/index.js +4 -3
- package/backend/login/qa-login-methods.js +4 -3
- package/backend/login/sso-methods.js +11 -10
- package/backend/pac-api-methods.js +12 -12
- package/backend/tasks/tasks-helpers-methods.js +24 -20
- package/package.json +3 -3
- package/pages/Home.js +0 -19
- package/public/Utils/homePage.js +1 -30
- package/backend/login/login-methods-factory.js +0 -24
- package/public/Utils/homePageLoadTrace.js +0 -58
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
const axios = require('axios');
|
|
2
|
+
|
|
1
3
|
const { COLLECTIONS } = require('../../public/consts');
|
|
2
4
|
const { clearCollection } = require('../cms-data-methods');
|
|
3
5
|
const { CONFIG_KEYS } = require('../consts');
|
|
@@ -10,13 +12,9 @@ const getInterests = async () => {
|
|
|
10
12
|
getSiteConfigs(CONFIG_KEYS.INTERESTS_API_URL),
|
|
11
13
|
getHeaders(),
|
|
12
14
|
]);
|
|
13
|
-
const fetchOptions = {
|
|
14
|
-
method: 'get',
|
|
15
|
-
headers: headers,
|
|
16
|
-
};
|
|
17
15
|
try {
|
|
18
|
-
const response = await
|
|
19
|
-
return
|
|
16
|
+
const response = await axios.get(url, { headers });
|
|
17
|
+
return response.data;
|
|
20
18
|
} catch (e) {
|
|
21
19
|
console.error('Error getting interests:', e);
|
|
22
20
|
throw e;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
const { auth } = require('@wix/essentials');
|
|
2
|
+
const { authentication } = require('@wix/identity');
|
|
3
|
+
|
|
4
|
+
const elevatedSignOn = auth.elevate(authentication.signOn);
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Creates a Wix member session token for SSO / QA login using @wix/identity signOn (elevated).
|
|
8
|
+
* @param {string} email - Member login email
|
|
9
|
+
* @returns {Promise<string>} Session token for authentication.applySessionToken on the client
|
|
10
|
+
*/
|
|
11
|
+
async function generateMemberSessionToken(email) {
|
|
12
|
+
const trimmedEmail = (email || '').trim();
|
|
13
|
+
if (!trimmedEmail) {
|
|
14
|
+
throw new Error('Email is required to generate a session token');
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const response = await elevatedSignOn({ email: trimmedEmail });
|
|
18
|
+
const sessionToken = response?.sessionToken;
|
|
19
|
+
if (!sessionToken) {
|
|
20
|
+
throw new Error('Failed to generate session token: empty response from signOn');
|
|
21
|
+
}
|
|
22
|
+
return sessionToken;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
module.exports = {
|
|
26
|
+
generateMemberSessionToken,
|
|
27
|
+
};
|
package/backend/login/index.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
const {
|
|
2
|
-
const { validateMemberToken } = require('./sso-methods');
|
|
1
|
+
const { loginQAMember } = require('./qa-login-methods');
|
|
2
|
+
const { validateMemberToken, authenticateSSOToken } = require('./sso-methods');
|
|
3
3
|
|
|
4
4
|
module.exports = {
|
|
5
|
-
|
|
5
|
+
loginQAMember,
|
|
6
6
|
validateMemberToken,
|
|
7
|
+
authenticateSSOToken,
|
|
7
8
|
};
|
|
@@ -2,6 +2,8 @@ const { CONFIG_KEYS } = require('../consts');
|
|
|
2
2
|
const { prepareMemberForQALogin, getQAUsers } = require('../members-data-methods');
|
|
3
3
|
const { getSecret, getSiteConfigs } = require('../utils');
|
|
4
4
|
|
|
5
|
+
const { generateMemberSessionToken } = require('./generate-member-session-token');
|
|
6
|
+
|
|
5
7
|
const validateQAUser = async userEmail => {
|
|
6
8
|
const qaUsers = await getQAUsers();
|
|
7
9
|
const matchingUserEmail = qaUsers.find(user => user.email === userEmail)?.email;
|
|
@@ -16,10 +18,9 @@ const validateQAUser = async userEmail => {
|
|
|
16
18
|
* @param {Object} params - The parameters for the login
|
|
17
19
|
* @param {string} params.userEmail - The email of the user to login
|
|
18
20
|
* @param {string} params.secret - The secret of the user to login
|
|
19
|
-
* @param {Function} generateSessionToken - a dependency of the method, injected by the createLoginMethods function
|
|
20
21
|
* @returns {Promise<Object>} The result of the login
|
|
21
22
|
*/
|
|
22
|
-
const loginQAMember = async ({ userEmail, secret }
|
|
23
|
+
const loginQAMember = async ({ userEmail, secret }) => {
|
|
23
24
|
try {
|
|
24
25
|
const [qaSecret, allowAnyMember] = await Promise.all([
|
|
25
26
|
getSecret('ABMP_QA_SECRET'),
|
|
@@ -36,7 +37,7 @@ const loginQAMember = async ({ userEmail, secret }, generateSessionToken) => {
|
|
|
36
37
|
}
|
|
37
38
|
|
|
38
39
|
const memberData = await prepareMemberForQALogin(userEmail);
|
|
39
|
-
const token = await
|
|
40
|
+
const token = await generateMemberSessionToken(memberData.email);
|
|
40
41
|
return {
|
|
41
42
|
success: true,
|
|
42
43
|
token,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const { createHmac } = require('crypto');
|
|
2
2
|
|
|
3
|
+
const axios = require('axios');
|
|
3
4
|
const { decode } = require('jwt-js-decode');
|
|
4
5
|
|
|
5
6
|
const { CONFIG_KEYS, SSO_TOKEN_AUTH_API_URL } = require('../consts');
|
|
@@ -14,6 +15,8 @@ const {
|
|
|
14
15
|
getSecret,
|
|
15
16
|
} = require('../utils');
|
|
16
17
|
|
|
18
|
+
const { generateMemberSessionToken } = require('./generate-member-session-token');
|
|
19
|
+
|
|
17
20
|
/**
|
|
18
21
|
* Validates member token and retrieves member data
|
|
19
22
|
* @param {string} memberIdInput - The member ID to validate
|
|
@@ -91,17 +94,16 @@ async function checkAndFetchSSO(token) {
|
|
|
91
94
|
const SSO_TOKEN_AUTH_API_KEY = await getSecret('SSO_TOKEN_AUTH_API_KEY');
|
|
92
95
|
const signature = createHmac('sha256', SSO_TOKEN_AUTH_API_KEY).update(token).digest('hex');
|
|
93
96
|
const professionalassistcorpUrl = `${SSO_TOKEN_AUTH_API_URL}/eweb/SSOToken.ashx?token=${token}&Partner=Wix&Signature=${signature}`;
|
|
94
|
-
const options = {
|
|
95
|
-
method: 'get',
|
|
96
|
-
};
|
|
97
97
|
try {
|
|
98
|
-
const httpResponse = await
|
|
98
|
+
const httpResponse = await axios.get(professionalassistcorpUrl, {
|
|
99
|
+
transformResponse: [d => d],
|
|
100
|
+
validateStatus: () => true,
|
|
101
|
+
});
|
|
99
102
|
console.log('httpResponse status', httpResponse.status);
|
|
100
|
-
if (
|
|
103
|
+
if (httpResponse.status < 200 || httpResponse.status >= 300) {
|
|
101
104
|
throw new Error('Fetch did not succeed with status: ' + httpResponse.status);
|
|
102
105
|
}
|
|
103
|
-
|
|
104
|
-
return responseToken;
|
|
106
|
+
return httpResponse.data;
|
|
105
107
|
} catch (error) {
|
|
106
108
|
console.error('Error in checkAndFetchSSO', error);
|
|
107
109
|
return null;
|
|
@@ -112,10 +114,9 @@ async function checkAndFetchSSO(token) {
|
|
|
112
114
|
* Authenticate an SSO token
|
|
113
115
|
* @param {Object} params - The parameters for the authentication
|
|
114
116
|
* @param {string} params.token - The token to authenticate
|
|
115
|
-
* @param {Function} generateSessionToken - a dependency of the method, injected by the createLoginMethods function
|
|
116
117
|
* @returns {Promise<Object>} The result of the authentication
|
|
117
118
|
*/
|
|
118
|
-
const authenticateSSOToken = async ({ token }
|
|
119
|
+
const authenticateSSOToken = async ({ token }) => {
|
|
119
120
|
const responseToken = await checkAndFetchSSO(token);
|
|
120
121
|
const isValidToken = Boolean(
|
|
121
122
|
responseToken && typeof responseToken === 'string' && responseToken?.trim()
|
|
@@ -135,7 +136,7 @@ const authenticateSSOToken = async ({ token }, generateSessionToken) => {
|
|
|
135
136
|
const payload = jwt.payload;
|
|
136
137
|
const memberData = await prepareMemberForSSOLogin(payload);
|
|
137
138
|
console.log('memberDataCollectionId', memberData._id);
|
|
138
|
-
const sessionToken = await
|
|
139
|
+
const sessionToken = await generateMemberSessionToken(memberData.email);
|
|
139
140
|
const authObj = {
|
|
140
141
|
type: 'success',
|
|
141
142
|
memberId: memberData._id,
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
const axios = require('axios');
|
|
2
|
+
|
|
1
3
|
const { PAC_API_URL, TEST_PAC_API_URL, BACKUP_API_URL } = require('./consts');
|
|
2
4
|
const { getSecret } = require('./utils');
|
|
3
5
|
|
|
@@ -31,24 +33,22 @@ const fetchPACMembers = async ({ page, action, backupDate, isTestEnvironment })
|
|
|
31
33
|
const url = `${baseUrl}/Members?${new URLSearchParams(queryParams).toString()}`;
|
|
32
34
|
console.log(`Fetching PAC members from: ${url}`);
|
|
33
35
|
const headers = await getHeaders();
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
};
|
|
38
|
-
const
|
|
39
|
-
const responseType = response.headers.get('content-type');
|
|
36
|
+
const response = await axios.get(url, {
|
|
37
|
+
headers,
|
|
38
|
+
validateStatus: () => true,
|
|
39
|
+
});
|
|
40
|
+
const responseType = response.headers['content-type'] || '';
|
|
40
41
|
if (!responseType.includes('application/json')) {
|
|
41
42
|
const errorMessage = `[fetchPACMembers] got invalid responseType: ${responseType} for page ${page} and actionFilter ${action}`;
|
|
42
43
|
console.error(errorMessage);
|
|
43
44
|
throw new Error(errorMessage);
|
|
44
45
|
}
|
|
45
|
-
if (response.
|
|
46
|
-
return response.
|
|
47
|
-
} else {
|
|
48
|
-
const errorMessage = `[fetchPACMembers] failed with status ${response.status} for page ${page} and actionFilter ${action}`;
|
|
49
|
-
console.error(errorMessage);
|
|
50
|
-
throw new Error(errorMessage);
|
|
46
|
+
if (response.status >= 200 && response.status < 300) {
|
|
47
|
+
return response.data;
|
|
51
48
|
}
|
|
49
|
+
const errorMessage = `[fetchPACMembers] failed with status ${response.status} for page ${page} and actionFilter ${action}`;
|
|
50
|
+
console.error(errorMessage);
|
|
51
|
+
throw new Error(errorMessage);
|
|
52
52
|
};
|
|
53
53
|
|
|
54
54
|
module.exports = { fetchPACMembers, getHeaders }; //TODO: remove getHeaders from exported methods once npm movement finishes
|
|
@@ -103,23 +103,23 @@ async function updateMemberRichContent(memberId) {
|
|
|
103
103
|
content: htmlString,
|
|
104
104
|
});
|
|
105
105
|
|
|
106
|
-
const
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
Cookie: 'XSRF-TOKEN=1753949844|p--a7HsuVjR4',
|
|
111
|
-
Authorization: 'Bearer ' + (await getServerlessAuth()),
|
|
112
|
-
},
|
|
113
|
-
body: raw,
|
|
106
|
+
const requestHeaders = {
|
|
107
|
+
'Content-Type': 'application/json',
|
|
108
|
+
Cookie: 'XSRF-TOKEN=1753949844|p--a7HsuVjR4',
|
|
109
|
+
Authorization: 'Bearer ' + (await getServerlessAuth()),
|
|
114
110
|
};
|
|
115
111
|
|
|
116
112
|
try {
|
|
117
|
-
const response = await
|
|
113
|
+
const response = await axios.post(
|
|
118
114
|
'https://www.wixapis.com/data-sync/v1/abmp-content-converter',
|
|
119
|
-
|
|
115
|
+
raw,
|
|
116
|
+
{
|
|
117
|
+
headers: requestHeaders,
|
|
118
|
+
validateStatus: () => true,
|
|
119
|
+
}
|
|
120
120
|
);
|
|
121
|
-
if (response.
|
|
122
|
-
const data =
|
|
121
|
+
if (response.status >= 200 && response.status < 300) {
|
|
122
|
+
const data = response.data;
|
|
123
123
|
const updatedMember = {
|
|
124
124
|
...member,
|
|
125
125
|
aboutYourSelf: data.richContent.richContent,
|
|
@@ -358,9 +358,13 @@ async function uploadMembersSitemap({ members, tokens, destinationFileName, site
|
|
|
358
358
|
|
|
359
359
|
const url = `https://${host}${pathName}`;
|
|
360
360
|
console.log('url', url);
|
|
361
|
-
const res = await
|
|
362
|
-
|
|
363
|
-
|
|
361
|
+
const res = await axios.put(url, body, {
|
|
362
|
+
headers: reqOpts.headers,
|
|
363
|
+
transformResponse: [d => d],
|
|
364
|
+
validateStatus: () => true,
|
|
365
|
+
});
|
|
366
|
+
if (res.status < 200 || res.status >= 300) {
|
|
367
|
+
const respText = res.data;
|
|
364
368
|
console.log('Response body', respText);
|
|
365
369
|
throw new Error(`S3 PUT failed ${res.status} ${res.statusText}: ${respText}`);
|
|
366
370
|
}
|
|
@@ -391,13 +395,13 @@ async function stsPost(body, baseAccessKeyId, baseSecretAccessKey) {
|
|
|
391
395
|
accessKeyId: baseAccessKeyId,
|
|
392
396
|
secretAccessKey: baseSecretAccessKey,
|
|
393
397
|
});
|
|
394
|
-
const res = await
|
|
395
|
-
method,
|
|
398
|
+
const res = await axios.post(`https://${host}${path}`, body, {
|
|
396
399
|
headers: reqOpts.headers,
|
|
397
|
-
|
|
400
|
+
transformResponse: [d => d],
|
|
401
|
+
validateStatus: () => true,
|
|
398
402
|
});
|
|
399
|
-
const text =
|
|
400
|
-
if (
|
|
403
|
+
const text = res.data;
|
|
404
|
+
if (res.status < 200 || res.status >= 300) throw new Error(`STS ${res.status}: ${text}`);
|
|
401
405
|
|
|
402
406
|
const accessKeyId = parseXmlVal(text, 'AccessKeyId');
|
|
403
407
|
const secretAccessKey = parseXmlVal(text, 'SecretAccessKey');
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "abmp-npm",
|
|
3
|
-
"version": "10.3.
|
|
3
|
+
"version": "10.3.8",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"check-cycles": "madge --circular .",
|
|
@@ -35,8 +35,8 @@
|
|
|
35
35
|
"@wix/automations": "^1.0.261",
|
|
36
36
|
"@wix/crm": "^1.0.1061",
|
|
37
37
|
"@wix/data": "^1.0.349",
|
|
38
|
-
"@wix/essentials": "^0.
|
|
39
|
-
"@wix/identity": "^1.0.
|
|
38
|
+
"@wix/essentials": "^1.0.7",
|
|
39
|
+
"@wix/identity": "^1.0.195",
|
|
40
40
|
"@wix/media": "^1.0.213",
|
|
41
41
|
"@wix/members": "^1.0.365",
|
|
42
42
|
"@wix/secrets": "^1.0.62",
|
package/pages/Home.js
CHANGED
|
@@ -5,7 +5,6 @@ const { withWarmUpData } = require('psdev-utils/frontend');
|
|
|
5
5
|
|
|
6
6
|
const { ADDRESS_STATUS_TYPES, DEFAULT_FILTER, DROPDOWN_OPTIONS } = require('../public/consts.js');
|
|
7
7
|
const { createHomepageUtils } = require('../public/Utils/homePage.js');
|
|
8
|
-
const { logHomePageLoadPhase } = require('../public/Utils/homePageLoadTrace.js');
|
|
9
8
|
const {
|
|
10
9
|
getMainAddress,
|
|
11
10
|
formatPracticeAreasForDisplay,
|
|
@@ -14,8 +13,6 @@ const {
|
|
|
14
13
|
normalizeExternalUrl,
|
|
15
14
|
} = require('../public/Utils/sharedUtils.js');
|
|
16
15
|
|
|
17
|
-
logHomePageLoadPhase('home_js_module_evaluated');
|
|
18
|
-
|
|
19
16
|
let filter = JSON.parse(JSON.stringify(DEFAULT_FILTER));
|
|
20
17
|
let dropDownOptions = JSON.parse(JSON.stringify(DROPDOWN_OPTIONS));
|
|
21
18
|
let stateCityMap;
|
|
@@ -39,7 +36,6 @@ const homePageOnReady = async ({
|
|
|
39
36
|
getNonCompiledFiltersOptions,
|
|
40
37
|
filterProfiles,
|
|
41
38
|
}) => {
|
|
42
|
-
logHomePageLoadPhase('wix_onready_handler_entered');
|
|
43
39
|
const {
|
|
44
40
|
getParamsMapping,
|
|
45
41
|
handlePagination,
|
|
@@ -62,9 +58,7 @@ const homePageOnReady = async ({
|
|
|
62
58
|
detectMobile();
|
|
63
59
|
initPageUI();
|
|
64
60
|
attachEventListeners();
|
|
65
|
-
logHomePageLoadPhase('before_handleUrlParams');
|
|
66
61
|
await handleUrlParams();
|
|
67
|
-
logHomePageLoadPhase('after_handleUrlParams');
|
|
68
62
|
|
|
69
63
|
async function detectMobile() {
|
|
70
64
|
try {
|
|
@@ -294,9 +288,7 @@ const homePageOnReady = async ({
|
|
|
294
288
|
}
|
|
295
289
|
|
|
296
290
|
async function applyFilterToUI(isDefaultStateParams) {
|
|
297
|
-
logHomePageLoadPhase('applyFilterToUI_start', { isDefaultStateParams });
|
|
298
291
|
const renderingEnv = await rendering.env();
|
|
299
|
-
logHomePageLoadPhase('applyFilterToUI_rendering_env', { env: renderingEnv });
|
|
300
292
|
const setFilterFromParams = async (isInitializeValue = true) => {
|
|
301
293
|
const params = await wixLocation.query();
|
|
302
294
|
console.log('params inside setFilterFromParams ', params);
|
|
@@ -330,9 +322,7 @@ const homePageOnReady = async ({
|
|
|
330
322
|
await setFilterFromParams(true);
|
|
331
323
|
if (isDefaultStateParams) {
|
|
332
324
|
console.log('default state set for nearby');
|
|
333
|
-
logHomePageLoadPhase('applyFilterToUI_default_path_fetch_and_nearby_start');
|
|
334
325
|
await Promise.all([fetchFilterData(), nearByHandler(true)]);
|
|
335
|
-
logHomePageLoadPhase('applyFilterToUI_default_path_complete');
|
|
336
326
|
return;
|
|
337
327
|
}
|
|
338
328
|
console.log('not default state');
|
|
@@ -351,15 +341,12 @@ const homePageOnReady = async ({
|
|
|
351
341
|
: () => updateResults('filterTimeout', true);
|
|
352
342
|
console.log('filter ..', filter);
|
|
353
343
|
try {
|
|
354
|
-
logHomePageLoadPhase('applyFilterToUI_non_default_path_start');
|
|
355
344
|
await Promise.all([
|
|
356
345
|
fetchFilterData().then(() => setFilterFromParams(false)),
|
|
357
346
|
//TODO: remove this workaround to fix issue with SSR showing invalid results
|
|
358
347
|
renderingEnv === 'backend' ? Promise.resolve() : searchPromise(),
|
|
359
348
|
]);
|
|
360
|
-
logHomePageLoadPhase('applyFilterToUI_non_default_path_complete');
|
|
361
349
|
} catch (error) {
|
|
362
|
-
logHomePageLoadPhase('applyFilterToUI_error', { message: String(error && error.message) });
|
|
363
350
|
console.error('[applyFilterToUI] failed with error:', error);
|
|
364
351
|
multiStateBoxSelector.changeState('errorState');
|
|
365
352
|
}
|
|
@@ -438,7 +425,6 @@ const homePageOnReady = async ({
|
|
|
438
425
|
}
|
|
439
426
|
// NEAR BY FILTER
|
|
440
427
|
async function nearByHandler(preservePagination = false) {
|
|
441
|
-
logHomePageLoadPhase('nearByHandler_start', { preservePagination });
|
|
442
428
|
const isSearchingNearby = _$w('#nearBy').checked;
|
|
443
429
|
const renderingEnv = await rendering.env();
|
|
444
430
|
// 1. Disable nearby input while processing
|
|
@@ -452,7 +438,6 @@ const homePageOnReady = async ({
|
|
|
452
438
|
filter = newFilter;
|
|
453
439
|
console.log('filter inside nearByHandler', filter);
|
|
454
440
|
if (!success) {
|
|
455
|
-
logHomePageLoadPhase('nearByHandler_geolocation_failed');
|
|
456
441
|
if (renderingEnv !== 'backend') {
|
|
457
442
|
//on Backend environment, geolocation API don't work, so makes no sense to change state for near by
|
|
458
443
|
multiStateBoxSelector.changeState('nearByState');
|
|
@@ -467,7 +452,6 @@ const homePageOnReady = async ({
|
|
|
467
452
|
// If location is not selected, change state to "resultsState"
|
|
468
453
|
if (!isSearchingNearby) {
|
|
469
454
|
if (await noSearchCriteria()) {
|
|
470
|
-
logHomePageLoadPhase('nearByHandler_no_search_criteria');
|
|
471
455
|
multiStateBoxSelector.changeState('noSearchCriteria');
|
|
472
456
|
// 4. Re-enable nearby input
|
|
473
457
|
_$w('#nearBy').enable();
|
|
@@ -479,7 +463,6 @@ const homePageOnReady = async ({
|
|
|
479
463
|
|
|
480
464
|
// 4. Re-enable nearby input when done
|
|
481
465
|
_$w('#nearBy').enable();
|
|
482
|
-
logHomePageLoadPhase('nearByHandler_complete', { success: true });
|
|
483
466
|
return true;
|
|
484
467
|
}
|
|
485
468
|
|
|
@@ -487,7 +470,6 @@ const homePageOnReady = async ({
|
|
|
487
470
|
// FETCH STATE/CITY/AREAS OF PRACTICE FROM BACKEND ONCE AND STORE IT
|
|
488
471
|
|
|
489
472
|
async function fetchFilterData() {
|
|
490
|
-
logHomePageLoadPhase('fetchFilterData_start');
|
|
491
473
|
let completeStateList, areasOfPracticesList, stateCityMapList;
|
|
492
474
|
try {
|
|
493
475
|
const { COMPILED_STATE_LIST, COMPILED_AREAS_OF_PRACTICES, COMPILED_STATE_CITY_MAP } =
|
|
@@ -528,7 +510,6 @@ const homePageOnReady = async ({
|
|
|
528
510
|
|
|
529
511
|
// Update filter states after data is loaded
|
|
530
512
|
updateFiltersState();
|
|
531
|
-
logHomePageLoadPhase('fetchFilterData_complete');
|
|
532
513
|
}
|
|
533
514
|
|
|
534
515
|
// CONSTRUCT DROPDOWN OPTIONS FOR STATE, CITY, AREA OF PRACTICES
|
package/public/Utils/homePage.js
CHANGED
|
@@ -3,7 +3,6 @@ const { window: wixWindow, rendering } = require('@wix/site-window');
|
|
|
3
3
|
|
|
4
4
|
const { DEFAULT_FILTER } = require('../consts.js');
|
|
5
5
|
|
|
6
|
-
const { logHomePageLoadPhase } = require('./homePageLoadTrace.js');
|
|
7
6
|
const { debouncedFunction } = require('./sharedUtils.js');
|
|
8
7
|
|
|
9
8
|
function isValidGeolocation(lat, lng) {
|
|
@@ -400,8 +399,6 @@ const createHomepageUtils = (_$w, filterProfiles) => {
|
|
|
400
399
|
});
|
|
401
400
|
}
|
|
402
401
|
async function getAndSetUserLocation(isSearchingNearby, filter) {
|
|
403
|
-
logHomePageLoadPhase('getAndSetUserLocation_start', { isSearchingNearby });
|
|
404
|
-
|
|
405
402
|
const { latitude: existingLat, longitude: existingLng } = filter;
|
|
406
403
|
if (isValidGeolocation(existingLat, existingLng)) {
|
|
407
404
|
return {
|
|
@@ -411,23 +408,16 @@ const createHomepageUtils = (_$w, filterProfiles) => {
|
|
|
411
408
|
}
|
|
412
409
|
|
|
413
410
|
try {
|
|
414
|
-
logHomePageLoadPhase('getAndSetUserLocation_before_getCurrentGeolocation');
|
|
415
411
|
const location = await getCurrentGeolocationWithTimeout();
|
|
412
|
+
|
|
416
413
|
console.log('location inside getAndSetUserLocation', location);
|
|
417
414
|
const userLat = location.coords?.latitude ?? 0;
|
|
418
415
|
const userLong = location.coords?.longitude ?? 0;
|
|
419
|
-
logHomePageLoadPhase('getAndSetUserLocation_success', {
|
|
420
|
-
lat: userLat,
|
|
421
|
-
lng: userLong,
|
|
422
|
-
});
|
|
423
416
|
return {
|
|
424
417
|
success: true,
|
|
425
418
|
filter: applyGeolocationToFilter(filter, userLat, userLong, isSearchingNearby),
|
|
426
419
|
};
|
|
427
420
|
} catch (error) {
|
|
428
|
-
logHomePageLoadPhase('getAndSetUserLocation_error', {
|
|
429
|
-
message: String(error && error.message),
|
|
430
|
-
});
|
|
431
421
|
console.warn('Failed to get user location in getAndSetUserLocation', error);
|
|
432
422
|
return { success: false, filter };
|
|
433
423
|
}
|
|
@@ -546,7 +536,6 @@ const createHomepageUtils = (_$w, filterProfiles) => {
|
|
|
546
536
|
);
|
|
547
537
|
}
|
|
548
538
|
async function parseAndValidateQueryParams(filter, pagination) {
|
|
549
|
-
logHomePageLoadPhase('parseAndValidateQueryParams_start');
|
|
550
539
|
const params = await wixLocation.query();
|
|
551
540
|
const paramsMapping = getParamsMapping(filter, pagination);
|
|
552
541
|
const {
|
|
@@ -558,11 +547,6 @@ const createHomepageUtils = (_$w, filterProfiles) => {
|
|
|
558
547
|
const isSearchingNearby = params.nearby === 'true';
|
|
559
548
|
const isNoParams = !withoutPreviewParams || Object.keys(withoutPreviewParams).length === 0;
|
|
560
549
|
const { success, filter: newFilter } = await getAndSetUserLocation(isSearchingNearby, filter);
|
|
561
|
-
logHomePageLoadPhase('parseAndValidateQueryParams_after_geolocation', {
|
|
562
|
-
isNoParams,
|
|
563
|
-
isSearchingNearby,
|
|
564
|
-
success,
|
|
565
|
-
});
|
|
566
550
|
|
|
567
551
|
// Auto-enable nearby if GPS permission granted on fresh page load
|
|
568
552
|
if (
|
|
@@ -573,7 +557,6 @@ const createHomepageUtils = (_$w, filterProfiles) => {
|
|
|
573
557
|
!isSearchingNearby
|
|
574
558
|
) {
|
|
575
559
|
await wixQueryParams.add({ nearby: 'true', page: '1' });
|
|
576
|
-
logHomePageLoadPhase('parseAndValidateQueryParams_return', { branch: 'auto_nearby_url' });
|
|
577
560
|
return { isDefaultStateParams: true, filter: newFilter };
|
|
578
561
|
}
|
|
579
562
|
|
|
@@ -587,7 +570,6 @@ const createHomepageUtils = (_$w, filterProfiles) => {
|
|
|
587
570
|
// });
|
|
588
571
|
// Don't search yet - let the caller decide what to do
|
|
589
572
|
// The search will be handled in applyFilterToUI
|
|
590
|
-
logHomePageLoadPhase('parseAndValidateQueryParams_return', { branch: 'default_no_params' });
|
|
591
573
|
return { isDefaultStateParams: true, filter: newFilter };
|
|
592
574
|
}
|
|
593
575
|
let autoAdjustFilters = false;
|
|
@@ -627,10 +609,6 @@ const createHomepageUtils = (_$w, filterProfiles) => {
|
|
|
627
609
|
withoutPreviewParams.page) ||
|
|
628
610
|
(Object.keys(withoutPreviewParams).length === 1 && withoutPreviewParams.nearby);
|
|
629
611
|
const isDefaultStateParams = isNoParams || isNearbyFilter;
|
|
630
|
-
logHomePageLoadPhase('parseAndValidateQueryParams_return', {
|
|
631
|
-
branch: 'with_query_params',
|
|
632
|
-
isDefaultStateParams,
|
|
633
|
-
});
|
|
634
612
|
return { isDefaultStateParams, filter: newFilter };
|
|
635
613
|
}
|
|
636
614
|
|
|
@@ -714,7 +692,6 @@ const createHomepageUtils = (_$w, filterProfiles) => {
|
|
|
714
692
|
isSearchingNearby,
|
|
715
693
|
preservePagination = false,
|
|
716
694
|
}) {
|
|
717
|
-
logHomePageLoadPhase('search_start', { timeoutType, isSearchingNearby });
|
|
718
695
|
const multiStateBoxSelector = _$w('#resultsStateBox');
|
|
719
696
|
const renderingEnv = await rendering.env();
|
|
720
697
|
const initSearchResultsUI = () => {
|
|
@@ -736,7 +713,6 @@ const createHomepageUtils = (_$w, filterProfiles) => {
|
|
|
736
713
|
longitude: 0,
|
|
737
714
|
}) === JSON.stringify(DEFAULT_FILTER)
|
|
738
715
|
) {
|
|
739
|
-
logHomePageLoadPhase('search_short_circuit_no_criteria');
|
|
740
716
|
multiStateBoxSelector.changeState('noSearchCriteria');
|
|
741
717
|
return [];
|
|
742
718
|
}
|
|
@@ -760,19 +736,14 @@ const createHomepageUtils = (_$w, filterProfiles) => {
|
|
|
760
736
|
timeoutType,
|
|
761
737
|
args: { filter, isSearchingNearby },
|
|
762
738
|
});
|
|
763
|
-
logHomePageLoadPhase('search_before_filterProfiles', { renderingEnv });
|
|
764
739
|
const { success, response, error } = await funcPromise();
|
|
765
740
|
if (!success) {
|
|
766
741
|
_$w('#numberOfResults').text = '';
|
|
767
742
|
console.error('[search] failed with error:', error);
|
|
768
|
-
logHomePageLoadPhase('search_filterProfiles_failed', {
|
|
769
|
-
message: String(error && error.message),
|
|
770
|
-
});
|
|
771
743
|
multiStateBoxSelector.changeState('errorState');
|
|
772
744
|
return [];
|
|
773
745
|
}
|
|
774
746
|
const totalCount = response.items.length;
|
|
775
|
-
logHomePageLoadPhase('search_filterProfiles_success', { totalCount });
|
|
776
747
|
if (!totalCount) {
|
|
777
748
|
_$w('#numberOfResults').text = 'Showing 0 results';
|
|
778
749
|
_$w('#noResultsMessage').text = `${
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
const { loginQAMember } = require('./qa-login-methods');
|
|
2
|
-
const { authenticateSSOToken } = require('./sso-methods');
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Creates login methods with injected generateSessionToken dependency
|
|
6
|
-
* @param {Function} generateSessionToken - The Velo generateSessionToken function to inject
|
|
7
|
-
* @returns {Object} Object containing loginQAMember and authenticateSSOToken methods
|
|
8
|
-
*/
|
|
9
|
-
const createLoginMethods = generateSessionToken => {
|
|
10
|
-
//There is no generateSessionToken SDK version, and the signOn of @wix/identity returns 403 error regardless that the permissions are valid
|
|
11
|
-
//Therefore, as a workaround we need to inject the Velo version of generateSessionToken to the login methods.
|
|
12
|
-
const injectGenerateSessionTokenToMethod =
|
|
13
|
-
method =>
|
|
14
|
-
async (...args) =>
|
|
15
|
-
await method(...args, generateSessionToken);
|
|
16
|
-
return {
|
|
17
|
-
loginQAMember: injectGenerateSessionTokenToMethod(loginQAMember),
|
|
18
|
-
authenticateSSOToken: injectGenerateSessionTokenToMethod(authenticateSSOToken),
|
|
19
|
-
};
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
module.exports = {
|
|
23
|
-
createLoginMethods,
|
|
24
|
-
};
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* One session per full page load. First log call creates `loadId` (send this to support for GCL search).
|
|
3
|
-
* Logs a plain object so DevTools shows an expandable tree; `loadId` is still easy to copy for GCL.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
function randomSegment() {
|
|
7
|
-
return Math.random().toString(36).slice(2, 10);
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
function nowMs() {
|
|
11
|
-
if (typeof performance !== 'undefined' && typeof performance.now === 'function') {
|
|
12
|
-
return performance.now();
|
|
13
|
-
}
|
|
14
|
-
return Date.now();
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
let session = null;
|
|
18
|
-
|
|
19
|
-
function ensureSession() {
|
|
20
|
-
if (session) {
|
|
21
|
-
return session;
|
|
22
|
-
}
|
|
23
|
-
const t0 = nowMs();
|
|
24
|
-
session = {
|
|
25
|
-
loadId: `hpl_${Date.now()}_${randomSegment()}_${randomSegment()}`,
|
|
26
|
-
t0,
|
|
27
|
-
};
|
|
28
|
-
return session;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* @param {string} phase
|
|
33
|
-
* @param {Record<string, unknown>} [detail]
|
|
34
|
-
*/
|
|
35
|
-
function logHomePageLoadPhase(phase, detail) {
|
|
36
|
-
const s = ensureSession();
|
|
37
|
-
const elapsed = Math.round(nowMs() - s.t0);
|
|
38
|
-
const payload = {
|
|
39
|
-
type: 'HomePageLoad',
|
|
40
|
-
loadId: s.loadId,
|
|
41
|
-
phase,
|
|
42
|
-
elapsedSinceStartMs: elapsed,
|
|
43
|
-
wallTimeIso: new Date().toISOString(),
|
|
44
|
-
};
|
|
45
|
-
if (detail && typeof detail === 'object') {
|
|
46
|
-
payload.detail = detail;
|
|
47
|
-
}
|
|
48
|
-
console.log('[HomePageLoad]', payload);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function getHomePageLoadId() {
|
|
52
|
-
return ensureSession().loadId;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
module.exports = {
|
|
56
|
-
logHomePageLoadPhase,
|
|
57
|
-
getHomePageLoadId,
|
|
58
|
-
};
|