├── .babelrc ├── .gitignore ├── README.md ├── dist ├── Args.js ├── Args.js.map ├── JSONP_PromiseAPI.js ├── JSONP_PromiseAPI.js.map ├── PanelHeader.js ├── PanelHeader.js.map ├── PanelHeaderInternal.js ├── PanelHeaderInternal.js.map ├── PromiseAPI.js ├── PromiseAPI.js.map ├── ReverseHorizontalScroll.js ├── ReverseHorizontalScroll.js.map ├── ScrollArea.js ├── ScrollArea.js.map ├── SetWebTheme.js ├── SetWebTheme.js.map ├── index.js ├── index.js.map ├── localStorage.js └── localStorage.js.map ├── index.js ├── package.json ├── src ├── Args.js ├── JSONP_PromiseAPI.js ├── PanelHeader.js ├── PanelHeaderInternal.js ├── PromiseAPI.js ├── ReverseHorizontalScroll.js ├── ScrollArea.js ├── SetWebTheme.js ├── index.js └── localStorage.js ├── utils ├── SignVerify.js └── setAndroidTheme.js └── webpack.config.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["@babel/preset-env", "@babel/preset-react"], 3 | "plugins": ["@babel/plugin-proposal-class-properties", "@babel/plugin-proposal-object-rest-spread"] 4 | } 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | .idea/ 3 | node_modules/ 4 | package-lock.json 5 | yarn.lock 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # VK Mini Apps Utils 2 | 3 | ## Установка 4 | ``` 5 | npm i github:FlyInk13/VKAppsUtils --save 6 | ``` 7 | 8 | ## Frontend: 9 | ### utils/setAndroidTheme - Заменяет тему на android, если в URL есть web=1. 10 | ```jsx 11 | // Вставлять в index.js 12 | import "vkappsutils/utils/setAndroidTheme"; 13 | ``` 14 | 15 | ### ReverseHorizontalScroll - HorizontalScroll с предопределенным вертикальным скроллом. 16 | ```jsx 17 | import ReverseHorizontalScroll from "vkappsutils/dist/ReverseHorizontalScroll"; 18 | 19 | 20 |
21 | ... 22 |
23 |
24 | ``` 25 | 26 | ### Args - Выводит параметры location.search. 27 | ```jsx 28 | import getArgs from "vkappsutils/dist/Args"; 29 | 30 | console.log(getArgs()); // { web: "1", access_token_settings: ... } 31 | console.log(getArgs(false)); // { web: "1", vk_access_token_settings ... } 32 | ``` 33 | 34 | ### ls - localStorage или объект в случае ошибки 35 | ```jsx 36 | import ls from "vkappsutils/dist/localStorage"; 37 | ``` 38 | 39 | ### PanelHeaderFull - Обертка над PanelHeaderInternal, вставляющая для веба кнопку разворачивания приложения на весь экран 40 | ```jsx 41 | import PanelHeaderFull from "vkappsutils/dist/PanelHeader"; 42 | ``` 43 | 44 | ### PanelHeaderInternal - Обертка над PanelHeader, разрешающая вставлять кнопки в правую сторону 45 | ```jsx 46 | import PanelHeaderInternal from "vkappsutils/dist/PanelHeaderInternal"; 47 | ``` 48 | 49 | ### PromiseAPI - Модуль для работы с API с поддержкой очереди и ввода кода с картинки 50 | ### JSONP_PromiseAPI - Модуль для работы с API через JSONP 51 | ```jsx 52 | import PromiseAPI from "vkappsutils/dist/PromiseAPI"; 53 | 54 | class App extends React.Component { 55 | constructor(props) { 56 | super(props); 57 | 58 | this.api = new PromiseAPI(); 59 | this.api.view = this; // для управления setState({ popout, captchaCode }) 60 | 61 | connect.subscribe((event) => { 62 | switch(event.detail.type) { 63 | case 'VKWebAppAccessTokenReceived': 64 | // или 65 | case 'VKWebAppCommunityAccessTokenReceived': 66 | const token = event.detail.data.access_token; 67 | this.api.access_token = token; // Устанавливаем токен 68 | } 69 | }); 70 | } 71 | 72 | testMethod() { 73 | this.api.callMethod('storage.get', { 74 | // Параметры для метода 75 | }).then((res) => { 76 | console.log(res) 77 | }).catch(console.error); 78 | } 79 | } 80 | ``` 81 | 82 | ### ScrollArea - Обертка для включения прокрутки в Alert 83 | ```jsx 84 | import ScrollArea from "vkappsutils/dist/ScrollArea"; 85 | 86 | // ... 87 | 88 | 89 | // selector - Для каких элементов нужно включить скролл 90 | 91 | 92 | 93 | ``` 94 | 95 | ### SetWebTheme - Обертка над vkui-connect автоматически устанавливающая тему 96 | ```jsx 97 | import SetWebTheme from "vkappsutils/dist/SetWebTheme"; 98 | 99 | SetWebTheme(/web=1/.test(location.href)) // Если нужно установить тему bright_light для веб версии 100 | ``` 101 | 102 | ## Backend (Node.js) 103 | ### utils/signVerify - Проверяет подпись (sign) приложения 104 | ```js 105 | const signVerify = require('vkappsutils/utils/signVerify'); 106 | const url = '...'; // location.url | search; 107 | const clientSecret = ''; // Защищённый ключ из настроек приложения 108 | 109 | signVerify(url, clientSecret); 110 | 111 | ``` 112 | -------------------------------------------------------------------------------- /dist/Args.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports["default"] = void 0; 7 | 8 | function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } 9 | 10 | function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } 11 | 12 | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } 13 | 14 | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } 15 | 16 | function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } 17 | 18 | function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } 19 | 20 | /** 21 | * Выводит параметры location.search 22 | * 23 | * @param clean [true] - Выводить только vk_ ключи и вырезать префикс 24 | * @returns {{}} 25 | */ 26 | function getArgs() { 27 | var clean = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; 28 | return window.location.search.substr(1).split("&").reduce(function parseArg(prev, data) { 29 | var _data$split = data.split("="), 30 | _data$split2 = _slicedToArray(_data$split, 2), 31 | keyRaw = _data$split2[0], 32 | valueRaw = _data$split2[1]; 33 | 34 | var value = decodeURIComponent(valueRaw || ""); 35 | var key = keyRaw; 36 | 37 | if (clean && /^vk_/.test(key)) { 38 | key = key.replace(/^vk_/, ''); 39 | } 40 | 41 | prev[key] = value; 42 | return prev; 43 | }, {}); 44 | } 45 | 46 | var _default = getArgs; 47 | exports["default"] = _default; 48 | //# sourceMappingURL=Args.js.map -------------------------------------------------------------------------------- /dist/Args.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["../src/Args.js"],"names":["getArgs","clean","window","location","search","substr","split","reduce","parseArg","prev","data","keyRaw","valueRaw","value","decodeURIComponent","key","test","replace"],"mappings":";;;;;;;;;;;;;;;;;;;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,OAAT,GAA+B;AAAA,MAAdC,KAAc,uEAAN,IAAM;AAC7B,SAAOC,MAAM,CAACC,QAAP,CAAgBC,MAAhB,CACJC,MADI,CACG,CADH,EAEJC,KAFI,CAEE,GAFF,EAGJC,MAHI,CAGG,SAASC,QAAT,CAAkBC,IAAlB,EAAwBC,IAAxB,EAA8B;AAAA,sBACTA,IAAI,CAACJ,KAAL,CAAW,GAAX,CADS;AAAA;AAAA,QAC7BK,MAD6B;AAAA,QACrBC,QADqB;;AAEpC,QAAMC,KAAK,GAAGC,kBAAkB,CAACF,QAAQ,IAAI,EAAb,CAAhC;AACA,QAAIG,GAAG,GAAGJ,MAAV;;AAEA,QAAIV,KAAK,IAAI,OAAOe,IAAP,CAAYD,GAAZ,CAAb,EAA+B;AAC7BA,MAAAA,GAAG,GAAGA,GAAG,CAACE,OAAJ,CAAY,MAAZ,EAAoB,EAApB,CAAN;AACD;;AAEDR,IAAAA,IAAI,CAACM,GAAD,CAAJ,GAAYF,KAAZ;AAEA,WAAOJ,IAAP;AACD,GAfI,EAeF,EAfE,CAAP;AAgBD;;eAEcT,O","sourcesContent":["\n/**\n * Выводит параметры location.search\n *\n * @param clean [true] - Выводить только vk_ ключи и вырезать префикс\n * @returns {{}}\n */\nfunction getArgs(clean = true) {\n return window.location.search\n .substr(1)\n .split(\"&\")\n .reduce(function parseArg(prev, data) {\n const [keyRaw, valueRaw] = data.split(\"=\");\n const value = decodeURIComponent(valueRaw || \"\");\n let key = keyRaw;\n\n if (clean && /^vk_/.test(key)) {\n key = key.replace(/^vk_/, '');\n }\n\n prev[key] = value;\n\n return prev;\n }, {});\n}\n\nexport default getArgs;\n"],"file":"Args.js"} -------------------------------------------------------------------------------- /dist/JSONP_PromiseAPI.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports["default"] = void 0; 7 | 8 | var _vkui = require("@vkontakte/vkui"); 9 | 10 | var _react = _interopRequireDefault(require("react")); 11 | 12 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } 13 | 14 | function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } 15 | 16 | function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } 17 | 18 | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } 19 | 20 | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } 21 | 22 | function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } 23 | 24 | function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } 25 | 26 | function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } 27 | 28 | function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } 29 | 30 | function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } 31 | 32 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 33 | 34 | function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } 35 | 36 | function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 37 | 38 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } 39 | 40 | var JSONP_PromiseAPI = /*#__PURE__*/function () { 41 | function JSONP_PromiseAPI(_data) { 42 | var _this = this; 43 | 44 | _classCallCheck(this, JSONP_PromiseAPI); 45 | 46 | _defineProperty(this, "callMethod", function (method) { 47 | var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 48 | return new Promise(function (resolve, reject) { 49 | var request_id = (Math.random() * 1e20).toString(32); 50 | var data = { 51 | method: method, 52 | params: _objectSpread({ 53 | access_token: _this.access_token, 54 | v: _this.v 55 | }, params), 56 | request_id: request_id 57 | }; 58 | _this.requests[request_id] = { 59 | resolve: resolve, 60 | reject: reject, 61 | data: data 62 | }; 63 | 64 | _this.cartCheck(request_id); 65 | })["catch"](function (error) { 66 | error = error || {}; 67 | var apiError = (_typeof(error.error_reason) == 'object' ? error.error_reason : error.error_data) || error; 68 | var errorCode = apiError.error_code || 0; 69 | 70 | switch (errorCode) { 71 | case 6: 72 | _this.cartInit(); 73 | 74 | return _this.callMethod(method, params); 75 | 76 | case 14: 77 | return _this.showCaptcha(method, params, apiError); 78 | 79 | default: 80 | throw apiError; 81 | } 82 | }); 83 | }); 84 | 85 | _defineProperty(this, "parseError", function (data) { 86 | var error_data = data.error_data, 87 | request_id = data.request_id; 88 | if (!_this.requests[request_id]) return; 89 | 90 | _this.requests[request_id].reject(error_data); 91 | 92 | delete _this.requests[request_id]; 93 | }); 94 | 95 | _defineProperty(this, "parseResponse", function (data) { 96 | var response = data.response, 97 | request_id = data.request_id; 98 | if (!_this.requests[request_id]) return; 99 | 100 | _this.requests[request_id].resolve(response); 101 | 102 | delete _this.requests[request_id]; 103 | }); 104 | 105 | // user data 106 | this.access_token = (_data ? _data.access_token : false) || false; 107 | this.view = (_data ? _data.view : false) || false; 108 | this.v = (_data ? _data.v : false) || '5.92'; // requests map { request_id: request_data }; 109 | 110 | this.requests = {}; // requests cart [request_id, request_id, ...]; 111 | 112 | this.cart = []; // internal vars 113 | 114 | this.log = false; 115 | this.pause = false; // connect transport 116 | 117 | this.subscribe(); 118 | } 119 | 120 | _createClass(JSONP_PromiseAPI, [{ 121 | key: "subscribe", 122 | value: function subscribe() { 123 | window.apiCallback = window.apiCallback || {}; 124 | } 125 | }, { 126 | key: "debug", 127 | value: function debug() { 128 | var _console; 129 | 130 | if (!this.log) return; 131 | 132 | (_console = console).log.apply(_console, arguments); 133 | } 134 | }, { 135 | key: "cartCheck", 136 | value: function cartCheck(request_id, ignoreCart) { 137 | if (!this.pause && (!this.interval || ignoreCart)) { 138 | var request = this.requests[request_id]; 139 | this.sendRequest(request); 140 | this.debug('cartCheck', 'call', request); 141 | return; 142 | } 143 | 144 | this.debug('cartCheck', 'push'); 145 | this.cart.push(request_id); 146 | } 147 | }, { 148 | key: "cartTick", 149 | value: function cartTick() { 150 | this.debug('cartTick', this.cart.length); 151 | 152 | if (!this.cart.length) { 153 | clearInterval(this.interval); 154 | delete this.interval; 155 | return; 156 | } 157 | 158 | var request_id = this.cart.shift(); 159 | this.cartCheck(request_id, true); 160 | } 161 | }, { 162 | key: "cartInit", 163 | value: function cartInit() { 164 | var _this2 = this; 165 | 166 | this.debug('cartInit'); 167 | if (this.interval) return; 168 | this.interval = setInterval(function () { 169 | return _this2.cartTick(); 170 | }, 334); 171 | } 172 | }, { 173 | key: "showCaptcha", 174 | value: function showCaptcha(method, params, error) { 175 | var _this3 = this; 176 | 177 | if (!this.view) { 178 | throw error; 179 | } 180 | 181 | this.pause = 1; 182 | return new Promise(function (resolve) { 183 | var view = _this3.view; 184 | var oldPopout = view.state.popout; 185 | var captcha_img = error.captcha_img; 186 | view.setState({ 187 | popout: /*#__PURE__*/_react["default"].createElement(_vkui.Alert, { 188 | actionsLayout: "vertical", 189 | actions: [{ 190 | title: 'OK', 191 | autoclose: true 192 | }], 193 | onClose: function onClose() { 194 | resolve(view.state.captchaCode); 195 | view.setState({ 196 | popout: oldPopout, 197 | captchaCode: null 198 | }); 199 | } 200 | }, /*#__PURE__*/_react["default"].createElement("h2", null, "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043A\u043E\u0434 \u0441 \u043A\u0430\u0440\u0442\u0438\u043D\u043A\u0438"), /*#__PURE__*/_react["default"].createElement("img", { 201 | src: captcha_img, 202 | style: { 203 | width: 238, 204 | borderRadius: 3 205 | }, 206 | alt: captcha_img 207 | }), /*#__PURE__*/_react["default"].createElement(_vkui.Input, { 208 | defaultValue: "", 209 | onChange: function onChange(e) { 210 | var captchaCode = e.currentTarget.value; 211 | view.setState({ 212 | captchaCode: captchaCode 213 | }); 214 | } 215 | })) 216 | }); 217 | }).then(function (captcha_key) { 218 | _this3.pause = 0; 219 | var captcha_sid = error.captcha_sid; 220 | return _this3.callMethod(method, _objectSpread(_objectSpread({}, params), {}, { 221 | captcha_key: captcha_key, 222 | captcha_sid: captcha_sid 223 | })); 224 | }); 225 | } 226 | }, { 227 | key: "callback", 228 | value: function callback(request_id, callback_name, _ref) { 229 | var error_data = _ref.error, 230 | response = _ref.response; 231 | 232 | if (error_data) { 233 | this.parseError({ 234 | error_data: error_data, 235 | request_id: request_id 236 | }); 237 | } else { 238 | this.parseResponse({ 239 | response: response, 240 | request_id: request_id 241 | }); 242 | } 243 | 244 | document.getElementById(callback_name).outerHTML = ''; 245 | delete window.apiCallback[callback_name]; 246 | } 247 | }, { 248 | key: "sendJSON", 249 | value: function sendJSON(callback_name, method, params) { 250 | var script = document.createElement('script'); 251 | var src = 'https://api.vk.com/method/' + method + '/?'; 252 | params.callback = 'apiCallback.' + callback_name; 253 | Object.entries(params).forEach(function (_ref2) { 254 | var _ref3 = _slicedToArray(_ref2, 2), 255 | key = _ref3[0], 256 | value = _ref3[1]; 257 | 258 | value = encodeURIComponent(String(value)); 259 | src += "&".concat(key, "=").concat(value); 260 | }); 261 | script.id = callback_name; 262 | script.src = src; 263 | 264 | script.onerror = function (error) { 265 | window.apiCallback[callback_name]({ 266 | error: error 267 | }); 268 | }; 269 | 270 | document.head.appendChild(script); 271 | } 272 | }, { 273 | key: "sendRequest", 274 | value: function sendRequest(_ref4) { 275 | var _ref4$data = _ref4.data, 276 | method = _ref4$data.method, 277 | params = _ref4$data.params, 278 | request_id = _ref4$data.request_id; 279 | var callback_name = 'fn' + request_id.replace('.', '_'); 280 | window.apiCallback[callback_name] = this.callback.bind(this, request_id, callback_name); 281 | this.sendJSON(callback_name, method, params); 282 | } 283 | }]); 284 | 285 | return JSONP_PromiseAPI; 286 | }(); 287 | 288 | var _default = JSONP_PromiseAPI; 289 | exports["default"] = _default; 290 | //# sourceMappingURL=JSONP_PromiseAPI.js.map -------------------------------------------------------------------------------- /dist/JSONP_PromiseAPI.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["../src/JSONP_PromiseAPI.js"],"names":["JSONP_PromiseAPI","data","method","params","Promise","resolve","reject","request_id","Math","random","toString","access_token","v","requests","cartCheck","error","apiError","error_reason","error_data","errorCode","error_code","cartInit","callMethod","showCaptcha","response","view","cart","log","pause","subscribe","window","apiCallback","console","ignoreCart","interval","request","sendRequest","debug","push","length","clearInterval","shift","setInterval","cartTick","oldPopout","state","popout","captcha_img","setState","title","autoclose","captchaCode","width","borderRadius","e","currentTarget","value","then","captcha_key","captcha_sid","callback_name","parseError","parseResponse","document","getElementById","outerHTML","script","createElement","src","callback","Object","entries","forEach","key","encodeURIComponent","String","id","onerror","head","appendChild","replace","bind","sendJSON"],"mappings":"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","sourcesContent":["import { Input, Alert } from '@vkontakte/vkui';\nimport React from \"react\";\n\nclass JSONP_PromiseAPI {\n constructor(data) {\n // user data\n this.access_token = (data ? data.access_token : false) || false;\n this.view = (data ? data.view : false) || false;\n this.v = (data ? data.v : false) || '5.92';\n\n // requests map { request_id: request_data };\n this.requests = {};\n // requests cart [request_id, request_id, ...];\n this.cart = [];\n\n // internal vars\n this.log = false;\n this.pause = false;\n\n // connect transport\n this.subscribe();\n }\n\n subscribe() {\n window.apiCallback = window.apiCallback || {};\n }\n\n debug(...args) {\n if (!this.log) return;\n console.log(...args);\n }\n\n cartCheck(request_id, ignoreCart) {\n if (!this.pause && (!this.interval || ignoreCart)) {\n const request = this.requests[request_id];\n this.sendRequest(request);\n this.debug('cartCheck', 'call', request);\n return;\n }\n this.debug('cartCheck', 'push');\n this.cart.push(request_id);\n }\n\n cartTick() {\n this.debug('cartTick', this.cart.length);\n if (!this.cart.length) {\n clearInterval(this.interval);\n delete this.interval;\n return;\n }\n const request_id = this.cart.shift();\n this.cartCheck(request_id, true);\n }\n\n cartInit() {\n this.debug('cartInit');\n if (this.interval) return;\n this.interval = setInterval(() => this.cartTick(), 334);\n }\n\n showCaptcha(method, params, error) {\n if (!this.view) {\n throw error;\n }\n\n this.pause = 1;\n return new Promise((resolve) => {\n const view = this.view;\n const oldPopout = view.state.popout;\n const { captcha_img } = error;\n view.setState({\n popout: (\n {\n resolve(view.state.captchaCode);\n view.setState({ popout: oldPopout, captchaCode: null });\n }}\n >\n

Введите код с картинки

\n {captcha_img}/\n {\n const captchaCode = e.currentTarget.value;\n view.setState({ captchaCode });\n }}/>\n \n )\n });\n }).then((captcha_key) => {\n this.pause = 0;\n const captcha_sid = error.captcha_sid;\n return this.callMethod(method, {\n ...params,\n captcha_key,\n captcha_sid,\n });\n });\n }\n\n callMethod = (method, params = {}) => {\n return new Promise((resolve, reject) => {\n const request_id = (Math.random() * 1e20).toString(32);\n const data = {\n method,\n params: {\n access_token: this.access_token,\n v: this.v,\n ...params,\n },\n request_id,\n };\n\n this.requests[request_id] = { resolve, reject, data };\n this.cartCheck(request_id);\n }).catch((error) => {\n error = error || {};\n const apiError = (typeof error.error_reason == 'object' ? error.error_reason : error.error_data) || error;\n const errorCode = apiError.error_code || 0;\n\n switch (errorCode) {\n case 6:\n this.cartInit();\n return this.callMethod(method, params);\n case 14:\n return this.showCaptcha(method, params, apiError);\n default:\n throw apiError;\n }\n });\n };\n\n parseError = (data) => {\n const { error_data, request_id } = data;\n if (!this.requests[request_id]) return;\n this.requests[request_id].reject(error_data);\n delete this.requests[request_id];\n };\n\n parseResponse = (data) => {\n const { response, request_id } = data;\n if (!this.requests[request_id]) return;\n this.requests[request_id].resolve(response);\n delete this.requests[request_id];\n };\n\n callback(request_id, callback_name, { error: error_data, response }) {\n if (error_data) {\n this.parseError({ error_data, request_id });\n } else {\n this.parseResponse({ response, request_id });\n }\n\n document.getElementById(callback_name).outerHTML = '';\n delete window.apiCallback[callback_name];\n }\n\n sendJSON(callback_name, method, params) {\n const script = document.createElement('script');\n let src = 'https://api.vk.com/method/' + method + '/?';\n\n params.callback = 'apiCallback.' + callback_name;\n\n Object.entries(params).forEach(([key, value]) => {\n value = encodeURIComponent(String(value));\n src += `&${key}=${value}`;\n });\n\n script.id = callback_name;\n script.src = src;\n\n script.onerror = (error) => {\n window.apiCallback[callback_name]({ error });\n };\n\n document.head.appendChild(script);\n }\n\n sendRequest({ data: { method, params, request_id }}) {\n const callback_name = 'fn' + request_id.replace('.', '_');\n\n window.apiCallback[callback_name] = this.callback.bind(this, request_id, callback_name);\n\n this.sendJSON(callback_name, method, params);\n }\n}\n\nexport default JSONP_PromiseAPI;\n"],"file":"JSONP_PromiseAPI.js"} -------------------------------------------------------------------------------- /dist/PanelHeader.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } 4 | 5 | Object.defineProperty(exports, "__esModule", { 6 | value: true 7 | }); 8 | exports["default"] = void 0; 9 | 10 | var _react = _interopRequireDefault(require("react")); 11 | 12 | var _PanelHeader = _interopRequireDefault(require("@vkontakte/vkui/dist/components/PanelHeader/PanelHeader")); 13 | 14 | var _HeaderButton = _interopRequireDefault(require("@vkontakte/vkui/dist/components/HeaderButton/HeaderButton")); 15 | 16 | var _fullscreen = _interopRequireDefault(require("@vkontakte/icons/dist/24/fullscreen")); 17 | 18 | var _fullscreen_exit = _interopRequireDefault(require("@vkontakte/icons/dist/24/fullscreen_exit")); 19 | 20 | var _PanelHeaderInternal = _interopRequireDefault(require("./PanelHeaderInternal")); 21 | 22 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } 23 | 24 | function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } 25 | 26 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 27 | 28 | function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } 29 | 30 | function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 31 | 32 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } 33 | 34 | function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } 35 | 36 | function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } 37 | 38 | function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } 39 | 40 | function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } 41 | 42 | function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } 43 | 44 | function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } 45 | 46 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } 47 | 48 | var PanelHeaderFull = /*#__PURE__*/function (_React$Component) { 49 | _inherits(PanelHeaderFull, _React$Component); 50 | 51 | var _super = _createSuper(PanelHeaderFull); 52 | 53 | function PanelHeaderFull(props) { 54 | var _this; 55 | 56 | _classCallCheck(this, PanelHeaderFull); 57 | 58 | _this = _super.call(this, props); 59 | 60 | _defineProperty(_assertThisInitialized(_this), "onFullScreenUpdate", function () { 61 | var fullScreenEnabled = !!document.fullscreenElement; 62 | 63 | _this.setState({ 64 | fullScreenEnabled: fullScreenEnabled 65 | }); 66 | }); 67 | 68 | _this.state = { 69 | fullScreenEnabled: false 70 | }; 71 | return _this; 72 | } 73 | 74 | _createClass(PanelHeaderFull, [{ 75 | key: "fullScreenToggle", 76 | value: function fullScreenToggle() { 77 | var self = PanelHeaderFull; 78 | 79 | if (!document.fullscreenElement) { 80 | self.openFullscreen(document.documentElement); 81 | } else { 82 | self.closeFullscreen(); 83 | } 84 | 85 | this.onFullScreenUpdate(); 86 | } 87 | }, { 88 | key: "componentDidMount", 89 | value: function componentDidMount() { 90 | window.addEventListener('fullscreenchange', this.onFullScreenUpdate); 91 | } 92 | }, { 93 | key: "componentWillUnmount", 94 | value: function componentWillUnmount() { 95 | window.removeEventListener('fullscreenchange', this.onFullScreenUpdate); 96 | } 97 | }, { 98 | key: "render", 99 | value: function render() { 100 | var _this2 = this; 101 | 102 | var props = this.props; 103 | 104 | if (!props.isWeb) { 105 | return /*#__PURE__*/_react["default"].createElement(_PanelHeader["default"], props); 106 | } 107 | 108 | var newProps = {}; 109 | newProps.theme = 'alternate'; 110 | newProps.right = /*#__PURE__*/_react["default"].createElement(_HeaderButton["default"], { 111 | onClick: function onClick() { 112 | return _this2.fullScreenToggle(); 113 | } 114 | }, this.state.fullScreenEnabled ? /*#__PURE__*/_react["default"].createElement(_fullscreen_exit["default"], null) : /*#__PURE__*/_react["default"].createElement(_fullscreen["default"], null)); 115 | return /*#__PURE__*/_react["default"].createElement(_PanelHeaderInternal["default"], _extends({}, props, newProps)); 116 | } 117 | }], [{ 118 | key: "openFullscreen", 119 | value: function openFullscreen() { 120 | var elem = document.body; 121 | 122 | if (elem.requestFullscreen) { 123 | elem.requestFullscreen(); 124 | } else if (elem.mozRequestFullScreen) { 125 | /* Firefox */ 126 | elem.mozRequestFullScreen(); 127 | } else if (elem.webkitRequestFullscreen) { 128 | /* Chrome, Safari and Opera */ 129 | elem.webkitRequestFullscreen(); 130 | } else if (elem.msRequestFullscreen) { 131 | /* IE/Edge */ 132 | elem.msRequestFullscreen(); 133 | } 134 | } 135 | }, { 136 | key: "closeFullscreen", 137 | value: function closeFullscreen() { 138 | if (document.exitFullscreen) { 139 | document.exitFullscreen(); 140 | } else if (document.mozCancelFullScreen) { 141 | /* Firefox */ 142 | document.mozCancelFullScreen(); 143 | } else if (document.webkitExitFullscreen) { 144 | /* Chrome, Safari and Opera */ 145 | document.webkitExitFullscreen(); 146 | } else if (document.msExitFullscreen) { 147 | /* IE/Edge */ 148 | document.msExitFullscreen(); 149 | } 150 | } 151 | }]); 152 | 153 | return PanelHeaderFull; 154 | }(_react["default"].Component); 155 | 156 | var _default = PanelHeaderFull; 157 | exports["default"] = _default; 158 | //# sourceMappingURL=PanelHeader.js.map -------------------------------------------------------------------------------- /dist/PanelHeader.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["../src/PanelHeader.js"],"names":["PanelHeaderFull","props","fullScreenEnabled","document","fullscreenElement","setState","state","self","openFullscreen","documentElement","closeFullscreen","onFullScreenUpdate","window","addEventListener","removeEventListener","isWeb","newProps","theme","right","fullScreenToggle","elem","body","requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","exitFullscreen","mozCancelFullScreen","webkitExitFullscreen","msExitFullscreen","React","Component"],"mappings":";;;;;;;;;AAAA;;AACA;;AACA;;AAEA;;AACA;;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAGMA,e;;;;;AACJ,2BAAYC,KAAZ,EAAmB;AAAA;;AAAA;;AACjB,8BAAMA,KAAN;;AADiB,yEAQE,YAAM;AACzB,UAAMC,iBAAiB,GAAG,CAAC,CAACC,QAAQ,CAACC,iBAArC;;AACA,YAAKC,QAAL,CAAc;AAAEH,QAAAA,iBAAiB,EAAjBA;AAAF,OAAd;AACD,KAXkB;;AAGjB,UAAKI,KAAL,GAAa;AACXJ,MAAAA,iBAAiB,EAAE;AADR,KAAb;AAHiB;AAMlB;;;;uCAOkB;AACjB,UAAMK,IAAI,GAAGP,eAAb;;AACA,UAAI,CAACG,QAAQ,CAACC,iBAAd,EAAiC;AAC/BG,QAAAA,IAAI,CAACC,cAAL,CAAoBL,QAAQ,CAACM,eAA7B;AACD,OAFD,MAEO;AACLF,QAAAA,IAAI,CAACG,eAAL;AACD;;AACD,WAAKC,kBAAL;AACD;;;wCA2BmB;AAClBC,MAAAA,MAAM,CAACC,gBAAP,CAAwB,kBAAxB,EAA4C,KAAKF,kBAAjD;AACD;;;2CAEsB;AACrBC,MAAAA,MAAM,CAACE,mBAAP,CAA2B,kBAA3B,EAA+C,KAAKH,kBAApD;AACD;;;6BAEQ;AAAA;;AACP,UAAMV,KAAK,GAAG,KAAKA,KAAnB;;AAEA,UAAI,CAACA,KAAK,CAACc,KAAX,EAAkB;AAChB,4BACE,gCAAC,uBAAD,EAAiBd,KAAjB,CADF;AAGD;;AAED,UAAMe,QAAQ,GAAG,EAAjB;AACAA,MAAAA,QAAQ,CAACC,KAAT,GAAiB,WAAjB;AACAD,MAAAA,QAAQ,CAACE,KAAT,gBACE,gCAAC,wBAAD;AAAc,QAAA,OAAO,EAAE;AAAA,iBAAM,MAAI,CAACC,gBAAL,EAAN;AAAA;AAAvB,SACA,KAAKb,KAAL,CAAWJ,iBAAX,gBACA,gCAAC,2BAAD,OADA,gBAGF,gCAAC,sBAAD,OAJE,CADF;AAUA,0BACE,gCAAC,+BAAD,eAAyBD,KAAzB,EAAoCe,QAApC,EADF;AAGD;;;qCAzDuB;AACtB,UAAII,IAAI,GAAGjB,QAAQ,CAACkB,IAApB;;AACA,UAAID,IAAI,CAACE,iBAAT,EAA4B;AAC1BF,QAAAA,IAAI,CAACE,iBAAL;AACD,OAFD,MAEO,IAAIF,IAAI,CAACG,oBAAT,EAA+B;AAAE;AACtCH,QAAAA,IAAI,CAACG,oBAAL;AACD,OAFM,MAEA,IAAIH,IAAI,CAACI,uBAAT,EAAkC;AAAE;AACzCJ,QAAAA,IAAI,CAACI,uBAAL;AACD,OAFM,MAEA,IAAIJ,IAAI,CAACK,mBAAT,EAA8B;AAAE;AACrCL,QAAAA,IAAI,CAACK,mBAAL;AACD;AACF;;;sCAEwB;AACvB,UAAItB,QAAQ,CAACuB,cAAb,EAA6B;AAC3BvB,QAAAA,QAAQ,CAACuB,cAAT;AACD,OAFD,MAEO,IAAIvB,QAAQ,CAACwB,mBAAb,EAAkC;AAAE;AACzCxB,QAAAA,QAAQ,CAACwB,mBAAT;AACD,OAFM,MAEA,IAAIxB,QAAQ,CAACyB,oBAAb,EAAmC;AAAE;AAC1CzB,QAAAA,QAAQ,CAACyB,oBAAT;AACD,OAFM,MAEA,IAAIzB,QAAQ,CAAC0B,gBAAb,EAA+B;AAAE;AACtC1B,QAAAA,QAAQ,CAAC0B,gBAAT;AACD;AACF;;;;EA/C2BC,kBAAMC,S;;eAoFrB/B,e","sourcesContent":["import React from 'react';\nimport PanelHeader from '@vkontakte/vkui/dist/components/PanelHeader/PanelHeader';\nimport HeaderButton from '@vkontakte/vkui/dist/components/HeaderButton/HeaderButton';\n\nimport Icon24Fullscreen from '@vkontakte/icons/dist/24/fullscreen';\nimport Icon24FullscreenExit from '@vkontakte/icons/dist/24/fullscreen_exit';\nimport PanelHeaderInternal from \"./PanelHeaderInternal\";\n\n\nclass PanelHeaderFull extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n fullScreenEnabled: false\n };\n }\n\n onFullScreenUpdate = () => {\n const fullScreenEnabled = !!document.fullscreenElement;\n this.setState({ fullScreenEnabled });\n };\n\n fullScreenToggle() {\n const self = PanelHeaderFull;\n if (!document.fullscreenElement) {\n self.openFullscreen(document.documentElement);\n } else {\n self.closeFullscreen();\n }\n this.onFullScreenUpdate();\n }\n\n static openFullscreen() {\n var elem = document.body;\n if (elem.requestFullscreen) {\n elem.requestFullscreen();\n } else if (elem.mozRequestFullScreen) { /* Firefox */\n elem.mozRequestFullScreen();\n } else if (elem.webkitRequestFullscreen) { /* Chrome, Safari and Opera */\n elem.webkitRequestFullscreen();\n } else if (elem.msRequestFullscreen) { /* IE/Edge */\n elem.msRequestFullscreen();\n }\n }\n\n static closeFullscreen() {\n if (document.exitFullscreen) {\n document.exitFullscreen();\n } else if (document.mozCancelFullScreen) { /* Firefox */\n document.mozCancelFullScreen();\n } else if (document.webkitExitFullscreen) { /* Chrome, Safari and Opera */\n document.webkitExitFullscreen();\n } else if (document.msExitFullscreen) { /* IE/Edge */\n document.msExitFullscreen();\n }\n }\n\n componentDidMount() {\n window.addEventListener('fullscreenchange', this.onFullScreenUpdate);\n }\n\n componentWillUnmount() {\n window.removeEventListener('fullscreenchange', this.onFullScreenUpdate);\n }\n\n render() {\n const props = this.props;\n\n if (!props.isWeb) {\n return (\n \n );\n }\n\n const newProps = {};\n newProps.theme = 'alternate';\n newProps.right = (\n this.fullScreenToggle()}>\n { this.state.fullScreenEnabled ? (\n \n ) : (\n \n )}\n \n );\n\n return (\n \n );\n }\n}\n\nexport default PanelHeaderFull;\n"],"file":"PanelHeader.js"} -------------------------------------------------------------------------------- /dist/PanelHeaderInternal.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } 4 | 5 | Object.defineProperty(exports, "__esModule", { 6 | value: true 7 | }); 8 | exports["default"] = void 0; 9 | 10 | var _PanelHeader2 = _interopRequireDefault(require("@vkontakte/vkui/dist/components/PanelHeader/PanelHeader")); 11 | 12 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } 13 | 14 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 15 | 16 | function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } 17 | 18 | function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 19 | 20 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } 21 | 22 | function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } 23 | 24 | function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } 25 | 26 | function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } 27 | 28 | function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } 29 | 30 | function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } 31 | 32 | function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } 33 | 34 | var PanelHeaderInternal = /*#__PURE__*/function (_PanelHeader) { 35 | _inherits(PanelHeaderInternal, _PanelHeader); 36 | 37 | var _super = _createSuper(PanelHeaderInternal); 38 | 39 | function PanelHeaderInternal() { 40 | _classCallCheck(this, PanelHeaderInternal); 41 | 42 | return _super.apply(this, arguments); 43 | } 44 | 45 | _createClass(PanelHeaderInternal, [{ 46 | key: "webviewType", 47 | get: function get() { 48 | var isWeb = this.props.isWeb; 49 | return isWeb ? 'internal' : 'vkapps'; 50 | } 51 | }]); 52 | 53 | return PanelHeaderInternal; 54 | }(_PanelHeader2["default"]); 55 | 56 | var _default = PanelHeaderInternal; 57 | exports["default"] = _default; 58 | //# sourceMappingURL=PanelHeaderInternal.js.map -------------------------------------------------------------------------------- /dist/PanelHeaderInternal.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["../src/PanelHeaderInternal.js"],"names":["PanelHeaderInternal","isWeb","props","PanelHeader"],"mappings":";;;;;;;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;IAEMA,mB;;;;;;;;;;;;;wBACe;AACjB,UAAMC,KAAK,GAAG,KAAKC,KAAL,CAAWD,KAAzB;AACA,aAAOA,KAAK,GAAG,UAAH,GAAgB,QAA5B;AACD;;;;EAJ+BE,wB;;eAOnBH,mB","sourcesContent":["import PanelHeader from '@vkontakte/vkui/dist/components/PanelHeader/PanelHeader';\n\nclass PanelHeaderInternal extends PanelHeader {\n get webviewType () {\n const isWeb = this.props.isWeb;\n return isWeb ? 'internal' : 'vkapps';\n }\n}\n\nexport default PanelHeaderInternal;\n"],"file":"PanelHeaderInternal.js"} -------------------------------------------------------------------------------- /dist/PromiseAPI.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports["default"] = void 0; 7 | 8 | var _react = _interopRequireDefault(require("react")); 9 | 10 | var _Alert = _interopRequireDefault(require("@vkontakte/vkui/dist/components/Alert/Alert")); 11 | 12 | var _Input = _interopRequireDefault(require("@vkontakte/vkui/dist/components/Input/Input")); 13 | 14 | var _vkBridge = _interopRequireDefault(require("@vkontakte/vk-bridge")); 15 | 16 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } 17 | 18 | function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } 19 | 20 | function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } 21 | 22 | function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } 23 | 24 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 25 | 26 | function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } 27 | 28 | function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 29 | 30 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } 31 | 32 | var PromiseAPI = /*#__PURE__*/function () { 33 | function PromiseAPI(_data) { 34 | var _this = this; 35 | 36 | _classCallCheck(this, PromiseAPI); 37 | 38 | _defineProperty(this, "callMethod", function (method) { 39 | var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 40 | return new Promise(function (resolve, reject) { 41 | var request_id = (Math.random() * 1e20).toString(32); 42 | var data = { 43 | method: method, 44 | params: _objectSpread({ 45 | access_token: _this.access_token, 46 | v: _this.v 47 | }, params), 48 | request_id: request_id 49 | }; 50 | _this.requests[request_id] = { 51 | resolve: resolve, 52 | reject: reject, 53 | data: data 54 | }; 55 | 56 | _this.cartCheck(request_id); 57 | })["catch"](function (error) { 58 | error = error || {}; 59 | var apiError = (_typeof(error.error_reason) == 'object' ? error.error_reason : error.error_data) || error; 60 | var errorCode = apiError.error_code || 0; 61 | 62 | switch (errorCode) { 63 | case 6: 64 | _this.cartInit(); 65 | 66 | return _this.callMethod(method, params); 67 | 68 | case 14: 69 | return _this.showCaptcha(method, params, apiError); 70 | } 71 | 72 | throw apiError; 73 | }); 74 | }); 75 | 76 | _defineProperty(this, "parseError", function (data) { 77 | var error_data = data.error_data, 78 | request_id = data.request_id; 79 | if (!_this.requests[request_id]) return; 80 | 81 | _this.requests[request_id].reject(error_data); 82 | 83 | delete _this.requests[request_id]; 84 | }); 85 | 86 | _defineProperty(this, "parseResponse", function (data) { 87 | var response = data.response, 88 | execute_errors = data.execute_errors, 89 | request_id = data.request_id; 90 | if (!_this.requests[request_id]) return; 91 | 92 | if (execute_errors && _this.reject_execute_errors) { 93 | var error = execute_errors[0]; 94 | error.data = data; 95 | 96 | _this.requests[request_id].reject(error); 97 | } else { 98 | _this.requests[request_id].resolve(response); 99 | } 100 | 101 | delete _this.requests[request_id]; 102 | }); 103 | 104 | // user data 105 | this.access_token = (_data ? _data.access_token : false) || false; 106 | this.view = (_data ? _data.view : false) || false; 107 | this.v = (_data ? _data.v : false) || '5.92'; 108 | this.reject_execute_errors = !!_data.reject_execute_errors; // requests map { request_id: request_data }; 109 | 110 | this.requests = {}; // requests cart [request_id, request_id, ...]; 111 | 112 | this.cart = []; // internal vars 113 | 114 | this.log = false; 115 | this.pause = false; // bridge transport 116 | 117 | this.subscribe(); 118 | } 119 | 120 | _createClass(PromiseAPI, [{ 121 | key: "subscribe", 122 | value: function subscribe() { 123 | var _this2 = this; 124 | 125 | this.bridge = _vkBridge["default"]; 126 | this.bridge.subscribe(function (_ref) { 127 | var _ref$detail = _ref.detail, 128 | type = _ref$detail.type, 129 | data = _ref$detail.data; 130 | 131 | switch (type) { 132 | case 'VKWebAppCallAPIMethodFailed': 133 | _this2.parseError(data); 134 | 135 | break; 136 | 137 | case 'VKWebAppCallAPIMethodResult': 138 | _this2.parseResponse(data); 139 | 140 | break; 141 | } 142 | }); 143 | } 144 | }, { 145 | key: "sendRequest", 146 | value: function sendRequest(request) { 147 | this.bridge.send('VKWebAppCallAPIMethod', request.data); 148 | } 149 | }, { 150 | key: "debug", 151 | value: function debug() { 152 | var _console; 153 | 154 | if (!this.log) return; 155 | 156 | (_console = console).log.apply(_console, arguments); 157 | } 158 | }, { 159 | key: "cartCheck", 160 | value: function cartCheck(request_id, ignoreCart) { 161 | if (!this.pause && (!this.interval || ignoreCart)) { 162 | var request = this.requests[request_id]; 163 | this.sendRequest(request); 164 | this.debug('cartCheck', 'call', request); 165 | return; 166 | } 167 | 168 | this.debug('cartCheck', 'push'); 169 | this.cart.push(request_id); 170 | } 171 | }, { 172 | key: "cartTick", 173 | value: function cartTick() { 174 | this.debug('cartTick', this.cart.length); 175 | 176 | if (!this.cart.length) { 177 | clearInterval(this.interval); 178 | delete this.interval; 179 | return; 180 | } 181 | 182 | var request_id = this.cart.shift(); 183 | this.cartCheck(request_id, true); 184 | } 185 | }, { 186 | key: "cartInit", 187 | value: function cartInit() { 188 | var _this3 = this; 189 | 190 | this.debug('cartInit'); 191 | if (this.interval) return; 192 | this.interval = setInterval(function () { 193 | return _this3.cartTick(); 194 | }, 334); 195 | } 196 | }, { 197 | key: "showCaptcha", 198 | value: function showCaptcha(method, params, error) { 199 | var _this4 = this; 200 | 201 | if (!this.view) { 202 | throw error; 203 | } 204 | 205 | this.pause = 1; 206 | return new Promise(function (resolve) { 207 | var view = _this4.view; 208 | var oldPopout = view.state.popout; 209 | view.setState({ 210 | popout: /*#__PURE__*/_react["default"].createElement(_Alert["default"], { 211 | actionsLayout: "vertical", 212 | actions: [{ 213 | title: 'OK', 214 | autoclose: true 215 | }], 216 | onClose: function onClose() { 217 | resolve(view.state.captchaCode); 218 | view.setState({ 219 | popout: oldPopout, 220 | captchaCode: null 221 | }); 222 | } 223 | }, /*#__PURE__*/_react["default"].createElement("h2", null, "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043A\u043E\u0434 \u0441 \u043A\u0430\u0440\u0442\u0438\u043D\u043A\u0438"), /*#__PURE__*/_react["default"].createElement("img", { 224 | src: error.captcha_img, 225 | style: { 226 | width: 238, 227 | borderRadius: 3 228 | }, 229 | alt: error.captcha_img 230 | }), /*#__PURE__*/_react["default"].createElement(_Input["default"], { 231 | defaultValue: "", 232 | onChange: function onChange(e) { 233 | var captchaCode = e.currentTarget.value; 234 | view.setState({ 235 | captchaCode: captchaCode 236 | }); 237 | } 238 | })) 239 | }); 240 | }).then(function (captcha_key) { 241 | _this4.pause = 0; 242 | var captcha_sid = error.captcha_sid; 243 | return _this4.callMethod(method, _objectSpread(_objectSpread({}, params), {}, { 244 | captcha_key: captcha_key, 245 | captcha_sid: captcha_sid 246 | })); 247 | }); 248 | } 249 | }, { 250 | key: "getMethod", 251 | value: function getMethod(method) { 252 | return this.callMethod.bind(this, method); 253 | } 254 | }]); 255 | 256 | return PromiseAPI; 257 | }(); 258 | 259 | var _default = PromiseAPI; 260 | exports["default"] = _default; 261 | //# sourceMappingURL=PromiseAPI.js.map -------------------------------------------------------------------------------- /dist/PromiseAPI.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["../src/PromiseAPI.js"],"names":["PromiseAPI","data","method","params","Promise","resolve","reject","request_id","Math","random","toString","access_token","v","requests","cartCheck","error","apiError","error_reason","error_data","errorCode","error_code","cartInit","callMethod","showCaptcha","response","execute_errors","reject_execute_errors","view","cart","log","pause","subscribe","bridge","detail","type","parseError","parseResponse","request","send","console","ignoreCart","interval","sendRequest","debug","push","length","clearInterval","shift","setInterval","cartTick","oldPopout","state","popout","setState","title","autoclose","captchaCode","captcha_img","width","borderRadius","e","currentTarget","value","then","captcha_key","captcha_sid","bind"],"mappings":"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","sourcesContent":["import React from 'react';\nimport Alert from '@vkontakte/vkui/dist/components/Alert/Alert';\nimport Input from '@vkontakte/vkui/dist/components/Input/Input';\nimport bridge from \"@vkontakte/vk-bridge\";\n\nclass PromiseAPI {\n constructor(data) {\n // user data\n this.access_token = (data ? data.access_token : false) || false;\n this.view = (data ? data.view : false) || false;\n this.v = (data ? data.v : false) || '5.92';\n this.reject_execute_errors = !!data.reject_execute_errors;\n\n // requests map { request_id: request_data };\n this.requests = {};\n // requests cart [request_id, request_id, ...];\n this.cart = [];\n\n // internal vars\n this.log = false;\n this.pause = false;\n\n // bridge transport\n this.subscribe();\n }\n\n subscribe() {\n this.bridge = bridge;\n this.bridge.subscribe(({ detail: { type, data }}) => {\n switch (type) {\n case 'VKWebAppCallAPIMethodFailed':\n this.parseError(data);\n break;\n case 'VKWebAppCallAPIMethodResult':\n this.parseResponse(data);\n break;\n }\n });\n }\n\n sendRequest(request) {\n this.bridge.send('VKWebAppCallAPIMethod', request.data);\n }\n\n debug(...args) {\n if (!this.log) return;\n console.log(...args);\n }\n\n cartCheck(request_id, ignoreCart) {\n if (!this.pause && (!this.interval || ignoreCart)) {\n const request = this.requests[request_id];\n this.sendRequest(request);\n this.debug('cartCheck', 'call', request);\n return;\n }\n this.debug('cartCheck', 'push');\n this.cart.push(request_id);\n }\n\n cartTick() {\n this.debug('cartTick', this.cart.length);\n if (!this.cart.length) {\n clearInterval(this.interval);\n delete this.interval;\n return;\n }\n const request_id = this.cart.shift();\n this.cartCheck(request_id, true);\n }\n\n cartInit() {\n this.debug('cartInit');\n if (this.interval) return;\n this.interval = setInterval(() => this.cartTick(), 334);\n }\n\n showCaptcha(method, params, error) {\n if (!this.view) {\n throw error;\n }\n\n this.pause = 1;\n return new Promise((resolve) => {\n const view = this.view;\n const oldPopout = view.state.popout;\n view.setState({\n popout: (\n {\n resolve(view.state.captchaCode);\n view.setState({ popout: oldPopout, captchaCode: null });\n }}\n >\n

Введите код с картинки

\n {error.captcha_img}/\n {\n const captchaCode = e.currentTarget.value;\n view.setState({ captchaCode });\n }}/>\n \n )\n });\n }).then((captcha_key) => {\n this.pause = 0;\n const captcha_sid = error.captcha_sid;\n return this.callMethod(method, {\n ...params,\n captcha_key,\n captcha_sid,\n });\n });\n }\n\n getMethod(method) {\n return this.callMethod.bind(this, method);\n }\n\n callMethod = (method, params = {}) => {\n return new Promise((resolve, reject) => {\n const request_id = (Math.random() * 1e20).toString(32);\n const data = {\n method,\n params: {\n access_token: this.access_token,\n v: this.v,\n ...params,\n },\n request_id,\n };\n\n this.requests[request_id] = { resolve, reject, data };\n this.cartCheck(request_id);\n }).catch((error) => {\n error = error || {};\n const apiError = (typeof error.error_reason == 'object' ? error.error_reason : error.error_data) || error;\n const errorCode = apiError.error_code || 0;\n\n switch (errorCode) {\n case 6:\n this.cartInit();\n return this.callMethod(method, params);\n case 14:\n return this.showCaptcha(method, params, apiError);\n }\n\n throw apiError;\n });\n };\n\n parseError = (data) => {\n const { error_data, request_id } = data;\n if (!this.requests[request_id]) return;\n this.requests[request_id].reject(error_data);\n delete this.requests[request_id];\n };\n\n parseResponse = (data) => {\n const { response, execute_errors, request_id } = data;\n if (!this.requests[request_id]) return;\n\n if (execute_errors && this.reject_execute_errors) {\n const error = execute_errors[0];\n error.data = data;\n this.requests[request_id].reject(error);\n } else {\n this.requests[request_id].resolve(response);\n }\n\n delete this.requests[request_id];\n };\n}\n\nexport default PromiseAPI;\n"],"file":"PromiseAPI.js"} -------------------------------------------------------------------------------- /dist/ReverseHorizontalScroll.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } 4 | 5 | Object.defineProperty(exports, "__esModule", { 6 | value: true 7 | }); 8 | exports["default"] = void 0; 9 | 10 | var _react = _interopRequireDefault(require("react")); 11 | 12 | var _HorizontalScroll = _interopRequireDefault(require("@vkontakte/vkui/dist/components/HorizontalScroll/HorizontalScroll")); 13 | 14 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } 15 | 16 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 17 | 18 | function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } 19 | 20 | function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 21 | 22 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } 23 | 24 | function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } 25 | 26 | function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } 27 | 28 | function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } 29 | 30 | function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } 31 | 32 | function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } 33 | 34 | function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } 35 | 36 | var ReverseHorizontalScroll = /*#__PURE__*/function (_React$Component) { 37 | _inherits(ReverseHorizontalScroll, _React$Component); 38 | 39 | var _super = _createSuper(ReverseHorizontalScroll); 40 | 41 | function ReverseHorizontalScroll(props) { 42 | var _this; 43 | 44 | _classCallCheck(this, ReverseHorizontalScroll); 45 | 46 | _this = _super.call(this, props); 47 | _this.onWheel = _this.onWheel.bind(_assertThisInitialized(_this)); 48 | _this.scrollArea = /*#__PURE__*/_react["default"].createRef(); 49 | return _this; 50 | } 51 | 52 | _createClass(ReverseHorizontalScroll, [{ 53 | key: "componentDidMount", 54 | value: function componentDidMount() { 55 | this.scrollElement = this.scrollArea.current.querySelector('.HorizontalScroll__in'); 56 | 57 | if (this.scrollElement) { 58 | this.scrollElement.addEventListener('wheel', this.onWheel, false); 59 | } 60 | } 61 | }, { 62 | key: "componentWillUnmount", 63 | value: function componentWillUnmount() { 64 | if (this.scrollElement) { 65 | this.scrollElement.removeEventListener('wheel', this.onWheel); 66 | } 67 | } 68 | }, { 69 | key: "onWheel", 70 | value: function onWheel(e) { 71 | if (!this.scrollElement) { 72 | return; 73 | } 74 | 75 | var props = this.props; 76 | var reverse = props.reverse ? -1 : 1; 77 | var scrollDelta = (e.deltaY || 0) * reverse; 78 | var oldValue = this.scrollElement.scrollLeft; 79 | this.scrollElement.scrollLeft -= scrollDelta; 80 | 81 | if (props.onWheel) { 82 | return props.onWheel(e); 83 | } 84 | 85 | if (this.scrollElement.scrollLeft === oldValue) { 86 | return; 87 | } 88 | 89 | e.cancelBubble = true; 90 | e.preventDefault(); 91 | return false; 92 | } 93 | }, { 94 | key: "render", 95 | value: function render() { 96 | var props = this.props; 97 | return /*#__PURE__*/_react["default"].createElement("div", { 98 | ref: this.scrollArea, 99 | style: { 100 | overflow: 'auto' 101 | } 102 | }, /*#__PURE__*/_react["default"].createElement(_HorizontalScroll["default"], props)); 103 | } 104 | }]); 105 | 106 | return ReverseHorizontalScroll; 107 | }(_react["default"].Component); 108 | 109 | var _default = ReverseHorizontalScroll; 110 | exports["default"] = _default; 111 | //# sourceMappingURL=ReverseHorizontalScroll.js.map -------------------------------------------------------------------------------- /dist/ReverseHorizontalScroll.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["../src/ReverseHorizontalScroll.js"],"names":["ReverseHorizontalScroll","props","onWheel","bind","scrollArea","React","createRef","scrollElement","current","querySelector","addEventListener","removeEventListener","e","reverse","scrollDelta","deltaY","oldValue","scrollLeft","cancelBubble","preventDefault","overflow","Component"],"mappings":";;;;;;;;;AAAA;;AACA;;;;;;;;;;;;;;;;;;;;;;;;IAEMA,uB;;;;;AACJ,mCAAYC,KAAZ,EAAmB;AAAA;;AAAA;;AACjB,8BAAMA,KAAN;AACA,UAAKC,OAAL,GAAe,MAAKA,OAAL,CAAaC,IAAb,+BAAf;AACA,UAAKC,UAAL,gBAAkBC,kBAAMC,SAAN,EAAlB;AAHiB;AAIlB;;;;wCAEmB;AAClB,WAAKC,aAAL,GAAqB,KAAKH,UAAL,CAAgBI,OAAhB,CAAwBC,aAAxB,CAAsC,uBAAtC,CAArB;;AACA,UAAI,KAAKF,aAAT,EAAwB;AACtB,aAAKA,aAAL,CAAmBG,gBAAnB,CAAoC,OAApC,EAA6C,KAAKR,OAAlD,EAA2D,KAA3D;AACD;AACF;;;2CAEsB;AACrB,UAAI,KAAKK,aAAT,EAAwB;AACtB,aAAKA,aAAL,CAAmBI,mBAAnB,CAAuC,OAAvC,EAAgD,KAAKT,OAArD;AACD;AACF;;;4BAEOU,C,EAAG;AACT,UAAI,CAAC,KAAKL,aAAV,EAAyB;AACvB;AACD;;AAED,UAAMN,KAAK,GAAG,KAAKA,KAAnB;AACA,UAAMY,OAAO,GAAGZ,KAAK,CAACY,OAAN,GAAgB,CAAC,CAAjB,GAAqB,CAArC;AACA,UAAMC,WAAW,GAAG,CAACF,CAAC,CAACG,MAAF,IAAY,CAAb,IAAkBF,OAAtC;AACA,UAAMG,QAAQ,GAAG,KAAKT,aAAL,CAAmBU,UAApC;AAEA,WAAKV,aAAL,CAAmBU,UAAnB,IAAiCH,WAAjC;;AAEA,UAAIb,KAAK,CAACC,OAAV,EAAmB;AACjB,eAAOD,KAAK,CAACC,OAAN,CAAcU,CAAd,CAAP;AACD;;AAED,UAAI,KAAKL,aAAL,CAAmBU,UAAnB,KAAkCD,QAAtC,EAAgD;AAC9C;AACD;;AAEDJ,MAAAA,CAAC,CAACM,YAAF,GAAiB,IAAjB;AACAN,MAAAA,CAAC,CAACO,cAAF;AACA,aAAO,KAAP;AACD;;;6BAEQ;AACP,UAAMlB,KAAK,GAAG,KAAKA,KAAnB;AACA,0BACE;AAAK,QAAA,GAAG,EAAE,KAAKG,UAAf;AAA2B,QAAA,KAAK,EAAE;AAAEgB,UAAAA,QAAQ,EAAE;AAAZ;AAAlC,sBACE,gCAAC,4BAAD,EAAsBnB,KAAtB,CADF,CADF;AAKD;;;;EApDmCI,kBAAMgB,S;;eAuD7BrB,uB","sourcesContent":["import React from 'react';\nimport HorizontalScroll from '@vkontakte/vkui/dist/components/HorizontalScroll/HorizontalScroll';\n\nclass ReverseHorizontalScroll extends React.Component {\n constructor(props) {\n super(props);\n this.onWheel = this.onWheel.bind(this);\n this.scrollArea = React.createRef();\n }\n\n componentDidMount() {\n this.scrollElement = this.scrollArea.current.querySelector('.HorizontalScroll__in');\n if (this.scrollElement) {\n this.scrollElement.addEventListener('wheel', this.onWheel, false);\n }\n }\n\n componentWillUnmount() {\n if (this.scrollElement) {\n this.scrollElement.removeEventListener('wheel', this.onWheel);\n }\n }\n\n onWheel(e) {\n if (!this.scrollElement) {\n return;\n }\n\n const props = this.props;\n const reverse = props.reverse ? -1 : 1;\n const scrollDelta = (e.deltaY || 0) * reverse;\n const oldValue = this.scrollElement.scrollLeft;\n\n this.scrollElement.scrollLeft -= scrollDelta;\n\n if (props.onWheel) {\n return props.onWheel(e);\n }\n\n if (this.scrollElement.scrollLeft === oldValue) {\n return;\n }\n\n e.cancelBubble = true;\n e.preventDefault();\n return false;\n }\n\n render() {\n const props = this.props;\n return (\n
\n \n
\n );\n }\n}\n\nexport default ReverseHorizontalScroll;\n"],"file":"ReverseHorizontalScroll.js"} -------------------------------------------------------------------------------- /dist/ScrollArea.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } 4 | 5 | Object.defineProperty(exports, "__esModule", { 6 | value: true 7 | }); 8 | exports["default"] = void 0; 9 | 10 | var _react = _interopRequireDefault(require("react")); 11 | 12 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } 13 | 14 | function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } 15 | 16 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 17 | 18 | function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } 19 | 20 | function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 21 | 22 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } 23 | 24 | function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } 25 | 26 | function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } 27 | 28 | function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } 29 | 30 | function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } 31 | 32 | function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } 33 | 34 | function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } 35 | 36 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } 37 | 38 | var ScrollArea = /*#__PURE__*/function (_React$Component) { 39 | _inherits(ScrollArea, _React$Component); 40 | 41 | var _super = _createSuper(ScrollArea); 42 | 43 | function ScrollArea(props) { 44 | var _this; 45 | 46 | _classCallCheck(this, ScrollArea); 47 | 48 | _this = _super.call(this, props); 49 | 50 | _defineProperty(_assertThisInitialized(_this), "onTouch", function (event) { 51 | var el = event.currentTarget; 52 | var posOld = el.pos; 53 | var posNew = { 54 | x: event.touches[0].clientX, 55 | y: event.touches[0].clientY 56 | }; 57 | 58 | if (event.type !== 'touchstart') { 59 | var offsetX = posOld.x - posNew.x; 60 | var offsetY = posOld.y - posNew.y; 61 | el.scrollLeft += offsetX; 62 | el.scrollTop += offsetY; 63 | } 64 | 65 | el.pos = posNew; 66 | }); 67 | 68 | _this.scrollArea = /*#__PURE__*/_react["default"].createRef(); 69 | return _this; 70 | } 71 | 72 | _createClass(ScrollArea, [{ 73 | key: "getElements", 74 | value: function getElements() { 75 | return this.scrollArea.current.querySelectorAll(this.props.selector); 76 | } 77 | }, { 78 | key: "componentDidMount", 79 | value: function componentDidMount() { 80 | var _this2 = this; 81 | 82 | this.getElements().forEach(function (el) { 83 | el.addEventListener('touchstart', _this2.onTouch, false); 84 | el.addEventListener('touchmove', _this2.onTouch, false); 85 | }); 86 | } 87 | }, { 88 | key: "componentWillUnmount", 89 | value: function componentWillUnmount() { 90 | var _this3 = this; 91 | 92 | this.getElements().forEach(function (el) { 93 | el.removeEventListener('touchstart', _this3.onTouch); 94 | el.removeEventListener('touchmove', _this3.onTouch); 95 | }); 96 | } 97 | }, { 98 | key: "render", 99 | value: function render() { 100 | return /*#__PURE__*/_react["default"].createElement("div", _extends({ 101 | ref: this.scrollArea, 102 | className: "scrollArea" 103 | }, this.props)); 104 | } 105 | }]); 106 | 107 | return ScrollArea; 108 | }(_react["default"].Component); 109 | 110 | var _default = ScrollArea; 111 | exports["default"] = _default; 112 | //# sourceMappingURL=ScrollArea.js.map -------------------------------------------------------------------------------- /dist/ScrollArea.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["../src/ScrollArea.js"],"names":["ScrollArea","props","event","el","currentTarget","posOld","pos","posNew","x","touches","clientX","y","clientY","type","offsetX","offsetY","scrollLeft","scrollTop","scrollArea","React","createRef","current","querySelectorAll","selector","getElements","forEach","addEventListener","onTouch","removeEventListener","Component"],"mappings":";;;;;;;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAEMA,U;;;;;AACJ,sBAAYC,KAAZ,EAAmB;AAAA;;AAAA;;AACjB,8BAAMA,KAAN;;AADiB,8DAKT,UAACC,KAAD,EAAW;AACnB,UAAMC,EAAE,GAAGD,KAAK,CAACE,aAAjB;AACA,UAAMC,MAAM,GAAGF,EAAE,CAACG,GAAlB;AACA,UAAMC,MAAM,GAAG;AACbC,QAAAA,CAAC,EAAEN,KAAK,CAACO,OAAN,CAAc,CAAd,EAAiBC,OADP;AAEbC,QAAAA,CAAC,EAAET,KAAK,CAACO,OAAN,CAAc,CAAd,EAAiBG;AAFP,OAAf;;AAKA,UAAIV,KAAK,CAACW,IAAN,KAAe,YAAnB,EAAiC;AAC/B,YAAMC,OAAO,GAAGT,MAAM,CAACG,CAAP,GAAWD,MAAM,CAACC,CAAlC;AACA,YAAMO,OAAO,GAAGV,MAAM,CAACM,CAAP,GAAWJ,MAAM,CAACI,CAAlC;AAEAR,QAAAA,EAAE,CAACa,UAAH,IAAiBF,OAAjB;AACAX,QAAAA,EAAE,CAACc,SAAH,IAAgBF,OAAhB;AACD;;AAEDZ,MAAAA,EAAE,CAACG,GAAH,GAASC,MAAT;AACD,KAtBkB;;AAEjB,UAAKW,UAAL,gBAAkBC,kBAAMC,SAAN,EAAlB;AAFiB;AAGlB;;;;kCAqBa;AACZ,aAAO,KAAKF,UAAL,CAAgBG,OAAhB,CAAwBC,gBAAxB,CAAyC,KAAKrB,KAAL,CAAWsB,QAApD,CAAP;AACD;;;wCAEmB;AAAA;;AAClB,WAAKC,WAAL,GAAmBC,OAAnB,CAA2B,UAACtB,EAAD,EAAQ;AACjCA,QAAAA,EAAE,CAACuB,gBAAH,CAAoB,YAApB,EAAkC,MAAI,CAACC,OAAvC,EAAgD,KAAhD;AACAxB,QAAAA,EAAE,CAACuB,gBAAH,CAAoB,WAApB,EAAiC,MAAI,CAACC,OAAtC,EAA+C,KAA/C;AACD,OAHD;AAID;;;2CAEsB;AAAA;;AACrB,WAAKH,WAAL,GAAmBC,OAAnB,CAA2B,UAACtB,EAAD,EAAQ;AACjCA,QAAAA,EAAE,CAACyB,mBAAH,CAAuB,YAAvB,EAAqC,MAAI,CAACD,OAA1C;AACAxB,QAAAA,EAAE,CAACyB,mBAAH,CAAuB,WAAvB,EAAoC,MAAI,CAACD,OAAzC;AACD,OAHD;AAID;;;6BAEQ;AACP,0BAAO;AAAK,QAAA,GAAG,EAAE,KAAKT,UAAf;AAA2B,QAAA,SAAS,EAAC;AAArC,SAAsD,KAAKjB,KAA3D,EAAP;AACD;;;;EA7CsBkB,kBAAMU,S;;eAgDhB7B,U","sourcesContent":["import React from 'react';\n\nclass ScrollArea extends React.Component {\n constructor(props) {\n super(props);\n this.scrollArea = React.createRef();\n }\n\n onTouch = (event) => {\n const el = event.currentTarget;\n const posOld = el.pos;\n const posNew = {\n x: event.touches[0].clientX,\n y: event.touches[0].clientY,\n };\n\n if (event.type !== 'touchstart') {\n const offsetX = posOld.x - posNew.x;\n const offsetY = posOld.y - posNew.y;\n\n el.scrollLeft += offsetX;\n el.scrollTop += offsetY;\n }\n\n el.pos = posNew;\n };\n\n getElements() {\n return this.scrollArea.current.querySelectorAll(this.props.selector);\n }\n\n componentDidMount() {\n this.getElements().forEach((el) => {\n el.addEventListener('touchstart', this.onTouch, false);\n el.addEventListener('touchmove', this.onTouch, false);\n });\n }\n\n componentWillUnmount() {\n this.getElements().forEach((el) => {\n el.removeEventListener('touchstart', this.onTouch);\n el.removeEventListener('touchmove', this.onTouch);\n });\n }\n\n render() {\n return
;\n }\n}\n\nexport default ScrollArea;\n"],"file":"ScrollArea.js"} -------------------------------------------------------------------------------- /dist/SetWebTheme.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports["default"] = void 0; 7 | 8 | var _vkBridge = _interopRequireDefault(require("@vkontakte/vk-bridge")); 9 | 10 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } 11 | 12 | /** 13 | * Обертка над vk-bridge автоматически устанавливающая тему 14 | * 15 | * @param isWeb - Если нужно установить тему bright_light 16 | * @constructor 17 | */ 18 | function SetWebTheme(isWeb) { 19 | _vkBridge["default"].subscribe(function (_ref) { 20 | var _ref$detail = _ref.detail, 21 | type = _ref$detail.type, 22 | data = _ref$detail.data; 23 | 24 | switch (type) { 25 | case 'VKWebAppUpdateConfig': 26 | var schemeAttribute = document.createAttribute('scheme'); 27 | 28 | if (isWeb) { 29 | schemeAttribute.value = 'bright_light'; 30 | } else { 31 | schemeAttribute.value = data.scheme ? data.scheme : 'bright_light'; 32 | } 33 | 34 | document.body.attributes.setNamedItem(schemeAttribute); 35 | 36 | if (data.appearance === 'light') { 37 | _vkBridge["default"].send("VKWebAppSetViewSettings", { 38 | status_bar_style: "dark", 39 | action_bar_color: "#fff" 40 | }); 41 | } 42 | 43 | break; 44 | } 45 | }); 46 | } 47 | 48 | var _default = SetWebTheme; 49 | exports["default"] = _default; 50 | //# sourceMappingURL=SetWebTheme.js.map -------------------------------------------------------------------------------- /dist/SetWebTheme.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["../src/SetWebTheme.js"],"names":["SetWebTheme","isWeb","bridge","subscribe","detail","type","data","schemeAttribute","document","createAttribute","value","scheme","body","attributes","setNamedItem","appearance","send","status_bar_style","action_bar_color"],"mappings":";;;;;;;AAAA;;;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,WAAT,CAAqBC,KAArB,EAA4B;AAC1BC,uBAAOC,SAAP,CAAiB,gBAA+B;AAAA,2BAA5BC,MAA4B;AAAA,QAAlBC,IAAkB,eAAlBA,IAAkB;AAAA,QAAZC,IAAY,eAAZA,IAAY;;AAC9C,YAAQD,IAAR;AACE,WAAK,sBAAL;AACE,YAAIE,eAAe,GAAGC,QAAQ,CAACC,eAAT,CAAyB,QAAzB,CAAtB;;AAEA,YAAIR,KAAJ,EAAW;AACTM,UAAAA,eAAe,CAACG,KAAhB,GAAwB,cAAxB;AACD,SAFD,MAEO;AACLH,UAAAA,eAAe,CAACG,KAAhB,GAAwBJ,IAAI,CAACK,MAAL,GAAcL,IAAI,CAACK,MAAnB,GAA4B,cAApD;AACD;;AAEDH,QAAAA,QAAQ,CAACI,IAAT,CAAcC,UAAd,CAAyBC,YAAzB,CAAsCP,eAAtC;;AAEA,YAAID,IAAI,CAACS,UAAL,KAAoB,OAAxB,EAAiC;AAC/Bb,+BAAOc,IAAP,CAAY,yBAAZ,EAAuC;AACrCC,YAAAA,gBAAgB,EAAE,MADmB;AAErCC,YAAAA,gBAAgB,EAAE;AAFmB,WAAvC;AAID;;AAED;AAnBJ;AAqBD,GAtBD;AAuBD;;eAEclB,W","sourcesContent":["import bridge from '@vkontakte/vk-bridge';\n\n/**\n * Обертка над vk-bridge автоматически устанавливающая тему\n *\n * @param isWeb - Если нужно установить тему bright_light\n * @constructor\n */\nfunction SetWebTheme(isWeb) {\n bridge.subscribe(({ detail: { type, data }}) => {\n switch (type) {\n case 'VKWebAppUpdateConfig':\n let schemeAttribute = document.createAttribute('scheme');\n\n if (isWeb) {\n schemeAttribute.value = 'bright_light';\n } else {\n schemeAttribute.value = data.scheme ? data.scheme : 'bright_light';\n }\n\n document.body.attributes.setNamedItem(schemeAttribute);\n\n if (data.appearance === 'light') {\n bridge.send(\"VKWebAppSetViewSettings\", {\n status_bar_style: \"dark\",\n action_bar_color: \"#fff\"\n });\n }\n\n break;\n }\n });\n}\n\nexport default SetWebTheme;\n"],"file":"SetWebTheme.js"} -------------------------------------------------------------------------------- /dist/index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | Object.defineProperty(exports, "getArgs", { 7 | enumerable: true, 8 | get: function get() { 9 | return _Args["default"]; 10 | } 11 | }); 12 | Object.defineProperty(exports, "ls", { 13 | enumerable: true, 14 | get: function get() { 15 | return _localStorage["default"]; 16 | } 17 | }); 18 | Object.defineProperty(exports, "PanelHeaderFull", { 19 | enumerable: true, 20 | get: function get() { 21 | return _PanelHeader["default"]; 22 | } 23 | }); 24 | Object.defineProperty(exports, "PanelHeaderInternal", { 25 | enumerable: true, 26 | get: function get() { 27 | return _PanelHeaderInternal["default"]; 28 | } 29 | }); 30 | Object.defineProperty(exports, "PromiseAPI", { 31 | enumerable: true, 32 | get: function get() { 33 | return _PromiseAPI["default"]; 34 | } 35 | }); 36 | Object.defineProperty(exports, "ScrollArea", { 37 | enumerable: true, 38 | get: function get() { 39 | return _ScrollArea["default"]; 40 | } 41 | }); 42 | Object.defineProperty(exports, "SetWebTheme", { 43 | enumerable: true, 44 | get: function get() { 45 | return _SetWebTheme["default"]; 46 | } 47 | }); 48 | Object.defineProperty(exports, "ReverseHorizontalScroll", { 49 | enumerable: true, 50 | get: function get() { 51 | return _ReverseHorizontalScroll["default"]; 52 | } 53 | }); 54 | Object.defineProperty(exports, "JSONP_PromiseAPI", { 55 | enumerable: true, 56 | get: function get() { 57 | return _JSONP_PromiseAPI["default"]; 58 | } 59 | }); 60 | 61 | var _Args = _interopRequireDefault(require("./Args")); 62 | 63 | var _localStorage = _interopRequireDefault(require("./localStorage")); 64 | 65 | var _PanelHeader = _interopRequireDefault(require("./PanelHeader")); 66 | 67 | var _PanelHeaderInternal = _interopRequireDefault(require("./PanelHeaderInternal")); 68 | 69 | var _PromiseAPI = _interopRequireDefault(require("./PromiseAPI")); 70 | 71 | var _ScrollArea = _interopRequireDefault(require("./ScrollArea")); 72 | 73 | var _SetWebTheme = _interopRequireDefault(require("./SetWebTheme")); 74 | 75 | var _ReverseHorizontalScroll = _interopRequireDefault(require("./ReverseHorizontalScroll")); 76 | 77 | var _JSONP_PromiseAPI = _interopRequireDefault(require("./JSONP_PromiseAPI")); 78 | 79 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } 80 | //# sourceMappingURL=index.js.map -------------------------------------------------------------------------------- /dist/index.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["../src/index.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA","sourcesContent":["import getArgs from \"./Args\";\nimport ls from \"./localStorage\";\nimport PanelHeaderFull from \"./PanelHeader\";\nimport PanelHeaderInternal from \"./PanelHeaderInternal\";\nimport PromiseAPI from \"./PromiseAPI\";\nimport ScrollArea from \"./ScrollArea\";\nimport SetWebTheme from \"./SetWebTheme\";\nimport ReverseHorizontalScroll from \"./ReverseHorizontalScroll\";\nimport JSONP_PromiseAPI from \"./JSONP_PromiseAPI\";\n\nexport {\n getArgs,\n ls,\n PanelHeaderFull,\n PanelHeaderInternal,\n PromiseAPI,\n ScrollArea,\n SetWebTheme,\n ReverseHorizontalScroll,\n JSONP_PromiseAPI,\n};\n"],"file":"index.js"} -------------------------------------------------------------------------------- /dist/localStorage.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports["default"] = void 0; 7 | var ls = {}; 8 | 9 | try { 10 | localStorage.test = 1; 11 | ls = localStorage; 12 | delete localStorage.test; 13 | } catch (e) { 14 | if (console && console.warn) { 15 | console.warn("localStorage error"); 16 | } 17 | } 18 | 19 | var _default = ls; 20 | exports["default"] = _default; 21 | //# sourceMappingURL=localStorage.js.map -------------------------------------------------------------------------------- /dist/localStorage.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["../src/localStorage.js"],"names":["ls","localStorage","test","e","console","warn"],"mappings":";;;;;;AAAA,IAAIA,EAAE,GAAG,EAAT;;AAEA,IAAI;AACFC,EAAAA,YAAY,CAACC,IAAb,GAAoB,CAApB;AACAF,EAAAA,EAAE,GAAGC,YAAL;AACA,SAAOA,YAAY,CAACC,IAApB;AACD,CAJD,CAIE,OAAOC,CAAP,EAAU;AACV,MAAIC,OAAO,IAAIA,OAAO,CAACC,IAAvB,EAA6B;AAC3BD,IAAAA,OAAO,CAACC,IAAR,CAAa,oBAAb;AACD;AACF;;eAEcL,E","sourcesContent":["let ls = {};\n\ntry {\n localStorage.test = 1;\n ls = localStorage;\n delete localStorage.test;\n} catch (e) {\n if (console && console.warn) {\n console.warn(\"localStorage error\");\n }\n}\n\nexport default ls;\n\n"],"file":"localStorage.js"} -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 2 | module.exports = require('./dist/index.js'); 3 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vkappsutils", 3 | "version": "1.2.5", 4 | "description": "VK Mini Apps Utils", 5 | "author": "Flyink13", 6 | "license": "ISC", 7 | "main": "dist/vkappsutils.js", 8 | "scripts": { 9 | "build": "NODE_ENV=production webpack && babel src --out-dir dist --source-maps", 10 | "clear": "rm -rf dist/*" 11 | }, 12 | "devDependencies": { 13 | "@vkontakte/vk-bridge": "^2.3.0", 14 | "@vkontakte/vkui": "^3.13.2", 15 | "@babel/cli": "latest", 16 | "@babel/core": "latest", 17 | "@babel/plugin-proposal-class-properties": "latest", 18 | "@babel/plugin-proposal-object-rest-spread": "latest", 19 | "@babel/preset-env": "latest", 20 | "@babel/preset-react": "latest", 21 | "babel-loader": "^8.0.6", 22 | "webpack": "latest", 23 | "webpack-cli": "latest" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/Args.js: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Выводит параметры location.search 4 | * 5 | * @param clean [true] - Выводить только vk_ ключи и вырезать префикс 6 | * @returns {{}} 7 | */ 8 | function getArgs(clean = true) { 9 | return window.location.search 10 | .substr(1) 11 | .split("&") 12 | .reduce(function parseArg(prev, data) { 13 | const [keyRaw, valueRaw] = data.split("="); 14 | const value = decodeURIComponent(valueRaw || ""); 15 | let key = keyRaw; 16 | 17 | if (clean && /^vk_/.test(key)) { 18 | key = key.replace(/^vk_/, ''); 19 | } 20 | 21 | prev[key] = value; 22 | 23 | return prev; 24 | }, {}); 25 | } 26 | 27 | export default getArgs; 28 | -------------------------------------------------------------------------------- /src/JSONP_PromiseAPI.js: -------------------------------------------------------------------------------- 1 | import { Input, Alert } from '@vkontakte/vkui'; 2 | import React from "react"; 3 | 4 | class JSONP_PromiseAPI { 5 | constructor(data) { 6 | // user data 7 | this.access_token = (data ? data.access_token : false) || false; 8 | this.view = (data ? data.view : false) || false; 9 | this.v = (data ? data.v : false) || '5.92'; 10 | 11 | // requests map { request_id: request_data }; 12 | this.requests = {}; 13 | // requests cart [request_id, request_id, ...]; 14 | this.cart = []; 15 | 16 | // internal vars 17 | this.log = false; 18 | this.pause = false; 19 | 20 | // connect transport 21 | this.subscribe(); 22 | } 23 | 24 | subscribe() { 25 | window.apiCallback = window.apiCallback || {}; 26 | } 27 | 28 | debug(...args) { 29 | if (!this.log) return; 30 | console.log(...args); 31 | } 32 | 33 | cartCheck(request_id, ignoreCart) { 34 | if (!this.pause && (!this.interval || ignoreCart)) { 35 | const request = this.requests[request_id]; 36 | this.sendRequest(request); 37 | this.debug('cartCheck', 'call', request); 38 | return; 39 | } 40 | this.debug('cartCheck', 'push'); 41 | this.cart.push(request_id); 42 | } 43 | 44 | cartTick() { 45 | this.debug('cartTick', this.cart.length); 46 | if (!this.cart.length) { 47 | clearInterval(this.interval); 48 | delete this.interval; 49 | return; 50 | } 51 | const request_id = this.cart.shift(); 52 | this.cartCheck(request_id, true); 53 | } 54 | 55 | cartInit() { 56 | this.debug('cartInit'); 57 | if (this.interval) return; 58 | this.interval = setInterval(() => this.cartTick(), 334); 59 | } 60 | 61 | showCaptcha(method, params, error) { 62 | if (!this.view) { 63 | throw error; 64 | } 65 | 66 | this.pause = 1; 67 | return new Promise((resolve) => { 68 | const view = this.view; 69 | const oldPopout = view.state.popout; 70 | const { captcha_img } = error; 71 | view.setState({ 72 | popout: ( 73 | { 82 | resolve(view.state.captchaCode); 83 | view.setState({ popout: oldPopout, captchaCode: null }); 84 | }} 85 | > 86 |

Введите код с картинки

87 | {captcha_img}/ 88 | { 89 | const captchaCode = e.currentTarget.value; 90 | view.setState({ captchaCode }); 91 | }}/> 92 |
93 | ) 94 | }); 95 | }).then((captcha_key) => { 96 | this.pause = 0; 97 | const captcha_sid = error.captcha_sid; 98 | return this.callMethod(method, { 99 | ...params, 100 | captcha_key, 101 | captcha_sid, 102 | }); 103 | }); 104 | } 105 | 106 | callMethod = (method, params = {}) => { 107 | return new Promise((resolve, reject) => { 108 | const request_id = (Math.random() * 1e20).toString(32); 109 | const data = { 110 | method, 111 | params: { 112 | access_token: this.access_token, 113 | v: this.v, 114 | ...params, 115 | }, 116 | request_id, 117 | }; 118 | 119 | this.requests[request_id] = { resolve, reject, data }; 120 | this.cartCheck(request_id); 121 | }).catch((error) => { 122 | error = error || {}; 123 | const apiError = (typeof error.error_reason == 'object' ? error.error_reason : error.error_data) || error; 124 | const errorCode = apiError.error_code || 0; 125 | 126 | switch (errorCode) { 127 | case 6: 128 | this.cartInit(); 129 | return this.callMethod(method, params); 130 | case 14: 131 | return this.showCaptcha(method, params, apiError); 132 | default: 133 | throw apiError; 134 | } 135 | }); 136 | }; 137 | 138 | parseError = (data) => { 139 | const { error_data, request_id } = data; 140 | if (!this.requests[request_id]) return; 141 | this.requests[request_id].reject(error_data); 142 | delete this.requests[request_id]; 143 | }; 144 | 145 | parseResponse = (data) => { 146 | const { response, request_id } = data; 147 | if (!this.requests[request_id]) return; 148 | this.requests[request_id].resolve(response); 149 | delete this.requests[request_id]; 150 | }; 151 | 152 | callback(request_id, callback_name, { error: error_data, response }) { 153 | if (error_data) { 154 | this.parseError({ error_data, request_id }); 155 | } else { 156 | this.parseResponse({ response, request_id }); 157 | } 158 | 159 | document.getElementById(callback_name).outerHTML = ''; 160 | delete window.apiCallback[callback_name]; 161 | } 162 | 163 | sendJSON(callback_name, method, params) { 164 | const script = document.createElement('script'); 165 | let src = 'https://api.vk.com/method/' + method + '/?'; 166 | 167 | params.callback = 'apiCallback.' + callback_name; 168 | 169 | Object.entries(params).forEach(([key, value]) => { 170 | value = encodeURIComponent(String(value)); 171 | src += `&${key}=${value}`; 172 | }); 173 | 174 | script.id = callback_name; 175 | script.src = src; 176 | 177 | script.onerror = (error) => { 178 | window.apiCallback[callback_name]({ error }); 179 | }; 180 | 181 | document.head.appendChild(script); 182 | } 183 | 184 | sendRequest({ data: { method, params, request_id }}) { 185 | const callback_name = 'fn' + request_id.replace('.', '_'); 186 | 187 | window.apiCallback[callback_name] = this.callback.bind(this, request_id, callback_name); 188 | 189 | this.sendJSON(callback_name, method, params); 190 | } 191 | } 192 | 193 | export default JSONP_PromiseAPI; 194 | -------------------------------------------------------------------------------- /src/PanelHeader.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import PanelHeader from '@vkontakte/vkui/dist/components/PanelHeader/PanelHeader'; 3 | import HeaderButton from '@vkontakte/vkui/dist/components/HeaderButton/HeaderButton'; 4 | 5 | import Icon24Fullscreen from '@vkontakte/icons/dist/24/fullscreen'; 6 | import Icon24FullscreenExit from '@vkontakte/icons/dist/24/fullscreen_exit'; 7 | import PanelHeaderInternal from "./PanelHeaderInternal"; 8 | 9 | 10 | class PanelHeaderFull extends React.Component { 11 | constructor(props) { 12 | super(props); 13 | 14 | this.state = { 15 | fullScreenEnabled: false 16 | }; 17 | } 18 | 19 | onFullScreenUpdate = () => { 20 | const fullScreenEnabled = !!document.fullscreenElement; 21 | this.setState({ fullScreenEnabled }); 22 | }; 23 | 24 | fullScreenToggle() { 25 | const self = PanelHeaderFull; 26 | if (!document.fullscreenElement) { 27 | self.openFullscreen(document.documentElement); 28 | } else { 29 | self.closeFullscreen(); 30 | } 31 | this.onFullScreenUpdate(); 32 | } 33 | 34 | static openFullscreen() { 35 | var elem = document.body; 36 | if (elem.requestFullscreen) { 37 | elem.requestFullscreen(); 38 | } else if (elem.mozRequestFullScreen) { /* Firefox */ 39 | elem.mozRequestFullScreen(); 40 | } else if (elem.webkitRequestFullscreen) { /* Chrome, Safari and Opera */ 41 | elem.webkitRequestFullscreen(); 42 | } else if (elem.msRequestFullscreen) { /* IE/Edge */ 43 | elem.msRequestFullscreen(); 44 | } 45 | } 46 | 47 | static closeFullscreen() { 48 | if (document.exitFullscreen) { 49 | document.exitFullscreen(); 50 | } else if (document.mozCancelFullScreen) { /* Firefox */ 51 | document.mozCancelFullScreen(); 52 | } else if (document.webkitExitFullscreen) { /* Chrome, Safari and Opera */ 53 | document.webkitExitFullscreen(); 54 | } else if (document.msExitFullscreen) { /* IE/Edge */ 55 | document.msExitFullscreen(); 56 | } 57 | } 58 | 59 | componentDidMount() { 60 | window.addEventListener('fullscreenchange', this.onFullScreenUpdate); 61 | } 62 | 63 | componentWillUnmount() { 64 | window.removeEventListener('fullscreenchange', this.onFullScreenUpdate); 65 | } 66 | 67 | render() { 68 | const props = this.props; 69 | 70 | if (!props.isWeb) { 71 | return ( 72 | 73 | ); 74 | } 75 | 76 | const newProps = {}; 77 | newProps.theme = 'alternate'; 78 | newProps.right = ( 79 | this.fullScreenToggle()}> 80 | { this.state.fullScreenEnabled ? ( 81 | 82 | ) : ( 83 | 84 | )} 85 | 86 | ); 87 | 88 | return ( 89 | 90 | ); 91 | } 92 | } 93 | 94 | export default PanelHeaderFull; 95 | -------------------------------------------------------------------------------- /src/PanelHeaderInternal.js: -------------------------------------------------------------------------------- 1 | import PanelHeader from '@vkontakte/vkui/dist/components/PanelHeader/PanelHeader'; 2 | 3 | class PanelHeaderInternal extends PanelHeader { 4 | get webviewType () { 5 | const isWeb = this.props.isWeb; 6 | return isWeb ? 'internal' : 'vkapps'; 7 | } 8 | } 9 | 10 | export default PanelHeaderInternal; 11 | -------------------------------------------------------------------------------- /src/PromiseAPI.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import Alert from '@vkontakte/vkui/dist/components/Alert/Alert'; 3 | import Input from '@vkontakte/vkui/dist/components/Input/Input'; 4 | import bridge from "@vkontakte/vk-bridge"; 5 | 6 | class PromiseAPI { 7 | constructor(data) { 8 | // user data 9 | this.access_token = (data ? data.access_token : false) || false; 10 | this.view = (data ? data.view : false) || false; 11 | this.v = (data ? data.v : false) || '5.92'; 12 | this.reject_execute_errors = !!data.reject_execute_errors; 13 | 14 | // requests map { request_id: request_data }; 15 | this.requests = {}; 16 | // requests cart [request_id, request_id, ...]; 17 | this.cart = []; 18 | 19 | // internal vars 20 | this.log = false; 21 | this.pause = false; 22 | 23 | // bridge transport 24 | this.subscribe(); 25 | } 26 | 27 | subscribe() { 28 | this.bridge = bridge; 29 | this.bridge.subscribe(({ detail: { type, data }}) => { 30 | switch (type) { 31 | case 'VKWebAppCallAPIMethodFailed': 32 | this.parseError(data); 33 | break; 34 | case 'VKWebAppCallAPIMethodResult': 35 | this.parseResponse(data); 36 | break; 37 | } 38 | }); 39 | } 40 | 41 | sendRequest(request) { 42 | this.bridge.send('VKWebAppCallAPIMethod', request.data); 43 | } 44 | 45 | debug(...args) { 46 | if (!this.log) return; 47 | console.log(...args); 48 | } 49 | 50 | cartCheck(request_id, ignoreCart) { 51 | if (!this.pause && (!this.interval || ignoreCart)) { 52 | const request = this.requests[request_id]; 53 | this.sendRequest(request); 54 | this.debug('cartCheck', 'call', request); 55 | return; 56 | } 57 | this.debug('cartCheck', 'push'); 58 | this.cart.push(request_id); 59 | } 60 | 61 | cartTick() { 62 | this.debug('cartTick', this.cart.length); 63 | if (!this.cart.length) { 64 | clearInterval(this.interval); 65 | delete this.interval; 66 | return; 67 | } 68 | const request_id = this.cart.shift(); 69 | this.cartCheck(request_id, true); 70 | } 71 | 72 | cartInit() { 73 | this.debug('cartInit'); 74 | if (this.interval) return; 75 | this.interval = setInterval(() => this.cartTick(), 334); 76 | } 77 | 78 | showCaptcha(method, params, error) { 79 | if (!this.view) { 80 | throw error; 81 | } 82 | 83 | this.pause = 1; 84 | return new Promise((resolve) => { 85 | const view = this.view; 86 | const oldPopout = view.state.popout; 87 | view.setState({ 88 | popout: ( 89 | { 98 | resolve(view.state.captchaCode); 99 | view.setState({ popout: oldPopout, captchaCode: null }); 100 | }} 101 | > 102 |

Введите код с картинки

103 | {error.captcha_img}/ 104 | { 105 | const captchaCode = e.currentTarget.value; 106 | view.setState({ captchaCode }); 107 | }}/> 108 |
109 | ) 110 | }); 111 | }).then((captcha_key) => { 112 | this.pause = 0; 113 | const captcha_sid = error.captcha_sid; 114 | return this.callMethod(method, { 115 | ...params, 116 | captcha_key, 117 | captcha_sid, 118 | }); 119 | }); 120 | } 121 | 122 | getMethod(method) { 123 | return this.callMethod.bind(this, method); 124 | } 125 | 126 | callMethod = (method, params = {}) => { 127 | return new Promise((resolve, reject) => { 128 | const request_id = (Math.random() * 1e20).toString(32); 129 | const data = { 130 | method, 131 | params: { 132 | access_token: this.access_token, 133 | v: this.v, 134 | ...params, 135 | }, 136 | request_id, 137 | }; 138 | 139 | this.requests[request_id] = { resolve, reject, data }; 140 | this.cartCheck(request_id); 141 | }).catch((error) => { 142 | error = error || {}; 143 | const apiError = (typeof error.error_reason == 'object' ? error.error_reason : error.error_data) || error; 144 | const errorCode = apiError.error_code || 0; 145 | 146 | switch (errorCode) { 147 | case 6: 148 | this.cartInit(); 149 | return this.callMethod(method, params); 150 | case 14: 151 | return this.showCaptcha(method, params, apiError); 152 | } 153 | 154 | throw apiError; 155 | }); 156 | }; 157 | 158 | parseError = (data) => { 159 | const { error_data, request_id } = data; 160 | if (!this.requests[request_id]) return; 161 | this.requests[request_id].reject(error_data); 162 | delete this.requests[request_id]; 163 | }; 164 | 165 | parseResponse = (data) => { 166 | const { response, execute_errors, request_id } = data; 167 | if (!this.requests[request_id]) return; 168 | 169 | if (execute_errors && this.reject_execute_errors) { 170 | const error = execute_errors[0]; 171 | error.data = data; 172 | this.requests[request_id].reject(error); 173 | } else { 174 | this.requests[request_id].resolve(response); 175 | } 176 | 177 | delete this.requests[request_id]; 178 | }; 179 | } 180 | 181 | export default PromiseAPI; 182 | -------------------------------------------------------------------------------- /src/ReverseHorizontalScroll.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import HorizontalScroll from '@vkontakte/vkui/dist/components/HorizontalScroll/HorizontalScroll'; 3 | 4 | class ReverseHorizontalScroll extends React.Component { 5 | constructor(props) { 6 | super(props); 7 | this.onWheel = this.onWheel.bind(this); 8 | this.scrollArea = React.createRef(); 9 | } 10 | 11 | componentDidMount() { 12 | this.scrollElement = this.scrollArea.current.querySelector('.HorizontalScroll__in'); 13 | if (this.scrollElement) { 14 | this.scrollElement.addEventListener('wheel', this.onWheel, false); 15 | } 16 | } 17 | 18 | componentWillUnmount() { 19 | if (this.scrollElement) { 20 | this.scrollElement.removeEventListener('wheel', this.onWheel); 21 | } 22 | } 23 | 24 | onWheel(e) { 25 | if (!this.scrollElement) { 26 | return; 27 | } 28 | 29 | const props = this.props; 30 | const reverse = props.reverse ? -1 : 1; 31 | const scrollDelta = (e.deltaY || 0) * reverse; 32 | const oldValue = this.scrollElement.scrollLeft; 33 | 34 | this.scrollElement.scrollLeft -= scrollDelta; 35 | 36 | if (props.onWheel) { 37 | return props.onWheel(e); 38 | } 39 | 40 | if (this.scrollElement.scrollLeft === oldValue) { 41 | return; 42 | } 43 | 44 | e.cancelBubble = true; 45 | e.preventDefault(); 46 | return false; 47 | } 48 | 49 | render() { 50 | const props = this.props; 51 | return ( 52 |
53 | 54 |
55 | ); 56 | } 57 | } 58 | 59 | export default ReverseHorizontalScroll; 60 | -------------------------------------------------------------------------------- /src/ScrollArea.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | class ScrollArea extends React.Component { 4 | constructor(props) { 5 | super(props); 6 | this.scrollArea = React.createRef(); 7 | } 8 | 9 | onTouch = (event) => { 10 | const el = event.currentTarget; 11 | const posOld = el.pos; 12 | const posNew = { 13 | x: event.touches[0].clientX, 14 | y: event.touches[0].clientY, 15 | }; 16 | 17 | if (event.type !== 'touchstart') { 18 | const offsetX = posOld.x - posNew.x; 19 | const offsetY = posOld.y - posNew.y; 20 | 21 | el.scrollLeft += offsetX; 22 | el.scrollTop += offsetY; 23 | } 24 | 25 | el.pos = posNew; 26 | }; 27 | 28 | getElements() { 29 | return this.scrollArea.current.querySelectorAll(this.props.selector); 30 | } 31 | 32 | componentDidMount() { 33 | this.getElements().forEach((el) => { 34 | el.addEventListener('touchstart', this.onTouch, false); 35 | el.addEventListener('touchmove', this.onTouch, false); 36 | }); 37 | } 38 | 39 | componentWillUnmount() { 40 | this.getElements().forEach((el) => { 41 | el.removeEventListener('touchstart', this.onTouch); 42 | el.removeEventListener('touchmove', this.onTouch); 43 | }); 44 | } 45 | 46 | render() { 47 | return
; 48 | } 49 | } 50 | 51 | export default ScrollArea; 52 | -------------------------------------------------------------------------------- /src/SetWebTheme.js: -------------------------------------------------------------------------------- 1 | import bridge from '@vkontakte/vk-bridge'; 2 | 3 | /** 4 | * Обертка над vk-bridge автоматически устанавливающая тему 5 | * 6 | * @param isWeb - Если нужно установить тему bright_light 7 | * @constructor 8 | */ 9 | function SetWebTheme(isWeb) { 10 | bridge.subscribe(({ detail: { type, data }}) => { 11 | switch (type) { 12 | case 'VKWebAppUpdateConfig': 13 | let schemeAttribute = document.createAttribute('scheme'); 14 | 15 | if (isWeb) { 16 | schemeAttribute.value = 'bright_light'; 17 | } else { 18 | schemeAttribute.value = data.scheme ? data.scheme : 'bright_light'; 19 | } 20 | 21 | document.body.attributes.setNamedItem(schemeAttribute); 22 | 23 | if (data.appearance === 'light') { 24 | bridge.send("VKWebAppSetViewSettings", { 25 | status_bar_style: "dark", 26 | action_bar_color: "#fff" 27 | }); 28 | } 29 | 30 | break; 31 | } 32 | }); 33 | } 34 | 35 | export default SetWebTheme; 36 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import getArgs from "./Args"; 2 | import ls from "./localStorage"; 3 | import PanelHeaderFull from "./PanelHeader"; 4 | import PanelHeaderInternal from "./PanelHeaderInternal"; 5 | import PromiseAPI from "./PromiseAPI"; 6 | import ScrollArea from "./ScrollArea"; 7 | import SetWebTheme from "./SetWebTheme"; 8 | import ReverseHorizontalScroll from "./ReverseHorizontalScroll"; 9 | import JSONP_PromiseAPI from "./JSONP_PromiseAPI"; 10 | 11 | export { 12 | getArgs, 13 | ls, 14 | PanelHeaderFull, 15 | PanelHeaderInternal, 16 | PromiseAPI, 17 | ScrollArea, 18 | SetWebTheme, 19 | ReverseHorizontalScroll, 20 | JSONP_PromiseAPI, 21 | }; 22 | -------------------------------------------------------------------------------- /src/localStorage.js: -------------------------------------------------------------------------------- 1 | let ls = {}; 2 | 3 | try { 4 | localStorage.test = 1; 5 | ls = localStorage; 6 | delete localStorage.test; 7 | } catch (e) { 8 | if (console && console.warn) { 9 | console.warn("localStorage error"); 10 | } 11 | } 12 | 13 | export default ls; 14 | 15 | -------------------------------------------------------------------------------- /utils/SignVerify.js: -------------------------------------------------------------------------------- 1 | const {createHmac} = require('crypto'); 2 | const querystring = require('querystring'); 3 | const sha256 = (string, pwd) => createHmac('sha256', pwd).update(string).digest('base64'); 4 | 5 | function signVerify(url, clientSecret) { 6 | const parsedSearch = querystring.parse(url); 7 | 8 | const checkSumRaw = Object 9 | .keys(parsedSearch) 10 | .filter((key) => /^vk_/.test(key)) 11 | .sort() 12 | .map((key) => { 13 | const val = parsedSearch[key]; 14 | return key + '=' + val; 15 | }) 16 | .join('&'); 17 | 18 | const checkSum = sha256(checkSumRaw, clientSecret) 19 | .replace(/\+/g, '-') 20 | .replace(/\//g, '_') 21 | .replace(/=/g, ''); 22 | 23 | return checkSum === parsedSearch['sign']; 24 | } 25 | 26 | module.exports = signVerify; 27 | -------------------------------------------------------------------------------- /utils/setAndroidTheme.js: -------------------------------------------------------------------------------- 1 | 2 | function setAndroidTheme() { 3 | window.isWeb = /web=1/.test(window.location.search); 4 | if (window.isWeb) { 5 | Object.defineProperties(navigator, { 6 | userAgent: { 7 | value: 'web android', 8 | configurable: false, 9 | enumerable: true, 10 | writable: false 11 | } 12 | }); 13 | } 14 | } 15 | 16 | setAndroidTheme(); 17 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | 3 | const config = { 4 | entry: { 5 | index: './src/index.js' 6 | }, 7 | output: { 8 | path: path.resolve(__dirname, 'dist'), 9 | filename: '[name].js', 10 | libraryTarget: 'umd' 11 | }, 12 | module: { 13 | rules: [ 14 | { 15 | test: /\.js?$/, 16 | exclude: /node_modules/, 17 | loader: 'babel-loader' 18 | } 19 | ] 20 | }, 21 | optimization: { 22 | minimize: false 23 | }, 24 | devtool: 'source-map', 25 | mode: 'development', 26 | externals: [ 27 | { 28 | 'react': 'react', 29 | 'prop-types': 'prop-types', 30 | 'react-dom': 'react-dom' 31 | }, 32 | /@vkontakte\/.+/ 33 | ] 34 | }; 35 | 36 | module.exports = config; 37 | --------------------------------------------------------------------------------