return null;
}
// Translations object exists in metafield - cache is valid
// If current locale isn't translated, applyTranslations will gracefully use 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 restockRocketContainer = document.createElement('div');
restockRocketContainer.id = 'restock-rocket';
document.body.appendChild(restockRocketContainer);
}
function createRestockRocketScript(scriptUrl) {
const restockRocketScriptElement = document.createElement('script');
restockRocketScriptElement.setAttribute('defer', 'defer');
restockRocketScriptElement.src = scriptUrl;
document.body.appendChild(restockRocketScriptElement);
}
createRestockRocketContainer()
console.debug('STOQ - extension activated')
function applyTranslations(settings) {
try {
// Skip translation logic entirely if multi-language is not enabled
if (!settings ||
];
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) {
console.debug('STOQ - error applying translations:', e);
return settings;
}
}
// Setup event listener for cart selling plan updates
// This must be called before any scripts are loaded to avoid race conditions
function setupCartSellingPlanUpdater(settings) {
// Setup listener regardless - updateCartSellingPlans has its own guards
// This ensures cleanup happens even when preorders are disabled globally
// Listen for stoq:inventory-data-loaded event dispatched by api.js
window.addEventListener('stoq:inventory-data-loaded', function(event) {
console.debug('STOQ - Inventory data loaded, updating cart selling plans');
if (window._RestockRocket
hopify.shop,
'ngrok-skip-browser-warning': 'skip'
};
if (window.Shopify?.theme?.role === 'main') {
headers['X-Shopify-Theme-Schema-Name'] = window.Shopify.theme.schema_name;
headers['X-Shopify-Theme-Schema-Version'] = window.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(cac{"id":15347622052223,"title":"UTO Afternoon OG20 Electric Bike","handle":"uto-afternoon-og20-electric-bike","description":"\u003cp\u003eThe UTO Afternoon OG20 is the perfect bike for the daily commute and the wide tyres also allow you to easily navigate canal tow paths and other off road surfaces.\u003c\/p\u003e\n\u003cp\u003eWe listened to our customers who universally asked for a lighter weight from our popular 20” folder.. The 2024 edition features a huge weight saving of 2.1kgs making it easier to lift when combining with other modes of transport.\u003c\/p\u003e\n\u003cp\u003eThe below is for the standard colours of Onyx Black , Sage Green \u0026amp; Ocean Blue.\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eVINTAGE colour is Satin Blue\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cp\u003eThe Afternoon is so solid that its less a folding ebike and more an ebike that folds. It rides like a solid frame ebike but then you have the extra functionality of folding for storage or combining with other modes of transport.\u003c\/p\u003e\n\u003cp\u003eThe frame has zero flex when riding and the new own design folding cockpit offers extra rigidity.\u003c\/p\u003e\n\u003cp\u003eThe UTO OG20 now utilises a more intuitive torque sensor which results in a much improved ride feel. Torque sensors deliver the assistance based on the pressure being put through the pedals so the system only gives you full motor assistance when you actually need it which also delivers improved battery efficiency particularly on flatter rides.\u003c\/p\u003e\n\u003cp\u003eIdeal for families, commuters, campers, boat owners or simply for city dwellers who want a practical electric bike for getting effortlessly around town. The larger frame, 20\" wheels with wide tyres along with a range of 60-80km makes the Afternoon the folding adventure bike you have been waiting for. The Afternoon is equally at home off road on bridleways and canal towpaths as it is on the road.\u003c\/p\u003e\n\u003cp\u003ePlease note that it should only be ridden on flat dry good quality off road surfaces, the bike is not suitable for very wet muddy, uneven or rough terrain. Attach your bags to your rear pannier rack and you’re ready to explore over longer distances.\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eUTO Upgrades\u003c\/strong\u003e\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eShimano MT-100 Hydraulic Disc Brakes\u003c\/li\u003e\n\u003cli\u003eSchwalbe Pick Up Tyres with 6 layer puncture protection\u003c\/li\u003e\n\u003cli\u003eNew central folding locking arm with one step locking mechanism.\u003c\/li\u003e\n\u003cli\u003eNew fold and go locking bracket design taken from the pro range\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cp\u003e\u003cstrong\u003eWe Give You Extra\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003eThe UTO OG20 comes with rear pannier rack as standard. Your UTO bike also comes with a battery anti theft security seat post QR clamp\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eSpecifications\u003c\/strong\u003e\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eBike Weight - 20.9kg\u003c\/li\u003e\n\u003cli\u003eMax Rider Weight - 130kg\u003c\/li\u003e\n\u003cli\u003eGears - 7 Speed\u003c\/li\u003e\n\u003cli\u003eDimensions -160 x 115 cm\u003c\/li\u003e\n\u003cli\u003eFolded Dimensions 85 x 73 x 46 cm\u003c\/li\u003e\n\u003cli\u003eFrame – Hand polished welds - Aluminium 6061\u003c\/li\u003e\n\u003cli\u003eFork – Aluminium 6061\u003c\/li\u003e\n\u003cli\u003eWheels - 20\" aluminium rims\u003c\/li\u003e\n\u003cli\u003eSpokes - 13 grams 36 holes\u003c\/li\u003e\n\u003cli\u003eTyres - SCHWALBE ® Big Apple 20”x2.35”\u003c\/li\u003e\n\u003cli\u003eBrakes – Shimano MT200 Hydraulic Disc Brakes\u003c\/li\u003e\n\u003cli\u003eChain - KMC\u003c\/li\u003e\n\u003cli\u003ePremium Motor - 36V 250W Brushless\u003c\/li\u003e\n\u003cli\u003eMax Torque - 40NM\u003c\/li\u003e\n\u003cli\u003eMax speed - 25 km\/h - 15.5mph\u003c\/li\u003e\n\u003cli\u003eMotor location - Rear wheel\u003c\/li\u003e\n\u003cli\u003eAssistance - 5 levels\u003c\/li\u003e\n\u003cli\u003eBattery - SAMSUNG Lithium\u003c\/li\u003e\n\u003cli\u003eBattery Capacity - 36V – 10.5 Ah - 378wh\u003c\/li\u003e\n\u003cli\u003eBattery Position - Seat Post (removable)\u003c\/li\u003e\n\u003cli\u003eMax Charging time - 4-5 hrs\u003c\/li\u003e\n\u003cli\u003eRange - 60-80 km\u003c\/li\u003e\n\u003c\/ul\u003e","published_at":"2025-10-21T11:20:45+01:00","created_at":"2025-10-21T11:20:43+01:00","vendor":"Eovolt","type":"Bicycles","tags":["Eovolt","spo-cs-disabled","spo-default","spo-disabled","spo-notify-me-disabled","UTO"],"price":219900,"price_min":219900,"price_max":219900,"available":false,"price_varies":false,"compare_at_price":null,"compare_at_price_min":0,"compare_at_price_max":0,"compare_at_price_varies":false,"variants":[{"id":56257240105343,"title":"Onyx Black","option1":"Onyx Black","option2":null,"option3":null,"sku":null,"requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"UTO Afternoon OG20 Electric Bike - Onyx Black","public_title":"Onyx Black","options":["Onyx Black"],"price":219900,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]},{"id":56257240138111,"title":"Desert Sand","option1":"Desert Sand","option2":null,"option3":null,"sku":null,"requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"UTO Afternoon OG20 Electric Bike - Desert Sand","public_title":"Desert Sand","options":["Desert Sand"],"price":219900,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]},{"id":56257240170879,"title":"Sage Green","option1":"Sage Green","option2":null,"option3":null,"sku":null,"requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"UTO Afternoon OG20 Electric Bike - Sage Green","public_title":"Sage Green","options":["Sage Green"],"price":219900,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]},{"id":56257240203647,"title":"Ocean Blue","option1":"Ocean Blue","option2":null,"option3":null,"sku":null,"requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"UTO Afternoon OG20 Electric Bike - Ocean Blue","public_title":"Ocean Blue","options":["Ocean Blue"],"price":219900,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]},{"id":56257240236415,"title":"Satin Blue","option1":"Satin Blue","option2":null,"option3":null,"sku":null,"requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"UTO Afternoon OG20 Electric Bike - Satin Blue","public_title":"Satin Blue","options":["Satin Blue"],"price":219900,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]}],"images":["\/\/projektride.co.uk\/cdn\/shop\/files\/20-Origins-V4-OPEN-BIKE-ouvert13012_600x375_54940ed8-e875-48e0-965e-18020b360283.png?v=1761038717","\/\/projektride.co.uk\/cdn\/shop\/files\/20-Origins-V4-OPEN-BIKE-ouvert13013_600x375_fa62db70-7fb3-4c37-b392-b41e7534dd95.png?v=1761038721","\/\/projektride.co.uk\/cdn\/shop\/files\/20-Origins-V4-OPEN-BIKE-ouvert13014_1200x750_8b605f43-2846-464e-a74d-5761d89a3b2a.png?v=1761038727","\/\/projektride.co.uk\/cdn\/shop\/files\/20-Origins-V4-OPEN-BIKE-ouvert13011_600x375_d1d0e747-1ef6-43b5-8495-d13843d0b2a1.png?v=1761038729","\/\/projektride.co.uk\/cdn\/shop\/files\/20-Origins-V4-OPEN-BIKE-ouvert1296_1200x750_001c35ec-7e6a-4dd6-9758-9da5ba0fb2a2.png?v=1761038733"],"featured_image":"\/\/projektride.co.uk\/cdn\/shop\/files\/20-Origins-V4-OPEN-BIKE-ouvert13012_600x375_54940ed8-e875-48e0-965e-18020b360283.png?v=1761038717","options":["Colour"],"media":[{"alt":null,"id":68253134750079,"position":1,"preview_image":{"aspect_ratio":1.6,"height":375,"width":600,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/20-Origins-V4-OPEN-BIKE-ouvert13012_600x375_54940ed8-e875-48e0-965e-18020b360283.png?v=1761038717"},"aspect_ratio":1.6,"height":375,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/20-Origins-V4-OPEN-BIKE-ouvert13012_600x375_54940ed8-e875-48e0-965e-18020b360283.png?v=1761038717","width":600},{"alt":null,"id":68253134979455,"position":2,"preview_image":{"aspect_ratio":1.6,"height":375,"width":600,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/20-Origins-V4-OPEN-BIKE-ouvert13013_600x375_fa62db70-7fb3-4c37-b392-b41e7534dd95.png?v=1761038721"},"aspect_ratio":1.6,"height":375,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/20-Origins-V4-OPEN-BIKE-ouvert13013_600x375_fa62db70-7fb3-4c37-b392-b41e7534dd95.png?v=1761038721","width":600},{"alt":null,"id":68253136912767,"position":3,"preview_image":{"aspect_ratio":1.6,"height":750,"width":1200,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/20-Origins-V4-OPEN-BIKE-ouvert13014_1200x750_8b605f43-2846-464e-a74d-5761d89a3b2a.png?v=1761038727"},"aspect_ratio":1.6,"height":750,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/20-Origins-V4-OPEN-BIKE-ouvert13014_1200x750_8b605f43-2846-464e-a74d-5761d89a3b2a.png?v=1761038727","width":1200},{"alt":null,"id":68253137666431,"position":4,"preview_image":{"aspect_ratio":1.6,"height":375,"width":600,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/20-Origins-V4-OPEN-BIKE-ouvert13011_600x375_d1d0e747-1ef6-43b5-8495-d13843d0b2a1.png?v=1761038729"},"aspect_ratio":1.6,"height":375,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/20-Origins-V4-OPEN-BIKE-ouvert13011_600x375_d1d0e747-1ef6-43b5-8495-d13843d0b2a1.png?v=1761038729","width":600},{"alt":null,"id":68253138682239,"position":5,"preview_image":{"aspect_ratio":1.6,"height":750,"width":1200,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/20-Origins-V4-OPEN-BIKE-ouvert1296_1200x750_001c35ec-7e6a-4dd6-9758-9da5ba0fb2a2.png?v=1761038733"},"aspect_ratio":1.6,"height":750,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/20-Origins-V4-OPEN-BIKE-ouvert1296_1200x750_001c35ec-7e6a-4dd6-9758-9da5ba0fb2a2.png?v=1761038733","width":1200}],"requires_selling_plan":false,"selling_plan_groups":[],"content":"\u003cp\u003eThe UTO Afternoon OG20 is the perfect bike for the daily commute and the wide tyres also allow you to easily navigate canal tow paths and other off road surfaces.\u003c\/p\u003e\n\u003cp\u003eWe listened to our customers who universally asked for a lighter weight from our popular 20” folder.. The 2024 edition features a huge weight saving of 2.1kgs making it easier to lift when combining with other modes of transport.\u003c\/p\u003e\n\u003cp\u003eThe below is for the standard colours of Onyx Black , Sage Green \u0026amp; Ocean Blue.\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eVINTAGE colour is Satin Blue\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cp\u003eThe Afternoon is so solid that its less a folding ebike and more an ebike that folds. It rides like a solid frame ebike but then you have the extra functionality of folding for storage or combining with other modes of transport.\u003c\/p\u003e\n\u003cp\u003eThe frame has zero flex when riding and the new own design folding cockpit offers extra rigidity.\u003c\/p\u003e\n\u003cp\u003eThe UTO OG20 now utilises a more intuitive torque sensor which results in a much improved ride feel. Torque sensors deliver the assistance based on the pressure being put through the pedals so the system only gives you full motor assistance when you actually need it which also delivers improved battery efficiency particularly on flatter rides.\u003c\/p\u003e\n\u003cp\u003eIdeal for families, commuters, campers, boat owners or simply for city dwellers who want a practical electric bike for getting effortlessly around town. The larger frame, 20\" wheels with wide tyres along with a range of 60-80km makes the Afternoon the folding adventure bike you have been waiting for. The Afternoon is equally at home off road on bridleways and canal towpaths as it is on the road.\u003c\/p\u003e\n\u003cp\u003ePlease note that it should only be ridden on flat dry good quality off road surfaces, the bike is not suitable for very wet muddy, uneven or rough terrain. Attach your bags to your rear pannier rack and you’re ready to explore over longer distances.\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eUTO Upgrades\u003c\/strong\u003e\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eShimano MT-100 Hydraulic Disc Brakes\u003c\/li\u003e\n\u003cli\u003eSchwalbe Pick Up Tyres with 6 layer puncture protection\u003c\/li\u003e\n\u003cli\u003eNew central folding locking arm with one step locking mechanism.\u003c\/li\u003e\n\u003cli\u003eNew fold and go locking bracket design taken from the pro range\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cp\u003e\u003cstrong\u003eWe Give You Extra\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003eThe UTO OG20 comes with rear pannier rack as standard. Your UTO bike also comes with a battery anti theft security seat post QR clamp\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eSpecifications\u003c\/strong\u003e\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eBike Weight - 20.9kg\u003c\/li\u003e\n\u003cli\u003eMax Rider Weight - 130kg\u003c\/li\u003e\n\u003cli\u003eGears - 7 Speed\u003c\/li\u003e\n\u003cli\u003eDimensions -160 x 115 cm\u003c\/li\u003e\n\u003cli\u003eFolded Dimensions 85 x 73 x 46 cm\u003c\/li\u003e\n\u003cli\u003eFrame – Hand polished welds - Aluminium 6061\u003c\/li\u003e\n\u003cli\u003eFork – Aluminium 6061\u003c\/li\u003e\n\u003cli\u003eWheels - 20\" aluminium rims\u003c\/li\u003e\n\u003cli\u003eSpokes - 13 grams 36 holes\u003c\/li\u003e\n\u003cli\u003eTyres - SCHWALBE ® Big Apple 20”x2.35”\u003c\/li\u003e\n\u003cli\u003eBrakes – Shimano MT200 Hydraulic Disc Brakes\u003c\/li\u003e\n\u003cli\u003eChain - KMC\u003c\/li\u003e\n\u003cli\u003ePremium Motor - 36V 250W Brushless\u003c\/li\u003e\n\u003cli\u003eMax Torque - 40NM\u003c\/li\u003e\n\u003cli\u003eMax speed - 25 km\/h - 15.5mph\u003c\/li\u003e\n\u003cli\u003eMotor location - Rear wheel\u003c\/li\u003e\n\u003cli\u003eAssistance - 5 levels\u003c\/li\u003e\n\u003cli\u003eBattery - SAMSUNG Lithium\u003c\/li\u003e\n\u003cli\u003eBattery Capacity - 36V – 10.5 Ah - 378wh\u003c\/li\u003e\n\u003cli\u003eBattery Position - Seat Post (removable)\u003c\/li\u003e\n\u003cli\u003eMax Charging time - 4-5 hrs\u003c\/li\u003e\n\u003cli\u003eRange - 60-80 km\u003c\/li\u003e\n\u003c\/ul\u003e"}
{
"@context": "http://schema.org/",
"@type": "Product",
"name": "UTO Afternoon OG20 Electric Bike",
"url": "https:\/\/projektride.co.uk\/products\/uto-afternoon-og20-electric-bike","image": [
"https:\/\/projektride.co.uk\/cdn\/shop\/files\/20-Origins-V4-OPEN-BIKE-ouvert13012_600x375_54940ed8-e875-48e0-965e-18020b360283_600x.png?v=1761038717"
],"description": "The UTO Afternoon OG20 is the perfect bike for the daily commute and the wide tyres also allow you to easily navigate canal tow paths and other off road surfaces.\nWe listened to our customers who universally asked for a lighter weight from our popular 20” folder.. The 2024 edition features a huge weight saving of 2.1kgs making it easier to lift when combining with other modes of transport.\nThe below is for the standard colours of Onyx Black , Sage Green \u0026amp; Ocean Blue.\n\nVINTAGE colour is Satin Blue\n\nThe Afternoon is so solid that its less a folding ebike and more an ebike that folds. It rides like a solid frame ebike but then you have the extra functionality of folding for storage or combining with other modes of transport.\nThe frame has zero flex when riding and the new own design folding cockpit offers extra rigidity.\nThe UTO OG20 now utilises a more intuitive torque sensor which results in a much improved ride feel. Torque sensors deliver the assistance based on the pressure being put through the pedals so the system only gives you full motor assistance when you actually need it which also delivers improved battery efficiency particularly on flatter rides.\nIdeal for families, commuters, campers, boat owners or simply for city dwellers who want a practical electric bike for getting effortlessly around town. The larger frame, 20\" wheels with wide tyres along with a range of 60-80km makes the Afternoon the folding adventure bike you have been waiting for. The Afternoon is equally at home off road on bridleways and canal towpaths as it is on the road.\nPlease note that it should only be ridden on flat dry good quality off road surfaces, the bike is not suitable for very wet muddy, uneven or rough terrain. Attach your bags to your rear pannier rack and you’re ready to explore over longer distances.\nUTO Upgrades\n\nShimano MT-100 Hydraulic Disc Brakes\nSchwalbe Pick Up Tyres with 6 layer puncture protection\nNew central folding locking arm with one step locking mechanism.\nNew fold and go locking bracket design taken from the pro range\n\nWe Give You Extra\nThe UTO OG20 comes with rear pannier rack as standard. Your UTO bike also comes with a battery anti theft security seat post QR clamp\nSpecifications\n\nBike Weight - 20.9kg\nMax Rider Weight - 130kg\nGears - 7 Speed\nDimensions -160 x 115 cm\nFolded Dimensions 85 x 73 x 46 cm\nFrame – Hand polished welds - Aluminium 6061\nFork – Aluminium 6061\nWheels - 20\" aluminium rims\nSpokes - 13 grams 36 holes\nTyres - SCHWALBE ® Big Apple 20”x2.35”\nBrakes – Shimano MT200 Hydraulic Disc Brakes\nChain - KMC\nPremium Motor - 36V 250W Brushless\nMax Torque - 40NM\nMax speed - 25 km\/h - 15.5mph\nMotor location - Rear wheel\nAssistance - 5 levels\nBattery - SAMSUNG Lithium\nBattery Capacity - 36V – 10.5 Ah - 378wh\nBattery Position - Seat Post (removable)\nMax Charging time - 4-5 hrs\nRange - 60-80 km\n","brand": {
"@type": "Thing",
"name": "Eovolt"
},"gtin8": "","offers": [{
"@type" : "Offer","availability" : "http://schema.org/OutOfStock",
"price" : 2199.0,
"priceCurrency" : "GBP",
"url" : "https:\/\/projektride.co.uk\/products\/uto-afternoon-og20-electric-bike?variant=56257240105343"
},
{
"@type" : "Offer","availability" : "http://schema.org/OutOfStock",
"price" : 2199.0,
"priceCurrency" : "GBP",
"url" : "https:\/\/projektride.co.uk\/products\/uto-afternoon-og20-electric-bike?variant=56257240138111"
},
{
"@type" : "Offer","availability" : "http://schema.org/OutOfStock",
"price" : 2199.0,
"priceCurrency" : "GBP",
"url" : "https:\/\/projektride.co.uk\/products\/uto-afternoon-og20-electric-bike?variant=56257240170879"
},
{
"@type" : "Offer","availability" : "http://schema.org/OutOfStock",
"price" : 2199.0,
"priceCurrency" : "GBP",
"url" : "https:\/\/projektride.co.uk\/products\/uto-afternoon-og20-electric-bike?variant=56257240203647"
},
{
"@type" : "Offer","availability" : "http://schema.org/OutOfStock",
"price" : 2199.0,
"priceCurrency" : "GBP",
"url" : "https:\/\/projektride.co.uk\/products\/uto-afternoon-og20-electric-bike?variant=56257240236415"
}
]
}
a class="product__media product__media--featured"
href="/products/hire-bike-packing-bundle"
title="HIRE - BIKE PACKING BUNDLE"
aria-label="HIRE - BIKE PACKING BUNDLE"
style="background-image: url(//projektride.co.uk/cdn/shop/files/Yourparagraphtext_600x.png?v=1747481130)">
span class="visually-hidden">HIRE - BIKE PACKING BUNDLE
div class="product__media-hover-img product__media" style="background-image: url(//projektride.co.uk/cdn/shop/files/resize_width_1000_1296x_d1ffd242-63bc-4a9f-85e2-400f274532d7_600x.jpg?v=1747481423)">>
to qualify for free shippingCongratulations! Your order qualifies for free shipping
Open navigation menu
Open search bar
d 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 null;
}
// Translations object exists in metafield - cache is valid
// If current locale isn't translated, applyTranslations will gracefully use 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(settin
<!settings.multi_language_enabled) {
return settings;
}
if (!settings.translations) {
console.debug('STOQ - No translations found, skipping translation');
return settings;
}
const normalizedLocale = window._RestockRocketConfig.normalizedLocale;
const translations = settings.translations;
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 && window._RestockRocket.updateCartSellingPlans) {
window._RestockRocket.updateCartSellingPlans()
.then(hasUpdates => {
if (hasUpdates) {
console.debug('STOQ - cart selling plans updated successfully');
} else {
console.debug('STOQ - no cart selling plan updates needed');
}
})
.catch(error => {
console.error('STOQ - error updating cart selling plans:', error);
});
}
});
}
// First try to get settings from metafields with expiry check
const cachedSettings = window._RestockRocketConfig.cachedSettings;
const validCachedSettings = cachedSettings ? checkSettingsExpiry(cachedSettings) : null;
if (validCachedSettings) {
console.debug('STOQ - using cached settings');
initializeScripts(validCachedSettings);
} else {
console.debug('STOQ - fetching fresh settings');
const headers = {
'X-Shopify-Shop-Domain': window._RestockRocketConfig.shop || window.S
hedSettings);
} 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}`);
// Setup cart selling plan updater BEFORE loading any scripts to avoid race conditions
setupCartSellingPlanUpdater(settings);
if(settings.enable_app) {
const hijackIntegration = window._RestockRocketConfig.integrations.find(function(integration) {
return integration.type === 'hijack' && integration.enabled && integration.page_types.includes(window._RestockRocketConfig.pageType);
})
if(window._RestockRocketConfig.pageType === 'collection' && (settings.show_button_on_collection || settings.preorder_collection_enabled)) {
createRestockRocketScript(window._RestockRocketConled for ${window._RestockRocketConfig.pageType}`);
}
// Dispatch custom event when app is loaded
// Cart selling plan updates will be triggered by stoq:inventory-data-loaded event
const appLoadedEvent = new CustomEvent('stoq:loaded', {
detail: {
pageType: window._RestockRocketConfig.pageType,
enabled: settings.enable_app,
settings: settings,
preorderEnabled: settings.preorder_enabled
}
});
console.debug('STOQ - dispatching app loaded event');
window.dispatchEvent(appLoadedEvent);
}
}
<a class="product__media product__media--featured"
href="/collections/all-products/products/hire-bike-packing-bundle"
title="HIRE - BIKE PACKING BUNDLE"
aria-label="HIRE - BIKE PACKING BUNDLE"
style="background-image: url(//projektride.co.uk/cdn/shop/files/Yourparagraphtext_600x.png?v=1747481130)">
<span class="visually-hidden">HIRE - BIKE PACKING BUNDLEMaintenance<>
<>
Sell Your Bike
div class="product__media-hover-img product__media" style="background-image: url(//projektride.co.uk/cdn/shop/files/resize_width_1000_1296x_d1ffd242-63bc-4a9f-85e2-400f274532d7_600x.jpg?v=1747481423)">
<>
<
Contact Us
£0.00Log in<
<
Create account
Search
) or email (
If the item is showing in stock, we aim to post the product within 24 hours. Please allow 5 working days to receive the item. New Bikes
We also have a physical store, if you are local please pop in -Shop All New Bikes
ProjektRide Bike Shop Edinburgh
82 Newington Road, EH91QN, Edinburgh.
Building Your Bike From the BoxShop by Brand
Insure Your Bike
Privacy PolicyGloriaDecrease quantity
Cookie Policy
TrekRefund policy
Increase quantity
Rear Suspension
rge_type":"percentage","billing_checkout_charge_amount":null,"billing_checkout_charge_percentage":"100.0","billing_at":"2025-07-26T09:20:38.472Z","billing_after_n_intervals":7,"billing_after_interval_type":"day","pricing_type":"no_discount","pricing_amount":null,"pricing_percentage":null,"billing_title":"Full payment","billing_description":null,"discount_text":"Save {{ discount }}","shopify_selling_plan_id":713071886719,"is_default":true,"type":"full","translations":{}}],"require_preorder_acknowledgement":false,"preorder_acknowledgement_text":"I acknowledge and agree to the preorder terms and conditions for this product.","disable_button_until_acknowledged":false,"preorder_min_quantity":null,"preorder_max_quantity":null,"countdown_timer_enabled":false,"countdown_timer_style":"text","countdown_timer_text_color":"#000000","countdown_timer_background_color":"#f5f5f5","countdown_timer_border_radius":8,"countdown_timer_format":"DHMS","countdown_timer_use_schedule_dates":true,"countdown_timer_custom_start_date":nul
dow._RestockRocketConfig.sellingPlans;
const maxUpdatedAt = Array.isArray(oldPlans) && oldPlans.length > 0
? oldPlans.reduce(function(max, plan) {
// Parse dates for proper comparison (handles mixed ISO formats)
if (plan.updated_at) {
const planDate = new Date(plan.updated_at);
const maxDate = max ? new Date(max) : null;
return (!maxDate || (planDate && !isNaN(planDate) && planDate > maxDate)) ? plan.updated_at : max;
}
return max;
}, '')
: null;
// Use cached if old array is empty/has no timestamps, or cached is newer
// Parse dates for comparison to handle format differences (+00:00 vs .000Z)
const cachedDate = new Date(cachedData.cached_at);
const maxDate = maxUpdatedAt ? new Date(maxUpdatedAt) : null;
const useCached = !maxUpdatedAt || (cachedDate && !isNaN(cachedDate) && (!maxDate || cachedDate > maxDate));
if (us
t","enableXHRHijack":true,"enableFetchHijack":true,"quantityLimitDisabled":false},"type":"hijack","css_config":null,"js_config":null,"created_at":"2025-07-26T09:16:04.076Z","updated_at":"2025-07-26T09:16:04.076Z"}];window._RestockRocketConfig.obfuscateInventoryQuantity = false;window._RestockRocketConfig.product = {"id":7941830803682,"title":"BR-M8120\/BL-M8100 XT 4 pot bled brake lever\/post mount calliper I-Spec EV","handle":"br-m8120-bl-m8100-xt-4-pot-bled-brake-lever-post-mount-calliper-i-spec-ev","description":"\u003cmeta charset=\"utf-8\"\u003e\n\u003cul class=\"description-overview\" data-mce-fragment=\"1\"\u003e\n\u003cli data-mce-fragment=\"1\"\u003ePowerful fully bled XT 4 pot hydraulic Servo Wave disc brake for more aggressive riding styles\u003c\/li\u003e\n\u003cli data-mce-fragment=\"1\"\u003eFully bled lever and calliper comes without adapters or rotors giving you the freedom to customise to suit your bike\u003c\/li\u003e\n\u003cli data-mce-fragment=\"1\"\u003eshort stroke Servo-Wave mechanism f
u003e\n\u003cli data-mce-fragment=\"1\"\u003ebrake lever featuring reach and free stroke adjustment\u003c\/li\u003e\n\u003cli data-mce-fragment=\"1\"\u003eHinged clamp for quick installation\u003c\/li\u003e\n\u003cli data-mce-fragment=\"1\"\u003eI-spec-EV compatible\u003c\/li\u003e\n\u003cli data-mce-fragment=\"1\"\u003eThe kit also contains sintered pads, plus spare olives and insert should you wish to adjust the length of the cuttable hoses\u003c\/li\u003e\n\u003c\/ul\u003e","published_at":"2022-11-06T17:27:08+00:00","created_at":"2022-11-06T17:27:06+00:00","vendor":"ProjektRide","type":"","tags":["COMPLETE BRAKES","spo-cs-disabled","spo-default","spo-disabled","spo-notify-me-disabled"],"price":19900,"price_min":19900,"price_max":19900,"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":43590980075746,"title":"Left (Rear)","option1":"Left (Rear)","option2":null,"option3":null,"sku":"M8120BLR","requiprojektride.co.uk\/cdn\/shop\/products\/Screenshot2022-11-06at17.25.31.png?v=1667755629","options":["Option"],"media":[{"alt":null,"id":31106443247842,"position":1,"preview_image":{"aspect_ratio":1.018,"height":1126,"width":1146,"src":"\/\/projektride.co.uk\/cdn\/shop\/products\/Screenshot2022-11-06at17.25.31.png?v=1667755629"},"aspect_ratio":1.018,"height":1126,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/products\/Screenshot2022-11-06at17.25.31.png?v=1667755629","width":1146}],"requires_selling_plan":false,"selling_plan_groups":[],"content":"\u003cmeta charset=\"utf-8\"\u003e\n\u003cul class=\"description-overview\" data-mce-fragment=\"1\"\u003e\n\u003cli data-mce-fragment=\"1\"\u003ePowerful fully bled XT 4 pot hydraulic Servo Wave disc brake for more aggressive riding styles\u003c\/li\u003e\n\u003cli data-mce-fragment=\"1\"\u003eFully bled lever and calliper comes without adapters or rotors giving you the freedom to customise to suit your bike\u003c\/li\u003e\n\u003cli data-mce-fragment=\
system allows for quick setting up\u003c\/li\u003e\n\u003cli data-mce-fragment=\"1\"\u003ebrake lever featuring reach and free stroke adjustment\u003c\/li\u003e\n\u003cli data-mce-fragment=\"1\"\u003eHinged clamp for quick installation\u003c\/li\u003e\n\u003cli data-mce-fragment=\"1\"\u003eI-spec-EV compatible\u003c\/li\u003e\n\u003cli data-mce-fragment=\"1\"\u003eThe kit also contains sintered pads, plus spare olives and insert should you wish to adjust the length of the cuttable hoses\u003c\/li\u003e\n\u003c\/ul\u003e"};
window._RestockRocketConfig.variantsInventoryPolicy = {43590980075746 : "continue",43590980108514 : "deny",};
window._RestockRocketConfig.variantsInventoryQuantity = {43590980075746 : parseInt("1"),43590980108514 : parseInt("1"),};
window._RestockRocketConfig.variantsPreorderCount = {43590980075746 : parseInt(""),43590980108514 : parseInt(""),};
window._RestockRocketConfig.variantsPreorderCountForMarket = {43590980075746 : null,43590980108514 : null,};
window._RestockRoc
-465/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 * 60 * 1000; // 15 minutes in milliseconds
const LIQUID_CACHE_MAX_AGE = 2 * 60 * 60; // 2 hours in seconds
// Calculate Liquid cache freshness once at initialization
const liquidRenderedAt = window._RestockRocketConfig.liquidRenderedAt;
// Validate timestamp and calculate cache age
if (!liquidRenderedAt || typeof liquidRenderedAt !== 'number' || isNaN(liquidRenderedAt)) {
console.debug('STOQ - Invalid or missing liquidRenderedAt timestamp, assuming fresh');
window._RestockRocketConfig.isLiquidCacheFresh = true;
} else {
const now = Math.floor(Date.now() / 1000); // Current time in seconds
const liquidCacheAge = now - liquidRenderedAt; // Age in seconds
// Handle cli
We Give You ExtraClothing and ProtectionContact Us
Blog
The UTO Morning OG16 comes with rear pannier rack as standard. Your UTO bike also comes with an anti theft security QR seat post clampProjektRide MerchandiseTrack Service ProgressBrother
];
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) {
console.debug('STOQ - error applying translations:', e);
return settings;
}
}
// Setup event listener for cart selling plan updates
// This must be called before any scripts are loaded to avoid race conditions
function setupCartSellingPlanUpdater(settings) {
// Setup listener regardless - updateCartSellingPlans has its own guards
// This ensures cleanup happens even when preorders are disabled globally
// Listen for stoq:inventory-data-loaded event dispatched by api.js
window.addEventListener('stoq:inventory-data-loaded', function(event) {
console.debug('STOQ - Inventory data loaded, updating cart selling plans');
if (window._RestockRocket
hopify.shop,
'ngrok-skip-browser-warning': 'skip'
};
if (window.Shopify?.theme?.role === 'main') {
headers['X-Shopify-Theme-Schema-Name'] = window.Shopify.theme.schema_name;
headers['X-Shopify-Theme-Schema-Version'] = window.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(cac