diff --git a/libraries/botbuilder-dialogs/src/componentDialog.ts b/libraries/botbuilder-dialogs/src/componentDialog.ts index ed36dc44e3..79e508dafd 100644 --- a/libraries/botbuilder-dialogs/src/componentDialog.ts +++ b/libraries/botbuilder-dialogs/src/componentDialog.ts @@ -81,10 +81,7 @@ export class ComponentDialog extends Dialog { public async beginDialog(outerDC: DialogContext, options?: O): Promise { // Start the inner dialog. - const dialogState: DialogState = { dialogStack: [] }; - outerDC.activeDialog.state[PERSISTED_DIALOG_STATE] = dialogState; - const innerDC: DialogContext = new DialogContext(this.dialogs, outerDC.context, dialogState); - innerDC.parent = outerDC; + const innerDC: DialogContext = this.createChildContext(outerDC) const turnResult: DialogTurnResult = await this.onBeginDialog(innerDC, options); // Check for end of inner dialog @@ -99,9 +96,7 @@ export class ComponentDialog extends Dialog { public async continueDialog(outerDC: DialogContext): Promise { // Continue execution of inner dialog. - const dialogState: any = outerDC.activeDialog.state[PERSISTED_DIALOG_STATE]; - const innerDC: DialogContext = new DialogContext(this.dialogs, outerDC.context, dialogState); - innerDC.parent = outerDC; + const innerDC: DialogContext = this.createChildContext(outerDC) const turnResult: DialogTurnResult = await this.onContinueDialog(innerDC); // Check for end of inner dialog @@ -127,8 +122,7 @@ export class ComponentDialog extends Dialog { public async repromptDialog(context: TurnContext, instance: DialogInstance): Promise { // Forward to inner dialogs - const dialogState: any = instance.state[PERSISTED_DIALOG_STATE]; - const innerDC: DialogContext = new DialogContext(this.dialogs, context, dialogState); + const innerDC: DialogContext = this.createInnerDC(context, instance); await innerDC.repromptDialog(); // Notify component. @@ -138,8 +132,7 @@ export class ComponentDialog extends Dialog { public async endDialog(context: TurnContext, instance: DialogInstance, reason: DialogReason): Promise { // Forward cancel to inner dialogs if (reason === DialogReason.cancelCalled) { - const dialogState: any = instance.state[PERSISTED_DIALOG_STATE]; - const innerDC: DialogContext = new DialogContext(this.dialogs, context, dialogState); + const innerDC: DialogContext = this.createInnerDC(context, instance); await innerDC.cancelAllDialogs(); } @@ -171,6 +164,17 @@ export class ComponentDialog extends Dialog { return this.dialogs.find(dialogId); } + /** + * Creates the inner dialog context + * @param outerDC the outer dialog context + */ + public createChildContext(outerDC: DialogContext) { + const innerDC = this.createInnerDC(outerDC.context, outerDC.activeDialog); + innerDC.parent = outerDC; + + return innerDC; + } + /** * Called anytime an instance of the component has been started. * @@ -237,6 +241,14 @@ export class ComponentDialog extends Dialog { return outerDC.endDialog(result); } + private createInnerDC(context: TurnContext, instance: DialogInstance) { + const dialogState = instance.state[PERSISTED_DIALOG_STATE] || { dialogStack: [] }; + instance.state[PERSISTED_DIALOG_STATE] = dialogState + const innerDC: DialogContext = new DialogContext(this.dialogs, context, dialogState); + + return innerDC + } + /** * Set the telemetry client, and also apply it to all child dialogs. * Future dialogs added to the component will also inherit this client.