<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Dmytro Shevchenko</title>
    <description>The latest articles on DEV Community by Dmytro Shevchenko (@dmytro_shevchenko_eecc3e2).</description>
    <link>https://dev.to/dmytro_shevchenko_eecc3e2</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4182247%2F7038a18a-437f-4e8e-a0f9-54757ff88afa.jpg</url>
      <title>DEV Community: Dmytro Shevchenko</title>
      <link>https://dev.to/dmytro_shevchenko_eecc3e2</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dmytro_shevchenko_eecc3e2"/>
    <language>en</language>
    <item>
      <title>Keeping drafts and pending messages in a mobile support SDK</title>
      <dc:creator>Dmytro Shevchenko</dc:creator>
      <pubDate>Wed, 14 Oct 2026 06:22:15 +0000</pubDate>
      <link>https://dev.to/dmytro_shevchenko_eecc3e2/keeping-drafts-and-pending-messages-in-a-mobile-support-sdk-5c0m</link>
      <guid>https://dev.to/dmytro_shevchenko_eecc3e2/keeping-drafts-and-pending-messages-in-a-mobile-support-sdk-5c0m</guid>
      <description>&lt;p&gt;Support inside a mobile app has to fit into the app's navigation. A customer may leave the chat to check an order, then return with a half-written message still in the composer.&lt;/p&gt;

&lt;p&gt;A support button can open a modal. A help tab can keep the conversation inside a normal screen. Both are useful, but they behave differently when someone changes tabs, opens another screen or brings the app back from the background.&lt;/p&gt;

&lt;p&gt;DobroDesk Mobile SDK 0.2.0 adds inline support screens and explicit controls for their lifetime. Here is how that affects navigation, drafts and pending messages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give the app control of the screen
&lt;/h2&gt;

&lt;p&gt;An inline support view belongs to the screen that contains it. If the app already has a back button or tab navigation, another close button inside the chat can be confusing. Which one ends the conversation? Which one only leaves the screen?&lt;/p&gt;

&lt;p&gt;We let the host app control navigation for the embedded view. A modal keeps its own presentation controls. The conversation can be presented in either place.&lt;/p&gt;

&lt;p&gt;This also affects layout. The composer needs room when the keyboard opens, the send action needs to stay reachable and a loading or recovery message needs to fit inside the space the app actually gives the widget.&lt;/p&gt;

&lt;p&gt;These previews use example support messages in the native iOS and Android interfaces:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdobrodesk.com%2Fsdk%2Fios-chat-light-en.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdobrodesk.com%2Fsdk%2Fios-chat-light-en.webp" alt="DobroDesk native iOS support conversation with an order lookup example and a full message composer" width="320" height="694"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdobrodesk.com%2Fsdk%2Fandroid-chat-light-en.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdobrodesk.com%2Fsdk%2Fandroid-chat-light-en.webp" alt="DobroDesk native Android support conversation with a full message composer" width="320" height="711"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Leaving a screen should preserve useful work
&lt;/h2&gt;

&lt;p&gt;Imagine typing a support message, switching to the Orders tab to check a number and coming back. Losing the draft would make a normal action feel like a mistake.&lt;/p&gt;

&lt;p&gt;We treat a visibility change separately from ending the account session. Hiding the widget pauses its view work and releases keyboard focus. It preserves the signed session, draft and pending delivery state. Unmounting an inline view releases its surface reservation and view-scoped work while preserving the signed session and pending outbox.&lt;/p&gt;

&lt;p&gt;Logout has a different meaning. A shared device may be about to switch to another person, so the old account's state must be cleared through the account-session lifecycle.&lt;/p&gt;

&lt;p&gt;Keeping these transitions separate avoids putting every kind of cleanup into the same close handler.&lt;/p&gt;

&lt;p&gt;Delayed callbacks need the same care. They should not reopen a screen after navigation or clean up its replacement. The NativeScript fixes in 0.2.0 cover that ownership problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep pending delivery visible
&lt;/h2&gt;

&lt;p&gt;Mobile connections disappear at awkward times. A user may press Send just before losing connectivity.&lt;/p&gt;

&lt;p&gt;The interface needs to distinguish a message waiting locally from one accepted by the service. Otherwise a user has to guess whether to send it again.&lt;/p&gt;

&lt;p&gt;The SDK keeps pending delivery state and can queue messages while offline. The important design question is where acknowledgement happens. A local timeout does not, by itself, tell the app that the service never received the message.&lt;/p&gt;

&lt;p&gt;A useful integration check is to leave and reopen the support screen while a message is pending, then restore the connection. Check the draft, delivery state and what the conversation actually contains. A successful first-send test does not cover that sequence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Carry the action into the handoff
&lt;/h2&gt;

&lt;p&gt;For a configured booking with a connected provider, the conversation collects the details, gets the available choices and asks the customer to confirm. If the action cannot finish or needs a teammate's decision, a person can continue it.&lt;/p&gt;

&lt;p&gt;That person needs the details already collected and the action's result. Keeping them in the conversation helps the teammate continue without making the customer start again.&lt;/p&gt;

&lt;p&gt;AI drafts follow the workspace's approved knowledge and human review is the default. Automatic actions and replies depend on the configured rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  What shipped
&lt;/h2&gt;

&lt;p&gt;Mobile SDK 0.2.0 adds inline presentation for React Native, Flutter and NativeScript, plus a native widget attached to a bounded Capacitor container. The iOS and Android renderers supply the native conversation interface. The host backend issues a short-lived customer token, keeping the signing secret out of the app bundle.&lt;/p&gt;

&lt;p&gt;The release also includes framework fixes around presentation, retries and cleanup. The &lt;a href="https://github.com/comstud-io/dobrodesk-mobile-sdk/releases/tag/v0.2.0" rel="noopener noreferrer"&gt;release notes&lt;/a&gt; list the platform-specific changes.&lt;/p&gt;

&lt;p&gt;These examples come from DobroDesk, a product by CoMStudio OÜ. If you're adding support to an app, the &lt;a href="https://dobrodesk.com/developers" rel="noopener noreferrer"&gt;SDK guides&lt;/a&gt; cover integration and the &lt;a href="https://dobrodesk.com/demo" rel="noopener noreferrer"&gt;public demo&lt;/a&gt; shows the conversation flow.&lt;/p&gt;

&lt;p&gt;Which behaviour has caused the most trouble in your embedded support UI: keyboard layout, pending messages or keeping state when a screen closes?&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>flutter</category>
      <category>mobile</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Why we build DobroDesk on Cloudflare Workers</title>
      <dc:creator>Dmytro Shevchenko</dc:creator>
      <pubDate>Tue, 13 Oct 2026 13:02:37 +0000</pubDate>
      <link>https://dev.to/dmytro_shevchenko_eecc3e2/building-conversation-first-support-on-cloudflare-1e3j</link>
      <guid>https://dev.to/dmytro_shevchenko_eecc3e2/building-conversation-first-support-on-cloudflare-1e3j</guid>
      <description>&lt;p&gt;DobroDesk puts email, website chat and in-app support in shared inboxes. A teammate can read the history, see the customer details and take over from AI when needed.&lt;/p&gt;

&lt;p&gt;We build it on Cloudflare. Here is how that works when a customer asks for a booking and then needs help from the team.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/-TJ3llFlfvs" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  A booking request in chat
&lt;/h2&gt;

&lt;p&gt;A customer asks to book a consultation. With a booking provider connected and the action configured, DobroDesk can collect the service, date and time, check availability and show a proposed slot. The customer confirms before the booking is completed.&lt;/p&gt;

&lt;p&gt;Sometimes the request changes halfway through. The customer may need a different service, or the provider may fail to return an answer. A teammate can then take over with the details already collected in the conversation.&lt;/p&gt;

&lt;p&gt;That handoff matters. The customer should not have to explain the request again, and the teammate needs to know what was tried and what still needs attention.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fejsrbgunk1zbarxrlhiz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fejsrbgunk1zbarxrlhiz.jpg" alt="A customer reviews the service, date and time in the full DobroDesk widget before confirming a booking." width="372" height="692"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the messages go
&lt;/h2&gt;

&lt;p&gt;A booking request has more than a few chat messages. There is a customer, a conversation history and the result of the action. We keep that support data in the workspace's Durable Object, using SQLite.&lt;/p&gt;

&lt;p&gt;D1 holds shared account and routing information. R2 stores files, including email attachments. This keeps the conversation data together without putting large files in the same database.&lt;/p&gt;

&lt;p&gt;Some work continues after a message arrives. An email needs parsing, a reply needs sending and a failed delivery may need another attempt. We use Cloudflare Queues for those jobs. A customer can send a message while the service handles the next steps in the background.&lt;/p&gt;

&lt;p&gt;Retries need care too. Receiving a provider event twice should not create two conversations, and retrying a reply should not send it twice. Those are the kinds of cases we check when changing the flow.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI and the team share the conversation
&lt;/h2&gt;

&lt;p&gt;AI can prepare a reply for review or answer routine questions automatically when the workspace enables that mode. It uses the knowledge and rules the team has configured.&lt;/p&gt;

&lt;p&gt;Sensitive or uncertain requests go to a person. The booking action follows the same approach: it can complete the configured steps after confirmation, while a teammate handles the cases that need a decision.&lt;/p&gt;

&lt;p&gt;For the support team, the useful part is seeing the messages, customer details and action results together. They can continue the conversation from that point.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn6dumsvkp0y4qa9b02wa.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn6dumsvkp0y4qa9b02wa.jpg" alt="DobroDesk shows an AI draft, two sources and a required human review for a payment question." width="800" height="1051"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Updating the product while chats are open
&lt;/h2&gt;

&lt;p&gt;A customer may leave a chat open while we release an update. We keep versioned widget files and support the previous running version so an active conversation can continue. We also check restored sessions and conversation history during releases.&lt;/p&gt;

&lt;p&gt;The Mobile SDK brings native support screens to iOS and Android, with packages for Flutter, React Native, Capacitor and NativeScript. Version 0.2.0 is published. Teams can add support to their app and handle the incoming conversations in DobroDesk.&lt;/p&gt;

&lt;p&gt;We have also been improving conversation loading and switching in the inbox. We focus on everyday steps, such as opening a conversation and moving to the next one.&lt;/p&gt;

&lt;p&gt;You can try the &lt;a href="https://dobrodesk.com/demo" rel="noopener noreferrer"&gt;interactive demo&lt;/a&gt;. The &lt;a href="https://dobrodesk.com/developers" rel="noopener noreferrer"&gt;SDK guides&lt;/a&gt; cover installation and configuration when you are ready to add support to an app.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>webdev</category>
      <category>cloud</category>
    </item>
  </channel>
</rss>
