mtl-js-sdk
Version:
ynf-fw-mtl-api
157 lines (147 loc) • 5.57 kB
JavaScript
import {localizedString} from './localization';
import {invokeSuccess, invokeFail} from './callback'
let permissionMap = {
camera:'permissionCamera',
contacts:'permissionContacts',
'contacts-r':'permissionContacts',
'contacts-r':'permissionContacts',
microphone:'permissionMicrophone',
photos:'permissionPhotos',
'photos-w':'permissionPhotos',
location:'permissionLocation',
locationAlways:'permissionLocation',
notification:'permissionNotification',
calendar:'permissionCalendar',
'calendar-r':'permissionCalendar',
'calendar-w':'permissionCalendar',
phone:'permissionPhone',
'phone-call':'permissionPhone',
'phone-r':'permissionPhone',
'phone-r-log':'permissionPhone',
'phone-w-log':'permissionPhone',
sensor:'permissionSensor',
sms:'permissionSms',
'sms-s':'permissionSms',
'sms-r':'permissionSms',
storage:'permissionStorage',
'storage-r':'permissionStorage',
'storage-w':'permissionStorage'
};
let requestPermissionAlertFlagMap = {};
let requestPermissionHandlerMap = {};
function getPermissionDesc(name) {
let key = permissionMap[name];
let desc = localizedString(key);
return desc || '';
}
function registerPermissionHandle(name, callback) {
let list = requestPermissionHandlerMap[name];
if (list) {
list.push(callback);
} else {
requestPermissionHandlerMap[name] = [callback];
}
}
function invokePermissionHandle(name, granted) {
let list = requestPermissionHandlerMap[name];
if (list) {
list.forEach(function(callback) {
callback(granted);
});
requestPermissionHandlerMap[name] = [];
}
}
export function requestPermission(param) {
let resultList = api.hasPermission({list:param.list});
let failedList = resultList.filter(function(item){
return !item.granted;
});
if (failedList.length > 0) {
if (failedList.length == 1) {
// 只处理申请一个权限的情形
let name = failedList[0].name;
if (requestPermissionAlertFlagMap[name]) {
registerPermissionHandle(name, function(granted){
if (granted) {
invokeSuccess(param, {});
} else {
invokeFail(param, {code: '-10007', msg:'permission denied'});
}
});
return;
} else {
requestPermissionAlertFlagMap[name] = true;
}
}
let list = [];
let undeterminedList = [];
let desc = '';
failedList.forEach(function(item) {
list.push(item.name);
if (item.undetermined) {
undeterminedList.push(item.name);
}
if (desc.length > 0) {
desc += ', ' + getPermissionDesc(item.name);
} else {
desc += getPermissionDesc(item.name);
}
});
if (undeterminedList.length == list.length && api.systemType == 'ios') {
api.requestPermission({
list: list,
rationaleDefault: true
}, function(res) {
let failedList1 = res.list.filter(function(item){
return !item.granted;
});
if (failedList1.length > 0) {
invokeFail(param, {code: '-10007', msg:'permission denied'});
} else {
invokeSuccess(param);
}
if (failedList.length == 1) {
let name = failedList[0].name;
requestPermissionAlertFlagMap[name] = false;
invokePermissionHandle(name, res.list[0].granted);
}
});
} else {
api.confirm({
title: localizedString('noAccessTitle'),
msg: localizedString('noAccessMsgPart1') + desc + localizedString('noAccessMsgPart2'),
buttons: [localizedString('cancel'), localizedString('goSetting')]
}, function(ret) {
if (ret.buttonIndex == 2) {
api.requestPermission({
list: list,
rationaleDefault: true
}, function(res) {
let failedList1 = res.list.filter(function(item){
return !item.granted;
});
if (failedList1.length > 0) {
invokeFail(param, {code: '-10007', msg:'permission denied'});
} else {
invokeSuccess(param);
}
if (failedList.length == 1) {
let name = failedList[0].name;
requestPermissionAlertFlagMap[name] = false;
invokePermissionHandle(name, res.list[0].granted);
}
});
} else {
invokeFail(param, {code: '-10007', msg:'permission denied'});
if (failedList.length == 1) {
let name = failedList[0].name;
requestPermissionAlertFlagMap[name] = false;
invokePermissionHandle(name, false);
}
}
});
}
} else {
invokeSuccess(param);
}
}