OfficeDev / office-js

A repo and NPM package for Office.js, corresponding to a copy of what gets published to the official "evergreen" Office.js CDN, at https://appsforoffice.microsoft.com/lib/1/hosted/office.js.
https://learn.microsoft.com/javascript/api/overview
Other
641 stars 92 forks source link

When replying or forwarding an email body.getAsync() returns an incorrect value #4392

Closed bchenhs closed 3 days ago

bchenhs commented 3 weeks ago

Provide required information needed to triage your issue

Similar symptoms as: https://github.com/OfficeDev/office-js/issues/3988 https://github.com/OfficeDev/office-js/issues/4360

Your Environment

Expected behavior

Appropriately get the value of the mail body for reply/forward emails.

Current behavior

The mail body is incorrect and contains duplicating contents after item.body.setAsync.

Steps to reproduce

  1. Open a received email and press the reply button. We see this issue on the Microsoft Viva emails.
  2. Execute item.body.getAsync, and sets the same content back with item.body.setAsync
  3. Execute body.getAsync.

Link to live example(s)

These are taken from https://github.com/OfficeDev/office-js/issues/3988

Javascript

$("#run").on("click", run);

const timeout = 1000;

function run() {
  // Gets current email body
  Office.context.mailbox.item.body.getAsync(Office.CoercionType.Html, (result) => {
    document.getElementById("firstBody").innerHTML = escapeHtml(result.value);

    setTimeout(() => {
      // Sets the same email body
      Office.context.mailbox.item.body.setAsync(result.value, { coercionType: Office.CoercionType.Html }, (result) => {
        Office.context.mailbox.item.body.getAsync(Office.CoercionType.Html, (result) => {
          // Gets email body again after setAsync
          document.getElementById("secondBody").innerHTML = escapeHtml(result.value);
        });
      });
    }, timeout);
  });
}

function escapeHtml(html) {
  return html
    .replace(/&/g, "&")
    .replace(/</g, "&lt;")
    .replace(/>/g, "&gt;")
    .replace(/"/g, "&quot;")
    .replace(/'/g, "&#039;");
}

HTML

<div>
    <button id="run" class="ms-Button">
    <span class="ms-Button-label">Run</span>
</button>

    <p>--FIRST--</p>
    <p id="firstBody"></p>
    <br><br>
    <p>--SECOND--</p>
    <p id="secondBody"></p>
</div>

Provide additional details

anjalitp commented 3 weeks ago

@bchenhs we are not able to repro the issue on our side. Could you please share a repro video of the issue?

bchenhs commented 3 weeks ago

Hi @anjalitp I've updated the description and sample script to better demonstrate the issue. The missing step in the original description was calling body.setAsync.

anjalitp commented 3 weeks ago

Thanks for updating the issue. We are able to repro the issue with body.setAsync call. It seems like body.setAsync call is not replacing the quoted text in the original body, hence the subsequent getAsync call shows the quoted text twice. This looks like expected behaviour for body.setAsync API on OWA but we would like to understand more about your Add-in use case which is being blocked by this issue. Could you please share the same?

bchenhs commented 3 weeks ago

@anjalitp Can you please elaborate on how this looks like expected behaviour for body.setAsync when the API specifies it "Replaces the entire body with the specified text."?

The example on the API documentation site states:

Office.context.mailbox.item.body.setAsync(
    "<b>(replaces all body, including threads you are replying to that may be on the bottom)</b>",
    { coercionType: "html", asyncContext: "This is passed to the callback" },
    function callback(result) {
        // Process the result.
});

This is also a recent change in behaviour. Prior to a few day ago, it was working as expected and followed the API spec.

hsptkt commented 3 weeks ago

Hi @anjalitp @exextoc, just to add to this report, the symptoms here fully match the other issues linked (#3988 and #4360), where the add-in team was able to confirm there was a regression. Tagging in @ajays-msft in case he can add context as well.

anjalitp commented 2 weeks ago

@hsptkt @bchenhs Thanks for providing more context. We are invesigating this issue further and we will update this thread once we have an update.

Internal Tracking ID: 4530717

ajays-msft commented 3 days ago

In OWA, getBody or setBody reflects what can be possible in from the UI. For example, if the messages are grouped by conversation, reply/forward will show quoted text (... which requires user to expand to see the full message). When there is quoted text, get/set body will only get/set the editable content in the email.