mirror of
https://github.com/laurent22/joplin.git
synced 2025-05-13 21:46:37 +02:00
104 lines
2.8 KiB
TypeScript
104 lines
2.8 KiB
TypeScript
const React = require('react');
|
|
const { forwardRef,useState, useImperativeHandle } = require('react');
|
|
const RnDialog = require('react-native-dialog').default;
|
|
const { View } = require('react-native');
|
|
const { _ } = require('lib/locale');
|
|
|
|
let dialogRef_:any = null;
|
|
|
|
export function initializeDialogs(ref:any) {
|
|
dialogRef_ = ref;
|
|
}
|
|
|
|
export const Dialog = forwardRef(function(_props:any, ref:any) {
|
|
const [visible, setVisible] = useState(false);
|
|
const [type, setType] = useState('');
|
|
const [message, setMessage] = useState('');
|
|
const [buttons, setButtons] = useState([]);
|
|
const [resultPromise, setResultPromise] = useState({});
|
|
|
|
function dialogTitle(type:string) {
|
|
if (type === 'info') return _('Information');
|
|
if (type === 'error') return _('Error');
|
|
return '';
|
|
}
|
|
|
|
useImperativeHandle(ref, () => {
|
|
return {
|
|
show: async function(type:string, message:string, buttons:any[] = null) {
|
|
// Shouldn't happen but just to be sure throw an error in this case
|
|
if (visible) throw new Error('Only one dialog can be visible at a time');
|
|
|
|
setVisible(true);
|
|
setType(type);
|
|
setMessage(message);
|
|
setButtons(buttons);
|
|
|
|
return new Promise((resolve, reject) => {
|
|
setResultPromise({
|
|
resolve: resolve,
|
|
reject: reject,
|
|
});
|
|
});
|
|
},
|
|
};
|
|
});
|
|
|
|
function onPress(event:any) {
|
|
setVisible(false);
|
|
resultPromise.resolve(event ? event.value : true);
|
|
}
|
|
|
|
function renderTitle() {
|
|
const title = dialogTitle(type);
|
|
if (!title) return null;
|
|
return <RnDialog.Title>{title}</RnDialog.Title>;
|
|
}
|
|
|
|
function renderButtons() {
|
|
const output = [];
|
|
|
|
if (type === 'confirm') {
|
|
output.push(<RnDialog.Button key="ok" label={_('OK')} onPress={() => onPress({ value: true })} />);
|
|
output.push(<RnDialog.Button key="cancel" label={_('Cancel')} onPress={() => onPress({ value: false })} />);
|
|
}
|
|
|
|
if (type === 'info' || type === 'error') {
|
|
output.push(<RnDialog.Button key="ok" label={_('OK')} onPress={onPress} />);
|
|
}
|
|
|
|
if (type === 'pop') {
|
|
for (const button of buttons) {
|
|
output.push(<RnDialog.Button key={button.text} label={button.text} onPress={() => onPress({ value: button.id })} />);
|
|
}
|
|
}
|
|
|
|
return output;
|
|
}
|
|
|
|
return (
|
|
<View>
|
|
<RnDialog.Container visible={visible}>
|
|
{renderTitle()}
|
|
<RnDialog.Description>{message}</RnDialog.Description>
|
|
{renderButtons()}
|
|
</RnDialog.Container>
|
|
</View>
|
|
);
|
|
});
|
|
|
|
export default {
|
|
confirm: async function(message:string) {
|
|
return dialogRef_.current.show('confirm', message);
|
|
},
|
|
pop: async function(message:string, buttons:any[]) {
|
|
return dialogRef_.current.show('pop', message, buttons);
|
|
},
|
|
error: async function(message:string) {
|
|
return dialogRef_.current.show('error', message);
|
|
},
|
|
info: async function(message:string) {
|
|
return dialogRef_.current.show('info', message);
|
|
},
|
|
};
|