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 {title}; } function renderButtons() { const output = []; if (type === 'confirm') { output.push( onPress({ value: true })} />); output.push( onPress({ value: false })} />); } if (type === 'info' || type === 'error') { output.push(); } if (type === 'pop') { for (const button of buttons) { output.push( onPress({ value: button.id })} />); } } return output; } return ( {renderTitle()} {message} {renderButtons()} ); }); 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); }, };