/** * iOS specific dialogs functions implementation. */ import { View, ios as iosView } from "../core/view"; import { ConfirmOptions, PromptOptions, PromptResult, LoginOptions, LoginResult, ActionOptions } from "."; import { getCurrentPage, getLabelColor, getButtonColors, getTextFieldColor, isDialogOptions, inputType, ALERT, OK, CONFIRM, CANCEL, PROMPT, LOGIN } from "./dialogs-common"; import { isString, isDefined, isFunction } from "../../utils/types"; export * from "./dialogs-common"; function addButtonsToAlertController(alertController: UIAlertController, options: ConfirmOptions, callback?: Function): void { if (!options) { return; } if (isString(options.cancelButtonText)) { alertController.addAction(UIAlertAction.actionWithTitleStyleHandler(options.cancelButtonText, UIAlertActionStyle.Default, () => { raiseCallback(callback, false); })); } if (isString(options.neutralButtonText)) { alertController.addAction(UIAlertAction.actionWithTitleStyleHandler(options.neutralButtonText, UIAlertActionStyle.Default, () => { raiseCallback(callback, undefined); })); } if (isString(options.okButtonText)) { alertController.addAction(UIAlertAction.actionWithTitleStyleHandler(options.okButtonText, UIAlertActionStyle.Default, () => { raiseCallback(callback, true); })); } } function raiseCallback(callback, result) { if (isFunction(callback)) { callback(result); } } export function alert(arg: any): Promise { return new Promise((resolve, reject) => { try { let options = !isDialogOptions(arg) ? { title: ALERT, okButtonText: OK, message: arg + "" } : arg; let alertController = UIAlertController.alertControllerWithTitleMessagePreferredStyle(options.title, options.message, UIAlertControllerStyle.Alert); addButtonsToAlertController(alertController, options, () => { resolve(); }); showUIAlertController(alertController); } catch (ex) { reject(ex); } }); } export function confirm(arg: any): Promise { return new Promise((resolve, reject) => { try { let options = !isDialogOptions(arg) ? { title: CONFIRM, okButtonText: OK, cancelButtonText: CANCEL, message: arg + "" } : arg; let alertController = UIAlertController.alertControllerWithTitleMessagePreferredStyle(options.title, options.message, UIAlertControllerStyle.Alert); addButtonsToAlertController(alertController, options, (r) => { resolve(r); }); showUIAlertController(alertController); } catch (ex) { reject(ex); } }); } export function prompt(arg: any): Promise { let options: PromptOptions; let defaultOptions = { title: PROMPT, okButtonText: OK, cancelButtonText: CANCEL, inputType: inputType.text, }; if (arguments.length === 1) { if (isString(arg)) { options = defaultOptions; options.message = arg; } else { options = arg; } } else if (arguments.length === 2) { if (isString(arguments[0]) && isString(arguments[1])) { options = defaultOptions; options.message = arguments[0]; options.defaultText = arguments[1]; } } return new Promise((resolve, reject) => { try { let textField: UITextField; let alertController = UIAlertController.alertControllerWithTitleMessagePreferredStyle(options.title, options.message, UIAlertControllerStyle.Alert); alertController.addTextFieldWithConfigurationHandler((arg: UITextField) => { arg.text = isString(options.defaultText) ? options.defaultText : ""; arg.secureTextEntry = options && options.inputType === inputType.password; if (options && options.inputType === inputType.email) { arg.keyboardType = UIKeyboardType.EmailAddress; } let color = getTextFieldColor(); if (color) { arg.textColor = arg.tintColor = color.ios; } }); textField = alertController.textFields.firstObject; addButtonsToAlertController(alertController, options, (r) => { resolve({ result: r, text: textField.text }); }); showUIAlertController(alertController); } catch (ex) { reject(ex); } }); } export function login(): Promise { let options: LoginOptions; let defaultOptions = { title: LOGIN, okButtonText: OK, cancelButtonText: CANCEL }; if (arguments.length === 1) { if (isString(arguments[0])) { options = defaultOptions; options.message = arguments[0]; } else { options = arguments[0]; } } else if (arguments.length === 2) { if (isString(arguments[0]) && isString(arguments[1])) { options = defaultOptions; options.message = arguments[0]; options.userName = arguments[1]; } } else if (arguments.length === 3) { if (isString(arguments[0]) && isString(arguments[1]) && isString(arguments[2])) { options = defaultOptions; options.message = arguments[0]; options.userName = arguments[1]; options.password = arguments[2]; } } return new Promise((resolve, reject) => { try { let userNameTextField: UITextField; let passwordTextField: UITextField; let alertController = UIAlertController.alertControllerWithTitleMessagePreferredStyle(options.title, options.message, UIAlertControllerStyle.Alert); let textFieldColor = getTextFieldColor(); alertController.addTextFieldWithConfigurationHandler((arg: UITextField) => { arg.placeholder = "Login"; arg.text = isString(options.userName) ? options.userName : ""; if (textFieldColor) { arg.textColor = arg.tintColor = textFieldColor.ios; } }); alertController.addTextFieldWithConfigurationHandler((arg: UITextField) => { arg.placeholder = "Password"; arg.secureTextEntry = true; arg.text = isString(options.password) ? options.password : ""; if (textFieldColor) { arg.textColor = arg.tintColor = textFieldColor.ios; } }); userNameTextField = alertController.textFields.firstObject; passwordTextField = alertController.textFields.lastObject; addButtonsToAlertController(alertController, options, (r) => { resolve({ result: r, userName: userNameTextField.text, password: passwordTextField.text }); }); showUIAlertController(alertController); } catch (ex) { reject(ex); } }); } function showUIAlertController(alertController: UIAlertController) { let currentPage = getCurrentPage(); if (currentPage) { let view: View = currentPage; let viewController: UIViewController = currentPage.ios; if (currentPage.modal) { view = currentPage.modal; if (view.ios instanceof UIViewController) { viewController = view.ios; } else { viewController = iosView.getParentWithViewController(view).viewController; } } if (viewController) { if (alertController.popoverPresentationController) { alertController.popoverPresentationController.sourceView = viewController.view; alertController.popoverPresentationController.sourceRect = CGRectMake(viewController.view.bounds.size.width / 2.0, viewController.view.bounds.size.height / 2.0, 1.0, 1.0); alertController.popoverPresentationController.permittedArrowDirections = 0; } let color = getButtonColors().color; if (color) { alertController.view.tintColor = color.ios; } let lblColor = getLabelColor(); if (lblColor) { if (alertController.title) { let title = NSAttributedString.alloc().initWithStringAttributes(alertController.title, { [NSForegroundColorAttributeName]: lblColor.ios }); alertController.setValueForKey(title, "attributedTitle"); } if (alertController.message) { let message = NSAttributedString.alloc().initWithStringAttributes(alertController.message, { [NSForegroundColorAttributeName]: lblColor.ios }); alertController.setValueForKey(message, "attributedMessage"); } } viewController.presentModalViewControllerAnimated(alertController, true); } } } export function action(): Promise { let options: ActionOptions; let defaultOptions = { title: null, cancelButtonText: CANCEL }; if (arguments.length === 1) { if (isString(arguments[0])) { options = defaultOptions; options.message = arguments[0]; } else { options = arguments[0]; } } else if (arguments.length === 2) { if (isString(arguments[0]) && isString(arguments[1])) { options = defaultOptions; options.message = arguments[0]; options.cancelButtonText = arguments[1]; } } else if (arguments.length === 3) { if (isString(arguments[0]) && isString(arguments[1]) && isDefined(arguments[2])) { options = defaultOptions; options.message = arguments[0]; options.cancelButtonText = arguments[1]; options.actions = arguments[2]; } } return new Promise((resolve, reject) => { try { let i: number; let action: string; let alertController = UIAlertController.alertControllerWithTitleMessagePreferredStyle(options.title, options.message, UIAlertControllerStyle.ActionSheet); if (options.actions) { for (i = 0; i < options.actions.length; i++) { action = options.actions[i]; if (isString(action)) { alertController.addAction(UIAlertAction.actionWithTitleStyleHandler(action, UIAlertActionStyle.Default, (arg: UIAlertAction) => { resolve(arg.title); })); } } } if (isString(options.cancelButtonText)) { alertController.addAction(UIAlertAction.actionWithTitleStyleHandler(options.cancelButtonText, UIAlertActionStyle.Cancel, (arg: UIAlertAction) => { resolve(arg.title); })); } showUIAlertController(alertController); } catch (ex) { reject(ex); } }); }