From 828b600229daa21e395a2cc8c5c62d746e1943f2 Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Mon, 1 Mar 2021 22:45:18 +0100 Subject: [PATCH 01/39] Implement serving app's static files from middleware server; --- package-lock.json | 576 ++++++++++++++++++++++++++++- package.json | 8 +- src/database/database-index.ts | 1 + src/middleware/middleware-index.ts | 9 + webpack.config.js | 84 +++-- 5 files changed, 635 insertions(+), 43 deletions(-) diff --git a/package-lock.json b/package-lock.json index ab352ae4..c5b724ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1987,6 +1987,12 @@ "defer-to-connect": "^1.0.1" } }, + "@types/anymatch": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", + "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==", + "dev": true + }, "@types/babel__core": { "version": "7.1.12", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.12.tgz", @@ -2068,6 +2074,16 @@ "@types/node": "*" } }, + "@types/connect-history-api-fallback": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.3.tgz", + "integrity": "sha512-7SxFCd+FLlxCfwVwbyPxbR4khL9aNikJhrorw8nUIOqeuooc9gifBuDQOJw5kzN7i6i3vLn9G8Wde/4QDihpYw==", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, "@types/express": { "version": "4.17.11", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.11.tgz", @@ -2110,6 +2126,32 @@ "@types/node": "*" } }, + "@types/html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==", + "dev": true + }, + "@types/http-proxy": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.5.tgz", + "integrity": "sha512-GNkDE7bTv6Sf8JbV2GksknKOsk7OznNYHSdrtvPJXO0qJ9odZig6IZKUi5RFGi6d1bf6dgIAe4uXi3DBc7069Q==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/http-proxy-middleware": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@types/http-proxy-middleware/-/http-proxy-middleware-0.19.3.tgz", + "integrity": "sha512-lnBTx6HCOUeIJMLbI/LaL5EmdKLhczJY5oeXZpX/cXE4rRqb3RmV7VcMpiEfYkmTjipv3h7IAyIINe4plEv7cA==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/http-proxy": "*", + "@types/node": "*" + } + }, "@types/istanbul-lib-coverage": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", @@ -2246,12 +2288,95 @@ "@types/node": "*" } }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, "@types/stack-utils": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", "dev": true }, + "@types/tapable": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.6.tgz", + "integrity": "sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==", + "dev": true + }, + "@types/uglify-js": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.12.0.tgz", + "integrity": "sha512-sYAF+CF9XZ5cvEBkI7RtrG9g2GtMBkviTnBxYYyq+8BWvO4QtXfwwR6a2LFwCi4evMKZfpv6U43ViYvv17Wz3Q==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@types/webpack": { + "version": "4.41.26", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.26.tgz", + "integrity": "sha512-7ZyTfxjCRwexh+EJFwRUM+CDB2XvgHl4vfuqf1ZKrgGvcS5BrNvPQqJh3tsZ0P6h6Aa1qClVHaJZszLPzpqHeA==", + "dev": true, + "requires": { + "@types/anymatch": "*", + "@types/node": "*", + "@types/tapable": "*", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@types/webpack-dev-server": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@types/webpack-dev-server/-/webpack-dev-server-3.11.1.tgz", + "integrity": "sha512-rIb+LtUkKnh7+oIJm3WiMJONd71Q0lZuqGLcSqhZ5qjN9gV/CNmZe7Bai+brnBPZ/KVYOsr+4bFLiNZwjBicLw==", + "dev": true, + "requires": { + "@types/connect-history-api-fallback": "*", + "@types/express": "*", + "@types/http-proxy-middleware": "*", + "@types/serve-static": "*", + "@types/webpack": "*" + } + }, + "@types/webpack-sources": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.0.tgz", + "integrity": "sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, "@types/yargs": { "version": "15.0.12", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.12.tgz", @@ -3705,6 +3830,12 @@ "multicast-dns-service-types": "^1.1.0" } }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, "boxen": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", @@ -4111,12 +4242,40 @@ } } }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + } + } + }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -4142,9 +4301,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001116", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001116.tgz", - "integrity": "sha512-f2lcYnmAI5Mst9+g0nkMIznFGsArRmZ0qU+dnq8l91hymdc2J3SFbiPhOJEeDqC1vtE8nc1qNQyklzB8veJefQ==", + "version": "1.0.30001192", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001192.tgz", + "integrity": "sha512-63OrUnwJj5T1rUmoyqYTdRWBqFFxZFlyZnRRjDR8NSUQFB6A+j/uBORU/SyJ5WzDLg4SPiZH40hQCBNdZ/jmAw==", "dev": true }, "capture-exit": { @@ -4269,6 +4428,23 @@ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" }, + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "cli-boxes": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", @@ -4734,6 +4910,24 @@ } } }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true + }, "cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -5100,12 +5294,45 @@ "esutils": "^2.0.2" } }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", + "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==", + "dev": true + } + } + }, "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "dev": true }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, "domexception": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", @@ -5123,6 +5350,43 @@ } } }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + } + } + }, "dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -5275,6 +5539,12 @@ } } }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, "errno": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", @@ -6834,6 +7104,17 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -7187,6 +7468,12 @@ "minimalistic-assert": "^1.0.1" } }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, "history": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", @@ -7279,6 +7566,79 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "dev": true, + "requires": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + }, + "dependencies": { + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + } + } + }, + "html-webpack-plugin": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.4.1.tgz", + "integrity": "sha512-nEtdEIsIGXdXGG7MjTTZlmhqhpHU9pJFc1OYxcP36c5/ZKP6b0BJMww2QTvJGQYA9aMxUnjDujpZdYcVOXiBCQ==", + "dev": true, + "requires": { + "@types/html-minifier-terser": "^5.0.0", + "@types/tapable": "^1.0.5", + "@types/webpack": "^4.41.8", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.15", + "pretty-error": "^2.1.1", + "tapable": "^1.1.3", + "util.promisify": "1.0.0" + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "http-cache-semantics": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", @@ -8015,6 +8375,12 @@ } } }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, "is-npm": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", @@ -10600,6 +10966,23 @@ "signal-exit": "^3.0.0" } }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "requires": { + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + } + } + }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -11156,6 +11539,24 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + } + } + }, "node-addon-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.0.0.tgz", @@ -11667,6 +12068,15 @@ "set-blocking": "~2.0.0" } }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -11791,6 +12201,85 @@ "has": "^1.0.3" } }, + "object.getownpropertydescriptors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", + "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.2.tgz", + "integrity": "sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.1", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.3", + "string.prototype.trimstart": "^1.0.3" + } + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true + }, + "object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + } + } + }, "object.omit": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", @@ -12030,6 +12519,24 @@ "readable-stream": "^2.1.5" } }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + } + } + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -12095,6 +12602,24 @@ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + } + } + }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -12412,6 +12937,16 @@ } } }, + "pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "dev": true, + "requires": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, "pretty-format": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", @@ -13338,12 +13873,31 @@ } } }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", "dev": true }, + "renderkid": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz", + "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==", + "dev": true, + "requires": { + "css-select": "^2.0.2", + "dom-converter": "^0.2", + "htmlparser2": "^3.10.1", + "lodash": "^4.17.20", + "strip-ansi": "^3.0.0" + } + }, "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", @@ -15737,6 +16291,22 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", diff --git a/package.json b/package.json index 605e5604..cf21bca4 100644 --- a/package.json +++ b/package.json @@ -26,11 +26,12 @@ "eslint:backend": "set \"BACKEND_ONLY=true\" && eslint src/middleware/** src/database/**", "eslint:test": "set \"BACKEND_ONLY=true\" && set \"TEST_ENV=true\" && eslint \"test/**\" \"__mocks__/*\" \"src/**/__mocks__/*\"", "serve": "set \"BACKEND_ONLY=true\" && node dist/src/middleware/middleware-index.js", - "dev:frontend": "set \"BACKEND_ONLY=false\" && webpack-dev-server", + "dev:frontend": "set \"BACKEND_ONLY=false\" && webpack-dev-server --env development", "dev:backend": "set \"BACKEND_ONLY=true\" && nodemon --exec \"npm run eslint:backend && npm run prettier:backend && ts-node --project tsconfig.backend.json src/middleware/middleware-index.ts\"", "prebuild": "npm run prettier", + "prebuild:backend": "npm run test", "build:backend": "rimraf dist/src dist/utils && tsc --project tsconfig.backend.json", - "build:frontend": "webpack", + "build:frontend": "rimraf dist/frontend.js dist/styles.css dist/index.html && webpack --env production", "build": "npm run build:backend && npm run build:frontend" }, "devDependencies": { @@ -41,6 +42,8 @@ "@types/mongoose": "^5.10.3", "@types/mongoose-paginate-v2": "^1.3.9", "@types/node": "^14.14.25", + "@types/webpack": "^4.41.26", + "@types/webpack-dev-server": "^3.11.1", "@typescript-eslint/eslint-plugin": "^4.15.2", "@typescript-eslint/parser": "^4.15.2", "babel-cli": "^6.26.0", @@ -51,6 +54,7 @@ "eslint-loader": "^4.0.2", "eslint-plugin-react": "^7.20.6", "glob": "^7.1.6", + "html-webpack-plugin": "^4.4.1", "jest": "^26.6.3", "mini-css-extract-plugin": "^0.10.0", "node-sass": "^4.14.1", diff --git a/src/database/database-index.ts b/src/database/database-index.ts index 8002e47d..799b75d3 100644 --- a/src/database/database-index.ts +++ b/src/database/database-index.ts @@ -14,6 +14,7 @@ const databaseURL = 'mongodb://localhost:27017'; connect(databaseURL, { useNewUrlParser: true, useUnifiedTopology: true, + useCreateIndex: true, }); function saveToDB(itemData: any, modelType: TModelType): Promise { diff --git a/src/middleware/middleware-index.ts b/src/middleware/middleware-index.ts index 5f417c59..5fadddc1 100644 --- a/src/middleware/middleware-index.ts +++ b/src/middleware/middleware-index.ts @@ -6,6 +6,7 @@ import getLogger from '../../utils/logger'; import glob from 'glob'; // @ts-ignore import bodyParser from 'body-parser'; +import { resolve } from 'path'; import apiProducts from './routes/api-products'; import apiProductCategories from './routes/api-product-categories'; import apiUsers from './routes/api-users'; @@ -38,6 +39,8 @@ if (process.env.BACKEND_ONLY === 'true') { const app: Application = Express(); const port = 3000; + handleStaticFileRequests(app); + middleware(app); app.listen(port, () => { logger.log(`Server is listening on port ${port}`); @@ -46,6 +49,12 @@ if (process.env.BACKEND_ONLY === 'true') { export default middleware; +function handleStaticFileRequests(app: Application) { + const root = resolve(__dirname, '../../'); + + app.use(Express.static(root)); +} + // TODO: change string type to probably ArrayBuffer const getImage = (() => { const imageCache: { [prop: string]: string } = {}; diff --git a/webpack.config.js b/webpack.config.js index 520d9856..d0e6a0b1 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,46 +1,54 @@ const { resolve } = require('path'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); -const { default: middleware } = require('./dist/src/middleware/middleware-index'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); -// TODO: handle it in better way -process.env.NODE_ENV = 'development'; +module.exports = (env) => { + // TODO: handle it in better way + process.env.NODE_ENV = env; + const middleware = env === 'development' ? + require('./dist/src/middleware/middleware-index').default : + () => {}; -module.exports = { - mode: 'development', - entry: './src/frontend/app.js', - output: { - filename: 'frontend.js', - path: resolve(__dirname, 'dist'), - }, - module: { - rules: [ - { - test: /\.js$/, - loader: ['babel-loader', 'eslint-loader', 'prettier-loader'], - exclude: /node_modules/, - }, - { - test: /\.scss$/, - use: [ + return { + mode: env, + entry: './src/frontend/app.js', + output: { + filename: 'frontend.js', + path: resolve(__dirname, 'dist'), + }, + module: { + rules: [ + { + test: /\.js$/, + loader: ['babel-loader', 'eslint-loader', 'prettier-loader'], + exclude: /node_modules/, + }, + { + test: /\.scss$/, + use: [ MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader' - ] - }, - ] - }, - plugins: [ - new MiniCssExtractPlugin({ - filename: 'styles.css', - chunkFilename: '[id].css' - }) - ], - devtool: 'source-map', - devServer: { - publicPath: '/dist/', - watchContentBase: true, - historyApiFallback: true, - before: middleware, - port: 3000, - } + ] + }, + ] + }, + plugins: [ + new MiniCssExtractPlugin({ + filename: 'styles.css', + chunkFilename: '[id].css' + }), + new HtmlWebpackPlugin({ + template: './index.html', + }), + ], + devtool: 'source-map', + devServer: { + publicPath: '/dist/', + watchContentBase: true, + historyApiFallback: true, + before: middleware, + port: 3000, + } + }; }; From 40c08d63c1bdfa494f004c39e4abcb5875dd07de Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Tue, 2 Mar 2021 20:54:13 +0100 Subject: [PATCH 02/39] Fix app serving behavior consistency between backend development and production modes; --- package.json | 18 +++++++++++------- index.html => src/frontend/index.html | 6 +++--- src/frontend/{app.js => index.js} | 0 src/middleware/middleware-index.ts | 7 +++++-- webpack.config.js | 8 ++++---- 5 files changed, 23 insertions(+), 16 deletions(-) rename index.html => src/frontend/index.html (69%) rename src/frontend/{app.js => index.js} (100%) diff --git a/package.json b/package.json index cf21bca4..00b75e70 100644 --- a/package.json +++ b/package.json @@ -18,21 +18,25 @@ "url": "https://github.com/ScriptyChris/Fake-PEV-Shopping/issues" }, "scripts": { - "test": "npm run eslint:test && jest --env=node", - "test:dev": "jest --watch --env=node", - "test:debug": "node --inspect-brk node_modules/jest/bin/jest.js --runInBand", "prettier": "prettier --write src/ !src/frontend/assets !src/database/data", "prettier:backend": "prettier --write src/middleware/ src/database/ !src/database/data", "eslint:backend": "set \"BACKEND_ONLY=true\" && eslint src/middleware/** src/database/**", "eslint:test": "set \"BACKEND_ONLY=true\" && set \"TEST_ENV=true\" && eslint \"test/**\" \"__mocks__/*\" \"src/**/__mocks__/*\"", - "serve": "set \"BACKEND_ONLY=true\" && node dist/src/middleware/middleware-index.js", + + "test": "npm run eslint:test && jest --env=node", + "test:dev": "jest --watch --env=node", + "test:debug": "node --inspect-brk node_modules/jest/bin/jest.js --runInBand", + "dev:frontend": "set \"BACKEND_ONLY=false\" && webpack-dev-server --env development", "dev:backend": "set \"BACKEND_ONLY=true\" && nodemon --exec \"npm run eslint:backend && npm run prettier:backend && ts-node --project tsconfig.backend.json src/middleware/middleware-index.ts\"", + "prebuild": "npm run prettier", "prebuild:backend": "npm run test", - "build:backend": "rimraf dist/src dist/utils && tsc --project tsconfig.backend.json", - "build:frontend": "rimraf dist/frontend.js dist/styles.css dist/index.html && webpack --env production", - "build": "npm run build:backend && npm run build:frontend" + "build:backend": "rimraf dist/src/middleware dust/src/database dist/utils && tsc --project tsconfig.backend.json", + "build:frontend": "rimraf dist/src/frontend/ && webpack --env production", + "build": "npm run build:backend && npm run build:frontend", + + "serve": "set \"BACKEND_ONLY=true\" && node dist/src/middleware/middleware-index.js" }, "devDependencies": { "@types/bcrypt": "^3.0.0", diff --git a/index.html b/src/frontend/index.html similarity index 69% rename from index.html rename to src/frontend/index.html index 10061bd0..8cebb73b 100644 --- a/index.html +++ b/src/frontend/index.html @@ -1,18 +1,18 @@ - Fake PEV Shopping + - +
- + diff --git a/src/frontend/app.js b/src/frontend/index.js similarity index 100% rename from src/frontend/app.js rename to src/frontend/index.js diff --git a/src/middleware/middleware-index.ts b/src/middleware/middleware-index.ts index 5fadddc1..7a6ba18c 100644 --- a/src/middleware/middleware-index.ts +++ b/src/middleware/middleware-index.ts @@ -6,7 +6,7 @@ import getLogger from '../../utils/logger'; import glob from 'glob'; // @ts-ignore import bodyParser from 'body-parser'; -import { resolve } from 'path'; +import { resolve, sep } from 'path'; import apiProducts from './routes/api-products'; import apiProductCategories from './routes/api-product-categories'; import apiUsers from './routes/api-users'; @@ -50,7 +50,10 @@ if (process.env.BACKEND_ONLY === 'true') { export default middleware; function handleStaticFileRequests(app: Application) { - const root = resolve(__dirname, '../../'); + const relativeDist = __dirname.includes(`${sep}dist${sep}`) ? '' : 'dist/'; + const path = `../../${relativeDist}src/frontend`; + + const root = resolve(__dirname, path); app.use(Express.static(root)); } diff --git a/webpack.config.js b/webpack.config.js index d0e6a0b1..54dbd2d0 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -11,10 +11,10 @@ module.exports = (env) => { return { mode: env, - entry: './src/frontend/app.js', + entry: './src/frontend/index.js', output: { - filename: 'frontend.js', - path: resolve(__dirname, 'dist'), + filename: 'index.js', + path: resolve(__dirname, './dist/src/frontend'), }, module: { rules: [ @@ -39,7 +39,7 @@ module.exports = (env) => { chunkFilename: '[id].css' }), new HtmlWebpackPlugin({ - template: './index.html', + template: './src/frontend/index.html', }), ], devtool: 'source-map', From d0c15317732d8266b5a4b76ee94709455a7a5a20 Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Thu, 4 Mar 2021 09:07:37 +0100 Subject: [PATCH 03/39] Remove prebuild npm scripts; --- package.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/package.json b/package.json index 00b75e70..1e050d45 100644 --- a/package.json +++ b/package.json @@ -30,8 +30,6 @@ "dev:frontend": "set \"BACKEND_ONLY=false\" && webpack-dev-server --env development", "dev:backend": "set \"BACKEND_ONLY=true\" && nodemon --exec \"npm run eslint:backend && npm run prettier:backend && ts-node --project tsconfig.backend.json src/middleware/middleware-index.ts\"", - "prebuild": "npm run prettier", - "prebuild:backend": "npm run test", "build:backend": "rimraf dist/src/middleware dust/src/database dist/utils && tsc --project tsconfig.backend.json", "build:frontend": "rimraf dist/src/frontend/ && webpack --env production", "build": "npm run build:backend && npm run build:frontend", From ff1a32bb80ccc5bd6d2923b755d2c1d93c284ea2 Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Thu, 4 Mar 2021 09:18:31 +0100 Subject: [PATCH 04/39] Add GitHub workflow YML file; --- .github/workflows/node.js.yml | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 .github/workflows/node.js.yml diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml new file mode 100644 index 00000000..89ba2730 --- /dev/null +++ b/.github/workflows/node.js.yml @@ -0,0 +1,30 @@ +# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions + +name: Node.js CI + +on: + push: + branches: [ develop ] + pull_request: + branches: [ develop ] + +jobs: + build: + + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [14.15.5, 15.x] + # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - run: npm ci + - run: npm run build + - run: npm test From 98f1c59d379054fa08c3ea057532e18c839dd817 Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Thu, 4 Mar 2021 10:20:31 +0100 Subject: [PATCH 05/39] [debugging] check env variables on GitHub workflow; --- .eslintrc.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.eslintrc.js b/.eslintrc.js index 93573465..505282b1 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -21,6 +21,8 @@ if (!isTestEnv && isBackendOnly) { config.ignorePatterns.push('test/', '__mocks__/', '**/__mocks__', 'src/**/*.js'); } +console.log('??? isTestEnv:', isTestEnv, ' /isBackendOnly:', isBackendOnly, ' /config:', JSON.stringify(config)); + module.exports = { 'env': { 'browser': config.browser, From 8fea0aba159c00d2e972fcd790543257a9fee708 Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Thu, 4 Mar 2021 10:28:06 +0100 Subject: [PATCH 06/39] [debugging] change 'set' to 'export' keyword to setup ENV variables from npm; --- package.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 1e050d45..80aab9ec 100644 --- a/package.json +++ b/package.json @@ -20,21 +20,21 @@ "scripts": { "prettier": "prettier --write src/ !src/frontend/assets !src/database/data", "prettier:backend": "prettier --write src/middleware/ src/database/ !src/database/data", - "eslint:backend": "set \"BACKEND_ONLY=true\" && eslint src/middleware/** src/database/**", - "eslint:test": "set \"BACKEND_ONLY=true\" && set \"TEST_ENV=true\" && eslint \"test/**\" \"__mocks__/*\" \"src/**/__mocks__/*\"", + "eslint:backend": "export \"BACKEND_ONLY=true\" && eslint src/middleware/** src/database/**", + "eslint:test": "export \"BACKEND_ONLY=true\" && export \"TEST_ENV=true\" && eslint \"test/**\" \"__mocks__/*\" \"src/**/__mocks__/*\"", "test": "npm run eslint:test && jest --env=node", "test:dev": "jest --watch --env=node", "test:debug": "node --inspect-brk node_modules/jest/bin/jest.js --runInBand", - "dev:frontend": "set \"BACKEND_ONLY=false\" && webpack-dev-server --env development", - "dev:backend": "set \"BACKEND_ONLY=true\" && nodemon --exec \"npm run eslint:backend && npm run prettier:backend && ts-node --project tsconfig.backend.json src/middleware/middleware-index.ts\"", + "dev:frontend": "export \"BACKEND_ONLY=false\" && webpack-dev-server --env development", + "dev:backend": "export \"BACKEND_ONLY=true\" && nodemon --exec \"npm run eslint:backend && npm run prettier:backend && ts-node --project tsconfig.backend.json src/middleware/middleware-index.ts\"", "build:backend": "rimraf dist/src/middleware dust/src/database dist/utils && tsc --project tsconfig.backend.json", "build:frontend": "rimraf dist/src/frontend/ && webpack --env production", "build": "npm run build:backend && npm run build:frontend", - "serve": "set \"BACKEND_ONLY=true\" && node dist/src/middleware/middleware-index.js" + "serve": "export \"BACKEND_ONLY=true\" && node dist/src/middleware/middleware-index.js" }, "devDependencies": { "@types/bcrypt": "^3.0.0", From 4dd6db6738ce8f1a58a3309299b575465446af6c Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Thu, 4 Mar 2021 10:38:57 +0100 Subject: [PATCH 07/39] [debugging] check test/ to src/ module paths mapping in GitHub workflow; --- test/test-index.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/test/test-index.ts b/test/test-index.ts index b3f51f63..30a2813f 100644 --- a/test/test-index.ts +++ b/test/test-index.ts @@ -14,10 +14,16 @@ const findAssociatedSrcModulePath = (() => { return (): string => { // @ts-ignore - const srcModulePath = require.main.filename + let srcModulePath = require.main.filename; + + console.log('???[0] srcModulePath:', srcModulePath, ' /PATH_PARTS:', Object.entries(PATH_PARTS)); + + srcModulePath = srcModulePath .replace(PATH_PARTS.TEST, PATH_PARTS.SRC) .replace(PATH_PARTS.SPEC_TS_EXT, PATH_PARTS.TS_EXT); + console.log('???[1] srcModulePath:', srcModulePath); + return srcModulePath; }; })(); From 069de78983fb1a680326cc8374d5aaeaede883aa Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Thu, 4 Mar 2021 11:56:31 +0100 Subject: [PATCH 08/39] [debugging] fix module mapper path separator depent on OS; --- test/test-index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test-index.ts b/test/test-index.ts index 30a2813f..82011828 100644 --- a/test/test-index.ts +++ b/test/test-index.ts @@ -3,9 +3,9 @@ import { sep } from 'path'; const findAssociatedSrcModulePath = (() => { const PATH_PARTS = { TEST: (() => { - const DOUBLE_SEP = sep.repeat(2); + const OS_SEP = sep === '/' ? '/' : sep.repeat(2); - return new RegExp(`(${DOUBLE_SEP}+)test(${DOUBLE_SEP}+)`); + return new RegExp(`(${OS_SEP}+)test(${OS_SEP}+)`); })(), SRC: '$1src$2', SPEC_TS_EXT: /\.spec\.ts$/, From e5f1858f015587380ba969a46506da1e2a73ce2f Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Fri, 19 Mar 2021 16:04:44 +0100 Subject: [PATCH 09/39] Add dotenv package to manage ENV variables; --- .env | 2 ++ .eslintrc.js | 1 - package-lock.json | 29 +++++++++++++++++------------ package.json | 11 ++++------- src/database/database-index.ts | 9 ++++++--- src/database/models/models-index.ts | 1 - src/database/populate.ts | 9 +++++---- src/frontend/index.html | 17 +++++++---------- src/middleware/features/auth.ts | 10 ++++++---- src/middleware/middleware-index.ts | 10 +++++++--- test/test-index.ts | 4 ---- webpack.config.js | 2 +- 12 files changed, 55 insertions(+), 50 deletions(-) create mode 100644 .env diff --git a/.env b/.env new file mode 100644 index 00000000..c8f6edb7 --- /dev/null +++ b/.env @@ -0,0 +1,2 @@ +DATABASE_URL=mongodb://localhost:27017/pev_shop +SECRET_KEY=secret-key diff --git a/.eslintrc.js b/.eslintrc.js index 505282b1..9351f59b 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,4 +1,3 @@ -// TODO: refactor to use ENV const isBackendOnly = process.env.BACKEND_ONLY === 'true'; const isTestEnv = process.env.TEST_ENV === 'true'; diff --git a/package-lock.json b/package-lock.json index c5b724ba..3f2b12ee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5396,6 +5396,11 @@ "is-obj": "^2.0.0" } }, + "dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" + }, "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", @@ -5444,24 +5449,24 @@ "dev": true }, "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "dev": true, "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", + "bn.js": "^4.11.9", + "brorand": "^1.1.0", "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } diff --git a/package.json b/package.json index 80aab9ec..0ad382e4 100644 --- a/package.json +++ b/package.json @@ -22,18 +22,14 @@ "prettier:backend": "prettier --write src/middleware/ src/database/ !src/database/data", "eslint:backend": "export \"BACKEND_ONLY=true\" && eslint src/middleware/** src/database/**", "eslint:test": "export \"BACKEND_ONLY=true\" && export \"TEST_ENV=true\" && eslint \"test/**\" \"__mocks__/*\" \"src/**/__mocks__/*\"", - "test": "npm run eslint:test && jest --env=node", "test:dev": "jest --watch --env=node", "test:debug": "node --inspect-brk node_modules/jest/bin/jest.js --runInBand", - - "dev:frontend": "export \"BACKEND_ONLY=false\" && webpack-dev-server --env development", + "dev:frontend": "webpack-dev-server --env development", "dev:backend": "export \"BACKEND_ONLY=true\" && nodemon --exec \"npm run eslint:backend && npm run prettier:backend && ts-node --project tsconfig.backend.json src/middleware/middleware-index.ts\"", - - "build:backend": "rimraf dist/src/middleware dust/src/database dist/utils && tsc --project tsconfig.backend.json", + "build:backend": "rimraf dist/src/middleware dist/src/database dist/utils && tsc --project tsconfig.backend.json", "build:frontend": "rimraf dist/src/frontend/ && webpack --env production", "build": "npm run build:backend && npm run build:frontend", - "serve": "export \"BACKEND_ONLY=true\" && node dist/src/middleware/middleware-index.js" }, "devDependencies": { @@ -77,11 +73,12 @@ "dependencies": { "bcrypt": "^5.0.0", "body-parser": "^1.19.0", + "dotenv": "^8.2.0", "jsonwebtoken": "^8.5.1", "mobx": "^5.15.6", "mobx-react": "^6.3.0", "mongodb": "3.5.10", - "mongoose": "5.9.27", + "mongoose": "^5.9.27", "mongoose-paginate-v2": "^1.3.13", "react-paginate": "^7.0.0", "react-simple-tree-menu": "^1.1.18" diff --git a/src/database/database-index.ts b/src/database/database-index.ts index 799b75d3..c629c85e 100644 --- a/src/database/database-index.ts +++ b/src/database/database-index.ts @@ -3,15 +3,18 @@ import * as mongoose from 'mongoose'; import getModel, { TModelType, IModel, TGenericModel } from './models/models-index'; import * as queryBuilder from './utils/queryBuilder'; import getPaginatedItems, { TPaginationConfig } from './utils/paginateItemsFromDB'; +import * as dotenv from 'dotenv'; + +// @ts-ignore +dotenv.default.config(); const { // @ts-ignore default: { connect }, } = mongoose; -// TODO: move to ENV -const databaseURL = 'mongodb://localhost:27017'; -connect(databaseURL, { +// @ts-ignore +connect(process.env.DATABASE_URL, { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, diff --git a/src/database/models/models-index.ts b/src/database/models/models-index.ts index 892e3950..2265a9ca 100644 --- a/src/database/models/models-index.ts +++ b/src/database/models/models-index.ts @@ -10,7 +10,6 @@ const MODELS = { }; export type IModel = IProduct | IUser | IUserRole; -export type TModels = typeof MODELS; export type TModelType = keyof typeof MODELS; export type TGenericModel = Model; diff --git a/src/database/populate.ts b/src/database/populate.ts index 5552398b..a240ff4a 100644 --- a/src/database/populate.ts +++ b/src/database/populate.ts @@ -6,6 +6,10 @@ import { sep } from 'path'; import { promisify } from 'util'; import * as G from 'glob'; import { readFile, readFileSync } from 'fs'; +import * as dotenv from 'dotenv'; + +// @ts-ignore +dotenv.default.config(); const glob = promisify(G.glob); const logger = getLogger(module.filename); @@ -39,10 +43,7 @@ logger.log('process.argv:', process.argv); })(); function connectToDB() { - // TODO: move to ENV - const databaseURL = 'mongodb://localhost:27017'; - - return connect(databaseURL, { + return connect(process.env.DATABASE_URL as string, { useNewUrlParser: true, useUnifiedTopology: true, }); diff --git a/src/frontend/index.html b/src/frontend/index.html index 8cebb73b..72c38e84 100644 --- a/src/frontend/index.html +++ b/src/frontend/index.html @@ -1,18 +1,15 @@ - - - + + + Fake PEV Shopping - - - - + + +
- - - + diff --git a/src/middleware/features/auth.ts b/src/middleware/features/auth.ts index dfe61d48..a4bcbcf9 100644 --- a/src/middleware/features/auth.ts +++ b/src/middleware/features/auth.ts @@ -2,6 +2,10 @@ import getLogger from '../../../utils/logger'; import * as bcrypt from 'bcrypt'; import * as jwt from 'jsonwebtoken'; import { Request, Response, NextFunction } from 'express'; +import * as dotenv from 'dotenv'; + +// @ts-ignore +dotenv.default.config(); const { // @ts-ignore @@ -13,8 +17,6 @@ const { } = jwt; const logger = getLogger(module.filename); const SALT_ROUNDS = 8; -// TODO: move to ENV -const SECRET_KEY = 'secret-key'; type TToken = { _id: number }; @@ -27,11 +29,11 @@ const hashPassword = (password: string): Promise => { }; const getToken = (payloadObj: TToken): string => { - return sign(payloadObj, SECRET_KEY); + return sign(payloadObj, process.env.SECRET_KEY); }; const verifyToken = (token: string): TToken => { - return verify(token, SECRET_KEY) as TToken; + return verify(token, process.env.SECRET_KEY) as TToken; }; const authMiddlewareFn = (getFromDB: /* TODO: correct typing */ any): ((...args: any) => Promise) => { diff --git a/src/middleware/middleware-index.ts b/src/middleware/middleware-index.ts index 7a6ba18c..90efcf7d 100644 --- a/src/middleware/middleware-index.ts +++ b/src/middleware/middleware-index.ts @@ -36,6 +36,12 @@ const middleware = (app: Application): void => { // TODO: refactor to use ENV if (process.env.BACKEND_ONLY === 'true') { + wrappedMiddleware(); +} + +export default middleware; + +function wrappedMiddleware(): void { const app: Application = Express(); const port = 3000; @@ -47,9 +53,7 @@ if (process.env.BACKEND_ONLY === 'true') { }); } -export default middleware; - -function handleStaticFileRequests(app: Application) { +function handleStaticFileRequests(app: Application): void { const relativeDist = __dirname.includes(`${sep}dist${sep}`) ? '' : 'dist/'; const path = `../../${relativeDist}src/frontend`; diff --git a/test/test-index.ts b/test/test-index.ts index 82011828..f546b19b 100644 --- a/test/test-index.ts +++ b/test/test-index.ts @@ -16,14 +16,10 @@ const findAssociatedSrcModulePath = (() => { // @ts-ignore let srcModulePath = require.main.filename; - console.log('???[0] srcModulePath:', srcModulePath, ' /PATH_PARTS:', Object.entries(PATH_PARTS)); - srcModulePath = srcModulePath .replace(PATH_PARTS.TEST, PATH_PARTS.SRC) .replace(PATH_PARTS.SPEC_TS_EXT, PATH_PARTS.TS_EXT); - console.log('???[1] srcModulePath:', srcModulePath); - return srcModulePath; }; })(); diff --git a/webpack.config.js b/webpack.config.js index 54dbd2d0..efaadaa8 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -44,7 +44,7 @@ module.exports = (env) => { ], devtool: 'source-map', devServer: { - publicPath: '/dist/', + publicPath: '/', watchContentBase: true, historyApiFallback: true, before: middleware, From 95bb5efc4eda0e4caa8bc853988519c12dc28298 Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Tue, 23 Mar 2021 20:41:31 +0100 Subject: [PATCH 10/39] Add cross-env package to unify setting ENV variables in CLI per OS; Add dotenv-webpack library to handle ENV variables for frontend codebase; --- .env | 1 + .eslintrc.js | 2 - package-lock.json | 67 +++++++++++++++++++++++++++++- package.json | 11 ++--- src/middleware/middleware-index.ts | 10 +++-- webpack.config.js | 6 ++- 6 files changed, 83 insertions(+), 14 deletions(-) diff --git a/.env b/.env index c8f6edb7..cbcef03c 100644 --- a/.env +++ b/.env @@ -1,2 +1,3 @@ DATABASE_URL=mongodb://localhost:27017/pev_shop SECRET_KEY=secret-key +PORT=3000 diff --git a/.eslintrc.js b/.eslintrc.js index 9351f59b..31eea066 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -20,8 +20,6 @@ if (!isTestEnv && isBackendOnly) { config.ignorePatterns.push('test/', '__mocks__/', '**/__mocks__', 'src/**/*.js'); } -console.log('??? isTestEnv:', isTestEnv, ' /isBackendOnly:', isBackendOnly, ' /config:', JSON.stringify(config)); - module.exports = { 'env': { 'browser': config.browser, diff --git a/package-lock.json b/package-lock.json index 3f2b12ee..08a51082 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4800,6 +4800,52 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, + "cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "requires": { + "cross-spawn": "^7.0.1" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -5401,6 +5447,24 @@ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" }, + "dotenv-defaults": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/dotenv-defaults/-/dotenv-defaults-2.0.1.tgz", + "integrity": "sha512-ugFCyBF7ILuwpmznduHPQZBMucHHJ8T4OBManTEVjemxCm2+nqifSuW2lD2SNKdiKSH1E324kZSdJ8M04b4I/A==", + "dev": true, + "requires": { + "dotenv": "^8.2.0" + } + }, + "dotenv-webpack": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-7.0.2.tgz", + "integrity": "sha512-RY+/5uM/XY4bGtih9f9ic8hlrUDxVcZZBPWlnX/aHhaKxcVVX9SH/5VH7CSmvVo9GL6PKvQOA0X1bc552rnatQ==", + "dev": true, + "requires": { + "dotenv-defaults": "^2.0.1" + } + }, "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", @@ -8543,8 +8607,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "version": "2.1.0", diff --git a/package.json b/package.json index 0ad382e4..b7532df7 100644 --- a/package.json +++ b/package.json @@ -18,19 +18,18 @@ "url": "https://github.com/ScriptyChris/Fake-PEV-Shopping/issues" }, "scripts": { - "prettier": "prettier --write src/ !src/frontend/assets !src/database/data", "prettier:backend": "prettier --write src/middleware/ src/database/ !src/database/data", - "eslint:backend": "export \"BACKEND_ONLY=true\" && eslint src/middleware/** src/database/**", - "eslint:test": "export \"BACKEND_ONLY=true\" && export \"TEST_ENV=true\" && eslint \"test/**\" \"__mocks__/*\" \"src/**/__mocks__/*\"", + "eslint:backend": "cross-env BACKEND_ONLY=true eslint src/middleware/** src/database/**", + "eslint:test": "cross-env BACKEND_ONLY=true TEST_ENV=true && eslint \"test/**\" \"__mocks__/*\" \"src/**/__mocks__/*\"", "test": "npm run eslint:test && jest --env=node", "test:dev": "jest --watch --env=node", "test:debug": "node --inspect-brk node_modules/jest/bin/jest.js --runInBand", "dev:frontend": "webpack-dev-server --env development", - "dev:backend": "export \"BACKEND_ONLY=true\" && nodemon --exec \"npm run eslint:backend && npm run prettier:backend && ts-node --project tsconfig.backend.json src/middleware/middleware-index.ts\"", + "dev:backend": "cross-env BACKEND_ONLY=true nodemon --exec \"npm run eslint:backend && npm run prettier:backend && ts-node --project tsconfig.backend.json src/middleware/middleware-index.ts\"", "build:backend": "rimraf dist/src/middleware dist/src/database dist/utils && tsc --project tsconfig.backend.json", "build:frontend": "rimraf dist/src/frontend/ && webpack --env production", "build": "npm run build:backend && npm run build:frontend", - "serve": "export \"BACKEND_ONLY=true\" && node dist/src/middleware/middleware-index.js" + "serve": "cross-env BACKEND_ONLY=true node dist/src/middleware/middleware-index.js" }, "devDependencies": { "@types/bcrypt": "^3.0.0", @@ -48,6 +47,7 @@ "babel-loader": "^8.1.0", "babel-preset-react-app": "^9.1.2", "css-loader": "^4.2.1", + "dotenv-webpack": "^7.0.2", "eslint": "^7.7.0", "eslint-loader": "^4.0.2", "eslint-plugin-react": "^7.20.6", @@ -73,6 +73,7 @@ "dependencies": { "bcrypt": "^5.0.0", "body-parser": "^1.19.0", + "cross-env": "^7.0.3", "dotenv": "^8.2.0", "jsonwebtoken": "^8.5.1", "mobx": "^5.15.6", diff --git a/src/middleware/middleware-index.ts b/src/middleware/middleware-index.ts index 90efcf7d..a516398e 100644 --- a/src/middleware/middleware-index.ts +++ b/src/middleware/middleware-index.ts @@ -11,6 +11,10 @@ import apiProducts from './routes/api-products'; import apiProductCategories from './routes/api-product-categories'; import apiUsers from './routes/api-users'; import apiUserRoles from './routes/api-user-roles'; +import * as dotenv from 'dotenv'; + +// @ts-ignore +dotenv.default.config(); const logger = getLogger(module.filename); const databaseDirname = 'E:/Projects/eWheels-Custom-App-Scraped-Data/database'; @@ -34,7 +38,6 @@ const middleware = (app: Application): void => { }); }; -// TODO: refactor to use ENV if (process.env.BACKEND_ONLY === 'true') { wrappedMiddleware(); } @@ -43,13 +46,12 @@ export default middleware; function wrappedMiddleware(): void { const app: Application = Express(); - const port = 3000; handleStaticFileRequests(app); middleware(app); - app.listen(port, () => { - logger.log(`Server is listening on port ${port}`); + app.listen(process.env.PORT, () => { + logger.log(`Server is listening on port ${process.env.PORT}`); }); } diff --git a/webpack.config.js b/webpack.config.js index efaadaa8..0d4792ed 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,6 +1,9 @@ const { resolve } = require('path'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); +const Dotenv = require('html-webpack-plugin'); + +require('dotenv').config(); module.exports = (env) => { // TODO: handle it in better way @@ -34,6 +37,7 @@ module.exports = (env) => { ] }, plugins: [ + new Dotenv(), new MiniCssExtractPlugin({ filename: 'styles.css', chunkFilename: '[id].css' @@ -48,7 +52,7 @@ module.exports = (env) => { watchContentBase: true, historyApiFallback: true, before: middleware, - port: 3000, + port: process.env.PORT, } }; }; From 825782e1f3f9bfe5cbb210616f3dfa2d3b05881b Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Wed, 31 Mar 2021 11:19:37 +0200 Subject: [PATCH 11/39] Extend CI/CD workflow to create and publish Docker image for production; --- .github/workflows/build-docker-image.yml | 36 ++++++++++++++++++++++++ .github/workflows/integrate.yml | 19 +++++++++++++ .github/workflows/node.js.yml | 30 -------------------- Dockerfile | 20 +++++++++++++ 4 files changed, 75 insertions(+), 30 deletions(-) create mode 100644 .github/workflows/build-docker-image.yml create mode 100644 .github/workflows/integrate.yml delete mode 100644 .github/workflows/node.js.yml create mode 100644 Dockerfile diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml new file mode 100644 index 00000000..ad2ef3cd --- /dev/null +++ b/.github/workflows/build-docker-image.yml @@ -0,0 +1,36 @@ +name: Build production Docker image + +on: + push: + branches: [ develop ] + +jobs: + build-docker-image: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: 14.15.5 + + - run: npm ci + - run: npm run build + - run: npm test + + - uses: docker/setup-buildx-action@v1 + - name: Login to Docker registry on GitHub + uses: docker/login-action@v1 + with: + registry: ghcr.io + repository: ${{ github.repository }} + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Lowercase author and repository name + run: | + echo "REPO_LOWERCASE=${GITHUB_REPOSITORY,,}" >> ${GITHUB_ENV} + - name: Build and push + uses: docker/build-push-action@v2 + with: + push: true + tags: ghcr.io/${{ GITHUB_ENV.REPO_LOWERCASE }} diff --git a/.github/workflows/integrate.yml b/.github/workflows/integrate.yml new file mode 100644 index 00000000..4353205f --- /dev/null +++ b/.github/workflows/integrate.yml @@ -0,0 +1,19 @@ +name: Integrate + +on: + pull_request: + branches: [ develop ] + +jobs: + run-unit-tests: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: 14.15.5 + + - run: npm ci + - run: npm run build + - run: npm test diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml deleted file mode 100644 index 89ba2730..00000000 --- a/.github/workflows/node.js.yml +++ /dev/null @@ -1,30 +0,0 @@ -# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node -# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions - -name: Node.js CI - -on: - push: - branches: [ develop ] - pull_request: - branches: [ develop ] - -jobs: - build: - - runs-on: ubuntu-latest - - strategy: - matrix: - node-version: [14.15.5, 15.x] - # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ - - steps: - - uses: actions/checkout@v2 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 - with: - node-version: ${{ matrix.node-version }} - - run: npm ci - - run: npm run build - - run: npm test diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..8c6e4220 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,20 @@ +# Build image: docker build -t pev-shop-dev . +# Run container: docker run --mount type=bind,source="$(pwd)",target=/app pev-shop-dev + +FROM node:lts-alpine3.13 + +WORKDIR /app + +COPY ./package*.json ./ +RUN npm ci + +COPY ./dist .env ./ + +CMD ["npm", "run", "serve"] + +#RUN npm ci; touch _test_file_.txt; ls ./ +#CMD npm ci && npm run dev:frontend +#CMD ls ./ && npm run dev:frontend +#CMD ["npm", "run", "dev:frontend"] + +#CMD ["sleep", "3600"] From 74ffa32766a7db352af3a1915f08065ecb409553 Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Wed, 31 Mar 2021 15:08:00 +0200 Subject: [PATCH 12/39] Fix eslint:test npm script; Remove app build step from CI workflow; --- .github/workflows/integrate.yml | 1 - package.json | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/integrate.yml b/.github/workflows/integrate.yml index 4353205f..cc5dac8e 100644 --- a/.github/workflows/integrate.yml +++ b/.github/workflows/integrate.yml @@ -15,5 +15,4 @@ jobs: node-version: 14.15.5 - run: npm ci - - run: npm run build - run: npm test diff --git a/package.json b/package.json index b7532df7..34e3b761 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "scripts": { "prettier:backend": "prettier --write src/middleware/ src/database/ !src/database/data", "eslint:backend": "cross-env BACKEND_ONLY=true eslint src/middleware/** src/database/**", - "eslint:test": "cross-env BACKEND_ONLY=true TEST_ENV=true && eslint \"test/**\" \"__mocks__/*\" \"src/**/__mocks__/*\"", + "eslint:test": "cross-env BACKEND_ONLY=true TEST_ENV=true eslint \"test/**\" \"__mocks__/*\" \"src/**/__mocks__/*\"", "test": "npm run eslint:test && jest --env=node", "test:dev": "jest --watch --env=node", "test:debug": "node --inspect-brk node_modules/jest/bin/jest.js --runInBand", From 31be1e120369204e677043174298a2e1564e75d0 Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Wed, 31 Mar 2021 19:14:09 +0200 Subject: [PATCH 13/39] Fix build-docker-image.yml indentation; --- .github/workflows/build-docker-image.yml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index ad2ef3cd..862eb642 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -16,7 +16,6 @@ jobs: - run: npm ci - run: npm run build - - run: npm test - uses: docker/setup-buildx-action@v1 - name: Login to Docker registry on GitHub @@ -27,10 +26,9 @@ jobs: username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - name: Lowercase author and repository name - run: | - echo "REPO_LOWERCASE=${GITHUB_REPOSITORY,,}" >> ${GITHUB_ENV} - - name: Build and push - uses: docker/build-push-action@v2 - with: + run: echo "REPO_LOWERCASE=${GITHUB_REPOSITORY,,}" >> ${GITHUB_ENV} + - name: Build and push + uses: docker/build-push-action@v2 + with: push: true tags: ghcr.io/${{ GITHUB_ENV.REPO_LOWERCASE }} From fc14aade2bfb32d0f8ac0819a45206c22150b35c Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Wed, 31 Mar 2021 19:57:15 +0200 Subject: [PATCH 14/39] [WIP] temporarily run building production docker image on PR check flow; --- .github/workflows/build-docker-image.yml | 4 +++- .github/workflows/integrate.yml | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 862eb642..1b321374 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -1,7 +1,9 @@ name: Build production Docker image on: - push: + #push: + #branches: [ develop ] + pull_request: branches: [ develop ] jobs: diff --git a/.github/workflows/integrate.yml b/.github/workflows/integrate.yml index cc5dac8e..8f1c53aa 100644 --- a/.github/workflows/integrate.yml +++ b/.github/workflows/integrate.yml @@ -1,7 +1,8 @@ name: Integrate on: - pull_request: + issues: + #pull_request: branches: [ develop ] jobs: From 4e654b3c60aff55b86a725bc15293bd0c34ec806 Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Wed, 31 Mar 2021 20:50:14 +0200 Subject: [PATCH 15/39] [WIP] fix GITHUB_ENV variable creation; --- .github/workflows/build-docker-image.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 1b321374..203b3565 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -28,7 +28,7 @@ jobs: username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - name: Lowercase author and repository name - run: echo "REPO_LOWERCASE=${GITHUB_REPOSITORY,,}" >> ${GITHUB_ENV} + run: echo "REPO_LOWERCASE=${GITHUB_REPOSITORY,,}" >> $GITHUB_ENV - name: Build and push uses: docker/build-push-action@v2 with: From 2e836a116fca9bbbd38818eaee74e87c7c3d2ebf Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Wed, 31 Mar 2021 21:27:26 +0200 Subject: [PATCH 16/39] [WIP] move tag url prefix to REPO_LOWERCASE variable; --- .github/workflows/build-docker-image.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 203b3565..7128830f 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -28,9 +28,9 @@ jobs: username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - name: Lowercase author and repository name - run: echo "REPO_LOWERCASE=${GITHUB_REPOSITORY,,}" >> $GITHUB_ENV + run: echo "REPO_LOWERCASE=ghcr.io/${GITHUB_REPOSITORY,,}" >> $GITHUB_ENV - name: Build and push uses: docker/build-push-action@v2 with: push: true - tags: ghcr.io/${{ GITHUB_ENV.REPO_LOWERCASE }} + tags: ${{ GITHUB_ENV.REPO_LOWERCASE }} From 480496d7d7e7a629e5fc6bfc732f1c8192a509c3 Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Wed, 31 Mar 2021 21:52:39 +0200 Subject: [PATCH 17/39] [WIP] fix reading env variable; --- .github/workflows/build-docker-image.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 7128830f..b4c675e2 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -33,4 +33,4 @@ jobs: uses: docker/build-push-action@v2 with: push: true - tags: ${{ GITHUB_ENV.REPO_LOWERCASE }} + tags: ${{ env.REPO_LOWERCASE }} From 63bb7a36044d1420bf91b0bb9f6c8193ef236997 Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Wed, 31 Mar 2021 22:02:44 +0200 Subject: [PATCH 18/39] [WIP] remove installing and building app steps from CD workflow and add it to Dockerfile; --- .github/workflows/build-docker-image.yml | 10 +++++----- Dockerfile | 1 + 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index b4c675e2..b5661741 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -12,12 +12,12 @@ jobs: steps: - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 - with: - node-version: 14.15.5 + #- uses: actions/setup-node@v2 + #with: + #node-version: 14.15.5 - - run: npm ci - - run: npm run build + #- run: npm ci + #- run: npm run build - uses: docker/setup-buildx-action@v1 - name: Login to Docker registry on GitHub diff --git a/Dockerfile b/Dockerfile index 8c6e4220..f365a34e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,6 +7,7 @@ WORKDIR /app COPY ./package*.json ./ RUN npm ci +RUN npm run build COPY ./dist .env ./ From f6b8031fd836803f23761187169e680972211f2d Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Wed, 31 Mar 2021 23:23:44 +0200 Subject: [PATCH 19/39] [WIP] remove incorrect registry prop key from workflow step and list current folder in Dockerfile; --- .github/workflows/build-docker-image.yml | 1 - Dockerfile | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index b5661741..996cb0f2 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -24,7 +24,6 @@ jobs: uses: docker/login-action@v1 with: registry: ghcr.io - repository: ${{ github.repository }} username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - name: Lowercase author and repository name diff --git a/Dockerfile b/Dockerfile index f365a34e..69bbc522 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,8 +6,8 @@ FROM node:lts-alpine3.13 WORKDIR /app COPY ./package*.json ./ -RUN npm ci -RUN npm run build +RUN npm ci && ls ./ +RUN npm run build && ls ./ COPY ./dist .env ./ From 0869d993e5613264d74e281910bc1a0d47aa8601 Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Wed, 31 Mar 2021 23:46:19 +0200 Subject: [PATCH 20/39] [WIP] copy project's necessary source files to build docker image; --- Dockerfile | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 69bbc522..c770f59a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,10 +6,12 @@ FROM node:lts-alpine3.13 WORKDIR /app COPY ./package*.json ./ -RUN npm ci && ls ./ -RUN npm run build && ls ./ +RUN npm ci -COPY ./dist .env ./ +COPY ["./src", "./utils", "./.env", "./tsconfig*", "./webpack.config.js", "./"] +RUN npm run build + +COPY ./dist ./ CMD ["npm", "run", "serve"] From ef84802f6dbcbef021e1da186084b6e28975864d Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Thu, 1 Apr 2021 00:03:34 +0200 Subject: [PATCH 21/39] [WIP] use docker RUN command in shell form to output folder content before building app; --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index c770f59a..b5278fed 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,7 +9,7 @@ COPY ./package*.json ./ RUN npm ci COPY ["./src", "./utils", "./.env", "./tsconfig*", "./webpack.config.js", "./"] -RUN npm run build +RUN /bin/bash -c "ls ./ && npm run build" COPY ./dist ./ From 2caf4285921aa76749bba28686c52494b90ae804 Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Thu, 1 Apr 2021 22:39:09 +0200 Subject: [PATCH 22/39] [WIP] fix building docker image; Add docker-compose to link MongoDB with Node; --- .env | 2 +- Dockerfile | 20 ++++++-------------- docker-compose.yml | 14 ++++++++++++++ src/database/database-index.ts | 26 ++++++++++++++++++++------ 4 files changed, 41 insertions(+), 21 deletions(-) create mode 100644 docker-compose.yml diff --git a/.env b/.env index cbcef03c..3d150ffe 100644 --- a/.env +++ b/.env @@ -1,3 +1,3 @@ -DATABASE_URL=mongodb://localhost:27017/pev_shop +DATABASE_URL=mongodb://mongo:27017/pev_shop SECRET_KEY=secret-key PORT=3000 diff --git a/Dockerfile b/Dockerfile index b5278fed..c38cfae9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,23 +1,15 @@ -# Build image: docker build -t pev-shop-dev . -# Run container: docker run --mount type=bind,source="$(pwd)",target=/app pev-shop-dev - FROM node:lts-alpine3.13 -WORKDIR /app - COPY ./package*.json ./ RUN npm ci -COPY ["./src", "./utils", "./.env", "./tsconfig*", "./webpack.config.js", "./"] -RUN /bin/bash -c "ls ./ && npm run build" +COPY ./src ./src +COPY ./utils ./utils +COPY .env .babelrc tsconfig* webpack.config.js ./ +RUN npm run build COPY ./dist ./ -CMD ["npm", "run", "serve"] - -#RUN npm ci; touch _test_file_.txt; ls ./ -#CMD npm ci && npm run dev:frontend -#CMD ls ./ && npm run dev:frontend -#CMD ["npm", "run", "dev:frontend"] +EXPOSE 3000 -#CMD ["sleep", "3600"] +CMD ["npm", "run", "serve"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..9e4618e2 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,14 @@ +version: "3" + +services: + mongo: + image: mongo:4.2.13-bionic + ports: + - 27017:27017 + + node: + build: ./ + ports: + - 3000:3000 + depends_on: + - mongo \ No newline at end of file diff --git a/src/database/database-index.ts b/src/database/database-index.ts index c629c85e..b964862f 100644 --- a/src/database/database-index.ts +++ b/src/database/database-index.ts @@ -4,6 +4,7 @@ import getModel, { TModelType, IModel, TGenericModel } from './models/models-ind import * as queryBuilder from './utils/queryBuilder'; import getPaginatedItems, { TPaginationConfig } from './utils/paginateItemsFromDB'; import * as dotenv from 'dotenv'; +import getLogger from '../../utils/logger'; // @ts-ignore dotenv.default.config(); @@ -12,13 +13,26 @@ const { // @ts-ignore default: { connect }, } = mongoose; +const logger = getLogger(module.filename); -// @ts-ignore -connect(process.env.DATABASE_URL, { - useNewUrlParser: true, - useUnifiedTopology: true, - useCreateIndex: true, -}); +(function tryToConnect(attempts) { + logger.log('Connection attemps:', attempts); + + // @ts-ignore + connect(process.env.DATABASE_URL, { + useNewUrlParser: true, + useUnifiedTopology: true, + useCreateIndex: true, + }, function(err: unknown) { + if (err && attempts < 5) { + // @ts-ignore + logger.error('Failed to connect to MongoDB by URL:', process.env.DATABASE_URL); + setTimeout(() => tryToConnect(attempts + 1), 2000); + } else if (!err) { + logger.log('Connected to MongoDB!'); + } + }); +})(1); function saveToDB(itemData: any, modelType: TModelType): Promise { // TODO: improve validation From 6a6494b436ce671164cc6a9d2b9e994f92e26734 Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Fri, 9 Apr 2021 14:22:50 +0200 Subject: [PATCH 23/39] Fix populating database with products; --- Dockerfile | 7 + src/database/populate.ts | 182 - src/database/populate/categoryGroups.json | 6 + src/database/populate/populate.ts | 211 + src/database/populate/trialProducts.json | 7463 +++++++++++++++++++++ tsconfig.backend.json | 3 +- 6 files changed, 7689 insertions(+), 183 deletions(-) delete mode 100644 src/database/populate.ts create mode 100644 src/database/populate/categoryGroups.json create mode 100644 src/database/populate/populate.ts create mode 100644 src/database/populate/trialProducts.json diff --git a/Dockerfile b/Dockerfile index c38cfae9..b3d972f7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,7 @@ FROM node:lts-alpine3.13 +WORKDIR /app + COPY ./package*.json ./ RUN npm ci @@ -10,6 +12,11 @@ RUN npm run build COPY ./dist ./ +# TODO: automate database population process on Docker image build. +# Need to handle race condition between starting MongoDB. +#WORKDIR /app/dist/src/database/populate +#RUN node populate.js --categoriesGroupPath=categoryGroups.json trialProducts.json + EXPOSE 3000 CMD ["npm", "run", "serve"] \ No newline at end of file diff --git a/src/database/populate.ts b/src/database/populate.ts deleted file mode 100644 index a240ff4a..00000000 --- a/src/database/populate.ts +++ /dev/null @@ -1,182 +0,0 @@ -import getLogger from '../../utils/logger'; -import { connect, model, connection } from 'mongoose'; -import productSchema from './schemas/product'; -import { TGenericModel } from './models/models-index'; -import { sep } from 'path'; -import { promisify } from 'util'; -import * as G from 'glob'; -import { readFile, readFileSync } from 'fs'; -import * as dotenv from 'dotenv'; - -// @ts-ignore -dotenv.default.config(); - -const glob = promisify(G.glob); -const logger = getLogger(module.filename); -const promisifiedReadFile = promisify(readFile); - -const PARAMS: { CLEAN_ALL: string; GROUP_CATEGORIES: string } = { - CLEAN_ALL: 'cleanAll=true', - GROUP_CATEGORIES: 'categoriesGroupPath=', -}; - -type TPopulatedData = Record; - -logger.log('process.argv:', process.argv); - -(async () => { - await connectToDB(); - - const Product: TGenericModel = getProductModel(); - - if (getScriptParamValue(PARAMS.CLEAN_ALL)) { - const removedProducts = await Product.deleteMany({}); - logger.log(`Cleaning done - removed ${removedProducts.deletedCount} products.`); - } - - const sourceDataList = await getSourceData(); - - await populateProducts(Product, sourceDataList); - await assignIDsToRelatedProducts(Product); - - await connection.close(); -})(); - -function connectToDB() { - return connect(process.env.DATABASE_URL as string, { - useNewUrlParser: true, - useUnifiedTopology: true, - }); -} - -function getProductModel(): TGenericModel { - return model('Product', productSchema); -} - -async function getSourceData(): Promise { - const path: string = process.argv[2]; - - if (!path) { - return Promise.reject('Path to source data must be provided as a first argument!'); - } - - const fileName: string = process.argv[3]; - const isFileInPath = path.endsWith('.json'); - - if (!isFileInPath && (!fileName || fileName === PARAMS.CLEAN_ALL)) { - return Promise.reject( - 'If file name is not included in path as first argument, it must be provided separately - as second argument!' - ); - } - - const sourceDataPath: string = isFileInPath ? path : `${path}${sep}**${sep}${fileName}.json`; - logger.log('Got sourceDataList from sourceDataPath:', sourceDataPath); - const sourceDataFiles: string[] = (await glob(sourceDataPath)) as string[]; - const sourceDataList: Promise[] = sourceDataFiles.map(async (filePath: string) => - JSON.parse(await promisifiedReadFile(filePath, { encoding: 'utf8' })) - ); - - return Promise.all(sourceDataList); -} - -async function populateProducts(ProductModel: TGenericModel, sourceDataList: TPopulatedData[]) { - type TCategoryNameGrouper = (categoryName: string) => string; - type TNormalizersObj = { category: TCategoryNameGrouper }; - - const normalizersObj: TNormalizersObj = { - category: categoryNameGrouper(), - }; - - return Promise.all( - sourceDataList.map((data: any) => { - const product = new ProductModel(normalizeData(data, normalizersObj)); - // @ts-ignore - return product.save(); - }) - ); - - function normalizeData(data: any, normalizersObj: TNormalizersObj) { - const normalizedData = { - ...data, - category: normalizersObj.category(data.category), - }; - - const isAnyReview = data.reviews[0] !== null; - - normalizedData.reviews = { - summary: isAnyReview ? data.reviews[0] : { summary: '', reviewsAmount: 0 }, - list: isAnyReview ? data.reviews.slice(1) : [], - }; - - return normalizedData; - } - - function categoryNameGrouper(): TCategoryNameGrouper { - type CustomRegExp = RegExp & { matcher: string; replacer: string }; - - const categoriesGroupPath: string = getScriptParamValue(PARAMS.GROUP_CATEGORIES, true); - const categoryRegExps: CustomRegExp[] = JSON.parse( - readFileSync(categoriesGroupPath.split('=').pop() as string, { encoding: 'utf8' }) - ); - - if (categoriesGroupPath) { - return (categoryName: string) => { - const matchedRegExp: CustomRegExp | undefined = categoryRegExps.find( - (regExp) => typeof regExp.matcher === 'string' && new RegExp(regExp.matcher).test(categoryName) - ); - - if (matchedRegExp) { - return categoryName.replace(new RegExp(matchedRegExp.matcher), matchedRegExp.replacer); - } - - return categoryName; - }; - } - - return (categoryName: string) => categoryName; - } -} - -async function assignIDsToRelatedProducts(Product: TGenericModel) { - // temp1.forEach(product => { - // product.relatedProducts.every(rp => temp1.find(p => p.url === rp.url && p.name === rp.name)) && prods.push(product) - // }) - - const productsHavingRelatedProducts = Product.find({ relatedProducts: { $ne: [] } }); - - for await (const withRelated of productsHavingRelatedProducts) { - // @ts-ignore - for (const relatedProductToUpdate of withRelated.relatedProducts) { - const relatedProduct = await Product.findOne( - { url: relatedProductToUpdate.url, name: relatedProductToUpdate.name }, - ['url', '_id'] - ); - - await Product.updateMany( - // @ts-ignore - { 'relatedProducts.url': relatedProduct.url }, - // @ts-ignore - { $set: { 'relatedProducts.$.id': relatedProduct._id } } - ); - } - } - - const amountOfAllProducts = await Product.find({}).countDocuments(); - const amountOfRelatedProductsWithID = await Product.find({ - 'relatedProducts.id': { $exists: true }, - }).countDocuments(); - - logger.log('All done?', amountOfAllProducts === amountOfRelatedProductsWithID); -} - -function getScriptParamValue(param: string, lenientSearch = false): string { - return ( - process.argv.find((arg: string) => { - if (lenientSearch) { - return arg.includes(param); - } - - return arg === param; - }) || '' - ); -} diff --git a/src/database/populate/categoryGroups.json b/src/database/populate/categoryGroups.json new file mode 100644 index 00000000..9a640ebd --- /dev/null +++ b/src/database/populate/categoryGroups.json @@ -0,0 +1,6 @@ +[ + { + "matcher": "(Parts)- (\\w+)", + "replacer": "$1|$2" + } +] \ No newline at end of file diff --git a/src/database/populate/populate.ts b/src/database/populate/populate.ts new file mode 100644 index 00000000..1bd70007 --- /dev/null +++ b/src/database/populate/populate.ts @@ -0,0 +1,211 @@ +// cross-env TS_NODE_PROJECT=../../../tsconfig.backend.json node --inspect-brk -r ts-node/register populate.ts - +// -products=trialProducts.json categoryGroups=categoryGroups.json singleProduct cleanAll + +import getLogger from '../../../utils/logger'; +import { connect, model, connection } from 'mongoose'; +import productSchema from '../schemas/product'; +import { TGenericModel } from '../models/models-index'; +import { promisify } from 'util'; +import * as G from 'glob'; +import { readFile, readFileSync } from 'fs'; +import * as dotenv from 'dotenv'; + +// @ts-ignore +const envVar = dotenv.default.config({ path: '../../../../.env' }); + +const glob = promisify(G.glob); +const logger = getLogger(module.filename); +const promisifiedReadFile = promisify(readFile); + +const PARAMS: { CLEAN_ALL: string; PRODUCTS: string; SINGLE_PRODUCT: string; CATEGORY_GROUPS: string } = { + CLEAN_ALL: 'cleanAll', + PRODUCTS: 'products=', + SINGLE_PRODUCT: 'singleProduct', + CATEGORY_GROUPS: 'categoryGroups=', +}; + +type TPopulatedData = Record; + +logger.log('process.argv:', process.argv); +// @ts-ignore +logger.log('? envVar:', envVar, ' /__dirname:', __dirname, ' /INIT_CWD:', process.env.INIT_CWD, ' /require.main.filename:', require && require.main && require.main.filename); + +(async () => { + await connectToDB(); + + const Product: TGenericModel = getProductModel(); + + if (getScriptParamValue(PARAMS.CLEAN_ALL)) { + const removedProducts = await Product.deleteMany({}); + logger.log(`Cleaning done - removed ${removedProducts.deletedCount} products.`); + } + + debugger; + + const sourceDataList = await getSourceData(); + // logger.log('sourceDataList:', sourceDataList); + + await populateProducts(Product, sourceDataList); + + logger.log('products after population:', await Product.find({}).countDocuments()); + + await assignIDsToRelatedProducts(Product); + + await connection.close(); +})(); + +function connectToDB()/*: Promise*/ { + logger.log('???? process.env.DATABASE_URL:', process.env.DATABASE_URL); + + return connect(process.env.DATABASE_URL as string, { + useNewUrlParser: true, + useUnifiedTopology: true, + }); +} + +function getProductModel(): TGenericModel { + return model('Product', productSchema); +} + +async function getSourceData(): Promise { + const sourceDataPath: string = getScriptParamValue(PARAMS.PRODUCTS); + + if (!sourceDataPath) { + return Promise.reject( + `Path to data was not provided! You must pass "${PARAMS.PRODUCTS}" parameter.` + ); + } + + // if (/*!isFileInPath && */(!fileName || fileName === PARAMS.CLEAN_ALL)) { + // return Promise.reject( + // 'If file name is not included in path as first argument, it must be provided separately - as second argument!' + // ); + // } + + //const sourceDataPath: string = // isFileInPath ? path : `${path}${sep}**${sep}${fileName}.json`; + logger.log('Got sourceDataList from sourceDataPath:', sourceDataPath); + const sourceDataFiles = (await glob(sourceDataPath)) as string[]; + + if (getScriptParamValue(PARAMS.SINGLE_PRODUCT)) { + return JSON.parse(await promisifiedReadFile(sourceDataFiles[0], { encoding: 'utf8' })) as TPopulatedData; + } + + const sourceDataList: Promise[] = sourceDataFiles.map(async (filePath: string) => + JSON.parse(await promisifiedReadFile(filePath, { encoding: 'utf8' })) + ); + + return Promise.all(sourceDataList); +} + +async function populateProducts(ProductModel: TGenericModel, sourceDataList: TPopulatedData | TPopulatedData[]) { + type TCategoryNameGrouper = (categoryName: string) => string; + type TNormalizersObj = { category: TCategoryNameGrouper }; + + const normalizersObj: TNormalizersObj = { + category: categoryNameGrouper(), + }; + + if (!Array.isArray(sourceDataList)) { + sourceDataList = [sourceDataList]; + } + + return Promise.all( + sourceDataList.map((data: any) => { + const product = new ProductModel(normalizeData(data, normalizersObj)); + // @ts-ignore + return product.save().catch(err => { + // console.error('save err:', err, ' /data:', data); + + return err + }); + }) + ); + + function normalizeData(data: any, normalizersObj: TNormalizersObj) { + const normalizedData = { + ...data, + category: normalizersObj.category(data.category), + }; + + if (Array.isArray(data.reviews)) { + const isAnyReview = data.reviews && data.reviews[0] !== null; + normalizedData.reviews = { + summary: isAnyReview ? data.reviews[0] : {rating: '', reviewsAmount: 0}, + list: isAnyReview ? data.reviews.slice(1) : [], + }; + } else { + normalizedData.reviews = data.reviews; + } + + return normalizedData; + } + + function categoryNameGrouper(): TCategoryNameGrouper { + type CustomRegExp = RegExp & { matcher: string; replacer: string }; + + const categoriesGroupPath: string = getScriptParamValue(PARAMS.CATEGORY_GROUPS); + const categoryRegExps: CustomRegExp[] = JSON.parse( + readFileSync(categoriesGroupPath, { encoding: 'utf8' }) + ); + + if (categoriesGroupPath) { + return (categoryName: string) => { + const matchedRegExp: CustomRegExp | undefined = categoryRegExps.find( + (regExp) => typeof regExp.matcher === 'string' && new RegExp(regExp.matcher).test(categoryName) + ); + + if (matchedRegExp) { + return categoryName.replace(new RegExp(matchedRegExp.matcher), matchedRegExp.replacer); + } + + return categoryName; + }; + } + + return (categoryName: string) => categoryName; + } +} + +async function assignIDsToRelatedProducts(Product: TGenericModel) { + // temp1.forEach(product => { + // product.relatedProducts.every(rp => temp1.find(p => p.url === rp.url && p.name === rp.name)) && prods.push(product) + // }) + + const productsHavingRelatedProducts = Product.find({ relatedProducts: { $ne: [] } }); + + for await (const withRelated of productsHavingRelatedProducts) { + // @ts-ignore + for (const relatedProductToUpdate of withRelated.relatedProducts) { + const relatedProduct = await Product.findOne( + { url: relatedProductToUpdate.url, name: relatedProductToUpdate.name }, + ['url', '_id'] + ); + + if (relatedProduct) { + await Product.updateMany( + // @ts-ignore + {'relatedProducts.url': relatedProduct.url}, + // @ts-ignore + {$set: {'relatedProducts.$.id': relatedProduct._id}} + ); + } + } + } + + const amountOfAllProducts = await Product.find({}).countDocuments(); + const amountOfRelatedProductsWithID = await Product.find({ + 'relatedProducts.id': { $exists: true }, + }).countDocuments(); + + logger.log( + 'All done?', amountOfAllProducts === amountOfRelatedProductsWithID, + ' /amountOfAllProducts:', amountOfAllProducts, + ' /amountOfRelatedProductsWithID:', amountOfRelatedProductsWithID + ); +} + +function getScriptParamValue(param: string): string { + const paramValue = process.argv.find((arg: string) => arg.includes(param)); + + return paramValue ? (paramValue.split('=').pop() as string) : ''; +} diff --git a/src/database/populate/trialProducts.json b/src/database/populate/trialProducts.json new file mode 100644 index 00000000..b7854fa8 --- /dev/null +++ b/src/database/populate/trialProducts.json @@ -0,0 +1,7463 @@ +[ + { + "shortDescription": [ + "Grip tape makes a dramatic improvement t the ride quality of smooth finished pedals, such as the King Song 14B/14C & IPS a130s", + "To be cut to cover the pedal. This piece should be sufficient to cover the surface of both pedals", + "Good quality black finish, built for skateboarders in mind" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": ".4 lbs" + }, + { + "heading": "Dimensions", + "data": "12 × 10 × 1 in" + } + ], + "images": [ + { + "main": [ + { + "src": "Jessup-Skate-Tape-1.jpg", + "srcset": [ + "Jessup-Skate-Tape-1-65x65.jpg 65w", + "Jessup-Skate-Tape-1-66x66.jpg 66w", + "Jessup-Skate-Tape-1-75x75.jpg 75w", + "Jessup-Skate-Tape-1-120x120.jpg 120w", + "Jessup-Skate-Tape-1-150x150.jpg 150w", + "Jessup-Skate-Tape-1-200x200.jpg 200w", + "Jessup-Skate-Tape-1-300x300.jpg 300w", + "Jessup-Skate-Tape-1-400x400.jpg 400w", + "Jessup-Skate-Tape-1-500x500.jpg 500w", + "Jessup-Skate-Tape-1-600x600.jpg 600w", + "Jessup-Skate-Tape-1.jpg 700w" + ] + }, + { + "src": "Jessup-Skate-Tape-1.jpg", + "srcset": [ + "Jessup-Skate-Tape-1-65x65.jpg 65w", + "Jessup-Skate-Tape-1-66x66.jpg 66w", + "Jessup-Skate-Tape-1-75x75.jpg 75w", + "Jessup-Skate-Tape-1-120x120.jpg 120w", + "Jessup-Skate-Tape-1-150x150.jpg 150w", + "Jessup-Skate-Tape-1-200x200.jpg 200w", + "Jessup-Skate-Tape-1-300x300.jpg 300w", + "Jessup-Skate-Tape-1-400x400.jpg 400w", + "Jessup-Skate-Tape-1-500x500.jpg 500w", + "Jessup-Skate-Tape-1-600x600.jpg 600w", + "Jessup-Skate-Tape-1.jpg 700w" + ] + }, + { + "src": "Jessup-Skate-Tape-2.jpg", + "srcset": null + }, + { + "src": "Jessup-Skate-Tape-2.jpg", + "srcset": null + } + ] + } + ], + "relatedProducts": [ + { + "name": "Dualtron Ultra- Tube Off-Road Tire", + "url": "dualtron-ultra-tube-off-road-tire", + "price": 42 + }, + { + "name": "Electric Scooter: Inner-tube 10”x 2”", + "url": "electric-scooter-inner-tube-10x-2", + "price": 16 + }, + { + "name": "Electric Scooter: Tire 8”x 2”", + "url": "l6-8-front-tire", + "price": 31 + }, + { + "name": "Electric Scooter: Inner-tube 8”x 2”", + "url": "l6-8-innertube", + "price": 12 + } + ], + "price": 15, + "reviews": { + "list": [], + "summary": { + "summary": "", + "reviewsAmount": 0 + } + }, + "url": "12-x-9-piece-of-jessup-skate-grip-tape", + "name": "12” x 9” Piece of Jessup Skate Grip Tape", + "category": "Accessories" + }, + { + "shortDescription": [ + "A 16″ inner-tube, suitable for the Inmotion V8, King Song 16, & Gotway ACMs+." + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "1 lbs" + }, + { + "heading": "Dimensions", + "data": "5 × 6 × 1 in" + } + ], + "images": [ + { + "main": [ + { + "src": "V8-Innertube.jpg", + "srcset": [ + "V8-Innertube-66x66.jpg 66w", + "V8-Innertube-75x75.jpg 75w", + "V8-Innertube-120x120.jpg 120w", + "V8-Innertube-150x150.jpg 150w", + "V8-Innertube-200x200.jpg 200w", + "V8-Innertube-300x300.jpg 300w", + "V8-Innertube-400x399.jpg 400w", + "V8-Innertube-500x499.jpg 500w", + "V8-Innertube-600x599.jpg 600w", + "V8-Innertube.jpg 702w" + ] + }, + { + "src": "V8-Innertube.jpg", + "srcset": [ + "V8-Innertube-66x66.jpg 66w", + "V8-Innertube-75x75.jpg 75w", + "V8-Innertube-120x120.jpg 120w", + "V8-Innertube-150x150.jpg 150w", + "V8-Innertube-200x200.jpg 200w", + "V8-Innertube-300x300.jpg 300w", + "V8-Innertube-400x399.jpg 400w", + "V8-Innertube-500x499.jpg 500w", + "V8-Innertube-600x599.jpg 600w", + "V8-Innertube.jpg 702w" + ] + } + ] + } + ], + "relatedProducts": [ + { + "name": "Electric Scooter: Tire 8”x 2”", + "url": "l6-8-front-tire", + "price": 31 + }, + { + "name": "NEW: Inmotion XL Pedals for V10/F, V8/Glide 3, V5F/Glide 2", + "url": "new-inmotion-xl-pedals-for-v10-f-v8-glide-3-v5f-glide-2", + "price": 110 + }, + { + "name": "Inner-tube: 18” x 2.5”, Kenda", + "url": "18-innertube-for-msuper-ks18", + "price": 27 + }, + { + "name": "New: Speedway Mini4 5A/54.6v Charger", + "url": "new-speedway-mini4-5a-54-6v-charger", + "price": 125 + } + ], + "price": 19, + "reviews": { + "list": [], + "summary": { + "summary": "", + "reviewsAmount": 0 + } + }, + "url": "16-x-1-95-innertube", + "name": "Inner-tube: 16” x 2.125”, Kenda", + "category": "Accessories" + }, + { + "shortDescription": [ + "Quality 18″ Kenda with the bent tube", + "Most common repair of a the Wheel is replacing innertubes—usually, this is because if not adequately inflated, the innertube rubs against the inside of the tire causing premature wear. Keep you tire inflated to at least 40psi for maximum life", + "To replace, the Motor needs to come off, which is about a 1 hour job" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "1 lbs" + }, + { + "heading": "Dimensions", + "data": "5 × 5 × 3 in" + } + ], + "images": [ + { + "main": [ + { + "src": "KS18-1.jpg", + "srcset": [ + "KS18-1-65x65.jpg 65w", + "KS18-1-66x66.jpg 66w", + "KS18-1-75x75.jpg 75w", + "KS18-1-120x120.jpg 120w", + "KS18-1-150x150.jpg 150w", + "KS18-1-200x200.jpg 200w", + "KS18-1-300x300.jpg 300w", + "KS18-1-400x400.jpg 400w", + "KS18-1-500x500.jpg 500w", + "KS18-1-600x600.jpg 600w", + "KS18-1.jpg 700w" + ] + }, + { + "src": "KS18-1.jpg", + "srcset": [ + "KS18-1-65x65.jpg 65w", + "KS18-1-66x66.jpg 66w", + "KS18-1-75x75.jpg 75w", + "KS18-1-120x120.jpg 120w", + "KS18-1-150x150.jpg 150w", + "KS18-1-200x200.jpg 200w", + "KS18-1-300x300.jpg 300w", + "KS18-1-400x400.jpg 400w", + "KS18-1-500x500.jpg 500w", + "KS18-1-600x600.jpg 600w", + "KS18-1.jpg 700w" + ] + }, + { + "src": "KS18-2.jpg", + "srcset": null + }, + { + "src": "KS18-2.jpg", + "srcset": null + } + ] + } + ], + "relatedProducts": [ + { + "name": "Inner-tube: 16” x 2.125”, Kenda", + "url": "16-x-1-95-innertube", + "price": 22 + }, + { + "name": "Tire: 18” x 2.5”, Kenda", + "url": "18-kenda-tire", + "price": 59 + }, + { + "name": "Protective Padding/Bumper Strip", + "url": "soft-padding-protective", + "price": 10 + }, + { + "name": "Electric Scooter: Inner-tube 10”x 2”", + "url": "electric-scooter-inner-tube-10x-2", + "price": 16 + } + ], + "price": 25, + "reviews": { + "list": [], + "summary": { + "summary": "", + "reviewsAmount": 0 + } + }, + "url": "18-innertube-for-msuper-ks18", + "name": "Inner-tube: 18” x 2.5”, Kenda", + "category": "Accessories" + }, + { + "shortDescription": [ + "King Song 18″ replacement tire, 2.5″ wide\nFits other 18″ Wheels as well" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "1.5 lbs" + }, + { + "heading": "Dimensions", + "data": "16 × 15 × 1 in" + } + ], + "images": [ + { + "main": [ + { + "src": "KS-18-Tire.png", + "srcset": [ + "KS-18-Tire-66x66.png 66w", + "KS-18-Tire-75x75.png 75w", + "KS-18-Tire-120x120.png 120w", + "KS-18-Tire-150x150.png 150w", + "KS-18-Tire-200x200.png 200w", + "KS-18-Tire-300x300.png 300w", + "KS-18-Tire-400x399.png 400w", + "KS-18-Tire-500x499.png 500w", + "KS-18-Tire-600x599.png 600w", + "KS-18-Tire.png 702w" + ] + }, + { + "src": "KS-18-Tire.png", + "srcset": [ + "KS-18-Tire-66x66.png 66w", + "KS-18-Tire-75x75.png 75w", + "KS-18-Tire-120x120.png 120w", + "KS-18-Tire-150x150.png 150w", + "KS-18-Tire-200x200.png 200w", + "KS-18-Tire-300x300.png 300w", + "KS-18-Tire-400x399.png 400w", + "KS-18-Tire-500x499.png 500w", + "KS-18-Tire-600x599.png 600w", + "KS-18-Tire.png 702w" + ] + } + ] + } + ], + "relatedProducts": [ + { + "name": "eWheels Branded Wrist-guards", + "url": "ewheels-branded-wrist-guard", + "price": 19 + }, + { + "name": "Inner-Tube: 14” x 2.125”, Kenda", + "url": "king-song-14-inner-tube", + "price": 22.5 + }, + { + "name": "Tire: 14” x 2.125”, Kenda", + "url": "king-song-14-tire-inner-tube", + "price": 36 + }, + { + "name": "NEW: Gotway Tesla 16” 1020Wh/2000W Motor", + "url": "new-gotway-tesla-16-1020wh-1900w-motor", + "price": 1512.5 + } + ], + "price": 49, + "reviews": { + "list": [], + "summary": { + "summary": "", + "reviewsAmount": 0 + } + }, + "url": "18-kenda-tire", + "name": "Tire: 18” x 2.5”, Kenda", + "category": "Accessories" + }, + { + "shortDescription": [ + "Now Available in a choice of four different colors", + "Provided courtesy of Kevin & Chrissi of Roll.nz", + "Handcrafted from reinforced neoprene, with triple-stitching to provide the highest quality protection for your KS18L/XL", + "Existing eWheels Customers receive free shipping within the US", + "Unable to ship outside of North America, please contact roll.nz" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "1 lbs" + }, + { + "heading": "Dimensions", + "data": "10 × 10 × 1 in" + }, + { + "heading": "Colour", + "data": "Lime Green, Black, Blue, Red" + } + ], + "images": [ + { + "main": [ + { + "src": "EUC_Bodyguard-18L-Whole_Cover.jpg", + "srcset": [ + "EUC_Bodyguard-18L-Whole_Cover-66x66.jpg 66w", + "EUC_Bodyguard-18L-Whole_Cover-75x75.jpg 75w", + "EUC_Bodyguard-18L-Whole_Cover-100x100.jpg 100w", + "EUC_Bodyguard-18L-Whole_Cover-150x150.jpg 150w", + "EUC_Bodyguard-18L-Whole_Cover-200x200.jpg 200w", + "EUC_Bodyguard-18L-Whole_Cover-300x300.jpg 300w", + "EUC_Bodyguard-18L-Whole_Cover-400x400.jpg 400w", + "EUC_Bodyguard-18L-Whole_Cover-500x500.jpg 500w", + "EUC_Bodyguard-18L-Whole_Cover-600x600.jpg 600w", + "EUC_Bodyguard-18L-Whole_Cover-700x700.jpg 700w", + "EUC_Bodyguard-18L-Whole_Cover-768x768.jpg 768w", + "EUC_Bodyguard-18L-Whole_Cover.jpg 800w" + ] + }, + { + "src": "EUC_Bodyguard-18L-Whole_Cover-700x700.jpg", + "srcset": [ + "EUC_Bodyguard-18L-Whole_Cover-66x66.jpg 66w", + "EUC_Bodyguard-18L-Whole_Cover-75x75.jpg 75w", + "EUC_Bodyguard-18L-Whole_Cover-100x100.jpg 100w", + "EUC_Bodyguard-18L-Whole_Cover-150x150.jpg 150w", + "EUC_Bodyguard-18L-Whole_Cover-200x200.jpg 200w", + "EUC_Bodyguard-18L-Whole_Cover-300x300.jpg 300w", + "EUC_Bodyguard-18L-Whole_Cover-400x400.jpg 400w", + "EUC_Bodyguard-18L-Whole_Cover-500x500.jpg 500w", + "EUC_Bodyguard-18L-Whole_Cover-600x600.jpg 600w", + "EUC_Bodyguard-18L-Whole_Cover-700x700.jpg 700w", + "EUC_Bodyguard-18L-Whole_Cover-768x768.jpg 768w", + "EUC_Bodyguard-18L-Whole_Cover.jpg 800w" + ] + }, + { + "src": "EUC_Bodyguard-18L-Cutout_Sizes.jpg", + "srcset": null + }, + { + "src": "EUC_Bodyguard-18L-Cutout_Sizes-700x700.jpg", + "srcset": null + }, + { + "src": "EUC_Bodyguard-18L-Mudflap.jpg", + "srcset": null + }, + { + "src": "EUC_Bodyguard-18L-Mudflap-700x700.jpg", + "srcset": null + }, + { + "src": "EUC_Bodyguard-18L-Fitted.jpg", + "srcset": null + }, + { + "src": "EUC_Bodyguard-18L-Fitted-700x700.jpg", + "srcset": null + } + ] + } + ], + "relatedProducts": [ + { + "name": "KS 14C: Replacement Control-Board", + "url": "king-song-14-control-board", + "price": 125 + }, + { + "name": "KS 16B: Replacement Control-Board", + "url": "king-song-16-control-board", + "price": 165 + }, + { + "name": "KS 14C & 16B: 840Wh Battery Pack Pair", + "url": "king-song-840wh-battery-pack", + "price": 599 + }, + { + "name": "KS 14B/C: Pair of Replacement LED Covers, Black", + "url": "king-song-14-led-panels-black", + "price": 40 + } + ], + "price": 98, + "reviews": { + "list": [ + { + "content": "Fits very well. Thick material helps protect your wheel from scratches, which are inevitable in the learning process", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Mason Pagnini", + "reviewRate": 5 + }, + { + "content": "Fits like a glove! I'll admit i rode it for a while before realizing it has tabs in the corners to make it fit perfectly! Decided to buy this after learning for 30 minutes in the grass. By the time it arrived, I was ready for the street. This cover is a learning lifesaver! I have dropped this and it has skid across horribly rough asphalt dozens of times, and both the cover and wheel look new. Well... except the pedals and handle! Great investment, helps reduce impact to plastic and keep scratches down. It also holds my pads in place after having to remove/reinstall them for servicing. Softer on the inner legs too. Waiting on bigger pedals and then my 18L truly will feel like a plush luxury vehicle.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Shane Sublett", + "reviewRate": 5 + }, + { + "content": "Haven’t put it on yet great quality", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Jason Lescault", + "reviewRate": 5 + }, + { + "content": "Seems well made and it fits my KS-18L perfectly", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "My only regret is that I didn’t purchase this when I purchased my wheel. It definitely would’ve saved my wheel from scratches and having to purchase a new pad after a crash. It seems well-made and the fit is very good I highly recommend this product!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Brian Norris", + "reviewRate": 5 + }, + { + "content": "Bought this cover in black and it's awesome. Definitely does a great job protecting the wheel. Fitment is a little awkward but honestly it's pretty straight forward. One thing to note is I had an issue where the cover was bulging (kinda like the fit wasn't snug) at the front and near the bottom where the cover attaches. I thought forever the it was loose and just a one off defect and it may be but I'm thinking at this point that it's normal. Basically you have to pull at the light and sensor/power button cutouts to make it snug. NOT pull the bottom down to make it snug because that will just cause the same problem on the other side of the wheel. I imagine the covers are hand made so entirely possible mine doesn't fit exactly right. Side note and a nice touch was that they put nice soft leather on the little pockets that attach to the inside of the wheel casing/side panels to keep the case on. I think the wheel looks a lot better with the cover on since it smooths over the sharp edges the 18XL naturally has. Has perfectly protected my wheel completely from some gnarly falls/drops. Don't forget to take it off every couple weeks or even sooner to clean the dust that builds up on the underside of the cover and in the leather pockets that attach to the lower casing/side panels. Overall thumbs up, definitely worth it!! Wish they had this for the MSX and other wheels!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Mael", + "reviewRate": 5 + } + ], + "summary": { + "rating": 5, + "reviewsAmount": "6 Reviews" + } + }, + "url": "18l-xl-bodyguard-protective-neoprene-covers-roll-nz", + "name": "18L/XL Bodyguard Protective Neoprene Covers Roll.nz", + "category": "Accessories" + }, + { + "shortDescription": [ + "84.2v 800Wh battery pack", + "Composed of the Sanyo NCR18650GA 3.5Ah Battery Cells", + "Intended for the ACMS+/MSuper V3S+/Monster", + "Provides about 4o miles range at a 20MPH cruising speed", + "If adding to a 1600Wh Monster, will also require the power Y-Connector" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "15 lbs" + }, + { + "heading": "Dimensions", + "data": "20 × 10 × 4 in" + } + ], + "images": [ + { + "main": [ + { + "src": "GW-Battery-Pack-800Wh.jpg", + "srcset": [ + "GW-Battery-Pack-800Wh-65x65.jpg 65w", + "GW-Battery-Pack-800Wh-66x66.jpg 66w", + "GW-Battery-Pack-800Wh-75x75.jpg 75w", + "GW-Battery-Pack-800Wh-120x120.jpg 120w", + "GW-Battery-Pack-800Wh-150x150.jpg 150w", + "GW-Battery-Pack-800Wh-200x200.jpg 200w", + "GW-Battery-Pack-800Wh-300x300.jpg 300w", + "GW-Battery-Pack-800Wh-400x400.jpg 400w", + "GW-Battery-Pack-800Wh-500x500.jpg 500w", + "GW-Battery-Pack-800Wh-600x600.jpg 600w", + "GW-Battery-Pack-800Wh.jpg 700w" + ] + }, + { + "src": "GW-Battery-Pack-800Wh.jpg", + "srcset": [ + "GW-Battery-Pack-800Wh-65x65.jpg 65w", + "GW-Battery-Pack-800Wh-66x66.jpg 66w", + "GW-Battery-Pack-800Wh-75x75.jpg 75w", + "GW-Battery-Pack-800Wh-120x120.jpg 120w", + "GW-Battery-Pack-800Wh-150x150.jpg 150w", + "GW-Battery-Pack-800Wh-200x200.jpg 200w", + "GW-Battery-Pack-800Wh-300x300.jpg 300w", + "GW-Battery-Pack-800Wh-400x400.jpg 400w", + "GW-Battery-Pack-800Wh-500x500.jpg 500w", + "GW-Battery-Pack-800Wh-600x600.jpg 600w", + "GW-Battery-Pack-800Wh.jpg 700w" + ] + } + ] + } + ], + "relatedProducts": [ + { + "name": "GW Monster: Set of Side Panels, Black", + "url": "monster-set-of-side-panels-black", + "price": 68.5 + }, + { + "name": "GW Telsa: Replacement Control-Board", + "url": "gw-telsa-replacement-control-board", + "price": 174 + }, + { + "name": "GW MSuper: Set of Pedals", + "url": "msuper-set-of-pedals", + "price": 99 + }, + { + "name": "GW Monster: Pair of Shells", + "url": "gw-monster-pair-shells", + "price": 196 + } + ], + "price": 650, + "reviews": { + "list": [], + "summary": { + "summary": "", + "reviewsAmount": 0 + } + }, + "url": "800wh-84-2v-battery-pack-for-the-acmsmsuper-v3smonster", + "name": "GW ACMs+/MSuper V3s+: 800Wh, 84.2v Battery Pack", + "category": "Parts|Gotway" + }, + { + "shortDescription": [ + "Pedals fitted to the ACM/ACMS+", + "Large, flat, grippy, anti-slip surface", + "Overall length is just under 9″, each pedal weighs about 1lb or 450g" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "3 lbs" + }, + { + "heading": "Dimensions", + "data": "16 × 6 × 3 in" + } + ], + "images": [ + { + "main": [ + { + "src": "GW-ACM-Pedals-1.jpg", + "srcset": [ + "GW-ACM-Pedals-1-65x65.jpg 65w", + "GW-ACM-Pedals-1-66x66.jpg 66w", + "GW-ACM-Pedals-1-75x75.jpg 75w", + "GW-ACM-Pedals-1-120x120.jpg 120w", + "GW-ACM-Pedals-1-150x150.jpg 150w", + "GW-ACM-Pedals-1-200x200.jpg 200w", + "GW-ACM-Pedals-1-300x300.jpg 300w", + "GW-ACM-Pedals-1-400x400.jpg 400w", + "GW-ACM-Pedals-1-500x500.jpg 500w", + "GW-ACM-Pedals-1-600x600.jpg 600w", + "GW-ACM-Pedals-1.jpg 700w" + ] + }, + { + "src": "GW-ACM-Pedals-1.jpg", + "srcset": [ + "GW-ACM-Pedals-1-65x65.jpg 65w", + "GW-ACM-Pedals-1-66x66.jpg 66w", + "GW-ACM-Pedals-1-75x75.jpg 75w", + "GW-ACM-Pedals-1-120x120.jpg 120w", + "GW-ACM-Pedals-1-150x150.jpg 150w", + "GW-ACM-Pedals-1-200x200.jpg 200w", + "GW-ACM-Pedals-1-300x300.jpg 300w", + "GW-ACM-Pedals-1-400x400.jpg 400w", + "GW-ACM-Pedals-1-500x500.jpg 500w", + "GW-ACM-Pedals-1-600x600.jpg 600w", + "GW-ACM-Pedals-1.jpg 700w" + ] + } + ] + } + ], + "relatedProducts": [ + { + "name": "GW Monster: Replacement Control-Board", + "url": "monster-control-board", + "price": 196 + }, + { + "name": "GW MTen3: Replacement Control-Board", + "url": "gw-mten3-replacement-control-board", + "price": 174 + }, + { + "name": "GW MSuper: Set of Pedals", + "url": "msuper-set-of-pedals", + "price": 99 + }, + { + "name": "GW Monster: Seat/Cushion", + "url": "monster-seatcushion", + "price": 87 + } + ], + "price": 98, + "reviews": { + "list": [], + "summary": { + "rating": 0, + "reviewsAmount": "0 Reviews" + } + }, + "url": "acmacms-set-of-pedals", + "name": "GW ACM/ACMS+: Set of Pedals", + "category": "Parts|Gotway" + }, + { + "shortDescription": [ + "Latest generation Gotway ACMs+ Control-board", + "Fitted with 12 MOSFETS, Gotway’s spec of 4,000W peak power!", + "14awg motor wiring, large heat-sink with cooling fins, 5mm bullet connectors", + "New firmware update applied to prevent the Wheel from spinning out of control, when the Wheel is laid down on it’s side", + "Note: when shipping out the boards, we can apply either the 67.2v or 84.2v firmware, please let us know in the notes field on checkout that which you require. On older variant ACMs+s you may need to replace the original black connectors from the motor." + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "2 lbs" + }, + { + "heading": "Dimensions", + "data": "8 × 8 × 4 in" + } + ], + "images": [ + { + "main": [ + { + "src": "GW-ACMS-CB-1.jpg", + "srcset": [ + "GW-ACMS-CB-1-66x66.jpg 66w", + "GW-ACMS-CB-1-75x75.jpg 75w", + "GW-ACMS-CB-1-120x120.jpg 120w", + "GW-ACMS-CB-1-150x150.jpg 150w", + "GW-ACMS-CB-1-200x200.jpg 200w", + "GW-ACMS-CB-1-300x300.jpg 300w", + "GW-ACMS-CB-1-400x400.jpg 400w", + "GW-ACMS-CB-1-500x500.jpg 500w", + "GW-ACMS-CB-1-600x600.jpg 600w", + "GW-ACMS-CB-1-768x768.jpg 768w", + "GW-ACMS-CB-1.jpg 800w" + ] + }, + { + "src": "GW-ACMS-CB-1.jpg", + "srcset": [ + "GW-ACMS-CB-1-66x66.jpg 66w", + "GW-ACMS-CB-1-75x75.jpg 75w", + "GW-ACMS-CB-1-120x120.jpg 120w", + "GW-ACMS-CB-1-150x150.jpg 150w", + "GW-ACMS-CB-1-200x200.jpg 200w", + "GW-ACMS-CB-1-300x300.jpg 300w", + "GW-ACMS-CB-1-400x400.jpg 400w", + "GW-ACMS-CB-1-500x500.jpg 500w", + "GW-ACMS-CB-1-600x600.jpg 600w", + "GW-ACMS-CB-1-768x768.jpg 768w", + "GW-ACMS-CB-1.jpg 800w" + ] + }, + { + "src": "GW-ACMs-CB-BM.jpg", + "srcset": null + }, + { + "src": "GW-ACMs-CB-BM.jpg", + "srcset": null + } + ] + } + ], + "relatedProducts": [ + { + "name": "GW ACM/ACMS+: Set of Pedals", + "url": "acmacms-set-of-pedals", + "price": 98 + }, + { + "name": "GW MSuper V3s+: Replacement Control-Board", + "url": "msuper-v3s-control-board", + "price": 165 + }, + { + "name": "GW MTen3: Replacement Control-Board", + "url": "gw-mten3-replacement-control-board", + "price": 174 + }, + { + "name": "GW MSuper V3s+: Set of Side Panels, Black", + "url": "msuper-3s-set-of-side-panels-black", + "price": 65.5 + } + ], + "price": 165, + "reviews": { + "list": [], + "summary": { + "summary": "", + "reviewsAmount": 0 + } + }, + "url": "acms-control-board", + "name": "GW ACM/ACMS+: Replacement Control-Board", + "category": "Parts|Gotway" + }, + { + "shortDescription": [ + "Latch for locking the handlebar column on the Dualtron 2/3", + "Dualtron Ultra/Thunder use the larger clamp", + "Estimated installation time: 1 Min" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "1 lbs" + }, + { + "heading": "Dimensions", + "data": "5 × 3 × 1 in" + } + ], + "images": [ + { + "main": [ + { + "src": "DT-CLAMP-1.jpg", + "srcset": [ + "DT-CLAMP-1-66x66.jpg 66w", + "DT-CLAMP-1-75x75.jpg 75w", + "DT-CLAMP-1-100x100.jpg 100w", + "DT-CLAMP-1-150x150.jpg 150w", + "DT-CLAMP-1-200x200.jpg 200w", + "DT-CLAMP-1-300x300.jpg 300w", + "DT-CLAMP-1-400x400.jpg 400w", + "DT-CLAMP-1-500x500.jpg 500w", + "DT-CLAMP-1-600x600.jpg 600w", + "DT-CLAMP-1-700x700.jpg 700w", + "DT-CLAMP-1-768x768.jpg 768w", + "DT-CLAMP-1-800x800.jpg 800w", + "DT-CLAMP-1.jpg 801w" + ] + }, + { + "src": "DT-CLAMP-1-700x700.jpg", + "srcset": [ + "DT-CLAMP-1-66x66.jpg 66w", + "DT-CLAMP-1-75x75.jpg 75w", + "DT-CLAMP-1-100x100.jpg 100w", + "DT-CLAMP-1-150x150.jpg 150w", + "DT-CLAMP-1-200x200.jpg 200w", + "DT-CLAMP-1-300x300.jpg 300w", + "DT-CLAMP-1-400x400.jpg 400w", + "DT-CLAMP-1-500x500.jpg 500w", + "DT-CLAMP-1-600x600.jpg 600w", + "DT-CLAMP-1-700x700.jpg 700w", + "DT-CLAMP-1-768x768.jpg 768w", + "DT-CLAMP-1-800x800.jpg 800w", + "DT-CLAMP-1.jpg 801w" + ] + } + ] + } + ], + "relatedProducts": [ + { + "name": "Dualtron- Side Panels", + "url": "dualtron-side-panels", + "price": 72 + }, + { + "name": "Dualtron 2- Rear Fender/Mud-guard", + "url": "dualtron-2-rear-fender-mud-guard", + "price": 29 + }, + { + "name": "Dualtron Spider- Controller", + "url": "dualtron-spider-controller", + "price": 148 + }, + { + "name": "Dualtron Thunder-Ultra- Handlebar Locking Latch", + "url": "dualtron-thunder-ultra-handlebar-locking-latch", + "price": 15 + } + ], + "price": 14, + "reviews": { + "list": [], + "summary": { + "summary": "", + "reviewsAmount": 0 + } + }, + "url": "dualtron-2-3-handlebar-locking-latch", + "name": "Dualtron 2-3- Handlebar Locking Latch", + "category": "Parts|Dualtron" + }, + { + "shortDescription": [ + "Dualtron 2 handlebar support strut & front wheel suspension", + "Compatible with the Dualtron 2", + "Estimated installation time: 1-2 hours" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "3 lbs" + }, + { + "heading": "Dimensions", + "data": "16 × 8 × 3 in" + } + ], + "images": [ + { + "main": [ + { + "src": "DT2-F-HBAR-BAE-1.jpg", + "srcset": [ + "DT2-F-HBAR-BAE-1-66x66.jpg 66w", + "DT2-F-HBAR-BAE-1-75x75.jpg 75w", + "DT2-F-HBAR-BAE-1-100x100.jpg 100w", + "DT2-F-HBAR-BAE-1-150x150.jpg 150w", + "DT2-F-HBAR-BAE-1-200x200.jpg 200w", + "DT2-F-HBAR-BAE-1-300x300.jpg 300w", + "DT2-F-HBAR-BAE-1-400x400.jpg 400w", + "DT2-F-HBAR-BAE-1-500x500.jpg 500w", + "DT2-F-HBAR-BAE-1-600x600.jpg 600w", + "DT2-F-HBAR-BAE-1-700x700.jpg 700w", + "DT2-F-HBAR-BAE-1-768x768.jpg 768w", + "DT2-F-HBAR-BAE-1-800x800.jpg 800w", + "DT2-F-HBAR-BAE-1.jpg 801w" + ] + }, + { + "src": "DT2-F-HBAR-BAE-1-700x700.jpg", + "srcset": [ + "DT2-F-HBAR-BAE-1-66x66.jpg 66w", + "DT2-F-HBAR-BAE-1-75x75.jpg 75w", + "DT2-F-HBAR-BAE-1-100x100.jpg 100w", + "DT2-F-HBAR-BAE-1-150x150.jpg 150w", + "DT2-F-HBAR-BAE-1-200x200.jpg 200w", + "DT2-F-HBAR-BAE-1-300x300.jpg 300w", + "DT2-F-HBAR-BAE-1-400x400.jpg 400w", + "DT2-F-HBAR-BAE-1-500x500.jpg 500w", + "DT2-F-HBAR-BAE-1-600x600.jpg 600w", + "DT2-F-HBAR-BAE-1-700x700.jpg 700w", + "DT2-F-HBAR-BAE-1-768x768.jpg 768w", + "DT2-F-HBAR-BAE-1-800x800.jpg 800w", + "DT2-F-HBAR-BAE-1.jpg 801w" + ] + }, + { + "src": "DT2-F-HBAR-BAS-2.jpg", + "srcset": null + }, + { + "src": "DT2-F-HBAR-BAS-2-700x700.jpg", + "srcset": null + } + ] + } + ], + "relatedProducts": [ + { + "name": "Dualtron 2-3- Handlebar Locking Latch", + "url": "dualtron-2-3-handlebar-locking-latch", + "price": 14 + }, + { + "name": "Dualtron- Side-panel to Controller Splitter Cable", + "url": "dualtron-side-panel-to-controller-splitter-cable", + "price": 25 + }, + { + "name": "Dualtron- Seat Kit", + "url": "dualtron-seat-kit", + "price": 120 + }, + { + "name": "Dualtron- Front Fender/Mud-guard", + "url": "dualtron-front-fender-mud-guard", + "price": 31 + } + ], + "price": 86, + "reviews": { + "list": [], + "summary": { + "summary": "", + "reviewsAmount": 0 + } + }, + "url": "dualtron-2-handlebar-support-strut-suspension", + "name": "Dualtron 2- Handlebar Support Strut & Suspension", + "category": "Parts|Dualtron" + }, + { + "shortDescription": [ + "Dualtron 2 rear fender", + "Compatible with the Dualtron 2", + "Installed on the rear suspension arm above the motor", + "Estimated installation time: 5 Min" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "1 lbs" + }, + { + "heading": "Dimensions", + "data": "8 × 5 × 3 in" + } + ], + "images": [ + { + "main": [ + { + "src": "DT2-R-FEND-1.jpg", + "srcset": [ + "DT2-R-FEND-1-66x66.jpg 66w", + "DT2-R-FEND-1-75x75.jpg 75w", + "DT2-R-FEND-1-100x100.jpg 100w", + "DT2-R-FEND-1-150x150.jpg 150w", + "DT2-R-FEND-1-200x200.jpg 200w", + "DT2-R-FEND-1-300x300.jpg 300w", + "DT2-R-FEND-1-400x400.jpg 400w", + "DT2-R-FEND-1-500x500.jpg 500w", + "DT2-R-FEND-1-600x600.jpg 600w", + "DT2-R-FEND-1-700x700.jpg 700w", + "DT2-R-FEND-1-768x768.jpg 768w", + "DT2-R-FEND-1-800x800.jpg 800w", + "DT2-R-FEND-1.jpg 801w" + ] + }, + { + "src": "DT2-R-FEND-1-700x700.jpg", + "srcset": [ + "DT2-R-FEND-1-66x66.jpg 66w", + "DT2-R-FEND-1-75x75.jpg 75w", + "DT2-R-FEND-1-100x100.jpg 100w", + "DT2-R-FEND-1-150x150.jpg 150w", + "DT2-R-FEND-1-200x200.jpg 200w", + "DT2-R-FEND-1-300x300.jpg 300w", + "DT2-R-FEND-1-400x400.jpg 400w", + "DT2-R-FEND-1-500x500.jpg 500w", + "DT2-R-FEND-1-600x600.jpg 600w", + "DT2-R-FEND-1-700x700.jpg 700w", + "DT2-R-FEND-1-768x768.jpg 768w", + "DT2-R-FEND-1-800x800.jpg 800w", + "DT2-R-FEND-1.jpg 801w" + ] + } + ] + } + ], + "relatedProducts": [ + { + "name": "Dualtron 3-Thunder- Suspension Cartridge Modules", + "url": "dualtron-3-thunder-suspension-cartridge-modules", + "price": 55 + }, + { + "name": "Dualtron Thunder-Ultra- Handlebar Locking Latch", + "url": "dualtron-thunder-ultra-handlebar-locking-latch", + "price": 15 + }, + { + "name": "Dualtron 2-3- Handlebar Locking Latch", + "url": "dualtron-2-3-handlebar-locking-latch", + "price": 14 + }, + { + "name": "Dualtron- Side Panels", + "url": "dualtron-side-panels", + "price": 72 + } + ], + "price": 29, + "reviews": { + "list": [], + "summary": { + "summary": "", + "reviewsAmount": 0 + } + }, + "url": "dualtron-2-rear-fender-mud-guard", + "name": "Dualtron 2- Rear Fender/Mud-guard", + "category": "Parts|Dualtron" + }, + { + "shortDescription": [ + "The Dualtron 3 & Thunder have the option of changing the suspension module. Formulated of different toughness rubberized compounds, to give the scooter a different ride quality depending on which module is installed", + "Scooter are shipped with the medium compound as default", + "Medium-soft & Medium-hard modules will be added as well", + "Installation involves removing the motor unit from the frame & tapping out the module from the support", + "Estimated installation time: 1 hour" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "1 lbs" + }, + { + "heading": "Dimensions", + "data": "8 × 5 × 3 in" + }, + { + "heading": "Suspension Module Type", + "data": "Hard (Black), Soft (Green)" + } + ], + "images": [ + { + "main": [ + { + "src": "DT-THUN-SUS-GRN-1.jpg", + "srcset": [ + "DT-THUN-SUS-GRN-1-66x66.jpg 66w", + "DT-THUN-SUS-GRN-1-75x75.jpg 75w", + "DT-THUN-SUS-GRN-1-100x100.jpg 100w", + "DT-THUN-SUS-GRN-1-150x150.jpg 150w", + "DT-THUN-SUS-GRN-1-200x200.jpg 200w", + "DT-THUN-SUS-GRN-1-300x300.jpg 300w", + "DT-THUN-SUS-GRN-1-400x400.jpg 400w", + "DT-THUN-SUS-GRN-1-500x500.jpg 500w", + "DT-THUN-SUS-GRN-1-600x600.jpg 600w", + "DT-THUN-SUS-GRN-1-700x700.jpg 700w", + "DT-THUN-SUS-GRN-1-768x768.jpg 768w", + "DT-THUN-SUS-GRN-1-800x800.jpg 800w", + "DT-THUN-SUS-GRN-1.jpg 801w" + ] + }, + { + "src": "DT-THUN-SUS-GRN-1-700x700.jpg", + "srcset": [ + "DT-THUN-SUS-GRN-1-66x66.jpg 66w", + "DT-THUN-SUS-GRN-1-75x75.jpg 75w", + "DT-THUN-SUS-GRN-1-100x100.jpg 100w", + "DT-THUN-SUS-GRN-1-150x150.jpg 150w", + "DT-THUN-SUS-GRN-1-200x200.jpg 200w", + "DT-THUN-SUS-GRN-1-300x300.jpg 300w", + "DT-THUN-SUS-GRN-1-400x400.jpg 400w", + "DT-THUN-SUS-GRN-1-500x500.jpg 500w", + "DT-THUN-SUS-GRN-1-600x600.jpg 600w", + "DT-THUN-SUS-GRN-1-700x700.jpg 700w", + "DT-THUN-SUS-GRN-1-768x768.jpg 768w", + "DT-THUN-SUS-GRN-1-800x800.jpg 800w", + "DT-THUN-SUS-GRN-1.jpg 801w" + ] + }, + { + "src": "DT-THUN-SUS-BL-1.jpg", + "srcset": null + }, + { + "src": "DT-THUN-SUS-BL-1-700x700.jpg", + "srcset": null + } + ] + } + ], + "relatedProducts": [ + { + "name": "Dualtron Ultra-Thunder- Rear Fender/Mud-guard", + "url": "dualtron-ultra-thunder-rear-fender-mud-guard", + "price": 52 + }, + { + "name": "Dualtron 2- Handlebar Support Strut & Suspension", + "url": "dualtron-2-handlebar-support-strut-suspension", + "price": 86 + }, + { + "name": "Dualtron- Charging Flap", + "url": "dualtron-charging-flap", + "price": 9 + }, + { + "name": "Dualtron 2- Rear Fender/Mud-guard", + "url": "dualtron-2-rear-fender-mud-guard", + "price": 29 + } + ], + "price": 55, + "reviews": { + "list": [], + "summary": { + "summary": "", + "reviewsAmount": 0 + } + }, + "url": "dualtron-3-thunder-suspension-cartridge-modules", + "name": "Dualtron 3-Thunder- Suspension Cartridge Modules", + "category": "Parts|Dualtron" + }, + { + "shortDescription": [ + "Replacement Dualtron charging flap", + "Compatible with all Dualtron scooters", + "Estimated installation time: 1 Min" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": ".5 lbs" + }, + { + "heading": "Dimensions", + "data": "5 × 3 × 1 in" + } + ], + "images": [ + { + "main": [ + { + "src": "DT-CHRG-CAP.jpg", + "srcset": [ + "DT-CHRG-CAP-66x66.jpg 66w", + "DT-CHRG-CAP-75x75.jpg 75w", + "DT-CHRG-CAP-100x100.jpg 100w", + "DT-CHRG-CAP-150x150.jpg 150w", + "DT-CHRG-CAP-200x200.jpg 200w", + "DT-CHRG-CAP-300x300.jpg 300w", + "DT-CHRG-CAP-400x400.jpg 400w", + "DT-CHRG-CAP-500x500.jpg 500w", + "DT-CHRG-CAP-600x600.jpg 600w", + "DT-CHRG-CAP-700x700.jpg 700w", + "DT-CHRG-CAP-768x768.jpg 768w", + "DT-CHRG-CAP-800x800.jpg 800w", + "DT-CHRG-CAP.jpg 801w" + ] + }, + { + "src": "DT-CHRG-CAP-700x700.jpg", + "srcset": [ + "DT-CHRG-CAP-66x66.jpg 66w", + "DT-CHRG-CAP-75x75.jpg 75w", + "DT-CHRG-CAP-100x100.jpg 100w", + "DT-CHRG-CAP-150x150.jpg 150w", + "DT-CHRG-CAP-200x200.jpg 200w", + "DT-CHRG-CAP-300x300.jpg 300w", + "DT-CHRG-CAP-400x400.jpg 400w", + "DT-CHRG-CAP-500x500.jpg 500w", + "DT-CHRG-CAP-600x600.jpg 600w", + "DT-CHRG-CAP-700x700.jpg 700w", + "DT-CHRG-CAP-768x768.jpg 768w", + "DT-CHRG-CAP-800x800.jpg 800w", + "DT-CHRG-CAP.jpg 801w" + ] + } + ] + } + ], + "relatedProducts": [ + { + "name": "Dualtron- Fingerprint Security Scanner", + "url": "dualtron-fingerprint-security-scanner", + "price": 99 + }, + { + "name": "Dualtron Thunder-Ultra- Handlebar Locking Latch", + "url": "dualtron-thunder-ultra-handlebar-locking-latch", + "price": 15 + }, + { + "name": "Dualtron- Front Fender/Mud-guard", + "url": "dualtron-front-fender-mud-guard", + "price": 31 + }, + { + "name": "Dualtron 2- Handlebar Support Strut & Suspension", + "url": "dualtron-2-handlebar-support-strut-suspension", + "price": 86 + } + ], + "price": 9, + "reviews": { + "list": [], + "summary": { + "summary": "", + "reviewsAmount": 0 + } + }, + "url": "dualtron-charging-flap", + "name": "Dualtron- Charging Flap", + "category": "Parts|Dualtron" + }, + { + "shortDescription": [ + "Temporarily Out-of-Stock, next supply expected 10th September", + "Order now & receive a pair of BONUS Wrist-guards for FREE", + "MTen3: a sprightly 800W 10″ Wheel with a 512/325Wh battery pack", + "MAX Cruising Speed: 25+ MPH" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "22lb", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon3.jpg" + }, + { + "heading": "Cruising Speed", + "data": "25+ MPH", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon1.png" + }, + { + "heading": "Charge Time", + "data": "2hrs to 80%\n*With optional Rapid Charger", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon4.png" + }, + { + "heading": "Max Load", + "data": "240 lb", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon2.png" + }, + { + "heading": "Battery Capacity", + "data": "325Wh/512Wh", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/Battery-Graph-1.png" + }, + { + "heading": "Range", + "data": "25-30 miles", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/Range-Graph-1.png" + } + ], + "images": [ + { + "main": [ + { + "src": "Mten3-Frontpage.jpg", + "srcset": [ + "Mten3-Frontpage-66x66.jpg 66w", + "Mten3-Frontpage-75x75.jpg 75w", + "Mten3-Frontpage-120x120.jpg 120w", + "Mten3-Frontpage-150x150.jpg 150w", + "Mten3-Frontpage-200x200.jpg 200w", + "Mten3-Frontpage-300x300.jpg 300w", + "Mten3-Frontpage-400x400.jpg 400w", + "Mten3-Frontpage-500x499.jpg 500w", + "Mten3-Frontpage-600x599.jpg 600w", + "Mten3-Frontpage-768x767.jpg 768w", + "Mten3-Frontpage.jpg 800w" + ] + }, + { + "src": "Mten3-Frontpage-768x767.jpg", + "srcset": [ + "Mten3-Frontpage-66x66.jpg 66w", + "Mten3-Frontpage-75x75.jpg 75w", + "Mten3-Frontpage-120x120.jpg 120w", + "Mten3-Frontpage-150x150.jpg 150w", + "Mten3-Frontpage-200x200.jpg 200w", + "Mten3-Frontpage-300x300.jpg 300w", + "Mten3-Frontpage-400x400.jpg 400w", + "Mten3-Frontpage-500x499.jpg 500w", + "Mten3-Frontpage-600x599.jpg 600w", + "Mten3-Frontpage-768x767.jpg 768w", + "Mten3-Frontpage.jpg 800w" + ] + }, + { + "src": "Mten3-Front-Open.jpg", + "srcset": null + }, + { + "src": "Mten3-Front-Open-768x767.jpg", + "srcset": null + }, + { + "src": "Mten3-Front-LEDs.jpg", + "srcset": null + }, + { + "src": "Mten3-Front-LEDs-768x767.jpg", + "srcset": null + }, + { + "src": "Mten3-Front-Closed.jpg", + "srcset": null + }, + { + "src": "Mten3-Front-Closed-768x767.jpg", + "srcset": null + }, + { + "src": "Mten3-Side.jpg", + "srcset": null + }, + { + "src": "Mten3-Side-768x767.jpg", + "srcset": null + } + ] + } + ], + "relatedProducts": [ + { + "name": "King Song 16X Seat", + "url": "king-song-16x-seat", + "price": 75 + }, + { + "name": "18L/XL Bodyguard Protective Neoprene Covers Roll.nz", + "url": "18l-xl-bodyguard-protective-neoprene-covers-roll-nz", + "price": 98 + }, + { + "name": "eWheels Branded Wrist-guards", + "url": "ewheels-branded-wrist-guard", + "price": 19 + }, + { + "name": "KS 14C: Replacement Control-Board", + "url": "king-song-14-control-board", + "price": 125 + } + ], + "price": 999, + "reviews": { + "list": [ + { + "content": "Great small e-wheel, perfect starter for my wife, very light and portable, shipping took longer than expected.", + "reviewMeta": [ + "Posted 3 weeks ago", + "03.11.2020" + ], + "reviewAuthor": "Andrew Kovtun", + "reviewRate": 5 + }, + { + "content": "Got the new MTen 3 Black Stealth Edition just recently after waiting since August it's been backordered. However, it's worth the wait. I have an old MTen 3 which is white in color that I gave to a family member to get him hooked with this hobby and paid off. No regrets with the purchase and like the customer support which is very helpful. I just wish Gotway did not go back to tube in from tubeless tires. Anyway, I'm just gonna stock spare inner tubes and tire.", + "reviewMeta": [ + "Posted 3 weeks ago", + "02.11.2020" + ], + "reviewAuthor": "Lorenzo Villegas", + "reviewRate": 5 + }, + { + "content": "Small compact fits in backpack gets me around true 18 mile range at average 25-20mph speeds", + "reviewMeta": [ + "Posted 3 weeks ago", + "31.10.2020" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "I just received my all black 84v 512wh Mten3 from eWheels and couldn't be happier with my purchase. I liked the original white/grey model but the stealth model is definitely nice. I'm glad I was able to be part of the batch that was the last of the 512wh variants but understand the reasons for standardizing. \n\nJason, Drew, and the rest of the folks over at eWheels are top notch and being here in Hawaii, one of the only retailers shipping to the 50th state! I placed my order back in July when these things were on back-order, but they've been fantastic in providing fast communication to any of my questions and concerns throughout. This is my first wheel, with my sights set on a larger wheel in the near future(V11/RS/Sherman). Admittedly, the first time I laid eyes on the MTen3 in a Youtube video(thanks Marty), I knew instantly that was the wheel for me; It has the perfect blend of size, power, and speed for my needs. I know some riders of larger wheels might pooh pooh this little guy, but because I have plans to purchase a larger wheel in the future, I wanted something that was going to be very different and something that I would keep, as opposed to having multiple wheels that had too many similarities in size, specs, and ride characteristics. The MTen3 covers all those bases and also looks great all in black!", + "reviewMeta": [ + "Posted 3 weeks ago", + "30.10.2020" + ], + "reviewAuthor": "Dean", + "reviewRate": 5 + }, + { + "content": "I got mine about 3 weeks ago but only tried it yesterday. I'm 58, 5'11\", 190lbs, and have developed an arthritic condition in my ankles and heel that walking exacerbates. So I bought the MTen3 for last mile pedestrian distances when I want to take the train into the city or the beach. I'm in the Los Angeles area. This is my first EUC and I neither skateboard nor have experience in any like activity. I'm a total newbie to this. \n\nThe first minutes were shaky but after an hour I was able to glide 15'-20', though using a chain link fence as a safety rail. It does feel wobbly still but I figure more practice will acclimate me, so I'm heading out again this morning for another hour of practice. I am completely satisfied that I will be able to master this. What a fun and practical investment this was.", + "reviewMeta": [ + "Posted 1 month ago", + "21.10.2020" + ], + "reviewAuthor": "NM", + "reviewRate": 5 + }, + { + "content": "My thoughts about ewheels at the end...\nMe: 43 yrs old, 6'-3\", 235lbs.\nI can not believe this little machine handles my size so well!!!! This is my second wheel, the KingSong 14d was my first wheel. The Mten3 wide tire makes ride more stable than the narrow 14d tire, so I like it on walking paths and other areas where crowds are, because you can balance even at low speeds. I've taken it up mild inclines and it handles my size with no problems at all!! One of the reasons I purchased this was to take on flights, because my medical condition makes it extremely hard to walk long distance, so this can literally fit in my backpack and I can visit new areas and site see without stressing about over exerting myself. Only thing I hate is the look of the lights, not my style at all!! I painted mine flat black and painted over the lights, YeapR sure did. Haha. \nI've been upgrading to bigger faster wheels fairly fast so I haven't really put this wheel to the test, so I cant comment on range, speed and durability. The fastest I've have it was 18mph on smooth interior floor, it does get a lil squirrely at higher speeds on surfaces with imperfections, so I'm nervous going high speeds on this outside but it can be done, you can watch YouTube videos of people riding really fast with skill. \nIt's awesome that we can have a wheel that fits into a backpack and that goes 25mph and carry someone my size with ease, awesome!\nMy thoughts about ewheels:\nI've purchased 4 wheels from ewheels, so far and they have proven to be true professionals when it comes to providing the best product to the public and they are true professionals when it comes to providing the best customer service!!\nI'm shocked at how quickly they have answered all of questions. Believe you me, I have bugged them a lot with questions! Haha \nI'll be buying my next wheel from ewheels, I just have to decide which one to buy!", + "reviewMeta": [ + "Posted 4 months ago", + "21.07.2020" + ], + "reviewAuthor": "Marius", + "reviewRate": 5 + }, + { + "content": "Couldn't be more happy. MTen3 512Wh/800W Motor.\n\n\"Tiny but might\" is what I'd refer it to, speedy and not needy due to the power of this little wheel and basically no maintenance! \n\nPros:\nCompact, nice torque, fast, nimble, durable, FUN!\n\nI've never own or knew about electric unicycle until a few weeks ago, after doing lots of research and with the help of eWheels team I've concluded that the MTen3 would be my best first wheel.\nZero regrets on getting this wheel, not having any prior experiences of riding an EUC it only took me 15 minutes to get going. My tip to you is to just get on and ride, it'll be hard, it'll tire you out, it'll bite you in the ankle a few times and again, but it's totally worth it. You can't buy happiness? WRONG, buy this wheel and you'll not only have happiness, but you'll create wonderful memories with it. Sometimes a little painful but it's part of the sport.\n\nCons:\nSpeed is fast! but is it bad to ask for faster? In this case yes, if you go too fast and you're not use to this wheel, you'll encounter \"speed wobble\" ideal speed for me is 18-22 mph.\nYou'll feel a lot of the road that you're riding on, smooth roads are no problem, however if you ride over bumps and cracks... you'll fell it. Best to ride with your knees bent.\nBattery life... this is something I'm over expecting, I'm happy with my current riding distance (it hurts to ride long distance due to my conditioning) but when I'm more conditioned to ride further I'd would love for it to go at least 30 miles distance. Currently I'm getting 14-18 miles based on how I ride and my weight (190lbs on a good day without gears on) with average speed of 12 miles per hour.\nOther than those little picky things, I'm so happy with it.\n\nIn all, grab it and never let it go. Trust me, you'll want to own 2-3 wheels on average once you get into this sport. \n\nAmazing beginner wheel.\n\n*** Wheel PSI is recommended by me around 35 PSI if you're 190lbs, however you'll get more speed wobble if you're not use to it. Just drop PSI to 25-30 for more control, down side to this is you'll get less miles in range due to the motor having to work harder but it'll feel more smooth.\n\nHope this helps.\n\nPlease wear a helmet....", + "reviewMeta": [ + "Posted 4 months ago", + "16.07.2020" + ], + "reviewAuthor": "Joe Castillo", + "reviewRate": 5 + }, + { + "content": "It’s a power house! Light weight and very efficient. You won’t be disappointed with this wheel.", + "reviewMeta": [ + "Posted 5 months ago", + "25.06.2020" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "First time euc rider so I can’t compare to any other wheels, but so far this is what I’m noticing. This thing is super easy to learn, especially if your into any other type of activity that requires balance while moving. Once you’ve got the hang of it you’ll notice how agile and nimble this wheel can be. Iv been practicing in parking lots, and weaving around marked lines has been so engaging that before i knew it 17+ miles had been traveled just swerving around. The compact size of this thing makes it easier to carry around and the fact that it’s less aggressive looking than other wheels attracts less unwanted attention. It would be nice if it came with a handle, but Here’s the thing that I don’t like about this wheel...even though it’s small or maybe because it is.....it wobbles like a bucking bronco at 14+ mph.....This could be due to my inexperience but I doubt that’s the only reason why. So far my impression is that this is a really fun, smooth and agile wheel best suited for agility and cruising at slow to moderate speeds. Unless you have the reflexes of a cat or have been practicing your rodeo skills be sure to wear safety gear because it’s unavoidable that at some point your going to need it.", + "reviewMeta": [ + "Posted 5 months ago", + "22.06.2020" + ], + "reviewAuthor": "Humberto Fernanadez", + "reviewRate": 4 + }, + { + "content": "I love this wheel, it is the 4th Gotway wheel I have bought from EWheels. It is very torquey for a small wheel, and easy to go backwards on and bunny hop.", + "reviewMeta": [ + "Posted 5 months ago", + "27.05.2020" + ], + "reviewAuthor": "Joe Haslam", + "reviewRate": 5 + }, + { + "content": "GREAT RIDE.", + "reviewMeta": [ + "Posted 6 months ago", + "24.05.2020" + ], + "reviewAuthor": "Tamara Joseph", + "reviewRate": 4 + }, + { + "content": "I love my Mten3! This is my first electric unicycle - I got hooked on personal electric vehicles when I bought Speedway Mini 4 Pro e-scooter from eWheels about 1.5 years ago. Despite Mini4 being quite compact and lightweight, it can be quite cumbersome when using in public transportation, carrying up stairs, etc. So I needed something more compact and lightweight... a \"pocket rocket\". Mten3 just is such a pocket rocket! It's perfect for getting around the city and even for some mild offroad fun, too!\n\nIt's so small that it fits in a small $10 backpack sized for middle-school kids. And despite only 325Wh capacity (I bought the 84V/325Wh version), I can still go 20 miles on it - same range as with Mini4, which has almost double the capacity! (614Wh) It's amazingly efficient. (I'm very heavy - right at the max allowable weight - and it's just stunning to me that a little thing I can carry in a small backpack, can go such a distance, with almost half the weight (10kg Mten3 vs. 16kg Mini4), half the battery, and perhaps third the size.)\n\nIt took me a couple of days to learn to ride, but it's not bad. I think the steep-ish angle of the pedals helps to \"lock in\" the wheel between your legs, which increases stability. The agility of this pocket rocket is amazing. It very easy to ride even on crowded sidewalks like in tourist places - when you see a clearing between people, you accelerate rapidly and \"jump\" into the next \"slot\". The precision of riding Mten3 is just fantastic - you can efficiently \"percolate\" any crowd.\n\nThe included wrist protectors are a nice touch - they're decent, very compact, and quite comfortable. I took a couple of falls with them - they saved my hands like a champ. The larger black pedals and the lift-off switch are very nice, too.\n\nOverall, I'm very satisfied with my purchase. Amazingly fast delivery, too - placed the order, next day I have a new toy in my hands! Highly recommend it. You won't regret getting Mten3 from eWheels!", + "reviewMeta": [ + "Posted 6 months ago", + "16.05.2020" + ], + "reviewAuthor": "Yuri", + "reviewRate": 5 + }, + { + "content": "Had my 84v 325wh for a few months now, I live in a hilly region so the extra power is nice and I'm no lightweight (210 lbs), I have a larger wheel if I need more range, I bought this wheel for fun and zippiness, it has no problem pulling me anywhere I need to go, just too much fun in a small lightweight package!!", + "reviewMeta": [ + "Posted 7 months ago", + "17.04.2020" + ], + "reviewAuthor": "Michael", + "reviewRate": 5 + }, + { + "content": "I received the mten3 67v, 420wh. It is the wheel I was looking for. I am just using EUCs for leisurely rides at sub 15mph speed. So this product is great value for the money for me. This may not be the wheel for you if you are looking for something that you can cruise on at much faster speeds.", + "reviewMeta": [ + "Posted 7 months ago", + "01.04.2020" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "Received MTen3 in 3days from eWheels. Super customer service!!\nNew wheel is mucho different than my V5F! Much more sensitive and you have to balance it out and adjust pedal level. Manual sucks and had to watch some You-tube vids to figure it out. Updated app is OK. Experimented with soft, medium and hard ride settings and for now am using soft. Hard to find what each setting means? Bonus feature discovered. New button by handle which disengages motor when lifted. Work in progress for me cause of differences compared to my 14” wheel which I can use pretty handily now. Think over time MTen3 will be great for riding around neighborhood. Not really a commuter wheel. Recommend that eWheels translate or make a short instruction manual for this model and any other Gotway products if they continue to sell the line. Just my 2 cents", + "reviewMeta": [ + "Posted 7 months ago", + "26.03.2020" + ], + "reviewAuthor": "Will Pear", + "reviewRate": 5 + }, + { + "content": "I have had the Mten 10\" 325 84v for about two months now (150miles on the wheel); This is my first wheel and I use it to commute from building to building at work and run to the local CVS (4 miles there). It performs like a champ and is so small that people think I'm on a briefcase. After a few weeks of practice you can literally turn on a dime. Only Con, which is to be expected; if going over 20MPH you HAVE to limit your view to 40 yards or less to prepare for a small bump in the road. I only had one fall the first day I owned it, but this wheel has taken some abuse and keeps riding like a champ.", + "reviewMeta": [ + "Posted 8 months ago", + "17.03.2020" + ], + "reviewAuthor": "Zac", + "reviewRate": 5 + }, + { + "content": "Wow! what can I say about this extremely agile and capable little machine, this is a must have to add to your fleet of electric unicycles. It makes you feel like a kid again. 420Wh MTen 3", + "reviewMeta": [ + "Posted 8 months ago", + "12.03.2020" + ], + "reviewAuthor": "Bela Horvath", + "reviewRate": 5 + }, + { + "content": "This is coming from a first time EUC rider. It's fun, it's powerful, and you can even practice indoors! But let's talk about the hard parts.\n\nLearning curve is pretty steep. After practicing 10 - 30 minutes daily for a week, the rider can free mount, ride on bumpy pavements, making turns, stopping gracefully. But the rider is still not good enough to handle the crowds. The rider also rides at a very slow speed, the max speed is only 8.5 mph right now. \n\nBiggest complain is the lack of handle. If your feet need some rest from riding and you want to walk for a block, you have to either carry it or bend down and push it. Not ideal. \n\nOverall a great buy for sure :)", + "reviewMeta": [ + "Posted 8 months ago", + "09.03.2020" + ], + "reviewAuthor": "X", + "reviewRate": 5 + }, + { + "content": "steep learning curve for a beginner with EUC eventhough I can ride a regular unicycle but seems to be a powerful compact EUC", + "reviewMeta": [ + "Posted 8 months ago", + "02.03.2020" + ], + "reviewAuthor": "homer boyd", + "reviewRate": 5 + }, + { + "content": "The Mten3 is a great first electric unicycle! The small wheel, low center of gravity and high torque motor make it very easy to learn on. I am so glad I picked it as my first EUC.", + "reviewMeta": [ + "Posted 9 months ago", + "18.02.2020" + ], + "reviewAuthor": "Dennis Moser", + "reviewRate": 5 + }, + { + "content": "Still new, but so far so good. fun little wheel.", + "reviewMeta": [ + "Posted 9 months ago", + "03.02.2020" + ], + "reviewAuthor": "Todd Cox", + "reviewRate": 5 + }, + { + "content": "Perfect fo the wife.", + "reviewMeta": [ + "Posted 10 months ago", + "23.01.2020" + ], + "reviewAuthor": "Sulaiman Abdul Alim Bey", + "reviewRate": 5 + }, + { + "content": "I want to include as many egg puns in this review to emphasize my appreciation of the shape and size of the unicycle. Here it is:\n\nI've had the mten3 for a good eggmount of time to make an eggstensive review of this eggtastic unicycle. Turning is eggfortless, the 20+mph speed is eggmazing, the torque is eggcellent. The eggstra small size and weight makes the unicycle so eggficient to bring anywhere.\nThe mten3 really eggceeds my eggspectations and there should be no eggscuse why more people don't have one in their collections of egglectric unicycles!", + "reviewMeta": [ + "Posted 10 months ago", + "05.01.2020" + ], + "reviewAuthor": "Li", + "reviewRate": 5 + }, + { + "content": "I received my MTen3 in NJ within 4 days of placing my order. The EUC was well packaged and received in excellent condition. This wheel is amazing. It took several minutes to adapt from my 18 inch wheel KS18L to this 10 inch wonder wheel. This MTen is so quick, responsive and nimble. I am loving this MTen3 and highly recommend it as a second wheel. Thank you, Jason!", + "reviewMeta": [ + "Posted 10 months ago", + "27.12.2019" + ], + "reviewAuthor": "Adam Moises Jr", + "reviewRate": 5 + }, + { + "content": "Great for commuting. Lite weight and quick.", + "reviewMeta": [ + "Posted 11 months ago", + "24.12.2019" + ], + "reviewAuthor": "Steven Lyon", + "reviewRate": 5 + }, + { + "content": "The little Mten3 is a blast, a little twitchy at first but once you 'adapt' and relax it calms down and it is super super maneuverable. I'm almost riding backwards with just 3 or 4 tries. Super fast for it's size, super light, good looking, and I believe the range is going to be great for it's size but haven't done range test. I'm 200lbs or a little over and no problem.", + "reviewMeta": [ + "Posted 11 months ago", + "04.12.2019" + ], + "reviewAuthor": "Joe Kirby", + "reviewRate": 5 + }, + { + "content": "This wheel is addicting...I am always looking forward in riding it whenever I have the opportunity. Easy to carry during trips and doesn't take so much space. You can even put in a backpack if you don't mind carrying about 22 lbs of weight. Definitely not a beginner wheel. When I start riding it coming from KS18S which is my first wheel, there is some sort of riding adjustment but not too difficult. It is very nimble and good in tight spaces particulary leisurely cruising in slow speed in a crowded street. However, doesn't recommend it for long ride especially speed above 10 mph, the wheel can wobble if you don't pay attention. In addition, you need more breaks during rides because your feet can easily get numb from standing. Unlike my KS18S, it is comfortable for cruising and long rides without much fatigue on my feet because it has a seat I can use allowing my legs and feet to rest while riding. Always wear full face helmet and other protective gears...don't underestimate this little bad boy, it has a lot of torque! Safety first while having fun! Between my KS18S and this wheel, I will be riding more the mten3 because of being compact, powerful and easy to bring to any places! Get one yours now, you will not regret. -- Lorenzo", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Lorenzo Villegas", + "reviewRate": 5 + }, + { + "content": "I have an Mten3, Nikola, and V8, and if I had to choose one--I'd probably pick the Mten3. It's a poor long-distance cruiser, but so much fun that I'd ride it for everything else. \n\nThe acceleration is incredible, and the ability to do a 180 in the width of a sidewalk is tons of fun. The wide tire keeps it fairly stable at slower speeds, but it has enough grunt to cruise at 22mph easily. Though that's not its strong suit, it does get squirrelly at those speeds.\n\nYou lose comfort and stability for the smaller tire, but it's so much fun I don't mind the trade off.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Jesse Niwa", + "reviewRate": 5 + }, + { + "content": "This thing has crazy off the line acceleration, is very portable, and is more maneuverable than anything I've ridden. It LITERALLY can turn on a dime https://www.youtube.com/watch?v=Xq0Oy0JlTCI&feature=youtu.be&fbclid=IwAR2EMVz7qD16WQbXxDAetduXv_mjU6DD5losh4XFjyvc8-meQ8QXS1Ng05M", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "I chose mten3 because it was very portable and yet does not lack power.\nInstantly I started loving the torque and responsiveness.\nThis is not heavy but its not light as well. Would have been great to have some tiny handle somewhere.\nI was able to put it in my laptop bag to carry out to the park and play with it.\n\nWithin 1 hour I was able to mount on it and ride comfortably. Wish to put more miles on it and come back to write a detailed review", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Shyam Krishnan Moni", + "reviewRate": 5 + }, + { + "content": "This is my new favorite wheel! Love the power and the flexibility. It is the easiest wheel to idle on and trying new things like riding backwards. I love all this wheel can do. It would be nice to have more of the manual in English, instead of just one page.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "John Walden", + "reviewRate": 5 + }, + { + "content": "I have a 16\" wheel and wanted something lighter and more convenient to carry. I was a little concerned that the MTen3 would be difficult to ride because of its size and because I'm not the most skilled rider. However, it is very easy to mount and ride and the light weight makes a big difference. It's not as stable at higher speeds as the larger wheel, but it is extremely easy to do tight turns with.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "This review is coming from someone riding a EUC for the first time.\nI will go over the strength and weakness of the Gotway MTen3 from a beginner’s perspective. I have an electric skateboard (backfire g2t) and an electric scooter (inokim ox super). I like the MTen3 way better than the previous two. \nThe electric skateboard is super-fast (good), it stops super-fast (bad). The bad is due to the skateboard slows down before you do and the only thing that’s keeping you on the board is the grip tape. Second, the solid wheel vibration wears out and numbs my feet. It does not turn, and road cracks & bumps will cause big hurt if not careful. Unless the road condition is perfectly smooth, it sucks.\nThe electric scooter doesn’t have any of the issues of the electric skateboard and better in every way (because it has 10-inch tires, disc brakes, 800w – 1200w motor, 20Ah battery, and suspensions). However, it is 28kg and BIG (worse than a golf bag)!\nPro:\n1.\tLight 22-25 lbs. (I think it is the lightness of all EUC wheels).\n2.\tCompact!!!\n3.\tGood acceleration and breaking.\n4.\tRange 20 miles easy (70kg person).\nCon:\n1.\tNot for beginners (I learned that hard way, first time with a EUC).\n2.\tWheel size the causes of lots of wobbles (Either from the rider or the road condition).\n3.\tLower speed limit “below 20mph” (It’s a safety issue, size of the wheel, high speed, equals to more and stronger wobbles).\n4.\tSmall peddle means the feet get tired and numb easier.\n5.\tTires (wish the tires have more grip and knobbier).\nTips for beginners:\n1.\tFind your center of gravity on the wheel (you will know once you find it).\n2.\tTrain on smooth pavement.\n3.\tPractice stopping.\n4.\tMount and Ride with your chest out.\n5.\tLook and turn your shoulder toward the direction you want to go.\n6.\tRelax your feet and legs (Stiff legs and feet causes wobbles).\n7.\tAt least 10 plus hours before you can ride the MTen3 confidently and comfortably.\n8.\tBe very vigilant looking at the road condition ahead of you (it’s not the potholes that will cause you problems, it’s the side bumps that will make you fall).\nWishlist: MTen3, everything the same in an 18inch wheel.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "Easy to learn on, letting out a little air helped me feel more stable. This thing is fun and fast. Very practical for zipping around campus or town. You'll really enjoy it, it shaves 45 min off my commute versus walking. Great buy.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Peter Michael Lain", + "reviewRate": 5 + }, + { + "content": "Owned the Mten3 for 11 months. Weigh 200lbs. Use it for last mile transport. The torque makes this an extremely safe wheel. Torque is the ability to speed up and slow down quickly. Max range on flat terrain at about 15MPH is around 14 miles in the summer and about 9 miles when temps are in the high 30's to low 40's. I maxed out the speed at 41km/hr one time. The right cruising speed on this one for me is 22-25km/hr. This is my first wheel and I had a bunch of falls. The wheel took a bad beating from my learning process and it keeps going. Charges in about 3 hours or so and that will get someone about a 1.25 hours of reasonable pace riding in the Summer. Two maintenance issues that came up. After 3 months, the tire deflated. I didn't know how to put slime in it and shipped it back to Ewheels who got it fixed and also upgraded the foot petals for a modest sum. Recently, the charger that came with it blew out recently and Ewheels replaced it - no charge. This is the Company to do business with. They can fix these wheels and have them back in less then a week. Total turn time on repairs from my door to them and back again is less than 2 weeks. Can't beat that service.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Matt Snyder", + "reviewRate": 5 + }, + { + "content": "This device is not only incredibly nimble, fast, small, highly portable and beautiful but also easily hand-trolly adaptable to walk and jog with it. It only lacks music bluetooth capabilities....the rest is A1. Dont miss out.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "Amazing amount of speed and range in an ultra compact form factor. Very easy to pick up and learn due to prior EUC experience. The 3\" wide tire makes it fairly stable and learning to go backwards on it is much easier than on larger EUCs although it is not advertised as a beginner wheel. I also own a Onewheel XR and only time will tell which one I like better.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "Excellent accelerating and breaking power. Outstanding nimbleness and maneuverability. Very light. Only con:\nIt should have been designed with a trolley handle. Difficult to carry 20 lbs. For a long distance. Therefore an exterior handle must be incorporated.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "This is an excellent wheel if you want something lighter with the power to get you around town. I think it's best as your second wheel rather than your first wheel; although smaller people (I'm 200lbs) might find it easier.\n\nI learned on a Ninebot E+ which rides very smoothly on bumpy roads. This one bounces around a bit on bumpy roads\n\nIt is really easir to manuever on nice surfaces and easy to caryy around.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Robert Jackson", + "reviewRate": 5 + }, + { + "content": "My first EUC. I weigh 200lbs and the torque is enough to get me up hills. Two drawbacks of this unit - 1) the small wheel will make the rider feel every bump 2) sometimes the unit will waggle back and forth at high speeds. Positives - high speed - 20mph is comfortable, good battery, good range, fits in a gym locker, robust - I dropped it 20 times and it just keeps going fine, charging takes a few hours. I really like the unit. Perfect for last mile commuters.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Matt Snyder", + "reviewRate": 5 + }, + { + "content": "Powerfull and agile little wheel.\nIf you look for something small, that has also enough power to go some distance, this is definitely the right wheel for you. It can even handle my 240lbs easily. My son 140lbs rides it to school and gets about 15 miles out of a 90% charge. But he's testing the speed limit on most of his rides. It's small and light enough to be carried around easily for a daily commute. \nIt's other main purpose probably is for tricks because the small wheel allows for some amazing maneuverability. You can almost turn on the spot.\nThe wheel is not a beginner wheel, since for its agility it is much more difficult to learn on than my 18\" MSuperV3. But if you figure out how to ride it it's so much fun.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Marco S.", + "reviewRate": 5 + }, + { + "content": "The MTen3 is my first wheel and it has exceeded all expectations. I’ve had it a week and rode 70km. By now, I am comfortable riding it and I feel as if it responds to my thoughts. I wish I had purchased this years ago. The wheel accelerates quickly and feels satisfyingly torquey. I’ve never fallen (except the very first time I tried to stand on it), but it has come out from under me a few times due to my errors. The bottoms of the pedals are scraped up and there are a few scrapes around the edges. The scratches don’t show on the white parts but they do show a bit on the black parts.\n\nI can go slowly and I can go fast, but I don’t feel comfortable faster than 18mph as the vehicle starts to wobble, however, it is entirely possible that the wobbling originates from me. My feet get tired after about 20 minutes, but every day I have more endurance and can go further. The sides of my calves hurt for the first few days.\n\nThe MTen3 does not struggle when I put my two children in a double-stroller and push them to and from daycare which is a bit less than a mile through the city. I mostly use this vehicle for downtown commuting in a major US city. It fits in my gym locker! I don’t go down (or up) curbs with it, but there are no shortages of bumps, dips, and cracks. I’ve had it out in light rain before with no problems. I’ve also taken it on a few longer bike-path trips which are very enjoyable. It is easy to pick up and carry like a briefcase and only one person in a hundred will notice that I’m carrying something uncommon; people probably assume it is a cooler or a trendy bag and don't look twice. It fits in a standard paper grocery bag (if I want to be very inconspicuous).\n\nThe Cons: \n1.\tNo Manual\n2.\tDownloading and Side-loading the app took a few attempts.\n3.\tThe seam in the plastic opposite the underside of the handle is rough enough to cut your knuckles, especially when you try to carry it while wearing wrist guards. You can mitigate this by putting a piece of clear (scotch) tape along the seam. I wear thin, fingerless- UV gloves under my wrist guards which protects me from the seam. \n4.\tIt does not turn off when you lift it up.\n5.\tThe on/off beep is very loud and you have to hold the button for a few seconds. \n6.\tThe handle should be rounded for ease on the hand; as you will be carrying it a lot. \n7.\tI wish it included a cover. \n\nCaveat: \nThis vehicle can be carried around easily and inconspicuously, but before you purchase, make sure that you can comfortably carry 25lb pounds in one hand. \n\nIn conclusion, I am fully satisfied and delighted with the MTen3. It is great for last-mile commutes, errands, and joy-riding. It is very practical for anyone who can easily carry 25lbs in one hand.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Paul", + "reviewRate": 5 + } + ], + "summary": { + "rating": 5, + "reviewsAmount": "42 Reviews" + } + }, + "url": "gotway-mten3-512-800w-motor", + "name": "NEW: MTen3 10”, ‘The Pocket Rocket’, 512Wh/800W Motor", + "category": "Advanced Electric Wheels" + }, + { + "shortDescription": [ + "Gotway Monster replacement shells are available in Blue, Red & Purple", + "Designed to fit up to 3x 800W battery packs, the largest of any Electric Unicycle", + "The structural elements of the Monster shell are not the strongest. If the Wheel takes a hard impact, the joints connecting the two halves together have a tendency to break apart", + "For the headlight cover, centre plastic piece, please see the other Monster parts" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "12 lbs" + }, + { + "heading": "Dimensions", + "data": "20 × 20 × 6 in" + }, + { + "heading": "Colour", + "data": "Blue, Purple, Red" + } + ], + "images": [ + { + "main": [ + { + "src": "GW-MN-IS-B-L-FR.jpg", + "srcset": [ + "GW-MN-IS-B-L-FR-66x66.jpg 66w", + "GW-MN-IS-B-L-FR-75x75.jpg 75w", + "GW-MN-IS-B-L-FR-120x120.jpg 120w", + "GW-MN-IS-B-L-FR-150x150.jpg 150w", + "GW-MN-IS-B-L-FR-200x200.jpg 200w", + "GW-MN-IS-B-L-FR-300x300.jpg 300w", + "GW-MN-IS-B-L-FR-400x400.jpg 400w", + "GW-MN-IS-B-L-FR-500x500.jpg 500w", + "GW-MN-IS-B-L-FR-600x599.jpg 600w", + "GW-MN-IS-B-L-FR-768x767.jpg 768w", + "GW-MN-IS-B-L-FR.jpg 800w" + ] + }, + { + "src": "GW-MN-IS-B-L-FR-768x767.jpg", + "srcset": [ + "GW-MN-IS-B-L-FR-66x66.jpg 66w", + "GW-MN-IS-B-L-FR-75x75.jpg 75w", + "GW-MN-IS-B-L-FR-120x120.jpg 120w", + "GW-MN-IS-B-L-FR-150x150.jpg 150w", + "GW-MN-IS-B-L-FR-200x200.jpg 200w", + "GW-MN-IS-B-L-FR-300x300.jpg 300w", + "GW-MN-IS-B-L-FR-400x400.jpg 400w", + "GW-MN-IS-B-L-FR-500x500.jpg 500w", + "GW-MN-IS-B-L-FR-600x599.jpg 600w", + "GW-MN-IS-B-L-FR-768x767.jpg 768w", + "GW-MN-IS-B-L-FR.jpg 800w" + ] + }, + { + "src": "GW-MN-IS-RD-R-FR.jpg", + "srcset": null + }, + { + "src": "GW-MN-IS-RD-R-FR-768x767.jpg", + "srcset": null + }, + { + "src": "GW-MN-IS-P-R-FR.jpg", + "srcset": null + }, + { + "src": "GW-MN-IS-P-R-FR-768x767.jpg", + "srcset": null + }, + { + "src": "GW-MN-IS-P-R-BK.jpg", + "srcset": null + }, + { + "src": "GW-MN-IS-P-R-BK-768x767.jpg", + "srcset": null + } + ] + } + ], + "relatedProducts": [ + { + "name": "GW Monster: Set of Side Panels, Black", + "url": "monster-set-of-side-panels-black", + "price": 68.5 + }, + { + "name": "GW Monster: Seat/Cushion", + "url": "monster-seatcushion", + "price": 87 + }, + { + "name": "GW Telsa: Replacement Control-Board", + "url": "gw-telsa-replacement-control-board", + "price": 174 + }, + { + "name": "GW MSuper V3s+: Set of Side Panels, Black", + "url": "msuper-3s-set-of-side-panels-black", + "price": 65.5 + } + ], + "price": 196, + "reviews": { + "list": [], + "summary": { + "summary": "", + "reviewsAmount": 0 + } + }, + "url": "gw-monster-pair-shells", + "name": "GW Monster: Pair of Shells", + "category": "Parts|Gotway" + }, + { + "shortDescription": [ + "Newest design of the Gotway control-board, the MTen3 board is physically identical to the Tesla’s", + "Fitted with 12 MOSFETS, with a Gotway’s spec of 4,000W peak rating!", + "14awg motor wiring, large heat-sink with cooling fins, fan-assisted cooling, 5mm bullet connectors", + "Firmware update applied to prevent the Wheel from spinning out of control when placed on its side." + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "2 lbs" + }, + { + "heading": "Dimensions", + "data": "8 × 8 × 4 in" + } + ], + "images": [ + { + "main": [ + { + "src": "GW-MTEN3-CB1.jpg", + "srcset": [ + "GW-MTEN3-CB1-66x66.jpg 66w", + "GW-MTEN3-CB1-75x75.jpg 75w", + "GW-MTEN3-CB1-120x120.jpg 120w", + "GW-MTEN3-CB1-150x150.jpg 150w", + "GW-MTEN3-CB1-200x200.jpg 200w", + "GW-MTEN3-CB1-300x300.jpg 300w", + "GW-MTEN3-CB1-400x400.jpg 400w", + "GW-MTEN3-CB1-500x500.jpg 500w", + "GW-MTEN3-CB1-600x600.jpg 600w", + "GW-MTEN3-CB1-768x768.jpg 768w", + "GW-MTEN3-CB1.jpg 800w" + ] + }, + { + "src": "GW-MTEN3-CB1.jpg", + "srcset": [ + "GW-MTEN3-CB1-66x66.jpg 66w", + "GW-MTEN3-CB1-75x75.jpg 75w", + "GW-MTEN3-CB1-120x120.jpg 120w", + "GW-MTEN3-CB1-150x150.jpg 150w", + "GW-MTEN3-CB1-200x200.jpg 200w", + "GW-MTEN3-CB1-300x300.jpg 300w", + "GW-MTEN3-CB1-400x400.jpg 400w", + "GW-MTEN3-CB1-500x500.jpg 500w", + "GW-MTEN3-CB1-600x600.jpg 600w", + "GW-MTEN3-CB1-768x768.jpg 768w", + "GW-MTEN3-CB1.jpg 800w" + ] + }, + { + "src": "GW-MTEN-CB-BK.jpg", + "srcset": null + }, + { + "src": "GW-MTEN-CB-BK-768x767.jpg", + "srcset": null + } + ] + } + ], + "relatedProducts": [ + { + "name": "GW Monster: Pair of Shells", + "url": "gw-monster-pair-shells", + "price": 196 + }, + { + "name": "GW Telsa: Replacement Control-Board", + "url": "gw-telsa-replacement-control-board", + "price": 174 + }, + { + "name": "GW Monster: Replacement Control-Board", + "url": "monster-control-board", + "price": 196 + }, + { + "name": "GW Monster: Seat/Cushion", + "url": "monster-seatcushion", + "price": 87 + } + ], + "price": 174, + "reviews": { + "list": [], + "summary": { + "summary": "", + "reviewsAmount": 0 + } + }, + "url": "gw-mten3-replacement-control-board", + "name": "GW MTen3: Replacement Control-Board", + "category": "Parts|Gotway" + }, + { + "shortDescription": [ + "Pair of Black shells for the Inmotion V5F & V5F+", + "Will make your V5F/+ look brand new again" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "3 lbs" + }, + { + "heading": "Dimensions", + "data": "20 × 3 × 20 in" + } + ], + "images": [ + { + "main": [ + { + "src": "V5-Shell-BK-Top.jpg", + "srcset": [ + "V5-Shell-BK-Top-66x66.jpg 66w", + "V5-Shell-BK-Top-75x75.jpg 75w", + "V5-Shell-BK-Top-120x120.jpg 120w", + "V5-Shell-BK-Top-150x150.jpg 150w", + "V5-Shell-BK-Top-200x200.jpg 200w", + "V5-Shell-BK-Top-300x300.jpg 300w", + "V5-Shell-BK-Top-400x399.jpg 400w", + "V5-Shell-BK-Top-500x499.jpg 500w", + "V5-Shell-BK-Top-600x599.jpg 600w", + "V5-Shell-BK-Top.jpg 702w" + ] + }, + { + "src": "V5-Shell-BK-Top.jpg", + "srcset": [ + "V5-Shell-BK-Top-66x66.jpg 66w", + "V5-Shell-BK-Top-75x75.jpg 75w", + "V5-Shell-BK-Top-120x120.jpg 120w", + "V5-Shell-BK-Top-150x150.jpg 150w", + "V5-Shell-BK-Top-200x200.jpg 200w", + "V5-Shell-BK-Top-300x300.jpg 300w", + "V5-Shell-BK-Top-400x399.jpg 400w", + "V5-Shell-BK-Top-500x499.jpg 500w", + "V5-Shell-BK-Top-600x599.jpg 600w", + "V5-Shell-BK-Top.jpg 702w" + ] + }, + { + "src": "V5-Shell-BK.jpg", + "srcset": null + }, + { + "src": "V5-Shell-BK.jpg", + "srcset": null + } + ] + } + ], + "relatedProducts": [ + { + "name": "V5F: Charger Port Flap", + "url": "v5f-charger-port-flap", + "price": 19 + }, + { + "name": "V8: Pair of Structural Inner/shells", + "url": "v8-pair-innershells", + "price": 89 + }, + { + "name": "V8: Pair of Outer Shells", + "url": "v8-pair-of-outer-shells", + "price": 95 + }, + { + "name": "V5F: Set of Outer Shells, White", + "url": "v5f-set-of-outer-shells", + "price": 70 + } + ], + "price": 70, + "reviews": { + "list": [], + "summary": { + "summary": "", + "reviewsAmount": 0 + } + }, + "url": "inmotion-v5f-set-outer-shells-black", + "name": "V5F: Set of Outer Shells, Black", + "category": "Parts|Inmotion" + }, + { + "shortDescription": [ + "ON SALE: For a limited time, save an Extra $100 of the regular price ($899 is the discounted price)", + "eWheels are delighted to announce that the Solowheel Glide 3/Inmotion V8 will again be sold through our online store", + "With it’s stunning looks, excellent performance, exceptional value, this Wheel has been one the most successful Electric Unicycle of 2017", + "Solowheel’s addition to this product are an improved App, firmware changes, better access to support/service & marketing outreach to increase awareness of the Electric Unicycles", + "BONUS: includes a FREE pair of wrist-guards, along with the Inmotion branded Protective Cover & free shipping within the Continental US" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "30lbs", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon3.jpg" + }, + { + "heading": "Cruising Speed", + "data": "18 MPH", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon1.png" + }, + { + "heading": "Charge Time", + "data": "1.5hrs to 80%\nWith a 3A fast-charger", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon4.png" + }, + { + "heading": "Recommend Load", + "data": "220 lbs", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon2.png" + }, + { + "heading": "Battery Capacity", + "data": "480 Wh", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/Battery-Graph-1.png" + }, + { + "heading": "Range", + "data": "20-25 miles", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/Range-Graph-1.png" + } + ], + "images": [ + { + "main": [ + { + "src": "V8-Cover-1.jpg", + "srcset": [ + "V8-Cover-1-66x66.jpg 66w", + "V8-Cover-1-75x75.jpg 75w", + "V8-Cover-1-120x120.jpg 120w", + "V8-Cover-1-150x150.jpg 150w", + "V8-Cover-1-200x200.jpg 200w", + "V8-Cover-1-300x300.jpg 300w", + "V8-Cover-1-400x400.jpg 400w", + "V8-Cover-1-500x500.jpg 500w", + "V8-Cover-1-600x600.jpg 600w", + "V8-Cover-1-768x768.jpg 768w", + "V8-Cover-1.jpg 800w" + ] + }, + { + "src": "V8-Cover-1.jpg", + "srcset": [ + "V8-Cover-1-66x66.jpg 66w", + "V8-Cover-1-75x75.jpg 75w", + "V8-Cover-1-120x120.jpg 120w", + "V8-Cover-1-150x150.jpg 150w", + "V8-Cover-1-200x200.jpg 200w", + "V8-Cover-1-300x300.jpg 300w", + "V8-Cover-1-400x400.jpg 400w", + "V8-Cover-1-500x500.jpg 500w", + "V8-Cover-1-600x600.jpg 600w", + "V8-Cover-1-768x768.jpg 768w", + "V8-Cover-1.jpg 800w" + ] + }, + { + "src": "Glide3-Side-Handle.jpg", + "srcset": null + }, + { + "src": "Glide3-Side-Handle.jpg", + "srcset": null + }, + { + "src": "V8-Oblique-Red-RS.jpg", + "srcset": null + }, + { + "src": "V8-Oblique-Red-RS.jpg", + "srcset": null + }, + { + "src": "Glide-3-Resting.jpg", + "srcset": null + }, + { + "src": "Glide-3-Resting.jpg", + "srcset": null + }, + { + "src": "Glide3-Side.jpg", + "srcset": null + }, + { + "src": "Glide3-Side.jpg", + "srcset": null + }, + { + "src": "Glide3-Front.jpg", + "srcset": null + }, + { + "src": "Glide3-Front.jpg", + "srcset": null + }, + { + "src": "V8-Dimensions_burned.jpg", + "srcset": null + }, + { + "src": "V8-Dimensions_burned-768x548.jpg", + "srcset": null + } + ] + } + ], + "relatedProducts": [ + { + "name": "NEW: Gotway MSuper X MSX. 1600Wh Battery/2000W Motor", + "url": "new-gotway-msuper-x-msx-1600wh-battery-2000w-motor", + "price": 1595 + }, + { + "name": "Tire: 16” x 1.95″ Kenda for V8/Glide 3", + "url": "tire-16-x-1-95-kenda-for-v8", + "price": 35 + }, + { + "name": "NEW: King Song 18XL 1554Wh Battery/2000W Motor", + "url": "new-king-song-18xl-1554wh-battery-2000w-motor", + "price": 1969.5 + }, + { + "name": "NEW: King Song 18S, 840Wh & 1500W Motor", + "url": "king-song-18s-840wh-1680wh-1500w-motor", + "price": 1745 + } + ], + "price": 899, + "reviews": { + "list": [ + { + "content": "This is my first EUC and I am just familiarizing myself with it. Felt odd initially, but after watching a few videos, I can now start and stop this EUC just fine and also manage to ride 100‘ without falling on my face. Not bad after 2 days of practice. Turns are still weak, but for a 70 year old fellow, I am quite happy with my progress. EUC have intrigued me for a while so I better learn to ride one now. If not now, when then?", + "reviewMeta": [ + "Posted 2 weeks ago", + "07.11.2020" + ], + "reviewAuthor": "Gottfried Schiller", + "reviewRate": 5 + }, + { + "content": "Good wheel for beginner. Took me a little longer than most people here to learn to ride, but now I'm ready for something faster. Wheel holds up quite well to the hits and falls that it took. Surprised nothing at all has broken on it. It is well crafted and I've grown to trust it's durability.", + "reviewMeta": [ + "Posted 3 months ago", + "27.07.2020" + ], + "reviewAuthor": "gulian cyril", + "reviewRate": 5 + }, + { + "content": "Great wheel rides awesome!", + "reviewMeta": [ + "Posted 4 months ago", + "09.07.2020" + ], + "reviewAuthor": "David Boatman", + "reviewRate": 5 + }, + { + "content": "Solowheel glide 3- It took me 4 one hour sessions over the course of four days to learn to ride. It took my daughter 2 one hour sessions to learn how to ride. The past 200 miles of use has been fantastic! I have taken the solowheel on paved roads, sidewalks, paved trails, climbed up fairly steep hills, and I have done some slight off roading. I have ridden it though mud and puddles of water that were just below the pedals. The pedals are up high which makes it nice to just glide though the various environments that are thrown your way. \n\nTiltback on the pedals begins coming in at 15mph and you can push the glide to 18mph, but any extended time and your feet will get tired relatively quickly due to the the nature of the incline of the pedals during tiltback. Its sleek design looks futuristic and the LEDs just make for a cool looking night ride. \n\nDuring the learning process I crashed the solowheel multiple times and it just kept on ticking. I've put the glide 3 through the ringer on numerous occasions and even though it has several scuff marks and scratches it still turns on and functions like it did when I pulled it out of the box. \n\nRange- I'm 5'7\" and 200ish lbs give or take a few and I can get about 17 miles before it's reading below 10%.\n\nAcceleration and handling- This thing is light, nimble, easy to turn, and easy to learn on. Quick bursts of speed are fantastic from a dead stop or even at speed.\n\nModifications/Alterations- *Disclosure* I come from the automotive world where we can take vehicles, mod them to be faster and look more visually appealing to us. I find this department a little lacking, but I believe that is with most EUCs. While the customization for the LED's is neat there is not whole lot more you can do with this wheel. I did upgrade the pedals to a much larger size. This was totally worth the upgrade as the expansion of foot space made it ride easier, ride more comfortably, and aided in maneuverability. The XL pedals really should have come on this wheel from the factory. If you are seriously considering this wheel, make this your first purchase after the safety gear. (Reason for 4 stars and not 5) \n\nCons (Reason for 4 stars and not 5) - I would say the headlight could use some work. While it's sufficient in low lighting areas in urban neighborhoods; night riding is less than steller through dark places. I would highly recommend a flashlight of some sort if that's when you plan to ride. The inmotion app that you use for the solowheel constantly disconnects from the wheel. However, when it stays connected it's for the most part user friendly and some small adjustments can be made. \n\nWith all that being said this is a great starter wheel that you can grow into, however I find the cruising speed just not fast enough for me and I will be upgrading to a more robust wheel.", + "reviewMeta": [ + "Posted 4 months ago", + "27.06.2020" + ], + "reviewAuthor": "Jonathan Taylor", + "reviewRate": 4 + }, + { + "content": "I want to upgrade from my Swagroller and this seems to be the correct upgrade.", + "reviewMeta": [ + "Posted 7 months ago", + "25.04.2020" + ], + "reviewAuthor": "Donald", + "reviewRate": 5 + }, + { + "content": "Beautiful machine and fun to ride.", + "reviewMeta": [ + "Posted 7 months ago", + "23.04.2020" + ], + "reviewAuthor": "Ryan Clark", + "reviewRate": 5 + }, + { + "content": "I bought this wheel about 6 months ago as my first wheel. The learning curve was steep but fun! I just bought a KS16x. Obviously, the 16x has more power and performance, however, it also made me appreciate how wonderfully light and small the Glide 3 is. I had considered selling the Glide 3, but have decided to keep it. The ease of transporting the small and light Glide 3 will make it more practical than the 16x in some situations. It easily fits in the trunk of my Miata and I can ride it anywhere I used to ride my bicycle. For the price, the Glide 3 is an amazing machine with size and weight as an advantage over higher level wheels if you need to carry or transport it, or if you need to store it in a locker.", + "reviewMeta": [ + "Posted 10 months ago", + "16.01.2020" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "Bought this from ewheels about 2 months ago as my first wheel. It’s definitely a great wheel and has taken several top speed crashes without any major damage, I can verify it’s durability. However, after putting 150 miles on it, I feel I’ve already outgrown it. Wish I had just spent a little more and bought a faster wheel from the start that I could have grown into. IMHO, nobody just starting out has the ability to ride as fast as it will go. That comes with time. But, my next machine will need to go just a little bit faster so that it doesn’t seem slow when max speed is achieved. Once I achieved it, as comfortable as it is, I am wanting a little bit more. The only reason I say this is that at half battery, it will beep at you incessantly trying to tilt back and reduce your speed to what feels like a crawl. As a safety issue, it works great, but as you gain experience on the wheel and near the 100 mile mark of riding, I am needing just as you will probably also will be wanting, a wheel with more speed and range because of how fun these great little machines are to ride. 100 miles really isn’t that far when you start having as much fun on yours as I have had on mine. It’s only a little annoying at first when the battery reaches the half way point, but, after a little time and riding experience it does become really very annoying. You want to go faster but can’t. Really sucks when you’re 10 miles from the house and it feels like you are crawling on the way back and takes you 2-3 times longer and beeping at you the whole way. Also, it is much more difficult to ride at slower speeds. It takes a lot more energy out of you with the additional effort it takes to ride it. You are going to be a lot more tired when you get back. In hindsight, I would have purchased a different wheel with more speed and battery. I just didn’t realize how much time or fun I was going to be having while riding it. I love my EUC. It truly is a blast to ride. One of the best entertainment purchases I’ve ever made. I’m still undecided on my next wheel.", + "reviewMeta": [ + "Posted 11 months ago", + "29.11.2019" + ], + "reviewAuthor": "Bryan", + "reviewRate": 5 + }, + { + "content": "Super smooth good quality and long battery life", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Vincent Jr Garcia", + "reviewRate": 5 + }, + { + "content": "This is my first electric unicycle. I upgraded from an inexpensive electric skateboard in order to find something that 1) can handle the steepest of San Francisco hills, 2) can handle the terrible road surface in some areas of the city, and 3) has a decent range. \n\nThis EUC does all of those things. It can go up and down the steepest hill in Potrero without issue. The cracks and potholes that stopped my electric skateboard in it's tracks are damped out by the V8. The range is exceptional. \n\nMy two complaints: \n\n1) The tire was misaligned on the rim at first, which I didn't think to check since I never had to check on a bicycle. This caused some significant instability of the V8 at higher speeds, leading to oscillations and many near-crashes. Deflating the tire significantly and ensuring it was centered on the wheel during and after reinflation fixed this issue for me. I wish this had been a standard warning from the get go. \n\n2) When I grab the handle of the V8, I oftentimes scrape my knuckles to the point of bleeding. There is a seam directly under the handle, and sliding your fingers in and out in order to grip the handle catches this seam and sometimes rips off some skin. I put a small strip of clear duct tape over this area to prevent this. Very unpleasant. \n\nOverall a good electric unicycle. Performs well in San Francisco rain (aka barely a drizzle, but wet roads), was easy to learn, and the top speed is just about what I'm comfortable with as a beginner. I had to take off a star for the seam-finger issue though. I still recommend this to others.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Brandon", + "reviewRate": 4 + }, + { + "content": "Solowheel Glide is awesome. It was an upgrade from Segway Ninebot One S1. It's faster and quieter. I know there are other EUC's that are faster but heavier and more expensive. I fractured my arm riding a bicycle at about 18 mph so I did not wanted to get EUC that can go faster. Solowheel Glide 3 has perfect speed limit, the weight and the range in my opinion. I am very happy and satified with the purchase.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Edward Kim", + "reviewRate": 5 + }, + { + "content": "The wheel design is amazing, but some of the parts like the tyre could have better quality. My inner tube broken within first five miles of riding, but the support person immediately sent out another for me. Overall an amazing wheel.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "I’m thoroughly enjoying my new V8. It’s everything that I hoped for and more!!\n I went from 5 feet the first day (Friday the 13th), to over 25 riding miles during the last two days. The online tutorials that teach you how to ride, were very helpful. \nMy one negative is that I haven’t been able to get on your website to register my vehicle!!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Tony Roberson", + "reviewRate": 5 + }, + { + "content": "I'm really happy with my selection of the Solowheel Glide3 (Inmotion V8) as my very first EUC and learning how to ride it is proving to be incredibly fun and rewarding as my technique improves. It seems like its a great wheel to go through the learning process by being not too big or too small, but just perfect. Will definitely be upgrading to something more advanced in the future and I can trust eWheels to be there when I'm ready!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Scott Arthur", + "reviewRate": 5 + }, + { + "content": "Purchased as my 1st EUC. After doing quite a bit of research both on the right EUC (eg for beginners) and who to buy from, I landed on the Glide 3 as well as purchasing from eWheels. I did most of my research via YouTube. What I found basically was that the Glide 3 was a good introductory EUC at a price point that wasn't a barrier. Not too fast/powerful, but just right. Very smooth and easy to learn on. Plus, the fact that a cover comes with the Glide 3 is a plus. While I was learning, I can't tell you how many times I \"dumped\" (eg had to hop off) the Glide 3.\n\nWith respect to eWheels, a lot of the prominent YouTubers, w.r.t. EUCs, spoke highly of eWheels. So, after doing my research, I felt comfortable investing in my first EUC with eWheels. Jason was also quick to answer questions that I had.\n\nAfter about three weeks, though, I've already invested in a 2nd EUC. My 13 yr old son has enjoyed learning to ride as well. So, if I wanted any time to ride, I needed a 2nd one...", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Scott", + "reviewRate": 5 + }, + { + "content": "El mejor juguete que he tenido en mis 45 años", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "felitira", + "reviewRate": 5 + }, + { + "content": "My first ewheel. Could not be happier with both the wheel and the service.\n\nThe v8 was pretty easy to learn on, and I since have taught many of my friends on it. It also gives a lot of room to grow as I'm getting more comfortable and ramping up my speed.\n\n If you're on the fence I would say definitely give this wheel a try it is a lot of fun.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Michael Robertson", + "reviewRate": 5 + }, + { + "content": "This is my first wheel and so I'm still in learning mode, however, this EUC feels solid! It holds my 220lbs very well, and doesn't feel like it's hurting at all from it. I know some have said that 220lbs is the limit to get the best experience out of this wheel, unfortunately I'm not experienced enough to rate that. YET!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "ANTHONY SEALE", + "reviewRate": 5 + }, + { + "content": "Great wheel! Bought one for me and bought another one for my girlfriend. She spent a week to learn it and now both of us love it!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Yang", + "reviewRate": 5 + }, + { + "content": "The Solowheel Glide 3/INMOTION V8 was the perfect starter cycle!!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Steve N", + "reviewRate": 5 + }, + { + "content": "Loved the wheel, but I thought the cover would protect the wheel better, the shell is more fragile than what I thought. Before a week, of Learning I already damage the shell so bad. (As bad as my knee and elbow, now I got protection) \n\nBesides That, I love it.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "IVAN QUILES DE LA TORRE", + "reviewRate": 5 + }, + { + "content": "This is the best electric ridable and even just in general the best thing Ive ever rode over snowboarding, long boarding all that, this gets me everywhere I need I have a car that uses up a-lot of gas so this saves me a ton of money in the long run when I use the Solowheel Glide 3/Inmotion V8!!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "William Galloway", + "reviewRate": 5 + }, + { + "content": "Lots of fun. Learning to ride has been a fun challenge and a bit easier than I expected after studying some videos on how to get started. It’s like a magic carpet and I’m looking forward to going on longer and longer rides. Could use some guidance on which apps are best but I’ve been able to use one with good results.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Fred Stephens", + "reviewRate": 5 + }, + { + "content": "I recently bought a solo wheel glide 3 after watching many videos on YouTube, I’m 56y/o and found it relatively easy to learn (less than a hour). Then my brother learned to ride it so we bought a second one, Our buying experience from ewheels.com was excellent and shipping to Michigan was fast, the battery range and speed is good and the fun factor is a 10,", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Jerry Vandenberg", + "reviewRate": 5 + }, + { + "content": "The device is fast, has a good range, it’s easy to carry around (fits even inside my gym locker) and turn heads here in Texas. \n\nIt’s very fun to ride and a better method of transportation compared to a bike. \n\nI’m very happy with the purchase.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "Steep learning curve but we'll worth it! Solo wheel has best of both worlds as on portability with speed. I highly recommend getting an euc, it's a great way to explore and the sologlide is well built.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "At first i was apprehensive and i think i lacked a little confidence. I rode it about a hundred feet on my second try but quit there because i couldnt get it to speed up. I've ridden pedal unicycles all my life ( Im 54 now) and the forward backwards balance is no problem on the glide 3 but the side to side was. The next morning I put a lot more air in the tire (15 more lbs) to 55. I got on it and leaned a little further forward and off i went! I had read that riding one with lower tire pressure is easier to control and its simply not true. It decreases the lean forward to go faster and virtually eliminates high speed wobs. Its truly an amazing vehicle and has just the right amount of speed. Im not afraid of speed by any means but for the tire size its the perfect comfort zone at speed for stability and you pass every cyclist, especially uphill. Im a fairly big guy at 190 and it has no problem buzzing me up a long uphill straightaway that would be a long and arduous haul for even a healthy experienced bicyclist. The roads are pretty rough where I live but there are no major potholes which could be detrimental to your health but I biffed it around the corner pretty good and it takes a pretty good beating. Although I'm sure I could handle a short staircase I'm not sure i would put it through that kind of abuse and expect it to last over 1000 miles without a major overhaul and repairs. It might but why risk it. Its a great machine. Treat it with respect and it will do everything it says milagewise and speedwise. The battery pack appears to be quite healthy. The app sucks and it takes a little to figure the lights. Its headlight is bright but at speed its iffy, so i wear a 500 lumen lamp on my helmet at night. You youngsters out there wear your damn helmet because you are going to fall hard at speed. Trust me I know. Lol . All in all I made a great decision on my purchase because Ewheels company gave me an education in itself on all of the eunicycles and the one that would suit my abilities best. I'm no slouch and am in good shape with the athleticism it takes to ride one and it suits me perfect. I give it a five out of five so far with only about 60 miles on it so far. Thanks guys I love it far more than I thought I thought would. For what it does you simply cant beat the price. Job well done.... Pete in Las Cruces NM", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "peter iagmin", + "reviewRate": 5 + }, + { + "content": "Electric unicycles are fun to ride, the case tends to scratch easier if you fall but ewheels.com included a free protective cover with my purchase,", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Jerry VanDenBerg", + "reviewRate": 5 + }, + { + "content": "Proposal: A bike, the size of a briefcase.\nReality: An electric bike-equivalent, the size of a briefcase.\n\nThis machine is sturdy as a brick, fast as a bird and stable as a rock. For a market usually associated with hoverboards of dubious provenance it oozes quality and feels solid. At 12 kg it's one of the lighter wheels around, easy to carry when needed, which is rare given the integrated trolley handle that lets the wheel drive along next to the user under its own power.\n\nI thought it would take months to learn how to use it, but the active touch-time was something closer to 8 hours, spread out over a couple of weeks. This coming from a person who hasn't touched a bike, skateboard or other such thing in years.\n\nI feel safe riding on this and I get the impression it will last for quite a long time. Battery time is top notch as is the speed. This is the perfect thing for an urban commute where you might need to take it on a train or into shops. \n\nThe official Android app is unfortunately rubbish - it requires creating a user account and granting it a load of shady permissions (without which it fails to start). Fortunately WheelLog is available, free and open source, to manage the settings and telemetry from the wheel, without any of the above mentioned funny business.\n\nI wish I'd have known about this app from the get-go, instead of having to suss it out by myself.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "I am overall very happy with this product. My only issues are around the user manual and the app. It should be clearly stated somewhere that air is removed prior to shipping and that you need to pump it up before riding, otherwise you will end up with a pinched flat. I also cannot access the V8 app to turn off the sound effects. However, these issues feel minor to me as ewheels has been super helpful in advising me on how to fix it, as well as being very open to feedback. If you have done research on the product and are paying attention, you can catch these issues early on. \nThe wheel gives me Life! It's been only a few weeks and I am already riding it. Love it!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Alexa M", + "reviewRate": 5 + }, + { + "content": "An extremely fun wheel to ride (extremely recommended for urban/city riding). I would highly recommend purchasing this wheel as a starter wheel and upgrading to see if a higher end wheel will suit your needs or not (you may get lucky and find a new release that blows away a wheel you were previously looking at). Not only that, but this wheel comes with a cover and wrist guards which adds value to the purchase and protects the wheel as you learn. The wheel itself is smooth and with time feels like second nature. You want to go somewhere? It'll take you there in a snap. Another great benefit is the button under the handle that keeps the wheel from spinning if you need to bring it up stairs (making it ideal for the city).\n\nThe reason why I marked this wheel down is due to battery capacity and higher end performance. The battery is good (comparable to a Onewheel XR [I enjoy riding with onewheel groups]), but it doesn't offer what similar level wheels offer. I wish Inmotion upgraded this wheel to a capacity similar to the Kingsong 16S so I get just a bit more range (maybe power too? :3). Performance-wise I can only go 15 mph on the wheel before pushback slows me down (making me much slower than my Onewheel companions). It makes catching up uncomfortable, because riding through pushback for a few miles can be exhausting on the feet and legs.\n\nThat being said, I (may be) pushing the limitations of the wheel in group rides, so I'll likely upgrade to a larger wheel. However, I did not know I needed more performance until I started joining groups! This wheel has made me more active than before, meeting more people than I have before. It will likely be my solo riding backup commuter since the benefits and convenience of this wheel make it great all-around easy cruising wheel. But, I digress since this wheel is priced at such a great point that I can't really complain too much! ;)\n\nSummary: This wheel is recommended as a super fun starter wheel or an urban/city commuter due to its convenience and features. However, if you're thinking of joining group rides, a higher performance wheel is recommended to keep up!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Tyler Tsang", + "reviewRate": 4 + }, + { + "content": "My second inmotion wheel. Loving it so much. Riding around st Petersburg florida has been a joy. Meeting people and making friends just for riding around. I love this little wheel better than V10f idk why but its a joy to ride. Thank you ewheel for speedy delivery .", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Charles Simeon", + "reviewRate": 5 + }, + { + "content": "This is my first wheel and I love it! It makes nipping down to the shops a pleasure and I look forward to riding it into work. I couldn't be happier with it. Also the service from Ewheels was amazing. I received my wheel the day after ordering it and any questions I've had have been answered promptly. The fast charger is also great and well worth getting for speeding up the charging process.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Steve Bags", + "reviewRate": 5 + }, + { + "content": "It’s my first wheel so I don’t have much to compare. However I purchased this wheel specifically to learn on and just to have fun on at my local parks etc. . Since the hobby is new to me I wasn’t quite sure if I wanted to drop $2k on a high end wheel. I’m loving the V8 so far and it will be a great wheel to let friends and family ride once I upgrade. I kinda wish the top speed was higher, but at the same time I’m kinda glad I’m limited to 19mph as a beginner. You can’t go wrong with this wheel if it’s your first wheel and want to see if the hobby is for you. By the way I weigh 235 pounds and so far the wheel has worked flawlessly and has never felt underpowered. Ewheels also supplied me with a protective cover that came with the wheel for free. That cover has taken some abuse but my wheel is still in mint condition other than the bottoms of the foot plates (who cares.) I’m so glad I got the cover, as I’m a beginner. I’ll take it off once Im more confident and crash less.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "Purchased this wheel a couple weeks ago after doing quite a bit of research. I’m 50 and never had the best coordination. I invested in some good pads and a helmet just in case. Took me about 3 hours to ride without stepping off. Now I have over 100 miles on the wheel. I ride it for fun both day and night. The lights are great. No accidents, just pure fun. Highly recommend. Well worth the $900.00.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "This is my first wheel.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "This is my 4th wheel I have purchased and used over the years. So far this is also my favorite one. Like the built in handle for walking it and love the no spin switch on the handle for when you pick it up. The built in headlight is great!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Matt Graham", + "reviewRate": 5 + }, + { + "content": "I recently purchased my first EUC, a new Glide 3 / V8 from ewheels. I’m 49 years old and not in perfect shape, but I do have some experience in other balance-related sports. After an hour or less per day, for one week, I am already riding and having a ton of fun on this machine. Now I’m just tightening up my figure-eights and polishing everything up to increase my comfort level and confidence. This machine and the whole learning process so far has been a blast. I highly recommend it!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Joe Lanzi", + "reviewRate": 5 + }, + { + "content": "I'm back after 2 months to give a review! \n\nI was surprised at how hard it was to learn, but I was equally as surprised at how rewarding it was to master it. Day by day I saw a little bit of progress and eventually I was zipping around at full speed, and I was hooked for life. It is sooooo fun. There is no feeling like it (just a wheel and an engine), it makes you young again.\n\nAfter about 400km of riding I agree with the other reviewers: the V8 (Glide3) seems to be the perfect combo of speed / weight / durablity: I wouldn't want to be lugging around anything heavier, and I wouldn't feel comfortable going much faster. As for durability I am not worried about breaking it - it is built like a tank. \n\nIf you're on the fence about ordering one of these like I was, I say just pull the trigger! It's a brilliant invention, this is not a fad. Worth every penny!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Dennis", + "reviewRate": 5 + }, + { + "content": "So everyone’s experience will vary. I am 56 year old newbie, 5’9”, 200 lbs and ride motorcycles and snowboards... Received my V8 and V10 Friday. Two, 2 hour sessions with the V8 Saturday and was up and running on a single floor in a multi-level car park. By end of second session - Smooth power, easy to mount, stopping no problem. Could ride this wheel all day! Was eying the (steep) ramps to the other floors in the car park. And “felt” that I would want to attempt them on the V10, all that safety talk about weight versus motor power on inclines got in my head... Sunday - got up on the V10, immediately felt “in the pocket” with this wheel. After an hour of adjusting foot position on the larger pedals I hit the ramps. By the end of that sessions I was running all six floors, and hitting the 16 mph warning often... Hindsight 20/20 - I think that if you are athletic and have skiing or snowboard experience the V10 is an OK entry point. Nothing wrong with the V8 at all - I look forward to riding it again to compare experiences. If I am heading to the coffee shop - V8, heading out for a run - V10... No falls or serious crashes - V8", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 4 + }, + { + "content": "I'm addicted to this thing. I'm sure everyone is different, but it took me about 4-5 days to be proficient at it, riding fast and turning smoothly. I'm not really athletic either! :)", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Brian Yang", + "reviewRate": 5 + }, + { + "content": "Great all around purchase. One of my most favorite toys I've bought ever, it makes me feel like a kid again! I'm using for the commute to work. It took me 3-6 hours to truly get the feel of the wheel. My only complaint is the app (inmotion) could be better, cleaner, but it does most of what I would like it to do. The solowheel app is broken in the apple store as of Oct 2018.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Isaac Shelly", + "reviewRate": 5 + }, + { + "content": "I got the Glide3 about a week ago. Haven't had a huge amount of time on it yet but I'm finally riding it around the neighborhood about about half speed. Still definitely learning but so far its pretty fun. I will say that I was not prepared for just how quickly this thing would get beat up. Its very sturdy and holding up to the punishment quite well but cosmetically (even with the cover) it got mangled very quick. I've wiped out a few times plus just normal tipovers as I'm learning, the floorboards underneath are scraped to hell and even on top around the handle where the cover doesn't cover has road rash. In my case probably not a bad thing since it'll be less likely to be stolen but worth noting. I don't think any other model/brand would have fared any better, it was just a surprise about how much abuse would occur.\n\nOther than cosmetics though the thing is a lot of fun. Definitely not the easiest skill for me to pick up but its coming along.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Paul Clifton", + "reviewRate": 5 + }, + { + "content": "I love this wheel. I feel like InMotion/SoloWheel got this wheel just right. I had the King Song and compared to that this wheel is light, quick, and very well balanced. I had issues with the KingSong wobbling a lot, not to mention it was heavy and didn't have a kill switch or a very tall handle. Granted, this wheel has a smaller battery but the trade-off is better balance, slimmer build and lighter weight. Perfect wheel, goes far enough to get around NYC.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Guy", + "reviewRate": 5 + }, + { + "content": "A friend told me he got an electric unicycle wheel and I was like huh? I go “You mean the one with peddles like the circus?” so he ran to his car and got ninebot one and flew down the drive way and back, my jaw dropped. I was amazed at how fast the thing was. The following day I did a quick research and saw the inmotion V8 on amazon for 899 with excellent review. One of the review mentions buying it from ewheels.com and so thats what I did and Gheeze! This was such a crazy impulse buy that I have ever done. To think that I always wanted a road bike but will never pay more than 300 bucks and to dropped 900 dollars without thinking twice, I must be crazy. At first I was little upset because I didn’t know how to ride and I kept dropping and scraping. It took me 1 week learn but after learning how to ride I love it more and more. Best thing is no one in my neighborhood has one so I feel super special. If you’re a first time like I was the solo glide 3 is an excellent choice.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Bill S.", + "reviewRate": 5 + }, + { + "content": "Perfect balance of weight and power for a commuter wheel. Fits in the overhead compartment on the train, rolls through the station like luggage, and takes me to work through busy Manhattan streets in style.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Sergey Z.", + "reviewRate": 5 + }, + { + "content": "I used the \"contact us\" link to ask for advice on what to purchase after reading numerous positive reviews on forum.electricunicycle.org. I'm 5'-8\", 155lbs, mid 40s and I've been reading about EUCs ever since I stumbled upon them after initially looking for an adult razor type scooter. Jason got back quickly and recommended the Glide 3 which I bought the next day. I've never even used a segway so I knew it was going to be a learning curve. Over five days, about two hours per day, one or more days off in between, I've logged 40 miles now. First few days were hard, and this experience makes learning to snowboard seem easy. Anyway, I have some sore muscles below the knee that I never even knew existed, but I've gotten pretty good, even at slow speeds. I haven't bumped it above the factory 83% and I'm still trying to understand how the calibration settings work, but overall I love this thing. I've never even seen an EUC in person before but watched a lot of youtube videos over the past year, which probably helps with the learning curve. Anyway, I highly recommend this for a beginner or intermediate. The neoprene cover is nice and kept it from getting scratched the first few days. Yesterday I took the kids to the park and my 6 year old got tired riding her bike up hill on the way home. I grabbed one handle bar and her seat and this thing had enough power to easily push both of us up a nice long hill (ok, my back is a little sore from bending over a little). I almost bought a ninebot C but when I read about people upgrading, I'm glad I spent a little more. eWheels was super convenient and I got a shipping notice about two hours after I placed the order. I highly recommend both eWheels and the Glide 3!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Craig", + "reviewRate": 5 + }, + { + "content": "Started my electric unicycle journey this year with Ninebot One E+, which I consider a great wheel. I have not ridden any other wheel than that. I wanted to have second wheel, more range, more speed and integrated handle. I also did not want it to emit loud high pitch noise and did not want it to be to heavy.\n\nFrom my internet research I had zero options... Then I heard about Inmotion V8 several weeks ago. The process of purchase was great. I ordered it one afternoon (4PM), it was sent next day early morning (got email of dispatch at 4AM).\n\nI also recommend getting this particular wheel, yet you have to ask yourself - if you have different expectations, then maybe some other wheel would suit you better. For me - V8 seems like, well, created for me :). I wanted a wheel:\n1. For commuting 10-12km one way, without having to recharge at work (to carry less things in backpack). V8 can do that.\n2. With more range for more fun and more options. With E+ I sometimes needed to go taxi one way, and unicycle the other way because of not enough range for my needs. Now I'm able to go 34km (did 33.6km once with 5% battery left, going around 23-25kph).\n3. With integrated handle, so that I can go inside a shop etc. V8 has it, I like it very much, checked in practice inside shop - it's great. Oh, and also this button which stops the motor when you lift V8 up - I did not realize how much it can simplify my life, very good idea and implementation.\n4. With more speed for more fun. I often felt (on E+) that I need just a little bit more speed. V8 has what I need and riding it feels really solid.\n5. Not too heavy - V8 is around the same weight as E+. In practice it felt lighter, so I checked on weighing machine and it showed it's really lighter (but I wouldn't trust this machine much).\n6. No high-pitch loud noise - V8 sound is really pleasant for my ears. I really appreciate LEDs (for me - the more the better :)). A friend told me the wheel looks like from Tron movie (on the predefined factory settings).\n\nThe driving is similar to E+, but pedals are a lot more stiffer (I use riding mode 0 on E+) and they also react totally different on turns. On E+ they dive in (firmware 1.3.5) on turns, here it's the opposite, so I had some small learning to do. I think I prefer the riding mode of V8 and turns of E+, but on the other hand - I'm just accustomed to that feeling so cannot judge as of now.\nI have nearly 3000km on E+ and nearly 300km on V8 and I believe that in the end I'll simply like both types of behaviours :).\n\nOh, and I forgot about look: this wheel is simply beautiful :). After spending some time with V8, commuting, going to shops, having fun - my opinion about it is very very positive.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Rafal", + "reviewRate": 5 + }, + { + "content": "You can get it in any color as long as it's black\" and that's about the only likeness the Inmotion V8 has with my old \"T-Ford\" wheel. I am a beginner to the electric unicycle and I was very hasty in the purchase of my first wheel: a 14-inch, generation 1 electric unicycle from a local shop. After a few hours of riding I realized that I had outgrown this wheel that caused pain to my shins and had limited potential. A brief but informative \"Let's Talk\" with Jason helped me make up my mind to place a pre-order. It took a few days extra to get the shipment since this was the first batch to Europe from the factory but it was very reassuring to get a notification from eWheels once it reached the continent. Delivery to me came four days later. I have to say that the V8 is a dream to ride and very responsive. It gives me no pain to my legs at all and I haven't even attached the supplied soft-pads. It handles the dirt roads in my training path with ease and the transition to the new wheel was quite a no-brainer. The only down-side I can find is that it is easy to accidentally toggle the power button when grabbing the handle while wearing gloves. OK, so it wouldn't hurt with a good back light either as the dark season is approaching but I found the front light to be very apt for my dark roads. Summary: top-notch wheel, top-notch dealer!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Peter Sandblom", + "reviewRate": 5 + }, + { + "content": "Going to a larger EUC\nMy Impressions on upgrading from a 14\" Inmotion V5F to 16\" V8\n\nI got my Inmotion V5F , catchy name huh, on March 30th 2017 and it took me 3 months 2 weeks to put 1000 miles on it. It was an upgrade from a Ninebot one A1, which served as my learning machine. So 14\" wheels are all I have ever known. I love the portability and toyishness of the 14\" under 30lbs wheels. They prepare you to get bounced off by their very lack of mass and weight beneath your feet. I often wonder why I even need them to glide above the ground, and maybe they are just a crutch for this un-noticed skill I have had all along. Then I hit a hidden salad bowl sized pothole and wonder why I am running all of a sudden with my wheel skidding off to the side. They are fun! So when I decided to get more speed and distance I settled in on the 16\" Inmotion V8 for looks (really sleek even with the dizzy lights), the name (I am a car guy so V8), and the familiarity with the Inmotion ride.\nMore on the Inmotion V8 specs and review later. After getting the V8 calibrated with the app to unlock the speed and tweak the lights and warnings it was time to test ride. I had tried the 16\" and the 18\" wheels at a gas station during a brief meeting with my local EUC club. They were ACM and Kingsong models and really had a vehicle type of ride stability. They felt like firm machinery compared to my nimble V5F lark. The Kingsong 14S and 16S were not available yet to buy, but on another EUC ride I was fortunate enough to try out an 840wh Kingsong 14C from Jeff and found it to be more than capable at getting me up and down the hollywood hills in Griffith Park. It never labored and has great pick up in acceleration. It was a bit more clunky in the corners than my V5F, but that might have been Beginner Wheel Skill Disorder. BWSD is the term I give for the unwieldy feel that a new wheel will have until your body has adjusted to the different mechanics and foot weight distributions that arise from different wheels. This was what I was feeling with the new V8 as I ventured down my hill towards sunset blvd. It would pull to one side or the other in a different way from my old V5F. Perhaps it is learning my style as I learn its. The phenomenon is still the same if not more pronounced with a brand new out of the package wheel. Inmotion has a - SCV forward correction - function in its app that will work after about 10 miles of use. Other models have ride feel adjustments in their Apps, and it is suggested to dial in or use these functions as it will make the break in time more comfortable, and give you more control. This worked for me as well as my body was adjusting to the new geometry of the larger wheel.\nGoing up in wheel size doesn't make you taller, since the pedals are at the same height, but the body of the wheel will rest at different areas of your legs. I have a blister on my right upper ankle and a slight bruise on my left shin as evidence of this. The V8 is only 1\" taller than the V5F with a trolley handle. However the top of the body is 2\" taller. So for a short guy, the physics of leaning due to the taller y-axis(body) makes the leverage from the x-axis(pedals) less. My body either needs to lean out side to side further or with more force. Its not much more, but there does seem to be a natural learning curve. Combined with the additional weight of the wheel, these are some things to be aware of when upsizing, even within the same company. Obviously since all EUC companies have different designs, this happens when switching Wheel companies as well.\nI ride my V5F and V8 along the bike lanes and paths of Los Angeles. The streets in L.A. Bow up to drain water to the gutters and the bike lanes and space next to curbs is on a slight angle. This angle can force the wheel into the curb unless I ride the wheel at a little bit more than a 90° angle, leaning slightly into traffic. This has taken some adjustment and learning, so I have had to be more careful even though I have more than 1000 miles of riding experience. Turning is different, not better or worse as far as tightness of turns and control. The wobbles are back as the placement of my feet is adjusted to the new weight distribution, blabbity blah, blah. Enough of the first impressions, Lets skip 50 miles into the future...\nI really enjoy the 3mph extra cruising speed and max speed in the upgrade. I got to work within a few minutes of my car time average. The V8 feels both stable and nimble at cruising speeds of 15-19mph. The other day I rode over a bowl type of pothole that used to shake my 14\" wheel, but the 16\" took it in stride even while taking me by surprise. This is only day 3, but the wheel is beginning to learn my unorthodox extreme leaning into the curves. I am still getting used to the larger circumference while turning, because I am so used to the smaller wheel. Its getting much more natural with every new trip. Driving over shallow sand and loose dirt is easier with the heavier V8, but still a lot like dry water skiing. The 800 watt motor easily moves me uphills in dirt and asphalt or to maximum speed without laboring. I like to ride my EUC like a leaf balancing on a spinning top, and the V8 has that sort of stable lightness of a ride.\nI am only 145 lbs. but the V8 only gets around 21 or 22 miles, with pushing it to the limits and stopping for stop signs, before you reach the dreaded last bar or 20% battery left. The speaker which usually blurts out \"be careful\" (gotta get it to speak in Chinese) gives you a warning sound that sounds like the warning sound you'd get when a landline telephone used to get knocked off the hook for too long if you start to push it at this point. It limits the speed and gets a little cranky if you jump off a curb or over a large pothole at a fast speed under these battery conditions. All in all it wants the rider to be safe and reminds you of this a lot when the battery gets very low. Although the range is a little lacking, it took me around two hours to drive 22 miles. A 2 min stop to change out a new battery for another 22 miles is no big deal, and probably needed as a rest at that point anyway. Changing the battery in the V5F is a great undertaking requiring great feats of double speed fast motion photography, unscrewing and unhooking for 15 mins just to get to the battery compartment and unhook it. So get the V5F+ if you are thinking of range for that EUC. I have already ordered an extra battery for the V8 and charging port to hook it up to my chargers.\nTo sum it all up, upgrading to a wheel to match ones skill level and expanded use is something enriching and easy to do. The options are all around and so far seem to be growing in numbers. I stuck with what was familiar but larger and more powerful. If Kingsong had their KS14S or KS16S available I may have gone with them. One thing to remember- you will use the new wheel in much the same way as the old one for the majority of the time. It should make these journeys more useful and enjoyable. If you can say that about your upgrade, you've succeeded. Some other brief thoughts...\n- I thought the larger 16\" wheel would be more cumbersome- it is actually just as nimble\n- I had no idea how the extra speed would be so natural during the proper conditions. You don't miss what you don't experience...\n- Upgrading to a new wheel takes time to relearn some basic handling of the new machine.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "William Mahony", + "reviewRate": 5 + }, + { + "content": "I like to comment here on the Inmotion V8 and the Customer Support:\n\n1. V8: It has been pure joy using this high-tech device that is so simple to understand, ride, and enjoy. It flies up the steep hills of Sausalito, California as it breaks when riding them down. I can only recommend this for any serious \"glider\"\n\n2. The support by EWheels throughout this process has been fantastic. eWheels has not only delivered on promises but supported me with specific questions and added advice on technical manners and is always quick to respond and also provide online and telephone support when needed. It gives me great comfort to work with a firm that customises their offering to the customer.\n\nIn sum, you are in good hands with eWheels!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Janos L.", + "reviewRate": 5 + }, + { + "content": "Working with Jason on purchasing my Inmotion V8 has been a great experience. I fell in love with this monowheel right away...it has a smooth ride, handles great, and the customizable lights make it really fun to ride.\n\nBut this testimonial is really for Jason's customer service. Whenever I had ANY questions for him, he was extremely prompt with his response and always helpful. When I shot him an email about getting the mobile app set up, he replied right away. When I asked him about some LED lights that went out after I dropped my wheel, he sent me replacement LED strips for free under warranty AND included a tutorial on how to install them. And when I put my cover back on and realized that I had lost a screw in the process, he offered to send me on as well.\n\nI can't recommend Jason at eWheels enough. Thanks for all of your help!\n\n-Jon Chintanaroad", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Jon Chintanaroad", + "reviewRate": 5 + }, + { + "content": "So I just bought the V8. OMG! It's awesome.. I can't ride it yet but here I am at the Hard Rock in Vegas trying to ride it and this girl ask if she can help me balance. .... yep! Guys this very well might be a chick magnet......", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Ironman", + "reviewRate": 5 + }, + { + "content": "I have been researching online and on you tube for several months now on purchasing an electric unicycle, and I finally decided on an Inmotion V8, and decided to purchase from EWheels instead of eBay or ( Amazon, I could only find the V5F there), Due to the Reviews about Jason and the service there.\n\nFirst let me say the three reasons I went with the V8...\n\n1. A more intermediate wheel with power and range I felt like I could grow into, I was afraid I would want to purchase another one in a few months :) maybe not the worst scenario ...\n\n2. The many videos on You Tube that showed and reviewed this wheel all were extremely positive...\n\n3. The only bells and whistles I wanted were the lights and a built in handle and that's it, no speakers etc...\n\nSecondly let me talk about EWheels ...\n\nI placed my order on Friday night March 24th, I ordered the V8 and extra inner tube (I live in AZ lots of pokez (cactus) on the roads as my grandkids would say) and a cover for the V8. First thing Monday morning 3/27 I received an email from Jason at EWheels with a lot of really good information about getting started and links to videos and the app and a message about my order, apparently they were out of the covers and Jason let me know immediately which I thought was extremely proactive and was definitely the right thing to do from a customer experience standpoint, he also promised to send some of the bumper padding at no cost and refund the cost of the cover if he was unable to locate a cover for me. Later that day he sent me another email verifying that he was indeed out of the covers and that he would refund and send me the padding in lieu of the cover. Again I really appreciate his upfront heads-up and short term solution for my order, I really feel like his focus was on making me a happy camper right out of the gate :).\n\nNow the Wheel... wow what can I say except AWESOME!!! it arrived at my house on Thursday 3/30 around noon with an 80% charge and everything in the box packed well and no damage whatsoever :) On Friday I started practicing doing the various things a newbie would do after watching countless hours of video on YouTube lol... I expected I wouldn't even be able to ride it until I practiced for at least one to two weeks for one to two hours a day well guess what :) some how I was able to get the hang of it within that first hour and yea I still need lots of practice but I have been cruising around the neighborhood and even my kids are amazed that I caught on this quick. Now I do have to tell you it was not with some major spills and crashes but I wear the necessary gear (Wrist, knee, elbow and helmet) and yes I have already scratched up the outside not to bad, but if I would have only had the cover on it, it actually would have been worse. Once I get much better I will order a new case anyways but for now the padding is doing its job.\n\nThe only negatives about the wheel for me anyways, was the lack of a pad for the upper calf area however I used some of the padding to solve that for now, it did come with some ankle pads which for me were needed :), and the app which I expected based on the reviews I read.\n\nI will be doing business with Jason and EWheels in the future for replacement parts for the V8 and some accessories. And I'm sure there will be an upgrade in the future to a Gotway maybe a monster :) but for now I am extremely happy with my purchase and with the excellent service provided by Jason,\n\nHopefully I can get some of the videos uploaded soon to you tube.\n\nThanks EWheels,\n\nDanny (Poopa) Thornton", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Daniel Thornton", + "reviewRate": 5 + }, + { + "content": "I purchased the InMotion V8 in December 2016 and it is my first EUC. I can definitely say that I am hooked. It took me about 2 hours to feel comfortable going forward and making tight turns. I have put 60 miles on since January 4th when I received my wheel and really enjoy riding it. I have no other wheels to compare my experience but I can say I am impressed with the power and the range so far. I can easily see myself riding an 18 inch wheel with a long range battery by summer 2018. I live in Pennsylvania and I have never seen one of these around but glad I discovered these cool inventions.\n\nThe customer service here is top notch. Jason answered all my questions very fast and everything went smooth. I ordered a cover for the V8 but I received one for a V5. Jason responded with a tracking number for the new cover and a shipping label to return the one for the V5. I received the correct cover in 4 days. Again, I cannot say enough about the customer service here. Overall I would rate my experience a 5 out of 5. Look forward to making another purchase in the future!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Ryan Scott", + "reviewRate": 5 + } + ], + "summary": { + "rating": 4.9, + "reviewsAmount": "55 Reviews" + } + }, + "url": "inmotion-v8", + "name": "Solowheel Glide 3, 480Wh Battery/800W Motor", + "category": "Advanced Electric Wheels" + }, + { + "shortDescription": [ + "BONUS: receive a FREE pair of Wrist-guards with your order", + "Available in five cool colors", + "Weighs less than 20lbs", + "Great little Wheel at a great price!" + ], + "technicalSpecs": [ + { + "heading": "Model", + "data": "A130 Turbo Edition" + }, + { + "heading": "Battery", + "data": "LG HG2 20A cells, 172Wh" + }, + { + "heading": "Max Speed", + "data": "11 mph" + }, + { + "heading": "Weight", + "data": "18.7 lbs" + }, + { + "heading": "Range", + "data": "Up to 12.5 miles" + }, + { + "heading": "Max Gradient", + "data": "20°" + }, + { + "heading": "Max load", + "data": "150 lbs" + }, + { + "heading": "Motor Power", + "data": "350W" + }, + { + "heading": "Materials", + "data": "Shell: Scratch resistant ABS plastic\nPedals: Aluminium alloy" + }, + { + "heading": "Charging Time", + "data": "Around 1 hour" + }, + { + "heading": "Dimensions", + "data": "Height 17.3″,  Length 12.7″, Width 6.3″" + }, + { + "heading": "", + "data": "" + } + ], + "images": [ + { + "main": [ + { + "src": "A130-Oblong-View.jpg", + "srcset": [ + "A130-Oblong-View-66x66.jpg 66w", + "A130-Oblong-View-75x75.jpg 75w", + "A130-Oblong-View-120x120.jpg 120w", + "A130-Oblong-View-150x150.jpg 150w", + "A130-Oblong-View-200x200.jpg 200w", + "A130-Oblong-View-300x300.jpg 300w", + "A130-Oblong-View-400x400.jpg 400w", + "A130-Oblong-View-500x500.jpg 500w", + "A130-Oblong-View.jpg 600w" + ] + }, + { + "src": "A130-Oblong-View.jpg", + "srcset": [ + "A130-Oblong-View-66x66.jpg 66w", + "A130-Oblong-View-75x75.jpg 75w", + "A130-Oblong-View-120x120.jpg 120w", + "A130-Oblong-View-150x150.jpg 150w", + "A130-Oblong-View-200x200.jpg 200w", + "A130-Oblong-View-300x300.jpg 300w", + "A130-Oblong-View-400x400.jpg 400w", + "A130-Oblong-View-500x500.jpg 500w", + "A130-Oblong-View.jpg 600w" + ] + }, + { + "src": "A130-Colours.jpg", + "srcset": null + }, + { + "src": "A130-Colours.jpg", + "srcset": null + }, + { + "src": "A130-Blue.jpg", + "srcset": null + }, + { + "src": "A130-Blue.jpg", + "srcset": null + }, + { + "src": "A130-Black.jpg", + "srcset": null + }, + { + "src": "A130-Black.jpg", + "srcset": null + }, + { + "src": "A130-Pink.jpg", + "srcset": null + }, + { + "src": "A130-Pink.jpg", + "srcset": null + }, + { + "src": "A130-Orange.jpg", + "srcset": null + }, + { + "src": "A130-Orange.jpg", + "srcset": null + }, + { + "src": "A130-White.jpg", + "srcset": null + }, + { + "src": "A130-White.jpg", + "srcset": null + }, + { + "src": "A130-Standing-Close-up.jpg", + "srcset": null + }, + { + "src": "A130-Standing-Close-up.jpg", + "srcset": null + } + ] + } + ], + "relatedProducts": [ + { + "name": "King Song 14D, 340/420Wh Battery, 800W Motor", + "url": "new-king-song-14d-420wh-battery800w-motor", + "price": 800 + } + ], + "price": 375, + "reviews": { + "list": [ + { + "content": "well I have been running around on this unit. As my first one to own I do like it. Off road is a must and its not let me down. Mph is close , and range not to sure . I beleave there are better and faster . For a starter its good. I also have solo-wheel which its apples to oranges.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "James S", + "reviewRate": 4 + } + ], + "summary": { + "rating": 4, + "reviewsAmount": "1 Reviews" + } + }, + "url": "ips-a130-turbo-edition", + "name": "IPS a130 Turbo Edition", + "category": "Entry & Mid-Range eWheels" + }, + { + "shortDescription": [ + "This is the control-board for the King Song 14C. It’s peak-output is rated to a maximum of  3,500W, contains two independent Bluetooth radios—one for the integrated speakers & another for the system control." + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "1 lbs" + }, + { + "heading": "Dimensions", + "data": "10 × 10 × 2 in" + } + ], + "images": [ + { + "main": [ + { + "src": "KS-Control-board-RS.jpg", + "srcset": [ + "KS-Control-board-RS-52x50.jpg 52w", + "KS-Control-board-RS-200x195.jpg 200w", + "KS-Control-board-RS-300x292.jpg 300w", + "KS-Control-board-RS-400x390.jpg 400w", + "KS-Control-board-RS.jpg 500w" + ] + }, + { + "src": "KS-Control-board-RS.jpg", + "srcset": [ + "KS-Control-board-RS-52x50.jpg 52w", + "KS-Control-board-RS-200x195.jpg 200w", + "KS-Control-board-RS-300x292.jpg 300w", + "KS-Control-board-RS-400x390.jpg 400w", + "KS-Control-board-RS.jpg 500w" + ] + }, + { + "src": "KS-Control-board.jpg", + "srcset": null + }, + { + "src": "KS-Control-board-768x747.jpg", + "srcset": null + } + ] + } + ], + "relatedProducts": [ + { + "name": "KS 14D: Replacement Control-Board", + "url": "ks-14d-replacement-control-board", + "price": 154 + }, + { + "name": "KS 14B: 174Wh Battery Pack", + "url": "ks-14b-battery-pack", + "price": 175 + }, + { + "name": "KS 14B/C: Pair of Replacement LED Covers, Black", + "url": "king-song-14-led-panels-black", + "price": 40 + }, + { + "name": "KS 16: Set of 2x LED Strips", + "url": "king-song-16-led-strip", + "price": 35 + } + ], + "price": 125, + "reviews": { + "list": [], + "summary": { + "rating": 0, + "reviewsAmount": "0 Reviews" + } + }, + "url": "king-song-14-control-board", + "name": "KS 14C: Replacement Control-Board", + "category": "Parts|King Song" + }, + { + "shortDescription": [ + "Front & Rear LED Cover Replacements for the King Song 14″ Wheels. This is an identical part for both the 14B & 14C." + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": ".7 lbs" + }, + { + "heading": "Dimensions", + "data": "10 × 10 × 3 in" + } + ], + "images": [ + { + "main": [ + { + "src": "KS-14-Side-LED-Panels-RS.jpg", + "srcset": [ + "KS-14-Side-LED-Panels-RS-52x50.jpg 52w", + "KS-14-Side-LED-Panels-RS-200x190.jpg 200w", + "KS-14-Side-LED-Panels-RS-300x284.jpg 300w", + "KS-14-Side-LED-Panels-RS-400x379.jpg 400w", + "KS-14-Side-LED-Panels-RS.jpg 500w" + ] + }, + { + "src": "KS-14-Side-LED-Panels-RS.jpg", + "srcset": [ + "KS-14-Side-LED-Panels-RS-52x50.jpg 52w", + "KS-14-Side-LED-Panels-RS-200x190.jpg 200w", + "KS-14-Side-LED-Panels-RS-300x284.jpg 300w", + "KS-14-Side-LED-Panels-RS-400x379.jpg 400w", + "KS-14-Side-LED-Panels-RS.jpg 500w" + ] + }, + { + "src": "KS-14-LED-Panels-Red.jpg", + "srcset": null + }, + { + "src": "KS-14-LED-Panels-Red-768x749.jpg", + "srcset": null + }, + { + "src": "KS-14-Side-LED-Panels.jpg", + "srcset": null + }, + { + "src": "KS-14-Side-LED-Panels-768x728.jpg", + "srcset": null + } + ] + } + ], + "relatedProducts": [ + { + "name": "KS 16: Set of 2x LED Strips", + "url": "king-song-16-led-strip", + "price": 35 + }, + { + "name": "KS 14B: 174Wh Battery Pack", + "url": "ks-14b-battery-pack", + "price": 175 + }, + { + "name": "KS 16: Set of Unbranded Upper Pads", + "url": "ks-16-set-of-unbranded-upper-pads", + "price": 39 + }, + { + "name": "KS16: Top Cover with Switch & Charging Port, Black Gloss", + "url": "ks16-replacement-top-shell-switch-charging-port-black-gloss", + "price": 42 + } + ], + "price": 40, + "reviews": { + "list": [], + "summary": { + "rating": 0, + "reviewsAmount": "0 Reviews" + } + }, + "url": "king-song-14-led-panels-black", + "name": "KS 14B/C: Pair of Replacement LED Covers, Black", + "category": "Parts|King Song" + }, + { + "shortDescription": [ + "Back in Stock, shipping now", + "BONUS: a pair of FREE wrist-guards included", + "The KS14S has nearly the same practicality & nimbleness of the KS14D, but with the added benefit of the larger battery that provides both longer range & higher continuous cruising speed over its smaller 14D sibling" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "34lb", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon3.jpg" + }, + { + "heading": "Cruising Speed", + "data": "18.6 MPH", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon1.png" + }, + { + "heading": "Charge Time", + "data": "1.5-2hrs to 80%\nWith a 5A fast-charger", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon4.png" + }, + { + "heading": "Max Load", + "data": "220 lbs", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon2.png" + }, + { + "heading": "Battery Capacity", + "data": "680/840 Wh", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/Battery-Graph-1.png" + }, + { + "heading": "Range", + "data": "30/40 miles", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/Range-Graph-1.png" + } + ], + "images": [ + { + "main": [ + { + "src": "KS14S-BM-Oblique.jpg", + "srcset": [ + "KS14S-BM-Oblique-66x66.jpg 66w", + "KS14S-BM-Oblique-75x75.jpg 75w", + "KS14S-BM-Oblique-100x100.jpg 100w", + "KS14S-BM-Oblique-150x150.jpg 150w", + "KS14S-BM-Oblique-200x200.jpg 200w", + "KS14S-BM-Oblique-300x300.jpg 300w", + "KS14S-BM-Oblique-400x400.jpg 400w", + "KS14S-BM-Oblique-500x500.jpg 500w", + "KS14S-BM-Oblique-600x600.jpg 600w", + "KS14S-BM-Oblique-700x700.jpg 700w", + "KS14S-BM-Oblique-768x768.jpg 768w", + "KS14S-BM-Oblique-800x800.jpg 800w", + "KS14S-BM-Oblique.jpg 801w" + ] + }, + { + "src": "KS14S-BM-Oblique-700x700.jpg", + "srcset": [ + "KS14S-BM-Oblique-66x66.jpg 66w", + "KS14S-BM-Oblique-75x75.jpg 75w", + "KS14S-BM-Oblique-100x100.jpg 100w", + "KS14S-BM-Oblique-150x150.jpg 150w", + "KS14S-BM-Oblique-200x200.jpg 200w", + "KS14S-BM-Oblique-300x300.jpg 300w", + "KS14S-BM-Oblique-400x400.jpg 400w", + "KS14S-BM-Oblique-500x500.jpg 500w", + "KS14S-BM-Oblique-600x600.jpg 600w", + "KS14S-BM-Oblique-700x700.jpg 700w", + "KS14S-BM-Oblique-768x768.jpg 768w", + "KS14S-BM-Oblique-800x800.jpg 800w", + "KS14S-BM-Oblique.jpg 801w" + ] + }, + { + "src": "KS14S-BM-Side.jpg", + "srcset": null + }, + { + "src": "KS14S-BM-Side-700x700.jpg", + "srcset": null + }, + { + "src": "KS14S-BM-Pedals.jpg", + "srcset": null + }, + { + "src": "KS14S-BM-Pedals-700x700.jpg", + "srcset": null + }, + { + "src": "KS14S-BM-Handle-Extended.jpg", + "srcset": null + }, + { + "src": "KS14S-BM-Handle-Extended-700x700.jpg", + "srcset": null + }, + { + "src": "KS14S-BM-Front.jpg", + "srcset": null + }, + { + "src": "KS14S-BM-Front-700x700.jpg", + "srcset": null + }, + { + "src": "KS14S-B-Side.jpg", + "srcset": null + }, + { + "src": "KS14S-B-Side-700x699.jpg", + "srcset": null + } + ] + } + ], + "relatedProducts": [ + { + "name": "NEW: MTen3 10”, ‘The Pocket Rocket’, 512Wh/800W Motor", + "url": "gotway-mten3-512-800w-motor", + "price": 1049.5 + }, + { + "name": "NEW: King Song 18XL 1554Wh Battery/2000W Motor", + "url": "new-king-song-18xl-1554wh-battery-2000w-motor", + "price": 1969.5 + }, + { + "name": "NEW: King Song 16X 1554Wh Battery/2000W Motor, 3″ Wide Tire", + "url": "new-king-song-16x-1554wh-battery-2000w-motor-3-wide-tire", + "price": 500 + }, + { + "name": "King Song 16S, 1200W Motor/840Wh Battery", + "url": "kingsong-16-electric-unicycle", + "price": 1412.5 + } + ], + "price": 1175, + "reviews": { + "list": [ + { + "content": "You guys - I'm a girl - and I'm getting it!! Where my ladies at? I've spent a little time practicing at school track and today I made it all the way around. Check out my video - Kingsong S14 https://youtu.be/q7Ss65ACJOU", + "reviewMeta": [ + "Posted 1 month ago", + "16.10.2020" + ], + "reviewAuthor": "Michele Pearson", + "reviewRate": 5 + }, + { + "content": "Arrived without issue, very happy with purchase. First timer, so I felt this model would be a good fit. Learning slowly, bruised calves, but I have faith lol. I am very happy too add myself to the ever growing euc commmunity.", + "reviewMeta": [ + "Posted 2 months ago", + "05.09.2020" + ], + "reviewAuthor": "Michael Walton", + "reviewRate": 5 + }, + { + "content": "The wheel is very smooth, and the new larger pedals are a really nice touch. Their non-slip surface is the best I've come across and they make me feel cery confident that my feet will not slip off the wheel under any conditions. The only bad point would be the \"new\" side pads. I like the older side pads - they have more padding where it's needed most and the upper padding edge is more \"rounded\" so as to place less pressure on the side of my shin during mounting and dismounting. The new pads have a sharp upper edge that digs into my shin like a dull knife and after a few mounts/dismounts make my shin begin to REALLY HURT. I have version 2.00 firmware in my wheel, and when I disable the bluetooth speaker, the wheel will announce \"Blah-tooth is off\" everytime I power up my wheel. This is a little annoying and I would prefer it if the wheel would NOT announce this everytime I power up.", + "reviewMeta": [ + "Posted 2 months ago", + "05.09.2020" + ], + "reviewAuthor": "Sonny Fung", + "reviewRate": 5 + }, + { + "content": "As a starter wheel, and therefore the only wheel I've ridden so nothing to compare it to, this 14s has been excellent. The combo of 14s and the Bodyguard neoprene cover has done an amazing job of taking the abuse I've HEAPED onto it. The wheel has been run into curbs, walls, fences, cinderblocks, and dropped (over and over and over) with out missing a beat. When I upgrade to a bigger wheel (S18 on preorder already, haha), I'll definitely be keeping this one around to loan/teach with!", + "reviewMeta": [ + "Posted 3 months ago", + "24.08.2020" + ], + "reviewAuthor": "Jamie Menard", + "reviewRate": 5 + }, + { + "content": "First electric unicycle. It’s amazing. Smooth once you get the hand of it. Only had it for a week, but it’s been a great week!", + "reviewMeta": [ + "Posted 4 months ago", + "08.07.2020" + ], + "reviewAuthor": "Ethan Lavendier", + "reviewRate": 5 + }, + { + "content": "just started riding this EUC so far performs well, no issues\nwas able to start riding without help after few hours of trying", + "reviewMeta": [ + "Posted 9 months ago", + "21.02.2020" + ], + "reviewAuthor": "furqan qureshi", + "reviewRate": 4 + }, + { + "content": "After I ordered this wheel I got a email explaining how to unlock it and how to set the speed to max. It was very easy to do. I'm really enjoying the wheel already 65 miles on it.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Nathan Wheeler", + "reviewRate": 5 + }, + { + "content": "This is my first wheel and I've only got a couple hours on it but I was able to ride it unassisted after 30 minutes of practice. Key tip is to keep the tire around 25psi when starting out because it makes a world of difference for control and stability. I feel like I picked up quick because of my skateboarding background so it may take longer than 30 min to learn for others. I didn't stop riding until I was hungry and tired because I was having so much fun lol.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Anthony Fillon", + "reviewRate": 5 + }, + { + "content": "Great wheel for the city! Nimble, yet goes 35 miles on a charge. I recommend this wheel to anyone— beginner or the experienced rider. Be safe!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "Wheel came in perfect condition with included XL pedals and a set of extra slim pads, absolutely love the wheel it is extremely light and nimble and the range is ridiculously good!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Brandon Marcussen", + "reviewRate": 5 + }, + { + "content": "This is a great euc!!! I have had it for one week now and have put 157 miles on it. It feels great to ride. There is plenty of speed for me. The range is terrific, not once have I had range anxiety and I have ridden it for 2 hours in a row at one point. It seems to be very tough, it is my first euc so I crashed a lot at first. Other than a few scratches, it is still perfect. The tire is directional. The front is the side with the power button. This is probably the coolest thing I ever bought. This was worth every last penny I spent. From the stand point of someone who wants to use an euc for recreational use, this is perfect for me. The amount of power is great, 800 Watts is more than enough for me. As far as customer service goes, ewheels is perfect. Jason helped me along the with my concerns. Since I am new to personal electric vehicles, I may have had more questions than normal. Jason answered all of my questions and was very helpful. I can’t express how thankful I am for ewheels great customer support. I don’t think you can go wrong ordering from ewheels. I love my Ks14s!!!!!!!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Conrad", + "reviewRate": 5 + }, + { + "content": "Responsive and powerful. Smooth and an excellent platform.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Chris Schwalm", + "reviewRate": 5 + }, + { + "content": "I love my new 14S! This is my first EUC and I've had it now for a little less than two months. The first month was spent learning how to ride, but between the info on eWheels and some youtube videos, I was able to get comfortable pretty quickly. The 14S is rock solid and amazing to ride. It literally feels like floating. I can't imagine a better EUC to start with and keep long term. I did a lot of research and expect to be riding my 14S for a long time.\n\nI also can't say enough about Jason @ eWheels. I got my 14S in 2 days after ordering it which was wonderfully unexpected. All my questions and issues have been handled quickly and with a seriously amazing level of customer support. You can not go wrong with eWheels or this 14S UEC.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Greg L.", + "reviewRate": 5 + }, + { + "content": "Absolutely love this euc. With my weight I get about 50 miles which is plenty. I’ve ridden it to and from work which is 24miles round trip. I got for long 30 mile rides on the weekends.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Jacq. W", + "reviewRate": 5 + }, + { + "content": "This is legitimately the best thing I have ever purchased in my life. Hands down...now close second place. I LOVE THIS THING. I ride it to BART in the bay area then ride BART to work...I never drive my car anymore lol. True story. If you rarely need to go anywhere further than a couple miles...you'll never drive your car again either.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Jesse M.", + "reviewRate": 5 + }, + { + "content": "Just bought this wheel. Called to order it 2 days ago and got it somehow next day. Now that's some service. I was expecting a shipping conformation the next day not the actual package!!! There was some minor issues with the wheel which is as to be expected with products from china but Jason was always in contact and every response was how to fix it followed by conformation emails on shipping of the replacement parts. Do not buy from China and get hosed, buy from Jason with confidence. \n\nMy first ride last night on the wheel was amazing, I upgraded from an inmotion v3 pro which is now my daughters. Once she gets good at that I'll give her this one and I'll upgrade to the ACM or one of the faster wheels. I'm trying to get my family into these thing. I mean for the same space in my trunk that can fit one bike I can instead fit 5 or more of these and go have adventures with the fam without taking up much trunk space or adding bike racks!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Han vo", + "reviewRate": 5 + }, + { + "content": "As a beginner, I was little hesitant to purchase this as my first EUC because there is nowhere to see or rent one in my area. I have purchased several Speedway Mini4 Pros from Jason and the customer service Ewheels provides gave me the confidence to go ahead and get one. All I can say is \"Wow\"! The Kingsong KS14S is a very well built EUC and I was able to ride it the very first day. The power, the maneuverability, the stability of the KS14S is spot on and the range of the 840wh battery is phenomenal. The retractable handle is solid and the bluetooth speakers are awesome. I could not be happier with this purchase.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "I bought this wheel to have a more responsive unicycle and had been riding a inmotion v8 and initially a ninebot e+\nThe 14s is all that its advertised to be. Easy to ride, quick to accelerate, quick to stop. Turns on a dime and very smooth. Initially i did not like the factory pads. They hurt near my mid-calves. But with the improved pads Ewheels supplied. Then the wheel was near perfect. I i am a heavier rider and the 14 inch tire is stable and smooth. I am a little more careful with bumps and irregularities on the road, but it does not feel inferior to the 16. I have ridden 20 miles in one run and it got me home safely, no problem. Its zippy and fun but feels solid and predictable , the factory app sucks but darknessbot works with most all the functions. Kingsong get your act together on the ios application for USA. ewheels is responsive and ships very quickly. So buy this with confidence.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Morgan", + "reviewRate": 5 + }, + { + "content": "I really like this wheel! Previously, my main commuter wheel was the InMotion V5F+ but that wheel's electronics are so finicky. The sounds completely stopped working, LEDs intermittently worked, and the motor controller board needed to be replaced. In the end, I bought the King Song 14S to tackle some of the hills of SF better and it seemed like a more robust wheel.\n\nThe extra power is noticeable. The motor controller board hasn't overheated yet, so now I can go up the same hills and not worry about having to step off. \n\nThe side pads seem to be polarizing, but I didn't mind them. I received the new flatter ones but didn't install it on one of the wheels because they aren't uncomfortable to me. \n\nI cannot stand the \"Hello King Song\" and \"Bluetooth Connected\" sounds. There is no way to disable those in the app or through any settings. It's super embarrassing and stupid, but oh well. The rest of the wheel more than makes up for it.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "David", + "reviewRate": 5 + }, + { + "content": "I purchased a KingSong 14s from eWheels on December 18,2017. This is my second EUC, my first wheel was a Segway S1. I logged over 400 miles on that wheel and really needed a wheel that was faster for commuting to work and being able to ride longer distances if needed. I spoke with Jason about the pros and cons of the different wheels and companies several times. I like the specs on Gotway but KingSong has a reputation for reliability and I would be using this wheel everyday. My choices came down to the KS 16S or KS 14S. When I decided to buy, the 16S was out of stock so I went with the 680 wh KS 14S. Shipping was so fast and everything was intact when delivered (Thanks eWheels). I opened the packaging and put the wheel on the charger to get a full charge. The wheel came with a decent charge out of the box. What a night and day difference between the S1 and 14S, this is a super fun and very fast wheel. I just logged over 300 miles with this wheel and cant express how satisfied I am with my purchase of the KS 14S. My son has been riding my S1 for the past two weeks and I finally let him take a ride on the 14S and he was blown away by the sheer power and speed. He kept asking how I hold back from zooming past him when we ride together since it is so smooth and quick. Even in strong wind, the 14S pushes through without any issues. I replaced the factory pads with the smooth ones sent from Jason at eWheels and what a huge difference did it make. It made the wheel so much more enjoyable. The headlight is bright enough to see when riding at night. The brake light is also a nice addition. The integrated trolley handle is really nice and necessary as the wheel weighs 34 pounds. All I can say is this is a awesome EUC that is fast and fun and a pleasure to ride. eWheels is the only company I will buy from since they have quality products, helpful staff, and awesome warranty. No other company in the US comes close.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Matthew", + "reviewRate": 5 + }, + { + "content": "I wanted a sporty 14″ wheel with great range, and the only game in town is the KingSong 14S. Jason was very helpful in answering my questions and when I purchased it from him I received it in less than a week. Jason provides great follow-up information and he is a pleasure to do business with. The 14S is a fantastic wheel. It has plenty of power and runs very fast. I can reliably get over 30 miles on one charge (my riding weight is ~170 pounds). Here’s a video I shot in my local Southern California mountains, showing it’s off-road prowess: https://youtu.be/qrRLyR0R0jI The full length video can be seen here: https://youtu.be/7x5uo-9k3nQ I don’t think you can go wrong with either the 14S or eWheels.com", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Marty Backe", + "reviewRate": 5 + }, + { + "content": "I recently purchase the KS 14S from ewheels.com and I wanted to share my experience with others who might be debating about which EUC to purchase.\nThe last couple of years I’ve been trying out a variety of electric vehicles for recreation and transport including a Boosted Board, OneWheel, Segway mini pro, and a Metroboard. All have been fun, but I have sold them all off except for the Onewheel. I liked the Boostedboard, but I wasn’t into to small wheel size and having to use a remote. I did not like controlling the Mini Pro with my knees…it did not feel natural. I liked the OneWheel’s ability to go off road, but the 6 mile range was limiting and prevented me from using it as a commuter vehicle.\nI decided to try out an electric unicycle and went with the KS 14C. I purchased the 840wh/800W Motor. I felt that my experience with the OneWheel helped me pick up the KS 14 pretty quickly. It took me a couple of days to feel comfortable, but after that, I really enjoyed this wheel. Compared to the Onewheel, I felt the the 14C was easier to dismount. The OneWheel has a sensor on the foot plate that can be tricky. The 14S allows for easy mounting and dismounting without a problem. The 14” wheel took the grass and bumps a little easier than the 10” OneWheel tire. The range is another thing that really separates the 14S from the other vehicles I have tried. Running out of battery is not a fear on the 14S. The fast charger from eWheels makes the charging experience very convenient as well. I’m not saying the Onewheel or any of the other rideables are bad at all, but I find the KS 14S suits my needs a lot better. I like the 14S so much, I’ve decided to sell my OneWheel and buy a KS 18. I just want to say that Jason at eWheels gave me the best customer service. He answered all of my questions and answered many of my emails after hours and even on the weekends. The whole experience was great and I highly recommend a KS from eWheels.com.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Matt Franklin", + "reviewRate": 5 + }, + { + "content": "Having owned a SoloWheel original, and ridden the Gotway MSuper 18 as well as the Solowheel Extreme, the King Song 14″ 800W packs an amazing amount of power and reliability into a compact, lightweight package.\nThe speed is killer – as fast as pretty much any moderate bike rider – and I was able to zip up the steepest hills with ease! I went on a 15-mile ride with my buddy who owns an MSuper 18 and was outpacing him the entire way. The app customization options are great too – no one wants to hear beeping as they go faster. Definitely a 10/10 product from someone who’s ridden the “best” in the industry!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Max Winderbaum", + "reviewRate": 5 + }, + { + "content": "I bought my KingSong from eWheels last winter. I’d only started to learn how to ride (two one hour sessions) when I was in an aircraft accident. That was in February.. I didn’t try riding again until last weekend, the middle of October. It’s a blast! Today I did my first tour of the subdivision which was about 3 miles. I even went fast enough to get the cautionary beeps (Whoo HOO!), then I quickly slowed down. eWheels.com has been great. There might be an issue with the battery charger topping off the batteries too high, so Jason sent me another one to try out. He got back with me on a Sunday to figure out what to try! If you’re thinking about by a wheel from eWheels Go For It!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Dave Thomas", + "reviewRate": 5 + }, + { + "content": "eWheels has done a great job getting me my wheel. When I received it I was having a problem with the app. I emailed Jason and got a reply with what to do to fix it almost immediately! I Love riding this wheel! Thanks eWheels", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Doug Dodge", + "reviewRate": 5 + } + ], + "summary": { + "rating": 5, + "reviewsAmount": "25 Reviews" + } + }, + "url": "king-song-14s-electric-unicycle-840wh", + "name": "King Song 14S, 840Wh Battery/800W Motor", + "category": "Advanced Electric Wheels" + }, + { + "shortDescription": [ + "King Song 16″ Control-board\nRated for 800W sustained power & 3500W peak\nIn most cases failures are covered under the warranty, so please contact us before purchase" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "1 lbs" + }, + { + "heading": "Dimensions", + "data": "15 × 10 × 1 in" + } + ], + "images": [ + { + "main": [ + { + "src": "KS16-Control-board.jpg", + "srcset": [ + "KS16-Control-board-66x66.jpg 66w", + "KS16-Control-board-75x75.jpg 75w", + "KS16-Control-board-120x121.jpg 120w", + "KS16-Control-board-150x150.jpg 150w", + "KS16-Control-board-200x202.jpg 200w", + "KS16-Control-board-298x300.jpg 298w", + "KS16-Control-board-400x403.jpg 400w", + "KS16-Control-board-496x500.jpg 496w", + "KS16-Control-board-600x605.jpg 600w", + "KS16-Control-board-768x774.jpg 768w", + "KS16-Control-board-793x800.jpg 793w", + "KS16-Control-board-800x807.jpg 800w", + "KS16-Control-board-1016x1024.jpg 1016w", + "KS16-Control-board.jpg 1098w" + ] + }, + { + "src": "KS16-Control-board-768x774.jpg", + "srcset": [ + "KS16-Control-board-66x66.jpg 66w", + "KS16-Control-board-75x75.jpg 75w", + "KS16-Control-board-120x121.jpg 120w", + "KS16-Control-board-150x150.jpg 150w", + "KS16-Control-board-200x202.jpg 200w", + "KS16-Control-board-298x300.jpg 298w", + "KS16-Control-board-400x403.jpg 400w", + "KS16-Control-board-496x500.jpg 496w", + "KS16-Control-board-600x605.jpg 600w", + "KS16-Control-board-768x774.jpg 768w", + "KS16-Control-board-793x800.jpg 793w", + "KS16-Control-board-800x807.jpg 800w", + "KS16-Control-board-1016x1024.jpg 1016w", + "KS16-Control-board.jpg 1098w" + ] + } + ] + } + ], + "relatedProducts": [ + { + "name": "KS 14D: Replacement Control-Board", + "url": "ks-14d-replacement-control-board", + "price": 154 + }, + { + "name": "KS 14C: Replacement Control-Board", + "url": "king-song-14-control-board", + "price": 125 + }, + { + "name": "King Song 16X Seat", + "url": "king-song-16x-seat", + "price": 75 + }, + { + "name": "Inner-Tube: 14” x 2.125”, Kenda", + "url": "king-song-14-inner-tube", + "price": 22.5 + } + ], + "price": 165, + "reviews": { + "list": [], + "summary": { + "rating": 0, + "reviewsAmount": "0 Reviews" + } + }, + "url": "king-song-16-control-board", + "name": "KS 16B: Replacement Control-Board", + "category": "Parts|King Song" + }, + { + "shortDescription": [ + "King Song 16″ Retractable Handle" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "3 lbs" + }, + { + "heading": "Dimensions", + "data": "20 × 20 × 3 in" + } + ], + "images": [ + { + "main": [ + { + "src": "KS-16-Handle-Kit.jpg", + "srcset": [ + "KS-16-Handle-Kit-66x66.jpg 66w", + "KS-16-Handle-Kit-75x75.jpg 75w", + "KS-16-Handle-Kit-120x121.jpg 120w", + "KS-16-Handle-Kit-150x150.jpg 150w", + "KS-16-Handle-Kit-200x202.jpg 200w", + "KS-16-Handle-Kit-298x300.jpg 298w", + "KS-16-Handle-Kit-400x403.jpg 400w", + "KS-16-Handle-Kit-496x500.jpg 496w", + "KS-16-Handle-Kit-600x605.jpg 600w", + "KS-16-Handle-Kit-768x774.jpg 768w", + "KS-16-Handle-Kit-793x800.jpg 793w", + "KS-16-Handle-Kit-800x807.jpg 800w", + "KS-16-Handle-Kit-1016x1024.jpg 1016w", + "KS-16-Handle-Kit.jpg 1098w" + ] + }, + { + "src": "KS-16-Handle-Kit-768x774.jpg", + "srcset": [ + "KS-16-Handle-Kit-66x66.jpg 66w", + "KS-16-Handle-Kit-75x75.jpg 75w", + "KS-16-Handle-Kit-120x121.jpg 120w", + "KS-16-Handle-Kit-150x150.jpg 150w", + "KS-16-Handle-Kit-200x202.jpg 200w", + "KS-16-Handle-Kit-298x300.jpg 298w", + "KS-16-Handle-Kit-400x403.jpg 400w", + "KS-16-Handle-Kit-496x500.jpg 496w", + "KS-16-Handle-Kit-600x605.jpg 600w", + "KS-16-Handle-Kit-768x774.jpg 768w", + "KS-16-Handle-Kit-793x800.jpg 793w", + "KS-16-Handle-Kit-800x807.jpg 800w", + "KS-16-Handle-Kit-1016x1024.jpg 1016w", + "KS-16-Handle-Kit.jpg 1098w" + ] + } + ] + } + ], + "relatedProducts": [ + { + "name": "KS16: Top Cover with Switch & Charging Port, Black Gloss", + "url": "ks16-replacement-top-shell-switch-charging-port-black-gloss", + "price": 42 + }, + { + "name": "KS 14D: Replacement Control-Board", + "url": "ks-14d-replacement-control-board", + "price": 154 + }, + { + "name": "KS 16S: Replacement Control-Board", + "url": "ks-16s-replacement-control-board", + "price": 168 + }, + { + "name": "KS16: Top Cover with Switch & Charging Port, Black Matte", + "url": "ks16-top-cover-switch-charging-port-black-matte", + "price": 42 + } + ], + "price": 59, + "reviews": { + "list": [], + "summary": { + "summary": "", + "reviewsAmount": 0 + } + }, + "url": "king-song-16-handle-kit", + "name": "KS 16: Retractable Handle Kit", + "category": "Parts|King Song" + }, + { + "shortDescription": [ + "LED Cover of a black tinted semi-transparent polycarbonate" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": ".3 lbs" + }, + { + "heading": "Dimensions", + "data": "16 × 16 × 1 in" + } + ], + "images": [ + { + "main": [ + { + "src": "KS-16-LED-Cover.jpg", + "srcset": [ + "KS-16-LED-Cover-66x66.jpg 66w", + "KS-16-LED-Cover-75x75.jpg 75w", + "KS-16-LED-Cover-120x121.jpg 120w", + "KS-16-LED-Cover-150x150.jpg 150w", + "KS-16-LED-Cover-200x202.jpg 200w", + "KS-16-LED-Cover-298x300.jpg 298w", + "KS-16-LED-Cover-400x403.jpg 400w", + "KS-16-LED-Cover-496x500.jpg 496w", + "KS-16-LED-Cover-600x605.jpg 600w", + "KS-16-LED-Cover-768x774.jpg 768w", + "KS-16-LED-Cover-793x800.jpg 793w", + "KS-16-LED-Cover-800x807.jpg 800w", + "KS-16-LED-Cover-1016x1024.jpg 1016w", + "KS-16-LED-Cover.jpg 1098w" + ] + }, + { + "src": "KS-16-LED-Cover-768x774.jpg", + "srcset": [ + "KS-16-LED-Cover-66x66.jpg 66w", + "KS-16-LED-Cover-75x75.jpg 75w", + "KS-16-LED-Cover-120x121.jpg 120w", + "KS-16-LED-Cover-150x150.jpg 150w", + "KS-16-LED-Cover-200x202.jpg 200w", + "KS-16-LED-Cover-298x300.jpg 298w", + "KS-16-LED-Cover-400x403.jpg 400w", + "KS-16-LED-Cover-496x500.jpg 496w", + "KS-16-LED-Cover-600x605.jpg 600w", + "KS-16-LED-Cover-768x774.jpg 768w", + "KS-16-LED-Cover-793x800.jpg 793w", + "KS-16-LED-Cover-800x807.jpg 800w", + "KS-16-LED-Cover-1016x1024.jpg 1016w", + "KS-16-LED-Cover.jpg 1098w" + ] + } + ] + } + ], + "relatedProducts": [ + { + "name": "KS16: Replacement Set of Outer Shells, Black Gloss", + "url": "ks16-replacement-outer-shells-black-gloss", + "price": 75 + }, + { + "name": "KS16: Top Cover with Switch & Charging Port, Black Matte", + "url": "ks16-top-cover-switch-charging-port-black-matte", + "price": 42 + }, + { + "name": "KS 14S: Set of Unbranded Pads", + "url": "ks-14s-set-of-unbranded-upper-pads", + "price": 48 + }, + { + "name": "Inner-Tube: 14” x 2.125”, Kenda", + "url": "king-song-14-inner-tube", + "price": 22.5 + } + ], + "price": 22, + "reviews": { + "list": [], + "summary": { + "summary": "", + "reviewsAmount": 0 + } + }, + "url": "king-song-16-led-panel-cover", + "name": "KS 16: LED Panel Cover", + "category": "Parts|King Song" + }, + { + "shortDescription": [ + "BONUS: fitted with the latest XL pedals", + "KS18S is the latest generation of the King Song 18″ Electric Unicycle & represents a significant update over the previous AY+1200W motor class.", + "The massive 18″ Wheel is best for managing uneven or poor quality ground &  is especially smooth for long journeys or commutes. It includes the padded seat for when your feet get tired from standing…" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "50lb\nWith 1680Wh battery", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon3.jpg" + }, + { + "heading": "Cruising Speed", + "data": "30 MPH*\nAfter unlocking at 620 mile", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon1.png" + }, + { + "heading": "Charge Time", + "data": "3-4hrs to 80%\nWith a 5A fast-charger", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon4.png" + }, + { + "heading": "Max Load", + "data": "250 lb", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon2.png" + }, + { + "heading": "Battery Capacity", + "data": "1680 Wh", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/Battery-Graph-1.png" + }, + { + "heading": "Range", + "data": "60-70 miles", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/Range-Graph-1.png" + } + ], + "images": [ + { + "main": [ + { + "src": "KS18S-B-Oblique-Rightish.jpg", + "srcset": [ + "KS18S-B-Oblique-Rightish-66x66.jpg 66w", + "KS18S-B-Oblique-Rightish-75x75.jpg 75w", + "KS18S-B-Oblique-Rightish-120x120.jpg 120w", + "KS18S-B-Oblique-Rightish-150x150.jpg 150w", + "KS18S-B-Oblique-Rightish-200x200.jpg 200w", + "KS18S-B-Oblique-Rightish-300x300.jpg 300w", + "KS18S-B-Oblique-Rightish-400x400.jpg 400w", + "KS18S-B-Oblique-Rightish-500x500.jpg 500w", + "KS18S-B-Oblique-Rightish-600x600.jpg 600w", + "KS18S-B-Oblique-Rightish-700x700.jpg 700w", + "KS18S-B-Oblique-Rightish-768x768.jpg 768w", + "KS18S-B-Oblique-Rightish-800x800.jpg 800w", + "KS18S-B-Oblique-Rightish.jpg 801w" + ] + }, + { + "src": "KS18S-B-Oblique-Rightish-700x700.jpg", + "srcset": [ + "KS18S-B-Oblique-Rightish-66x66.jpg 66w", + "KS18S-B-Oblique-Rightish-75x75.jpg 75w", + "KS18S-B-Oblique-Rightish-120x120.jpg 120w", + "KS18S-B-Oblique-Rightish-150x150.jpg 150w", + "KS18S-B-Oblique-Rightish-200x200.jpg 200w", + "KS18S-B-Oblique-Rightish-300x300.jpg 300w", + "KS18S-B-Oblique-Rightish-400x400.jpg 400w", + "KS18S-B-Oblique-Rightish-500x500.jpg 500w", + "KS18S-B-Oblique-Rightish-600x600.jpg 600w", + "KS18S-B-Oblique-Rightish-700x700.jpg 700w", + "KS18S-B-Oblique-Rightish-768x768.jpg 768w", + "KS18S-B-Oblique-Rightish-800x800.jpg 800w", + "KS18S-B-Oblique-Rightish.jpg 801w" + ] + }, + { + "src": "KS18S-W-Oblique-Right.jpg", + "srcset": null + }, + { + "src": "KS18S-W-Oblique-Right-700x700.jpg", + "srcset": null + }, + { + "src": "KS18S-B-Side.jpg", + "srcset": null + }, + { + "src": "KS18S-B-Side-700x700.jpg", + "srcset": null + }, + { + "src": "KS18S-B-Front.jpg", + "srcset": null + }, + { + "src": "KS18S-B-Front-700x700.jpg", + "srcset": null + }, + { + "src": "KS18S-W-Side.jpg", + "srcset": null + }, + { + "src": "KS18S-W-Side-700x700.jpg", + "srcset": null + } + ] + } + ], + "relatedProducts": [ + { + "name": "Tire: 16” x 1.95″ Kenda for V8/Glide 3", + "url": "tire-16-x-1-95-kenda-for-v8", + "price": 35 + }, + { + "name": "Tire: 18” x 2.5”, Kenda", + "url": "18-kenda-tire", + "price": 59 + }, + { + "name": "KS 16: Set of 2x LED Strips", + "url": "king-song-16-led-strip", + "price": 35 + }, + { + "name": "Solowheel Glide 3, 480Wh Battery/800W Motor", + "url": "inmotion-v8", + "price": 899 + } + ], + "price": 1995, + "reviews": { + "list": [ + { + "content": "Best investment I’ve made you’ll be mad at yourself for not buying it sooner . Amazing", + "reviewMeta": [ + "Posted 7 months ago", + "24.04.2020" + ], + "reviewAuthor": "Corey Clevenger", + "reviewRate": 5 + }, + { + "content": "I came from over 3000 miles on two onewheels. I'm so happy with king song 18s a real underrated EUC. I haven't picked up a onewheel since. It is fast for its sheer size and weight. Because it's so tall you can really dig your knees into the frame and lean in. Every time I ride a friends wheel its always refreshing to jump back on the 18s. There is nothing like except the monster. Sit riding is so nice and a totally different feel than standing. Its like riding a moped with no handlebars. Amazing feeling of freedom. So much safer than a onewheel with multiple safety features that protect a bigger rider like me from nose diving. I weigh 275 LB and this thing takes me at fast speeds for hours. Do yourself a favor and get the bigger battery. I didn't realize how much I needed it until my friend got a 70 mile wheel and that gave me range anxiety. When they come in I will be upgrading the battery by adding another one. Seriously though buy this wheel you won't regret it.", + "reviewMeta": [ + "Posted 8 months ago", + "02.03.2020" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "New owner of KS18S in July 2019, and used it at the L.A. EUC Games Freestyle competition. Experience EUC riders all said that it was heavy and hard to maneuver, but not so. You can take a look of the video link where I re-enact the performance of \"Singin' in the Rain\" after the game in Oakland. Being large and on the heavier side, it was actually more stable than smaller EUC. I could even do simple tap dancing on the pedal. Next time I will perform something sitting down which is also easy to maneuver.\n\nhttps://drive.google.com/file/d/1HzEmZy4Pba_gbFePyeDpWzYED5YvApoc/view?usp=sharing", + "reviewMeta": [ + "Posted 11 months ago", + "27.11.2019" + ], + "reviewAuthor": "Dominic Wu", + "reviewRate": 5 + }, + { + "content": "Love the KS18S ! This is the most comfortable long distance cruiser. I now have 600 miles on my wheel. I’m 5’5” 175lb and get 80 miles of range per charge going 15-17 mph. I like the seat as I go on long rides and can sit on the move and relax my feet a bit. The speakers are good, I like to play my tunes from pandora and it alerts people on the trail that I am coming up to them. This is my first wheel and an absolute joy to ride, whoever said money can’t buy happiness never bought an electric unicycle !!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Merrick Dienoff", + "reviewRate": 5 + }, + { + "content": "Can't believe something this cool even exists. So happy I went with the seated version. I've only unlocked it to 24.8 mph out of 31 and it feels insanely fast yet safe enough to hit that 24.8 while seated. Get the highest battery version or you'll regret it as you'll need to charge from 30-80%. You don't want to demolish your expensive battery. If you've ridden before you'll have no problem riding this and getting up to speed will only take 10-20 high speed runs until your body figures it out. Buy the wrap around padding. Just do it. Trust me. The stock padding doesn't cover but 50% of the area your leg will hit on the wheel and you will need to rest your leg on this wheel unlike smaller wheels. Hmmm what else....... Buy motorcycle armor/a helmet/knee pads if you value your life even a little bit. This thing doesn't exactly stop on a dime and at 31mph I can imagine a big enough pothole/bump bucking you off. While seated, stopping takes twice as long and standing up quickly to stop can be difficult. This is the future, you want this Wheel, 2k feels very reasonable for what you get (even more so if you're replacing your car with this/the bus like I am. Speakers are plenty loud. You need this in your life. I promise.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Matthew Hoog", + "reviewRate": 5 + }, + { + "content": "This is a nice, predictable handling wheel that does the advertised speed. It also has good safety features that will help keep the rider from going to fast. It beep at", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Geoffrey Shepler", + "reviewRate": 5 + }, + { + "content": "Let me give you a little background. I had been using a simple hoverboard as an \"assistant commuter.\" I would ride it from my house to a commuter train and then from there I would ride it again to work. I had done this for a year, but the reality of this being so slow for a few of the miles I was on it set in very quickly.\nI was looking for other options that were all electric and also very fun. I had already been known at work and around the work neighborhood as the guy with the hoverboard and somewhat even infamous. I wanted to ramp it up a notch too with whatever I decided to upgrade to. I looked into eBikes and then saw a video on YouTube about Electric Unicycles. As soon as I saw that video, which was for a really cheap and under powered EUC, I knew that I needed to get one. I started researching what types were available, cost, power, speed, battery size, mileage, etc.\nI settled on either a Gotway Monster 22 or a KingSong KS18S because of the power and mileage capability. I wanted this to be able to be a full commuter and errand runner. This would become my primary form of transportation, so it had to be top of the line! I quickly realized the price for me was high, but definitely worth the cost. I saved up what I could and even sold some things on eBay to get all the money. After watching nearly all the videos that are on YouTube about EUCs in general while the time passed, I finally found out about eWheels as the best vendor here in the USA. I also, during this research, finally decided on the KingSong KS18S, as my biggest priorities were, in this order, distance, safety, quality, and power. I've found that overall opinion out there is that KingSong, has the best safety and quality ratings of all the EUC vendors. So I ordered it through eWheels and now I just had to wait for it to arrive.\n\nThree days! That's all it took to get from California to Utah. By the way, there's almost no one in Utah with an EUC, so I may even be the only KS18S rider in the state. That needs to change, we need enough to form a group.\n\nSo here's my experience. I had no experience on one, so it was entirely up to me to train myself. I did watch many videos of how to ride one on YouTube, but they only gave my brain the knowledge. I was VERY UNSUCCESSFUL on my first attempt. Never once though did my EUC fall or get scratched. I was extra cautious. On day two, I was able to ride it, but couldn't quite control where it went, obviously not desirable. After three days however, it finally clicked in my head somehow and WOW, I was riding an EUC.\nIt was actually only about 3 or 4 hours of trying to ride it as I spent mostly only about an hour each day practicing. I had no serious falls or close calls, but being tense and inexperienced had me really squeezing the EUC with my knees which caused some minor bruises on both the inside of my knees and ankles.\nOnce I got it down I didn't find much need to squeeze the sides unless I wanted a really quick acceleration or I was climbing a steep hill. Which this one has NO problems at all doing. I've mostly ridden it in downtown Salt Lake City and drove it up and down some really serious inclines without any problems.\n\nI've seen some reviews both written and video saying that the KingSong KS18S is NOT a good EUC for beginners. If that's true then I'm an exceptional rider. But statistically there shouldn't be anything special about me, so I would say it's a great beginner EUC as it is a top of the line model. Which means it has plenty of power when you're trying something that you don't know that you shouldn't try as a beginner. It will NOT cut out suddenly! \nI would recommend this for beginners who have never ridden an EUC, but only IF they have the budget available.\nThis is day four of me riding the KS18S and I already have 45 miles on it and that almost entirely yesterday's distance. This has quickly become my favorite form of transportation. \nA special note about learning to ride though; if you want to learn quickly, then you will need to be in good shape. If you take it slowly then it doesn't require as much out of you physically. I use an Apple Watch to keep track of steps, movement, heart rate, etc. which I use to meet certain exercise goals. I blew all those goals out of the water while I was trying to learn it. Four times as many calories burned; three times as much movement; and twice the exercise were the results of learn this awesome machine.\n\nThe KingSong KS18S is an EUC that shouldn't be passed on if you've got the chance. I really love the distance, speed and power that comes with this alternate form of travel that has now become my favorite form of travel.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Bracy P.", + "reviewRate": 5 + }, + { + "content": "This is my 12th EUC in 3 years of riding. I had also previously owned the original incarnation, the KS18A, so you can tell, I'm a fan of this model wheel! (actually, the issues I had on my faulty one-off KS18A was how I befriended Jason of eWheels ^^)\nWhile I enjoy the cult status and rarity this wheel has, as most people prefer shorter, more prettier and blinky-LED kind of EUC wheels, don't let that fool you: this is a workhorse wheel in one of my favorite tall form factors. In all my EUC ownership of all major brands and various shapes and sizes, the KS18, in whatever version, will probably always be a fixture in my EUC rotation, and the only way to ensure A+ US support in such a wheel investment is to buy it from eWheels.com.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Chris Y", + "reviewRate": 5 + }, + { + "content": "This is my third EUC that I own and have to say that the King Song 18S is a sweet EUC!! I have right at 500 miles on this wheel and have enjoyed every single ride that I have taken. I and bigger. When I first received the wheel, I could not believe the size difference between the 14s and the 18s. At first it was intimidating wheel just off the sheer size but once I took my first ride, I was hooked and this became my favorite wheel. It is not as nimble as the 14s, but when you cruise, the 18s is so stable at higher speeds and takes road imperfections so much better you don't mind it not being as nimble. But with practice, you can ride with pedestrian traffic without any issues. I get so much attention with this wheel due to the unique shape and sheer speed of the EUC. I bought a motorcycle jacket, gloves, and helmet for added safety since I have to ride on the street since a lot of streets don't have sidewalks that are continuous. I haven't had any issues with either of my King Song EUC's. I trust them and stand by their safety reputation. I attend bike night at the local motorcycle shop bought a King Song 14s in December and wanted another wheel for cruising that was faster and get so much attention from the bikers. I put two 140 lumen red lights that can flash on the trolley handle so I can be seen in the day as well as at night. The speakers are awesome and sound really loud without distortion. The headlight is bright and the taillight is big and bright and lights when you brake. Once again, I am amazed at the quality of this EUC and look forward to riding this wheel for many days to come. I highly recommend this wheel if you want speed, reliability, comfort, and fun!!! Thank you Jason McNeil for the excellent recommendation on getting this EUC. Big shot to eWheels for super fast shipping and excellent customer service!! I will be buying all my EUC's from eWheels!!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Matthew Britton", + "reviewRate": 5 + }, + { + "content": "The KS18 is a great wheel. Its longer case takes a little getting use to, but is very stable and absorbs bumps in the road nicely. I purchased the biggest battery and I can say that this thing goes forever. At 6’3″, I’m still not getting the hang of the seated ride,but my children have no problem at all riding on the seat. For an 18 in. wheel, the pedal hardness is outstanding. It is very responsive at accelerating and breaking. It climbs hills very well. The automating headlights and break lights are a key feature. Speakers are a great feature as well. If you take longer rides, I highly recommend this wheel. Jason at ewheels is the best. I have no reason to shop anywhere else. I will be buying more wheels from him.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Matt Franklin", + "reviewRate": 5 + }, + { + "content": "I must say hats off to ewheels for their great customer service. wasn’t sure what to buy for my size and I must say the KS 18 is perfect. Oh my goodness words can’t explain how amazed I am with this thing. You see I’m 51 and it’s like John Carter welcome to the future and I’m in it and fit enough to ride this puppy. What a awesome device and I’m a proud owner of one bad kick butt KS 18", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "John Carter", + "reviewRate": 5 + }, + { + "content": "I’ve been into the whole personal mobility thing for a while. I’ve been riding electric skateboards for years but, the first time I saw an electric unicycle, oh man, I just got the concept right away. NOTHING compares to the level of freedom and the natural feel that unicycle will give you. Being annoyed with my skateboard’s limitation of only being able to run on smooth terrain, I was in the market for an off road electric skateboard, that’s when I discovered the electric unicycle. No skateboard will ever match the flexibility and the ability and the speed to traverse as much different terrain as my 18’’ wheeled King Song. After much looking around and shopping, I found eWheels to have the best selection/price on the internet. Additionally, I want to mention that dealing with eWheels has been a sheer pleasure. I’ll spare you the long story but, let me just say that the kind of honesty, integrity and honor this place operates under is not always demonstrated by on-line vendors. Jason and eWheels you’re the best!!! You have a lifelong customer in me!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Alex S", + "reviewRate": 5 + }, + { + "content": "I actually purchased a KS18 from Jason at Ewheels but he doesn’t have it listed here yet. I was lucky enough to be in Miami in early June and so I set up an appointment with Jason to test ride the wheel which was fantastic because it made me even more confident in the wheel and not to mention Ewheels as a distributor. I am very happy so far with the wheel and the customer service Jason provides is second to none I cannot recommend Ewheels enough!! We are lucky to have them here in the states to buy these amazing and fun EUC’s from!! Jarrett Bowers", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Jarrett Bowers", + "reviewRate": 5 + } + ], + "summary": { + "rating": 5, + "reviewsAmount": "13 Reviews" + } + }, + "url": "king-song-18s-840wh-1680wh-1500w-motor", + "name": "NEW: King Song 18S, 840Wh & 1500W Motor", + "category": "Advanced Electric Wheels" + }, + { + "shortDescription": [ + "Matte Black & Silver back in Stock", + "NEW: our 16S fitted with the XL pedals ($99 value), improved magnesium alloy handles & the lift-to-disengage sensor", + "KS16S. Even more power! 60% boost over the KS16B", + "Incorporates several under-the-hood up-rates making the eWheel more powerful, safer & enjoyable", + "Maximum cruising speed has been increased from 18.6MPH to 22MPH" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "38.5lbs", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon3.jpg" + }, + { + "heading": "Cruising Speed", + "data": "22 MPH", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon1.png" + }, + { + "heading": "Charge Time", + "data": "3hrs to 80%", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon4.png" + }, + { + "heading": "Max Load", + "data": "250 lb", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon2.png" + }, + { + "heading": "Battery Capacity", + "data": "840 Wh", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/Battery-Graph-1.png" + }, + { + "heading": "Range", + "data": "35-40 miles", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/Range-Graph-1.png" + } + ], + "images": [ + { + "main": [ + { + "src": "KS16-Center-Side.jpg", + "srcset": [ + "KS16-Center-Side-200x219.jpg 200w", + "KS16-Center-Side-273x300.jpg 273w", + "KS16-Center-Side-400x439.jpg 400w", + "KS16-Center-Side-456x500.jpg 456w", + "KS16-Center-Side.jpg 485w" + ] + }, + { + "src": "KS16-Center-Side.jpg", + "srcset": [ + "KS16-Center-Side-200x219.jpg 200w", + "KS16-Center-Side-273x300.jpg 273w", + "KS16-Center-Side-400x439.jpg 400w", + "KS16-Center-Side-456x500.jpg 456w", + "KS16-Center-Side.jpg 485w" + ] + }, + { + "src": "KS16-Top-Side.jpg", + "srcset": null + }, + { + "src": "KS16-Top-Side.jpg", + "srcset": null + }, + { + "src": "KS16-Side-Handle.jpg", + "srcset": null + }, + { + "src": "KS16-Side-Handle.jpg", + "srcset": null + }, + { + "src": "KS16-Top-Front.jpg", + "srcset": null + }, + { + "src": "KS16-Top-Front.jpg", + "srcset": null + }, + { + "src": "KS16-Top-Oblique.jpg", + "srcset": null + }, + { + "src": "KS16-Top-Oblique.jpg", + "srcset": null + } + ] + } + ], + "relatedProducts": [ + { + "name": "KS 16S: Replacement Control-Board", + "url": "ks-16s-replacement-control-board", + "price": 168 + }, + { + "name": "Tire: 16” x 2.125”, Kenda", + "url": "king-song-16-kenda-tire", + "price": 35 + }, + { + "name": "KS 16: Set of 2x LED Strips", + "url": "king-song-16-led-strip", + "price": 35 + }, + { + "name": "NEW: King Song 18S, 840Wh & 1500W Motor", + "url": "king-song-18s-840wh-1680wh-1500w-motor", + "price": 1745 + } + ], + "price": 1350, + "reviews": { + "list": [ + { + "content": "This is my second EUC. Had a ninebot one+ for about 10 months and fell in love with EUC's. Wanted an upgrade and this King Song 16s seemed like a great EUC to upgrade my hardware. I don't wear any protective gear so I'm not looking to break the 20MPH mark and with the battery life exceeding 30 miles I couldn't go wrong with this. \n\nFeatures I love: \nSpeed (Max 22MPH)\nCharing Time (about 3 hours) \nColor (Love the matt black)\nBluetooth Speak (Works great)\nLights (Headlights and Reverse Lights on both ends)\n\nCons: \nSide Padding (My calves were really sore the first few days riding this. I did ride for about 30 miles the first two days so maybe there is a break in period, but my legs were sore for a few days. Think they could of made them a bit softer. I will modify it myself, but would be nice to come stock)\n\nHighly recommend this EUC to anyone looking to keep speed in check but still have a good time.", + "reviewMeta": [ + "Posted 2 weeks ago", + "05.11.2020" + ], + "reviewAuthor": "Blake Stevenson", + "reviewRate": 5 + }, + { + "content": "Very good device, rides up hills and on rough terrain well, takes a few weeks to learn to ride on, but otherwise a great intermediate wheel.", + "reviewMeta": [ + "Posted 3 weeks ago", + "31.10.2020" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "Got this wheel as an upgrade to my Mten3 which was being repaired. I wasn't ready to dive into the super-fast wheels yet and wanted to get attuned to a slightly heavier wheel. This thing hasn't let me down so far and I'm really really enjoying the increased range and speed! Build quality is fantastic and I expect a long and enjoyable ownership!", + "reviewMeta": [ + "Posted 1 month ago", + "23.10.2020" + ], + "reviewAuthor": "Kurt Dresner", + "reviewRate": 5 + }, + { + "content": "This is a follow-up review from a rider in Seattle. After four 2 hour sessions, I was confident to put the wheel anywhere my mind wanted it to go. Once your muscle memory gets locked in, it is no longer a wheel you control, it is a magic carpet responding to your very thoughts. I agree on the durability factor. Those first sessions and a healthy dose of fear saw me leaping off of the machine as I watched it clatter and scrape to a stop. It survived all of my temporary abandonments and actually still looks pretty decent (all black is a good color to hide the scrapes). Several months later and after many accumulated miles, I can dance to the music from my phone spinning and swaying with the beat, maneuver the wheel in very tight spaces and feel the thrill of flying at top speed. I have taken recently to hopping off curbs and catching some air going over speed bumps. I have never gotten close to running the battery down as it goes for hours. One more detail, I am almost 63 years old. I bought this to challenge myself and it has become second nature to cruise in the neighborhood and up to the local school yard to further hone my riding skills on smooth tarmac and lumpy soccer fields. A very cool thing to own and master. While I have not fallen seriously over these last several months (only went down once at very low speed during session 3-scraped palm of a wrist guard and a bruise on the hip), I am not keen on riding without a good set of knee, elbow, & wrist guards and my bike helmet. No point inviting disaster by riding free for the little money it takes to get a good and comfy set of protective pads. If you are in reasonably good shape, you can do this activity and it is really like no other. The 16S is an impressive and elegant piece of technology.", + "reviewMeta": [ + "Posted 1 month ago", + "09.10.2020" + ], + "reviewAuthor": "David Stevens", + "reviewRate": 5 + }, + { + "content": "Review is for King Song 16x. Received wheel in extremely short time frame, 5 days post order even though listed as Backordered. Tracking info and shipment through Fedex. Too soon to give a good review of wheel. \n5 stars service is for the staff and company support. Fast fulfillment and even though I placed a second order for a wheel cover RollNZ Ewheels amended this order for Free shipping. Didn’t even have to ask, no Coupon code, just great service! As this is my first wheel was worried about the usual. Can I learn to balance. Are there hidden cost? The free wrist guards are perfect helping new and old to just enjoy the ride. Ewheels.com is an amazing company. Anybody should trust them in providing not only a quality product but more importantly great service. \nThank you Jason McNeil and all the staff at Ewheels", + "reviewMeta": [ + "Posted 1 month ago", + "07.10.2020" + ], + "reviewAuthor": "Konrad Goetz", + "reviewRate": 5 + }, + { + "content": "This is my first wheel I have ridden and I bought it to practice on with the intention to upgrade and sell this wheel when the other one comes in. I've loved riding it so much that I actually plan on keeping it so I can teach friends, riding buddies and continue riding. Setup was easy especially with the including instructions Ewheels emails you.\n \n The only complaint I have are bluetooth range is pretty bad with the included speakers but otherwise I have absolutely loved learning on and riding this wheel. Within two and a half hours I was able to ride, mount, dismount and turn without any assistance. I would highly recommend it", + "reviewMeta": [ + "Posted 1 month ago", + "06.10.2020" + ], + "reviewAuthor": "Shawn Pearce", + "reviewRate": 5 + }, + { + "content": "The KS16S is an awesome wheel with nice features and good workmanship. Thank you for including the wrist guards!", + "reviewMeta": [ + "Posted 2 months ago", + "24.09.2020" + ], + "reviewAuthor": "Victor Ybiernas", + "reviewRate": 5 + }, + { + "content": "Amazing wheel at such an awesome price point! I get so many compliments on how great it is and how little it costed for what it can do.", + "reviewMeta": [ + "Posted 2 months ago", + "26.08.2020" + ], + "reviewAuthor": "Derek Wheeler", + "reviewRate": 5 + }, + { + "content": "Phenomenal piece of equipment with impressively intuitive stabilizing mechanisms and a solid Bluetooth speaker built-in.", + "reviewMeta": [ + "Posted 3 months ago", + "18.08.2020" + ], + "reviewAuthor": "Louis LaMonte", + "reviewRate": 5 + }, + { + "content": "It took some time to train on it, since this is my first EUC. I watched a lot of Jimmy Chang, U-Stride, Duf , isthereanyfood and I learned a lot about what I was getting into. Now im comfortable riding it finally after 6-8 days with about 10 hours of training. I documented my journey learning on it and I think Jason and the entire eWheels company is doing a fantastic job providing excellent old school customer service that is honest and reliable. The wheel is nimble, its speed is enough for my needs at the moment and it handles a lot of different type of terrain very well. I suggest Hard mode once you get comfortable on the device, the wheel feels more easier to ride. I will def be picking a new wheel in the future from these guys. Consider watching my video about the Kingsong 16s https://www.youtube.com/watch?v=W5F0E5DUR78", + "reviewMeta": [ + "Posted 3 months ago", + "29.07.2020" + ], + "reviewAuthor": "JAMIE V WILSON", + "reviewRate": 5 + }, + { + "content": "My first wheel so I don't have much to compare to. It's plenty fast enough and it I've yet to run out of battery before tiring out myself.", + "reviewMeta": [ + "Posted 4 months ago", + "21.07.2020" + ], + "reviewAuthor": "Kenny Cheung", + "reviewRate": 5 + }, + { + "content": "I have nothing to compare it to as this is my first wheel. It was very easy to learn. After watching a lot of videos I thought I was in for a long term learning cycle. I was actually riding it without falling after about 30 minutes, was able to do turns and mount without holding a wall after about an hour. The blue tooth range is HORRIBLE, although I realize that most people will have their phone in their pocket or person while riding, so not an issue, I left mine on table nearby as I didn't want to fall and crush my phone. Disconnected music after just a few feet. Is very sturdy, can't count the number of times dropped, scrapped, went flying across the driveway, but still keeps on ticking. Can't wait to get a few more miles on it.", + "reviewMeta": [ + "Posted 5 months ago", + "22.06.2020" + ], + "reviewAuthor": "Barry Gamage", + "reviewRate": 5 + }, + { + "content": "Just got this wheel as an upgrade from my InMotion V5F and I am absolutely in love with it. It rides smoothly and comfortably over long distances while still maintaining an aggressive edge when you ask for it. The matte black finish is super stylish and I love that I can play music while riding (I do wish the speakers were a bit louder for noisy environments but its hardly a complaint). Its much heavier than my previous wheel but the luggage handle makes that a non-issue in most situations. I also love having the direct customer support from e-wheels as getting questions answered has been super easy (something I don't take for granted in this niche market).", + "reviewMeta": [ + "Posted 5 months ago", + "27.05.2020" + ], + "reviewAuthor": "Tyler B", + "reviewRate": 5 + }, + { + "content": "Fantastic wheel for beginners. The wheel is very nimble with many safety features. I have 300 miles on mine and have never had any issues. The blue tooth speakers and lights are the icing on the cake. The only downside is the speed limiter but that goes away as you learn to ride (150km or less depending on firmware). Pick up some shin guards you are going to need them. eWheels is a great company and their customer service is amazing. Ask for Jason he is fantastic!", + "reviewMeta": [ + "Posted 6 months ago", + "20.05.2020" + ], + "reviewAuthor": "Mike C", + "reviewRate": 5 + }, + { + "content": "Great upgrade, awesome suspension, very smooth machine. Love the features and equipment already, after just 2 days!", + "reviewMeta": [ + "Posted 7 months ago", + "21.04.2020" + ], + "reviewAuthor": "Brett Landis", + "reviewRate": 5 + }, + { + "content": "Total noobie here, went with the KS 16S and have not been disappointed. I got the hang of it quick once I put it in soft mode and nk realized I needed to stand up straight, relax(very important), and understand that my body is like a pendulum at my ankles. Now I just need to learn free mounting. Overall, KS 16S is an awesome wheel for a beginner and it’s built much better than it looks in pictures! The only negative is pedal tilt back at max speed which has already got me saving for a Nikola Plus as I can tell I’m gonna like a little more speed for commuting. But what an amazing personal mobility device!!", + "reviewMeta": [ + "Posted 9 months ago", + "23.02.2020" + ], + "reviewAuthor": "Stephen Vukman", + "reviewRate": 5 + }, + { + "content": "I think this is a great starter wheel for the ambitious rider just getting into the EUC space. It's the perfect commuter for my generally tame-weathered California town. Wear a helmet and wrist pads!\n\nTHE BAD\n- foot pads require a lot of force to fold up or down so keep your nails trimmed\n- i honestly feel like I want to go faster but this isn't anyone's fault but my own\n- the red reversing lights are a little dim\n- all the apps feel a little half-baked ESPECIALLY KINGSONG's native one jesus\n\nTHE GOOD:\n- easily rides the streets in my town\n- easy to learn\n- big forgiving pads (mine came without the giant cheesy KingSong logo", + "reviewMeta": [ + "Posted 9 months ago", + "01.02.2020" + ], + "reviewAuthor": "Patrick Vidican", + "reviewRate": 4 + }, + { + "content": "My first euc but it's been a pleasure. It's taken me about a week to get the hang of riding it, but the wheel is very smooth, quite and responsive. The range is amazing, and I love the lights on the wheel. It seems to do everything I hoped for and I really look forward to riding more and gaining more confidence.", + "reviewMeta": [ + "Posted 10 months ago", + "18.01.2020" + ], + "reviewAuthor": "Andrew Carlson", + "reviewRate": 5 + }, + { + "content": "Extremely happy with the fit and finish of the 16s. Take Jasons advice on which app to use, makes life simpler. \nI am brand new at this sport so I can’t judge performance yet. I don't believe I will need to upgrade anytime soon. \nLike a lot of reviews have said about the pads they are very hard on the shins. Might want to add some padding to them while learning. \nI would definitely buy this wheel again.", + "reviewMeta": [ + "Posted 10 months ago", + "13.01.2020" + ], + "reviewAuthor": "Richard Gauthier", + "reviewRate": 5 + }, + { + "content": "For what I know so far as a beginner, it is an elegant and beautiful machine. I am looking forward to putting it through its paces!", + "reviewMeta": [ + "Posted 10 months ago", + "09.01.2020" + ], + "reviewAuthor": "David Stevens", + "reviewRate": 5 + }, + { + "content": "Too early to tell the overall performance after riding for just a couple of weeks but so far so good. Amazing battery range compared to my inmotion V8. Speed is sufficient at 22mph. A little heavier compared to my previous ride (V8). Looks tougher on black matte with black side pads and black pedals. Only cons to me is how thick and hard the side pads are. I wished it's softer and half thinner. I'm not planning to squeeze it so I can jump anyway. Also, there's a whining sound when I'm riding on quiet trails, it's a little annoying. But as I said, so far so good.", + "reviewMeta": [ + "Posted 10 months ago", + "06.01.2020" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "", + "reviewMeta": [ + "Posted 11 months ago", + "09.12.2019" + ], + "reviewAuthor": "Eli McEwen", + "reviewRate": 5 + }, + { + "content": "Well I've never ridden any such thing, I'm an older guy and this unit , even though theres a learning curve, I was able to get on and ride with ease. The absolute worst owners Manual ever. It's a bit frustrating, however the euc community will help with everything including great YouTube vids, the unlock codes should just come with the unit, and I say add a few bucks and include a stand, so far the unit is beyond my expectations, power ,stability, ease, quality, fit and finish, beutiful light design, this is a very well built unit and its quality I was not expecting a Porsche, a Hummer, and a Lexus, all in 1, very nice and I'm saving for another 16s model , it's not to heavy, not to big, not too small, you hit a homerun with this unit.im totally satisfied in all category's", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Anne French", + "reviewRate": 5 + }, + { + "content": "Just eclipsed the 500 mile mark on my 16s! Best purchase of the year. 21 mph is plenty fast for most scenarios. More range would be better, because I find myself going further when I'm exploring! This is not a toy... it's serious alternative transportation. Should I get the 16x next, or MSX?", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Greg", + "reviewRate": 5 + }, + { + "content": "I love this thing. Tough to learn, fun to ride. I love how it flattens out my very hilly city - no more sweating at work after bike commuting. Jason has taken great care of me, quick on email responses and on shipping out new parts (I replaced the original pedals and handle).", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Sam G.", + "reviewRate": 5 + }, + { + "content": "Very happy with my kingsong 16s Jason provided great customer service, it’s only been a week and I’ve really banged it up but it still works good as new, very happy, also very fast shipping", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Jacob Grant", + "reviewRate": 5 + }, + { + "content": "Awesome wheel. Super agile and maneuverable! Using it for ~8.5 mile (each way) commutes has been a blast. Acceleration is great, I often beat cars off the line up until around 15mph! Surprising amount of power up the ridiculous hills where I live too. Can take me up while cruising 18mph no problem. Also, King Song trolley handles are the bees knees. The only thing I don't totally dig is the side pads. I don't like how far they stick out - if the pedals were just set slightly wider, that would be nice. The contact point is also a little low - a taller wheel distributes the load along your leg better, which is more comfortable for mounting/dismounting or one-legged riding. These are relatively minor quibbles. This is a great wheel to have around. Due to where I frequently ride, I've found myself more comfortable on a wheel capable of ~25mph+ so that I can ride in traffic when necessary. Cyclists here are just super unpredictable, and passing them can be pretty dangerous. That said, I do wear CE rated knee and elbow impact protection, wrist guards, and a full face helmet. I still like having this for fun little rides - it's just so zippy!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Vincent P.", + "reviewRate": 5 + }, + { + "content": "", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Toshitaka Tanaka", + "reviewRate": 5 + }, + { + "content": "One week in with 16s. So far quality and performance are better than expected. Love riding it...", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "Rides beautifully. Great balance of power, sportiness, and lower center of gravity for safety on bumpy roads.\n\nPaint on pedals was scratched up within the first day of riding, and pads on the body are a little uncomfortably rigid, but manageable.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Daniel Repsch", + "reviewRate": 5 + }, + { + "content": "I am impressed with my King Song 16S! It's perfect for me. I'm 59, and have been riding an IPS for 3 years. The IPS is a 14\", 800 watt, top speed of 16mph. The King Song is so much better! 23 mph top speed is perfect! Pedal clearance is great, tight turns, fast turns with no worries. Battery last and lasts! The 38 lbs. is easier to carry than the 45 lb. EUCs. I occasionally spin fire poi while riding, so the stability makes it a much smoother performance! Thank you Jason at Ewheels, and thank you King Song!!!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Don Woerner", + "reviewRate": 5 + }, + { + "content": "Originally wanted a ks 14s for my first wheel but decided soon after ordering that more power and range might be a good idea. Jason helped me upgrade to the Kingsong 16S and received it a couple days later. After a short time of aches and pains learning to ride I feel like I can now ride with confidence anywhere! Just finished a 21 mile ride along the coast and I still have 60 percent battery left. I'm so comfortable now I've been getting the tilt back which is set at its max setting already! This Kingsong 16S is an absolute blast and I'm definitely hooked on this euc thing!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Mike Jutba", + "reviewRate": 5 + }, + { + "content": "... Jason was right ! I was thinking I would get the 18xl, but now that I'm up to speed on my 16s, I really can't see wanting to go much faster than 20mph. My daughter and I spent most of Father's Day getting up to speed on the wheel. My daughter was frustrated because I was able to go further and turn quicker than she could. She didn't think she would get it but after about 2 hours of switching off, we both were cruising around having a ball! I tried the intermediate and expert modes and decided to stick with the beginner mode, but removed the speed limiter. There is a lot of room to grow with this wheel! The only negative I can think of is the weight of these euc's. But it's well worth it for the smiles for miles your will enjoy! I plan on commuting with this as soon as I feel more proficient. The Black Matte finish has been holding up to the drops it's endured with no extra padding for protection. I am so glad I went through with the purchase... Thanks Ewheels!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Greg", + "reviewRate": 5 + }, + { + "content": "Great service, communication from Jason. He really understands the concept of customer service! Learning to ride the wheel inside at the moment. Getting on and getting off. going forward and backward while holding on. Controlling the wheel with one leg... I will go outside with it tomorrow and start going point A to point B... Stay tuned!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Greg", + "reviewRate": 5 + }, + { + "content": "This EUC is great!!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "KS 16S is a great wheel. Upgraded from a $600 wheel I purchased 5 years ago (Airwheel X8). Night and day. I don't really feel the need for the high end speed (I commute to/from public transit and only have a mile on each end to ride) but the higher torque motor and the additional range are amazing. The higher torque holds the pedals rock solid -- gives a very strong sense that the wheel isn't going to let you fall. The additional range is just nice to have, knowing I can tool around at lunch and not have to worry about range. \n\nMy only reason for going 4 stars not 5 is the app. SO SKETCHY. Not in google's playstore. The app asks for so many permissions on the phone. Does it really have to have all that access just to unlock the wheel and set a few parameters. No way to run the app without completely dropping all pretext of security on your phone. Probably there is nothing untoward going on... but if someone WERE planning to sneak some darkweb nasty shxt onto my phone, it would look a lot like installing the Kingsong App.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Joseph Johnson", + "reviewRate": 4 + }, + { + "content": "Birthday gift from my wife. This is the perfect wheel for my needs. Forty pounds is light enough to carry but sturdy enough to support me. I am 6'2\" and 240+ pounds. It feels like it has power to spare. Currently I have been buzzing around my neighborhood and using it grab the mail a couple blocks down the road. Spent a lot time researching different wheels and this kept coming up at the top of my list. The XL pedals and other modifications from eWheels truly make this a best in class EUC.\n\nPhoto includes a bandana for scale.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Yuri Newton", + "reviewRate": 5 + }, + { + "content": "Upgraded from a Ninebot E+ about a year ago. I had ~1,200 miles on the E+ when the 16S arrived. Really nice upgrade. Faster, more stable, much improved range, higher pedals so less scraping on turns. I have ~1,800 miles on the KS 16s now and still having a blast. The biggest advantage is the ability to stop quickly. Several times the E+ dumped me on my behind when performing an emergency stop.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Paul Hinker", + "reviewRate": 5 + }, + { + "content": "Awesome wheel! Upgraded from a Segway S1 (14\" wheel). First day I was a little concerned over the reduced turning agility, but after a day of riding I couldn't look back. It's awesome, snappy, feels extremely solid, and a noticeably smoother ride, I love it!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Steed Austin", + "reviewRate": 5 + }, + { + "content": "Since this was my first unicycle purchase I knew that learning to ride would be a significant challenge. I wanted an EUC that would challenge me and I would be satisfied with it for a long time. The KS 16S is very durable and a handles rough surfaces. The street and sidewalk surfaces are very rough, broken or cracked. I found that the KS 16S seems to handle it very well. I would definitely recommend this EUC to any level of rider. I have been riding for about one month. I try to ride every day when the weather is good. I've even driven it to work which is about 3.5 miles one way.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Kevin Boyer", + "reviewRate": 5 + }, + { + "content": "", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Brett Larsen", + "reviewRate": 5 + }, + { + "content": "This is the perfect wheel for someone just getting started. I spent two weeks on a Ninebot One E+ and quickly realized I needed a more capable wheel. Knowing what I know now, this would have been my first wheel, it may have taken a few bumps during the first few hours, but this wheel is very high quality and built well. As mentioned throughout these reviews, the wheel looks beautiful and you can feel the high level of quality, I have nothing bad to say about the wheel. Customer service is great at eWheels. I had a chance to talk to Jason and he is passionate about his products, I have no worries that he'll be there if I need anything in the future. If you are looking to buy an EUC eWheels is the place to go! They don't just sell products, they are experts that care about the customer. Great doing business with eWheels!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Cuba Gonzalez", + "reviewRate": 5 + }, + { + "content": "Worth every penny. I’ve put about 500 miles on my 16S since December. The ride is so smooth", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Philip Iwinski", + "reviewRate": 5 + }, + { + "content": "Great reliable EUC. Simple compact design and nondescript matte black make for a great little errand runner. Can turn lights completely off even when stationary. Light enough to carry by hand through a store. Comes with original small silver pedals, but I put the new large black pedals on. Even the new trolley handle is black. 1200watt motor has enough torque to carry me plus groceries (180lbs) in the street at 15mph and still perform abrupt stops confidently. I hate the high pitch whine of King Song motors though.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Michael Hernandez", + "reviewRate": 5 + }, + { + "content": "Only owned it a day but this machine is a beauty. It handles wonderfully and is a pleasure to ride. Range is fantastic. I am impressed with this wheel.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Jorge Batista", + "reviewRate": 5 + }, + { + "content": "I am new to EUC's and after a lot of research decided on this one because it seemed like a good all around wheel. I didn't want to upgrade in a few months if I bought a lesser model. Out of the box worked great once I finally got it unlocked, but that only took about 10 minutes for my no tech brain to and wheels to figure out.\nI don't skateboard, Rollerblade or anything like that but this has been fairly easy to learn. After about a total of an hour over 2 days I am cruising the parking lot. \nThis thing quiet and smooth. For my first wheel so far I am extremely happy with this thing. It definitely puts a smile on your face!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Toni Coplen", + "reviewRate": 5 + }, + { + "content": "Hi.\nI have had this KS16s for several months now which I purchased from Ewheels and I absolutely love it. I try and ride at least twice a week or more when time permits. Recently, on a trip to Canada, I decided I wanted to bring my euc along. It was difficult finding a bag that it fit into so I could bring it along on the bus. I prepared to go for my first ride in Canada. I left my hotel room and went to pick up the euc to go down the stairs when the handle broke off. Before I had a chance to react, the euc went tumbling down the stairs. The euc was still operational but the handle was left in my hand. I realized just how handy and convinient the handle is. Therefore, I will have to order a new handle when I get back to the States. I will also be ordering the larger pedals. \nConcerning the app, its terribly frustrating to use. Though I have gotten use to it. One problem I'm having is the Km left to go. It keeps going back to 74km when I turn the unit on. I currently have close to 400 miles. I have been keeping track on \"Map my Ride.\" Overall I love this Ks16s and look forward to upgrading to the 18XL for the longer riding distance.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Byron", + "reviewRate": 4 + }, + { + "content": "I recently upgraded to the 16S and i gotta tell you...its a big step up from the 14D.\nThis wheel is a lot of fun if use properly.\nEven though im still a newbie because I've only been riding for 3 months on average of once a week,i feel like i have total control of this wheel,it wobbles a little bit when reaching 20 mph that's when its time to slow down,the more i ride it the more fun i have every time,i will advice new riders and all riders to always wear helmet, knee pads,elbowpads,and wrist guard you feel protected, you feel confident not afraid of falling and if you fall... wich is likely to happen \"I'd fallen twice \"not a single scratch and haven't been discourage to continue riding. \n\nOver all this is a fun wheel to ride not to small not to big for me ,im 5' 8\" 160 lbs. This wheel feels powerful because it is powerful, i think its the perfect size wheel for someone my size. \nI highly recomend the KS16S.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Luis", + "reviewRate": 5 + }, + { + "content": "A couple of caveats: first, I've only had the KS16S for a few days now and just out on a couple of rides, I think I've got 13 km on it thus far. And the other is just that I give this machine 5 stars not to suggest that it's perfect --- no Electric Unicycle that I'm aware of is at risk of achieving perfection --- but because I think this might well be the best of the bunch. I have two other EUCs, both of which have a max speed of about 18 kph (12 mph or so). For both of these, I get really tired of hearing beeping or vocal admonishment or pedal tilt-back telling me that I'm going too fast. With the KS16S, once I was able to unlock the top speed, it's just a joy to ride as fast as I want to, as the top speed of 35 kph is definitely faster than I personally want to go on any of these devices.\n\nSo downsides: first the software is clumsy. eWheels does a good job, I really appreciate the email that they sent with getting started information and details to help mitigate how confusing the software situation. I ultimately installed the suggested older version of the Android software on my phone to speed unlock the machine, then WheelLog (now WheelInfo) app for more common use. But expect to require some patience and at least a little frustration en route.\n\nSecond, I hear a high pitched sound from this machine when it's turned on, even when it's at rest, and it's louder when it's being used. This isn't a deal killer for me, but it's unfortunately. I presume that I'll get used to it. It makes more typical EUC motor noise as well, no problem at all there, it's a pretty modest sound really. But my other EUCs don't make this kind of high pitched sound. Reading online I see that others report the same thing, so I don't think this is unique to my unit.\n\nThe machine arrived very well packed from the factory, and whiles software and documentation seem to be an after-thought, the hardware is great. Okay, one other thing that probably just reflects my ignorance --- from my other lower speed and lower power units, I had this fantasy that with the KS16S it would just easily power up any hills I want to go up with zero deceleration or struggle. It certainly does better at this than the other units, but I find that if I approach a fairly steep hill with little speed/momentum, I cannot accelerate up the hill to anywhere near the top speed of the unit, and I'm not a particularly heavy guy (or at least not heavy by U.S. standards? :-)) --- I weigh perhaps 165 pounds (75 kilos).\n\nIn my initial testing, I found that the unit handles reasonably packed gravel just fine. Riding on compacted bark was a little more tedious, but do-able. I like the no-nonsense approach of how it just turns on without any fuss or drama, ditto turning it off, and the recharging port is very easy to access (unlike the one on my IPS i5 which takes a bit more fiddling). I had thought that I wouldn't be interested in the flashing side lights, but they are kind of cool --- for now at least, I'm keeping them on! In my initial 13 km of riding the battery power (displayed using lights) hasn't budged, and I really like the idea that for any reasonable distance that I ever might want to ride, I'll have plenty of excess battery capacity (range) to get me there. And of course, I very much like the reported safety and quality of King Song unicycles, though I have nothing personal I can contribute to either of those factors, at least at this point.\n\nBottom line is that I'm pleased with this and look forward to riding a lot more to get more comfortable with this particular unit and its capabilities and 'feel'.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Brian", + "reviewRate": 5 + }, + { + "content": "I am a customer from Calgary Alberta Canada, I ordered a silver KS16S when the units were all on back-order. Jason and his team have amazing customer service, email updates every step of the way, Realistic and accurate expectations for ETA. A very detailed and helpful email startup guide was also sent prior to receiving the wheel. \n\nThe wheel shipped on the 8th, I got the wheel May 10th 2018, Everyday ive been riding this, and each time i try and double the riding distance. On May 13th I put on 80km in one day (short recharge in the middle of the day). Learning wasn't nearly as hard as i though it would be. My recommendation is finding a flat open field of grass (soccer field), that way if you fall off, the wheel doesn't get damaged, its also good for learning the limits of how far you can lean and how sharp you can turn. Learning to ride on grass is harder, but when you transition to pavement its a piece of cake. I also recommend learning low speed precision control before going out where there is lots of people. \n\nI did a ridiculous amount of research before i chose the KingSong, i am very glad i picked this one, even after riding it and watching more youtube videos, i still think this is the best wheel for the money. I only wish it had a power cut button under the handle for going up stairs but i just turn off the power all together, no big deal. The range and power on this wheel is just perfect, i cant think of changing it to anything else that would be a noticeable improvement. The kingsong app is horrendous but it really does not affect the wheel since your normal running app can be darknessbot or wheellog.\n\neWheels is Top Tier in my opinion, if you are on fence buying from this shop, just do it, you will not regret it.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Emmanuel", + "reviewRate": 5 + }, + { + "content": "I am a regular rider of the OW+ and the Boosted Board V2+ electric skateboard, but for some reason, I thought that the EUC was difficult to ride. After speaking with Jerry over the phone, I decided to purchased a Kingsong 16s with his recommendation. It took some time to recieve the wheel, which was not in stock at the time. Eventually, it did arrive and I have to say without dispute that the purchase is well worth the $1299. It is sleek and remarkable. I love it and though I have not yet mastered it to ride backward, I was able to ride it with confidence after a few hours of practice. The guys at ewheels.com are professionals and pay attention to ensure customer service. Thank you for your advice and help. I definately will purchase my next EUC from ewheels.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Shane", + "reviewRate": 5 + }, + { + "content": "Hi from Moscow Russia! ;)\nLet's make it straight: at this moment (February 2018) Kingsong 16s is absolutely the best all around EUC on the market. The main features of an EUC which affect its safety are the power (power equals stability for a EUC) and reliability. 16s is the top at both of them (the failure rate of 16s is less than 1% since the beginning of sales in spring 2017). \n18s is also a very nice and even more powerful device, but it's much larger and higher and not comfortable for some riders and some applications.\n16s may soon be challenged by the new Kingsong model 18L, but for now there's really no competition. No other manufacturer even gets any close. \nI've made more than 2500 miles on a 16s since July and still absolutely happy with the thing, not a slightest hiccup so far. \nAnd for those who never used an EUC. This is NOT a toy like hoverboards and even segways, this is a fantastic personal urban transport, the best one invented so far. \nPS: Do NOT buy older Kingsong models (\"A, B, C\" models). They are total crap. Buy ONLY \"S\" and \"L\" models.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "tim716", + "reviewRate": 5 + }, + { + "content": "I bought that wheel only because I have seen some Youtube videos and read some positive reviews about it at the time of purchase I haven't known much about EUC's. I called Jason just to make sure I'm making the right decision and he assured me I will love it. Boy, was he right!! Now being much more educated, I'm really happy I did bought this one too... as of today I own 4 different unicycles and I have something to compare it to. KingSong 16S is definitely my number one choice, in fact other 3 will probably be sold and I'm planning on buying another KingSong. This wheel is solid and refined, it is fast, powerful, thus making it safe, having enough power to \"get You out of a hole\" without power cutouts I feel much safer on it than any other wheel I have ridden. If You are first time buyer You will NOT be disappointed!\nThis thing is such a joy, I'm definitely hooked on EUC's!!!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Sebastian", + "reviewRate": 5 + }, + { + "content": "This is a superb wheel. It exceeds my speed, distance and over trail agility requirements within a reasonable weight. Unlike most users, weight matters to me as I move the KS-16 from sailboat, to bobbing dinghy to shore and back. I've discovered EUCs as an ideal means of port running when coastal cruising. The distance the KS-16 can go is the most significant feature to me, and even sub-zero cold I've found its climbing power and range impressive.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Art", + "reviewRate": 5 + }, + { + "content": "This is such a joy ride. Plenty of range for daily commuting, for the last few months now, and can handle hills pretty well, both steepness and moderately long climbs. I like that I can carry it using the handle without the wheel being turned on. Very straightforward operation and the pedals are great. But you have to be careful to keep the charging port rubber cap closed and it comes off easily if touched. Have not had problems though. I am hoping servicing / fixing flats is not too difficult. It's possible to do tight turns, but the pedal clearance is not as high as that on V8. Not that it matters much, it has not hindered after I adjusted my technique and the pedals really are awesome. So far, highly recommend and hope to have a great year ahead.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "Very good unicycle. long range, lots of power, smooth ride. The only downside is that it's hard to change break it apart to change tire.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Long", + "reviewRate": 5 + }, + { + "content": "Just what I needed\nI came across these EUC things on YouTube about a year ago and couldn’t get them out of my mind. Finally bought one in Nov. 2017; KingSong 16s. Definitely nervous about such a\nlarge $ purchase on something that might prove to be nothing more than a novelty (or a complete disaster). I went for it anyway. I needed something to get me out of the house, that didn’t’ require me to go someplace else to use it, give me a sense of of adventure, exhilaration and dare I say put a smile on my face. The KingSong 16s has exceeded my expectations. I’ve also enjoyed the learning curve – a sense of genuine accomplishment in the real world where tactile and physical forces are the name of the game. There’s nothing like spending the 1st several hours doing nothing but crashing every few feet to wobbling along for a few yards, then finally being able to cautiously make it down the street. I’ve since logged over 100 miles and now I’m feeling like a super hero flying around town, up and down hills, on and off of sidewalks, and taking sharper and sharper turns with ease and precision. Recently I joked with Jason at eWheels that they should consider starting an EUC Anonymous group to begin addressing the addictiveness of these machines. Seriously, riding around and improving my skills is all I want to do anymore. So, about the KingSong 16s; fast, has great acceleration, nimble, durable, cool features, and has an overall sense of quality about it. The 16s is not a toy, it’s a serious machine for folks that are interested in getting out of the norm and experiencing the cutting edge of fun! Customer service has been excellent via Jason at eWheels. I will be buying my next EUC from eWheels – no doubt.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Jason Waller", + "reviewRate": 5 + }, + { + "content": "What a beastly wheel. Youtube videos don’t really convey the size and especially the weight of these wheels. I was leaning towards the Gotway Tesla but am glad I went with this. I haven’t even come close to full speed on this thing and don’t really have a desire to go too much faster. It is a beefy, well built wheel. No buyer’s remorse yet, Only downside is bruised calves but that is a right of passage of euc newbies. Also laid the wheel down and scratched it within the first hour but that comes with the territory. The ordering process was quick and painless. I ordered late in the evening on Monday and was riding around on it by Wednesday. Packaging was good and it came with a couple freebees (bumper pads and wrist guards, much appreciated). Buy some 3M double sided tape though since the included tape with the bumpers isn’t very good. Would purchase from Jason again.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Jae Kim", + "reviewRate": 5 + }, + { + "content": "I purchased my first EUC in September this year from Jason at eWheels. The purchase experience could not have been better, the Wheel arrived promptly as ordered in perfect condition, and Jason sent some very helpful emails with all the information that I needed to get up and running right away.\nI spent a few hours over the course of three days in a large parking garage where I could lean against the walls and pillars to get my confidence up on the Wheel and was cruising around the parking garage unassisted (although a little shaky) on the third day, probably put in about four to five hours of work over the course of the three days to feel fairly confident in cruising around the parking garage.\nI have had the wheel a little over three weeks now and have logged about 160 miles on mostly wide bike paths and neighborhood roads. I could not be happier with my purchase experience and the King Song 16S model – – it has the power to handle my 6’2″ 225# frame with no problem. I have ridden up a two mile 6 – 7% grade hill near my home and the wheel has no problem lugging me right up to the top. I am also amazed how much battery regeneration occurs with this wheel when I go down long hills. I recouped close to 20% battery charge riding the wheel down a two mile hill, very impressive.\nI am having enough fun that I am starting to look at a second wheel option and when I figure out what I want for my second Wheel I will be purchasing it from Jason and eWheels for sure!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "John Patterson", + "reviewRate": 5 + }, + { + "content": "After owning an Inmotion V8, Gotway ACM, Msuper v3, and KS14c, I decided to purchase the KS16s and KS18s. After hearing about some Gotway quality/safety issues, I went with Kingsong. My children ride my wheels and needed something that I felt was safer.\n\nI really love this wheel! Nice torque and plenty of power and speed for my needs. I love the round shape and well thought out trolley handle. I'm 6'3\" and the trolley works well and is at a good height. The 16\" wheel is my favorite sized wheel and the 16s didn't let me down. I have size 12 shoe and the foot plates are a good size. All around great wheel! Well worth it. Jason at ewheels is the greatest. I will be buying more wheels from him.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Matt Franklin", + "reviewRate": 5 + }, + { + "content": "I ordered black KingSong 840Wh/800W as an upgrade to my Ninebot E+ from eWheels.com. The order shipped the same day and I received it 2 days later since I live in California and the wheel shipped from Los Angeles. Couldn’t be happier with the speed of order processing and shipment ! After you order, you get an informational message about the particular model you ordered with useful information to get you ready. This is really a nice touch and is sent in addition to the order receipt. When I received the order, the wheel was in perfect condition and actually looked better in real life than in pictures. I’ve had a chance to ride it a few times now and I say it’s really good upgrade path for Ninebot E+ owner, especially with regards to the range which from my initial experience looks to be about 3 times the range. I will be writing a more thorough comparison later that I will post to the forum.electricunicycle.org with the pros and cons of this model. This is a great site to buy EUC with complete confidence that you will get the service and support when you need it (and you will). eWheels answered all my questions pre and post purchase and he is very reputable among the EUC community. I’m 100% satisfied with the purchase that I have no trouble recommending this site to people I meet who are also looking to buy electric unicycle. Do not buy from random sources on the Internet where you won’t get warranty or support. eWheels will definitely have my repeat business in the future when I decide to upgrade again", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Adel A.", + "reviewRate": 5 + }, + { + "content": "I bought this wheel for a “last mile” commuter solution but it has quickly become an evening addiction. I play the online GPS game Ingress and this is perfect for that! I’ve ridden almost 200 miles on it so far and having so much fun. It’s worth the learning curve. E-wheels is the place to purchase. No regrets, in fact, trying to buy another for the wife!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Mark Jackson", + "reviewRate": 5 + } + ], + "summary": { + "rating": 5, + "reviewsAmount": "62 Reviews" + } + }, + "url": "kingsong-16-electric-unicycle", + "name": "King Song 16S, 1200W Motor/840Wh Battery", + "category": "Advanced Electric Wheels" + }, + { + "shortDescription": [ + "Replacement kickstand for the L6 Electric Scooter\nEasy to fit, will take about five minutes to change." + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "1 lbs" + }, + { + "heading": "Dimensions", + "data": "6 × 6 × 2 in" + } + ], + "images": [ + { + "main": [ + { + "src": "L6-Kickstand-2.jpg", + "srcset": [ + "L6-Kickstand-2-66x66.jpg 66w", + "L6-Kickstand-2-75x75.jpg 75w", + "L6-Kickstand-2-120x120.jpg 120w", + "L6-Kickstand-2-150x150.jpg 150w", + "L6-Kickstand-2-200x200.jpg 200w", + "L6-Kickstand-2-300x300.jpg 300w", + "L6-Kickstand-2-400x399.jpg 400w", + "L6-Kickstand-2-500x499.jpg 500w", + "L6-Kickstand-2-600x599.jpg 600w", + "L6-Kickstand-2.jpg 702w" + ] + }, + { + "src": "L6-Kickstand-2.jpg", + "srcset": [ + "L6-Kickstand-2-66x66.jpg 66w", + "L6-Kickstand-2-75x75.jpg 75w", + "L6-Kickstand-2-120x120.jpg 120w", + "L6-Kickstand-2-150x150.jpg 150w", + "L6-Kickstand-2-200x200.jpg 200w", + "L6-Kickstand-2-300x300.jpg 300w", + "L6-Kickstand-2-400x399.jpg 400w", + "L6-Kickstand-2-500x499.jpg 500w", + "L6-Kickstand-2-600x599.jpg 600w", + "L6-Kickstand-2.jpg 702w" + ] + }, + { + "src": "L6-Kickstand-1.jpg", + "srcset": null + }, + { + "src": "L6-Kickstand-1.jpg", + "srcset": null + } + ] + } + ], + "relatedProducts": [ + { + "name": "V3Pro: Set of Pads", + "url": "v3prov3s-set-pads", + "price": 39 + }, + { + "name": "V8: Extendable Handle", + "url": "v8-extendable-handle", + "price": 52 + }, + { + "name": "L6/Lively: Replacement Control-Board", + "url": "l8-control-board", + "price": 99 + }, + { + "name": "V5F/+ Handle Kit", + "url": "v5f-handle-kit", + "price": 58 + } + ], + "price": 26, + "reviews": { + "list": [], + "summary": { + "summary": "", + "reviewsAmount": 0 + } + }, + "url": "l6-kickstand", + "name": "L6/Lively: Kickstand", + "category": "Parts|Inmotion" + }, + { + "shortDescription": [ + "L6 Scooter Front Spring Set" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "1 lbs" + }, + { + "heading": "Dimensions", + "data": "8 × 8 × 4 in" + } + ], + "images": [ + { + "main": [ + { + "src": "L6-Front-Spring-1.jpg", + "srcset": [ + "L6-Front-Spring-1-66x66.jpg 66w", + "L6-Front-Spring-1-75x75.jpg 75w", + "L6-Front-Spring-1-120x120.jpg 120w", + "L6-Front-Spring-1-150x150.jpg 150w", + "L6-Front-Spring-1-200x200.jpg 200w", + "L6-Front-Spring-1-300x300.jpg 300w", + "L6-Front-Spring-1-400x399.jpg 400w", + "L6-Front-Spring-1-500x499.jpg 500w", + "L6-Front-Spring-1-600x599.jpg 600w", + "L6-Front-Spring-1.jpg 702w" + ] + }, + { + "src": "L6-Front-Spring-1.jpg", + "srcset": [ + "L6-Front-Spring-1-66x66.jpg 66w", + "L6-Front-Spring-1-75x75.jpg 75w", + "L6-Front-Spring-1-120x120.jpg 120w", + "L6-Front-Spring-1-150x150.jpg 150w", + "L6-Front-Spring-1-200x200.jpg 200w", + "L6-Front-Spring-1-300x300.jpg 300w", + "L6-Front-Spring-1-400x399.jpg 400w", + "L6-Front-Spring-1-500x499.jpg 500w", + "L6-Front-Spring-1-600x599.jpg 600w", + "L6-Front-Spring-1.jpg 702w" + ] + } + ] + } + ], + "relatedProducts": [ + { + "name": "V8/Glide 3: Protective Cover", + "url": "v8-protective-cover", + "price": 67 + }, + { + "name": "V5F: Charger Port Flap", + "url": "v5f-charger-port-flap", + "price": 19 + }, + { + "name": "L6/Lively: Standing Mat", + "url": "l6-standing-mat", + "price": 43 + }, + { + "name": "V8: Extendable Handle", + "url": "v8-extendable-handle", + "price": 52 + } + ], + "price": 34, + "reviews": { + "list": [], + "summary": { + "summary": "", + "reviewsAmount": 0 + } + }, + "url": "l6-scooter-front-spring-set", + "name": "L6: Front Spring Set", + "category": "Parts|Inmotion" + }, + { + "shortDescription": [ + "Pair of spring for the Inmotion L6 Electric Scooter" + ], + "technicalSpecs": [ + null + ], + "images": [ + { + "main": [ + { + "src": "L6-Spring-1.jpg", + "srcset": [ + "L6-Spring-1-66x66.jpg 66w", + "L6-Spring-1-75x75.jpg 75w", + "L6-Spring-1-120x120.jpg 120w", + "L6-Spring-1-150x150.jpg 150w", + "L6-Spring-1-200x200.jpg 200w", + "L6-Spring-1-300x300.jpg 300w", + "L6-Spring-1-400x399.jpg 400w", + "L6-Spring-1-500x499.jpg 500w", + "L6-Spring-1-600x599.jpg 600w", + "L6-Spring-1.jpg 702w" + ] + }, + { + "src": "L6-Spring-1.jpg", + "srcset": [ + "L6-Spring-1-66x66.jpg 66w", + "L6-Spring-1-75x75.jpg 75w", + "L6-Spring-1-120x120.jpg 120w", + "L6-Spring-1-150x150.jpg 150w", + "L6-Spring-1-200x200.jpg 200w", + "L6-Spring-1-300x300.jpg 300w", + "L6-Spring-1-400x399.jpg 400w", + "L6-Spring-1-500x499.jpg 500w", + "L6-Spring-1-600x599.jpg 600w", + "L6-Spring-1.jpg 702w" + ] + } + ] + } + ], + "relatedProducts": [ + { + "name": "V3S: Replacement Control-Board", + "url": "v3s-control-board", + "price": 125 + }, + { + "name": "V8: Pair of Structural Inner/shells", + "url": "v8-pair-innershells", + "price": 89 + }, + { + "name": "V3Pro: Set of Pads", + "url": "v3prov3s-set-pads", + "price": 39 + }, + { + "name": "V5/V8: Front LED Headlight", + "url": "v5-v8-front-led-headlight", + "price": 16 + } + ], + "price": 34, + "reviews": { + "list": [], + "summary": { + "summary": "", + "reviewsAmount": 0 + } + }, + "url": "l6-scooter-rear-spring-set", + "name": "L6: Rear Spring Set", + "category": "Parts|Inmotion" + }, + { + "shortDescription": [ + "This is the rubberized standing mat for the Inmotion L6 scooter. Very durable, resistant to scratches, rips or tears." + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "2 lbs" + }, + { + "heading": "Dimensions", + "data": "16 × 10 × 3 in" + } + ], + "images": [ + { + "main": [ + { + "src": "L6-Mat-1.jpg", + "srcset": [ + "L6-Mat-1-66x66.jpg 66w", + "L6-Mat-1-75x75.jpg 75w", + "L6-Mat-1-120x120.jpg 120w", + "L6-Mat-1-150x150.jpg 150w", + "L6-Mat-1-200x200.jpg 200w", + "L6-Mat-1-300x300.jpg 300w", + "L6-Mat-1-400x399.jpg 400w", + "L6-Mat-1-500x499.jpg 500w", + "L6-Mat-1-600x599.jpg 600w", + "L6-Mat-1.jpg 702w" + ] + }, + { + "src": "L6-Mat-1.jpg", + "srcset": [ + "L6-Mat-1-66x66.jpg 66w", + "L6-Mat-1-75x75.jpg 75w", + "L6-Mat-1-120x120.jpg 120w", + "L6-Mat-1-150x150.jpg 150w", + "L6-Mat-1-200x200.jpg 200w", + "L6-Mat-1-300x300.jpg 300w", + "L6-Mat-1-400x399.jpg 400w", + "L6-Mat-1-500x499.jpg 500w", + "L6-Mat-1-600x599.jpg 600w", + "L6-Mat-1.jpg 702w" + ] + } + ] + } + ], + "relatedProducts": [ + { + "name": "L6/Lively: Replacement Control-Board", + "url": "l8-control-board", + "price": 99 + }, + { + "name": "V8: Charger Port Flap", + "url": "v8-charger-port-flap", + "price": 19 + }, + { + "name": "V8: Rear LED Light", + "url": "v8-rear-led-light", + "price": 17 + }, + { + "name": "V5F/V5F+: Replacement Control-board", + "url": "v5fv5f-control-board", + "price": 150 + } + ], + "price": 43, + "reviews": { + "list": [], + "summary": { + "summary": "", + "reviewsAmount": 0 + } + }, + "url": "l6-standing-mat", + "name": "L6/Lively: Standing Mat", + "category": "Parts|Inmotion" + }, + { + "shortDescription": [ + "The bare handle-bare (without the grips, Dashboard, etc)", + "Features the unique folding handle-bar for reduced footprint", + "Collars lock the handlebar into position" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "3 lbs" + }, + { + "heading": "Dimensions", + "data": "20 × 6 × 3 in" + } + ], + "images": [ + { + "main": [ + { + "src": "SW-HBAR-1.jpg", + "srcset": [ + "SW-HBAR-1-66x66.jpg 66w", + "SW-HBAR-1-75x75.jpg 75w", + "SW-HBAR-1-100x100.jpg 100w", + "SW-HBAR-1-150x150.jpg 150w", + "SW-HBAR-1-200x200.jpg 200w", + "SW-HBAR-1-300x300.jpg 300w", + "SW-HBAR-1-400x400.jpg 400w", + "SW-HBAR-1-500x500.jpg 500w", + "SW-HBAR-1-600x600.jpg 600w", + "SW-HBAR-1-700x700.jpg 700w", + "SW-HBAR-1-768x768.jpg 768w", + "SW-HBAR-1-800x800.jpg 800w", + "SW-HBAR-1.jpg 801w" + ] + }, + { + "src": "SW-HBAR-1-700x700.jpg", + "srcset": [ + "SW-HBAR-1-66x66.jpg 66w", + "SW-HBAR-1-75x75.jpg 75w", + "SW-HBAR-1-100x100.jpg 100w", + "SW-HBAR-1-150x150.jpg 150w", + "SW-HBAR-1-200x200.jpg 200w", + "SW-HBAR-1-300x300.jpg 300w", + "SW-HBAR-1-400x400.jpg 400w", + "SW-HBAR-1-500x500.jpg 500w", + "SW-HBAR-1-600x600.jpg 600w", + "SW-HBAR-1-700x700.jpg 700w", + "SW-HBAR-1-768x768.jpg 768w", + "SW-HBAR-1-800x800.jpg 800w", + "SW-HBAR-1.jpg 801w" + ] + }, + { + "src": "SW-HBAR-2.jpg", + "srcset": null + }, + { + "src": "SW-HBAR-2-700x700.jpg", + "srcset": null + } + ] + } + ], + "relatedProducts": [ + { + "name": "Speedway III/IV- 600W Motor", + "url": "speedway-iii-iv-600w-motor", + "price": 141 + }, + { + "name": "Scooter Brake Disc Rotor", + "url": "scooter-brake-disc-rotor", + "price": 23 + }, + { + "name": "Mini4- Rear Brake Lever", + "url": "mini4-rear-brake-lever", + "price": 25 + }, + { + "name": "Mini4- Dashboard Data Cable", + "url": "mini-4-dashboard-data-cable", + "price": 28 + } + ], + "price": 43, + "reviews": { + "list": [], + "summary": { + "summary": "", + "reviewsAmount": 0 + } + }, + "url": "mini-4-bare-handle-bar-folding-parts", + "name": "Mini4- Bare Handlebar with Folding Extensions", + "category": "Parts|Speedway" + }, + { + "shortDescription": [ + "Dashboard linkage between the control-board", + "At the control-board is a standard six-pin connector interface, at the Dashboard end are six color-coded pins that slot from underneath the Dash into the PCB", + "Both the brake lines & this cable are held together in a protective mesh that goes into the Scooter’s body", + "Estimated time-to-install: 45 min" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "1 lbs" + }, + { + "heading": "Dimensions", + "data": "10 × 10 × 1 in" + } + ], + "images": [ + { + "main": [ + { + "src": "MINI4-DASH-WIRE.jpg", + "srcset": [ + "MINI4-DASH-WIRE-66x66.jpg 66w", + "MINI4-DASH-WIRE-75x75.jpg 75w", + "MINI4-DASH-WIRE-100x100.jpg 100w", + "MINI4-DASH-WIRE-150x150.jpg 150w", + "MINI4-DASH-WIRE-200x200.jpg 200w", + "MINI4-DASH-WIRE-300x300.jpg 300w", + "MINI4-DASH-WIRE-400x400.jpg 400w", + "MINI4-DASH-WIRE-500x500.jpg 500w", + "MINI4-DASH-WIRE-600x600.jpg 600w", + "MINI4-DASH-WIRE-700x700.jpg 700w", + "MINI4-DASH-WIRE-768x768.jpg 768w", + "MINI4-DASH-WIRE-800x800.jpg 800w", + "MINI4-DASH-WIRE.jpg 801w" + ] + }, + { + "src": "MINI4-DASH-WIRE-700x700.jpg", + "srcset": [ + "MINI4-DASH-WIRE-66x66.jpg 66w", + "MINI4-DASH-WIRE-75x75.jpg 75w", + "MINI4-DASH-WIRE-100x100.jpg 100w", + "MINI4-DASH-WIRE-150x150.jpg 150w", + "MINI4-DASH-WIRE-200x200.jpg 200w", + "MINI4-DASH-WIRE-300x300.jpg 300w", + "MINI4-DASH-WIRE-400x400.jpg 400w", + "MINI4-DASH-WIRE-500x500.jpg 500w", + "MINI4-DASH-WIRE-600x600.jpg 600w", + "MINI4-DASH-WIRE-700x700.jpg 700w", + "MINI4-DASH-WIRE-768x768.jpg 768w", + "MINI4-DASH-WIRE-800x800.jpg 800w", + "MINI4-DASH-WIRE.jpg 801w" + ] + } + ] + } + ], + "relatedProducts": [ + { + "name": "Mini4- Rear Brake Lever", + "url": "mini4-rear-brake-lever", + "price": 25 + }, + { + "name": "Mini4- Front Fork", + "url": "mini4-front-fork", + "price": 41 + }, + { + "name": "Speedway III/IV- 600W Motor", + "url": "speedway-iii-iv-600w-motor", + "price": 141 + }, + { + "name": "Mini4- Bare Handlebar with Folding Extensions", + "url": "mini-4-bare-handle-bar-folding-parts", + "price": 43 + } + ], + "price": 28, + "reviews": { + "list": [], + "summary": { + "summary": "", + "reviewsAmount": 0 + } + }, + "url": "mini-4-dashboard-data-cable", + "name": "Mini4- Dashboard Data Cable", + "category": "Parts|Speedway" + }, + { + "shortDescription": [ + "Durable front mud-guard made from injected polycarbonate", + "Secured with two bolts from underneath—Wheel needs to come off to fit", + "Estimated time-to-install: 15 minutes" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "1 lbs" + }, + { + "heading": "Dimensions", + "data": "10 × 10 × 3 in" + } + ], + "images": [ + { + "main": [ + { + "src": "MINI4-FEND-F-1.jpg", + "srcset": [ + "MINI4-FEND-F-1-66x66.jpg 66w", + "MINI4-FEND-F-1-75x75.jpg 75w", + "MINI4-FEND-F-1-100x100.jpg 100w", + "MINI4-FEND-F-1-150x150.jpg 150w", + "MINI4-FEND-F-1-200x200.jpg 200w", + "MINI4-FEND-F-1-300x300.jpg 300w", + "MINI4-FEND-F-1-400x400.jpg 400w", + "MINI4-FEND-F-1-500x500.jpg 500w", + "MINI4-FEND-F-1-600x600.jpg 600w", + "MINI4-FEND-F-1-700x700.jpg 700w", + "MINI4-FEND-F-1-768x768.jpg 768w", + "MINI4-FEND-F-1-800x800.jpg 800w", + "MINI4-FEND-F-1.jpg 801w" + ] + }, + { + "src": "MINI4-FEND-F-1-700x700.jpg", + "srcset": [ + "MINI4-FEND-F-1-66x66.jpg 66w", + "MINI4-FEND-F-1-75x75.jpg 75w", + "MINI4-FEND-F-1-100x100.jpg 100w", + "MINI4-FEND-F-1-150x150.jpg 150w", + "MINI4-FEND-F-1-200x200.jpg 200w", + "MINI4-FEND-F-1-300x300.jpg 300w", + "MINI4-FEND-F-1-400x400.jpg 400w", + "MINI4-FEND-F-1-500x500.jpg 500w", + "MINI4-FEND-F-1-600x600.jpg 600w", + "MINI4-FEND-F-1-700x700.jpg 700w", + "MINI4-FEND-F-1-768x768.jpg 768w", + "MINI4-FEND-F-1-800x800.jpg 800w", + "MINI4-FEND-F-1.jpg 801w" + ] + }, + { + "src": "MINI4-FEND-F-2.jpg", + "srcset": null + }, + { + "src": "MINI4-FEND-F-2-700x700.jpg", + "srcset": null + } + ] + } + ], + "relatedProducts": [ + { + "name": "Mini4- Rear Brake Lever", + "url": "mini4-rear-brake-lever", + "price": 25 + }, + { + "name": "Mini4- Bare Handlebar with Folding Extensions", + "url": "mini-4-bare-handle-bar-folding-parts", + "price": 43 + }, + { + "name": "Mini4- Solid Rubber Front Tire", + "url": "mini4-solid-rubber-front-tire", + "price": 44 + }, + { + "name": "Mini4- Handle Grip Set", + "url": "mini-4-handle-grip-set", + "price": 24 + } + ], + "price": 27, + "reviews": { + "list": [], + "summary": { + "summary": "", + "reviewsAmount": 0 + } + }, + "url": "mini-4-front-mud-guard", + "name": "Mini4- Front Fender/Mud-guard", + "category": "Parts|Speedway" + }, + { + "shortDescription": [ + "Rubber handle-bar grips", + "To remove the old set, gradually apply heat with a hair-dryer, twist & slide off", + "Estimated time-to-install: 15 minutes" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "1 lbs" + }, + { + "heading": "Dimensions", + "data": "10 × 3 × 3 in" + } + ], + "images": [ + { + "main": [ + { + "src": "SW-GRP-1.jpg", + "srcset": [ + "SW-GRP-1-66x66.jpg 66w", + "SW-GRP-1-75x75.jpg 75w", + "SW-GRP-1-100x100.jpg 100w", + "SW-GRP-1-150x150.jpg 150w", + "SW-GRP-1-200x200.jpg 200w", + "SW-GRP-1-300x300.jpg 300w", + "SW-GRP-1-400x400.jpg 400w", + "SW-GRP-1-500x500.jpg 500w", + "SW-GRP-1-600x600.jpg 600w", + "SW-GRP-1-700x700.jpg 700w", + "SW-GRP-1-768x768.jpg 768w", + "SW-GRP-1-800x800.jpg 800w", + "SW-GRP-1.jpg 801w" + ] + }, + { + "src": "SW-GRP-1-700x700.jpg", + "srcset": [ + "SW-GRP-1-66x66.jpg 66w", + "SW-GRP-1-75x75.jpg 75w", + "SW-GRP-1-100x100.jpg 100w", + "SW-GRP-1-150x150.jpg 150w", + "SW-GRP-1-200x200.jpg 200w", + "SW-GRP-1-300x300.jpg 300w", + "SW-GRP-1-400x400.jpg 400w", + "SW-GRP-1-500x500.jpg 500w", + "SW-GRP-1-600x600.jpg 600w", + "SW-GRP-1-700x700.jpg 700w", + "SW-GRP-1-768x768.jpg 768w", + "SW-GRP-1-800x800.jpg 800w", + "SW-GRP-1.jpg 801w" + ] + }, + { + "src": "SW-GRP-2.jpg", + "srcset": null + }, + { + "src": "SW-GRP-2-700x700.jpg", + "srcset": null + } + ] + } + ], + "relatedProducts": [ + { + "name": "Mini4- Side Panels", + "url": "mini-4-set-side-led-panels", + "price": 30 + }, + { + "name": "Mini4- Rear Mud-guard", + "url": "mini-4-rear-mud-guard", + "price": 33 + }, + { + "name": "Mini4- Front Fork", + "url": "mini4-front-fork", + "price": 41 + }, + { + "name": "Mini4- Front Fender/Mud-guard", + "url": "mini-4-front-mud-guard", + "price": 27 + } + ], + "price": 24, + "reviews": { + "list": [], + "summary": { + "summary": "", + "reviewsAmount": 0 + } + }, + "url": "mini-4-handle-grip-set", + "name": "Mini4- Handle Grip Set", + "category": "Parts|Speedway" + }, + { + "shortDescription": [ + "Brake line for the rear drum-brake system", + "Cable runs through the side-panel of the Scooter, exits on the lower right side", + "May be in need of replacement if there are signs of fraying or corrosion", + "Estimated time-to-install: 30 min" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "1 lbs" + }, + { + "heading": "Dimensions", + "data": "10 × 10 × 1 in" + } + ], + "images": [ + { + "main": [ + { + "src": "SW-BRK-CBL.jpg", + "srcset": [ + "SW-BRK-CBL-66x66.jpg 66w", + "SW-BRK-CBL-75x75.jpg 75w", + "SW-BRK-CBL-100x100.jpg 100w", + "SW-BRK-CBL-150x150.jpg 150w", + "SW-BRK-CBL-200x200.jpg 200w", + "SW-BRK-CBL-300x300.jpg 300w", + "SW-BRK-CBL-400x400.jpg 400w", + "SW-BRK-CBL-500x500.jpg 500w", + "SW-BRK-CBL-600x600.jpg 600w", + "SW-BRK-CBL-700x700.jpg 700w", + "SW-BRK-CBL-768x768.jpg 768w", + "SW-BRK-CBL-800x800.jpg 800w", + "SW-BRK-CBL.jpg 801w" + ] + }, + { + "src": "SW-BRK-CBL-700x700.jpg", + "srcset": [ + "SW-BRK-CBL-66x66.jpg 66w", + "SW-BRK-CBL-75x75.jpg 75w", + "SW-BRK-CBL-100x100.jpg 100w", + "SW-BRK-CBL-150x150.jpg 150w", + "SW-BRK-CBL-200x200.jpg 200w", + "SW-BRK-CBL-300x300.jpg 300w", + "SW-BRK-CBL-400x400.jpg 400w", + "SW-BRK-CBL-500x500.jpg 500w", + "SW-BRK-CBL-600x600.jpg 600w", + "SW-BRK-CBL-700x700.jpg 700w", + "SW-BRK-CBL-768x768.jpg 768w", + "SW-BRK-CBL-800x800.jpg 800w", + "SW-BRK-CBL.jpg 801w" + ] + } + ] + } + ], + "relatedProducts": [ + { + "name": "Mini4- Dashboard/Throttle Unit", + "url": "mini4-dashboard-throttle-unit", + "price": 49 + }, + { + "name": "Mini4- Handle Grip Set", + "url": "mini-4-handle-grip-set", + "price": 24 + }, + { + "name": "Mini4- Trolley-wheel Kit", + "url": "mini4-trolley-wheel-kit", + "price": 23 + }, + { + "name": "4x Scooter Brake Pads", + "url": "scooter-brake-pads", + "price": 16 + } + ], + "price": 19, + "reviews": { + "list": [], + "summary": { + "summary": "", + "reviewsAmount": 0 + } + }, + "url": "mini-4-rear-brake-line-cable", + "name": "Scooter Rear Brake Line Cable", + "category": "Parts|Speedway" + }, + { + "shortDescription": [ + "For combo rapid-charger & fingerprint scanner pricing, please contact us at 305-432-2788 or sales@ewheels.com for details.", + "The Dualtron 3 is the new start-of-the-art folding Electric Scooter. With many new upgrades, including ABS/hydraulic brakes, tubeless tires, improved suspension, optional fingerprint scanner, optional seat, the DT 3 is ready to go out-of-the-box with minimal assembly required", + "The 1,658Wh battery can provide up to 50+ miles distance at moderate cruising speed", + "3,600W peak & 1,600W Sustained Power for a max cruising speed exceeding 40+ MPH", + "eWheels are proud to be the first US Distributor of Dualtron & Speedway products within North America." + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "80 lb", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon3.jpg" + }, + { + "heading": "Cruising Speed", + "data": "40+ MPH", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon1.png" + }, + { + "heading": "Charge Time", + "data": "3-4 hrs\n*to 80% with optional Rapid-charger", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon4.png" + }, + { + "heading": "Max Load", + "data": "310 lb", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon2.png" + }, + { + "heading": "Battery Capacity", + "data": "1,658Wh", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/Battery-Graph-1.png" + }, + { + "heading": "Range", + "data": "~50 miles\nAt 18MPH under ideal conditions", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/Range-Graph-1.png" + } + ], + "images": [ + { + "main": [ + { + "src": "DT3-Feature-1.jpg", + "srcset": [ + "DT3-Feature-1-66x66.jpg 66w", + "DT3-Feature-1-75x75.jpg 75w", + "DT3-Feature-1-100x100.jpg 100w", + "DT3-Feature-1-150x150.jpg 150w", + "DT3-Feature-1-200x200.jpg 200w", + "DT3-Feature-1-300x300.jpg 300w", + "DT3-Feature-1-400x400.jpg 400w", + "DT3-Feature-1-500x500.jpg 500w", + "DT3-Feature-1-600x600.jpg 600w", + "DT3-Feature-1-700x700.jpg 700w", + "DT3-Feature-1-768x768.jpg 768w", + "DT3-Feature-1-800x800.jpg 800w", + "DT3-Feature-1.jpg 801w" + ] + }, + { + "src": "DT3-Feature-1-700x700.jpg", + "srcset": [ + "DT3-Feature-1-66x66.jpg 66w", + "DT3-Feature-1-75x75.jpg 75w", + "DT3-Feature-1-100x100.jpg 100w", + "DT3-Feature-1-150x150.jpg 150w", + "DT3-Feature-1-200x200.jpg 200w", + "DT3-Feature-1-300x300.jpg 300w", + "DT3-Feature-1-400x400.jpg 400w", + "DT3-Feature-1-500x500.jpg 500w", + "DT3-Feature-1-600x600.jpg 600w", + "DT3-Feature-1-700x700.jpg 700w", + "DT3-Feature-1-768x768.jpg 768w", + "DT3-Feature-1-800x800.jpg 800w", + "DT3-Feature-1.jpg 801w" + ] + }, + { + "src": "DT3-Side.jpg", + "srcset": null + }, + { + "src": "DT3-Side-700x700.jpg", + "srcset": null + }, + { + "src": "DT3-Oblique-Folded-Right.jpg", + "srcset": null + }, + { + "src": "DT3-Oblique-Folded-Right-700x700.jpg", + "srcset": null + }, + { + "src": "DT3-Front.jpg", + "srcset": null + }, + { + "src": "DT3-Front-700x700.jpg", + "srcset": null + } + ] + } + ], + "relatedProducts": [ + { + "name": "NEW: Stigo B1 480Wh Battery/350W Electric Folding Bike", + "url": "new-stigo-b1-480wh-battery-350w-electric-folding-bike", + "price": 1050 + }, + { + "name": "NEW: Dualtron Thunder 2,060Wh/2x 1,200W (2,400W) Motors", + "url": "new-dualtron-thunder-2060wh-2x-1200w-2400w-motors", + "price": 3925 + }, + { + "name": "NEW: Speedway 5, 1,404Wh Battery/3600W Peak Power", + "url": "new-speedway-5-1404wh-battery-3600w-peak-power", + "price": 2100 + }, + { + "name": "NEW: Turbowheel Dart, T9 600W/614Wh", + "url": "new-turbowheel-dart-t9-500w-614wh", + "price": 998 + } + ], + "price": 2992, + "reviews": { + "list": [ + { + "content": "After looking through various electric scooters, the Dualtron 3 I found to be the best fit for my needs. I wanted something that had enough battery to transport me to and fro, without worries of running out of power. However, I needed something that was going to be durable enough to handle the rigors of urban dwelling. (Rough streets and rude drivers.) \n\nThe Dualtron 3 is larger and faster than most urban scooters, but I feel that while it's considered more of an \"off road,\" scooter, I like to think of it as being the perfect \"Urban Assault Scooter.\" It handled steep grades with no problem. It too on uneven sidewalks and streets easily. I came off of a moderate to high level curb, with enough clearance to feel comfortable about my scooter's capabilities, and kept rolling.\n\nThe speed, handling and suspension system of the Dualtron 3 make this a great urban scooter. The beefy nature of the scooter build also makes me feel that it's the better choice for the commutes that I'll have to endure of days as well. And with proper care and maintenance, it should do so for a long time to come.\n\nIt's not a lightweight scooter that one will carry around in the office, or on public transit. However, if you're using it as your main source of durable transportation, on city streets, to get to your destination and back again, one can't go wrong with the Dualtron 3.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "David Graham", + "reviewRate": 5 + } + ], + "summary": { + "rating": 5, + "reviewsAmount": "1 Reviews" + } + }, + "url": "new-dualtron-3-1658wh-2x-800w-1600w-motors", + "name": "NEW: Dualtron 3. 1,658Wh/2x 800W (1600W) Motors", + "category": "Electric Scooters & eBikes" + }, + { + "shortDescription": [ + "Achieves the impressive combination of being a comparatively ‘light’ scooter, at 44lb, while possessing dual-motors, reaching a maximum cruising speed of 37MPH", + "For combo rapid-charger & fingerprint scanner pricing, please contact us at 305-432-2788 or sales@ewheels.com for details.", + "The LG MJ1 1,050 battery pack can provide up to 42 miles range at 15MPH cruising speed", + "Packed with features: changeable suspension cartridges, optional fingerprint scanner, multi-color atmospheric lighting with remote, embedded deck lighting, fold-down handlebars, etc", + "eWheels.com were the first Seller of Minimotors/Dualtron scooters within the United States, offering the greatest selection of scooters, range of parts, & ful US warranty." + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "44 lb", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon3.jpg" + }, + { + "heading": "Max Cruising Speed", + "data": "37 MPH", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon1.png" + }, + { + "heading": "Charge Time", + "data": "2 hrs\n*to 80% with optional Rapid-charger", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon4.png" + }, + { + "heading": "Max Load", + "data": "220 lb", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon2.png" + }, + { + "heading": "Battery Capacity", + "data": "1,050Wh", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/Battery-Graph-1.png" + }, + { + "heading": "Range", + "data": "~42 miles\nAt 15MPH under ideal conditions", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/Range-Graph-1.png" + } + ], + "images": [ + { + "main": [ + { + "src": "DT-Spider-Feature.jpg", + "srcset": [ + "DT-Spider-Feature-66x66.jpg 66w", + "DT-Spider-Feature-75x75.jpg 75w", + "DT-Spider-Feature-100x100.jpg 100w", + "DT-Spider-Feature-150x150.jpg 150w", + "DT-Spider-Feature-200x200.jpg 200w", + "DT-Spider-Feature-300x300.jpg 300w", + "DT-Spider-Feature-400x400.jpg 400w", + "DT-Spider-Feature-500x500.jpg 500w", + "DT-Spider-Feature-600x600.jpg 600w", + "DT-Spider-Feature-700x700.jpg 700w", + "DT-Spider-Feature-768x768.jpg 768w", + "DT-Spider-Feature-800x800.jpg 800w", + "DT-Spider-Feature.jpg 801w" + ] + }, + { + "src": "DT-Spider-Feature-700x700.jpg", + "srcset": [ + "DT-Spider-Feature-66x66.jpg 66w", + "DT-Spider-Feature-75x75.jpg 75w", + "DT-Spider-Feature-100x100.jpg 100w", + "DT-Spider-Feature-150x150.jpg 150w", + "DT-Spider-Feature-200x200.jpg 200w", + "DT-Spider-Feature-300x300.jpg 300w", + "DT-Spider-Feature-400x400.jpg 400w", + "DT-Spider-Feature-500x500.jpg 500w", + "DT-Spider-Feature-600x600.jpg 600w", + "DT-Spider-Feature-700x700.jpg 700w", + "DT-Spider-Feature-768x768.jpg 768w", + "DT-Spider-Feature-800x800.jpg 800w", + "DT-Spider-Feature.jpg 801w" + ] + }, + { + "src": "DT-Spider-Overhead.jpg", + "srcset": null + }, + { + "src": "DT-Spider-Overhead-700x700.jpg", + "srcset": null + }, + { + "src": "DT-Spider-Front.jpg", + "srcset": null + }, + { + "src": "DT-Spider-Front-700x700.jpg", + "srcset": null + }, + { + "src": "DT-Spider-Side.jpg", + "srcset": null + }, + { + "src": "DT-Spider-Side-700x700.jpg", + "srcset": null + } + ] + } + ], + "relatedProducts": [ + { + "name": "NEW: Dualtron Thunder 2,060Wh/2x 1,200W (2,400W) Motors", + "url": "new-dualtron-thunder-2060wh-2x-1200w-2400w-motors", + "price": 3925 + }, + { + "name": "NEW: Stigo B1 480Wh Battery/350W Electric Folding Bike", + "url": "new-stigo-b1-480wh-battery-350w-electric-folding-bike", + "price": 1050 + }, + { + "name": "NEW: Dualtron 3. 1,658Wh/2x 800W (1600W) Motors", + "url": "new-dualtron-3-1658wh-2x-800w-1600w-motors", + "price": 2992 + }, + { + "name": "NEW: Turbowheel Dart, T9 600W/614Wh", + "url": "new-turbowheel-dart-t9-500w-614wh", + "price": 998 + } + ], + "price": 2450, + "reviews": { + "list": [], + "summary": { + "rating": 0, + "reviewsAmount": "0 Reviews" + } + }, + "url": "new-dualtron-spider-3000w-peak-1050wh-battery", + "name": "NEW: Dualtron Spider 1,050Wh Battery/3000W Peak Power", + "category": "Electric Scooters & eBikes" + }, + { + "shortDescription": [ + "Includes bonus rapid-charger & fingerprint scanner, combined value of $250", + "The Dualtron Thunder is probably the best folding Electric Scooter money can buy right now. With many new upgrades, including ABS/hydraulic brakes, ultra-wide tubeless tires, improved suspension, optional fingerprint scanner, optional seat, the Thunder is ready to go out-of-the-box with minimal assembly required", + "The 2,060Wh battery can provide up to 80 miles distance at moderate cruising speed", + "5,400W peak & 2,400W Sustained Power. The Thunder Delivers the highest performance spec on an eScooter", + "eWheels are proud to be the first US Distributor of Dualtron & Speedway products within North America." + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "95 lb", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon3.jpg" + }, + { + "heading": "Cruising Speed", + "data": "50 MPH", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon1.png" + }, + { + "heading": "Charge Time", + "data": "4.5 hrs\n*to 80% with optional Rapid-charger", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon4.png" + }, + { + "heading": "Max Load", + "data": "350 lb", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon2.png" + }, + { + "heading": "Battery Capacity", + "data": "2,060Wh", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/Battery-Graph-1.png" + }, + { + "heading": "Range", + "data": "~85 miles\nAt 15MPH under ideal conditions", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/Range-Graph-1.png" + } + ], + "images": [ + { + "main": [ + { + "src": "DT-Thunder-Oblique-Left-M.jpg", + "srcset": [ + "DT-Thunder-Oblique-Left-M-66x66.jpg 66w", + "DT-Thunder-Oblique-Left-M-75x75.jpg 75w", + "DT-Thunder-Oblique-Left-M-100x100.jpg 100w", + "DT-Thunder-Oblique-Left-M-150x150.jpg 150w", + "DT-Thunder-Oblique-Left-M-200x200.jpg 200w", + "DT-Thunder-Oblique-Left-M-300x300.jpg 300w", + "DT-Thunder-Oblique-Left-M-400x400.jpg 400w", + "DT-Thunder-Oblique-Left-M-500x500.jpg 500w", + "DT-Thunder-Oblique-Left-M-600x600.jpg 600w", + "DT-Thunder-Oblique-Left-M-700x700.jpg 700w", + "DT-Thunder-Oblique-Left-M-768x768.jpg 768w", + "DT-Thunder-Oblique-Left-M-800x800.jpg 800w", + "DT-Thunder-Oblique-Left-M.jpg 801w" + ] + }, + { + "src": "DT-Thunder-Oblique-Left-M-700x700.jpg", + "srcset": [ + "DT-Thunder-Oblique-Left-M-66x66.jpg 66w", + "DT-Thunder-Oblique-Left-M-75x75.jpg 75w", + "DT-Thunder-Oblique-Left-M-100x100.jpg 100w", + "DT-Thunder-Oblique-Left-M-150x150.jpg 150w", + "DT-Thunder-Oblique-Left-M-200x200.jpg 200w", + "DT-Thunder-Oblique-Left-M-300x300.jpg 300w", + "DT-Thunder-Oblique-Left-M-400x400.jpg 400w", + "DT-Thunder-Oblique-Left-M-500x500.jpg 500w", + "DT-Thunder-Oblique-Left-M-600x600.jpg 600w", + "DT-Thunder-Oblique-Left-M-700x700.jpg 700w", + "DT-Thunder-Oblique-Left-M-768x768.jpg 768w", + "DT-Thunder-Oblique-Left-M-800x800.jpg 800w", + "DT-Thunder-Oblique-Left-M.jpg 801w" + ] + }, + { + "src": "DT-Thunder-Reaer-Oblique-Left.jpg", + "srcset": null + }, + { + "src": "DT-Thunder-Reaer-Oblique-Left-700x700.jpg", + "srcset": null + }, + { + "src": "DT-Thunder-Front-Folded-Left.jpg", + "srcset": null + }, + { + "src": "DT-Thunder-Front-Folded-Left-700x700.jpg", + "srcset": null + }, + { + "src": "DT-Thunder-Rear-Folded-Left.jpg", + "srcset": null + }, + { + "src": "DT-Thunder-Rear-Folded-Left-700x700.jpg", + "srcset": null + }, + { + "src": "DT-Thunder-Side.jpg", + "srcset": null + }, + { + "src": "DT-Thunder-Side-700x700.jpg", + "srcset": null + }, + { + "src": "DT-Thunder-Oblique-Left.jpg", + "srcset": null + }, + { + "src": "DT-Thunder-Oblique-Left-700x700.jpg", + "srcset": null + } + ] + } + ], + "relatedProducts": [ + { + "name": "NEW: Dualtron Spider 1,050Wh Battery/3000W Peak Power", + "url": "new-dualtron-spider-3000w-peak-1050wh-battery", + "price": 2450 + }, + { + "name": "NEW: Turbowheel Lightning, 957Wh/1165Wh Battery, 2x 1000W (3600W) Motors", + "url": "new-turbowheel-lightning-957wh-battery-2x-1000w-3600w-motors", + "price": 2050 + }, + { + "name": "NEW: Speedway 5, 1,404Wh Battery/3600W Peak Power", + "url": "new-speedway-5-1404wh-battery-3600w-peak-power", + "price": 2100 + }, + { + "name": "NEW: Ninebot-Segway ES2/ES4. 187Wh Battery/300W Motor", + "url": "new-ninebot-es2-es4-187wh-battery-300w-motor", + "price": 607 + } + ], + "price": 3850, + "reviews": { + "list": [ + { + "content": "so far this thunder is a beast! love it and glad that i got it. My wife liked it so much that she got one too!", + "reviewMeta": [ + "Posted 11 months ago", + "09.12.2019" + ], + "reviewAuthor": "Chris Kephart", + "reviewRate": 5 + }, + { + "content": "and the thunder did not disappoint me the scooter is insane speed and range A+ ,it’s everything I thought it would be pricey but worth it and the fast charger along with the regular one will save you much time as the regular one by itself will take a long time to charge I say that because the scooter Arrived before the fast charger and yeah the included fast charger is nice! Thanks Jason .", + "reviewMeta": [ + "Posted 11 months ago", + "27.11.2019" + ], + "reviewAuthor": "Billy Jackson", + "reviewRate": 5 + }, + { + "content": "First off, thank you Jason from eWheels for answering all my emails promptly and for all the info regarding purchasing and using this scooter. I was a little hesitant in ordering such an expensive scooter but eWheels came through and delivered without any problems. The bonus fingerprint reader was factory installed and the added fast charger came separately a day before the scooter arrived. Anyway, I wanted to put at least 250 miles before I wrote this short review. I purchased the Thunder primarily for commuting purposes from Southern Brooklyn to Midtown Manhattan, NYC (~15 miles one way). When used on max settings, I use around 23% battery for the one way trip that consists of stop and go traffic, moderately high uphills (especially on bridges) and straightaway path speeds up to 30 mph. Although this scooter can reach up to 50mph, I dare not to on public roads for the safety of others and myself. Even at 30mph, this is can be very dangerous. It also took me some time to get used to the throttle. It is very sensitive so I ended up using low power settings at first and made sure to enable kickstart mode. For the most part this is a solid, well built scooter with high quality parts. It has held up pretty good for my purpose. The only exception is the hinge part where the shaft folds down. This part started squeaking at around 150 miles and has minor play. I’m not sure if it specific to my scooter or with all but I find myself constantly adjusting and tightening bolts. According to the manual this part of the scooter should be replaced after one year or 3000 miles depending which comes first. Even with this issue, I would still recommend buying the Thunder.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Ronald Halili", + "reviewRate": 5 + }, + { + "content": "It’s a great scooter, I’m still learning.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "LUIS ENRIQUE NAME ACOSTA", + "reviewRate": 5 + }, + { + "content": "I didn't really feel like waiting for spring and for any one else as impatient this review is for you. The roads are still covered in snow where I live. Going straight doesn't seem to be much of a problem for it on ice but turning does become an issue if your not careful. The ABS is amazing! Stuttering to a stop instead of sliding. I did have to turn the acceleration down to make more snow friendly. Once it warms up a bit I plan on using it to get to work daily and take it on hiking trails, I suppose I'll have to update my review once I've had a chance to play on it more but for what I've done on it so far The Dualtron Thunder has been amazing!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Dan Kimerly", + "reviewRate": 5 + }, + { + "content": "OK, I'm going to use a big word. The Dualtron Thunder is the quintessential electric scooter. Put more simply, the Dualtron Thunder is an absolute engineering marvel. This scooter is better than my imagination was in the year 2000, when I first visualized a scooter like the Dualtron Thunder. Thank You MiniMotors for making my dream of electric technology come true.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Raymond Kent", + "reviewRate": 5 + }, + { + "content": "It's probably the best electric scooter you can get at the moment. I used to have Dualtron II LTD, skipped the Ultra series and I'm glad that I did wait for the Thunder. Compared to Ultra, it's an improvement in many ways. The hydraulic brakes, cable insulation/management, 3 button display with an easy max power mode switch, stock road tubeless tires.\n\nI'm glad that I've ordered from eWheels since for the same price as other dealers you get a fast 5A charger with the feature to limit the max charge to 70-80-90% which will prolong your battery life. They also install a fingerprint scanner.\n\nI did have a couple of issues with the scooter, but eWheels support was great and solved the problems I had (either by sending the spare parts or by providing the detailed instructions to get it fixed by myself).\n\nIt's not a 100% polished model and it has a couple of minor problems: wires can be still damaged in some places, there is a play in the folding section that is impossible to fix and you will have to just ignore it, there is no stock light installed for the safe night riding.\n\nFor the headlight I'd recommend the Fenix BC35R (or the previous model).\n\nIt's really a great scooter, but you need to be prepared to fix some issues. If you are an engineer, just buy it already!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Sergei Baranov", + "reviewRate": 5 + }, + { + "content": "The best scooter out there. Period. Coming from a Dualtron 2 Ex, the Thunder feels like an entirely different scooter with a much more premium feel and look. But it comes at a hefty price, which is the only reason for me docking a star off its score. \n- The speed is amazing. You WILL beat cars off the line at green lights, but be sure to hold on tight because this much torque in the dual motors mode feels like a punch in the gut. \n- The range is impressive if you aren’t speed hungry and stay under 30mph. I can ride around in mild temperatures (50F) for around 3 hours before getting down to the last critical 15%\n- The wide tires allow you to ride with one hand which makes sending text messages at slow speeds doable without having to dismount. It also means you can adjust settings with one hand steering without it going squirrelly on you and tilting too much. Very premium. \n- The logo LED on the handle that lights up is viewable even in daylight and looks awesome. There’s also blue mood lighting that projects under the deck. I’ve gotten more “wows” from the Thunder (at night) then even from my electric unicycles. \n- THE HYDRAULIC BRAKES! OH my goodness. A major upgrade from the mechanical brakes of even my dualtron 2 with its dual disc brakes. The new braking system feels like a motorcycles brakes, smooth delivery with incredible stopping power. I can ride right up behind cars now without giving them too much following distance like I used to on thr dualtron 2, because I know the brakes can stop me on a dime. The new brakes alone are worth the $500 more from the Ultra. Supreme confidence and safety. I haven’t tried ABS braking yet so it can only get better. \n- Did I mention the speed? I hit 53mph on a straight (i’m 190 pounds with helmet/gear) easily enough speed to handle any city or town road. \n- The brake lights are a lot safer than any scooter I know. It flashes pops of yellow along with lighting up the typical red brakes, to grab drivers attention that you’re stopping. There’s even a hazard button that flashes strobes of yellow in the rear just like in a car!\n- The deck is very wide and comfortable for standing feet side by side. The new settings display is much easier to change things on. You’ll be happy to know that the ECO/TURBO button is gone (replaced with hazard lights) so you no longer have to worry about accidentally turning on eco mode instead of dual motors(happened a couple times on my dualtron 2, was wondering why I was going so slow when I saw eco mode had been pressed in.)", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Darrell Wesh", + "reviewRate": 4 + } + ], + "summary": { + "rating": 4.9, + "reviewsAmount": "8 Reviews" + } + }, + "url": "new-dualtron-thunder-2060wh-2x-1200w-2400w-motors", + "name": "NEW: Dualtron Thunder 2,060Wh/2x 1,200W (2,400W) Motors", + "category": "Electric Scooters & eBikes" + }, + { + "shortDescription": [ + "Both Black & White back in stock & shipping now!", + "NEW: available in a cheaper 340Wh capacity for just $750", + "BONUS: equipped with the XL pedals & free wrist-guards, a $115 upgrade value", + "14D is in a class of it’s own, leaves similar entry/mid-range 14″ quite far behind in performance capability", + "Perfect choice for someone starting out, or looking to upgrade from an Airwheel, Segway S1, or even an Inmotion V5F" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "30lbs", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon3.jpg" + }, + { + "heading": "Cruising Speed", + "data": "18.6 MPH", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon1.png" + }, + { + "heading": "Charge Time", + "data": "2-3hrs to 80%", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon4.png" + }, + { + "heading": "Rec. Max Load", + "data": "200 lbs", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon2.png" + }, + { + "heading": "Battery Capacity", + "data": "340/420Wh", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/Battery-Graph-1.png" + }, + { + "heading": "Range", + "data": "15-20 miles", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/Range-Graph-1.png" + } + ], + "images": [ + { + "main": [ + { + "src": "KS14D-W-Oblique-Right-Feature.jpg", + "srcset": [ + "KS14D-W-Oblique-Right-Feature-66x66.jpg 66w", + "KS14D-W-Oblique-Right-Feature-75x75.jpg 75w", + "KS14D-W-Oblique-Right-Feature-100x100.jpg 100w", + "KS14D-W-Oblique-Right-Feature-150x150.jpg 150w", + "KS14D-W-Oblique-Right-Feature-200x200.jpg 200w", + "KS14D-W-Oblique-Right-Feature-300x300.jpg 300w", + "KS14D-W-Oblique-Right-Feature-400x400.jpg 400w", + "KS14D-W-Oblique-Right-Feature-500x500.jpg 500w", + "KS14D-W-Oblique-Right-Feature-600x600.jpg 600w", + "KS14D-W-Oblique-Right-Feature-700x700.jpg 700w", + "KS14D-W-Oblique-Right-Feature-768x768.jpg 768w", + "KS14D-W-Oblique-Right-Feature-800x800.jpg 800w", + "KS14D-W-Oblique-Right-Feature.jpg 801w" + ] + }, + { + "src": "KS14D-W-Oblique-Right-Feature-700x700.jpg", + "srcset": [ + "KS14D-W-Oblique-Right-Feature-66x66.jpg 66w", + "KS14D-W-Oblique-Right-Feature-75x75.jpg 75w", + "KS14D-W-Oblique-Right-Feature-100x100.jpg 100w", + "KS14D-W-Oblique-Right-Feature-150x150.jpg 150w", + "KS14D-W-Oblique-Right-Feature-200x200.jpg 200w", + "KS14D-W-Oblique-Right-Feature-300x300.jpg 300w", + "KS14D-W-Oblique-Right-Feature-400x400.jpg 400w", + "KS14D-W-Oblique-Right-Feature-500x500.jpg 500w", + "KS14D-W-Oblique-Right-Feature-600x600.jpg 600w", + "KS14D-W-Oblique-Right-Feature-700x700.jpg 700w", + "KS14D-W-Oblique-Right-Feature-768x768.jpg 768w", + "KS14D-W-Oblique-Right-Feature-800x800.jpg 800w", + "KS14D-W-Oblique-Right-Feature.jpg 801w" + ] + }, + { + "src": "KS14D-W-Side.jpg", + "srcset": null + }, + { + "src": "KS14D-W-Side-700x700.jpg", + "srcset": null + }, + { + "src": "KS14D-BK-Oblique-1.jpg", + "srcset": null + }, + { + "src": "KS14D-BK-Oblique-1-700x700.jpg", + "srcset": null + }, + { + "src": "KS14D-W-Hande-Oblique-Left.jpg", + "srcset": null + }, + { + "src": "KS14D-W-Hande-Oblique-Left-700x700.jpg", + "srcset": null + }, + { + "src": "KS14D-W-Front.jpg", + "srcset": null + }, + { + "src": "KS14D-W-Front-768x768.jpg", + "srcset": null + } + ] + } + ], + "relatedProducts": [ + { + "name": "IPS a130 Turbo Edition", + "url": "ips-a130-turbo-edition", + "price": 375 + } + ], + "price": 800, + "reviews": { + "list": [ + { + "content": "This was my fist wheel. Within a few hours I was able to hop on and ride it in a open area. By the 2nd day I could control my direction and easily ride on sidewalks. Ive been riding it 5-10 miles per day on average with no problems. So much fun. If anything, I wish it could go a little faster but its half the price of faster wheels so Ill let it slide.", + "reviewMeta": [ + "Posted 3 weeks ago", + "03.11.2020" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "My use is recreational. It took a few minutes to learn to ride, a few hours of riding to control turns safely, very well built wheel and extremely fun!", + "reviewMeta": [ + "Posted 1 month ago", + "26.09.2020" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "Super fun first wheel! I've had the 14D for 2 weeks and ridden a little over 200 miles already. Make sure to get a full face moto helmet because you will crash learning to ride. Such a fun mode of transportation, I make up excuses to run to the store now. Great acceleration, super tight turning and just a blast to ride!", + "reviewMeta": [ + "Posted 2 months ago", + "23.09.2020" + ], + "reviewAuthor": "DAVID CHARTER", + "reviewRate": 5 + }, + { + "content": "Very reliable, well built EUC. Good for a starter EUC, or a lightweight short range commuter. I use this EUC to teach my friends on, and to run quick errands. Great value for the money.", + "reviewMeta": [ + "Posted 2 months ago", + "16.09.2020" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "I am still on the very beginning of the learning curve, so I cannot provide a deep technical review, but it seems to work excellent. I have one complaint though: the paddings for calfs at the top of the wheel could be bigger and softer. Padding for ankles does not exist. It hurts quite a bit and I got bruises on my calfs. I had to come with my own home solution for these paddings. And I am reading that it is not only me, complaining. Even expert riders add their own padding for comfort and stability. This is the reason why I give the wheel 4 stars.", + "reviewMeta": [ + "Posted 4 months ago", + "14.07.2020" + ], + "reviewAuthor": "Alexander Kamensky", + "reviewRate": 4 + }, + { + "content": "So far, it’s awesome. Just started today. Looks and feels of nice quality / and durable. Everything works.", + "reviewMeta": [ + "Posted 4 months ago", + "07.07.2020" + ], + "reviewAuthor": "Jacob Ferguson", + "reviewRate": 5 + }, + { + "content": "I really don’t have anything to compare this to as it is my first EUC. Thought myself to ride in about 10 sessions with the help of a few YouTube videos. Still not 100% confident but am at about 90%. The wheel seems great and resilient - for sure it has take a bit of a beating. So far, so good.", + "reviewMeta": [ + "Posted 5 months ago", + "20.06.2020" + ], + "reviewAuthor": "Douglas Smith", + "reviewRate": 5 + }, + { + "content": "This is my first euc! Loving it, came from Meepo V3 ER. KS14D seems to be getting about the same range as my e-board; 20 miles, although at almost half the speed. The tilt sensor isn't timid about tilting you backwards once you pass 18mph. It only took me about an hour to learn basics how to ride with youtube videos, now 2 days later i feel alot more confident in my ability, can almost drain the battery in one ride, ride through grass and dirt, up and down small curbs. What's stopping me is soreness from the muscles I've been building while riding. It's takes alot of balance and most of your weight ends of leaning on your shins pressed against the wheel. Im still getting used to that with bruised shins, i should take a day or 2 break and let them heal but it's soo much fun I can't stop haha my only complaint is the King Song App. EWheels sent me an email about a different app that actually worked better. But it still lacked key info from real app. So sometimes i need to switch between apps, can be a pain. App is required to unlock the wheel when it first arrives, but after that you never need to use the app again.", + "reviewMeta": [ + "Posted 5 months ago", + "15.06.2020" + ], + "reviewAuthor": "Jeremiah Wesche", + "reviewRate": 5 + }, + { + "content": "This is a very play full and durable wheel you will get your money worth. I own many wheels and all the wheels that I like is wheels that put on a light show and have Bluetooth speakers and must have performance with no headaches. The kingsong 14D IS THE WHEEL YOU TAKE TO GO HERE AND THERE AND DO Freestyle tricks. This wheel will not disappoint you. I would have chosen the v8 since I own a V10f but the V8 or the v5 didn’t have Bluetooth speakers and Ditton come in white. Plus the price 14D YOUGET MORE FOR YOUR BUCK. IF YOU ARE LOOKING FOR YOUR FIRST WHEEL OR HAVE 18 OR16 Inch wheel AND YOU ARE LOOKING FOR A WHEEL TO JUST TOHAVE FUN WITH AND CAN TAKE IT ANYWHERE This wheel is what your looking for. Thanks E wheels fast Delivery and service will be buying from you again", + "reviewMeta": [ + "Posted 5 months ago", + "08.06.2020" + ], + "reviewAuthor": "Robert recco", + "reviewRate": 5 + }, + { + "content": "Very impressed with the fit and finish of this product. Furthermore the build quality is excellent. My Daughter and I beat this wheel up as we were learning and despite a few scrapes on the body and pedals it has been a tank. There is no loose pieces or degraded functionality. Wheel is for my daughter and she now loves it. I highly recommend KingSong and eWheels.", + "reviewMeta": [ + "Posted 5 months ago", + "05.06.2020" + ], + "reviewAuthor": "Jeffrey Felton", + "reviewRate": 5 + }, + { + "content": "So much fun! Definitely a huge learning curve at the beginning but so much worth it. Would buy again and recommended my friends to buy it.", + "reviewMeta": [ + "Posted 5 months ago", + "29.05.2020" + ], + "reviewAuthor": "Gloria Gerngross", + "reviewRate": 5 + }, + { + "content": "My experience with ewheels is at the end....\nI'm a 43 year old male, 6'-3\"& 235lbs.\nI'm highly impressed with KingSong 14D! I'm 35lbs over recommended weight and it did not hinder the functioning of this lil machine at all, the extra weight does drain the battery quicker. Sorry I can't say what I got in range on single charge because I upgraded quickly because I knew I was sticking with riding EUC so I needed range. I have crashed it several times and besides some scratches it continues to work totally fine. The trolley handle works really well, it will work better for someone shorter but I have long arms so it worked for me, BTW, KingSong has best trolley handle designs. I got the 14D up to 18 mph with no problem, keep in mind I'm over the weight limit, so again impressive! \n I can tell that KingSong really puts time/effort into it making a product that will make the whole experience of owning and riding a EUC safe, functional and enjoyable! \nI wish I had more input to give regarding extended durability if this KingSong 14D but I only put lil over hundred miles on it before I was upgrading. But again this lil wheel impressed me, it has taken me up steep inclines, light off roading and it's handle it like A TANK! \nIf money is tight and you're not sure this type of experience will be something you will stick with, get this because you still be be getting a quality machine, that won't break the bank. The speakers are fair, I liked the lights more than I thought I would but with that said, personally I can do without lights and speakers.\n I know myself will enough to know that just by watching YouTube videos that I was going to love having a EUC so I wish I had skipped this wheel and purchased a wheel that I had plenty of room to grow into. I have a Gotway MSP now and I wish it had been my first wheel. Because of health issues the EUC replaced my bicycle, so it's given me back my freedom to get back outside, have fun and see the world, one trail at a time! Riding a EUC is such a freeing sensation!! I have to admit though, I honestly viewed EUC's as toys before I rode one but I quickly realized these EUCs are built tough, so now I consider them as legit personal transportation vehicles.\n\nMy experience with Ewheels: I'm old school in the since that I value professionalism, I believe in doing what you say and if you mess up, admit it and do all you can to make things right, these are values that are almost extinct now days!!! Except for this company, I'm TOTALLY pleased with my dealings with them! Ewheels values their customers and they strive to make their customers completely satisfied!!!! I've purchased 4 wheels from them and you should buy your wheel from them also!", + "reviewMeta": [ + "Posted 5 months ago", + "28.05.2020" + ], + "reviewAuthor": "Marius", + "reviewRate": 5 + }, + { + "content": "I love how quiet it is and the acceleration and stopping are great. Took me about 2 hours of learning around my house grabbing on the counters here and there to keep my balance. Then once I got outside it was exhilarating to cruise around the neighborhood. Buyer beware, none of the YouTube videos I saw tell you that your legs, and feet are going to be wicked sore. Setting up the DarknessBot app was done completely blind.", + "reviewMeta": [ + "Posted 6 months ago", + "12.05.2020" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "looks great. decent learning curve for a 54 year-old. Documentation is a bit spare but the quality appears to be excellent.", + "reviewMeta": [ + "Posted 7 months ago", + "21.04.2020" + ], + "reviewAuthor": "Ann McKnight", + "reviewRate": 5 + }, + { + "content": "This is my first wheel and I am glad I bought this one because within in 30 minutes I was off. I read the reviews on how much easier it is to learn on and I am very happy. I will upgrade to a larger model for longer distances. I only get about 13 miles on this one. Its my only regret as the other larger was not in stock.", + "reviewMeta": [ + "Posted 7 months ago", + "20.04.2020" + ], + "reviewAuthor": "Tony Lucero", + "reviewRate": 4 + }, + { + "content": "This is my first EUC I've purchased, and I'm very happy with it. Jason helped me decide which wheel would be a good choice for a beginner. I taught myself how to ride, as I am the first in my area to ride an EUC. It took me several weeks, but I eventually figured it out. Now don't drive my car all weekend long, I just take my wheel all over town. A quick trip downtown is a breeze, even during heavy summer traffic. It has more power than I expected, and has no trouble taking me(170 lbs.) up steep hills.\nIt is also very maneuverable. I have no trouble avoiding defects on the road or on trails in the woods.", + "reviewMeta": [ + "Posted 7 months ago", + "14.04.2020" + ], + "reviewAuthor": "daniel hubbard", + "reviewRate": 5 + }, + { + "content": "I had originally purchased the iPS A130. Although really cute, I cannot recommend the A130, especially not as a starter wheel. The pedal platform would not stay flat. It kept tilting back for no apparent reason and therefore was very hard to ride.\n\nThe King Song 14D is a fine wheel. It's a little more nimble than my InMotion V8, because the 14D has a smaller wheel, but I think that nimbleness which might make it better on busy sidewalks, makes it a bit harder to learn to ride than the V8.\n\nThe King Song Motor cutoff switch (stops wheel from spinning when you pick it up) senses that you're lifting the weight of the wheel from the handle (which is also the trolley handle.) It's automatic. This model also has headlights on both ends and Bluetooth speakers and a USB port for charging your phone etc. - Nice extras.", + "reviewMeta": [ + "Posted 7 months ago", + "30.03.2020" + ], + "reviewAuthor": "Erich Paetow", + "reviewRate": 5 + }, + { + "content": "Kingsong has made an awesome gadget at a reasonable price point and I'm very happy with my decision to purchase the Kingsong 14D. This thing has plenty of speed and I don't see myself wanting to do over 20 mph anytime soon. It's easy to maneuver, provides a good body-toning workout when carrying the close to 30 pounds of tech. I would definitely recommend this model to others and look forward to moving up to the 16X someday.", + "reviewMeta": [ + "Posted 8 months ago", + "23.03.2020" + ], + "reviewAuthor": "Rember Burthey", + "reviewRate": 5 + }, + { + "content": "", + "reviewMeta": [ + "Posted 9 months ago", + "21.02.2020" + ], + "reviewAuthor": "furqan qureshi", + "reviewRate": 4 + }, + { + "content": "This wheel is comparable to my InMotion V8 but it's got a smaller wheel 14\" vs 16\" which mite make it a bit more nimble, but not as good for off pavement. I love the bigger pedals and that the headlight comes on in the dark (there's a light sensor) whether you are riding it forwards or backwards (it has head and tail lights at each end.) I also love the integrated handle which is also the trolley handle and that it senses when it's being lifted and turns off the wheel so it doesn't overspeed. - Erich", + "reviewMeta": [ + "Posted 9 months ago", + "12.02.2020" + ], + "reviewAuthor": "Erich Paetow", + "reviewRate": 5 + }, + { + "content": "I'm really impressed with this wheel. I thought it would be much harder to learn but was pleasantly surprised at how quickly I got the hang of it. Very well made and simply a blast to ride. If your thinking about this King Son - buy it. You'll be glad you did. Great value and amazing fun factor! I'm married but If you're single - this thing attracts girls better than puppies or babies!", + "reviewMeta": [ + "Posted 9 months ago", + "05.02.2020" + ], + "reviewAuthor": "Matthew Pompey", + "reviewRate": 5 + }, + { + "content": "My wife just got this electric unicycle. It is the perfect size for her, she's still getting with familiar with riding it, but she is having great fun. A good excuse to get out of the house together and enjoy the outdoors. As far as performance, the King Song 14D is very nimble, easy to maneuver, light weight and packed with features. A great first wheel for anyone looking to get into the electric unicycle niche.", + "reviewMeta": [ + "Posted 11 months ago", + "15.12.2019" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "Wonderful little thing. Im at the 1 week mark in practice (about an hour a day) and Im finally able to ride on sidewalks! Controls very well and works nicely as a learning wheel. Look forward to using its full potential soon!!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "My first wheel, so far it's a lot of fun. I'm already thinking of a faster second wheel.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Joseph Nolte", + "reviewRate": 5 + }, + { + "content": "I'm a new rider and this is my first wheel, so I can't really speak to the quality or performance versus other wheels.\n\nI will say that while I regretted not going for a \"forever wheel\" at first, I think the 14D was the right call in hindsight. 30lbs doesn't sound like a lot, but it's more than you might think when you're extending a one-arm carry away from your core to put it in a truck bed or something.\n\nIt's light enough that I'm not afraid when it spins around a bit after bailing as well.\n\nI wasn't sure if it had a lift-sensor, but it apparently does, and it works very well. As far as I can tell, it's just a baby version of the 18XL or 16S.\n\nAnd it can really take a beating! I must've dumped it 30 times so far, and other than some scratches on the glossy finish, no harm done that I can tell.\n\nThe only negative I can come up with is the pads. Really hard on the inside of my calves. I think that's an issue of technique and muscle buildup I'll overcome in a couple weeks. But that's why I deducted 1 point. I think a pad (even some sort of extension like a seat?) that hit closer to the knees instead of mid-shin would solve that.\n\nBecause of the size and performance limits, I think it'll be a great wheel for my son when I do eventually move on to something bigger/faster/longer-range.\n\nOverall, I wouldn't hesitate to recommend the wheel to anyone new to EUCs would wanted something fun to try out. And if you don't plan to commute with it, or are in a lower-speed dense urban area with bike lanes for the most part, I think you could probably live with it happily as your only wheel for a very long time.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Sam Smoot", + "reviewRate": 4 + }, + { + "content": "The KS14D rides great. Has nice accel and decel. I like having the speakers, but at cruising speed not easy to hear. Trolley handle is really smooth and like the single handle. It has a very noisy whine compared to my Solowheel. “Please decelerate” command is obnoxious—not sure if it can be turned off.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 4 + }, + { + "content": "It only took about 10 to 15 minutes before I could ride it. It is a pretty amazing device. I'm 200lbs which is at the limit but it does just fine and climbs pretty good too", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Joe Kirby", + "reviewRate": 5 + }, + { + "content": "This is the perfect wheel for me as I generally use it for shorter distances and I don't need it to go any faster than it does. What actually impresses me more is how slow it can go while navigating through people/bikes. I've never used another wheel so I don't have anything to compare it to but it's remarkably smooth, well-designed, and withstood the beating I put it through while I was learning.\n\nA few tips...\n\nI wish I had used a strap on the handle to avoid the superficial damage it took while learning so learn from my mistakes and use one. \n\nIf you'll be carrying the wheel up or down stairs, don't cheat and carry it with the handle extended, it's not meant to take on the weight of the wheel at that position. My handle started jamming while putting in the down position because of that. \n\nMake sure the tires are always fully inflated. I had a couple flat tires due to slightly deflated tires getting pinched and it's a project to replace the inner-tube. \n\nMy first wheel was either outright stolen or the person who came upon it when I accidentally left it unattended for longer than I should have didn't know who to call so I recommend sticking a label with your contact info on it. \n\nHappy wheeling!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Walter Koehler", + "reviewRate": 5 + }, + { + "content": "I love my king song 14d is work for the purpose that I bought it like from the house to the car short distance ride the only thing I don't like is the same pads b r a little on the hard side apart from that work perfect", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Limayah John", + "reviewRate": 5 + }, + { + "content": "", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Linda Juel", + "reviewRate": 5 + }, + { + "content": "", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "excellent product", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "CARLOS SALINAS", + "reviewRate": 5 + }, + { + "content": "Best mid class so far (at least for me lol) speed and power is where the KS14D shines , from quick acceleration to smooth stops , the KS14D never disappoints, I commute to NYC every day and regret not having purchased this wheel sooner ( 4 miles daily ) the wheel now feels in sync with my thoughts and carves thru the corners like a rocket, you will NOT GET BORED of this wheel any time soon thanks to its power and battery life , also the case feels like it can take the abuse and the lights are really helpful specially now that the winter is coming, the only issue I had is with the handle rails bottoms , right at the end , the end piece came loose and snapped, thanks to the great customer support from EWHEELS , that was taken care of by Jason , thanks guys for providing excellent customer service.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "William A.", + "reviewRate": 5 + }, + { + "content": "This is my first e-unicycle. I started off with the onewheel v1 but range was always on the back of my mind. I love this wheel. Not only is it really fun to ride, I use it to commute to work, a 10 mile trip each way, when it is nice outside. My only regret is not getting the ks14s or the ks16s instead for the longer range.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Kevin", + "reviewRate": 5 + }, + { + "content": "First wheel purchase\nReason for purchase - Commute to work, I live in San Francisco and the hills are just as annoying going up and down\n\nWhy did I choose a eWheel - I considered all sorts of electric vehicles, these eWheels are the most versatile, you can go on the street or on the sidewalk, they are also very small so it's easy to maneuver around people or bring into a restaurant and put under your chair.\n\nHow long did it take to learn to ride - about an hour trying to balance in my house, 1 or two more hours outside practicing before I felt comfortable riding to work.\n\nDurability - During the practice phase I lost control a couple times going decently fast and jumped off the wheel took a nice tumble but it's shown zero signs of slowing down\n\nSpeed - I was considering a slightly slower wheel and I'm happy I chose this one, once you get used to it the speed is nice, especially if you need to tackle hills\n\nFavorite feature - Effortlessly going up hills, I have friends who have electric skateboards and their boards aren't able to get them up the same hills I cruise over. The lights on the front and back are nice safety features for night time\n\nQuirks - The apps are really janky and you need to download them to unlock the speed\n\nSuggestions to manufacturer for improvement - the telescoping handle could go a little higher, I'm not that tall so it's manageable but if I were any taller i would have to be very hunched over to use it. \nThe speed is controlled electronically and if you are exceeding the max speed it will beep and pull you back a little bit, this is fine on flat ground but when the battery is running low and you are going up hill it thinks you are going max speed when you are not going very fast. I think the speed is measured by measuring some variable of energy usage rather than calculating rotational speed\n\nOverall I love this device, all my friends thought I was a weirdo for buying one, but they are slowly coming around to understanding this is the future of transportation!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Jono", + "reviewRate": 5 + }, + { + "content": "A few months ago when I got really excited about getting an EUC, I spent several weeks researching the options and decided this was the one for me. My wife wasn't convinced (she thought it was a pricey toy I'd lose interest in after a day). So I waited, not at all patiently, and by that time it was Christmas and since I'd spent the intervening time making her watch videos and reviews she surprised me with one!\nIt arrived and she still was not impressed. I took it out and went through the necessary 15-30 minutes of just trying to roll the the thing a few feet before it clicked. For about a month she showed no interest in it until she happened to see me gliding (i ride it to work everyday) and she agreed to give it a try. She can be a bit uncoordinated, so she hasn't taken to it as quickly as I have, but she's stubborn. The point is, anyone can learn to ride this thing and just standing on it is enough to make you a believer. She told me to get her one for her birthday. Can't wait for our first riding date.\nSome things you should know:\nIt's awesome and I love it. I can attest to what has been said about slower models, I wanted to max this thing out as soon as it would let me (5km traveled). I have very little desire to go faster, especially after my crash at top speed, more on that later.\nIt is sturdy. I fell off the front at 18 mph, skidded several feet across the road, and thanks to my liberal application of padding, there was barely a scratch on the unicycle. Me not so much, but I was lucky. Wear pads.\nIt's going to take a few days to get proficient. After the first training session, I was very sore. Muscles I don't use very much got a real work out and until you can balance and shift your weight proficiently you're going to bang up your legs.\nHeed the tilt back warning. The only crash I've had was a bad one and it was all because I was stupid. Once I hit the top speed I tried leaning even harder into it to see how fast I could go. Once you reach top speed, that is it. If you lean more, it's not going to speed up, which means no more torque, which means there's nothing to keep you upright. Painful lesson but I did it for you guys and gals. The good news is that it took concerted effort and stupidity to lean over the tilt back so you can't do it accidentally.\nWhen joy riding I very rarely reach half battery capacity, the point where you begin to slow down. I'm usually a bit tired and cold by then and happy to wind down, but if 30-45 minutes isn't a long enough ride for you, consider the 14S.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Jordan", + "reviewRate": 5 + }, + { + "content": "I have only been learning on the wheel so far. Out of the box the wheels seems very well built. I have no experience on other wheels but I am learning pretty quickly and can ride without needing to balance against a wall after about 3 hours of practice. I am enjoying it. The wheel's extra features like headlight, LED lights, charging port are great additions. The telescoping handle has been very useful as well. Very happy with it so far.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Jake", + "reviewRate": 5 + }, + { + "content": "Great EUC and very good dealer! I learned fast in a week and now my kids are starting to learn! I definitely agree that this is the best for newbies like me and my kids! I might buy a new Kingsong in the future because of the safety designed they make for the riders!!! Thanks ewheels!!!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Erick", + "reviewRate": 5 + }, + { + "content": "Awesome wheel. Good speed and good distance. Lights and music are really nice. I could not be happier!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Kenneth", + "reviewRate": 5 + }, + { + "content": "The KS14D rides very well, is quick and responsive and has great battery life and range. I originally bought this for my 13 year old daughter to ride around the neighborhood, but I test drove it and took it around town and was VERY impressed with how well it performed. I weigh 190 lbs and I found it was responsive, smooth and nimble. My daughter weighs 90 lbs and the wheel performs flawlessly for her, with great range and handling. She can pick it up easily on her own (it weighs 27.5 lbs) and it's much more compact than I thought it would be. This is a great wheel for a first time rider (child or adult). I'll be ordering a Kingsong 16S for myself so my daughter and I can go on rides together.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "First off let me say I’m 63 years old and have been looking at these wheels for over a year on YouTube. I heard Jason’s name mentioned on a video and decided to give him a call. I was looking at a cheaper wheel to learn on and he recommended the KingSong 14D, I hesitated because it was a couple hundred dollars more, but decided to take his advice and I’m glad I did! This thing is top quality and the travel handle is perfect. The nice thing about it is I won’t grow out of it in a few weeks. I’m already riding all over my neighborhood and if I want to get more speed, I can unlock the speed limiter! Trust me, if your like me and just starting out the KingSong 14D is the one! Thank you eWheels", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "John Arnold", + "reviewRate": 5 + } + ], + "summary": { + "rating": 4.9, + "reviewsAmount": "42 Reviews" + } + }, + "url": "new-king-song-14d-420wh-battery800w-motor", + "name": "King Song 14D, 340/420Wh Battery, 800W Motor", + "category": "Entry & Mid-Range eWheels" + }, + { + "shortDescription": [ + "ES2 is rising rapidly to become one of the best selling Electric Scooters of all time", + "Packed full of features", + "Respectable specifications, gives you the option to purchase the basic Scooter first & then upgrade the battery to give you greater speed, range, performance at a manageable upgrade cost.", + "Cruise-control, both regenerative & mechanical braking, Bluetooth App, atmospheric LEDs, riding lights, kickstand, this Scooter is fully loaded & ready to go!", + "eWheels are delighted to be the first to offer the expandable ES2 & ES4 battery pack combo in North America" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "27.6lb", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2016/02/icon3.png" + }, + { + "heading": "Max Cruising Speed", + "data": "15.5 MPH", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2016/02/icon1.png" + }, + { + "heading": "Charge Time", + "data": "3hrs max", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2016/02/icon4.png" + }, + { + "heading": "Max Load", + "data": "220 lb", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2016/02/icon2.png" + }, + { + "heading": "Battery Capacity", + "data": "187Wh", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2016/02/Battery-Graph-1.png" + }, + { + "heading": "Range", + "data": "11/22 miles\nWith Extra battery", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2016/02/Range-Graph-1.png" + } + ], + "images": [ + { + "main": [ + { + "src": "ES2-Feature.jpg", + "srcset": [ + "ES2-Feature-66x66.jpg 66w", + "ES2-Feature-75x75.jpg 75w", + "ES2-Feature-100x100.jpg 100w", + "ES2-Feature-150x150.jpg 150w", + "ES2-Feature-200x200.jpg 200w", + "ES2-Feature-300x300.jpg 300w", + "ES2-Feature-400x400.jpg 400w", + "ES2-Feature-500x500.jpg 500w", + "ES2-Feature-600x600.jpg 600w", + "ES2-Feature-700x700.jpg 700w", + "ES2-Feature-768x768.jpg 768w", + "ES2-Feature-800x800.jpg 800w", + "ES2-Feature.jpg 801w" + ] + }, + { + "src": "ES2-Feature-700x700.jpg", + "srcset": [ + "ES2-Feature-66x66.jpg 66w", + "ES2-Feature-75x75.jpg 75w", + "ES2-Feature-100x100.jpg 100w", + "ES2-Feature-150x150.jpg 150w", + "ES2-Feature-200x200.jpg 200w", + "ES2-Feature-300x300.jpg 300w", + "ES2-Feature-400x400.jpg 400w", + "ES2-Feature-500x500.jpg 500w", + "ES2-Feature-600x600.jpg 600w", + "ES2-Feature-700x700.jpg 700w", + "ES2-Feature-768x768.jpg 768w", + "ES2-Feature-800x800.jpg 800w", + "ES2-Feature.jpg 801w" + ] + }, + { + "src": "Ninebot-ES2-LED-Oblique-Right.jpg", + "srcset": null + }, + { + "src": "Ninebot-ES2-LED-Oblique-Right-700x700.jpg", + "srcset": null + }, + { + "src": "Ninebot-ES2-Rear.jpg", + "srcset": null + }, + { + "src": "Ninebot-ES2-Rear-700x700.jpg", + "srcset": null + }, + { + "src": "ES4-Oblique.jpg", + "srcset": null + }, + { + "src": "ES4-Oblique-700x700.jpg", + "srcset": null + }, + { + "src": "Ninebot-ES2-Side.jpg", + "srcset": null + }, + { + "src": "Ninebot-ES2-Side-700x700.jpg", + "srcset": null + } + ] + } + ], + "relatedProducts": [ + { + "name": "NEW: Dualtron 3. 1,658Wh/2x 800W (1600W) Motors", + "url": "new-dualtron-3-1658wh-2x-800w-1600w-motors", + "price": 2992 + }, + { + "name": "NEW: Turbowheel Lightning, 957Wh/1165Wh Battery, 2x 1000W (3600W) Motors", + "url": "new-turbowheel-lightning-957wh-battery-2x-1000w-3600w-motors", + "price": 2050 + }, + { + "name": "NEW: Turbowheel Hornet, 921Wh Battery/2x 500W (2400W) Motors", + "url": "new-turbowheel-hornet-2x-500w-921wh", + "price": 1449 + }, + { + "name": "NEW: Dualtron Thunder 2,060Wh/2x 1,200W (2,400W) Motors", + "url": "new-dualtron-thunder-2060wh-2x-1200w-2400w-motors", + "price": 3925 + } + ], + "price": 589, + "reviews": { + "list": [ + { + "content": "We are just on day 2 of owning our King Song 14s. The whole family is learning to glide. We have a 6 yr old that is learning as well as 2 adults. One of us got it down pretty good. https://youtu.be/cvOb1ZWu5ec", + "reviewMeta": [ + "Posted 2 months ago", + "14.09.2020" + ], + "reviewAuthor": "Michele Pearson", + "reviewRate": 5 + }, + { + "content": "Quick, direct responses to questions. They are about efficiency. Twice I ordered parts (replacement tubes, & replacement charger) and both were delivered a day earlier than expected. Customer service communication is quick. You may not always get the answer you were hoping for, but you will get an answer, and you can trust it will be straight.", + "reviewMeta": [ + "Posted 3 months ago", + "21.08.2020" + ], + "reviewAuthor": "Barry Tq", + "reviewRate": 5 + }, + { + "content": "This thing is awesome! I rode one of the Bird scooters in Santa Monica on vacation, and I fell in love. This thing is WAY better than the Bird in several ways, the most important of which is the quality of construction. It feels solid! I purchased the extra battery, and the scooter absolutely flies. I live downtown in a large city, and it's been amazing to get around without needing to call a Lyft or drive and worry about parking. I also need to give a shout out to the folks at eWheels. I was nervous making a large purchase from a company I was unfamiliar with, so I reached out via email before I placed my order, and Jason was really great to work with. He was prompt and knowledgeable, and he even identified an issue with my order that I would have missed if he hadn't caught it. I am SO impressed with every aspect of this purchase.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Theron", + "reviewRate": 5 + } + ], + "summary": { + "rating": 5, + "reviewsAmount": "3 Reviews" + } + }, + "url": "new-ninebot-es2-es4-187wh-battery-300w-motor", + "name": "NEW: Ninebot-Segway ES2/ES4. 187Wh Battery/300W Motor", + "category": "Electric Scooters & eBikes" + }, + { + "shortDescription": [ + "High performance dual-800W motors, 37+ MPH scooter", + "Latest in the Speedway family, the 5 is the first to sport dual-motors for rapid acceleration, sustained high speed cruising & superb hill-climbing powers", + "Estimated range of the 1404Wh battery pack can provide up to 50 miles distance at moderate cruising speed", + "Main features: large 10″x 2.5″ tubeless tires, excellent suspension, dual-disc brakes, deck headlights, sturdy aviation grade aluminum frame, new EYE Dashboard, & fingerprint scanner ." + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "68 lb", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon3.jpg" + }, + { + "heading": "Cruising Speed", + "data": "~37 MPH", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon1.png" + }, + { + "heading": "Charge Time", + "data": "3 hrs\n*to 80% with optional Rapid-charger", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon4.png" + }, + { + "heading": "Max Load", + "data": "310 lb", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/icon2.png" + }, + { + "heading": "Battery Capacity", + "data": "1,404Wh", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/Battery-Graph-1.png" + }, + { + "heading": "Range", + "data": "~50 miles\nAt 20MPH under ideal conditions", + "iconSrc": "https://www.ewheels.com/wp-content/uploads/2019/07/Range-Graph-1.png" + } + ], + "images": [ + { + "main": [ + { + "src": "SW5-BK-Front-Oblique-Right.jpg", + "srcset": [ + "SW5-BK-Front-Oblique-Right-66x66.jpg 66w", + "SW5-BK-Front-Oblique-Right-75x75.jpg 75w", + "SW5-BK-Front-Oblique-Right-100x100.jpg 100w", + "SW5-BK-Front-Oblique-Right-150x150.jpg 150w", + "SW5-BK-Front-Oblique-Right-200x200.jpg 200w", + "SW5-BK-Front-Oblique-Right-300x300.jpg 300w", + "SW5-BK-Front-Oblique-Right-400x400.jpg 400w", + "SW5-BK-Front-Oblique-Right-500x500.jpg 500w", + "SW5-BK-Front-Oblique-Right-600x600.jpg 600w", + "SW5-BK-Front-Oblique-Right-700x700.jpg 700w", + "SW5-BK-Front-Oblique-Right-768x768.jpg 768w", + "SW5-BK-Front-Oblique-Right-800x800.jpg 800w", + "SW5-BK-Front-Oblique-Right.jpg 801w" + ] + }, + { + "src": "SW5-BK-Front-Oblique-Right-700x700.jpg", + "srcset": [ + "SW5-BK-Front-Oblique-Right-66x66.jpg 66w", + "SW5-BK-Front-Oblique-Right-75x75.jpg 75w", + "SW5-BK-Front-Oblique-Right-100x100.jpg 100w", + "SW5-BK-Front-Oblique-Right-150x150.jpg 150w", + "SW5-BK-Front-Oblique-Right-200x200.jpg 200w", + "SW5-BK-Front-Oblique-Right-300x300.jpg 300w", + "SW5-BK-Front-Oblique-Right-400x400.jpg 400w", + "SW5-BK-Front-Oblique-Right-500x500.jpg 500w", + "SW5-BK-Front-Oblique-Right-600x600.jpg 600w", + "SW5-BK-Front-Oblique-Right-700x700.jpg 700w", + "SW5-BK-Front-Oblique-Right-768x768.jpg 768w", + "SW5-BK-Front-Oblique-Right-800x800.jpg 800w", + "SW5-BK-Front-Oblique-Right.jpg 801w" + ] + }, + { + "src": "SW5-BK-Side-Folded.jpg", + "srcset": null + }, + { + "src": "SW5-BK-Side-Folded-700x700.jpg", + "srcset": null + }, + { + "src": "SW5-W-Side-Left.jpg", + "srcset": null + }, + { + "src": "SW5-W-Side-Left-700x700.jpg", + "srcset": null + }, + { + "src": "SW5-W-Oblique-Front-Left.jpg", + "srcset": null + }, + { + "src": "SW5-W-Oblique-Front-Left-700x700.jpg", + "srcset": null + } + ] + } + ], + "relatedProducts": [ + { + "name": "NEW: Ninebot-Segway ES2/ES4. 187Wh Battery/300W Motor", + "url": "new-ninebot-es2-es4-187wh-battery-300w-motor", + "price": 607 + }, + { + "name": "NEW: Dualtron Thunder 2,060Wh/2x 1,200W (2,400W) Motors", + "url": "new-dualtron-thunder-2060wh-2x-1200w-2400w-motors", + "price": 3925 + }, + { + "name": "NEW: Turbowheel Lightning, 957Wh/1165Wh Battery, 2x 1000W (3600W) Motors", + "url": "new-turbowheel-lightning-957wh-battery-2x-1000w-3600w-motors", + "price": 2050 + }, + { + "name": "NEW: Dualtron 3. 1,658Wh/2x 800W (1600W) Motors", + "url": "new-dualtron-3-1658wh-2x-800w-1600w-motors", + "price": 2992 + } + ], + "price": 2100, + "reviews": { + "list": [ + { + "content": "Brilliant scooter - got it because I scrapped my car recently and thought about just how much that 500 USD car ended up costing me in the two years I managed to keep it running. This is, by far, the more economical option.\n\nGreat construction, compared against a 250 USD Gotrax \"Rival\" I tried out to be sure I'd like a scooter vs. walking -- the first thing I noticed was that this uses proper metals for the dang screws, which is not a given in most product markets so yay for details. But the whole thing is quite sturdy construction, bolts where one would want bolts, etc. If I had to guess at a weak spot it'd be the stem clamp screws (added some loctite to fix the wobble after a couple days) and possibly the bolt that holds the stem to the body, not the one that locks the fold but the fixed one, so keep an eye on that one would be my bet. Speaking of the bolt that locks the body into folded and unfolded, that thing is solid and so much better than lever methods, for my money. \n\nI weigh right at 20 stone (280 lbs or so) and this thing doesn't even notice me. The fact the suspension holds up means it's probably pretty firm for a lighter rider. The \"gears\" for speed give you some \"out of the box\" flexibility, especially because they behave differently with eco mode or turbo mode selected, and slightly differently with single or dual motor selected. 2 in eco mode, single motor caps around 15mph or so, so that's a good place to practice riding. I feel really unsafe going over 20mph as of yet, so after some fiddling I found that setting the power % limiter (option P7 on the throttle, I think) to 65% I can put it in turbo, dual motor, and cap out at 18mph, while not losing speed on the grade coming home, and more traction in general. Also I vaguely worry about running in single-motor mode permanently, that might be entirely unfounded tho. \n\nCommute effect: 30-45 minutes (basically 30 to work and 45 coming home for obvious reasons) is now about 10 each way, 15 actual trip time (from backroom of store to my front door). So I can be making dinner by 7:20-30 AM rather than 8 or 8:15. Also set my wake-up alarm 15 minutes later. Real world effect is disproportionate to actual trip-time saved, and very worth it, especially on those days I just really don't want to walk home. On the negative side: Rain is a bigger problem vs walking -- it's (relatively) safe to ride in some rain, albeit slowly, but I wear glasses so riding while it is *currently* raining isn't an option, can't see a thing. Umbrellas aren't an option for obvious reasons.\n\nSturdiness: I'd dropped it several times, hit a bump and just end up ditching it and so forth, and also once hit a patch of mud, skidded into grass, the wheel just got stuck and flipped me and the thing over. I had some cleaning to do, to get mud out of the brake handle, brakes, off the throttle, etc., but the only harm it did was to the \"speedway\" logo light on the right side, which also works again now because it was just water got in the lens, not a crack in the filter. There's not a mark on the thing after a fair bit of flinging it around, learning to ride. So that's a good sign. \n\nBasically, the only complain I can think of is the brake disc makes noise because bits of dirt/sand get in it, which you can wipe off and they just get back in as soon as you ride it. I thought they were just too tight at first, I was wrong, and also had trouble getting them tight again, so try wiping the disc off before you loosen the brakes if its just an odd noise yer after.\n\nOnce, I started it and there was rather strong vibration, rattling the whole stem. Still not sure what that was, was around the front motor, the speed capped at 10mph on the speedometer and it felt like a \"let go\" when it went back to normal maybe 30 seconds later. If I had to guess, it was the electric brake - I turned that off for a ride and then back on and it hasn't happened since, but it may have been something else entirely, dunno.\n\nFor completion's sake, the fingerprint scanner was missing a screw that goes thru the two circles and holds it to the handlebars. I just used a machine screw I had lying around which fit. It's a small oversight and I've done plenty similar at my own job :P. \n\nSo yeah, really nothing to complain about here, get's me to points a and b without much fuss, only have to charge once a week, and that'll take no time at all when the fast charger gets here - as well as, unless I'm misunderstanding how kw hours are measured, it costs like 20-25c to charge this thing, vs. like 10+ a week in gas for a car even with the currently worryingly low price per gallon in the US. Moreover, it's enough I *could* go into town, take maybe half an hour at 20mph to hit the city limits, so maybe a 2 hour travel time for a trip to town, counting moving to the square and one or two other locations? Not bad. \n\nHere's the absolute best perspective I can put on it tho. This was 3.5 paychecks, for me, and I'm not disappointed. Whether yer looking for a commute vehicle and the cost is dear to you, or a toy for the weekend and it's not, thing's worth the cost.", + "reviewMeta": [ + "Posted 8 months ago", + "22.03.2020" + ], + "reviewAuthor": "Ailith", + "reviewRate": 5 + }, + { + "content": "I previously had an Emove Cruiser which is related to the Speedway V in design except that the Speedway 5 has dual motors, better suspension and is overall better in quality. I especially like the folding mechanism and the fact that it won't tip over when folded. Often I take the ferry and park the scooter under the stairway on the boat. Since the boat can rock back and forth it's much better to fold the scooter so it won't tip over and scratch or damage the handlebar or other parts.\n\nThis is a heavy duty scooter. Since I now live on the ground floor, it's not a big deal that the scooter is so heavy. \n\nGiven the excellent acceleration, I feel comfortable when having to drive with traffic in Brooklyn. Of course I would never get on the highway but it's great for surface streets when you have to keep up with traffic. Generally I ride on the bike lanes but occasionally have to switch to the road.\n\nI added a bar-end mirror on my left side handlebar so I can see if traffic is behind me... Unfortunately, I had to cut a hole in the handlebar end to accommodate the mirror but there isn't much room due to the cylinder spring that allows the handlebars to fold.\n\nI loved the deal with the fast charger and finger print scanner. I was thinking of purchasing from a different dealer but these two extras along with the warranty sealed the deal with eWheels.\n\nLooking forward to the warmer months as I simply gave it a test drive here in February in NYC. Even though we are having a mild winter, I prefer to ride in a bit warmer weather.", + "reviewMeta": [ + "Posted 9 months ago", + "17.02.2020" + ], + "reviewAuthor": "Edmund Trujillo", + "reviewRate": 5 + }, + { + "content": "", + "reviewMeta": [ + "Posted 11 months ago", + "29.11.2019" + ], + "reviewAuthor": "Eric Benjamin", + "reviewRate": 5 + }, + { + "content": "The speedway V is incredible for commuting! I commute through Washington DC everyday and it has made my commute faster. The acceleration is crazy fast and I can pass cars easily from a stop at red lights. Suspension is quite good, makes bumps and potholes not bad to go over at higher speeds. The battery life is good, with all the speed setting on max I use about 33% battery on my commute which is 16 miles with a lot of steep hills. If your riding on the roads it’s nice to be able accelerate fast to get around cars and out of the way of bad drivers. Make sure to adjust the brakes to your liking. Great brakes. All around a 5 star scooter and definitely worth the price$!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "John Brunner", + "reviewRate": 5 + }, + { + "content": "The Speedway 5 is a heavy, powerful, long range, hill crushing, street scooter. It's a legitimate commuting machine if you need to commute over moderately long distances, and/or over significant hills. \nI'm 185lbs and live in a very hilly area. The road to my house has a steep half mile ascent that would make any single motor scooter give up and die. The Speedway 5 cruises up the hillside at 20-25mph no problem. \nOn flat ground I've managed to hit a top speed of 34mph before I chickened out (*I was wearing a full face helmet, motorcycle jacket w/ ce rated padding, jeans, knee pads, and high tops.), and range is extremely impressive. The longest ride I've taken is 20 miles, and I used approx. 50% battery with steep hills included. I think I can get a solid 35 miles, real world around my house, and at least 5 miles more if I just rode on flat ground. \n\nOne thing to note, out of the box you will want to give it a through once over, and apply loctite to the screws around the handlebar & stem, adjust the handlebar accessories to your liking, check the tires, etc. \n\nLastly, eWheels.com has great service, and the entire process was smooth and pain free. Thank you.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Richard Choi", + "reviewRate": 5 + }, + { + "content": "After doing my research, I went with the SpeedWay V vs a Dualtron. Size and weight was a major point. I drive a Fiat 500e and I needed to be able to pull the eScooter in and out of the small space I have to work with. \n\nWas afraid the SpeedWay V was going to be underpowered compare to the Dualtron and thought maybe should have gotten the Dualtron after playing the order. But the SpeedWay V performance is amazing! Even with just having one wheel enabled, no turbo and all other settings set to default its fast enough. I’m about 150-160 lbs and was able to get up to 19mph. Enabling dual wheels was able to get up to 22-23mph and was pretty fast. Enabling Turbo made it even faster and didn’t really attempt to see how fast it would go I chickened out. This eScooter is quick and has plenty of torque. The suspension felt great. Brakes, I think the Rear could be stronger. The front brakes grips harder, I might need to adjust the rear. \n\nOut of the box, there is some assembly. The Brake handles and controls need to be adjusted to rider preference. Bolts should be check to made sure tight. I had bolts in the stem that was loose. Headlight needs to be installed. \n\nThe pin the locks the stem of the Scooter was really tight. The user manual doesn’t say how far the Pin needs to go into the hole, but figured out it needs to fully go all the way in till It stops. After some use it should get easier. \n\nNo mention of charge out of the box… The Scooter came with about 50% charge. I test drove it around for a bit and then charged it with the 5A Fast Charger Which I set it to 80% and 5A. Took about 2 hours. When powered up to verify Scooter showed 90%. I rode it day after about 5 miles with only 1 wheel enabled. I was down to 88%. ReGen still on default setting worked great. \n\nThe Right controls kept the sleeve that locks the handle bar from fully pulling out to fold down and would rub. Left side was fine. \n\nThe Handle Bar enter being square stock limits what you can mount to the handle bar. Since most items like headlights and phone holder mount to round tube bars. So aftermarket handle bar extenders need to be sourced to mount additional lights or items.\n\nThe headlight that comes with the scooter is Okay. I added additional 1600 Lumens headlight up top for better night time riding. \n\nOverall, the Scooter is a great performer and happy with it!", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Anonymous", + "reviewRate": 5 + }, + { + "content": "If you're looking for a high-powered and reliable scooter, the SW5 is what you're looking for. I've been using it as a commuter device and I've put over 200 miles on it so far. It's very powerful and handles hills with no problem. It can also hit almost 40mph. The only downside to this scooter is that its suspension is on the firmer end but I haven't had any issues even in rough NYC streets. Great purchase for anybody looking for a solid scooter.", + "reviewMeta": [ + "", + "" + ], + "reviewAuthor": "Eugene P.", + "reviewRate": 5 + } + ], + "summary": { + "rating": 5, + "reviewsAmount": "7 Reviews" + } + }, + "url": "new-speedway-5-1404wh-battery-3600w-peak-power", + "name": "NEW: Speedway 5, 1,404Wh Battery/3600W Peak Power", + "category": "Electric Scooters & eBikes" + }, + { + "shortDescription": [ + "Four replacement brake pads [ads (2x sets) for eScooter disc brakes", + "Compatible with most Dualtron, Speedway & Turbowheel scooters", + "Installation requires the calipers to be unfastened & pads slotted into place", + "Estimated installation time: 20-30 min" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "1 lbs" + }, + { + "heading": "Dimensions", + "data": "8 × 5 × 3 in" + } + ], + "images": [ + { + "main": [ + { + "src": "SW-DT-BRK-PAD.jpg", + "srcset": [ + "SW-DT-BRK-PAD-66x66.jpg 66w", + "SW-DT-BRK-PAD-75x75.jpg 75w", + "SW-DT-BRK-PAD-100x100.jpg 100w", + "SW-DT-BRK-PAD-150x150.jpg 150w", + "SW-DT-BRK-PAD-200x200.jpg 200w", + "SW-DT-BRK-PAD-300x300.jpg 300w", + "SW-DT-BRK-PAD-400x400.jpg 400w", + "SW-DT-BRK-PAD-500x500.jpg 500w", + "SW-DT-BRK-PAD-600x600.jpg 600w", + "SW-DT-BRK-PAD-700x700.jpg 700w", + "SW-DT-BRK-PAD-768x768.jpg 768w", + "SW-DT-BRK-PAD-800x800.jpg 800w", + "SW-DT-BRK-PAD.jpg 801w" + ] + }, + { + "src": "SW-DT-BRK-PAD-700x700.jpg", + "srcset": [ + "SW-DT-BRK-PAD-66x66.jpg 66w", + "SW-DT-BRK-PAD-75x75.jpg 75w", + "SW-DT-BRK-PAD-100x100.jpg 100w", + "SW-DT-BRK-PAD-150x150.jpg 150w", + "SW-DT-BRK-PAD-200x200.jpg 200w", + "SW-DT-BRK-PAD-300x300.jpg 300w", + "SW-DT-BRK-PAD-400x400.jpg 400w", + "SW-DT-BRK-PAD-500x500.jpg 500w", + "SW-DT-BRK-PAD-600x600.jpg 600w", + "SW-DT-BRK-PAD-700x700.jpg 700w", + "SW-DT-BRK-PAD-768x768.jpg 768w", + "SW-DT-BRK-PAD-800x800.jpg 800w", + "SW-DT-BRK-PAD.jpg 801w" + ] + } + ] + } + ], + "relatedProducts": [ + { + "name": "Turbowheel Hornet- Front Fender/Mud-guard", + "url": "turbowheel-hornet-front-fender-mud-guard", + "price": 27 + }, + { + "name": "Turbowheel Dart- Brake Lever Set", + "url": "turbowheel-dart-brake-lever-set", + "price": 36 + }, + { + "name": "Turbowheel Dart- LED Strips", + "url": "turbowheel-dart-led-strips", + "price": 26 + }, + { + "name": "Turbowheel- Dashboard/Throttle Unit", + "url": "turbowheel-dashboard-throttle-unit", + "price": 65 + } + ], + "price": 16, + "reviews": { + "list": [], + "summary": { + "summary": "", + "reviewsAmount": 0 + } + }, + "url": "scooter-brake-pads", + "name": "4x Scooter Brake Pads", + "category": "Parts|Turbowheel" + }, + { + "shortDescription": [ + "Front/rear brake levers for the Turbowheel Dart", + "Integrated into the lever is a motor disengagement activation switch", + "Brake cables purchased separately", + "Replacing requires running the attached wire running down to the controller bay", + "Estimated installation time: 40 min" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "1 lbs" + }, + { + "heading": "Dimensions", + "data": "10 × 10 × 1 in" + } + ], + "images": [ + { + "main": [ + { + "src": "SW-BRK-LEV.jpg", + "srcset": [ + "SW-BRK-LEV-66x66.jpg 66w", + "SW-BRK-LEV-75x75.jpg 75w", + "SW-BRK-LEV-100x100.jpg 100w", + "SW-BRK-LEV-150x150.jpg 150w", + "SW-BRK-LEV-200x200.jpg 200w", + "SW-BRK-LEV-300x300.jpg 300w", + "SW-BRK-LEV-400x400.jpg 400w", + "SW-BRK-LEV-500x500.jpg 500w", + "SW-BRK-LEV-600x600.jpg 600w", + "SW-BRK-LEV-700x700.jpg 700w", + "SW-BRK-LEV-768x768.jpg 768w", + "SW-BRK-LEV-800x800.jpg 800w", + "SW-BRK-LEV.jpg 801w" + ] + }, + { + "src": "SW-BRK-LEV-700x700.jpg", + "srcset": [ + "SW-BRK-LEV-66x66.jpg 66w", + "SW-BRK-LEV-75x75.jpg 75w", + "SW-BRK-LEV-100x100.jpg 100w", + "SW-BRK-LEV-150x150.jpg 150w", + "SW-BRK-LEV-200x200.jpg 200w", + "SW-BRK-LEV-300x300.jpg 300w", + "SW-BRK-LEV-400x400.jpg 400w", + "SW-BRK-LEV-500x500.jpg 500w", + "SW-BRK-LEV-600x600.jpg 600w", + "SW-BRK-LEV-700x700.jpg 700w", + "SW-BRK-LEV-768x768.jpg 768w", + "SW-BRK-LEV-800x800.jpg 800w", + "SW-BRK-LEV.jpg 801w" + ] + } + ] + } + ], + "relatedProducts": [ + { + "name": "Turbowheel Dart- Front Fender/Mud-guard", + "url": "turbowheel-dart-front-fender-mud-guard", + "price": 23 + }, + { + "name": "4x Scooter Brake Pads", + "url": "scooter-brake-pads", + "price": 16 + }, + { + "name": "Turbowheel Hornet- Rear Fender/Mud-guard", + "url": "turbowheel-hornet-rear-fender-mud-guard", + "price": 32 + }, + { + "name": "Turbowheel Hornet- Front Fender/Mud-guard", + "url": "turbowheel-hornet-front-fender-mud-guard", + "price": 27 + } + ], + "price": 36, + "reviews": { + "list": [], + "summary": { + "summary": "", + "reviewsAmount": 0 + } + }, + "url": "turbowheel-dart-brake-lever-set", + "name": "Turbowheel Dart- Brake Lever Set", + "category": "Parts|Turbowheel" + }, + { + "shortDescription": [ + "Replacement front cover panel to the interior deck on the dart", + "Wires enter from the center slot & brake line through the right side", + "Screws into the deck with two screws at the top & another two from below", + "Estimated installation time: 15 min" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "1 lbs" + }, + { + "heading": "Dimensions", + "data": "8 × 5 × 3 in" + } + ], + "images": [ + { + "main": [ + { + "src": "TW-DART-FRT-COV.jpg", + "srcset": [ + "TW-DART-FRT-COV-66x66.jpg 66w", + "TW-DART-FRT-COV-75x75.jpg 75w", + "TW-DART-FRT-COV-100x100.jpg 100w", + "TW-DART-FRT-COV-150x150.jpg 150w", + "TW-DART-FRT-COV-200x200.jpg 200w", + "TW-DART-FRT-COV-300x300.jpg 300w", + "TW-DART-FRT-COV-400x400.jpg 400w", + "TW-DART-FRT-COV-500x500.jpg 500w", + "TW-DART-FRT-COV-600x600.jpg 600w", + "TW-DART-FRT-COV-700x700.jpg 700w", + "TW-DART-FRT-COV-768x768.jpg 768w", + "TW-DART-FRT-COV-800x800.jpg 800w", + "TW-DART-FRT-COV.jpg 801w" + ] + }, + { + "src": "TW-DART-FRT-COV-700x700.jpg", + "srcset": [ + "TW-DART-FRT-COV-66x66.jpg 66w", + "TW-DART-FRT-COV-75x75.jpg 75w", + "TW-DART-FRT-COV-100x100.jpg 100w", + "TW-DART-FRT-COV-150x150.jpg 150w", + "TW-DART-FRT-COV-200x200.jpg 200w", + "TW-DART-FRT-COV-300x300.jpg 300w", + "TW-DART-FRT-COV-400x400.jpg 400w", + "TW-DART-FRT-COV-500x500.jpg 500w", + "TW-DART-FRT-COV-600x600.jpg 600w", + "TW-DART-FRT-COV-700x700.jpg 700w", + "TW-DART-FRT-COV-768x768.jpg 768w", + "TW-DART-FRT-COV-800x800.jpg 800w", + "TW-DART-FRT-COV.jpg 801w" + ] + } + ] + } + ], + "relatedProducts": [ + { + "name": "Turbowheel Dart- Brake Lever Set", + "url": "turbowheel-dart-brake-lever-set", + "price": 36 + }, + { + "name": "4x Scooter Brake Pads", + "url": "scooter-brake-pads", + "price": 16 + }, + { + "name": "Turbowheel Dart- LED Strips", + "url": "turbowheel-dart-led-strips", + "price": 26 + }, + { + "name": "Turbowheel Hornet- Rear Fender/Mud-guard", + "url": "turbowheel-hornet-rear-fender-mud-guard", + "price": 32 + } + ], + "price": 26, + "reviews": { + "list": [], + "summary": { + "summary": "", + "reviewsAmount": 0 + } + }, + "url": "turbowheel-dart-front-cover-panel", + "name": "Turbowheel Dart- Front Cover Panel", + "category": "Parts|Turbowheel" + }, + { + "shortDescription": [ + "Durable front mud-guard made from injected polycarbonate", + "Secured with two bolts from underneath—Wheel needs to come off to fit", + "Estimated time-to-install: 15 minutes" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "1 lbs" + }, + { + "heading": "Dimensions", + "data": "10 × 10 × 3 in" + } + ], + "images": [ + { + "main": [ + { + "src": "TW-DART-FRT-FEND-1.jpg", + "srcset": [ + "TW-DART-FRT-FEND-1-66x66.jpg 66w", + "TW-DART-FRT-FEND-1-75x75.jpg 75w", + "TW-DART-FRT-FEND-1-100x100.jpg 100w", + "TW-DART-FRT-FEND-1-150x150.jpg 150w", + "TW-DART-FRT-FEND-1-200x200.jpg 200w", + "TW-DART-FRT-FEND-1-300x300.jpg 300w", + "TW-DART-FRT-FEND-1-400x400.jpg 400w", + "TW-DART-FRT-FEND-1-500x500.jpg 500w", + "TW-DART-FRT-FEND-1-600x600.jpg 600w", + "TW-DART-FRT-FEND-1-700x700.jpg 700w", + "TW-DART-FRT-FEND-1-768x768.jpg 768w", + "TW-DART-FRT-FEND-1-800x800.jpg 800w", + "TW-DART-FRT-FEND-1.jpg 801w" + ] + }, + { + "src": "TW-DART-FRT-FEND-1-700x700.jpg", + "srcset": [ + "TW-DART-FRT-FEND-1-66x66.jpg 66w", + "TW-DART-FRT-FEND-1-75x75.jpg 75w", + "TW-DART-FRT-FEND-1-100x100.jpg 100w", + "TW-DART-FRT-FEND-1-150x150.jpg 150w", + "TW-DART-FRT-FEND-1-200x200.jpg 200w", + "TW-DART-FRT-FEND-1-300x300.jpg 300w", + "TW-DART-FRT-FEND-1-400x400.jpg 400w", + "TW-DART-FRT-FEND-1-500x500.jpg 500w", + "TW-DART-FRT-FEND-1-600x600.jpg 600w", + "TW-DART-FRT-FEND-1-700x700.jpg 700w", + "TW-DART-FRT-FEND-1-768x768.jpg 768w", + "TW-DART-FRT-FEND-1-800x800.jpg 800w", + "TW-DART-FRT-FEND-1.jpg 801w" + ] + }, + { + "src": "MINI4-FEND-F-2.jpg", + "srcset": null + }, + { + "src": "MINI4-FEND-F-2-700x700.jpg", + "srcset": null + }, + { + "src": "TW-DART-FRT-FEND-2.jpg", + "srcset": null + }, + { + "src": "TW-DART-FRT-FEND-2-700x700.jpg", + "srcset": null + }, + { + "src": "TW-DART-FRT-FEND-3.jpg", + "srcset": null + }, + { + "src": "TW-DART-FRT-FEND-3-700x700.jpg", + "srcset": null + } + ] + } + ], + "relatedProducts": [ + { + "name": "Turbowheel Hornet- Key Ignition & Voltmeter", + "url": "turbowheel-hornet-key-ignition-voltmeter", + "price": 45 + }, + { + "name": "Turbowheel- Dashboard/Throttle Unit", + "url": "turbowheel-dashboard-throttle-unit", + "price": 65 + }, + { + "name": "Scooter Rear Brake Line Cable", + "url": "mini-4-rear-brake-line-cable", + "price": 19 + }, + { + "name": "Turbowheel Dart- Front Cover Panel", + "url": "turbowheel-dart-front-cover-panel", + "price": 26 + } + ], + "price": 23, + "reviews": { + "list": [], + "summary": { + "summary": "", + "reviewsAmount": 0 + } + }, + "url": "turbowheel-dart-front-fender-mud-guard", + "name": "Turbowheel Dart- Front Fender/Mud-guard", + "category": "Parts|Turbowheel" + }, + { + "shortDescription": [ + "Replacement set of LED strips for the Dart", + "Single color, Blue", + "Installed to the side of the deck into the low voltage DC converter", + "Activated on the Dashboard, by holding the ‘Mode’ button for 3 seconds", + "Estimated installation time: 40 min" + ], + "technicalSpecs": [ + { + "heading": "Weight", + "data": "1 lbs" + }, + { + "heading": "Dimensions", + "data": "8 × 5 × 3 in" + } + ], + "images": [ + { + "main": [ + { + "src": "TW-DART-LED.jpg", + "srcset": [ + "TW-DART-LED-66x66.jpg 66w", + "TW-DART-LED-75x75.jpg 75w", + "TW-DART-LED-100x100.jpg 100w", + "TW-DART-LED-150x150.jpg 150w", + "TW-DART-LED-200x200.jpg 200w", + "TW-DART-LED-300x300.jpg 300w", + "TW-DART-LED-400x400.jpg 400w", + "TW-DART-LED-500x500.jpg 500w", + "TW-DART-LED-600x600.jpg 600w", + "TW-DART-LED-700x700.jpg 700w", + "TW-DART-LED-768x768.jpg 768w", + "TW-DART-LED-800x800.jpg 800w", + "TW-DART-LED.jpg 801w" + ] + }, + { + "src": "TW-DART-LED-700x700.jpg", + "srcset": [ + "TW-DART-LED-66x66.jpg 66w", + "TW-DART-LED-75x75.jpg 75w", + "TW-DART-LED-100x100.jpg 100w", + "TW-DART-LED-150x150.jpg 150w", + "TW-DART-LED-200x200.jpg 200w", + "TW-DART-LED-300x300.jpg 300w", + "TW-DART-LED-400x400.jpg 400w", + "TW-DART-LED-500x500.jpg 500w", + "TW-DART-LED-600x600.jpg 600w", + "TW-DART-LED-700x700.jpg 700w", + "TW-DART-LED-768x768.jpg 768w", + "TW-DART-LED-800x800.jpg 800w", + "TW-DART-LED.jpg 801w" + ] + } + ] + } + ], + "relatedProducts": [ + { + "name": "Turbowheel Hornet- Brake Lever", + "url": "turbowheel-hornet-brake-lever", + "price": 39 + }, + { + "name": "Scooter Rear Brake Line Cable", + "url": "mini-4-rear-brake-line-cable", + "price": 19 + }, + { + "name": "Turbowheel Hornet- Front Fender/Mud-guard", + "url": "turbowheel-hornet-front-fender-mud-guard", + "price": 27 + }, + { + "name": "Turbowheel Dart- Front Cover Panel", + "url": "turbowheel-dart-front-cover-panel", + "price": 26 + } + ], + "price": 26, + "reviews": { + "list": [], + "summary": { + "summary": "", + "reviewsAmount": 0 + } + }, + "url": "turbowheel-dart-led-strips", + "name": "Turbowheel Dart- LED Strips", + "category": "Parts|Turbowheel" + } +] \ No newline at end of file diff --git a/tsconfig.backend.json b/tsconfig.backend.json index 3adbf4bf..0cbed5d2 100644 --- a/tsconfig.backend.json +++ b/tsconfig.backend.json @@ -1,12 +1,13 @@ { "extends": "./tsconfig.json", - "include": ["./src/database/**/*.ts", "./src/middleware/**/*.ts"], + "include": ["./src/database/**/*.ts", "./src/middleware/**/*.ts", "./src/database/populate/**.json"], "compilerOptions": { "target": "ES2020", "module": "commonjs", "moduleResolution": "node", "esModuleInterop": true, "allowSyntheticDefaultImports": true, + "resolveJsonModule": true, "outDir": "./dist" } } From 0e1170002451cf2ca1b5e39070e3d1c5140b5552 Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Fri, 9 Apr 2021 20:09:13 +0200 Subject: [PATCH 24/39] Remove step of copying unavailable /dist folder while building docker image - that folder is already available in image after building app; --- Dockerfile | 2 -- 1 file changed, 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index b3d972f7..16ca082e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,8 +10,6 @@ COPY ./utils ./utils COPY .env .babelrc tsconfig* webpack.config.js ./ RUN npm run build -COPY ./dist ./ - # TODO: automate database population process on Docker image build. # Need to handle race condition between starting MongoDB. #WORKDIR /app/dist/src/database/populate From 9c1c1444d73db3f80660b52d776099aae6dc3f9a Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Fri, 9 Apr 2021 21:55:55 +0200 Subject: [PATCH 25/39] Fix lowercasing repository name from variable in GitHub Action; --- .github/workflows/build-docker-image.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 996cb0f2..b56c02eb 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -20,14 +20,16 @@ jobs: #- run: npm run build - uses: docker/setup-buildx-action@v1 + - name: Login to Docker registry on GitHub uses: docker/login-action@v1 with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} + - name: Lowercase author and repository name - run: echo "REPO_LOWERCASE=ghcr.io/${GITHUB_REPOSITORY,,}" >> $GITHUB_ENV + run: echo "REPO_LOWERCASE=ghcr.io/${${{github.repository}},,}" >> $GITHUB_ENV - name: Build and push uses: docker/build-push-action@v2 with: From e45e822e544a7f832816c9ab6bdb233baddf8d63 Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Fri, 9 Apr 2021 22:01:50 +0200 Subject: [PATCH 26/39] Another fix of gh repository variable; --- .github/workflows/build-docker-image.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index b56c02eb..7528640f 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -20,7 +20,7 @@ jobs: #- run: npm run build - uses: docker/setup-buildx-action@v1 - + - name: Login to Docker registry on GitHub uses: docker/login-action@v1 with: @@ -29,7 +29,7 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} - name: Lowercase author and repository name - run: echo "REPO_LOWERCASE=ghcr.io/${${{github.repository}},,}" >> $GITHUB_ENV + run: echo "REPO_LOWERCASE=ghcr.io/${$GITHUB_REPOSITORY,,}" >> $GITHUB_ENV - name: Build and push uses: docker/build-push-action@v2 with: From bf4a177ccb119bd35f872b79868c9087eb233126 Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Fri, 9 Apr 2021 23:07:13 +0200 Subject: [PATCH 27/39] Check whether hardcoded repository URL is ok for GH action; --- .github/workflows/build-docker-image.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 7528640f..e25c9d75 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -29,7 +29,7 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} - name: Lowercase author and repository name - run: echo "REPO_LOWERCASE=ghcr.io/${$GITHUB_REPOSITORY,,}" >> $GITHUB_ENV + run: echo "REPO_LOWERCASE=ghcr.io/scriptychris/fake-pev-shopping" >> $GITHUB_ENV - name: Build and push uses: docker/build-push-action@v2 with: From 1c31833fabeded2ac53a84cf1c89f4cdb2ea78e3 Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Sat, 10 Apr 2021 00:45:55 +0200 Subject: [PATCH 28/39] Try setting docker image build tag explicitly; --- .github/workflows/build-docker-image.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index e25c9d75..7bc15899 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -34,4 +34,4 @@ jobs: uses: docker/build-push-action@v2 with: push: true - tags: ${{ env.REPO_LOWERCASE }} + tags: ghcr.io/scriptychris/fake-pev-shopping:latest #${{ env.REPO_LOWERCASE }} From 4f900b6cf27736502bc940990d407d1ce8a2a589 Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Sat, 10 Apr 2021 17:49:46 +0200 Subject: [PATCH 29/39] Add tmate GH action to debug 403 error; --- .github/workflows/build-docker-image.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 7bc15899..deb6ae78 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -28,6 +28,10 @@ jobs: username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} + # just for debugging + - name: Setup tmate session + uses: mxschmitt/action-tmate@v3 + - name: Lowercase author and repository name run: echo "REPO_LOWERCASE=ghcr.io/scriptychris/fake-pev-shopping" >> $GITHUB_ENV - name: Build and push From 73f12c2a34cf5570d4732fae386a94e25c23791c Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Sat, 10 Apr 2021 18:01:00 +0200 Subject: [PATCH 30/39] Recover setting REPO_LOWERCASE variable from GH env var and move running terminal debugging to the end of workflow; --- .github/workflows/build-docker-image.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index deb6ae78..b2b8539e 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -28,14 +28,15 @@ jobs: username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - # just for debugging - - name: Setup tmate session - uses: mxschmitt/action-tmate@v3 - - name: Lowercase author and repository name - run: echo "REPO_LOWERCASE=ghcr.io/scriptychris/fake-pev-shopping" >> $GITHUB_ENV + #run: echo "REPO_LOWERCASE=ghcr.io/scriptychris/fake-pev-shopping" >> $GITHUB_ENV + run: echo "REPO_LOWERCASE=ghcr.io/${$GITHUB_REPOSITORY,,}" >> $GITHUB_ENV - name: Build and push uses: docker/build-push-action@v2 with: push: true tags: ghcr.io/scriptychris/fake-pev-shopping:latest #${{ env.REPO_LOWERCASE }} + + # just for debugging + - name: Setup tmate session + uses: mxschmitt/action-tmate@v3 From 9d81a5ceeb97577def992f658ef034e7b661e8ae Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Sat, 10 Apr 2021 18:08:28 +0200 Subject: [PATCH 31/39] Try another GH env resolving way; --- .github/workflows/build-docker-image.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index b2b8539e..da3826b2 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -30,13 +30,14 @@ jobs: - name: Lowercase author and repository name #run: echo "REPO_LOWERCASE=ghcr.io/scriptychris/fake-pev-shopping" >> $GITHUB_ENV - run: echo "REPO_LOWERCASE=ghcr.io/${$GITHUB_REPOSITORY,,}" >> $GITHUB_ENV + run: echo "REPO_LOWERCASE=ghcr.io/${GITHUB_REPOSITORY,,}" >> $GITHUB_ENV + + # just for debugging + - name: Setup tmate session + uses: mxschmitt/action-tmate@v3 + - name: Build and push uses: docker/build-push-action@v2 with: push: true tags: ghcr.io/scriptychris/fake-pev-shopping:latest #${{ env.REPO_LOWERCASE }} - - # just for debugging - - name: Setup tmate session - uses: mxschmitt/action-tmate@v3 From e2354606e48a09cf25872cdbdcf5456b2de2cbeb Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Mon, 12 Apr 2021 09:35:47 +0200 Subject: [PATCH 32/39] Try to manually push docker image to registry; --- .github/workflows/build-docker-image.yml | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index da3826b2..02ad4076 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -32,12 +32,15 @@ jobs: #run: echo "REPO_LOWERCASE=ghcr.io/scriptychris/fake-pev-shopping" >> $GITHUB_ENV run: echo "REPO_LOWERCASE=ghcr.io/${GITHUB_REPOSITORY,,}" >> $GITHUB_ENV + - name: Manually push docker image to registry + run: docker push ghcr.io/scriptychris/fake-pev-shopping:latest + + #- name: Build and push + # uses: docker/build-push-action@v2 + # with: + # push: true + # tags: ghcr.io/scriptychris/fake-pev-shopping:latest #${{ env.REPO_LOWERCASE }} + # just for debugging - name: Setup tmate session - uses: mxschmitt/action-tmate@v3 - - - name: Build and push - uses: docker/build-push-action@v2 - with: - push: true - tags: ghcr.io/scriptychris/fake-pev-shopping:latest #${{ env.REPO_LOWERCASE }} + uses: mxschmitt/action-tmate@v3 \ No newline at end of file From 133e7959641cabb528972b512709b73fb580c39a Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Mon, 12 Apr 2021 09:55:22 +0200 Subject: [PATCH 33/39] Explicitly add tag to docker image while building it; --- docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker-compose.yml b/docker-compose.yml index 9e4618e2..38a04c0d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,6 +8,7 @@ services: node: build: ./ + image: fake-pev-shopping ports: - 3000:3000 depends_on: From 628a0c4aa3b358b5efea488e361e1291d8f195aa Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Mon, 12 Apr 2021 10:07:34 +0200 Subject: [PATCH 34/39] Exclude registry and repo names from tag; --- .github/workflows/build-docker-image.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 02ad4076..7922a943 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -33,7 +33,7 @@ jobs: run: echo "REPO_LOWERCASE=ghcr.io/${GITHUB_REPOSITORY,,}" >> $GITHUB_ENV - name: Manually push docker image to registry - run: docker push ghcr.io/scriptychris/fake-pev-shopping:latest + run: docker push fake-pev-shopping:latest #- name: Build and push # uses: docker/build-push-action@v2 From 225f916b9cd875ef5ccc549907e7c6b799d185c5 Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Mon, 12 Apr 2021 10:15:11 +0200 Subject: [PATCH 35/39] Verbosely tag image before pushing it to registry; --- .github/workflows/build-docker-image.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 7922a943..c5587bed 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -33,7 +33,9 @@ jobs: run: echo "REPO_LOWERCASE=ghcr.io/${GITHUB_REPOSITORY,,}" >> $GITHUB_ENV - name: Manually push docker image to registry - run: docker push fake-pev-shopping:latest + run: > + docker tag fake-pev-shopping ghcr.io/scriptychris/fake-pev-shopping:latest && + docker push ghcr.io/scriptychris/fake-pev-shopping:latest #- name: Build and push # uses: docker/build-push-action@v2 From 00b61fc9ceb3570fb8f5d0c3d8bc5018b8cf21b3 Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Mon, 12 Apr 2021 13:57:27 +0200 Subject: [PATCH 36/39] Move debugging before manual pushing docker image; --- .github/workflows/build-docker-image.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index c5587bed..77c620fb 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -31,6 +31,10 @@ jobs: - name: Lowercase author and repository name #run: echo "REPO_LOWERCASE=ghcr.io/scriptychris/fake-pev-shopping" >> $GITHUB_ENV run: echo "REPO_LOWERCASE=ghcr.io/${GITHUB_REPOSITORY,,}" >> $GITHUB_ENV + + # just for debugging + - name: Setup tmate session + uses: mxschmitt/action-tmate@v3 - name: Manually push docker image to registry run: > @@ -41,8 +45,4 @@ jobs: # uses: docker/build-push-action@v2 # with: # push: true - # tags: ghcr.io/scriptychris/fake-pev-shopping:latest #${{ env.REPO_LOWERCASE }} - - # just for debugging - - name: Setup tmate session - uses: mxschmitt/action-tmate@v3 \ No newline at end of file + # tags: ghcr.io/scriptychris/fake-pev-shopping:latest #${{ env.REPO_LOWERCASE }} \ No newline at end of file From d18e4fed28dac8b69a3ac533d20fb36334c93804 Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Mon, 12 Apr 2021 15:12:25 +0200 Subject: [PATCH 37/39] Try building image on local GH action vm; --- .github/workflows/build-docker-image.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 77c620fb..f01b1edb 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -32,6 +32,13 @@ jobs: #run: echo "REPO_LOWERCASE=ghcr.io/scriptychris/fake-pev-shopping" >> $GITHUB_ENV run: echo "REPO_LOWERCASE=ghcr.io/${GITHUB_REPOSITORY,,}" >> $GITHUB_ENV + - name: Build and push + uses: docker/build-push-action@v2 + with: + # push: true + outputs: type=local,dest=./ + tags: ghcr.io/scriptychris/fake-pev-shopping:latest #${{ env.REPO_LOWERCASE }} + # just for debugging - name: Setup tmate session uses: mxschmitt/action-tmate@v3 @@ -39,10 +46,4 @@ jobs: - name: Manually push docker image to registry run: > docker tag fake-pev-shopping ghcr.io/scriptychris/fake-pev-shopping:latest && - docker push ghcr.io/scriptychris/fake-pev-shopping:latest - - #- name: Build and push - # uses: docker/build-push-action@v2 - # with: - # push: true - # tags: ghcr.io/scriptychris/fake-pev-shopping:latest #${{ env.REPO_LOWERCASE }} \ No newline at end of file + docker push ghcr.io/scriptychris/fake-pev-shopping:latest \ No newline at end of file From 519e02523c4b0693762a5f05a1888ac5404ac408 Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Mon, 12 Apr 2021 15:35:56 +0200 Subject: [PATCH 38/39] Set explicit path for local docker image built; --- .github/workflows/build-docker-image.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index f01b1edb..eb42f966 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -36,7 +36,7 @@ jobs: uses: docker/build-push-action@v2 with: # push: true - outputs: type=local,dest=./ + outputs: type=local,dest=./built-docker-image tags: ghcr.io/scriptychris/fake-pev-shopping:latest #${{ env.REPO_LOWERCASE }} # just for debugging From 661a5e861cebc31c319f7c834ff1acbf36baf1ad Mon Sep 17 00:00:00 2001 From: Krzysztof Pawelec Date: Mon, 12 Apr 2021 20:10:34 +0200 Subject: [PATCH 39/39] Switch building app's docker image on PR to just run unit tests; Building production image will be fixed later; --- .github/workflows/build-docker-image.yml | 10 ++-------- .github/workflows/integrate.yml | 3 +-- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index eb42f966..9c48363b 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -4,7 +4,7 @@ on: #push: #branches: [ develop ] pull_request: - branches: [ develop ] + branches: [ empty ] jobs: build-docker-image: @@ -12,12 +12,6 @@ jobs: steps: - uses: actions/checkout@v2 - #- uses: actions/setup-node@v2 - #with: - #node-version: 14.15.5 - - #- run: npm ci - #- run: npm run build - uses: docker/setup-buildx-action@v1 @@ -39,7 +33,7 @@ jobs: outputs: type=local,dest=./built-docker-image tags: ghcr.io/scriptychris/fake-pev-shopping:latest #${{ env.REPO_LOWERCASE }} - # just for debugging + # for debugging purposes - name: Setup tmate session uses: mxschmitt/action-tmate@v3 diff --git a/.github/workflows/integrate.yml b/.github/workflows/integrate.yml index 8f1c53aa..cc5dac8e 100644 --- a/.github/workflows/integrate.yml +++ b/.github/workflows/integrate.yml @@ -1,8 +1,7 @@ name: Integrate on: - issues: - #pull_request: + pull_request: branches: [ develop ] jobs: