diff --git a/packages/angular/demo/src/app/alert/alert-page.component.ts b/packages/angular/demo/src/app/alert/alert-page.component.ts index d54a12f001..53d4f275e9 100644 --- a/packages/angular/demo/src/app/alert/alert-page.component.ts +++ b/packages/angular/demo/src/app/alert/alert-page.component.ts @@ -13,7 +13,7 @@ import { AlertController } from '@ionic/angular'; - Blah + Open Basic Alert @@ -34,20 +34,25 @@ export class AlertPageComponent { text: 'Cancel', role: 'Cancel', handler: () => { - console.log('cancel'); + // console.log('cancel'); } }, { text: 'Okay', role: 'Okay', handler: () => { - console.log('okay'); + // console.log('okay'); } } ] }); - alert.present(); + alert.present().then(() => { + return alert.dismiss(); + + }).then(() => { + console.log('dismissed'); + }); } } diff --git a/packages/angular/package-lock.json b/packages/angular/package-lock.json index f92f199e06..0b02f527f8 100644 --- a/packages/angular/package-lock.json +++ b/packages/angular/package-lock.json @@ -86,9 +86,9 @@ "dev": true }, "@stencil/core": { - "version": "0.0.8-6", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-0.0.8-6.tgz", - "integrity": "sha512-6lgZvuPuQbcRsqwi01Xu1HQ1XKK8dwJwO5WVcGKXVdpJ5YFvmT2W/Ocw+NwIRoJyblDlJrC1qs58yHU/Z4hgbw==", + "version": "0.0.8-7", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-0.0.8-7.tgz", + "integrity": "sha512-amU64qvwEhyXoZ4ZXJz8H4tngRT3lcPwlk7jIDZ6dxyS9VL/AePPGtnKAzXQCwQy08/NmKjEfd3W3c2OP4goUQ==", "dev": true, "requires": { "chokidar": "1.7.0", @@ -97,15 +97,15 @@ "rollup": "0.50.0", "rollup-plugin-commonjs": "8.2.5", "rollup-plugin-node-resolve": "3.0.0", - "typescript": "2.6.1", + "typescript": "2.6.2", "uglify-es": "3.1.6", "workbox-build": "2.1.1" }, "dependencies": { "typescript": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.1.tgz", - "integrity": "sha1-7znN6ierrAtQAkLWcmq5DgyEZjE=", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", + "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=", "dev": true } } diff --git a/packages/angular/src/providers/alert-controller.ts b/packages/angular/src/providers/alert-controller.ts index b74bc7d986..86eb20b256 100644 --- a/packages/angular/src/providers/alert-controller.ts +++ b/packages/angular/src/providers/alert-controller.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { AlertOptions } from '@ionic/core'; +import { AlertDismissEvent, AlertOptions } from '@ionic/core'; import { ensureElementInBody, hydrateElement } from '../util/util'; @@ -7,7 +7,7 @@ let alertId = 0; @Injectable() export class AlertController { - create(opts?: AlertOptions): any { + create(opts?: AlertOptions): AlertProxy { return getAlertProxy(opts); } } @@ -18,24 +18,55 @@ export function getAlertProxy(opts: AlertOptions){ state: PRESENTING, opts: opts, present: function() { return present(this)}, - dismiss: function() { return dismiss(this)} + dismiss: function() { return dismiss(this)}, + onDidDismiss: function(callback: (data: any, role: string) => void) { + (this as AlertProxyInternal).onDidDismissHandler = callback; + }, + onWillDismiss: function(callback: (data: any, role: string) => void) { + (this as AlertProxyInternal).onWillDismissHandler = callback; + }, } } -export function present(alertProxy: AlertProxyInternal): Promise { +export function present(alertProxy: AlertProxyInternal): Promise { + alertProxy.state = PRESENTING; return loadOverlay(alertProxy.opts).then((alertElement: HTMLIonAlertElement) => { + alertProxy.element = alertElement; + + const onDidDismissHandler = (event: AlertDismissEvent) => { + alertElement.removeEventListener(ION_ALERT_DID_DISMISS_EVENT, onDidDismissHandler); + if (alertProxy.onDidDismissHandler) { + alertProxy.onDidDismissHandler(event.detail.data, event.detail.role); + } + }; + + const onWillDismissHandler = (event: AlertDismissEvent) => { + alertElement.removeEventListener(ION_ALERT_WILL_DISMISS_EVENT, onWillDismissHandler); + if (alertProxy.onWillDismissHandler) { + alertProxy.onWillDismissHandler(event.detail.data, event.detail.role); + } + }; + + alertElement.addEventListener(ION_ALERT_DID_DISMISS_EVENT, onDidDismissHandler); + alertElement.addEventListener(ION_ALERT_WILL_DISMISS_EVENT, onWillDismissHandler); + if (alertProxy.state === PRESENTING) { return alertElement.present(); } }); } -export function dismiss(alertProxy: AlertProxyInternal): Promise { - return loadOverlay(alertProxy.opts).then((alertElement: HTMLIonAlertElement) => { +export function dismiss(alertProxy: AlertProxyInternal): Promise { + alertProxy.state = DISMISSING; + if (alertProxy.element) { if (alertProxy.state === DISMISSING) { - return alertElement.dismiss(); + return alertProxy.element.dismiss(); } - }); + } + // either we're not in the dismissing state + // or we're calling this before the element is created + // so just return a resolved promise + return Promise.resolve(); } export function loadOverlay(opts: AlertOptions) { @@ -48,13 +79,21 @@ export function loadOverlay(opts: AlertOptions) { export interface AlertProxy { present(): Promise dismiss(): Promise + onDidDismiss(callback: (data: any, role: string) => void): void; + onWillDismiss(callback: (data: any, role: string) => void): void; } export interface AlertProxyInternal extends AlertProxy { id: number; opts: AlertOptions; state: number; + element: HTMLIonAlertElement; + onDidDismissHandler?: (data: any, role: string) => void; + onWillDismissHandler?: (data: any, role: string) => void; } export const PRESENTING = 1; -export const DISMISSING = 2; \ No newline at end of file +export const DISMISSING = 2; + +const ION_ALERT_DID_DISMISS_EVENT = 'ionAlertDidDismiss'; +const ION_ALERT_WILL_DISMISS_EVENT = 'ionAlertWillDismiss'; \ No newline at end of file