diff --git a/public/botViews/popUpSignin.html b/public/botViews/popUpSignin.html
new file mode 100644
index 00000000..e6ca2b6c
--- /dev/null
+++ b/public/botViews/popUpSignin.html
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+ User Name :
+
+
+
+ Password :
+
+
+
+ Magic Number :
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Bot.ts b/src/Bot.ts
index 23904749..8e50adab 100644
--- a/src/Bot.ts
+++ b/src/Bot.ts
@@ -43,13 +43,16 @@ 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((event, query, callback) =>
+ {
+ this.verifySigninState(event, query, callback);
+ });
+
// setup compose extension handlers
// onQuery is for events that come through the compose extension itself including
// config and auth responses from popups that were started in the compose extension
@@ -74,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
@@ -91,11 +93,28 @@ export class Bot extends builder.UniversalBot {
};
}
+ private async verifySigninState(
+ event: builder.IEvent,
+ query: teams.ISigninStateVerificationQuery,
+ 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(session.gettext(Strings.popupsignin_successful) + magicNumber);
+ }
+ 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/RootDialog.ts b/src/dialogs/RootDialog.ts
index 96591f9a..42983610 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 { PopupSignInDialog } from "./examples/basic/PopupSignInDialog";
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 PopupSignInDialog(bot);
new MessageBackReceiverDialog(bot);
new MultiDialog(bot);
new O365ConnectorCardActionsDialog(bot);
diff --git a/src/dialogs/examples/basic/PopupSignInDialog.ts b/src/dialogs/examples/basic/PopupSignInDialog.ts
new file mode 100644
index 00000000..b4912842
--- /dev/null
+++ b/src/dialogs/examples/basic/PopupSignInDialog.ts
@@ -0,0 +1,35 @@
+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 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(
+ 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();
+ }
+
+ constructor(
+ bot: builder.UniversalBot,
+ ) {
+ super(bot,
+ DialogIds.PopupSignInDialogId,
+ DialogMatches.PopUpSignInDialogMatch,
+ PopupSignInDialog.sendPopupSigninCard,
+ );
+ }
+}
diff --git a/src/locale/en/index.json b/src/locale/en/index.json
index 22584a6a..67ebeeac 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
",
+ "popupsignin_card_title":"Please click below for Popup Sign-In experience",
+ "popupsignin_button_title":"Sign In",
+ "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 62f78e17..188c69f4 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: "PopupSignInDialog",
MessageBackReceiverDialogId: "MessageBackReceiverDialog",
MultiDialogId: "MultiDialog",
MultiDialog2Id: "MultiDialog2",
diff --git a/src/utils/DialogMatches.ts b/src/utils/DialogMatches.ts
index 3fe07fb3..30502e93 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: /signin/i,
MessageBackReceiverDialogMatch: /incoming message from messageBack button/i,
MultiDialogMatch: /multi dialog 1/i,
MultiDialog2Match: /multi dialog 2/i,