window._RestockRocketConfig = window._RestockRocketConfig || {}
// Helper function to normalize locale format from hyph
aspect_ratio":0.98,"height":1178,"width":1154,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/Screenshot2022-02-24at21.18.22_5c0e6e2d-1913-4fd1-a90d-b486895960b6.png?v=1691610357"},"aspect_ratio":0.98,"height":1178,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/Screenshot2022-02-24at21.18.22_5c0e6e2d-1913-4fd1-a90d-b486895960b6.png?v=1691610357","width":1154},{"alt":null,"id":32068916314338,"position":2,"preview_image":{"aspect_ratio":1.103,"height":1088,"width":1200,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/Screenshot2022-02-24at21.18.32_9d81277b-124e-4fdc-8a0f-fbfb40a9343d.png?v=1691610357"},"aspect_ratio":1.103,"height":1088,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/Screenshot2022-02-24at21.18.32_9d81277b-124e-4fdc-8a0f-fbfb40a9343d.png?v=1691610357","width":1200}],"requires_selling_plan":false,"selling_plan_groups":[],"content":"\u003cmeta charset=\"utf-8\"\u003e\n\u003cul class=\"description-overview\"\u003e\n\u003cli\u003eEssential to any bike pack
x 80 x 45mm\u003c\/li\u003e\n\u003cli\u003eRipstop fabrics with waterproof zip\u003c\/li\u003e\n\u003cli\u003eAll contents are manufactured to European quality standards and carry the CE mark\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cmeta charset=\"utf-8\"\u003e\n\u003cp\u003e\u003cspan\u003ePerfect for bike packing, touring, and gravel bike adventures! Available online or from our bike shop in Edinburgh\u003c\/span\u003e\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cspan\u003eProjektRide Bike Hire Edinburgh.\u003c\/span\u003e\u003c\/p\u003e"};
window._RestockRocketConfig.variantsInventoryPolicy = {44210950570210 : "deny",};
window._RestockRocketConfig.variantsInventoryQuantity = {44210950570210 : parseInt("-8"),};
window._RestockRocketConfig.variantsPreorderCount = {44210950570210 : parseInt(""),};
window._RestockRocketConfig.variantsPreorderCountForMarket = {44210950570210 : null,};
window._RestockRocketConfig.variantsPreorderMaxCount = {44210950570210 : parseInt("")
w._RestockRocketConfig.scriptUrlProduct.lastIndexOf('/') + 1)
window._RestockRocketConfig.host = 'https://app.restockrocket.io'
const SETTINGS_CACHE_DURATION = 15 * 60 * 1000; // 15 minutes in milliseconds
function checkSettingsExpiry(settings) {
try {
if (!settings || !settings.updated_at) {
console.debug('STOQ - Invalid settings data structure');
return null;
}
if (!settings.cache) {
console.debug('STOQ - settings caching disabled');
return null;
}
// Check if translations are enabled but missing from cache
// This handles the backfill period where DB has translations but metafield doesn't
if (settings.multi_language_enabled) {
if (!settings.translations) {
// Translations enabled but no translation data in metafield
// Metafield hasn't been backfilled yet - force refresh
console.debug('STOQ - multi-language enabled but no translation data in cache, fetching fresh');
return
.Shopify.theme.schema_version;
headers['X-Shopify-Theme-Store-Id'] = window.Shopify.theme.theme_store_id;
}
fetch(
`${window._RestockRocketConfig.host}/api/v1/setting.json?translation_locale=${window._RestockRocketConfig.normalizedLocale}`,
{ headers }
)
.then(function(response) {
if (!response.ok) {
throw new Error('Network response was not ok');
}
return response.json();
})
.then(function(settings) {
initializeScripts(settings);
})
.catch(function(error) {
// If request failed and we have cached settings (even if expired), use them as fallback
if (cachedSettings) {
console.debug('STOQ - using expired cached settings as fallback');
initializeScripts(cachedSettings);
} else {
console.error('STOQ - failed to load settings:', error);
}
})
.catch(function(e) {
console.error(e)
})
}
function initializeScripts(settings) {
settings = applyTranslations(settings
} else if(window._RestockRocketConfig.pageType === 'search' && (settings.show_button_on_search || settings.preorder_search_enabled)) {
createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection);
} else if(window._RestockRocketConfig.pageType === 'page' && (settings.show_button_on_page || settings.preorder_page_enabled)) {
createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection);
} else if(window._RestockRocketConfig.pageType === 'product') {
createRestockRocketScript(window._RestockRocketConfig.scriptUrlProduct);
} else if(hijackIntegration) {
createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection);
} else {
console.debug(`STOQ - no scripts enabled for ${window._RestockRocketConfig.pageType}`);
}
// Dispatch custom event when app is loaded
// Cart selling plan updates will be triggered by stoq:preorder-api-ready event
const appLoadedEvent = new CustomEvent('stoq:load