From b0a8754915c3e3a2c6f28fd29d9a65d36456e58b Mon Sep 17 00:00:00 2001 From: Amit Agarwal Date: Thu, 4 Jan 2018 15:30:28 -0800 Subject: [PATCH 1/4] PopUpSignIn --- public/botViews/popUpSignin.html | 28 ++++++++++ src/Bot.ts | 21 +++++++- src/dialogs/RootDialog.ts | 2 + .../examples/basic/PopupSignInDailog.ts | 51 +++++++++++++++++++ src/utils/DialogIds.ts | 1 + src/utils/DialogMatches.ts | 1 + 6 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 public/botViews/popUpSignin.html create mode 100644 src/dialogs/examples/basic/PopupSignInDailog.ts diff --git a/public/botViews/popUpSignin.html b/public/botViews/popUpSignin.html new file mode 100644 index 00000000..a425eb50 --- /dev/null +++ b/public/botViews/popUpSignin.html @@ -0,0 +1,28 @@ + + + + + + + +
+ User Name : +
+
+
+ Password : +
+ + + + + + + + \ No newline at end of file diff --git a/src/Bot.ts b/src/Bot.ts index 23904749..ee1f31d7 100644 --- a/src/Bot.ts +++ b/src/Bot.ts @@ -43,12 +43,11 @@ export class Bot extends builder.UniversalBot { // setup invoke payload handler this._connector.onInvoke(this.getInvokeHandler(this)); - // setup O365ConnectorCard action handler this._connector.onO365ConnectorCardAction(this.getO365ConnectorCardActionHandler(this)); - // setup conversation update handler for things such as a memberAdded event this.on("conversationUpdate", this.getConversationUpdateHandler(this)); + this._connector.onSigninStateVerification(this.SigninHandler(this)); // setup compose extension handlers // onQuery is for events that come through the compose extension itself including @@ -91,6 +90,23 @@ export class Bot extends builder.UniversalBot { }; } + private SigninHandler(bot: builder.UniversalBot): (event: builder.IEvent, query: teams.ISigninStateVerificationQuery, callback: (err: Error, body: any, status?: number) => void) => void { + return async function ( + event: builder.IEvent, + query: teams.ISigninStateVerificationQuery, + callback: (err: Error, body: any, status?: number) => void, + ): Promise + { + let session = await loadSessionAsync(bot, event); + if (session) { + session.clearDialogStack(); + session.send("Authentication Successful!!"); + + } + callback(null, "", 200); + }; + } + // set incoming event to any because membersAdded is not a field in builder.IEvent private getConversationUpdateHandler(bot: builder.UniversalBot): (event: any) => void { return async function(event: any): Promise { @@ -119,4 +135,5 @@ export class Bot extends builder.UniversalBot { callback(null, null, 200); }; } + } diff --git a/src/dialogs/RootDialog.ts b/src/dialogs/RootDialog.ts index 96591f9a..816cb439 100644 --- a/src/dialogs/RootDialog.ts +++ b/src/dialogs/RootDialog.ts @@ -12,6 +12,7 @@ import { GetLastDialogUsedDialog } from "./examples/basic/GetLastDialogUsedDialo import { HelloDialog } from "./examples/basic/HelloDialog"; import { HelpDialog } from "./examples/basic/HelpDialog"; import { HeroCardDialog } from "./examples/basic/HeroCardDialog"; +import { PopupSignInDailog } from "./examples/basic/PopupSignInDailog"; import { MessageBackReceiverDialog } from "./examples/basic/MessageBackReceiverDialog"; import { MultiDialog } from "./examples/basic/MultiDialog"; import { O365ConnectorCardActionsDialog } from "./examples/basic/O365ConnectorCardActionsDialog"; @@ -72,6 +73,7 @@ export class RootDialog extends builder.IntentDialog { new HelloDialog(bot); new HelpDialog(bot); new HeroCardDialog(bot); + new PopupSignInDailog(bot); new MessageBackReceiverDialog(bot); new MultiDialog(bot); new O365ConnectorCardActionsDialog(bot); diff --git a/src/dialogs/examples/basic/PopupSignInDailog.ts b/src/dialogs/examples/basic/PopupSignInDailog.ts new file mode 100644 index 00000000..01449d59 --- /dev/null +++ b/src/dialogs/examples/basic/PopupSignInDailog.ts @@ -0,0 +1,51 @@ +import * as builder from "botbuilder"; +import { TriggerActionDialog } from "../../../utils/TriggerActionDialog"; +import { DialogIds } from "../../../utils/DialogIds"; +import { DialogMatches } from "../../../utils/DialogMatches"; +import * as config from "config"; + +export class PopupSignInDailog extends TriggerActionDialog { + + private static async step1(session: builder.Session, args?: any | builder.IDialogResult, next?: (args?: builder.IDialogResult) => void): Promise { + let cards = new Array(); + + let buttons = new Array(); + /** + * This is PopUp SignIn Dialog Class. + * main purpose of this class is to Display the PopUp SignIn Card + */ + + // let input = ""; + // if (args.response) { + // input = args.response; + // } + + let popUpUrl = config.get("app.baseUri") + "/botViews/popUpSignin.html"; + + buttons.push(new builder.CardAction(session) + .type("signin") + .title("Sign In") + .value(popUpUrl), + ); + + let newCard = new builder.HeroCard(session) + .title("Please click below for Popup Sign-In experience") + .buttons(buttons); + + cards.push(newCard); + + session.send(new builder.Message(session) + .attachments(cards)); + session.endDialog(); + } + + constructor( + bot: builder.UniversalBot, + ) { + super(bot, + DialogIds.PopupSignInDialogId, + DialogMatches.PopUpSignInDialogMatch, + PopupSignInDailog.step1, + ); + } +} diff --git a/src/utils/DialogIds.ts b/src/utils/DialogIds.ts index 62f78e17..a03b9f99 100644 --- a/src/utils/DialogIds.ts +++ b/src/utils/DialogIds.ts @@ -12,6 +12,7 @@ export const DialogIds = { HelloDialogId: "HelloDialog", HelpDialogId: "HelpDialog", HeroCardDialogId: "HeroCardDialog", + PopupSignInDialogId: "PopupSignInDailog", MessageBackReceiverDialogId: "MessageBackReceiverDialog", MultiDialogId: "MultiDialog", MultiDialog2Id: "MultiDialog2", diff --git a/src/utils/DialogMatches.ts b/src/utils/DialogMatches.ts index 3fe07fb3..625d44af 100644 --- a/src/utils/DialogMatches.ts +++ b/src/utils/DialogMatches.ts @@ -11,6 +11,7 @@ export const DialogMatches = { HelloDialogMatch2: /hi/i, HelpDialogMatch: /help/i, HeroCardDialogMatch: /hero card/i, + PopUpSignInDialogMatch: /sign in/i, MessageBackReceiverDialogMatch: /incoming message from messageBack button/i, MultiDialogMatch: /multi dialog 1/i, MultiDialog2Match: /multi dialog 2/i, From 7e24e6661204642f36d10e5acc71f9fb87e0c781 Mon Sep 17 00:00:00 2001 From: Amit Agarwal Date: Fri, 5 Jan 2018 10:22:59 -0800 Subject: [PATCH 2/4] PopUp SignIn Resolve Comments --- src/Bot.ts | 1 - src/dialogs/RootDialog.ts | 4 ++-- .../basic/{PopupSignInDailog.ts => PopupSignInDialog.ts} | 6 +++--- 3 files changed, 5 insertions(+), 6 deletions(-) rename src/dialogs/examples/basic/{PopupSignInDailog.ts => PopupSignInDialog.ts} (83%) diff --git a/src/Bot.ts b/src/Bot.ts index ee1f31d7..cde4abc7 100644 --- a/src/Bot.ts +++ b/src/Bot.ts @@ -135,5 +135,4 @@ export class Bot extends builder.UniversalBot { callback(null, null, 200); }; } - } diff --git a/src/dialogs/RootDialog.ts b/src/dialogs/RootDialog.ts index 816cb439..42983610 100644 --- a/src/dialogs/RootDialog.ts +++ b/src/dialogs/RootDialog.ts @@ -12,7 +12,7 @@ import { GetLastDialogUsedDialog } from "./examples/basic/GetLastDialogUsedDialo import { HelloDialog } from "./examples/basic/HelloDialog"; import { HelpDialog } from "./examples/basic/HelpDialog"; import { HeroCardDialog } from "./examples/basic/HeroCardDialog"; -import { PopupSignInDailog } from "./examples/basic/PopupSignInDailog"; +import { PopupSignInDialog } from "./examples/basic/PopupSignInDialog"; import { MessageBackReceiverDialog } from "./examples/basic/MessageBackReceiverDialog"; import { MultiDialog } from "./examples/basic/MultiDialog"; import { O365ConnectorCardActionsDialog } from "./examples/basic/O365ConnectorCardActionsDialog"; @@ -73,7 +73,7 @@ export class RootDialog extends builder.IntentDialog { new HelloDialog(bot); new HelpDialog(bot); new HeroCardDialog(bot); - new PopupSignInDailog(bot); + new PopupSignInDialog(bot); new MessageBackReceiverDialog(bot); new MultiDialog(bot); new O365ConnectorCardActionsDialog(bot); diff --git a/src/dialogs/examples/basic/PopupSignInDailog.ts b/src/dialogs/examples/basic/PopupSignInDialog.ts similarity index 83% rename from src/dialogs/examples/basic/PopupSignInDailog.ts rename to src/dialogs/examples/basic/PopupSignInDialog.ts index 01449d59..af3e54d7 100644 --- a/src/dialogs/examples/basic/PopupSignInDailog.ts +++ b/src/dialogs/examples/basic/PopupSignInDialog.ts @@ -4,9 +4,9 @@ import { DialogIds } from "../../../utils/DialogIds"; import { DialogMatches } from "../../../utils/DialogMatches"; import * as config from "config"; -export class PopupSignInDailog extends TriggerActionDialog { +export class PopupSignInDialog extends TriggerActionDialog { - private static async step1(session: builder.Session, args?: any | builder.IDialogResult, next?: (args?: builder.IDialogResult) => void): Promise { + private static async PopUpSignIn(session: builder.Session, args?: any | builder.IDialogResult, next?: (args?: builder.IDialogResult) => void): Promise { let cards = new Array(); let buttons = new Array(); @@ -45,7 +45,7 @@ export class PopupSignInDailog extends TriggerActionDialog { super(bot, DialogIds.PopupSignInDialogId, DialogMatches.PopUpSignInDialogMatch, - PopupSignInDailog.step1, + PopupSignInDialog.PopUpSignIn, ); } } From 967a1fec4c6c4a352f4425d8b6cb3594b54bd129 Mon Sep 17 00:00:00 2001 From: Amit Agarwal Date: Tue, 9 Jan 2018 14:12:04 -0800 Subject: [PATCH 3/4] Comments Resolve PopUp SignIn --- public/botViews/popUpSignin.html | 4 +- src/Bot.ts | 33 +++++++-------- .../examples/basic/PopupSignInDialog.ts | 42 ++++++------------- src/locale/en/index.json | 5 ++- 4 files changed, 35 insertions(+), 49 deletions(-) diff --git a/public/botViews/popUpSignin.html b/public/botViews/popUpSignin.html index a425eb50..5ee58d28 100644 --- a/public/botViews/popUpSignin.html +++ b/public/botViews/popUpSignin.html @@ -2,8 +2,8 @@ - - +
User Name : diff --git a/src/Bot.ts b/src/Bot.ts index cde4abc7..34df2bd4 100644 --- a/src/Bot.ts +++ b/src/Bot.ts @@ -47,7 +47,11 @@ export class Bot extends builder.UniversalBot { this._connector.onO365ConnectorCardAction(this.getO365ConnectorCardActionHandler(this)); // setup conversation update handler for things such as a memberAdded event this.on("conversationUpdate", this.getConversationUpdateHandler(this)); - this._connector.onSigninStateVerification(this.SigninHandler(this)); + + this._connector.onSigninStateVerification((event, query, callback) => + { + this.verifySigninState(event, query, callback); + }); // setup compose extension handlers // onQuery is for events that come through the compose extension itself including @@ -73,7 +77,6 @@ export class Bot extends builder.UniversalBot { // Clear the stack on invoke, as many builtin dialogs don't play well with invoke // Invoke messages should carry the necessary information to perform their action session.clearDialogStack(); - let payload = (event as any).value; // Invokes don't participate in middleware @@ -90,28 +93,24 @@ export class Bot extends builder.UniversalBot { }; } - private SigninHandler(bot: builder.UniversalBot): (event: builder.IEvent, query: teams.ISigninStateVerificationQuery, callback: (err: Error, body: any, status?: number) => void) => void { - return async function ( - event: builder.IEvent, - query: teams.ISigninStateVerificationQuery, - callback: (err: Error, body: any, status?: number) => void, - ): Promise + private async verifySigninState( + event: builder.IEvent, + query: teams.ISigninStateVerificationQuery, + callback: (err: Error, body: any, status?: number) => void): Promise + { + let session = await loadSessionAsync(this, event); + if (session) { - let session = await loadSessionAsync(bot, event); - if (session) { - session.clearDialogStack(); - session.send("Authentication Successful!!"); - - } - callback(null, "", 200); - }; + session.clearDialogStack(); + session.send(Strings.popupsignin_successful); + } + callback(null, "", 200); } // set incoming event to any because membersAdded is not a field in builder.IEvent private getConversationUpdateHandler(bot: builder.UniversalBot): (event: any) => void { return async function(event: any): Promise { let session = await loadSessionAsync(bot, event); - if (event.membersAdded && event.membersAdded[0].id && event.membersAdded[0].id.endsWith(config.get("bot.botId"))) { session.send(Strings.bot_introduction); // probably only works in Teams } else { diff --git a/src/dialogs/examples/basic/PopupSignInDialog.ts b/src/dialogs/examples/basic/PopupSignInDialog.ts index af3e54d7..0d2e0a0f 100644 --- a/src/dialogs/examples/basic/PopupSignInDialog.ts +++ b/src/dialogs/examples/basic/PopupSignInDialog.ts @@ -2,40 +2,24 @@ import * as builder from "botbuilder"; import { TriggerActionDialog } from "../../../utils/TriggerActionDialog"; import { DialogIds } from "../../../utils/DialogIds"; import { DialogMatches } from "../../../utils/DialogMatches"; +import { Strings } from "../../../locale/locale"; import * as config from "config"; +// Demonstrates using a signin action to show a login page in a popup export class PopupSignInDialog extends TriggerActionDialog { - private static async PopUpSignIn(session: builder.Session, args?: any | builder.IDialogResult, next?: (args?: builder.IDialogResult) => void): Promise { - let cards = new Array(); - - let buttons = new Array(); - /** - * This is PopUp SignIn Dialog Class. - * main purpose of this class is to Display the PopUp SignIn Card - */ - - // let input = ""; - // if (args.response) { - // input = args.response; - // } - + private static async popupsignin(session: builder.Session, args?: any | builder.IDialogResult, next?: (args?: builder.IDialogResult) => void): Promise { let popUpUrl = config.get("app.baseUri") + "/botViews/popUpSignin.html"; - buttons.push(new builder.CardAction(session) - .type("signin") - .title("Sign In") - .value(popUpUrl), - ); - - let newCard = new builder.HeroCard(session) - .title("Please click below for Popup Sign-In experience") - .buttons(buttons); - - cards.push(newCard); - - session.send(new builder.Message(session) - .attachments(cards)); + session.send( + new builder.Message(session).addAttachment( + new builder.HeroCard(session) + .title(Strings.popupsignin_card_title) + .buttons([ + new builder.CardAction(session) + .type("signin") + .title(Strings.popupsignin_button_title) + .value(popUpUrl)]))); session.endDialog(); } @@ -45,7 +29,7 @@ export class PopupSignInDialog extends TriggerActionDialog { super(bot, DialogIds.PopupSignInDialogId, DialogMatches.PopUpSignInDialogMatch, - PopupSignInDialog.PopUpSignIn, + PopupSignInDialog.popupsignin, ); } } diff --git a/src/locale/en/index.json b/src/locale/en/index.json index 22584a6a..33b2360b 100644 --- a/src/locale/en/index.json +++ b/src/locale/en/index.json @@ -119,5 +119,8 @@ "open_uri": "Open Uri", "message_summary": "A sample O365 actionable card", "o365connectorcard_action_response": "

Thanks, %s!


Your input action ID:


%s

Your input body:


%s
", - "end_of_example_string_responses": "******************************* EVERYTHING ABOVE HERE IS FOR A TEMPLATE EXAMPLE DIALOG *******************************" + "end_of_example_string_responses": "******************************* EVERYTHING ABOVE HERE IS FOR A TEMPLATE EXAMPLE DIALOG *******************************", + "popupsignin_card_title":"Please click below for Popup Sign-In experience", + "popupsignin_button_title":"Sign In", + "popupsignin_successful":"Authentication Successful!!" } From 8a64976ea6fb0a11ab9352ea5055b77b189554aa Mon Sep 17 00:00:00 2001 From: Amit Agarwal Date: Fri, 2 Feb 2018 16:51:38 -0800 Subject: [PATCH 4/4] Resolved Code Review Comments PopUpSignIn --- public/botViews/popUpSignin.html | 24 ++++++++++++++++--- src/Bot.ts | 6 ++++- .../examples/basic/PopupSignInDialog.ts | 4 ++-- src/locale/en/index.json | 4 ++-- src/utils/DialogIds.ts | 2 +- src/utils/DialogMatches.ts | 2 +- 6 files changed, 32 insertions(+), 10 deletions(-) diff --git a/public/botViews/popUpSignin.html b/public/botViews/popUpSignin.html index 5ee58d28..e6ca2b6c 100644 --- a/public/botViews/popUpSignin.html +++ b/public/botViews/popUpSignin.html @@ -6,23 +6,41 @@ When the user clicks on the Login button, it calls notifySuccess() to fake a successful login and trigger a new message to the bot -->
- User Name : + User Name :

Password :
+
+
+ Magic Number : +
\ No newline at end of file diff --git a/src/Bot.ts b/src/Bot.ts index 34df2bd4..8e50adab 100644 --- a/src/Bot.ts +++ b/src/Bot.ts @@ -99,10 +99,14 @@ export class Bot extends builder.UniversalBot { callback: (err: Error, body: any, status?: number) => void): Promise { let session = await loadSessionAsync(this, event); + let magicNumber = ''; + if (session) { + magicNumber = query.state; + session.clearDialogStack(); - session.send(Strings.popupsignin_successful); + session.send(session.gettext(Strings.popupsignin_successful) + magicNumber); } callback(null, "", 200); } diff --git a/src/dialogs/examples/basic/PopupSignInDialog.ts b/src/dialogs/examples/basic/PopupSignInDialog.ts index 0d2e0a0f..b4912842 100644 --- a/src/dialogs/examples/basic/PopupSignInDialog.ts +++ b/src/dialogs/examples/basic/PopupSignInDialog.ts @@ -8,7 +8,7 @@ import * as config from "config"; // Demonstrates using a signin action to show a login page in a popup export class PopupSignInDialog extends TriggerActionDialog { - private static async popupsignin(session: builder.Session, args?: any | builder.IDialogResult, next?: (args?: builder.IDialogResult) => void): Promise { + private static async sendPopupSigninCard(session: builder.Session, args?: any | builder.IDialogResult, next?: (args?: builder.IDialogResult) => void): Promise { let popUpUrl = config.get("app.baseUri") + "/botViews/popUpSignin.html"; session.send( @@ -29,7 +29,7 @@ export class PopupSignInDialog extends TriggerActionDialog { super(bot, DialogIds.PopupSignInDialogId, DialogMatches.PopUpSignInDialogMatch, - PopupSignInDialog.popupsignin, + PopupSignInDialog.sendPopupSigninCard, ); } } diff --git a/src/locale/en/index.json b/src/locale/en/index.json index 33b2360b..67ebeeac 100644 --- a/src/locale/en/index.json +++ b/src/locale/en/index.json @@ -119,8 +119,8 @@ "open_uri": "Open Uri", "message_summary": "A sample O365 actionable card", "o365connectorcard_action_response": "

Thanks, %s!


Your input action ID:


%s

Your input body:


%s
", - "end_of_example_string_responses": "******************************* EVERYTHING ABOVE HERE IS FOR A TEMPLATE EXAMPLE DIALOG *******************************", "popupsignin_card_title":"Please click below for Popup Sign-In experience", "popupsignin_button_title":"Sign In", - "popupsignin_successful":"Authentication Successful!!" + "popupsignin_successful":"Authentication popup closed, Magic number passed through - ", + "end_of_example_string_responses": "******************************* EVERYTHING ABOVE HERE IS FOR A TEMPLATE EXAMPLE DIALOG *******************************" } diff --git a/src/utils/DialogIds.ts b/src/utils/DialogIds.ts index a03b9f99..188c69f4 100644 --- a/src/utils/DialogIds.ts +++ b/src/utils/DialogIds.ts @@ -12,7 +12,7 @@ export const DialogIds = { HelloDialogId: "HelloDialog", HelpDialogId: "HelpDialog", HeroCardDialogId: "HeroCardDialog", - PopupSignInDialogId: "PopupSignInDailog", + PopupSignInDialogId: "PopupSignInDialog", MessageBackReceiverDialogId: "MessageBackReceiverDialog", MultiDialogId: "MultiDialog", MultiDialog2Id: "MultiDialog2", diff --git a/src/utils/DialogMatches.ts b/src/utils/DialogMatches.ts index 625d44af..30502e93 100644 --- a/src/utils/DialogMatches.ts +++ b/src/utils/DialogMatches.ts @@ -11,7 +11,7 @@ export const DialogMatches = { HelloDialogMatch2: /hi/i, HelpDialogMatch: /help/i, HeroCardDialogMatch: /hero card/i, - PopUpSignInDialogMatch: /sign in/i, + PopUpSignInDialogMatch: /signin/i, MessageBackReceiverDialogMatch: /incoming message from messageBack button/i, MultiDialogMatch: /multi dialog 1/i, MultiDialog2Match: /multi dialog 2/i,