iachat/app/javascript/dashboard/store/modules
Shivam Mishra 0f659224a7
feat: async update of article [CW-3721] (#10435)
### The problem

Writing in the text editor can be very frustrating, the reason is that
the editor had a debounced save method which would push the article to
the backend and update the current state. This however is a bad idea,
since the can take anywhere between 100-300ms depending on network
conditions.

While this would be in progress, the article is still being edited by
the user. So at the end of the network request, the state returned from
the backend and the current state in the editor is diverged. But since
the update happens anyway, the editor would prepend older context.

```
Time   --> 

User Action:      [Edit 1] ---> [Edit 2] ---> [Edit 3]
Backend Save:           Save Req (Edit 1) ----> Response (Edit 1)
Resulting Editor State: [Edit 3] + [Edit 1] (Outdated state prepended)
```

### The solution

The solution is to unbind the article from the backend state, ensuring
that the article editor is the source of truth and ignoring the
responses. This pull request does this by adding an asynchronous save
functionality. The changes include adding a new `saveArticleAsync` event
and ensuring that the local state is not updated unnecessarily during
asynchronous saves.

```
Time   --> 

User Action:      [Edit 1] ---> [Edit 2] ---> [Edit 3]
Backend Save:           Save Req (Edit 1) ----> Response (ignored)
Resulting Editor State: [Edit 3] (Consistent and up-to-date)
```

Added the following two debounced methods

These complementary debounce methods prevent unnecessary re-renders
while ensuring backend is in sync. `saveArticleAsync` preserves the
editor as the source of truth, while `saveArticle` manages periodic
state updates from the backend with a delay large enough to safely
assume that the user has stopped typing
Method | Delay | Behavior
-- | -- | -- 
`saveArticleAsync` | 400ms | Sends data to backend and ignores the
response
`saveArticle` | 2.5s | Sends data and updates local state with the
backend response

### How to test

1. Remove the following line
dc042f6ddc/app/javascript/dashboard/components-next/HelpCenter/Pages/ArticleEditorPage/ArticleEditor.vue (L64)
1. Update the latency here to 400 (P.S. the diff shows the latency to be
600, but that was added as a stop-gap solution)

dc042f6ddc/app/javascript/dashboard/components-next/HelpCenter/Pages/ArticleEditorPage/ArticleEditor.vue (L51)
1. Set the browser network latency to Slow 3G or 3G
1. Start writing on the editor, try fixing typos with backspace or
moving around with the cursor

---------

Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Co-authored-by: Pranav <pranav@chatwoot.com>
2024-11-21 19:38:08 -08:00
..
contacts fix: Fix Sentry issues from Vite migration (#10262) 2024-10-14 10:44:59 -07:00
conversations feat: Vite + vue 3 💚 (#10047) 2024-10-02 00:36:30 -07:00
helpCenterArticles feat: async update of article [CW-3721] (#10435) 2024-11-21 19:38:08 -08:00
helpCenterCategories feat(v4): Update the help center portal design (#10296) 2024-10-23 22:09:36 -07:00
helpCenterPortals feat(v4): Update the help center portal design (#10296) 2024-10-23 22:09:36 -07:00
notifications fix: Fix Sentry issues from Vite migration (#10262) 2024-10-14 10:44:59 -07:00
specs feat: Add dropdown component (#10358) 2024-11-18 17:29:27 -08:00
teams feat: Vite + vue 3 💚 (#10047) 2024-10-02 00:36:30 -07:00
accounts.js feat: Replace rtlMixin to a composable (#9924) 2024-08-12 15:50:21 +05:30
agentBots.js feat: Vite + vue 3 💚 (#10047) 2024-10-02 00:36:30 -07:00
agents.js fix: Update the relevant agent presence only (#5220) 2022-08-09 12:32:09 +05:30
attributes.js feat: Custom fields in pre-chat form (#4189) 2022-04-19 12:47:29 +05:30
auditlogs.js feat: audit logs UI (#6803) 2023-04-17 19:11:05 +05:30
auth.js feat: Add dropdown component (#10358) 2024-11-18 17:29:27 -08:00
automations.js feat: Update the design for automation (#10002) 2024-08-22 16:22:54 +05:30
bulkActions.js feat: Adds support for all snooze option in bulk actions (#9361) 2024-05-09 19:27:31 +05:30
campaigns.js feat(v4): Update the campaigns page design (#10371) 2024-10-31 11:57:13 +05:30
cannedResponse.js feat: Update the design for canned responses (#9903) 2024-08-07 09:43:47 -07:00
contactConversations.js feat: Vite + vue 3 💚 (#10047) 2024-10-02 00:36:30 -07:00
contactLabels.js feat: Vite + vue 3 💚 (#10047) 2024-10-02 00:36:30 -07:00
contactNotes.js feat: Vite + vue 3 💚 (#10047) 2024-10-02 00:36:30 -07:00
conversationLabels.js feat: Vite + vue 3 💚 (#10047) 2024-10-02 00:36:30 -07:00
conversationMetadata.js feat: Vite + vue 3 💚 (#10047) 2024-10-02 00:36:30 -07:00
conversationPage.js feat: Vite + vue 3 💚 (#10047) 2024-10-02 00:36:30 -07:00
conversationSearch.js fix: Search improvements and bug fixes [CW-1604] (#6985) 2023-04-27 13:20:29 +05:30
conversationStats.js feat: Vite + vue 3 💚 (#10047) 2024-10-02 00:36:30 -07:00
conversationTypingStatus.js feat: Vite + vue 3 💚 (#10047) 2024-10-02 00:36:30 -07:00
conversationWatchers.js feat: Vite + vue 3 💚 (#10047) 2024-10-02 00:36:30 -07:00
csat.js feat: more CSAT filters (#7038) 2023-05-18 22:50:46 +05:30
customRole.js chore: Custom Roles to manage permissions [ UI ] (#9865) 2024-09-17 11:40:11 -07:00
customViews.js feat: Add new sidebar for Chatwoot V4 (#10291) 2024-10-23 18:32:37 -07:00
dashboardApps.js feat: Add the ability to create dashboard apps from the UI (#4924) 2022-07-08 15:55:32 +07:00
draftMessages.js feat: Vite + vue 3 💚 (#10047) 2024-10-02 00:36:30 -07:00
inboxAssignableAgents.js feat: Vite + vue 3 💚 (#10047) 2024-10-02 00:36:30 -07:00
inboxes.js feat(v4): Update the campaigns page design (#10371) 2024-10-31 11:57:13 +05:30
inboxMembers.js Chore: Inbox Members API improvements (#3008) 2021-09-14 11:55:02 +05:30
integrations.js feat: Vite + vue 3 💚 (#10047) 2024-10-02 00:36:30 -07:00
labels.js feat: multiple UX improvements to labels (#7358) 2023-06-25 18:49:49 +05:30
macros.js feat: Add API module and Vuex store for Macros (#5603) 2022-10-11 22:54:17 -07:00
reports.js feat: Add the bot performance reports UI (#9036) 2024-03-14 23:04:14 -07:00
sla.js feat: add option to delete and disable edits for SLA (#9108) 2024-03-15 12:21:32 +05:30
SLAReports.js feat: Download SLA reports (#9201) 2024-04-08 20:51:34 -07:00
teamMembers.js feat: Vite + vue 3 💚 (#10047) 2024-10-02 00:36:30 -07:00
userNotificationSettings.js feat: Vite + vue 3 💚 (#10047) 2024-10-02 00:36:30 -07:00
webhooks.js feat: Add event subscription option to webhooks (#4540) 2022-04-25 17:44:42 +05:30