- Notifications
You must be signed in to change notification settings - Fork 492
Description
Overview
We currently allow Bot developers to receive feedback from Teams users using Feedback Loops. When a user clicks "Submit" the feedback, message/submitAction invoke is fired. We need a new invoke handler for message/submitAction invoke.
We are introducing Bot developers to create Custom feedback loops. These custom feedback loops allow Bot developers to show either an Adaptive Card (AC) task module or a website task module. If a bot sent a message with custom feedback loop enabled to the Teams client, the Teams client will fire new invoke, message/fetchTask to determine whether the custom feedback loop should show an AC task module or a website task module. We need another invoke handler for message/fetchTask invoke.
Example Screenshots
Default Feedback
Custom Feedback (AC)
Custom Feedback (Website)
Return Values
How I am currently handling these two invokes inside onInvokeActivity
message/submitAction
{ status: 200, body: {} }message/fetchTask
Adaptive Card
const taskModuleReturn = { task: { type: 'continue', value: { card: [Object], // Should contain valid Adaptive Card Payload height: 200, width: 400, title: 'Test Task Module Title with AC' } } }; return { status: 200, body: taskModuleReturn };Website URL
const taskModuleReturn = { task: { type: 'continue', value: { url: "https://bing.com", // Should contain valid URL with the valid domain listed under App Manifest } } }; return { status: 200, body: taskModuleReturn };Sample Bot Code
Send messages with feedback loop
this.onMessage(async (context, next) => { console.log("Running with Message Activity."); const removedMentionText = TurnContext.removeRecipientMention(context.activity); const txt = removedMentionText.toLowerCase().replace(/\n|\r/g, "").trim(); await context.sendActivity(`Echo: ${txt}`); await context.sendActivity({ type: ActivityTypes.Message, text: "Old message with feedbackLoopEnabled = true", channelData: { feedbackLoopEnabled: true // use default feedback form }, }); await context.sendActivity({ type: ActivityTypes.Message, text: "Old message with feedbackLoopEnabled = false", channelData: { feedbackLoopEnabled: false // use default feedback form }, }); await context.sendActivity({ type: ActivityTypes.Message, text: "new message with feedbackLoop = default", channelData: { feedbackLoop: { type: "default" } }, }); await context.sendActivity({ type: ActivityTypes.Message, text: "new message with feedbackLoop = custom", channelData: { feedbackLoop: { type: "custom" } }, }); // By calling next() you ensure that the next BotHandler is run. await next(); });

