├── .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
\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
\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 |
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 |
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 |
--------------------------------------------------------------------------------