Preserve H5 flows while adding Taobao identity, native capture, reports and isolated local development. Fix canceled province selection and expired-session logout. Record passing local regressions, two pre-existing H5 assertion failures and pending platform validation.
40 lines
2.0 KiB
JavaScript
40 lines
2.0 KiB
JavaScript
// Taobao scopes are independent: userInfo login does not grant camera/album.
|
|
var denied = {};
|
|
function state(settings, scope) {
|
|
settings = settings || {};
|
|
var key = scope.replace(/^scope\./, '');
|
|
return typeof settings[scope] === 'boolean' ? settings[scope] : settings[key];
|
|
}
|
|
function settings() {
|
|
return new Promise(function (resolve) {
|
|
if (typeof my.getSetting !== 'function') { resolve({}); return; }
|
|
my.getSetting({ success: function (res) { resolve(res.authSetting || {}); }, fail: function () { resolve({}); } });
|
|
});
|
|
}
|
|
function rejected(scope) {
|
|
var err = new Error(scope === 'scope.camera' ? '相机权限未开启,可在授权设置中开启,或使用相册' : '相册权限未开启,请在授权设置中开启');
|
|
err.permission = scope; return err;
|
|
}
|
|
function ensure(scope) {
|
|
return settings().then(function (current) {
|
|
if (state(current, scope) === true) { delete denied[scope]; return; }
|
|
if (state(current, scope) === false || denied[scope]) throw rejected(scope);
|
|
return new Promise(function (resolve, reject) {
|
|
if (typeof my.authorize !== 'function') { reject(new Error('当前淘宝版本不支持授权,请升级后重试')); return; }
|
|
my.authorize({ scopes: scope, success: function () { delete denied[scope]; resolve(); },
|
|
fail: function () { denied[scope] = true; reject(rejected(scope)); } });
|
|
});
|
|
});
|
|
}
|
|
function open() {
|
|
return new Promise(function (resolve, reject) {
|
|
if (typeof my.openSetting !== 'function') { reject(new Error('请在小程序右上角的授权设置中开启权限')); return; }
|
|
my.openSetting({ success: function (res) {
|
|
var current = res.authSetting || {};
|
|
['scope.camera', 'scope.album'].forEach(function (scope) { if (state(current, scope) === true) delete denied[scope]; });
|
|
resolve(current);
|
|
}, fail: function () { reject(new Error('无法打开授权设置,请从小程序右上角进入')); } });
|
|
});
|
|
}
|
|
module.exports = { ensure: ensure, settings: settings, state: state, open: open };
|