Â
Alloy
Shop by BrandSee More
GloriaTrek
Amflow Finishing Kit
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')
try {
const _stoqInitConfig = window._RestockRocketConfig;
const _stoqDetectedVariantIds = (_stoqInitConfig.product && Array.isArray(_stoqI
liquid_cache_age: _stoqInitConfig.liquidCacheAge,
inventory_policy: (_stoqInitConfig.variantsInventoryPolicy || {})[_stoqSelectedVariantId] || '',
inventory_quantity: (_stoqInitConfig.variantsInventoryQuantity || {})[_stoqSelectedVariantId],
});
} catch (e) {
console.debug('STOQ - stoq_initialized publish failed:', e);
}
try {
var _sqTrack = window._RestockRocketConfig;
if (_sqTrack.preordersConfigured) {
document.addEventListener('click', function (e) {
try {
var t = e.target;
if (!t || !t.closest) return;
var host = t.closest('.shopify-payment-button, shopify-payment-terms');
if (!host) return;
var channel = host.matches && host.matches('shopify-payment-terms')
? 'shop_pay_installments' : 'buy_now';
var form = host.closest('form');
var vidEl = form && form.querySelector('[name="id"]');
var variantId = (vidEl && vidEl.value) || _sqTrack.selected_variant_id || '';
Grips & Bar-Tape
FinanceTyres
Create account
Saddles
Cart
ProjektRide Merchandise
Clothing
See More
Cleaners, Degreasers and Lubrication
Accessories
Cart0 items
Sorry, looks like we don't have enough of this product.
Netherlands (EUR€)
See More
Spain (EUR€)
Skip to content
- Close
- Home Hire
- Bikes See More
- New Bikes
- See More
- Shop All New Bikes Road / Gravel / Touring Bikes
- Hybrid / City Bikes Mountain Bikes
- Electric Bikes
- Kids Bikes Frames
<
Track Your Service<
&
!Object.prototype.hasOwnProperty.call(settings.translations, window._RestockRocketConfig.normalizedLocale)) {
console.debug('STOQ - locale not explicitly translated, will use default language from cache');
}
}
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
See MoreOtherck.product.id) || '',
channel: channel,
market_id: _sqTrack.marketId || '',
country_code: _sqTrack.countryIsoCode || '',
page_type: _sqTrack.pageType || '',
cart_token: _sqTrack.cartToken || '',
page_url: (window.location && window.location.href) || '',
properties: {
is_preorder_variant: (function () {
var vid = Number(variantId);
var has = function (a) { return Array.isArray(a) && a.indexOf(vid) !== -1; };
return has(_sqTrack.preorderVariantIds) ||
has(_sqTrack.cachedPreorderVariantIds &&
_sqTrack.cachedPreorderVariantIds.preorder_variant_ids);
})(),
in_enabled_plan: !!_sqPlan,
is_instock_variant: (function () {
var has = function (a) { return Array.isArray(a) && a.indexOf(_sqVidNum) !== -1; };
return has(_sqTrack.inStockVariantIds) ||
h
html.stoq-buy-now-pending .shopify-payment-button{pointer-events:none!important}
;
} catch (err) { return false; }
})(),
},
});
} catch (err) { }
}, true);
}
} catch (e) { }
function applyTranslations(settings) {
try {
if (!settings || !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) {
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 (tra
Tubes
ration) {
createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection);
} else if(usePreorderBuild) {
createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection);
} else {
console.debug(`STOQ - no scripts enabled for ${pageType}`);
}
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);
}
}
See MoreQ - 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);
});
}
});
}
function storefrontGraphql(query, variables) {
const cfg = window._RestockRocketConfig;
if (!cfg.storefrontAccessToken || cfg.disableStorefrontApi === true) {
return Promise.reject(new Error('Storefront API unavailable'));
}
return fetch(
`https://${cfg.shop}/api/${cfg.storefrontApiVersion}/graphql.json`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Shopify-Storefront-Access-Token': cfg.storefrontAccessToken,
},
body: JSON.stringify({ query: query, variables: variables }),
}
)
.then(function(response) {
if (!response.ok) { throw new Error('Storefront API HTTP ' + response.sta
amespace, key: "settings") { value } translations: metafield(namespace: $namespace, key: "settings_translations") { value } } }';
return storefrontGraphql(query, { namespace: window._RestockRocketConfig.metafieldNamespace })
.then(function(data) {
const settings = JSON.parse(data.shop.settings.value);
if (!settings.updated_at) { throw new Error('settings metafield is not a settings payload'); }
if (settings.single_locale_translations_inline) {
settings.translations = data.shop.translations && JSON.parse(data.shop.translations.value);
}
if (settings.multi_language_enabled && !settings.translations) { throw new Error('settings metafield carries no translations'); }
return settings;
});
}
const cachedSettings = window._RestockRocketConfig.cachedSettings;
const validCachedSettings = cachedSettings ? checkSettingsExpiry(cachedSettings) : null;
if (validCachedSettings) {
console.debug('STOQ - using cached settings');
initializeScripts(validCacTyres
.then(function(settings) {
return settings || 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 (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 fetchEmbedConfig(endpoint, apply) {
return fetch(
`${window._RestockRocketConfig.host}/api/v1/embed/${endpoint}.json`,
{
headers: {
'X-Shopify-Shop-Domain': window._RestockRocke
row new Error(source.metafieldKey + ' metafield is not a valid ' + source.endpoint + ' payload'); }
source.apply(value);
console.debug('STOQ - refreshed ' + source.endpoint + ' from the Storefront API');
})
.catch(function(error) {
console.debug('STOQ - Storefront ' + source.endpoint + ' read failed, using embed:', error.message);
return viaEmbed();
});
}
function refreshIntegrations() {
const cfg = window._RestockRocketConfig;
return refreshShopConfig({
endpoint: 'integrations',
metafieldKey: 'integrations',
flag: 'enable_storefront_integrations_read',
isValid: function(value) { return Array.isArray(value); },
apply: function(data) {
cfg.integrations = data;
}
});
}
function refreshSellingPlans(embedOnly) {
const cfg = window._RestockRocketConfig;
return refreshShopConfig({
embedOnly: embedOnly === true,
endpoint: 'selling_plans',
metafieldKey: 'cachedSellingPlans',
Custom Buildsiquid cache stale)' : ' (force_embed_selling_plans)'));
const refreshes = [refreshSellingPlans(forceEmbedSellingPlans)];
if (staleRefresh) { refreshes.push(refreshIntegrations()); }
Promise.race([
Promise.all(refreshes),
new Promise(function(resolve) { setTimeout(resolve, 1000); })
]).then(function() { loadScripts(settings); });
return;
}
loadScripts(settings);
}
function loadScripts(settings) {
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);
})
const hasEnabledOffer = Array.isArray(window._RestockRocketConfig.sellingPlans)
&& window._RestockRocketConfig.sellingPlans.some(function(plan) { return plan && plan.enabled; });
const hasDisabledPlanIds = Array.isArra
Cycle To Work Schemes
Tubeless
Insure Your BikeSaddles
Seat Posts & ClampsBook a ServicePedals
Parts & Components
Gears & DrivetrainSee More
See More
Brands
HopeComponents
See More
E-bike Batteries and chargers
Wheels
Enve
See MoreSee More
CockpitComplete Wheels
Tubeless
Clothing and Protection
Handlebars
Tools & Maintenance
Stems
See More
Helmets
See More
Headsets
ProjektRide Merchandise
BrakesGloves
Complete BrakesClothing
Brake Rotors
Socks
Brake Pads
Forks
Cleaners, Degreasers and Lubrication
Essentials
Brake SparesSee More
See More
Rear Suspension
Accessories
Front SuspensionMaintenance
Sell Your BikeFinishing Kit
See MoreContact Us
Tubes
Log in
Tubeless
Search
Seat Posts & Clamps
Pedals
0 itemsGears & Drivetrain
Sorry, looks like we don't have enough of this product.
See More
Components
E-bike Batteries and chargers
Wheels
See More
Add order notes
Tools & Maintenance
Complete Wheels
Special instructions for seller
Tubeless
Clothing and Protection
See More
Helmets
Gloves
Socks
EssentialsMaintenance
Sell Your Bike
Contact Us
Finance
Log in
Create account
Search

Congo - Brazzaville (XAFCFA)
 






The Advance 2W demonstrates an open frame design for easier mounting and dismounting.
Alhonga AHJ-OD7
Â
Cassette Freewheel :
Chain Set :
Shimano ET39 38T 170mm
South Sudan (GBP£)




