Skip to content

Commit

Permalink
Merge pull request #1318 from ltwlf/master
Browse files Browse the repository at this point in the history
Adds createChildContext method to ComponentDialog
  • Loading branch information
Stevenic authored Oct 22, 2019
2 parents ad7a319 + e94f11b commit 1958ea6
Showing 1 changed file with 23 additions and 11 deletions.
34 changes: 23 additions & 11 deletions libraries/botbuilder-dialogs/src/componentDialog.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,10 +81,7 @@ export class ComponentDialog<O extends object = {}> extends Dialog<O> {

public async beginDialog(outerDC: DialogContext, options?: O): Promise<DialogTurnResult> {
// 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<any> = await this.onBeginDialog(innerDC, options);

// Check for end of inner dialog
Expand All @@ -99,9 +96,7 @@ export class ComponentDialog<O extends object = {}> extends Dialog<O> {

public async continueDialog(outerDC: DialogContext): Promise<DialogTurnResult> {
// 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<any> = await this.onContinueDialog(innerDC);

// Check for end of inner dialog
Expand All @@ -127,8 +122,7 @@ export class ComponentDialog<O extends object = {}> extends Dialog<O> {

public async repromptDialog(context: TurnContext, instance: DialogInstance): Promise<void> {
// 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.
Expand All @@ -138,8 +132,7 @@ export class ComponentDialog<O extends object = {}> extends Dialog<O> {
public async endDialog(context: TurnContext, instance: DialogInstance, reason: DialogReason): Promise<void> {
// 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();
}

Expand Down Expand Up @@ -171,6 +164,17 @@ export class ComponentDialog<O extends object = {}> extends Dialog<O> {
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.
*
Expand Down Expand Up @@ -237,6 +241,14 @@ export class ComponentDialog<O extends object = {}> extends Dialog<O> {
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.
Expand Down

0 comments on commit 1958ea6

Please sign in to comment.