PageSourceSearch

https://www.americaneagle.ae/scripts/plp-utils/preaccess.js

js americaneagle.ae collected 2026-10-02 13:25:55 UTC 4,380 bytes, 137 lines download raw bytes

1import { getCustomer } from '../customer/api.js';
2
3export async function getPreviewPreaccessData(categoryData) {
4  const fields = [
5    'preview_sd',
6    'preview_ed',
7    'preview_category_text',
8    'preview_pdp_text',
9    'preview_tier_type',
10    'preaccess_sd',
11    'preaccess_ed',
12    'preaccess_tier_type',
13  ];
14  if (categoryData.commerce_categories.total_count > 0) {
15    const item = categoryData.commerce_categories.items[0];
16    const result = fields.reduce((acc, field) => {
17      acc[field] = item[field] || null;
18      return acc;
19    }, {});
20
21    return result;
22  }
23  return Object.fromEntries(fields.map((field) => [field, null]));
24}
25
26export function getPreviewPreaccessType(previewPreaccessData, lang) {
27  if (!previewPreaccessData || typeof previewPreaccessData !== 'object') {
28    return { type: null, pdpText: null };
29  }
30  const currentDateUTC = new Date().toISOString();
31  const extractPdpText = (pdpText) => (typeof pdpText === 'object' ? pdpText[lang] : pdpText || null);
32
33  // No need to convert time to UTC as already in UTC.
34  // const toISODate=(dateStr)=>(dateStr?new Date(dateStr.replace(' ', 'T')).toISOString() : null);
35  const toISODate = (dateStr) => (dateStr ? dateStr.replace(' ', 'T') : null);
36  if (previewPreaccessData.preaccess_sd && previewPreaccessData.preaccess_ed
37    && currentDateUTC >= toISODate(previewPreaccessData.preaccess_sd)
38    && currentDateUTC <= toISODate(previewPreaccessData.preaccess_ed)) {
39    return {
40      type: 'pre-access',
41      pdpText: extractPdpText(previewPreaccessData.preaccess_pdp_text),
42    };
43  }
44
45  if (previewPreaccessData.preview_sd && previewPreaccessData.preview_ed
46    && currentDateUTC >= toISODate(previewPreaccessData.preview_sd)
47    && currentDateUTC <= toISODate(previewPreaccessData.preview_ed)) {
48    return {
49      type: 'preview',
50      pdpText:
51        previewPreaccessData.preview_pdp_text
52          ? extractPdpText(previewPreaccessData.preview_pdp_text)
53          : null,
54    };
55  }
56  return { type: null, pdpText: null };
57}
58
59export async function getCustomerTier() {
60  try {
61    const custResponse = await getCustomer();
62
63    if (custResponse?.custom_attributes) {
64      const tierAttribute = custResponse.custom_attributes.find((attribute) => attribute.attribute_code === 'tier_name');
65      if (tierAttribute?.value) {
66        return tierAttribute.value;
67      }
68      return 'member';
69    }
70    return 'all';
71  } catch (error) {
72    return 'all';
73  }
74}
75
76export async function getVisitorEligibility(previewPreaccessData, lang) {
77  try {
78    if (!previewPreaccessData || typeof previewPreaccessData !== 'object') {
79      throw new Error('Invalid or null previewPreaccessData object');
80    }
81    const typeInfo = getPreviewPreaccessType(previewPreaccessData, lang);
82
83    if (!typeInfo.type) {
84      return { type: null, isVisitorEligible: true, pdpText: null };
85    }
86
87    const visitorTier = await getCustomerTier();
88    let isVisitorEligible = false;
89
90    const tierType = typeInfo.type === 'pre-access'
91      ? previewPreaccessData.preaccess_tier_type
92      : previewPreaccessData.preview_tier_type;
93
94    if (tierType) {
95      if (tierType.includes('all')) {
96        isVisitorEligible = true;
97      } else if (tierType.includes('member')) {
98        // Rule 2: If tierType includes "member", visitors with "member" or "plus" are eligible,
99        // but not "all"
100        isVisitorEligible = visitorTier === 'member' || visitorTier === 'plus';
101      } else if (tierType.includes('plus')) {
102        // Rule 3: If tierType includes "plus", only visitors with "plus" are eligible
103        isVisitorEligible = visitorTier === 'plus';
104      }
105    }
106
107    return {
108      type: typeInfo.type,
109      isVisitorEligible,
110      pdpText: typeInfo.pdpText,
111      visitorTier,
112    };
113  } catch (error) {
114    return {
115      type: null, isVisitorEligible: false, pdpText: null, visitorTier: null,
116    };
117  }
118}
119
120export async function getRedirectUrl(isVisitorEligible, visitorTier, language) {
121  const userLoginUrl = '/user/login';
122  const membershipUrl = '/membership-info';
123
124  const localizedLoginUrl = `/${language}${userLoginUrl}`;
125  const localizedMembershipUrl = `/${language}${membershipUrl}`;
126
127  if (!isVisitorEligible) {
128    if (visitorTier === 'all') {
129      return localizedLoginUrl;
130    }
131    if (visitorTier === 'member') {
132      return localizedMembershipUrl;
133    }
134  }
135
136  return null;
137}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.