in sdk/typescript/libraries/bot-solutions/src/dialogs/routerDialog.ts [27:93]
protected async onContinueDialog(innerDc: DialogContext): Promise<DialogTurnResult> {
const status: InterruptionAction = await this.onInterruptDialog(innerDc);
if (status === InterruptionAction.Resume) {
// Resume the waiting dialog after interruption
await innerDc.repromptDialog();
return Dialog.EndOfTurn;
} else if (status === InterruptionAction.Waiting) {
// Stack is already waiting for a response, shelve inner stack
return Dialog.EndOfTurn;
} else {
const activity: Activity = innerDc.context.activity;
if (ActivityEx.isStartActivity(activity)) {
await this.onStart(innerDc);
}
switch (activity.type) {
case ActivityTypes.Message: {
// Note: This check is a workaround for adaptive card buttons that should map to an event
// (i.e. startOnboarding button in intro card)
if (activity.value) {
await this.onEvent(innerDc);
} else {
const result: DialogTurnResult = await innerDc.continueDialog();
switch (result.status) {
case DialogTurnStatus.empty: {
await this.route(innerDc);
break;
}
case DialogTurnStatus.complete: {
// End active dialog
await innerDc.endDialog();
break;
}
default:
}
}
// If the active dialog was ended on this turn (either on single-turn dialog, or on continueDialogAsync)
// run CompleteAsync method.
if (innerDc.activeDialog === undefined) {
await this.complete(innerDc);
}
break;
}
case ActivityTypes.Event: {
await this.onEvent(innerDc);
break;
}
case ActivityTypes.Invoke: {
// Used by Teams for Authentication scenarios.
await innerDc.continueDialog();
break;
}
default: {
await this.onSystemMessage(innerDc);
break;
}
}
return Dialog.EndOfTurn;
}
}