Skip to content

Improve unified support conversation flow - #23238

Open
adalpari wants to merge 5 commits into
trunkfrom
adalpari/conversation-screen-updates
Open

Improve unified support conversation flow#23238
adalpari wants to merge 5 commits into
trunkfrom
adalpari/conversation-screen-updates

Conversation

@adalpari

@adalpari adalpari commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

TL/DR

In this PR we are addressing multiple feedback we got from the support uniffied conversation testing.
We have fixed some bugs, like having problems getting answers in real-time, but aso there are some improvements like better states, text sent confirmation messages, better CTAs captions, and so on

Description

Several UI and behaviour improvements to the new (unified) support
conversation flow, gated behind the MODERN_SUPPORT experimental feature:

  • Auto-refresh (CMM-2288): The open conversation and the conversations
    list now refresh silently every minute (no pull-to-refresh spinner), and
    both refresh again whenever the screen returns to the foreground
    (onStart), so Happiness Engineer replies show up in the app without user
    action. Background refreshes never surface an error or clobber an
    in-flight reply.
  • Send confirmation (CMM-2294): After an HE ticket reply is sent
    successfully, a transient snackbar confirms it — "Your reply has been
    sent. Check your email for updates." Bot chat sends are excluded, and a
    failed send still shows the existing error snackbar instead.
  • "Ongoing" status (CMM-2295): open, new, hold, and pending
    conversations now display a single Ongoing badge, hiding the internal
    Zendesk statuses that were previously exposed as "Waiting for Support" /
    "Waiting for User".
  • Adaptive reply CTA (CMM-2292, CMM-2289): For HE conversations the
    button (and the reply form title) now reads "Reply" when the last
    message is from support, and "Add more info" when the last message is
    the user's own or the bot's (e.g. a freshly created ticket). While the
    conversation is still loading the button shows a spinner instead of a
    premature, incorrect label.
  • Smaller bot typing indicator: The bot "typing" bubble and its dots
    were reduced in size.

Related Linear issues

  • CMM-2294 — No confirmation after sending the support form
  • CMM-2295 — Zendesk internal ticket statuses exposed to users
  • CMM-2293 — Reply form has no context intro text
  • CMM-2292 — Reply button after escalation should be "open a support ticket"
  • CMM-2289 — Chat and ticket are a confusing hybrid after escalation
  • CMM-2288 — Happiness Engineer replies don't appear in the app

Testing instructions

Requires the MODERN_SUPPORT experimental feature enabled
(Me → App Settings → Experimental Features), and a WordPress.com account
with existing support conversations.

Basically, start a new support conversation with the bot. Then at some point ask it to "talk to a human" and move the conversation to Zendesk. Answer from Zendesk, resolve the ticket and check the flow works. Report any improvements you believe could be useful.

NOTE: if you don't want to ask for Zendesk permissions (you can get one-day permissions) send me a DM, and I'll follow the ticket.

…ive CTA

Add periodic and on-resume refresh for the conversations list and open
chat, an adaptive reply CTA, an "Ongoing" status, and a smaller bot
typing indicator.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@dangermattic

dangermattic commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator
2 Warnings
⚠️ This PR is larger than 300 lines of changes. Please consider splitting it into smaller PRs for easier and faster reviews.
⚠️ PR is not assigned to a milestone.

Generated by 🚫 Danger

@wpmobilebot

wpmobilebot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

App Icon📲 You can test the changes from this Pull Request in WordPress Android by scanning the QR code below to install the corresponding build.

App NameWordPress Android
Build TypeDebug
Versionpr23238-9ace731
Build Number1498
Application IDorg.wordpress.android.prealpha
Commit9ace731
Installation URL2gv1rm8hrq1do
Automatticians: You can use our internal self-serve MC tool to give yourself access to those builds if needed.

After a Happiness Engineer ticket reply is sent successfully, show a
transient snackbar ("Your reply has been sent. Check your email for
updates.") so the user knows it worked. Bot chat sends are excluded.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@wpmobilebot

wpmobilebot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

App Icon📲 You can test the changes from this Pull Request in Jetpack Android by scanning the QR code below to install the corresponding build.

App NameJetpack Android
Build TypeDebug
Versionpr23238-9ace731
Build Number1498
Application IDcom.jetpack.android.prealpha
Commit9ace731
Installation URL4bci6k5bjbbp0
Automatticians: You can use our internal self-serve MC tool to give yourself access to those builds if needed.

Collapse the auto-refresh guards into a single local flag so the function
stays within the ReturnCount limit without tripping ComplexCondition.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@adalpari
adalpari marked this pull request as ready for review August 19, 2026 11:52
@wpmobilebot

Copy link
Copy Markdown
Contributor

🤖 Build Failure Analysis

This build has failures. Claude has analyzed them - check the build annotations for details.

Delete the leftover translations for he_support_status_waiting_for_support
and he_support_status_waiting_for_user across all locales. Their base
strings were removed when the statuses were collapsed into "Ongoing", and
lint flags translations without a base string (ExtraTranslation = error).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@codecov

codecov Bot commented Aug 19, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 4.76190% with 80 lines in your changes missing coverage. Please review.
✅ Project coverage is 37.91%. Comparing base (419039b) to head (9ace731).
⚠️ Report is 2 commits behind head on trunk.

Files with missing lines Patch % Lines
...port/unified/ui/UnifiedConversationDetailScreen.kt 0.00% 42 Missing ⚠️
...support/common/ui/ConversationsSupportViewModel.kt 0.00% 18 Missing ⚠️
...roid/support/unified/ui/UnifiedSupportViewModel.kt 20.00% 16 Missing ⚠️
...ndroid/support/unified/model/ConversationStatus.kt 0.00% 2 Missing ⚠️
...roid/support/unified/ui/ConversationStatusBadge.kt 0.00% 2 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##            trunk   #23238      +/-   ##
==========================================
- Coverage   37.92%   37.91%   -0.02%     
==========================================
  Files        2334     2334              
  Lines      126984   127043      +59     
  Branches    17589    17614      +25     
==========================================
+ Hits        48162    48166       +4     
- Misses      74888    74943      +55     
  Partials     3934     3934              

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@adalpari
adalpari requested a review from nbradbury August 19, 2026 12:09
@nbradbury

Copy link
Copy Markdown
Contributor

@adalpari I've not tested this yet, but Claude found a couple of issues that look like they should be addressed.

review-pr-23238-support-conversation-2026-08-19.pdf

Scope both auto-refresh timers to the STARTED lifecycle so they stop
polling while backgrounded, switch the reply-sent confirmation to a
conflated Channel so the event can't be dropped or block the send's
finally block, and guard the silent list refresh against pull-to-refresh
races.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@adalpari

Copy link
Copy Markdown
Contributor Author

@adalpari I've not tested this yet, but Claude found a couple of issues that look like they should be addressed.

review-pr-23238-support-conversation-2026-08-19.pdf

Got it! I've fixed the three points set as "medium". Only the first one was a real worry though

@nbradbury

Copy link
Copy Markdown
Contributor

@adalpari I'm trying to test this but when I send a message I get a "Something went wrong" snackbar.

help

Inspection shows a 200 response with a lengthy body:

{
  "chat_id": 6290686,
  "wpcom_user_id": 57407635,
  "external_id": null,
  "external_id_provider": null,
  "session_id": "61e4ddb3-1a56-4f37-abbb-4a16d42ee6ce",
  "bot_slug": "jetpack-workflow-chat_mobile_support",
  "bot_version": "1.1.2",
  "created_at": "2026-08-19 15:01:53",
  "zendesk_ticket_id": null,
  "messages": [
    {
      "message_id": 40740699,
      "content": "Hey there! I'm here and ready to help with any Jetpack or WordPress Mobile app questions you have. What can I assist you with today?",
      "role": "bot",
      "created_at": "2026-08-19 15:01:57",
      "context": {
        "flags": null,
        "sources": [
          {
            "title": "Use Jetpack and Cloudflare on your WordPress site",
            "content": "Cloudflare is a popular content delivery network (CDN), caching, and protection service that is compatible with Jetpack on WordPress.\nCloudflare should be compatible with Jetpack by default, but some configurations might require adjustments to Cloudflare settings for it to be able to work with Jetpack.\nOptimize your site to work with Cloudflare\nAdditional configuration may be necessary to ensure that your Jetpack site is optimized to work well with Cloudflare. Below are a few of the common issues with Cloudflare, and how to resolve them.\nAllowlist Jetpack IPs in Cloudflare settings\nJetpack communicates with your site via  xmlrpc.php . Cloudflare's default settings should already allow Jetpack requests to pass through.\nHowever, if Cloudflare blocks Jetpack's access to your site's xmlrpc.php file, you may need to add Jetpack IP addresses to an allowlist in Cloudflare settings. We have documentation about allowlisting Jetpack IP addresses, though if you need additional guidance on Cloudflare's end, please consult with their support team.\nExclude WordPress's WP Admin from Cloudflare\nCloudflare can speed up your site for visitors, but it isn't needed in your site's WP Admin, and may cause problems. You should configure Cloudflare to ignore your WP Admin by creating page rules for URL *yourjetpack.blog\/wp-admin* (where yourjetpack.blog` is your own site's domain name.\nCloudflare's documentation about creating rules can be found here.\nSpecial considerations for your server credentials in Jetpack VaultPress Backup settings when using Cloudflare\nIf you are a Jetpack VaultPress Backup customer, when using Cloudflare on your site, you will need to provide your server's IP address in the \"Server address\" (otherwise known as \"hostname\") field of your Jetpack VaultPress Backup credentials settings.\nTroubleshooting Jetpack and Cloudflare\nScope of support\nJetpack support cannot assist with Cloudflare configuration.\nHow to pause Cloudflare for troubleshooting and diagnostics\nIf you're having trouble on your site that is suspected to be related to a conflict between Jetpack and Cloudflare, you can temporarily pause Cloudflare for testing purposes. Guidance for how to pause Cloudflare is in this Cloudflare documentation.\n500-level errors from Cloudflare when attempting to connect Jetpack\nIf you have already optimized Jetpack for use with Cloudflare and are seeing 500-level errors when attempting to connect your site to Jetpack, you will need to work with your hosting provider and Cloudflare to resolve the issue. Cloudflare has a troubleshooting guide for how to fix these issues here.\nKnown conflicts between Jetpack and Cloudflare\nCloudflare\u2019s Rocket Loader has compatibility issues with some Jetpack features.\nStill need help?\nPlease contact support. We're happy to advise.",
            "url": "https:\/\/jetpack.com\/support\/getting-started-with-jetpack\/configure-jetpack-cloudflare\/"
          },
          {
            "title": "Using Filters to Customize Cache Parameters in Jetpack Boost",
            "content": "In this guide, you'll learn how to customize Jetpack Boost's cache behavior using filters to improve site performance and reduce cache fragmentation.\nUnderstanding the Page Cache in Jetpack Boost\nJetpack Boost's Page Cache feature generates and stores static versions of dynamic WordPress pages. The URL of a page and the browser cookies of the visitor are what we use to identify a page.\nA person who visits a page with no cookies in their browser is described as an \"anonymous user\" because they have no data to identify them. The cache file generated for them can potentially be used for many other visitors. To maximize speed, these cached pages are served before WordPress fully initializes, which means most WordPress functionalities are unavailable at this stage.\nFor developers who need to execute code early in the page-serving process, Jetpack Boost provides the Extra Code Loader. This tool enables the execution of custom code before two critical points in a WordPress request:\nWhen a cached page is served.\nWhen the output buffer is created to cache a new page.\nThis functionality allows developers to implement necessary operations or modifications even when working with cached pages, ensuring both speed and customization capabilities.\nCustomizing cache behavior with filters\nTo modify cache parameters, you can create a file named wp-content\/boost-cache-extra.php. Jetpack Boost will load it and execute it like any other PHP script. The file must have an opening",
            "url": "https:\/\/jetpack.com\/support\/jetpack-boost\/using-filters-to-customize-cache-parameters-in-jetpack-boost\/"
          },
          {
            "title": "Troubleshooting Concatenated CSS or JavaScript Delivery Methods",
            "content": "This article explains how Jetpack Boost delivers concatenated CSS and JavaScript files, how to check which delivery method is in use, and how to troubleshoot issues with direct delivery and PHP-served fallback.\nJetpack Boost (v3.9.0 and later) optimizes WordPress performance by concatenating and minifying CSS and JavaScript files, delivering them directly from your web server for faster load times.\nWhen direct delivery is not possible, a fallback system using PHP keeps content accessible while optimization continues.\nHow to check which delivery method is in use\nTo determine which delivery method your site is currently using, follow these steps:\nOpen a page on your website in a browser.\nView the page source (right-click \u2192 View page source).\nLook for CSS or JavaScript file URLs:\nIf they are loaded from \/wp-content\/boost-cache\/static\/, your site is already set up for direct delivery of these files.\nIf they are served from \/_jb_static\/, WordPress is handling the delivery. This can slow down requests slightly because PHP processes these files. Concatenating multiple files into one is still beneficial, but you may want to find out why direct delivery is not working on your site.\nCustom permalinks and file regeneration\nJetpack Boost relies on WordPress\u2019s custom permalinks system to regenerate these concatenated files. If a file is missing, WordPress detects the issue and triggers a regeneration process in Jetpack Boost. The plugin periodically checks whether WordPress detects missing files in the wp-content directory. If this check fails, files are served using the \/_jb_static\/ method via PHP.\nManual testing\nIf your site is using \/_jb_static\/ to serve the concatenated files, you can run a manual test by attempting to access a non-existent URL within the \/wp-content directory. The URL should look like a file the plugin uses, such as \/wp-content\/boost-cache\/static\/1234.css. Look for a WordPress 404 error page. If you instead see a standard web server 404 error, this confirms there is an issue requiring resolution.\nWhen does the automatic 404 test run?\nThe plugin performs a check when both Concatenate modules (JS and CSS) are disabled and you enable one of them. It also runs once daily. This keeps monitoring of your site\u2019s file delivery ongoing.\nThe automatic 404 test never runs on WordPress.com or Pressable. On those hosts, Jetpack Boost always uses PHP-served delivery through the \/_jb_static\/ method, because the web server may answer 404s for missing wp-content files before WordPress loads. Since WordPress never sees the 404, the test cannot produce a reliable result there.\nHow to fix issues with wp-content\nThe issue likely stems from the underlying web server configuration tied to custom permalinks.\nFixing on Apache\nOn Apache servers, mod_rewrite rules manage this, and they may be disabled in the wp-content directory. Check for a hidden .htaccess file within the wp-content directory. If present, look for the following directive:\nRewriteEngine Off\nRemoving or commenting out this line may resolve the issue. If you are unfamiliar with these configurations, contact your hosting provider for assistance.\nIf there is no .htaccess file in the wp-content directory, your hosting provider may have disabled the web server settings this plugin relies on. If that is the case, the plugin falls back to using WordPress techniques to serve the concatenated CSS or JavaScript. This is slightly slower, but it is still beneficial to your site.\nFixing on non-Apache servers\nFor non-Apache servers like Nginx, consult your server's documentation or contact your hosting provider for guidance on modifying configuration files in \/etc\/nginx\/.\nDeveloper options: disable 404 testing\nThe following section is for developers. Changing these options incorrectly can break the delivery of your site's CSS and JavaScript. If you are unsure, contact your hosting provider before making changes.\nTo disable the is_404() testing, define the constant JETPACK_BOOST_DISABLE_404_TESTER in an mu-plugin. Here is an example of how to set that constant:",
            "url": "https:\/\/jetpack.com\/support\/jetpack-boost\/troubleshooting-concatenated-css-or-javascript-delivery-methods\/"
          }
        ]
      },
      "ts": 1787151717
    }
  ]
}

@adalpari

Copy link
Copy Markdown
Contributor Author

That's a non-expected response. It's odd that your original message is not included in the response...

Is it reproducible 100% of the time?

@nbradbury

Copy link
Copy Markdown
Contributor

Is it reproducible 100% of the time?

Yes.

@adalpari

Copy link
Copy Markdown
Contributor Author

Is it reproducible 100% of the time?

Yes.

What's your user type?

@nbradbury

Copy link
Copy Markdown
Contributor

Admin.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants