• Shop All Second-Hand
      • Shop All Second-Hand
      Custom Builds
    • Custom BuildsSee More
      Custom Builds for sale
      • Custom Builds for sale Custom Build Inspiration
      • Custom Build Inspiration
    Services
  • ServicesSee More
    Workshop
    • WorkshopSee More
      Workshop Prices
      • Workshop Prices Book a Service
      • Book a Service Track Your Service
      • Track Your Service
      Other
    • OtherSee More
      Custom Builds
      • Custom Builds Cycle To Work Schemes
      • Cycle To Work Schemes Insure Your Bike
      • Insure Your Bike
      Book a Service
    • Book a Service
    Parts & Components
  • Parts & ComponentsSee More
    Brands
    • BrandsSee More
      • Hope
      • Enve
    • Brakes Brakes
      • Complete Brakes Complete Brakes
      • Brake Rotors Brake Rotors
      • Brake Pads Brake Pads
      • Brake Spares Brake Spares
    • Forks
      • Complete Wheels

Open search bar
Search for products on our site

Suggested search terms

Suggested search terms
About Us
About UsContact Us
Contact UsBlog
BlogTrack Service Progress
Track Service ProgressBuilding Your Bike From the Box
Building Your Bike From the BoxInsure Your Bike
Insure Your BikePrivacy Policy
Privacy PolicyCookie Policy
Cookie PolicyTerms of Service
Terms of ServiceRefund policy
Refund policy
Open cart Open cart
Home
Home Hire
Hire Bikes
Bikes
New Bikes Shop All New BikesNew Bikes Shop All New BikesRoad / Gravel / Touring Bikes Road / Gravel / Touring BikesHybrid / City Bikes Hybrid / City BikesMountain Bikes Mountain BikesElectric Bikes Electric BikesKids Bikes Kids BikesFrames
Shop by BrandFrames GloriaShop by Brand GloriaTrek TrekAmflow AmflowVelduro VelduroYeti YetiRidgeback RidgebackBrother BrotherGenesis GenesisSingular SingularEnigma EnigmaFrog FrogKona KonaSurly SurlyUTO (ex Eovolt) UTO (ex Eovolt)Early Rider Early RiderArgon 18
Second-Hand BikesArgon 18 Shop All Second-HandSecond-Hand Bikes
Custom BuildsShop All Second-Hand Custom Builds for saleCustom Builds Custom Builds for saleCustom Build Inspiration
Custom Build Inspiration
Services
Services
Workshop Workshop PricesWorkshop Workshop PricesBook a Service Book a ServiceTrack Your Service
OtherTrack Your Service Custom BuildsOther Custom BuildsCycle To Work Schemes Cycle To Work SchemesInsure Your Bike
Book a ServiceInsure Your Bike
Book a Service
Parts & Components
Parts & Components
Brands HopeBrands HopeEnve
CockpitEnve HandlebarsCockpit HandlebarsStems StemsGrips & Bar-Tape Grips & Bar-TapeHeadsets
BrakesHeadsets Complete BrakesBrakes Complete BrakesBrake Rotors Brake RotorsBrake Pads Brake PadsBrake Spares
ForksBrake Spares Front SuspensionForks Front SuspensionRear Suspension
Finishing KitRear Suspension TyresFinishing Kit TyresTubes TubesTubeless TubelessSaddles SaddlesSeat Posts & Clamps Seat Posts & ClampsPedals
Gears & DrivetrainPedals ComponentsGears & Drivetrain ComponentsE-bike Batteries and chargers
WheelsE-bike Batteries and chargers Complete WheelsWheels
TubelessComplete Wheels
Tools & Maintenance
Clothing and ProtectionTubeless Tools & MaintenanceProjektRide MerchandiseClothing and Protection ProjektRide MerchandiseHelmets HelmetsGloves GlovesClothing ClothingSocks
EssentialsSocks Cleaners, Degreasers and LubricationEssentials Cleaners, Degreasers and LubricationAccessories AccessoriesMaintenance
Maintenance
Sell Your Bike
Sell Your BikeContact Us
Contact UsFinance
FinanceOpen search bar
Open search bar
Search for products on our site

Suggested search terms

Suggested search termsAbout Us
Contact UsAbout Us
BlogContact Us
Track Service ProgressBlog
Building Your Bike From the BoxTrack Service Progress
Insure Your BikeBuilding Your Bike From the Box
Privacy PolicyInsure Your Bike
Cookie PolicyPrivacy Policy
Terms of ServiceCookie Policy
Refund policyTerms of Service
Refund policy
My Account
My Account Open cart
Open cart
Open search bar
Open search bar
Search for products on our site

Suggested search terms

Suggested search termsAbout Us
Contact UsAbout Us
BlogContact Us
Track Service ProgressBlog
Building Your Bike From the BoxTrack Service Progress
Insure Your BikeBuilding Your Bike From the Box
Privacy PolicyInsure Your Bike
Cookie PolicyPrivacy Policy
Terms of ServiceCookie Policy
Refund policyTerms of Service
Refund policy
Open cart Open cart
Close
  • Home
  • HireHome
  • BikesHire
    See More
    • New Bikes
      New Bikes
      • See MoreShop All New Bikes
      • Road / Gravel / Touring BikesShop All New Bikes
      • Hybrid / City BikesRoad / Gravel / Touring Bikes
      • Mountain BikesHybrid / City Bikes
      • Electric BikesMountain Bikes
      • Kids BikesElectric Bikes
      • FramesKids Bikes
    • FramesShop by Brand
      • See MoreGloria
      • TrekGloria
      • AmflowTrek
      • VelduroAmflow
      • YetiVelduro
      • RidgebackYeti
      • BrotherRidgeback
      • GenesisBrother
      • SingularGenesis
      • EnigmaSingular
      • FrogEnigma
      • KonaFrog
      • SurlyKona
      • UTO (ex Eovolt)Surly
      • Early RiderUTO (ex Eovolt)
      • Argon 18Early Rider
    • Argon 18
      DSC05119_1.png
      Second-Hand Bikes
      • See MoreShop All Second-Hand
    • Shop All Second-HandCustom Builds
      • See MoreCustom Builds for sale
      • Custom Build Inspiration Custom Builds for sale
    Custom Build Inspiration
  • Services
    See More
    • Workshop
      • See MoreWorkshop Prices
      • Book a ServiceWorkshop Prices
      • Track Your ServiceBook a Service
    • Track Your ServiceOther
      • See MoreCustom Builds
      • Cycle To Work SchemesCustom Builds
      • Insure Your BikeCycle To Work Schemes
    • Insure Your BikeBook a Service
    Book a Service
  • Parts & Components
    See More
    • Brands
      • See MoreHope
      • EnveHope
    • Enve
      27157-pm.png
      Cockpit
      • See MoreHandlebars
      • StemsHandlebars
      • Grips & Bar-TapeStems
      • HeadsetsGrips & Bar-Tape
    • Headsets
      Screenshot2022-11-06at17.25.31.png
      Brakes
      • Complete BrakesComplete Brakes
      • Brake RotorsBrake Rotors
      • Brake PadsBrake Pads
      • Brake SparesBrake Spares
    • ForksForks
      • Front SuspensionFront Suspension
      • Rear SuspensionRear Suspension
    • Screenshot2022-06-16at17.20.35.png
      Finishing KitFinishing Kit
      • TyresTyres
      • TubesTubes
      • TubelessTubeless
      • SaddlesSaddles
      • Seat Posts & ClampsSeat Posts & Clamps
      • PedalsPedals
    • Screenshot2021-12-17at13.29.10.png
    • Screenshot2023-03-26at22.30.32.png
      • Complete Wheels Complete Wheels
    • 25349-pm.png
      Tubeless Tubeless
    • Screenshot2023-02-23at10.16.53.png
      Tools & Maintenance Tools & Maintenance
    • Screenshot2022-06-21at09.26.08.png
      Clothing and Protection Clothing and Protection
      • ProjektRide Merchandise ProjektRide Merchandise
      • Helmets Helmets
      • Gloves Gloves
      • Clothing Clothing
      • Socks Socks
    • AWS-10_005.jpg
      Essentials Essentials
      • Cleaners, Degreasers and Lubrication Cleaners, Degreasers and Lubrication
      • Accessories Accessories
      • Maintenance Maintenance
  • Sell Your Bike Sell Your Bike
  • Contact Us Contact Us
  • Finance Finance
  • Log in Log in
  • Create account Create account
  • Search Search

Country

Country GBP£
  • Åland Islands (EUR€) Åland Islands (EUR€)
  • Albania (ALLL) Albania (ALLL)
  • Algeria (DZDد.ج) Algeria (DZDد.ج)
  • Andorra (EUR€) Andorra (EUR€)
  • Angola (GBP£) Angola (GBP£)
  • Armenia (AMDդր.) Armenia (AMDդր.)
  • Ascension Island (SHP£) Ascension Island (SHP£)
  • Austria (EUR€) Austria (EUR€)
  • Belarus (GBP£) Belarus (GBP£)
  • Belgium (EUR€) Belgium (EUR€)
  • Benin (XOFFr) Benin (XOFFr)
  • Bosnia & Herzegovina (BAMКМ) Bosnia & Herzegovina (BAMКМ)
  • Botswana (BWPP) Botswana (BWPP)
  • British Indian Ocean Territory (USD$) British Indian Ocean Territory (USD$)
  • Bulgaria (EUR€) Bulgaria (EUR€)
  • Burkina Faso (XOFFr) Burkina Faso (XOFFr)
  • Burundi (BIFFr) Burundi (BIFFr)
  • Cameroon (XAFCFA) Cameroon (XAFCFA)
  • Cape Verde (CVE$) Cape Verde (CVE$)
  • Central African Republic (XAFCFA) Central African Republic (XAFCFA)
  • Chad (XAFCFA) Chad (XAFCFA)
  • Comoros (KMFFr) Comoros (KMFFr)
  • Congo - Brazzaville (XAFCFA) Congo - Brazzaville (XAFCFA)
  • Congo - Kinshasa (CDFFr) Congo - Kinshasa (CDFFr)
  • Côte d’Ivoire (XOFFr) Côte d’Ivoire (XOFFr)
  • Croatia (EUR€) Croatia (EUR€)
  • Cyprus (EUR€) Cyprus (EUR€)
  • Czechia (CZKKč) Czechia (CZKKč)
  • Denmark (DKKkr.) Denmark (DKKkr.)
  • Djibouti (DJFFdj) Djibouti (DJFFdj)
  • Egypt (EGPج.م) Egypt (EGPج.م)
  • Equatorial Guinea (XAFCFA) Equatorial Guinea (XAFCFA)
  • Eritrea (GBP£) Eritrea (GBP£)
  • Estonia (EUR€) Estonia (EUR€)
  • Eswatini (GBP£) Eswatini (GBP£)
  • Ethiopia (ETBBr) Ethiopia (ETBBr)
  • Faroe Islands (DKKkr.) Faroe Islands (DKKkr.)
  • Finland (EUR€) Finland (EUR€)
  • France (EUR€) France (EUR€)
  • French Southern Territories (EUR€) French Southern Territories (EUR€)
  • Gabon (XOFFr) Gabon (XOFFr)
  • Gambia (GMDD) Gambia (GMDD)
  • Georgia (GBP£) Georgia (GBP£)
  • Germany (EUR€) Germany (EUR€)
  • Réunion (EUR€) Réunion (EUR€)
  • Romania (RONLei) Romania (RONLei)
  • Rwanda (RWFFRw) Rwanda (RWFFRw)
  • San Marino (EUR€) San Marino (EUR€)
  • United States (GBP£)
  • United States (GBP£) Vatican City (EUR€)
  • Vatican City (EUR€) Western Sahara (MADد.م.)
  • Western Sahara (MADد.م.) Zambia (GBP£)
  • Zambia (GBP£) Zimbabwe (USD$)
Zimbabwe (USD$)
Shop All
Shop All
Header Image
Projektride logo
  • BUY
  • SELL
  • RIDE CONFIDENTBUY
SELL
#productTemplate--template--26482384994687__main { --PT: 60px; --PB: 30px; }
Batribike Trail
Batribike Trail
Batribike Trail
Batribike Trail
Batribike Trail
Batribike Trail
Batribike Trail
Batribike Trail
Batribike Trail
Batribike Trail
Batribike Trail
Batribike Trail
Batribike Trail
Batribike Trail
Batribike Trail
Home
Batribike Trail /
Best selling products
/
Batribike Trail Batribike SUV S
Batribike SUV S
Batribike Trail

ProjektRide

  • Contact Us



  • Armenia (AMDդր.) Algeria (DZDد.ج)
  • Ascension Island (SHP£) Andorra (EUR€)
  • Austria (EUR€) Angola (GBP£)
  • Belarus (GBP£) Armenia (AMDդր.)
  • Belgium (EUR€) Ascension Island (SHP£)
  • Benin (XOFFr) Austria (EUR€)
  • Bosnia & Herzegovina (BAMКМ) Belarus (GBP£)
  • Botswana (BWPP) Belgium (EUR€)
  • British Indian Ocean Territory (USD$) Benin (XOFFr)
  • Bulgaria (EUR€) Bosnia & Herzegovina (BAMКМ)
  • Burkina Faso (XOFFr) Botswana (BWPP)
  • Burundi (BIFFr) British Indian Ocean Territory (USD$)
  • Cameroon (XAFCFA) Bulgaria (EUR€)
  • Cape Verde (CVE$) Burkina Faso (XOFFr)
  • Central African Republic (XAFCFA) Burundi (BIFFr)
  • Chad (XAFCFA) Cameroon (XAFCFA)
  • Comoros (KMFFr) Cape Verde (CVE$)
  • France (EUR€) Gambia (GMDD)
  • French Southern Territories (EUR€) Georgia (GBP£)
  • Gabon (XOFFr) Germany (EUR€)
  • Gambia (GMDD) Ghana (GBP£)
  • Georgia (GBP£) Gibraltar (GBP£)
  • Germany (EUR€) Greece (EUR€)
  • Ghana (GBP£) Greenland (DKKkr.)
  • Gibraltar (GBP£) Guadeloupe (EUR€)
  • Greece (EUR€) Guernsey (GBP£)
  • Greenland (DKKkr.) Guinea (GNFFr)
  • Guadeloupe (EUR€) Guinea-Bissau (XOFFr)
  • Guernsey (GBP£) Hungary (HUFFt)
  • Guinea (GNFFr) Iceland (ISKkr)
  • Guinea-Bissau (XOFFr) Ireland (EUR€)
  • Hungary (HUFFt) Isle of Man (GBP£)
  • Iceland (ISKkr) Italy (EUR€)
  • Ireland (EUR€) Jersey (GBP£)
  • Isle of Man (GBP£) Kenya (KESKSh)
  • Italy (EUR€) Kosovo (EUR€)
  • Jersey (GBP£) Latvia (EUR€)
  • Kenya (KESKSh) Lesotho (GBP£)
  • Kosovo (EUR€) Liberia (GBP£)
  • Latvia (EUR€) Libya (GBP£)
  • Lesotho (GBP£) Liechtenstein (CHFCHF)
  • Liberia (GBP£) Lithuania (EUR€)
  • Netherlands (EUR€)
  • Mozambique (GBP£) Niger (XOFFr)
  • Nigeria (NGN₦)
  • Netherlands (EUR€) North Macedonia (MKDден)
  • Niger (XOFFr) Norway (GBP£)
  • Nigeria (NGN₦) Poland (PLNzł)
  • North Macedonia (MKDден) Portugal (EUR€)
  • Réunion (EUR€)
  • Poland (PLNzł) Romania (RONLei)
  • Sweden (SEKkr) Togo (XOFFr)
  • Switzerland (CHFCHF) Tristan da Cunha (GBP£)
  • Tanzania (TZSSh) Tunisia (GBP£)
  • Togo (XOFFr) Türkiye (GBP£)
  • Tristan da Cunha (GBP£) Uganda (UGXUSh)
  • Tunisia (GBP£) Ukraine (UAH₴)
  • Türkiye (GBP£) United Kingdom (GBP£)
  • Uganda (UGXUSh) United States (GBP£)
  • Ukraine (UAH₴) Vatican City (EUR€)
  • United Kingdom (GBP£) Western Sahara (MADد.م.)
  • United States (GBP£) Zambia (GBP£)
  • Vatican City (EUR€) Zimbabwe (USD$)
  • Western Sahara (MADد.م.)
  • Zambia (GBP£)
  • © 2026, Zimbabwe (USD$) ProjektRide .
Powered by
Shopify .
American Express© 2026, ProjektRide .Apple Pay Powered by ShopifyDiners Club. Discover
    Google Pay
  • American Express
  • Klarna
  • Union Pay
  • Maestro
  • Visa
  • Mastercard
  • PayPal
  • Shop Pay
  • Union Pay
  • Visa
Close
Close
Close
window._RestockRocketConfig = window._RestockRocketConfig || {} window._RestockRocket = window._RestockRocket || {} window._Stoq = window._RestockRocket window._StoqConfig = window._RestockRocketConfig try { window._RestockRocket.inlineRanAt = performance.now(); } catch (e) { } function normalizeLocale(locale) { if (!locale || locale.trim() === '') { return ''; } return locale.toString().toLowerCase().replace(/-/g, '_'); } window._RestockRocketConfig.locale = 'en'; window._RestockRocketConfig.normalizedLocale = normalizeLocale('en'); window._RestockRocketConfig.shop = 'projektride.myshopify.com'; window._RestockRocketConfig.pageType = 'product'; window._RestockRocketConfig.liquidRenderedAt = 1790829346;window._RestockRocketConfig.marketId = 382140642;window._RestockRocketConfig.countryName = 'United Kingdom'; window._RestockRocketConfig.countryIsoCode = 'GB';window._RestockRocketConfig.languageIsoCode = 'en';window._RestockRocketConfig.cartInventoryQuantity = {}; if (!window._RestockRocketConfig.cartToken) { try { const m = document.cookie.match(/(?:^|;\s*)cart=([^;]+)/); if (m && m[1]) window._RestockRocketConfig.cartToken = decodeURIComponent(m[1]); } catch (e) { } } window._RestockRocketConfig.cachedSettings = {"id":38500,"shop_id":38436,"currency":"GBP","created_at":"2025-07-26T09:13:57.337Z","updated_at":"2026-08-12T16:44:57.298Z","enable_app":true,"enable_signup_widget":false,"storefront_button_text":"Notify me when available","storefront_button_text_color":"#FFFFFF","storefront_button_background_color":"#202223","storefront_form_header":"Notify me","storefront_form_description":"Get a notification as soon as this product is back in stock by signing up below!","storefront_form_button_text":"Notify me when available","storefront_form_button_text_color":"#FFFFFF","storefront_form_button_background_color":"#202223","storefront_form_terms":"Promise we won't spam. You'll only receive notifications for this product.","storefront_form_error":"Please enter a valid email address","storefront_form_success":"Thank you! We will notify you when the product is available.","enable_powered_by":true,"show_button_on_preorder":true,"sms_enabled":false,"email_enabled":true,"storefront_button_disable_tag":"rocket-hide","theme_config":{"disableDebugLoggingForNonPreorderItem":false},"storefront_form_email_placeholder":"Email address","storefront_form_phone_placeholder":"SMS","storefront_form_phone_label":"Phone number","storefront_form_email_label":"Email","storefront_form_phone_error":"Please enter a valid phone number","storefront_form_customer_name_placeholder":"Name","storefront_form_customer_name_error":"Please enter your name","storefront_form_did_you_mean_error":"Did you mean %{suggested_email}? Or use %{current_email}","form_customer_name_enabled":false,"form_customer_name_required":false,"css_config":"","js_config":null,"collect_promotion_consent":false,"storefront_form_promotion_consent_label":"Notify me about other news, sales, discounts & offers too","show_button_on_collection":false,"sms_default_country":"us","sms_allowed_countries":[],"sms_restrict_country":false,"sms_default_channel":true,"optin_required":false,"optin_custom_domain_enabled":false,"optin_success_text":"Registration confirmed! You'll receive an alert when the product is restocked.","storefront_button_border_radius":0,"storefront_button_disable_tag_hides_button":true,"storefront_button_disable_tag_enabled":false,"quantity_required":false,"storefront_form_quantity_label":"Quantity","enable_alerts":true,"sms_allowed":false,"email_allowed":true,"collect_promotion_consent_default":true,"insert_button_after_selector":null,"insert_button_after_selector_type":"afterend","storefront_button_position_type":"float-right","storefront_form_duplicate_error":"You've already subscribed for alerts to this product.","storefront_mixed_cart_error":"Preorders must be purchased separately from regular items. Please complete your current order first, or clear your cart to continue.","storefront_error_heading":"Error","default_locale":"en","collection_page_button_text_color":"#FFFFFF","collection_page_button_background_color":"#202223","show_button_if_any_out_of_stock":false,"show_button_if_any_variant_out_of_stock_collection":false,"show_button_on_index":false,"insert_button_after_selector_collection":".product-grid-item__info","insert_button_after_selector_index":".product-grid-item__info","push_enabled":false,"push_allowed":false,"storefront_form_push_label":"Push","storefront_form_push_description":"Click 'Allow' to be notified via push notification","storefront_form_push_error":"Permission rejected! Please review notification settings and try again","storefront_font_family":"OpenSans","insert_button_after_selector_collection_type":"afterend","show_channel_selector":false,"storefront_form_empty_error":"Please fill in one or more of the options above","storefront_form_push_input":"Send notification to your browser","insert_button_after_selector_page":".product-grid-item__info","show_button_on_page":false,"insert_button_after_selector_search":".grid","show_button_on_search":false,"app_proxy_path_prefix":"/apps/restockrocket-production","collection_link_selector":".product-grid-item__title","index_link_selector":".product-grid-item__title","page_link_selector":".product-grid-item__title","search_link_selector":".product-grid-item__title","collection_check_link_visibility":true,"collection_buttons_container":".grid","index_buttons_container":".carousel.grid--mobile .flickity-viewport","page_buttons_container":".grid","search_buttons_container":".grid","extension_enable_url_variant_detection":true,"extension_enable_value_variant_detection":true,"extension_value_variant_selector":"[name='id']","resubscribe_text":"This product is out of stock. Get notified when it's restocked again by entering your details below!","preorder_enabled":true,"preorder_buy_button_selector":"","preorder_add_to_cart_button_selector":".product__submit__holder .product__submit__buttons button","preorder_badge_selector":"","preorder_button_out_of_stock_text":"Out of stock","preorder_button_add_to_cart_text":"Add to cart","preorder_form_selector":"form[action*=\"/cart/add\"]","preorder_collection_enabled":false,"preorder_collection_form_selector":"form[action*=\"/cart/add\"]","preorder_collection_add_to_cart_button_selector":"form[action*=\"/cart/add\"] button","preorder_index_enabled":false,"preorder_index_form_selector":"form[action*=\"/cart/add\"]","preorder_index_add_to_cart_button_selector":"form[action*=\"/cart/add\"] button","preorder_page_enabled":false,"preorder_page_form_selector":"form[action*=\"/cart/add\"]","preorder_page_add_to_cart_button_selector":"form[action*=\"/cart/add\"] button","preorder_search_enabled":false,"preorder_search_form_selector":"form[action*=\"/cart/add\"]","preorder_search_add_to_cart_button_selector":"form[action*=\"/cart/add\"] button","preorder_collection_badge_selector":".product__media__holder","preorder_index_badge_selector":".product__media__holder","preorder_page_badge_selector":".product__media__holder","preorder_search_badge_selector":".product__media__holder","preorder_badge_selector_type":"afterend","preorder_collection_badge_selector_type":"afterend","preorder_button_child_selector":"span","preorder_button_disclaimer_insert_selector":".product__form .btn","preorder_button_disclaimer_insert_selector_type":"afterend","preorder_payment_insert_selector":"","preorder_payment_insert_selector_type":"afterend","preorder_price_container_selector":".product__price--regular","preorder_price_container_selector_insert_type":"afterend","preorder_terms_insert_selector":"","preorder_terms_insert_selector_type":"afterend","preorder_original_price_selector":".product__price--regular","preorder_price_format":"{{amount}} {{currency}}","show_badge_if_any_variant_is_preorder":false,"enable_console_debug":false,"inline_form_enabled":false,"inline_form_selector":".product__form","inline_form_selector_type":"afterend","storefront_form_prefill_customer":true,"storefront_form_show_image":false,"storefront_form_text_color":"#202223","storefront_form_background_color":"#FFFFFF","storefront_form_border_radius":0,"market_setup_type":"single_market","shopify_app_id":5940125,"preorder_progress_bar_insert_selector":null,"preorder_progress_bar_insert_selector_type":"beforebegin","countdown_timer_insert_selector":null,"countdown_timer_insert_selector_type":"afterend","configure_notify_me_enabled":false,"restock_note_insert_selector":null,"restock_note_insert_selector_type":"afterend","restock_note_background_color":"#f3f4f6","restock_note_text_color":"#202223","restock_note_border_radius":4,"preorder_modal_continue_button_text":"Continue","preorder_modal_cancel_button_text":"Cancel","meta_pixel_enabled":false,"meta_pixel_id":null,"cache":true,"cached_at":"2026-08-12T16:44:57.369Z","multi_language_enabled":false,"translation_locale":"en","disable_refresh_on_stale_liquid":false}; window._RestockRocketConfig.metafieldNamespace = 'restockrocket_production'; window._RestockRocketConfig.storefrontApiVersion = '2026-07';window._RestockRocketConfig.cachedPreorderVariantIds = {"preorder_variant_ids":[42140096102626,42167799447778,43590980075746,43916521013474,43934694998242,43934695031010,43934695620834,43935975440610,43935975473378,43935989399778,43935989432546,43935990284514,43935994118370,43935995625698,43935995855074,43936000835810,43936003195106,43936003227874,43936008012002,43936008044770,43936022757602,43936022790370,43936022823138,43936022855906,43936056115426,43936061030626,43936064930018,43936070631650,43936078037218,43936078069986,43936088195298,43936093470946,43936101138658,43936107266274,43936124076258,43936124109026,43936124141794,43936124174562,43936129941730,43936129974498,43936130007266,43936142393570,43936142426338,43936142459106,43936152060130,43936152092898,43936152125666,43936193118434,43936250429666,43936255803618,43936266682594,43936266715362,43936293978338,43936294011106,43936316424418,43936316457186,43936320880866,43936320913634,43936320946402,43936327041250,43936327074018,43936327106786,43936331661538,43936332349666,43936351224034,43936353714402,43936362889442,43936362922210,43936388153570,43936389333218,43936395526370,43936398508258,43936408568034,43936414400738,43936700727522,43936706101474,43936706134242,43936706167010,43936706199778,43936706232546,43936706265314,43938298233058,43938298265826,43938298298594,43938298331362,43938298364130,43938298396898,43938298429666,43938298462434,43938299805922,43938299838690,43938299871458,43938299904226,43938299936994,43938299969762,43938300002530,43938308587746,43938308653282,43938308718818,43938308751586,43938308784354,43938308817122,43938322612450,43938322645218,43938322677986,43981336051938,43981336084706,43981336117474,43981336150242,43981345587426,43981345620194,43981345652962,43981345685730,43981357580514,43981357613282,43981362462946,43981362495714,43981362528482,43981369016546,43981369049314,43981374914786,43981374947554,43981374980322,43981392806114,43981392871650,43981392937186,43981695844578,43981695877346,43981695910114,43981695942882,43981986070754,43981987938530,43981989085410,43981989118178,43981989150946,43981990887650,43981990920418,43981990953186,44052906967266,44052907327714,44052907360482,44052907393250,44052907426018,44052907458786,44052907491554,44052909097186,44052909129954,44195991847138,44195991945442,44329993437410,44329993470178,44329993502946,44329993535714,44329993568482,45068753961186,45068753993954,45069622640866,45069622903010,45069622968546,45069750730978,45069750763746,45353010921698,45353010954466,45353010987234,45353018261730,45353018294498,45353018327266,55066403209599,55066403242367,55569712382335,55569712415103,55569712447871,55569712480639,55570017616255,55570550194559,55604008976767,55638316908927,55638316941695,55638316974463,56220814967167,56220814999935,56220815032703,56270279606655,56270279639423,56270279672191,56399322251647,58086872056191,58086872088959,58145667154303,58156649972095,58205080093055,58205080125823,58434279833983,58504939569535],"updated_at":"2026-10-01T04:21:17Z","market_locations_enabled":false,"market_id":13777305826,"preorder_location_filter_enabled":false,"preorder_location_filter_ids":[],"collection_id":null,"bulk_operation":true};window._RestockRocketConfig.cachedInStockVariantIds = { in_stock_variant_ids: [] };window._RestockRocketConfig.cachedOutOfStockVariantIds = { out_of_stock_variant_ids: [] };window._RestockRocketConfig.cachedVariantPreorderLimits = {"variant_preorder_limits":{},"updated_at":"2026-10-01T04:27:22Z","shopify_market_id":382140642,"market_locations_enabled":false}; window._RestockRocketConfig.cachedVariantPreorderLimitsMarketKey = "variant_preorder_limits_for_market_382140642";window._RestockRocketConfig.cachedVariantShippingTexts = {"variant_shipping_texts":{},"updated_at":"2026-10-01T04:27:23Z","shopify_market_id":382140642,"market_locations_enabled":false}; window._RestockRocketConfig.cachedVariantShippingTextsMarketKey = "variant_shipping_texts_for_market_382140642"; window._RestockRocketConfig.sellingPlans = [];(function() { const cachedData = {"plans":[{"shopify_selling_plan_group_id":98590196095,"shopify_selling_plan_id":713071886719,"enabled":true,"variant_ids":[55569712382335,55569712415103,55569712480639,55570017616255,55570017550719,55569712447871,55570017583487],"product_variants_source":"custom","name":"Preorder","preorder_button_text":"Preorder","preorder_button_description":"Note: This is a preorder. Items will ship based on the estimated delivery date.","preorder_button_description_enabled":true,"preorder_button_description_background_color":"#ebebeb","preorder_button_description_text_color":"#000000","preorder_button_description_border_radius":10,"preorder_button_description_show_quantity_limit":false,"preorder_button_description_quantity_limit_suffix":" units available for preorder","preorder_button_description_shipping_text_prefix":"Shipping: ","delivery_exact_time":null,"delivery_after_n_intervals":null,"delivery_at":"2025-07-26T09:20:18.169Z","delivery_type":"asap","quantity_limit_text":"{{ quantity }} units available for preorder","preorder_button_description_show_shipping":true,"preorder_button_description_icons_enabled":true,"preorder_shipping_text":"Estimated to ship within 2 months","shipping_applies_to_all_products":true,"shipping_text":"Estimated to ship within 2 months","payment_type":"full","billing_checkout_charge_type":"percentage","billing_checkout_charge_amount":null,"billing_checkout_charge_percentage":"100.0","pricing_type":"no_discount","pricing_amount":null,"pricing_percentage":null,"discount_text":"Save {{ discount }}","billing_title":"Full payment","billing_description":null,"enable_billing_widget":false,"inventory_provider":"stoq","preorder_badge_enabled":false,"preorder_badge_text":"Preorder","preorder_badge_text_color":"#FFFFFF","preorder_badge_background_color":"#000000","preorder_discounted_price_enabled":null,"payment_line_item_property_enabled":false,"shipping_line_item_property_enabled":true,"custom_line_item_property_text":null,"preorder_button_text_color":"#ffffff","preorder_button_background_color":"#565557","preorder_button_colors_enabled":true,"markets_enabled":false,"shopify_market_ids":[],"use_shopify_selling_plan":true,"use_simplified_shipping_text":true,"payment_options":[{"billing_type":"no_remaining_balance","billing_checkout_charge_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,"acknowledgement_line_item_property_enabled":false,"acknowledgement_line_item_property_text":"Preorder Terms Accepted","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":null,"countdown_timer_custom_end_date":null,"countdown_timer_starts_text":null,"countdown_timer_ends_text":null,"countdown_timer_days_label":"Days","countdown_timer_hours_label":"Hours","countdown_timer_minutes_label":"Mins","countdown_timer_seconds_label":"Secs","schedule_offer":false,"schedule_start_date":null,"schedule_end_date":null,"updated_at":"2026-08-31T15:28:37.678Z","allow_mixed_cart":true,"mixed_cart_error_message":"Preorders must be purchased separately from regular items. Please complete your current order first, or clear your cart to continue.","b2b_enabled":true,"preorder_progress_bar_enabled":false,"preorder_progress_bar_text":"{{ sold }} of {{ total }} claimed","preorder_progress_bar_fill_color":"#000000","preorder_progress_bar_background_color":"#e5e5e5","preorder_progress_bar_text_color":"#FFFFFF","preorder_progress_bar_border_radius":4,"preorder_progress_bar_show_percentage":false,"batches_enabled":false,"preorder_batches":[],"batch_status_past_text":"Sold out","batch_status_live_text":"Live","batch_status_upcoming_text":"Coming soon"}],"disabled_plan_ids":[714631872895,713813721471,713176482175],"cached_at":"2026-08-31T15:28:38Z"}; if (cachedData && typeof cachedData === 'object' && cachedData.cached_at) { window._RestockRocketConfig.readFlags = cachedData.read_flags || {}; const oldPlans = window._RestockRocketConfig.sellingPlans; const maxUpdatedAt = Array.isArray(oldPlans) && oldPlans.length > 0 ? oldPlans.reduce(function(max, plan) { 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; const cachedDate = new Date(cachedData.cached_at); const maxDate = maxUpdatedAt ? new Date(maxUpdatedAt) : null; const useCached = !maxUpdatedAt || (cachedDate && !isNaN(cachedDate) && (!maxDate || cachedDate > maxDate)); if (useCached) { if (Array.isArray(cachedData.plans)) { window._RestockRocketConfig.sellingPlans = cachedData.plans; window._RestockRocketConfig.disabledSellingPlanIds = cachedData.disabled_plan_ids || []; console.debug('[RR] Using selling plans from cachedSellingPlans (cached_at: ' + cachedData.cached_at + ')'); } } else { window._RestockRocketConfig.disabledSellingPlanIds = []; console.debug('[RR] Using selling plans from old format (max updated_at: ' + maxUpdatedAt + ')'); } } })();window._RestockRocketConfig.enabledNotifyMeVariantIds = [];window._RestockRocketConfig.disabledNotifyMeVariantIds = [];window._RestockRocketConfig.backInStockTemplates = [];window._RestockRocketConfig.restockNotes = {};window._RestockRocketConfig.integrations = [{"id":"15c94526-b6b8-4de1-9bc1-23b1ca52ddb0","shop_id":38436,"enabled":true,"page_types":["product","collection","index","search","page","cart","list-collections","article","blog"],"configuration":{"toastDuration":10000,"toastPosition":"bottom-right","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.product = { id: 15824986112383, title: "Batribike SUV S", handle: "batribike-suv-s", vendor: "Batribike", tags: ["2026","Batribike","Coming Summer 2026","E-Bike","Electric Bike","spo-cs-disabled","spo-default","spo-disabled","spo-notify-me-disabled"], available: false, options: ["Colour","Battery Size","Frame Size"], selling_plan_groups: [], featured_image: "\/\/projektride.co.uk\/cdn\/shop\/files\/Screenshot2026-08-06at16.59.19.png?v=1786035146\u0026width=800", variants: [{ id: 58126302052735, title: "Cream \/ Standard \/ 374Wh \/ 43cm", available: false, sku: "8026110297-STD374-43", price: 159900 }, { id: 58126302085503, title: "Cream \/ Standard \/ 374Wh \/ 48cm", available: false, sku: "8026110297-STD374-48", price: 159900 }, { id: 58126302118271, title: "Cream \/ Boost \/ 504 Wh \/ 43cm", available: false, sku: "8026110297-BOOST504-43", price: 174900 }, { id: 58126302151039, title: "Cream \/ Boost \/ 504 Wh \/ 48cm", available: false, sku: "8026110297-BOOST504-48", price: 174900 } ] };window._RestockRocketConfig.variantsInventoryPolicy = {58126302052735 : "deny",58126302085503 : "deny",58126302118271 : "deny",58126302151039 : "deny",}; window._RestockRocketConfig.variantsInventoryQuantity = {58126302052735 : parseInt("0"),58126302085503 : parseInt("0"),58126302118271 : parseInt("0"),58126302151039 : parseInt("0"),}; window._RestockRocketConfig.variantsPreorderCount = {58126302052735 : parseInt(""),58126302085503 : parseInt(""),58126302118271 : parseInt(""),58126302151039 : parseInt(""),}; window._RestockRocketConfig.variantsPreorderCountForMarket = {58126302052735 : null,58126302085503 : null,58126302118271 : null,58126302151039 : null,}; window._RestockRocketConfig.variantsPreorderMaxCount = {58126302052735 : parseInt(""),58126302085503 : parseInt(""),58126302118271 : parseInt(""),58126302151039 : parseInt(""),}; window._RestockRocketConfig.variantsPreorderMaxCountForMarket = {58126302052735 : null,58126302085503 : null,58126302118271 : null,58126302151039 : null,}; window._RestockRocketConfig.variantsShippingText = {58126302052735 : "",58126302085503 : "",58126302118271 : "",58126302151039 : "",}; window._RestockRocketConfig.variantsShippingTextForMarket = {58126302052735 : null,58126302085503 : null,58126302118271 : null,58126302151039 : null,};window._RestockRocketConfig.selected_variant_id = 58126302052735; window._RestockRocketConfig.selected_variant_available = (window._RestockRocketConfig.product.variants.find(function(variant) { return variant.id == window._RestockRocketConfig.selected_variant_id }) || {}).available; try { var _sqCfg = window._RestockRocketConfig; var _sqPlanEnabled = Array.isArray(_sqCfg.sellingPlans) && _sqCfg.sellingPlans.some(function (p) { return p && p.enabled; }); var _sqPreCount = ((_sqCfg.cachedPreorderVariantIds && _sqCfg.cachedPreorderVariantIds.preorder_variant_ids) || []).length; _sqCfg.preordersConfigured = !!(_sqPlanEnabled && _sqPreCount); } catch (e) { } try { var _sqc = window._RestockRocketConfig; var _sqOn = !(_sqc.cachedSettings && _sqc.cachedSettings.block_accelerated_checkout === false); var _sqPre = (_sqc.cachedPreorderVariantIds && _sqc.cachedPreorderVariantIds.preorder_variant_ids) || []; var _sqArm = false; if (_sqOn && _sqc.preordersConfigured) { if (_sqc.pageType === 'product' && _sqc.product && _sqc.product.variants) { _sqArm = _sqc.product.variants.some(function (v) { return _sqPre.indexOf(Number(v.id)) !== -1; }); } else { _sqArm = (_sqc.integrations || []).some(function (i) { return i && i.type === 'featured_product' && i.enabled && Array.isArray(i.page_types) && i.page_types.indexOf(_sqc.pageType) !== -1; }); } } if (_sqArm && document.documentElement) { _sqc.acceleratedGateArmed = true; document.documentElement.classList.add('stoq-buy-now-pending'); setTimeout(function () { document.documentElement.classList.remove('stoq-buy-now-pending'); }, 6000); } } catch (e) { } window._RestockRocketConfig.scriptUrlProduct = 'https://cdn.shopify.com/extensions/01a0dd9a-8d45-700e-8b7c-b94a078fbbdd/restockrocket-1-598/assets/restockrocket-product.js' window._RestockRocketConfig.scriptUrlCollection = 'https://cdn.shopify.com/extensions/01a0dd9a-8d45-700e-8b7c-b94a078fbbdd/restockrocket-1-598/assets/restockrocket-collection.js' window._RestockRocketConfig.scriptUrlProductBis = 'https://cdn.shopify.com/extensions/01a0dd9a-8d45-700e-8b7c-b94a078fbbdd/restockrocket-1-598/assets/restockrocket-product-bis.js' window._RestockRocketConfig.scriptUrlCollectionBis = 'https://cdn.shopify.com/extensions/01a0dd9a-8d45-700e-8b7c-b94a078fbbdd/restockrocket-1-598/assets/restockrocket-collection-bis.js' window._RestockRocketConfig.scriptHost = window._RestockRocketConfig.scriptUrlProduct.substring(0, window._RestockRocketConfig.scriptUrlProduct.lastIndexOf('/') + 1) window._RestockRocketConfig.host = (window._RestockRocketConfig.cachedSettings && window._RestockRocketConfig.cachedSettings.api_host) || 'https://app.restockrocket.io' try { const _stoqVersionMatch = window._RestockRocketConfig.scriptHost.match(/(\d+)\/?(?:assets\/?)?$/); window._RestockRocketConfig.appVersion = (_stoqVersionMatch && _stoqVersionMatch[1]) || ''; } catch (e) { window._RestockRocketConfig.appVersion = ''; } const SETTINGS_CACHE_DURATION = 15 * 60 * 1000; const LIQUID_CACHE_MAX_AGE = 15 * 60; const liquidRenderedAt = window._RestockRocketConfig.liquidRenderedAt; if (!liquidRenderedAt || typeof liquidRenderedAt !== 'number' || isNaN(liquidRenderedAt)) { console.debug('STOQ - Invalid or missing liquidRenderedAt timestamp, assuming fresh'); window._RestockRocketConfig.isLiquidCacheFresh = true; window._RestockRocketConfig.liquidCacheAge = null; } else { const now = Math.floor(Date.now() / 1000); const liquidCacheAge = now - liquidRenderedAt; window._RestockRocketConfig.liquidCacheAge = Math.max(0, liquidCacheAge); 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
< = 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; } if (settings.multi_language_enabled) { if (!settings.translations) { console.debug('STOQ - multi-language enabled but no translation data in cache, fetching fresh'); return null; } 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'); } } 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') try { const _stoqInitConfig = window._RestockRocketConfig; const _stoqDetectedVariantIds = (_stoqInitConfig.product && Array.isArray(_stoqIClosenitConfig.product.variants)) ? _stoqInitConfig.product.variants.map(function(v) { return v.id }) : []; const _stoqSelectedVariantId = _stoqInitConfig.selected_variant_id; var _stoqPageSeq = 0; try { _stoqPageSeq = (parseInt(window.sessionStorage.getItem('_stoq_pls') || '0', 10) || 0) + 1; window.sessionStorage.setItem('_stoq_pls', String(_stoqPageSeq)); } catch (e) { } Shopify?.analytics?.publish?.('stoq_initialized', { cart_token: _stoqInitConfig.cartToken || '', page_url: window.location.href, page_type: _stoqInitConfig.pageType || '', shop_domain: _stoqInitConfig.shop || '', market_id: _stoqInitConfig.marketId || '', country_code: _stoqInitConfig.countryIsoCode || '', detected_variant_ids: _stoqDetectedVariantIds, selected_variant_id: _stoqSelectedVariantId || '', page_load_seq: _stoqPageSeq, liquid_rendered_at: _stoqInitConfig.liquidRenderedAt || 0, app_version: _stoqInitConfig.appVersion || '', 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 || ''; var _sqVidNum = Number(variantId); var _sqPlan = null; var _sqPlans = Array.isArray(_sqTrack.sellingPlans) ? _sqTrack.sellingPlans : []; var _sqMktId = Number(_sqTrack.marketId); var _sqForVariant = function (pl) { return pl && pl.enabled && Array.isArray(pl.variant_ids) && pl.variant_ids.indexOf(_sqVidNum) !== -1; }; _sqPlans.forEach(function (pl) { if (!_sqPlan && _sqForVariant(pl) && pl.markets_enabled && Array.isArray(pl.shopify_market_ids) && pl.shopify_market_ids.indexOf(_sqMktId) !== -1) { _sqPlan = pl; } }); if (!_sqPlan) { _sqPlans.forEach(function (pl) { if (!_sqPlan && _sqForVariant(pl) && !pl.markets_enabled) { _sqPlan = pl; } }); } Shopify?.analytics?.publish?.('stoq_accelerated_checkout_clicked', { variant_id: variantId, product_id: (_sqTrack.product && _sqTrack.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 as(_sqTrack.cachedInStockVariantIds && _sqTrack.cachedInStockVariantIds.in_stock_variant_ids); })(), enrolled_plan_id: (_sqPlan && (_sqPlan.shopify_selling_plan_id || _sqPlan.shopify_selling_plan_group_id)) || '', enrolled_plan_provider: (_sqPlan && _sqPlan.inventory_provider) || '', block_enabled: !(_sqTrack.cachedSettings && _sqTrack.cachedSettings.block_accelerated_checkout === false), gate_armed: !!_sqTrack.acceleratedGateArmed, gate_active_at_click: !!(document.documentElement && document.documentElement.classList.contains('stoq-buy-now-pending')), blocked: (function () { try { var rr = window._RestockRocket; return !!(rr && typeof rr.willBlockAcceleratedClick === 'function' && rr.willBlockAcceleratedClick(e)); } 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 (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) { console.debug('STOQ - error applying translations:', e); return settings; } } function setupCartSellingPlanUpdater(settings) { window.addEventListener('stoq:inventory-data-loaded', function(event) { console.debug('STOQ - Inventory data loaded, updating cart selling plans'); if (window._RestockRocket && window._RestockRocket.updateCartSellingPlans) { window._RestockRocket.updateCartSellingPlans() .then(hasUpdates => { if (hasUpdates) { console.debug('STOQ - cart selling plans updated successfully'); } else { console.debu
g('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.status); } return response.json(); }) .then(function(body) { if (body && body .errors && body.errors.length) { throw new Error('Storefront API errors: ' + body.errors.map(function(e) { return e && e.message; }).join(', ')); } return body && body.data; }); } function fetchStorefrontShopMetafield(key) { const cfg = window._RestockRocketConfig; const query = 'query StoqShopMetafield($namespace: String!, $key: String!) { shop { metafield(namespace: $namespace, key: $key) { value } } }'; return storefrontGraphql(query, { namespace: cfg.metafieldNamespace, key: key }) .then(function(data) { const value = data && data.shop && data.shop.metafield && data.shop.metafield.value; if (!value) { throw new Error('Storefront API returned no ' + key + ' metafield value'); } return JSON.parse(value); }); } (function loadStorefrontSettings() { const cfg = window._RestockRocketConfig; if (!cfg.storefrontAccessToken || cfg.disableStorefrontApi === true) return; function run() { // The live-settings read is one more shop
-level metafield fetch, so it // shares fetchStorefrontShopMetafield with the integrations/selling_plans // reads rather than re-issuing the same query + parse. fetchStorefrontShopMetafield('settings') .then(function(settings) { cfg.storefrontSettings = settings; console.debug('STOQ - stored live settings from Storefront API on config.storefrontSettings'); }) .catch(function(e) { console.debug('STOQ - Storefront settings fetch failed (non-fatal):', e && e.message); }); } if (typeof window.requestIdleCallback === 'function') { window.requestIdleCallback(run, { timeout: 5000 }); } else { setTimeout(run, 0); } })(); const cachedSettings = window._RestockRocketConfig.cachedSettings; const validCachedSettings = cachedSettings ? checkSettingsExpiry(cachedSettings) : null; if (validCachedSettings) { console.debug('STOQ - using cached settings'); initializeScripts(validCachedSettings); } else { consol e.debug('STOQ - fetching fresh settings'); const headers = { 'X-Shopify-Shop-Domain': window._RestockRocketConfig.shop || window.Shopify.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 (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._RestockRocketConfig.shop || window.Shopify.shop, 'ngrok-skip-browser-warning': 'skip' } } ) .then(function(response) { if (!response.ok) throw new Error(`Failed to fetch ${endpoint}`); return response.json(); }) .then(function(data) { try { apply(data); } catch (applyError) { console.error('STOQ - apply failed for ' + endpoint + ':', applyError); throw applyError; } }) .catch(function(error) { console.debug(`STOQ - using cached ${endpoint}:`, error.message); }); } function refres hShopConfig(source) { const cfg = window._RestockRocketConfig; const viaEmbed = function() { return fetchEmbedConfig(source.endpoint, source.apply); }; const flagOn = !!cfg.readFlags && cfg.readFlags[source.flag] === true; if (!flagOn || source.embedOnly === true) { return viaEmbed(); } return fetchStorefrontShopMetafield(source.metafieldKey) .then(function(value) { if (!source.isValid(value)) { throw 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',