public override async Task HandleMessageActionAsync()

in src/JetBrains.Space.Samples.App/WebHooks/CateringWebHookHandler.cs [85:244]


    public override async Task<AppUserActionExecutionResult> HandleMessageActionAsync(MessageActionPayload payload)
    {
        Sessions.TryGetValue(payload.UserId, out var cateringSession);

        // Start session
        if (payload.ActionId == ActionId.Skip) return AppUserActionExecutionResult.Success();

        if (cateringSession == null)
        {
            cateringSession = new CateringSession();
            Sessions[payload.UserId] = cateringSession;
        }

        // Store choices
        if (payload.ActionId == ActionId.Food)
        {
            cateringSession.SelectedFood = payload.ActionValue;
        }
        if (payload.ActionId == ActionId.Drinks)
        {
            cateringSession.SelectedDrinks = payload.ActionValue;
        }
        if (payload.ActionId == ActionId.DrinkAdditions)
        {
            cateringSession.SelectedDrinkAdditions = payload.ActionValue;
        }
            
        // More choices to make?
        if (string.IsNullOrEmpty(cateringSession.SelectedFood))
        {
            await SendOrEditMessageAsync(
                channelIdentifier: ChannelIdentifier.Profile(ProfileIdentifier.Id(payload.UserId)), 
                recipient: MessageRecipient.Member(ProfileIdentifier.Id(payload.UserId)),
                content: ChatMessage.Block(
                    outline: new MessageOutline("Would you prefer chicken or pasta?"),
                    messageData: "Would you prefer chicken or pasta?",
                    sections: new()
                    {
                        MessageSectionElement.MessageSection(
                            elements: new()
                            {
                                MessageBlockElement.MessageText("JetBrains Space - Catering", size: MessageTextSize.SMALL),
                                
                                MessageBlockElement.MessageText("Would you prefer chicken or pasta?"),
                                MessageBlockElement.MessageControlGroup(new List<MessageControlElement>
                                {
                                    MessageControlElement.MessageButton("Chicken", MessageButtonStyle.REGULAR,
                                        MessageAction.Post(ActionId.Food, "🍗 Chicken")),
                                    MessageControlElement.MessageButton("Pasta", MessageButtonStyle.REGULAR,
                                        MessageAction.Post(ActionId.Food, "🍝 Pasta")),
                                    MessageControlElement.MessageButton("No food", MessageButtonStyle.REGULAR,
                                        MessageAction.Post(ActionId.Food, "🤷 None"))
                                })
                            })
                    },
                    style: MessageStyle.PRIMARY),
                cateringSession: cateringSession);
        }
        else if (string.IsNullOrEmpty(cateringSession.SelectedDrinks))
        {
            await SendOrEditMessageAsync(
                channelIdentifier: ChannelIdentifier.Profile(ProfileIdentifier.Id(payload.UserId)),
                recipient: MessageRecipient.Member(ProfileIdentifier.Id(payload.UserId)),
                content: ChatMessage.Block(
                    outline: new MessageOutline("Any drinks? Coffee or tea?"),
                    messageData: "Any drinks? Coffee or tea?",
                    sections: new()
                    {
                        MessageSectionElement.MessageSection(
                            elements: new()
                            {
                                MessageBlockElement.MessageText("JetBrains Space - Catering", size: MessageTextSize.SMALL),
                                
                                MessageBlockElement.MessageText("Any drinks? Coffee or tea?"),
                                MessageBlockElement.MessageControlGroup(new List<MessageControlElement>
                                {
                                    MessageControlElement.MessageButton("Water", MessageButtonStyle.REGULAR, 
                                        MessageAction.Post(ActionId.Drinks, "🥛 Water")),
                                    MessageControlElement.MessageButton("Coffee", MessageButtonStyle.REGULAR,
                                        MessageAction.Post(ActionId.Drinks, "☕ Coffee")),
                                    MessageControlElement.MessageButton("Tea", MessageButtonStyle.REGULAR, 
                                        MessageAction.Post(ActionId.Drinks, "☕ Tea")),
                                    MessageControlElement.MessageButton("Juice", MessageButtonStyle.REGULAR, 
                                        MessageAction.Post(ActionId.Drinks, "🧃 Juice")),
                                    MessageControlElement.MessageButton("No drinks", MessageButtonStyle.REGULAR, 
                                        MessageAction.Post(ActionId.Drinks, "🤷 None"))
                                })
                            })
                    },
                    style: MessageStyle.PRIMARY),
                cateringSession: cateringSession);
        }
        else if (!string.IsNullOrEmpty(cateringSession.SelectedDrinks) 
                 && cateringSession.SelectedDrinks.Contains("coffee", StringComparison.OrdinalIgnoreCase)
                 && string.IsNullOrEmpty(cateringSession.SelectedDrinkAdditions))
        {
            await SendOrEditMessageAsync(
                channelIdentifier: ChannelIdentifier.Profile(ProfileIdentifier.Id(payload.UserId)),
                recipient: MessageRecipient.Member(ProfileIdentifier.Id(payload.UserId)),
                content: ChatMessage.Block(
                    outline: new MessageOutline("How would you like your coffee?"),
                    messageData: "How would you like your coffee?",
                    sections: new()
                    {
                        MessageSectionElement.MessageSection(
                            elements: new()
                            {
                                MessageBlockElement.MessageText("JetBrains Space - Catering", size: MessageTextSize.SMALL),
                                
                                MessageBlockElement.MessageText("How would you like your coffee?"),
                                MessageBlockElement.MessageControlGroup(new List<MessageControlElement>
                                {
                                    MessageControlElement.MessageButton("Milk", MessageButtonStyle.REGULAR, 
                                        MessageAction.Post(ActionId.DrinkAdditions, "🥛 with milk")),
                                    MessageControlElement.MessageButton("Sugar", MessageButtonStyle.REGULAR,
                                        MessageAction.Post(ActionId.DrinkAdditions, "🍁 with sugar")),
                                    MessageControlElement.MessageButton("Milk & sugar", MessageButtonStyle.REGULAR, 
                                        MessageAction.Post(ActionId.DrinkAdditions, "🥛🍁 with milk and sugar")),
                                    MessageControlElement.MessageButton("No additions", MessageButtonStyle.REGULAR, 
                                        MessageAction.Post(ActionId.DrinkAdditions, "🤷 no additions"))
                                })
                            })
                    },
                    style: MessageStyle.PRIMARY),
                cateringSession: cateringSession);
        }
        else
        {
            await SendOrEditMessageAsync(
                channelIdentifier: ChannelIdentifier.Profile(ProfileIdentifier.Id(payload.UserId)),
                recipient: MessageRecipient.Member(ProfileIdentifier.Id(payload.UserId)),
                content: ChatMessage.Block(
                    outline: new MessageOutline("Thank you, we'll be right there!"),
                    messageData: "Thank you, we'll be right there!",
                    sections: new()
                    {
                        MessageSectionElement.MessageSection(
                            elements: new()
                            {
                                MessageBlockElement.MessageText("JetBrains Space - Catering", size: MessageTextSize.SMALL),
                                
                                MessageBlockElement.MessageText("Thank you, we'll be right there!"),
                                MessageBlockElement.MessageFields(new List<MessageFieldElement>
                                {
                                    MessageFieldElement.MessageField("Food choice:", cateringSession.SelectedFood),
                                    MessageFieldElement.MessageField("Drinks choice:", cateringSession.SelectedDrinks
                                        + (cateringSession.SelectedDrinkAdditions != null
                                            ? " (" + cateringSession.SelectedDrinkAdditions + ")"
                                            : ""))
                                })
                            })
                    },
                    style: MessageStyle.PRIMARY),
                cateringSession: cateringSession);

            Sessions.TryRemove(payload.UserId, out _);
        }

        return AppUserActionExecutionResult.Success();
    }