public MainDialog(
            BotSettings settings,
            BotServices services,
            ResponseManager responseManager,
            ConversationState conversationState,
            UserState userState,
            ForwardEmailDialog forwardEmailDialog,
            SendEmailDialog sendEmailDialog,
            ShowEmailDialog showEmailDialog,
            ReplyEmailDialog replyEmailDialog,
            DeleteEmailDialog deleteEmailDialog,
            IBotTelemetryClient telemetryClient)
            : base(nameof(MainDialog), telemetryClient)
        {
            _settings          = settings;
            _services          = services;
            _userState         = userState;
            _responseManager   = responseManager;
            _conversationState = conversationState;
            TelemetryClient    = telemetryClient;
            _stateAccessor     = _conversationState.CreateProperty <EmailSkillState>(nameof(EmailSkillState));

            AddDialog(forwardEmailDialog ?? throw new ArgumentNullException(nameof(forwardEmailDialog)));
            AddDialog(sendEmailDialog ?? throw new ArgumentNullException(nameof(sendEmailDialog)));
            AddDialog(showEmailDialog ?? throw new ArgumentNullException(nameof(showEmailDialog)));
            AddDialog(replyEmailDialog ?? throw new ArgumentNullException(nameof(replyEmailDialog)));
            AddDialog(deleteEmailDialog ?? throw new ArgumentNullException(nameof(deleteEmailDialog)));

            GetReadingDisplayConfig();
        }
        public MainDialog(
            IServiceProvider serviceProvider,
            IBotTelemetryClient telemetryClient)
            : base(nameof(MainDialog), telemetryClient)
        {
            _settings          = serviceProvider.GetService <BotSettings>();
            _services          = serviceProvider.GetService <BotServices>();
            _userState         = serviceProvider.GetService <UserState>();
            _responseManager   = serviceProvider.GetService <ResponseManager>();
            _conversationState = serviceProvider.GetService <ConversationState>();
            TelemetryClient    = telemetryClient;
            _stateAccessor     = _conversationState.CreateProperty <EmailSkillState>(nameof(EmailSkillState));

            _forwardEmailDialog = serviceProvider.GetService <ForwardEmailDialog>();
            _sendEmailDialog    = serviceProvider.GetService <SendEmailDialog>();
            _showEmailDialog    = serviceProvider.GetService <ShowEmailDialog>();
            _replyEmailDialog   = serviceProvider.GetService <ReplyEmailDialog>();
            _deleteEmailDialog  = serviceProvider.GetService <DeleteEmailDialog>();

            AddDialog(_forwardEmailDialog ?? throw new ArgumentNullException(nameof(_forwardEmailDialog)));
            AddDialog(_sendEmailDialog ?? throw new ArgumentNullException(nameof(_sendEmailDialog)));
            AddDialog(_showEmailDialog ?? throw new ArgumentNullException(nameof(_showEmailDialog)));
            AddDialog(_replyEmailDialog ?? throw new ArgumentNullException(nameof(_replyEmailDialog)));
            AddDialog(_deleteEmailDialog ?? throw new ArgumentNullException(nameof(_deleteEmailDialog)));

            GetReadingDisplayConfig();
        }
        public ShowEmailDialog(
            BotSettings settings,
            BotServices services,
            ResponseManager responseManager,
            ConversationState conversationState,
            DeleteEmailDialog deleteEmailDialog,
            ReplyEmailDialog replyEmailDialog,
            ForwardEmailDialog forwardEmailDialog,
            IServiceManager serviceManager,
            IBotTelemetryClient telemetryClient,
            MicrosoftAppCredentials appCredentials)
            : base(nameof(ShowEmailDialog), settings, services, responseManager, conversationState, serviceManager, telemetryClient, appCredentials)
        {
            TelemetryClient = telemetryClient;

            var showEmail = new WaterfallStep[]
            {
                IfClearContextStep,
                GetAuthToken,
                AfterGetAuthToken,
                Display
            };

            var readEmail = new WaterfallStep[]
            {
                ReadEmail,
                Reshow
            };

            var deleteEmail = new WaterfallStep[]
            {
                DeleteEmail,
                Reshow
            };

            var forwardEmail = new WaterfallStep[]
            {
                ForwardEmail,
                Reshow
            };

            var replyEmail = new WaterfallStep[]
            {
                ReplyEmail,
                Reshow
            };

            var displayEmail = new WaterfallStep[]
            {
                IfClearPagingConditionStep,
                PagingStep,
                ShowEmails,
                PromptToHandle,
                CheckRead,
                HandleMore
            };

            var displayFilteredEmail = new WaterfallStep[]
            {
                ShowFilteredEmails,
                PromptToHandle,
                CheckRead,
                HandleMore
            };

            var redisplayEmail = new WaterfallStep[]
            {
                PromptToReshow,
                CheckReshow,
                HandleMore,
            };

            // Define the conversation flow using a waterfall model.
            AddDialog(new WaterfallDialog(Actions.Show, showEmail)
            {
                TelemetryClient = telemetryClient
            });
            AddDialog(new WaterfallDialog(Actions.Read, readEmail)
            {
                TelemetryClient = telemetryClient
            });
            AddDialog(new WaterfallDialog(Actions.Delete, deleteEmail)
            {
                TelemetryClient = telemetryClient
            });
            AddDialog(new WaterfallDialog(Actions.Forward, forwardEmail)
            {
                TelemetryClient = telemetryClient
            });
            AddDialog(new WaterfallDialog(Actions.Reply, replyEmail)
            {
                TelemetryClient = telemetryClient
            });
            AddDialog(new WaterfallDialog(Actions.Display, displayEmail)
            {
                TelemetryClient = telemetryClient
            });
            AddDialog(new WaterfallDialog(Actions.DisplayFiltered, displayFilteredEmail)
            {
                TelemetryClient = telemetryClient
            });
            AddDialog(new WaterfallDialog(Actions.ReDisplay, redisplayEmail)
            {
                TelemetryClient = telemetryClient
            });
            AddDialog(deleteEmailDialog ?? throw new ArgumentNullException(nameof(deleteEmailDialog)));
            AddDialog(replyEmailDialog ?? throw new ArgumentNullException(nameof(replyEmailDialog)));
            AddDialog(forwardEmailDialog ?? throw new ArgumentNullException(nameof(forwardEmailDialog)));
            InitialDialogId = Actions.Show;
        }