{"@context":"http:\/\/schema.org\/","@id":"\/products\/uto-morning-pro16-electric-bike#product","@type":"ProductGroup","brand":{"@type":"Brand","name":"Eovolt"},"category":"Folding Bikes","description":"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.\nThe Morning Pro16 is the little brother to the multi award-winning Afternoon Pro20, carrying over all the innovation and features that riders already love, but in a lighter, more compact package — shaving more than 2kg off the weight compared to the Pro20\nFrame \u0026amp; Fork\nThe Pro16 features a carbon fork as part of the weight saving process.\nTotally new proprietary design featuring patented auto locking hinges that allow you to unfold the bike in under 5 seconds. The frame also features a patented integrated battery anti theft lock developed with the cycle lock experts ABUS. The design also results in no part of the frame coming into contact with any other parts of the bike which prevents marking and scratching. The fork now features thru axle dropouts for ease of removing the wheel and a cleaner premium look.\nAutomatic Gearbox\nThe 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.\nNew Seat Post Battery\nEovolt have always believed in housing the battery in the seat post. The Pro range utilises a new patented design with the connector now situated at the top of the frame and the magnetic connector is quick and easy to connect. The new battery now integrates the rear light in the seat post and is powered by the battery.\nGPS Tagging\nThe new Pro frame is designed with a place to secretly hide an Apple or Android air tag so you will be able to track and locate your bike. Asymmetric Centre Kickstand\nThe 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.\nLights\nBoth 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..\nntegrated Phone Mount\nThe 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\nWheels\nAll 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.\nOther features\n\nAll cables are integrated for clean look of the bike.\nThru Axle dropouts for ease of removing wheel and clean look of the frame and fork.\nNew own design folding pedals with non slip surface for better grip.\nRecycled plastic mudguards that always flex back into position rather than bend or dint.\n\nSpecifications\n\nWeight - 18.5kg\nMax Load - 105kg\nUser Height - 1.5m - 1.9m\nFrame \u0026amp; Fork - Aluminium Smooth Welding's - Internal Routing\nTyres - Schwalbe Big Apple 16 x 2.15 - Super Defence 6 Layer Puncture Protection\nFolded Size - 74cm x 70cm x 46cm\nWheels - 20\" Aluminium Rims (Made In France \u0026amp; Built In House)\nBrakes - Shimano MT200 Hydraulic Disc\nMax Speed - 25km\/h\nBottom Bracket - Torque Sensor\nTransmission - Gates Belt Drive\nMotor - Bafang Dual Speed Hub Automatic Gearbox - 36v, 250w, 45nm\nBattery - 7ah, 36v, 250wh LG Cells (as used by Tesla) Made In France\nCharging Time - 3-4hrs\nRange - Up to 50km\nFront Light - Litemove 70 lux (Automatic activation, Powered by battery)\nRear Light - Litemove (Integrated, automatic activation, Powered by battery)\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nRear Rack Included - Yes\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","hasVariant":[{"@id":"\/products\/uto-morning-pro16-electric-bike?variant=56242623775103#variant","@type":"Product","image":"https:\/\/projektride.co.uk\/cdn\/shop\/files\/16-PRO-OPEN-BIKE-rack-arriere17392_600x375_47f802c2-e639-4edf-a3d9-3830eac93bd4.png?v=1760794147\u0026width=1920","name":"UTO Morning Pro16 Electric Bike - Anthacite Grey","offers":{"@id":"\/products\/uto-morning-pro16-electric-bike?variant=56242623775103#offer","@type":"Offer","availability":"http:\/\/schema.org\/OutOfStock","price":"2799.00","priceCurrency":"GBP","url":"https:\/\/projektride.co.uk\/products\/uto-morning-pro16-electric-bike?variant=56242623775103"},"sku":"PR16-AG-V0-UK"},{"@id":"\/products\/uto-morning-pro16-electric-bike?variant=56242623807871#variant","@type":"Product","image":"https:\/\/projektride.co.uk\/cdn\/shop\/files\/16-PRO-OPEN-BIKE-rack-arriere17392_600x375_47f802c2-e639-4edf-a3d9-3830eac93bd4.png?v=1760794147\u0026width=1920","name":"UTO Morning Pro16 Electric Bike - Mineral Blue","offers":{"@id":"\/products\/uto-morning-pro16-electric-bike?variant=56242623807871#offer","@type":"Offer","availability":"http:\/\/schema.org\/OutOfStock","price":"2799.00","priceCurrency":"GBP","url":"https:\/\/projektride.co.uk\/products\/uto-morning-pro16-electric-bike?variant=56242623807871"},"sku":"PR16-MB-V0-UK"},{"@id":"\/products\/uto-morning-pro16-electric-bike?variant=56242623840639#variant","@type":"Product","image":"https:\/\/projektride.co.uk\/cdn\/shop\/files\/16-PRO-OPEN-BIKE-rack-arriere17392_600x375_47f802c2-e639-4edf-a3d9-3830eac93bd4.png?v=1760794147\u0026width=1920","name":"UTO Morning Pro16 Electric Bike - Taupe","offers":{"@id":"\/products\/uto-morning-pro16-electric-bike?variant=56242623840639#offer","@type":"Offer","availability":"http:\/\/schema.org\/OutOfStock","price":"2799.00","priceCurrency":"GBP","url":"https:\/\/projektride.co.uk\/products\/uto-morning-pro16-electric-bike?variant=56242623840639"},"sku":"PR16-TS-V0-UK"}],"name":"UTO Morning Pro16 Electric Bike","productGroupID":"15342849360255","url":"https:\/\/projektride.co.uk\/products\/uto-morning-pro16-electric-bike"}
I'm looking to find out more information about a product, where can I find this?
Please get in touch with a member of the team either by phone (
01313745324
) or email (
[email protected]
) where on of the team will be more than happy to help.
ProjektRide Bike Shop Edinburgh
I'm looking to buy this product, when will it arrive and how much does postage cost?
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.
Postage is free on orders over £50. Orders under £50, our postage charge is £3.99.
We also have a physical store, if you are local please pop in -
ProjektRide Bike Shop Edinburgh
M – 23.98 kg/52.87 lb (with TLR sealant, no tubes)
This bike has a maximum total weight limit (combined weight of bicycle, rider and cargo) of 136 kg (300 lb).
Close
We reserve the right to make changes to the product information contained on this site at any time without notice, including with respect to equipment, specifications, models, colours, materials and pricing. Due to supply chain issues, compatible parts may be substituted at any time without notice.
window._RestockRocketConfig = window._RestockRocketConfig || {}
// Helper function to normalize locale format from hyphen to underscore (e.g., 'en-US' -> 'en_us')
// This matches the backend's Mobility.normalize_locale behavior
// Returns empty string if locale is empty or invalid (matches original behavior)
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 = 1779479031;window._RestockRocketConfig.marketId = 382140642;window._RestockRocketConfig.countryName = 'United Kingdom';
window._RestockRocketConfig.countryIsoCode = 'GB';window._RestockRocketConfig.cartInventoryQuantity = {};window._RestockRocketConfig.cachedSettings = {"id":38500,"shop_id":38436,"currency":"GBP","created_at":"2025-07-26T09:13:57.337Z","updated_at":"2025-12-28T14:44:23.508Z","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_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":"This item needs to be purchased separately. Please check out or clear your cart before adding this item.","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":null,"insert_button_after_selector_index":null,"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":null,"show_button_on_page":false,"insert_button_after_selector_search":null,"show_button_on_search":false,"app_proxy_path_prefix":"/apps/restockrocket-production","collection_link_selector":"","index_link_selector":"","page_link_selector":"","search_link_selector":"","collection_check_link_visibility":true,"collection_buttons_container":null,"index_buttons_container":null,"page_buttons_container":null,"search_buttons_container":null,"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":null,"preorder_add_to_cart_button_selector":"","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":null,"preorder_index_badge_selector":null,"preorder_page_badge_selector":null,"preorder_search_badge_selector":null,"preorder_badge_selector_type":"afterend","preorder_collection_badge_selector_type":"afterend","preorder_button_child_selector":"span","preorder_button_disclaimer_insert_selector":"","preorder_button_disclaimer_insert_selector_type":"afterend","preorder_payment_insert_selector":"","preorder_payment_insert_selector_type":"afterend","preorder_price_container_selector":"","preorder_price_container_selector_insert_type":"afterend","preorder_terms_insert_selector":"","preorder_terms_insert_selector_type":"afterend","preorder_original_price_selector":"","preorder_price_format":"{{amount}} {{currency}}","show_badge_if_any_variant_is_preorder":false,"enable_console_debug":false,"inline_form_enabled":false,"inline_form_selector":null,"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","cache":true,"cached_at":"2026-01-08T16:12:13.364Z","multi_language_enabled":false,"translation_locale":"en"};window._RestockRocketConfig.cachedPreorderVariantIds = {"preorder_variant_ids":[42140096102626,42167799447778,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,43936333103330,43936351224034,43936353714402,43936362889442,43936362922210,43936388153570,43936389333218,43936395526370,43936398508258,43936401522914,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,43981392904418,43981392937186,43981695844578,43981695877346,43981695910114,43981695942882,43981986070754,43981987905762,43981987938530,44052906967266,44052907327714,44052907360482,44052907393250,44052907426018,44052907458786,44052907491554,44052909097186,44052909129954,44140279791842,44140279824610,44140279857378,44140279890146,44140279922914,44140292047074,44140292079842,44140292112610,44140293685474,44140302336226,44140302434530,44140302500066,44140302532834,44140302565602,44140302598370,44140302631138,44140302827746,44140302893282,44140302926050,44140315050210,44140317016290,44140321636578,44140335792354,44140335825122,44140335857890,44140339953890,44140339986658,44140340150498,44140340248802,44140340281570,44140340543714,44140340707554,44140340740322,44140340773090,44140345065698,44140352438498,44140388155618,44140388188386,44140397756642,44140404441314,44140404474082,44195991847138,44195991945442,44329993437410,44329993470178,44329993502946,44329993535714,44329993568482,45068753961186,45068753993954,45069622640866,45069622903010,45069622968546,45069750730978,45069750763746,45353010921698,45353010954466,45353010987234,45353018261730,45353018294498,45353018327266,55569712382335,55569712415103,55569712447871,55569712480639,55570017616255,55570550194559,55570550227327,55604008976767,55638316908927,55638316941695,55638316974463,56220814967167,56220814999935,56220815032703,56270279606655,56270279639423,56270279672191,56314171064703,56314171097471,56398983725439,56398983758207,56398983790975,56399322251647,56565020721535,56565020754303,56565020787071],"updated_at":"2026-05-22T19:33:07Z","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":[43590980075746,43934695653602,43935991955682,43935991988450,43935992742114,43936017449186,43936088228066,43936177291490,43936177324258,43936177357026,43936177389794,43936184271074,43936328843490,43936328876258,43936328909026,43936408535266,43936709837026,43936709869794,43938308620514,43938308686050,43938318811362,43938318844130,43938318876898,43938318909666,43938322579682,43981357514978,43981357547746,43981362430178,43981364887778,43981368951010,43981368983778,43981374882018,43981382320354,43981382353122,43981382385890,43981382418658,43981392773346,43981392838882,43981392871650,43981989085410,43981989118178,43981989150946,43981990887650,43981990920418,43981990953186,44155590443234,44155590476002,44195991879906,44195991912674,44195991978210,44195992010978,44196019929314,44196019962082,44199623721186,44199654424802,44957136617698,44957136650466,44957136683234,44957136814306,44957136879842,45068753731810,45068753764578,45068753797346,45068753830114,45068753862882,45068753895650,45068753928418,45068754026722,45068754059490,45069281657058,45069281689826,45069622771938,45069750534370,45069750567138,45069750599906,45069750632674,45069750665442,45069750698210,45070032535778,45070032568546,45073853972706,45073854005474,46016406520034,46016406552802,46016406585570,46016406618338,55193312723327,55193312756095,55193312821631,55193312854399,55193316721023,55193316753791,55193316819327,55193316852095,55570017550719,55570017583487,55877830541695,55877830574463,55877830607231,55877830639999,42133734097122,42133760966882,42133779153122,42133782364386,42133808021730,42133855994082,42133857042658,42133920153826,42133943910626,42134012788962,42134028943586,42134056698082,42134144581858,42134169092322,42134186557666,42140055666914,42140055797986,42156834128098,42156852216034,42156944425186,42156975751394,42157276561634,42157476085986,42157681082594,42157845184738,42161483514082,42161483546850,42161703092450,42161703125218,42161769218274,42162395414754,42162395447522,42163244171490,42163247939810,42165834744034,42165834776802,42166810804450,42167775494370,42167775527138,42167775559906,42170449199330,42170867777762,42170877313250,42170946879714,42170955464930,42170967982306,42205154148578,42205161849058,42205166207202,42205172990178,42205173022946,42205173055714,42205173088482,42205173121250,42205174989026,42205175021794,42205175054562,42205176430818,42205176463586,42205176496354,42205176529122,42205177118946,42205177151714,42205177184482,42205177217250,42205201694946,42205201727714,42207124095202,42207132156130,42211700244706,42211700277474,42211700375778,42211813359842,42211813392610,42211813425378,42211813458146,42211813490914,42215353909474,42215353942242,42215353975010,42215354007778,42309115412706,42354619154658,42354619482338,42354619547874,42354669027554,42354669093090,42452285784290,42500482498786,42514860802274,42514860835042,42514860867810,42543702376674,42562562490594,42577999888610,42603186749666,42603186782434,42603337056482,42603347476706,42627516039394,42695182942434,42804934377698,43000663933154,43000791630050,43010895675618,43010895708386,43010900459746,43010957902050,43012307353826,43012307386594,43012307419362,43012486594786,43017325641954,43064942461154,43064942493922,43064951341282,43067643855074,43067643887842,43067668627682,43067673215202,43107806445794,43169620263138,43182366949602,43414855287010,43525453676770,43525453742306,43525453775074,43525453807842,43525453840610,43525453938914,43557711020258,43590980108514,43724401049826,43725342146786,43725342212322,43725342245090,43725343916258,43725343949026,43725371703522,43725483737314,43725483770082,43725483868386,43727258845410,43727342207202,43727599304930,43766825386210,43766825418978,43766825451746,43766825484514,43847032504546,43847032537314,43847032570082,43847032602850,43854809104610,43854820016354,43854833746146,43861164490978,43866540015842,43866540048610,43866540081378,43916542247138,43933115220194,43933117382882,43933117415650,43933117448418,43934683922658,43934711349474,43934711382242,43936656326882,43936656392418,43936656425186,43936664879330,43936664912098,43936665010402,43936684310754,43936684343522,43936684409058,43936684441826,43936694763746,43936694796514,43936694829282,43936694862050,43936694894818,43936694927586,43936694960354,43936694993122,43974777766114,43974777864418,43981329137890,43981329170658,43981565395170,43981565427938,43981565493474,43981565559010,43981565591778,44049903780066,44049911185634,44049932779746,44049932878050,44049933041890,44140579160290,44199623688418,44199668023522,44199668056290,44199668089058,44199675560162,44199675592930,44199675625698,44199689257186,44199689289954,44202699653346,44202699686114,44215801413858,44330700374242,44393934487778,44393967059170,44441822789858,44441822822626,44441826590946,44455205372130,44455223132386,44455241941218,44459099455714,44462104314082,44566556410082,44566558343394,44566559719650,44566560735458,44566561521890,44891526463714,44891532951778,44891533869282,44891533902050,44891533934818,44891533967586,44891534164194,44891534229730,44891534262498,44891534819554,44891534852322,44891535376610,44891535474914,44891535540450,44891535573218,44891535638754,44891535671522,44891535704290,44891535802594,44891536031970,44915105104098,44915183288546,44915183321314,44915183386850,44915183419618,44915183452386,45099922391266,45099922424034,45099922456802,45099922489570,45099922522338,45610939089122,45610939121890,45610939154658,45610939187426,45610939220194,45610939252962,45610952196322,45610952229090,45610952261858,45610952294626,45610952327394,45610952360162,45610963206370,45610963239138,45610963271906,45610963304674,45610963337442,45610963370210,45661684203746,45661712974050,45661713006818,45661753213154,45661771923682,45661795647714,45661795680482,45661809443042,45662670389474,45662670422242,45662670455010,45662670487778,45662687166690,45662691066082,45662746804450,45662746837218,45662746869986,45662746902754,45662746935522,45662746968290,45662747001058,45662747033826,45662747066594,45662747099362,45662747132130,45662747164898,45662747197666,45662784782562,45662784815330,45662784848098,45662784880866,45662784913634,45662788518114,45662788550882,45662788583650,45662788616418,45662788649186,45662860017890,45662860050658,45662860083426,45662860116194,45662860148962,45662860181730,45662860214498,45662860247266,45662860280034,45662860312802,45662860345570,45662860378338,45662860411106,45662934728930,45662934761698,45662934794466,45662934827234,45662934860002,45662934892770,45662934925538,45662934958306,45662946033890,45662975295714,45662975328482,45662975361250,45662975394018,45662975426786,45662975459554,45662975492322,45662975525090,45662975557858,45662975590626,45662975623394,45662975656162,45663035785442,45663035818210,45663035850978,45663035883746,45663035916514,45663035949282,45663035982050,45663036047586,45663036080354,45663036113122,45663036145890,45663059575010,45664124109026,45664132563170,45664132595938,45664155533538,45664159236322,45664159301858,45671616970978,45671617593570,45671617659106,45671617691874,45671617724642,45671617790178,45671618805986,45671618838754,45671619920098,45671619952866,45671620640994,45671621034210,45671621066978,45671621099746,45671621132514,45671622246626,45671622279394,45671622312162,45671622344930,45694278959330,45694281089250,45694283186402,45694284103906,45694284890338,45694285021410,45694288822498,45694290297058,45694290821346,45694291968226,45694292197602,45694293475554,45694293803234,45694293836002,45696083656930,45696083689698,45696083722466,45760534937826,45760534970594,45760537592034,45760542507234,45760550535394,45760550568162,45760552730850,45760558137570,45760558268642,45760558596322,45764606394594,45764607803618,45764613308642,45764615897314,45764617928930,45764620157154,45764621664482,45764621697250,45767010451682,45767010517218,45767010549986,45767010746594,45767270531298,45767291371746,45767298711778,45767301726434,45767307264226,45767310868706,45767318601954,45817747276002,45817747308770,45817747341538,45817749111010,45817749143778,45817749176546,45817751470306,45817751503074,45817751535842,45817751568610,45817763004642,45817765986530,45817769492706,45817769525474,45817769558242,45817770279138,45817770311906,45817770344674,45817770377442,45817770410210,45817773261026,45817776144610,45817776177378,45817776210146,45817778110690,45817780601058,45817780633826,45817780666594,45817780699362,45817780732130,45820457779426,45820457812194,45820457844962,45820457877730,45820457910498,45820457943266,45820457976034,45820458008802,45820514762978,45820514795746,45820517220578,45820519121122,45820519153890,45820527444194,45820527476962,45820546908386,45820546941154,45820547006690,45820551495906,45820551528674,45820551561442,45820551594210,45820575875298,45820575908066,45820575940834,45820590981346,45820591014114,45820624994530,45820625027298,45820630040802,45820633120994,45820633153762,45820633186530,45820633219298,45823204065506,45823204098274,45823204131042,45823204163810,45823204196578,45823204229346,45823204262114,45823204294882,45823204327650,45823204360418,45823204393186,45823204425954,45823219564770,45823219597538,45823219630306,45823219663074,45823219695842,45823219728610,45823219761378,45823219794146,45823219826914,45823219859682,45823219892450,45823219925218,45823222808802,45823222841570,45
79,56504839209343,56504839242111,56504839274879,56504839307647,56504839340415,56504839373183,56504921981311,56504922014079,56504922046847,56504922079615,56504922112383,56504922145151,56504922177919,56504922210687,56504922243455,56504950489471,56504950522239,56504950555007,56504950587775,56504950620543,56504950653311,56504950686079,56504950718847,56504950751615,56504961139071,56504961171839,56504961204607,56504961237375,56504961270143,56504961302911,56504961335679,56504961368447,56504961401215,56505064489343,56505064522111,56505064554879,56505064587647,56505064620415,56505064653183,56505064685951,56505064718719,56505064751487,56505064784255,56505064817023,56505064849791,56505064882559,56505064915327,56505064948095,56505064980863,56505065013631,56505065046399,56518714458495,56518714491263,56518714524031,56518714556799,56518714589567,56518714622335,56518715998591,56518716031359,56518716064127,56518716096895,56518716129663,56518716162431,56518716195199,56518716227967,56518716260735,56518716293503,56518716326271,5
6518716359039,56518716391807,56518716424575,56518716457343,56518716490111,56518716522879,56518716785023,56518716817791,56518716850559,56518716883327,56518716916095,56518716981631,56518717014399,56518717047167,56518717079935,56518717112703,56518717145471,56518717374847,56518717473151,56518717538687,56518717604223,56518717636991,56518717669759,56518717833599,56518717866367,56518717899135,56518717931903,56518717964671,56518717997439,56518718030207,56518718062975,56518718095743,56518718128511,56518718161279,56518718194047,56518790545791,56518790578559,56518790611327,56518790644095,56518790676863,56518805651839,56518805684607,56518805717375,56518805750143,56518805782911,56561153933695,56766086054271,56766086087039,56766086119807,56766086152575,56766086218111,56766086349183,56766086381951,56766086807935,56766086840703,56766086873471,56766183342463,56766183375231,56766183407999,56766183473535,56766183506303,56766183539071,56766183670143,56766183702911,56766183768447,56766183801215,56766183997823,56766184128895,56766184161663,56766184194431,57284689789311,57284689822079,57284689854847,57284689887615,57284689920383,57284689985919,57284690018687,57284690051455,57284690116991,57284690149759,57284690182527,57284690215295,57284690248063,57284690313599,57284690346367,57284690379135,57284690411903,57311934513535,57311934546303,57311934579071,57311934611839,57318991724927,57318991790463,57318991823231,57319008797055,57319008829823,57319008862591,57319008895359,57392715465087,57392715497855,57392715530623,57392715563391,57392715596159],"updated_at":"2026-05-20T00:35:44Z","market_locations_enabled":false,"market_id":13779632354,"preorder_location_filter_enabled":false,"preorder_location_filter_ids":[],"collection_id":null};window._RestockRocketConfig.cachedOutOfStockVariantIds = { out_of_stock_variant_ids: [] };window._RestockRocketConfig.cachedVariantPreorderLimits = {"variant_preorder_limits":{},"updated_at":"2026-05-22T19:13:25Z","shopify_market_id":382140642,"market_locations_enabled":false};
window._RestockRocketConfig.ca
chedVariantPreorderLimitsMarketKey = "variant_preorder_limits_for_market_382140642";window._RestockRocketConfig.cachedVariantShippingTexts = {"variant_shipping_texts":{},"updated_at":"2026-05-22T19:13:25Z","shopify_market_id":382140642,"market_locations_enabled":false};
window._RestockRocketConfig.cachedVariantShippingTextsMarketKey = "variant_shipping_texts_for_market_382140642";window._RestockRocketConfig.sellingPlans = [{"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_descri
ption_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":"Shipping: {{ date }}","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_pr
ovider":"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,"market_id":13779632354,"shopify_market_ids":[],"use_shopify_selling_plan":true,"use_simplified_shipping_text":false,"translations":{},"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_descripti
on":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":null,"countdown_timer_custom_end_date":null,"countdown_timer_starts_text":null,"countdown_timer_ends_text":null,"schedule_offer":false,"schedule_start_date":null,"schedule_end_date":null,"updated_at":"2025-08-19T10:05:43.042Z","allow_mixed_cart":true,"mixed_cart_error_message":"Preorders must be purchased separately from regular items. Ple
ase 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}];(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":"Shipping: {{ date }}","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,"e
nable_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,"market_id":13779632354,"shopify_market_ids":[],"use_shopify_selling_plan":true,"use_simplified_shipping_text":false,"translations":{},"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,"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,"schedule_offer":false,"schedule_start_date":null,"schedule_end_date":null,"updated_at":"2025-08-19T10:05:43.042Z","allow_mixed_cart":true,"mixed_cart_error_message":"Preorders must be purYou May Also Likechased 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}],"disabled_plan_ids":[713813721471,713176482175,714631872895],"cached_at":"2026-04-09T09:16:46Z"};
if (cachedData && typeof cachedData === 'object' && cachedData.cached_at) {
// Find the maximum updated_at from all items in old array
const oldPlans = window._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 (useCached) {
if (Array.isArray(cachedData.plans)) {
window._RestockRocketConfig.sellingPlans = cachedData.plans;
// Only use disabled_plan_ids when using cached plans
window._RestockRocketConfig.disabledSellingPlanIds = cachedData.disabled_
plan_ids || [];
console.debug('[RR] Using selling plans from cachedSellingPlans (cached_at: ' + cachedData.cached_at + ')');
}
} else {
// When using old format (stale cache), don't trust disabled_plan_ids
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,"quantityLimit
Disabled":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":15342849360255,"title":"UTO Morning Pro16 Electric Bike","handle":"uto-morning-pro16-electric-bike","description":"\u003cp\u003eThe 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.\u003c\/p\u003e\n\u003cp\u003eThe Morning Pro16 is the little brother to the multi award-winning Afternoon Pro20, carrying over all the innovation and features that riders already love, but in a lighter, more compact package — shaving more than 2kg off the weight compared to the Pro20\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eFrame \u0026amp; Fork\u003c\/strong\u003e\u003c\/p\u003e\n\u003c
p\u003eThe Pro16 features a carbon fork as part of the weight saving process.\u003c\/p\u003e\n\u003cp\u003eTotally new proprietary design featuring patented auto locking hinges that allow you to unfold the bike in under 5 seconds. The frame also features a patented integrated battery anti theft lock developed with the cycle lock experts ABUS. The design also results in no part of the frame coming into contact with any other parts of the bike which prevents marking and scratching. The fork now features thru axle dropouts for ease of removing the wheel and a cleaner premium look.\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eAutomatic Gearbox\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003eThe 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 complic
ated maintenance.\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eNew Seat Post Battery\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003eEovolt have always believed in housing the battery in the seat post. The Pro range utilises a new patented design with the connector now situated at the top of the frame and the magnetic connector is quick and easy to connect. The new battery now integrates the rear light in the seat post and is powered by the battery.\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eGPS Tagging\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003eThe new Pro frame is designed with a place to secretly hide an Apple or Android air tag so you will be able to track and locate your bike. Asymmetric Centre Kickstand\u003c\/p\u003e\n\u003cp\u003eThe 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 pos
ition. This results in the bike being significantly lighter when lifting the folded bike without the battery into your car or motorhome.\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eLights\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003eBoth 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..\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003entegrated Phone Mount\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003eThe 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\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eWheels\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003eAll 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.\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eOther features\u003c\/strong\u003e\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eAll cables are integrated for clean look of the bike.\u003c\/li\u003e\n\u003cli\u003eThru Axle dropouts for ease of removing wheel and clean look of the frame and fork.\u003c\/li\u003e\n\u003cli\u003eNew own design folding pedals with non slip surface for better grip.\u003c\/li\u003e\n\u003cli\u003eRecycled plastic mudguards that always flex back into position rather than bend or dint.\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cp\u003e\u003cstrong\u003eSpecifications\u003c\/strong\u003e\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eWeight - 18.5kg\u003c\/li\u003e\n\u003cli\u003eMax Load - 105kg\u003c\/li\u003e\n\u003cli\u003eUser Height - 1.5m - 1.9m\u003c\/li\u003e\n\u003cli\u003eFrame \u0026amp; Fork - Aluminium Smooth Welding's - Internal Routing\u003c\/li\u003e\n\u003cli\u003eTyres - Schwalbe Big Apple 16 x 2.15 - Super Recently viewedDefence 6 Layer Puncture Protection\u003c\/li\u003e\n\u003cli\u003eFolded Size - 74cm x 70cm x 46cm\u003c\/li\u003e\n\u003cli\u003eWheels - 20\" Aluminium Rims (Made In France \u0026amp; Built In House)\u003c\/li\u003e\n\u003cli\u003eBrakes - Shimano MT200 Hydraulic Disc\u003c\/li\u003e\n\u003cli\u003eMax Speed - 25km\/h\u003c\/li\u003e\n\u003cli\u003eBottom Bracket - Torque Sensor\u003c\/li\u003e\n\u003cli\u003eTransmission - Gates Belt Drive\u003c\/li\u003e\n\u003cli\u003eMotor - Bafang Dual Speed Hub Automatic Gearbox - 36v, 250w, 45nm\u003c\/li\u003e\n\u003cli\u003eBattery - 7ah, 36v, 250wh LG Cells (as used by Tesla) Made In France\u003c\/li\u003e\n\u003cli\u003eCharging Time - 3-4hrs\u003c\/li\u003e\n\u003cli\u003eRange - Up to 50km\u003c\/li\u003e\n\u003cli\u003eFront Light - Litemove 70 lux (Automatic activation, Powered by battery)\u003c\/li\u003e\n\u003cli\u003eRear Light - Litemove (Integrated, automatic activation, Powered by battery)\n\u003cul\u003e\n\u003cli style=\"list-style-type: none;\"\u003e\n\u003cul\u003e\n\u003cli style=\"list-style-type: none;\"\u003e\n\u003cul\u003e\n\u003cli style=\"list-style-type: none;\"\u003e\n\u003cul\u003e\n\u003cli style=\"list-style-type: none;\"\u003e\n\u003cul\u003e\n\u003cli style=\"list-style-type: none;\"\u003e\n\u003cul\u003e\n\u003cli style=\"list-style-type: none;\"\u003e\n\u003cul\u003e\n\u003cli style=\"list-style-type: none;\"\u003e\n\u003cul\u003e\n\u003cli\u003eRear Rack Included - Yes\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e","published_at":"2025-10-18T14:44:33+01:00","created_at":"2025-10-18T14:44:31+01:00","vendor":"Eovolt","type":"Bicycles","tags":["Eovolt","spo-cs-disabled","spo-default","spo-disabled","spo-notify-me-disabled","UTO"],"price":279900,"price_min":279900,"pr
ice_max":279900,"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":56242623775103,"title":"Anthacite Grey","option1":"Anthacite Grey","option2":null,"option3":null,"sku":"PR16-AG-V0-UK","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"UTO Morning Pro16 Electric Bike - Anthacite Grey","public_title":"Anthacite Grey","options":["Anthacite Grey"],"price":279900,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":56242623807871,"title":"Mineral Blue","option1":"Mineral Blue","option2":null,"option3":null,"sku":"PR16-MB-V0-UK","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"UTO Morning Pro16 Electric Bike - Mineral Blue","public_title":"Mineral Blue","options":["Mineral Blue"],"pric
e":279900,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":56242623840639,"title":"Taupe","option1":"Taupe","option2":null,"option3":null,"sku":"PR16-TS-V0-UK","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"UTO Morning Pro16 Electric Bike - Taupe","public_title":"Taupe","options":["Taupe"],"price":279900,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}}],"images":["\/\/projektride.co.uk\/cdn\/shop\/files\/16-PRO-OPEN-BIKE-rack-arriere17392_600x375_47f802c2-e639-4edf-a3d9-3830eac93bd4.png?v=1760794147","\/\/projektride.co.uk\/cdn\/shop\/files\/16-PRO-FOLD-BIKE16462_600x375_aee5b070-cbe2-4621-9cdb-8b9f8af68f77.png?v=1760794157","\/\/projektride.co.uk\/cdn\/shop\/files\/16-PRO-OPEN-BI
KE-rack-arriere17393_1200x750_31b8530d-1195-4fab-93b0-88a7bce6aca3.png?v=1760794279","\/\/projektride.co.uk\/cdn\/shop\/files\/16-PRO-OPEN-BIKE-rack-arriere17391_600x375_eabf2011-58bd-48dd-b602-ee304274454b.png?v=1760794291"],"featured_image":"\/\/projektride.co.uk\/cdn\/shop\/files\/16-PRO-OPEN-BIKE-rack-arriere17392_600x375_47f802c2-e639-4edf-a3d9-3830eac93bd4.png?v=1760794147","options":["Colour"],"media":[{"alt":null,"id":68214757392767,"position":1,"preview_image":{"aspect_ratio":1.6,"height":375,"width":600,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/16-PRO-OPEN-BIKE-rack-arriere17392_600x375_47f802c2-e639-4edf-a3d9-3830eac93bd4.png?v=1760794147"},"aspect_ratio":1.6,"height":375,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/16-PRO-OPEN-BIKE-rack-arriere17392_600x375_47f802c2-e639-4edf-a3d9-3830eac93bd4.png?v=1760794147","width":600},{"alt":null,"id":68214760702335,"position":2,"preview_image":{"aspect_ratio":1.6,"height":375,"width":600,"src":"\/\/projektride.co.uk\/cdn\/shop\
/files\/16-PRO-FOLD-BIKE16462_600x375_aee5b070-cbe2-4621-9cdb-8b9f8af68f77.png?v=1760794157"},"aspect_ratio":1.6,"height":375,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/16-PRO-FOLD-BIKE16462_600x375_aee5b070-cbe2-4621-9cdb-8b9f8af68f77.png?v=1760794157","width":600},{"alt":null,"id":68214796353919,"position":3,"preview_image":{"aspect_ratio":1.6,"height":750,"width":1200,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/16-PRO-OPEN-BIKE-rack-arriere17393_1200x750_31b8530d-1195-4fab-93b0-88a7bce6aca3.png?v=1760794279"},"aspect_ratio":1.6,"height":750,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/16-PRO-OPEN-BIKE-rack-arriere17393_1200x750_31b8530d-1195-4fab-93b0-88a7bce6aca3.png?v=1760794279","width":1200},{"alt":null,"id":68214799565183,"position":4,"preview_image":{"aspect_ratio":1.6,"height":375,"width":600,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/16-PRO-OPEN-BIKE-rack-arriere17391_600x375_eabf2011-58bd-48dd-b602-ee304274454b.png?v=1760794291"},"aspect_r
atio":1.6,"height":375,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/16-PRO-OPEN-BIKE-rack-arriere17391_600x375_eabf2011-58bd-48dd-b602-ee304274454b.png?v=1760794291","width":600}],"requires_selling_plan":false,"selling_plan_groups":[],"content":"\u003cp\u003eThe 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.\u003c\/p\u003e\n\u003cp\u003eThe Morning Pro16 is the little brother to the multi award-winning Afternoon Pro20, carrying over all the innovation and features that riders already love, but in a lighter, more compact package — shaving more than 2kg off the weight compared to the Pro20\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eFrame \u0026amp; Fork\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003eThe Pro16 features a carbon fork as part of the weight saving process.\u003c\/p\u003e\n\u003cp\
u003eTotally new proprietary design featuring patented auto locking hinges that allow you to unfold the bike in under 5 seconds. The frame also features a patented integrated battery anti theft lock developed with the cycle lock experts ABUS. The design also results in no part of the frame coming into contact with any other parts of the bike which prevents marking and scratching. The fork now features thru axle dropouts for ease of removing the wheel and a cleaner premium look.\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eAutomatic Gearbox\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003eThe 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.\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eNew Seat Post Battery\u003c\/strong\u
003e\u003c\/p\u003e\n\u003cp\u003eEovolt have always believed in housing the battery in the seat post. The Pro range utilises a new patented design with the connector now situated at the top of the frame and the magnetic connector is quick and easy to connect. The new battery now integrates the rear light in the seat post and is powered by the battery.\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eGPS Tagging\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003eThe new Pro frame is designed with a place to secretly hide an Apple or Android air tag so you will be able to track and locate your bike. Asymmetric Centre Kickstand\u003c\/p\u003e\n\u003cp\u003eThe 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.\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eLights\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003eBoth 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..\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003entegrated Phone Mount\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003eThe 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\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eWheels\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003eAll 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.\u003c\/p\u003e\n\u003cp\u003e\u003cstron
g\u003eOther features\u003c\/strong\u003e\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eAll cables are integrated for clean look of the bike.\u003c\/li\u003e\n\u003cli\u003eThru Axle dropouts for ease of removing wheel and clean look of the frame and fork.\u003c\/li\u003e\n\u003cli\u003eNew own design folding pedals with non slip surface for better grip.\u003c\/li\u003e\n\u003cli\u003eRecycled plastic mudguards that always flex back into position rather than bend or dint.\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cp\u003e\u003cstrong\u003eSpecifications\u003c\/strong\u003e\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eWeight - 18.5kg\u003c\/li\u003e\n\u003cli\u003eMax Load - 105kg\u003c\/li\u003e\n\u003cli\u003eUser Height - 1.5m - 1.9m\u003c\/li\u003e\n\u003cli\u003eFrame \u0026amp; Fork - Aluminium Smooth Welding's - Internal Routing\u003c\/li\u003e\n\u003cli\u003eTyres - Schwalbe Big Apple 16 x 2.15 - Super Defence 6 Layer Puncture Protection\u003c\/li\u003e\n\u003cli\u003eFolded Size - 74cm x 70cm x 46cm\u0
03c\/li\u003e\n\u003cli\u003eWheels - 20\" Aluminium Rims (Made In France \u0026amp; Built In House)\u003c\/li\u003e\n\u003cli\u003eBrakes - Shimano MT200 Hydraulic Disc\u003c\/li\u003e\n\u003cli\u003eMax Speed - 25km\/h\u003c\/li\u003e\n\u003cli\u003eBottom Bracket - Torque Sensor\u003c\/li\u003e\n\u003cli\u003eTransmission - Gates Belt Drive\u003c\/li\u003e\n\u003cli\u003eMotor - Bafang Dual Speed Hub Automatic Gearbox - 36v, 250w, 45nm\u003c\/li\u003e\n\u003cli\u003eBattery - 7ah, 36v, 250wh LG Cells (as used by Tesla) Made In France\u003c\/li\u003e\n\u003cli\u003eCharging Time - 3-4hrs\u003c\/li\u003e\n\u003cli\u003eRange - Up to 50km\u003c\/li\u003e\n\u003cli\u003eFront Light - Litemove 70 lux (Automatic activation, Powered by battery)\u003c\/li\u003e\n\u003cli\u003eRear Light - Litemove (Integrated, automatic activation, Powered by battery)\n\u003cul\u003e\n\u003cli style=\"list-style-type: none;\"\u003e\n\u003cul\u003e\n\u003cli style=\"list-style-type: none;\"\u003e\n\u003cul\u003e\n\u003cli style=\"l
ist-style-type: none;\"\u003e\n\u003cul\u003e\n\u003cli style=\"list-style-type: none;\"\u003e\n\u003cul\u003e\n\u003cli style=\"list-style-type: none;\"\u003e\n\u003cul\u003e\n\u003cli style=\"list-style-type: none;\"\u003e\n\u003cul\u003e\n\u003cli style=\"list-style-type: none;\"\u003e\n\u003cul\u003e\n\u003cli\u003eRear Rack Included - Yes\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e"};
window._RestockRocketConfig.variantsInventoryPolicy = {56242623775103 : "deny",56242623807871 : "deny",56242623840639 : "deny",};
window._RestockRocketConfig.variantsInventoryQuantity = {56242623775103 : parseInt("0"),56242623807871 : parseInt("0"),56242623840639 : parseInt("0"),};
window._RestockRocketConfig.variantsPreorderCount = {56242
623775103 : parseInt(""),56242623807871 : parseInt(""),56242623840639 : parseInt(""),};
window._RestockRocketConfig.variantsPreorderCountForMarket = {56242623775103 : null,56242623807871 : null,56242623840639 : null,};
window._RestockRocketConfig.variantsPreorderMaxCount = {56242623775103 : parseInt(""),56242623807871 : parseInt(""),56242623840639 : parseInt(""),};
window._RestockRocketConfig.variantsPreorderMaxCountForMarket = {56242623775103 : null,56242623807871 : null,56242623840639 : null,};
window._RestockRocketConfig.variantsShippingText = {56242623775103 : "",56242623807871 : "",56242623840639 : "",};
window._RestockRocketConfig.variantsShippingTextForMarket = {56242623775103 : null,56242623807871 : null,56242623840639 : null,};
window._RestockRocketConfig.selected_variant_id = 56242623775103;
window._RestockRocketConfig.selected_variant_available = window._RestockRocketConfig.product.variants.find(function(variant) { return variant.id == window._RestockRocketConfig.selecte
d_variant_id }).available;window._RestockRocketConfig.scriptUrlProduct = 'https://cdn.shopify.com/extensions/019e4f36-8edf-7309-a4b1-1c3361b2914d/restockrocket-1-515/assets/restockrocket-product.js'
window._RestockRocketConfig.scriptUrlCollection = 'https://cdn.shopify.com/extensions/019e4f36-8edf-7309-a4b1-1c3361b2914d/restockrocket-1-515/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 = 15 * 60; // 15 minutes 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
<
= 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
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(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 ||
!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];
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 && 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.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.Shop
ify.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(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) {
// Apply failures are programming bugs (e.g. response shape changed
// server-side and the assignment threw). Surface them as console.error
// so they're visible in browser logs, then re-throw to fall through
// to the same Liquid-cached fallback as a fetch failure.
console.error('STOQ - apply failed for ' + endpoint + ':', applyError);
throw applyError;
}
})
.catch(function(error) {
console.debug(`STOQ - using cached ${endpoint}:`, error.message);
});
}
function initializeScripts(settings) {
settings = applyTranslations(settings);
window._Re
stockRocketConfig.settings = settings;
console.debug(`STOQ - settings configured for ${window._RestockRocketConfig.pageType}`);
// Stale-Liquid resilience (default-on, per-shop opt-out via the
// `disable_refresh_on_stale_liquid` Toggle, surfaced as the negative
// `disable_refresh_on_stale_liquid` flag in settings.json so that
// `undefined` -- in CDN-cached metafield payloads that predate this
// key -- reads as `!undefined === true` and gets default-on behavior
// immediately, no metafield rewrite required).
// When the Liquid CDN cache is older than LIQUID_CACHE_MAX_AGE the in-page
// selling_plans / integrations metafields can be wrong; refresh both from
// the API before launching scripts. Race against a 1000ms timeout so a slow
// API can't block init indefinitely. If the timeout wins, the in-flight
// fetches still complete and update window._RestockRocketConfig — the
// bundle re-reads sellingPlans/integrations on every interaction, so the
//
late-arriving values benefit subsequent renders even though the first
// paint may use the Liquid-cached values. On any failure the existing
// Liquid-loaded values stay in place via fetchEmbedConfig's catch.
if (!window._RestockRocketConfig.isLiquidCacheFresh && !settings.disable_refresh_on_stale_liquid) {
console.debug('STOQ - Liquid cache stale, refreshing selling_plans + integrations');
Promise.race([
Promise.all([
fetchEmbedConfig('selling_plans', function(data) {
if (data && Array.isArray(data.plans)) {
window._RestockRocketConfig.sellingPlans = data.plans;
window._RestockRocketConfig.disabledSellingPlanIds = data.disabled_plan_ids || [];
}
}),
fetchEmbedConfig('integrations', function(data) {
if (Array.isArray(data)) {
window._RestockRocketConfig.integrations = data;
}
})
]),
new Promise(function(resolve) { setTimeout(resolve,
1000); })
]).then(function() { loadScripts(settings); });
return;
}
loadScripts(settings);
}
function loadScripts(settings) {
// 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._RestockRocketConfig.scriptUrlCollection);
} else if(window._RestockRocketConfig.pageType === 'index' && (settings.show_button_on_index || settings.preorder_index_enabled)) {
createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection);
} else if(window._RestockRocketConfig.pageType === 'search' && (settings.show_button_on_search || settings.preorder_search_enabled)) {
createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection);
} else if(window._RestockRocketConfig.pageType === 'page' && (settings.show_button_on_page || settings.preorder_page_enabled)) {
createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection);
} else if(window._RestockRocketConfig.pageType === 'product') {
createRestockRocketScript(window._RestockRocketConfig.scriptUrlProduct);
} else if(hijackIntegration) {
createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection);
} else if(settings.preorder_enabled) {
// Load the bundle so updateCartSellingPlans runs even when hijack is not enabled
createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection);
} else {
console.debug(`STOQ - no scripts enabled for ${window._RestockRock
etConfig.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);
}
}