will be fully tracked and insured and packaged well to prevent any damage.\u003c\/span\u003e\u003c\/p\u003e\n\u003cp\u003e\u003cbr\u003e\u003c\/p\u003e\n\u003cp\u003e\u003cspan\u003eThanks for viewing.\u003c\/span\u003e\u003c\/p\u003e","published_at":"2025-12-01T10:01:43+00:00","created_at":"2025-12-01T10:01:41+00:00","vendor":"ProjektRide","type":"","tags":["bike","bikes","Road","Road \/ Gravel \/ Touring Bikes","second hand","secondhand","spo-cs-disabled","spo-default","spo-disabled","spo-notify-me-disabled"],"price":37500,"price_min":37500,"price_max":37500,"available":true,"price_varies":false,"compare_at_price":null,"compare_at_price_min":0,"compare_at_price_max":0,"compare_at_price_varies":false,"variants":[{"id":56498753372543,"title":"Default Title","option1":"Default Title","option2":null,"option3":null,"sku":null,"requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Hoy Road Bike - Extra Large","public_title":null,"options":["Default Title"],"price":37500,"weight":0,
- files\/DSC02182.jpg?v=1764776200","width":4912},{"alt":null,"id":68959797739903,"position":2,"preview_image":{"aspect_ratio":1.505,"height":3264,"width":4912,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/DSC02184.jpg?v=1764776200"},"aspect_ratio":1.505,"height":3264,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/DSC02184.jpg?v=1764776200","width":4912},{"alt":null,"id":68959797772671,"position":3,"preview_image":{"aspect_ratio":1.505,"height":3264,"width":4912,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/DSC02186.jpg?v=1764776201"},"aspect_ratio":1.505,"height":3264,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/DSC02186.jpg?v=1764776201","width":4912},{"alt":null,"id":68959797805439,"position":4,"preview_image":{"aspect_ratio":1.505,"height":3264,"width":4912,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/DSC02188.jpg?v=1764776201"},"aspect_ratio":1.505,"height":3264,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/DSC02188.jpg?v=176477620ling_plan":false,"selling_plan_groups":[],"content":"\u003cp\u003eHi,\u003c\/p\u003e\n\u003cp\u003eFor sale, we have this Hoy Road Bike.\u003c\/p\u003e\n\u003cp\u003eShimano 2x11 Speed 105 Drivetrain with Mechanical rim brakes.\u003c\/p\u003e\n\u003cp\u003eSize - Extra Large.\u003c\/p\u003e\n\u003cp\u003eMudguards have been fitted to this model\u003c\/p\u003e\n\u003cp\u003eOverall in good condition as shown in the photos.\u003c\/p\u003e\n\u003cp\u003eAny questions, please feel free to ask.\u003c\/p\u003e\n\u003cp\u003e\u003cspan\u003eAll bikes are serviced to a very high standard to ensure you have a great experience.\u003c\/span\u003e\u003c\/p\u003e\n\u003cp\u003e\u003cspan\u003eFull 90-day warranty is included with each bike.\u003c\/span\u003e\u003c\/p\u003e\n\u003cp\u003e\u003cspan\u003eWe recommend coming in-store for a test ride, it’s the best way to get a feel for the bike that’s right for you. We stock all accessories such as lights, locks, and helmets to get you ready for the road.\u003c\/span\u00 "",};
window._RestockRocketConfig.variantsShippingTextForMarket = {56498753372543 : null,};
window._RestockRocketConfig.selected_variant_id = 56498753372543;
window._RestockRocketConfig.selected_variant_available = window._RestockRocketConfig.product.variants.find(function(variant) { return variant.id == window._RestockRocketConfig.selected_variant_id }).available;window._RestockRocketConfig.scriptUrlProduct = 'https://cdn.shopify.com/extensions/019ade57-efc1-7a93-a1b4-30689b78f362/restock-rocket-shopify-401/assets/restockrocket-product.js'
window._RestockRocketConfig.scriptUrlCollection = 'https://cdn.shopify.com/extensions/019ade57-efc1-7a93-a1b4-30689b78f362/restock-rocket-shopify-401/assets/restockrocket-collection.js'
window._RestockRocketConfig.scriptHost = window._RestockRocketConfig.scriptUrlProduct.substring(0, window._RestockRocketConfig.scriptUrlProduct.lastIndexOf('/') + 1)
window._RestockRocketConfig.host = 'https://app.restockrocket.io'
const SETTINGS_CACHE_DURATION = 15 *
- default locale from base fields
if (window._RestockRocketConfig.normalizedLocale &&
!Object.prototype.hasOwnProperty.call(settings.translations, window._RestockRocketConfig.normalizedLocale)) {
console.debug('STOQ - locale not explicitly translated, will use default language from cache');
}
// Don't return null - continue using cache even for untranslated locales
}
const updatedAt = new Date(settings.updated_at);
if (isNaN(updatedAt.getTime())) {
console.debug('STOQ - Invalid updated_at date format in settings');
return null;
}
const age = Date.now() - updatedAt.getTime();
if (age SETTINGS_CACHE_DURATION) {
console.debug('STOQ - settings changed recently, skipping cache');
return null;
}
return settings;
} catch (error) {
console.debug('STOQ - Error checking settings cache:', error);
return null;
}
}
function createRestockRocketContainer() {
const resslations;
if (!normalizedLocale) {
// No matching locale has translations; drop payload to save memory
console.debug('STOQ - No matching locale for translations. Available:', Object.keys(translations || {}));
delete settings.translations;
return settings;
}
console.debug(`STOQ - Applying translations for normalized locale: ${normalizedLocale} (original: ${window._RestockRocketConfig.locale})`);
const translatedFields = translations[normalizedLocale];
if (translatedFields && typeof translatedFields === 'object') {
Object.keys(translatedFields).forEach(function(key) {
const value = translatedFields[key];
if (value !== null && value !== undefined && value !== '') {
settings[key] = value;
}
});
} else {
console.debug('STOQ - No translated fields found for locale:', normalizedLocale);
}
delete settings.translations;
return settings;
} catch (e) {
cons
- i/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);
window._RestockRocketConfig.settings = settings;
console.debug(`STOQ - settings configured for ${window._RestockRocketConfig.pageType}`);
if(settings.enable_ap_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}`);
}
// Check and update cart selling plans after scripts are loaded
if (settings.preorder_enabled) {
updateCartSellingPlans();
}
// Dispatch custom event when app is loaded
const appLoadedEvent = new CustomEvent('stoq:loaded', {
detail: {
pageType: window._RestockRocketConfig.pageType,
enabled: settings.enable_app,
settings: settings
}
});
console.debug('STOQ - dispatching app loaded event');
window<