import platform from '../platform'; import { ENV_PROD, ENV_STAGING, STAGING_STATIC_HOST, STATIC_HOST } from './constants'; import { isSameProduct } from './selectors'; import { ConfigState } from './types/reducer'; export function onReady(fn) { if (document.readyState === 'loading') { window.addEventListener('DOMContentLoaded', fn); } else { fn(); } } export function getMainJs(): HTMLScriptElement { return document.querySelector( [ `script[src^="https://${STATIC_HOST}"]`, `script[src^="https://${STAGING_STATIC_HOST}"]`, `script[src^="http://${STATIC_HOST}"]`, `script[src^="http://${STAGING_STATIC_HOST}"]` ].join(',') ) as HTMLScriptElement; } /** * * @returns array of two elements [merchantId, env]; */ export function resolveEnvAndMerchant() { const script = getMainJs(); if (!script) return []; const url = new URL(script.src); const env = url.host.startsWith(ENV_STAGING) ? ENV_STAGING : ENV_PROD; const merchantId = url.pathname.split('/')[1]; if (!env && !merchantId) return []; return [merchantId, env, script]; } export const safeProductId = product => { if (!product) return ''; let productId = `${product.id || product}`; if (platform?.shopify_selling_plans) { // we can't avoid make offer request since we need to know the upsell group and autoship by default // cart offer contains :, we care about product only productId = productId.split(':')[0]; } return productId; }; type Frequencies = ConfigState['frequencies']; type FrequenciesEveryPeriod = ConfigState['frequenciesEveryPeriod']; /** * Returns the OG frequency if platform is running on selling plans */ export const safeOgFrequency = ( initialFrequency: string | null, frequencies: Frequencies, frequenciesEveryPeriod: FrequenciesEveryPeriod ) => { if (platform.shopify_selling_plans) { const ix = frequencies?.indexOf(initialFrequency); if (ix >= 0 && frequenciesEveryPeriod[ix]) { return frequenciesEveryPeriod[ix]; } } return initialFrequency; }; export const frequencyToSellingPlan = ( ogFrequency: string, frequencyConfig: { frequencies: Frequencies; frequenciesEveryPeriod: FrequenciesEveryPeriod; } ) => { // og frequency contains underscore if (!`${ogFrequency}`.includes('_')) return ogFrequency; const { frequencies, frequenciesEveryPeriod } = frequencyConfig; const ix = frequenciesEveryPeriod?.indexOf(ogFrequency); if (ix >= 0 && frequenciesEveryPeriod[ix]) { return frequencies[ix]; } // if we can't find the OG frequency, but we have selling plans, return the first selling plan if (frequencies?.length > 0 && frequenciesEveryPeriod?.length > 0) { console.warn(`Unable to find selling plan match for frequency ${ogFrequency}; falling back to first selling plan`); return frequencies[0]; } return ogFrequency; }; /** * Attempts to auto initialize the offer library reading the merchantId and env from * integration script i.e.