UNPKG

19.8 kBJavaScriptView Raw
1var _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; };
2
3import jsonp from './../jsonp';
4import DB from './../DB';
5import Device from './../Device';
6import Toast from './../Toast/instance.js';
7import Alert from './../Alert/instance.js';
8import Loading from './../Loading/instance.js';
9
10if (!window._seeds_lang) window._seeds_lang = {}; // 国际化数据
11
12var Bridge = {
13 /**
14 * 基础功能:start
15 */
16 debug: false,
17 // 拨打电话
18 tel: function tel(number) {
19 if (Device.device === 'pc') {
20 this.showToast(window._seeds_lang['hint_only_mobile'] || '此功能仅可在手机中使用');
21 return;
22 }
23 if (isNaN(number)) return;
24 window.location.href = 'tel:' + number;
25 },
26 // 弹出toast
27 toast: null,
28 showToast: function showToast(msg) {
29 var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
30
31 if (!msg) return;
32 if (!this.toast) {
33 // 提示错误
34 this.toast = new Toast({
35 parent: document.body,
36 maskClass: 'mask toast-mask' + (params.mask === false ? ' toast-propagation' : ''),
37 toastClass: 'toast ' + (params.position ? params.position : 'middle'),
38 icon: params.icon || '',
39 html: msg,
40 delay: params.delay || 2000
41 });
42 } else {
43 this.toast.setHTML(msg);
44 this.toast.setMaskClassName('mask toast-mask' + (params.mask === false ? ' toast-propagation' : ''));
45 this.toast.setToastClassName('toast ' + (params.position ? params.position : 'middle'));
46 this.toast.setIcon(params.icon || '');
47 this.toast.setDelay(params.delay || 2000);
48 }
49 this.toast.show();
50 if (params.success) {
51 setTimeout(function () {
52 params.success();
53 }, params.delay ? Math.round(params.delay / 2) : 1000);
54 }
55 },
56 // 弹出loading
57 loading: null,
58 showLoading: function showLoading() {
59 var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
60
61 if (!this.loading) {
62 this.loading = new Loading({
63 caption: params.caption || window._seeds_lang['loading'] || '正在加载...',
64 type: params.type,
65 icon: params.icon || '',
66 maskCss: params.css || null
67 });
68 } else {
69 if (params.caption) this.loading.setCaption(params.caption);
70 if (params.type) this.loading.setType(params.type);
71 if (params.css) this.loading.setMaskCss(params.css);
72 if (params.icon) this.toast.setIcon(params.icon || '');
73 if (params.mask) this.loading.setMaskClassName('mask loading-mask ' + (params.mask === false ? ' loading-propagation' : ''));
74 }
75 this.loading.show();
76 },
77 hideLoading: function hideLoading() {
78 if (!this.loading) {
79 this.toast.showToast(window._seeds_lang['hint_hideloading_after_showloading'] || 'showLoading后才能hideLoading');
80 } else {
81 this.loading.hide();
82 }
83 },
84 // 弹出Alert
85 alert: null,
86 showAlert: function showAlert(msg) {
87 var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
88
89 if (!this.alert) {
90 this.alert = new Alert(_extends({}, params, {
91 html: msg,
92 onClickSubmit: function onClickSubmit(e) {
93 if (params.success) params.success(e);else e.hide();
94 }
95 }));
96 } else {
97 if (params) {
98 this.alert.reset();
99 for (var n in params) {
100 this.alert.params[n] = params[n];
101 }
102 this.alert.updateDOM();
103 this.alert.setHTML(msg);
104 }
105 }
106 this.alert.show();
107 },
108 // 弹出Confirm
109 confirm: null,
110 showConfirm: function showConfirm(msg) {
111 var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
112
113 if (!this.confirm) {
114 this.confirm = new Alert(_extends({}, params, {
115 html: msg,
116 onClickSubmit: function onClickSubmit(e) {
117 if (params.success) params.success(e);
118 },
119 onClickCancel: function onClickCancel(e) {
120 if (params.fail) params.fail(e);else e.hide();
121 }
122 }));
123 } else {
124 if (params) {
125 this.confirm.reset();
126 for (var n in params) {
127 this.confirm.params[n] = params[n];
128 }
129 this.confirm.updateDOM();
130 if (params.success) this.confirm.setOnClickSubmit(params.success);
131 if (params.fail) this.confirm.setOnClickCancel(params.fail);
132 }
133 this.confirm.setHTML(msg);
134 }
135 this.confirm.show();
136 },
137 /**
138 * 百度地图:获取当前位置名称,只支持gcj02
139 * @param {Object} params: {longitude: '', latitude: '', success: fn, fail: fn}
140 * @returns {Object} {address:'地址全称'}
141 */
142 getAddress: function getAddress() {
143 var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
144
145 var url = 'https://api.map.baidu.com/geocoder/v2/?callback=renderReverse&location=' + params.latitude + ',' + params.longitude + '&output=json&pois=1&ak=IlfRglMOvFxapn5eGrmAj65H&ret_coordtype=gcj02ll';
146 jsonp(url, null, function (err, data) {
147 if (err) {
148 if (params.fail) params.fail({ errMsg: 'getAddress:' + (window._seeds_lang['hint_address_failed'] || '获取地址失败, 请稍后重试') + err });
149 } else {
150 var addrs = {};
151 if (data.result && data.result.formatted_address) {
152 addrs.address = data.result.formatted_address;
153 if (params.success) params.success(addrs);
154 } else {
155 if (params.fail) params.fail({ errMsg: 'getAddress:' + (window._seeds_lang['hint_address_failed'] || '获取地址失败, 请稍后重试') });
156 }
157 }
158 });
159 },
160 /**
161 * 百度地图:获得天气
162 * @param {Object} params: {location: 'lng,lat|lng,lat|lng,lat' | '北京市|上海市', success: fn, fail: fn}
163 * @returns {Object} 天气信息results
164 */
165 getWeather: function getWeather() {
166 var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
167
168 var url = 'http://api.map.baidu.com/telematics/v3/weather?location=' + (params.location || '南京市') + '&output=json&ak=IlfRglMOvFxapn5eGrmAj65H';
169 jsonp(url, null, function (err, data) {
170 if (err) {
171 if (params.fail) params.fail({ errMsg: 'getWeather:' + (window._seeds_lang['hint_weather_failed'] || '获取天气失败, 请稍后重试') + err });
172 } else {
173 if (data.results && data.results.length) {
174 if (params.success) params.success(data.results);
175 } else {
176 if (params.fail) params.fail({ errMsg: 'getWeather:' + (window._seeds_lang['hint_weather_failed'] || '获取天气失败, 请稍后重试') });
177 }
178 }
179 });
180 },
181 // 客户端默认返回控制
182 back: function back(argHistory, argBackLvl) {
183 // 返回操作对象与返回层级
184 var _history = window.history;
185 if (argHistory && argHistory.go) _history = argHistory;
186 var _backLvl = argBackLvl || -1;
187
188 // 返回类型
189 var isFromApp = Device.getUrlParameter('isFromApp', location.search) || '';
190 if (isFromApp === '1') {
191 // 关闭当前页面
192 try {
193 Bridge.closeWindow();
194 } catch (error) {
195 console.log(error);
196 }
197 } else if (isFromApp === 'home') {
198 // 返回首页
199 try {
200 Bridge.goHome();
201 } catch (error) {
202 console.log(error);
203 }
204 } else if (isFromApp === 'confirm') {
205 // 提示后返回上一页
206 Bridge.showConfirm(Bridge.confirmCaption || window._seeds_lang['confirm_quit_page'] || '您确定要离开此页面吗?', {
207 success: function success(e) {
208 e.hide();
209 _history.go(_backLvl);
210 }
211 });
212 } else if (isFromApp === 'confirm-close') {
213 // 提示后关闭当前页面
214 Bridge.showConfirm(Bridge.confirmCaption || window._seeds_lang['confirm_quit_page'] || '您确定要离开此页面吗?', {
215 success: function success(e) {
216 e.hide();
217 Bridge.closeWindow();
218 }
219 });
220 } else if (isFromApp === 'custom') {
221 console.log('自定义');
222 } else {
223 // 返加上一页
224 _history.go(_backLvl);
225 }
226 },
227 // 判断是否是主页
228 isHomePage: function isHomePage(callback, rule) {
229 if (rule && window.location.href.indexOf(rule) >= 0) {
230 callback(true);
231 return;
232 }
233 callback(false);
234 },
235 // 获得版本信息
236 getAppVersion: function getAppVersion() {
237 return window.navigator.appVersion;
238 },
239 // 返回首页
240 goHome: function goHome() {
241 window.history.go(-1);
242 },
243 // 退出到登陆页面
244 logOut: function logOut() {
245 console.log('logOut方法仅在app上工作');
246 },
247 // 打开新的窗口
248 openWindow: function openWindow() {
249 var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
250
251 if (params.url) window.location.href = params.url;
252 },
253 // 关闭窗口
254 closeWindow: function closeWindow() {
255 wx.closeWindow(); // eslint-disable-line
256 },
257 // 客户端返回绑定
258 addBackPress: function addBackPress(callback) {
259 if (wx.onHistoryBack) {
260 // eslint-disable-line
261 wx.onHistoryBack(function () {
262 // eslint-disable-line
263 if (callback) {
264 callback();
265 } else {
266 Bridge.back();
267 }
268 return false;
269 });
270 }
271 },
272 // 客户端移除返回绑定
273 removeBackPress: function removeBackPress() {
274 if (wx.onHistoryBack) {
275 // eslint-disable-line
276 wx.onHistoryBack(function () {
277 // eslint-disable-line
278 return true;
279 });
280 }
281 },
282 /**
283 * 基础功能:end
284 */
285
286 /**
287 * 定制功能
288 */
289 platform: Device.platform,
290 /**
291 * 获取当前地理位置
292 * @param {Object} params
293 * params: {
294 * type {String}: 'wgs84'|'gcj02'坐标类型微信默认使用国际坐标'wgs84',
295 * cache {Number}: 默认60秒缓存防重复定位
296 * }
297 * @returns {Object} {latitude: '纬度', longitude: '经度', speed:'速度', accuracy:'位置精度'}
298 */
299 getLocation: function getLocation() {
300 var _this = this;
301
302 var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
303
304 // 先从cookie中读取位置信息
305 var appLocation = DB.getCookie('app_location');
306 if (appLocation === 'undefined') {
307 DB.removeCookie('app_location');
308 appLocation = '';
309 }
310 try {
311 if (appLocation) appLocation = JSON.parse(appLocation);
312 } catch (error) {
313 appLocation = '';
314 }
315 if (appLocation) {
316 if (params.success) params.success(appLocation);
317 return;
318 }
319 // 调用定位
320 if (this.locating) return;
321 this.locating = true;
322 console.log('调用定位...');
323 wx.getLocation({ // eslint-disable-line
324 // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
325 type: 'gcj02',
326 success: function success(res) {
327 _this.locating = false;
328 // 将位置信息存储到cookie中60秒
329 if (res.latitude && res.latitude) {
330 if (params.cache) DB.setCookie('app_location', JSON.stringify(res), params.cache || 60);
331 if (params.success) params.success(res);
332 } else {
333 if (params.fail) params.fail(res);else Bridge.showToast('没有获取到经纬度', { mask: false });
334 }
335 },
336 fail: function fail(res) {
337 _this.locating = false;
338 if (params.fail) params.fail(res);else Bridge.showToast('定位失败,请检查微信定位权限是否开启', { mask: false });
339 },
340 complete: function complete(res) {
341 _this.locating = false;
342 if (params.complete) params.complete(res);
343 }
344 });
345 },
346 /*
347 * 扫描二维码并返回结果
348 * 返回:{resultStr:''}
349 * */
350 scanQRCode: function scanQRCode() {
351 var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
352
353 wx.scanQRCode({ // eslint-disable-line
354 needResult: params.needResult || 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果
355 scanType: params.scanType || ['qrCode', 'barCode'],
356 desc: params.desc || '二维码/条码',
357 success: function success(res) {
358 if (!params.success) return;
359 var wxRes = res;
360 // 如果没有设置prefix为false或者空,则清除前缀
361 if (!params.prefix) {
362 if (res.resultStr.indexOf('QR,') >= 0) {
363 wxRes.resultStr = res.resultStr.substring('QR,'.length);
364 } else if (res.resultStr.indexOf('EAN_13,') >= 0) {
365 wxRes.resultStr = res.resultStr.substring('EAN_13,'.length);
366 } else if (res.resultStr.indexOf('EAN_8,') >= 0) {
367 wxRes.resultStr = res.resultStr.substring('EAN_8,'.length);
368 } else if (res.resultStr.indexOf('AZTEC,') >= 0) {
369 wxRes.resultStr = res.resultStr.substring('AZTEC,'.length);
370 } else if (res.resultStr.indexOf('DATAMATRIX,') >= 0) {
371 wxRes.resultStr = res.resultStr.substring('DATAMATRIX,'.length);
372 } else if (res.resultStr.indexOf('UPCA,') >= 0) {
373 wxRes.resultStr = res.resultStr.substring('UPCA,'.length);
374 } else if (res.resultStr.indexOf('UPCE,') >= 0) {
375 wxRes.resultStr = res.resultStr.substring('UPCE,'.length);
376 } else if (res.resultStr.indexOf('CODABAR,') >= 0) {
377 wxRes.resultStr = res.resultStr.substring('CODABAR,'.length);
378 } else if (res.resultStr.indexOf('CODE_39,') >= 0) {
379 wxRes.resultStr = res.resultStr.substring('CODE_39,'.length);
380 } else if (res.resultStr.indexOf('CODE_93,') >= 0) {
381 wxRes.resultStr = res.resultStr.substring('CODE_93,'.length);
382 } else if (res.resultStr.indexOf('CODE_128,') >= 0) {
383 wxRes.resultStr = res.resultStr.substring('CODE_128,'.length);
384 } else if (res.resultStr.indexOf('ITF,') >= 0) {
385 wxRes.resultStr = res.resultStr.substring('ITF,'.length);
386 } else if (res.resultStr.indexOf('MAXICODE,') >= 0) {
387 wxRes.resultStr = res.resultStr.substring('MAXICODE,'.length);
388 } else if (res.resultStr.indexOf('PDF_417,') >= 0) {
389 wxRes.resultStr = res.resultStr.substring('PDF_417,'.length);
390 } else if (res.resultStr.indexOf('RSS_14,') >= 0) {
391 wxRes.resultStr = res.resultStr.substring('RSS_14,'.length);
392 } else if (res.resultStr.indexOf('RSSEXPANDED,') >= 0) {
393 wxRes.resultStr = res.resultStr.substring('RSSEXPANDED,'.length);
394 }
395 }
396 // 回调
397 params.success(wxRes);
398 },
399 fail: function fail(res) {
400 if (params.fail) params.fail(res);else Bridge.showToast(res.errMsg, { mask: false });
401 },
402 cancel: function cancel(res) {
403 if (params.cancel) params.cancel(res);
404 },
405 complete: function complete(res) {
406 if (params.complete) params.complete(res);
407 }
408 });
409 },
410
411 /*
412 * 拍照、本地选图
413 * params:{sourceType:['album:相册', 'camera:拍照'],sizeType:['original:原图', 'compressed:压缩'],count:'最大张数', success:fn, fail:fn, cancel: fn, complete: fn}
414 * 返回选定照片的本地ID列表{localIds:[]'}
415 */
416 chooseImage: function chooseImage(params) {
417 wx.chooseImage(params); // eslint-disable-line
418 },
419 /*
420 * 上传图片
421 params:{
422 localId: '', // 需要上传的图片的本地ID,由chooseImage接口获得
423 isShowProgressTips: 1, // 默认为1,显示进度提示
424 success: function (res) {
425 var serverId = res.serverId; // 返回图片的服务器端ID
426 }
427 }
428 */
429 uploadImage: function uploadImage(params) {
430 wx.uploadImage(params); // eslint-disable-line
431 },
432 /*
433 * 图片预览
434 * params:{urls:'需要预览的图片http链接列表',current:'当前显示图片的http链接'}
435 */
436 previewImage: function previewImage(params) {
437 wx.previewImage(params); // eslint-disable-line
438 },
439 /* 封装图片控件,使用示例见ImgUploader组件
440 bridge.Image({
441 onChooseSuccess: function (imgMap, res) {},
442 onUploadSuccess:function(imgMap, res) // 单张上传成功
443 onUploadFail:function(imgMap, {id, index, item, errMsg}) // 单张上传失败
444 onUploadsSuccess:function(imgMap) // 全部上传成功
445 })
446 */
447 Image: function Image(params) {
448 var s = this;
449 var msg = '';
450 // 选择照片
451 s.choose = function () {
452 var args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
453
454 var option = {
455 enableSafe: args.enableSafe || false, // 安全上传,第次只能传一张
456 max: args.max || 5,
457 currentCount: args.currentCount || 0,
458 sourceType: args.sourceType || ['album', 'camera'],
459 sizeType: args.sizeType || ['original', 'compressed'],
460 chooseOptions: args.chooseOptions || {},
461 localIds: args.localIds || [] // 去重处理
462 };
463 var count = option.max - option.currentCount;
464 if (count <= 0) {
465 msg = (window._seeds_lang['hint_max_upload'] || '最多只能传') + option.max + (window._seeds_lang['photos'] || '张照片');
466 Bridge.showToast(msg);
467 return;
468 }
469 // 如果设置了安全上传,则每次只允许上传一张
470 if (option.enableSafe) count = 1;
471 Bridge.chooseImage(Object.assign({
472 count: count, // 默认5
473 sizeType: option.sizeType, // 可以指定是原图还是压缩图,默认二者都有
474 sourceType: option.sourceType, // 可以指定来源是相册还是相机,默认二者都有camera|album
475 success: function success(res) {
476 var imgMap = {};
477 for (var i = 0, localId; localId = res.localIds[i++];) {
478 // eslint-disable-line
479 if (option.localIds.indexOf(localId) === -1) {
480 imgMap[localId] = {
481 serverId: '',
482 sourceType: res.sourceType
483 };
484 }
485 }
486 if (params.onChooseSuccess) params.onChooseSuccess(imgMap, res);
487 s.upload(imgMap);
488 },
489 fail: function fail(res) {
490 if (params.onChooseFail) params.onChooseFail(res);else Bridge.showToast('选择照片失败', { mask: false });
491 },
492 cancel: function cancel() {},
493 complete: function complete() {}
494 }, option.chooseOptions));
495 };
496 // 上传照片
497 s.upload = function (imgMap) {
498 var imgs = Object.keys(imgMap);
499 var loop = function loop(index) {
500 if (index >= imgs.length) {
501 return;
502 }
503 var img = imgs[index];
504 if (imgMap[img].serverId) {
505 loop(++index);
506 return;
507 }
508 Bridge.uploadImage({
509 localId: img, // 需要上传的图片的本地ID,由chooseImage接口获得
510 isShowProgressTips: 1, // 默认为1,显示进度提示
511 success: function success(res) {
512 var serverId = res.serverId; // 返回图片的服务器端ID
513 imgMap[img].serverId = serverId;
514 if (params.onUploadSuccess) params.onUploadSuccess(imgMap, res);
515 if (index >= imgs.length - 1 && params.onUploadsSuccess) params.onUploadsSuccess(imgMap);
516 loop(++index);
517 },
518 fail: function fail() {
519 var deleteItem = imgMap[img];
520 if (params.onUploadFail) params.onUploadFail(imgMap, { id: img, index: index, item: deleteItem, errMsg: 'uploadImage:' + msg });
521 if (index >= imgs.length - 1 && params.onUploadsSuccess) params.onUploadsSuccess(imgMap);
522 loop(++index);
523 }
524 });
525 };
526 loop(0);
527 };
528 }
529};
530
531export default Bridge;
\No newline at end of file