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.