input type="number" name="quantity" id="quantity--template--15326745395426__main" value="1" min="1">
Mineral Blue - Sold Out
Taupe - Sold Out
Brake Spares
Notify me when this product is available:
Quantity:
= '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 client clock ahead of server
if (liquidCacheAge
<
0) {
console.debug(`STOQ - Client clock appears ahead of server by ${Math.abs(Math.round(liquidCacheAge / 60))} minutes, assuming cache fresh`);
window._RestockRocketConfig.isLiquidCacheFresh = true;
} else if (liquidCacheAge Cleaners, Degreasers and Lubrication
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');Submit
= LIQUID_CACHE_MAX_AGE) {
console.debug(`STOQ - Liquid cache is fresh (${Math.round(liquidCacheAge / 60)} minutes old)`);
window._RestockRocketConfig.isLiquidCacheFresh = true;
} else {
console.debug(`STOQ - Liquid cache is stale (${Math.round(liquidCacheAge / 60)} minutes old, max ${Math.round(LIQUID_CACHE_MAX_AGE / 60)} minutes)`);
window._RestockRocketConfig.isLiquidCacheFresh = false;
}
}
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
<
Rear Suspension
age = Date.now() - updatedAt.getTime();
if (age
Components!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
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 || Accessories
&& 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
Decrease quantity];
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
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._RestockRocketCon
window.appBlockPlacements ||= [];
if (window.klarnaAppBlocksManager) {
window.klarnaAppBlocksManager.push({
productVariants: [{"id":56242334663039,"title":"Anthracite Grey","option1":"Anthracite Grey","option2":null,"option3":null,"sku":"PR20-AG-V2-UK","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"UTO Afternoon Pro20 Electric Bike - Anthracite Grey","public_title":"Anthracite Grey","options":["Anthracite Grey"],"price":299900,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]},{"id":56242334695807,"title":"Taupe Smoked","option1":"Taupe Smoked","option2":null,"option3":null,"sku":"PR20-TS-V2-UK","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"UTO Afternoon Pro20 Electric Bike - Taupe Smoked","public_title":"Taupe Smoked","options":["Taupe Smoked"],"price":299900,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]},{"id":56242334728575,"title":"Green","option1":"Green","option2":null,"option3":null,"sku":"PR20-SG-V2-UK","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"UTO Afternoon Pro20 Electric Bike - Green","public_title":"Green","options":["Green"],"price":299900,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]},{"id":56242334761343,"title":"Mineral Blue","option1":"Mineral Blue","option2":null,"option3":null,"sku":"PR20-MB-V2-UK","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"UTO Afternoon Pro20 Electric Bike - Mineral Blue","public_title":"Mineral Blue","options":["Mineral Blue"],"price":299900,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]}],
templateName: 'product',
dataKey: 'top-strip-promotion-badge',
storefrontCurrency: 'GBP',
storefrontCountry: 'GB',
storefrontLanguage: 'en',
shopLocale: 'en',
shopDomain: 'projektride.co.uk',
variantPrice: '299900',
cartPrice: '0',
selector: 'shopify-osm-ASUorQUNvQS9uckFQO__klarna_on_site_messaging_app_block_8gNReH',
topPadding: '0',
bottomPadding: '0',
});
} else {
window.appBlockPlacements.push({
productVariants: [{"id":56242334663039,"title":"Anthracite Grey","option1":"Anthracite Grey","option2":null,"option3":null,"sku":"PR20-AG-V2-UK","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"UTO Afternoon Pro20 Electric Bike - Anthracite Grey","public_title":"Anthracite Grey","options":["Anthracite Grey"],"price":299900,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]},{"id":56242334695807,"title":"Taupe Smoked","option1":"Taupe Smoked","option2":null,"option3":null,"sku":"PR20-TS-V2-UK","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"UTO Afternoon Pro20 Electric Bike - Taupe Smoked","public_title":"Taupe Smoked","options":["Taupe Smoked"],"price":299900,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]},{"id":56242334728575,"title":"Green","option1":"Green","option2":null,"option3":null,"sku":"PR20-SG-V2-UK","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"UTO Afternoon Pro20 Electric Bike - Green","public_title":"Green","options":["Green"],"price":299900,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]},{"id":56242334761343,"title":"Mineral Blue","option1":"Mineral Blue","option2":null,"option3":null,"sku":"PR20-MB-V2-UK","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"UTO Afternoon Pro20 Electric Bike - Mineral Blue","public_title":"Mineral Blue","options":["Mineral Blue"],"price":299900,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]}],
templateName: 'product',
shopLocale: 'en',
dataKey: 'top-strip-promotion-badge',
storefrontCurrency: 'GBP',
storefrontCountry: 'GB',
storefrontLanguage: 'en',
shopDomain: 'projektride.co.uk',
variantPrice: '299900',
cartPrice: '0',
selector: 'shopify-osm-ASUorQUNvQS9uckFQO__klarna_on_site_messaging_app_block_8gNReH',
topPadding: '0',
bottomPadding: '0',
});
}
The Pro Range see's the arrival of UTO's (Ex Eovolt) premium range of bikes. 18 months of in house research and development has resulted in a proprietary design featuring 39 design/spec improvements on previous models and 6 design patents.
label for="quantity--template--15326745395426__main">QuantitySell Your Bike
>
Frame & ForkTubesinput type="number" name="quantity" id="quantity--template--15326745395426__main" value="1" min="1">
Automatic Gearbox
Sold OutFinanceTubeless
Notify me when this product is available:
The Bafang rear hub motor features an automatic gearbox giving you the right gear exactly when you need it without you the rider having to give it a seconds thought. Just unfold your bike, turn the pedals and let the bike change your gear for you. The drive is delivered through a gates belt drive so no oily chain or complicated maintenance.Saddles
Both Litemove lights are now powered by the battery and feature automatic dusk turn on. When the light drops or you enter a tunnel the lights now turn on automatically..
Clothing
Product Details
Integrated Phone MountE-bike Batteries and chargers The Pro Range see's the arrival of UTO's (Ex Eovolt) premium range of bikes. 18 months of in house research and development has resulted in a proprietary design featuring 39 design/spec improvements on previous models and 6 design patents.
WheelsWheelsFrame & Fork
See More
EssentialsAll wheels are now made in UTO's (Ex Eovolt) own factory using extruded rims made in France. This process has made the wheels significantly lighter with a saving of 200gms per wheel.
The Pro16 features a carbon fork as part of the weight saving process.
Automatic Gearbox
Open search barCleaners, Degreasers and LubricationAll cables are integrated for clean look of the bike.
The Bafang rear hub motor features an automatic gearbox giving you the right gear exactly when you need it without you the rider having to give it a seconds thought. Just unfold your bike, turn the pedals and let the bike change your gear for you. The drive is delivered through a gates belt drive so no oily chain or complicated maintenance.
Thru Axle dropouts for ease of removing wheel and clean look of the frame and fork
TubelessEnigma
Accessories
New Seat Post Battery
New own design folding pedals with non slip surface for better grip
Tools & Maintenance
The new cleverly designed centre kick stand has a number of benefits. Firstly its hidden away under the bike which keeps the premium look of the bike and secondly which is the most important, the battery is no longer needed for the bike to stand in its folded position. This results in the bike being significantly lighter when lifting the folded bike without the battery into your car or motorhome.ProjektRide MerchandisePedalsSurly
Sell Your BikeWeight - 21kg
Lights
Close search bar
ntegrated Phone MountGloves
Early Rider
FinanceFrame & Fork - Aluminium Smooth Welding's - Internal Routing
The newly designed pro cockpit has an integrated SP Connect mount. Just buy the SP Connect phone case for your phone to easily and securely attach your phone to your handlebars. Particularly useful for navigating your journey using the phone mapping system of your choice
Log inTyres - Schwalbe Big Apple 20 x 2.15 - Super Defence 6 Layer Puncture Protection
ClothingComponents
Questions and answers
Schwalbe Pick Up Tyres with 6 layer puncture protection
Other
New fold and go locking bracket design taken from the pro rangeI'm looking to find out more information about a product, where can I find this?
Early RiderCustom Builds
We Give You ExtraPlease get in touch with a member of the team either by phone (
[email protected]Second-Hand Bikes
Specifications) where on of the team will be more than happy to help.
Insure Your Bike
ProjektRide Bike Shop EdinburghShop All Second-Hand
I'm looking to buy this product, when will it arrive and how much does postage cost?Max Rider Weight - 130kg
Custom BuildsParts & Components
Gears - 7 Speed
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.
Custom Builds for sale
ProjektRide Bike Shop EdinburghCustom Build Inspiration Folded Dimensions 85 x 73 x 46 cm