anagram-react-native-picker
Version:
A Native Picker with high performance.
98 lines (89 loc) • 2.55 kB
JavaScript
import {
Platform,
NativeModules,
NativeAppEventEmitter
} from 'react-native';
const ios = Platform.OS === 'ios';
const android = Platform.OS === 'android';
const Picker = NativeModules.BEEPickerManager;
const options = {
isLoop: false,
pickerConfirmBtnText: 'confirm',
pickerCancelBtnText: 'cancel',
pickerTitleText: 'pls select',
pickerConfirmBtnColor: [1, 186, 245, 1],
pickerCancelBtnColor: [1, 186, 245, 1],
pickerTitleColor: [20, 20, 20, 1],
pickerToolBarBg: [232, 232, 232, 1],
pickerTextEllipsisLen: 6,
pickerBg: [196, 199, 206, 1],
pickerRowHeight: 24,
wheelFlex: [1, 1, 1],
pickerData: [],
selectedValue: [],
onPickerConfirm(){},
onPickerCancel(){},
onPickerSelect(){},
pickerToolBarFontSize: 16,
pickerFontSize: 16,
pickerFontColor: [31, 31 ,31, 1]
};
export default {
init(params){
const opt = {
...options,
...params
};
const fnConf = {
confirm: opt.onPickerConfirm,
cancel: opt.onPickerCancel,
select: opt.onPickerSelect
};
Picker._init(opt);
//there are no `removeListener` for NativeAppEventEmitter & DeviceEventEmitter
this.listener && this.listener.remove();
this.listener = NativeAppEventEmitter.addListener('pickerEvent', event => {
fnConf[event['type']](event['selectedValue'], event['selectedIndex']);
});
},
show(){
Picker.show();
},
hide(){
Picker.hide();
},
select(arr, fn) {
if(ios){
Picker.select(arr);
}
else if(android){
Picker.select(arr, err => {
typeof fn === 'function' && fn(err);
});
}
},
toggle(){
this.isPickerShow(show => {
if(show){
this.hide();
}
else{
this.show();
}
});
},
isPickerShow(fn){
//android return two params: err(error massage) and status(show or not)
//ios return only one param: hide or not...
Picker.isPickerShow((err, status) => {
let returnValue = null;
if(android){
returnValue = err ? false : status;
}
else if(ios){
returnValue = !err;
}
fn && fn(returnValue);
});
}
};