iachat/app/javascript/dashboard/components/widgets
Gabriel Jablonski 11e9932e9b
feat(whatsapp): show contact typing and recording indicators via baileys presence (#264)
* feat(whatsapp): show contact typing and recording indicators via baileys presence

Subscribe to WhatsApp presence updates via the baileys-api provider to
display real-time typing and recording indicators in the dashboard.

- Handle presence.update webhook events (composing, recording, paused,
  available) and broadcast via ActionCable
- Add conversation.recording event to ActionCable, webhook, and channel
  listeners for parity with typing_on/typing_off
- Show "typing..." / "recording..." in green text on the chat list,
  replacing the message preview
- Show "X is typing" / "X is recording audio" in the conversation view
- Add presence_subscribe provider config option (default off) to gate
  all subscription calls to the baileys-api
- Subscribe to presence on conversation open and periodically (1 min)
  for the top 10 chat list conversations
- Consolidate contact LID from presence.update jidAlt payload
- Prevent echo-back of contact typing events to the channel

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: address review feedback

- Filter chat list typing indicator to contact-only events
- Add dedupe to presence subscribe bulk calls
- Use strong parameters for conversation_ids
- Remove redundant YAML quotes in swagger webhook enum

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: address review feedback

- Extract phone from data[:id] when JID is @s.whatsapp.net (fallback
  when jidAlt is absent)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: address review feedback

- Filter recording users in getTypingUsersText to show correct names
- Add 10s timeout to presence_subscribe HTTP request

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: scope typing timer per user instead of per conversation

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: make presence subscribe best-effort with rescue per channel

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: address review feedback

- Add messagePreviewClass to typing preview for consistent padding
- Fix specs to use WebMock assertions instead of instance spying

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 11:38:11 -03:00
..
conversation feat(whatsapp): show contact typing and recording indicators via baileys presence (#264) 2026-04-13 11:38:11 -03:00
DashboardApp feat: dashboard apps on sidebar (#146) 2025-11-19 14:44:18 -03:00
FilterInput chore: Remove vue-multiselect and migrate to next components (#13506) 2026-02-17 16:40:12 +05:30
forms feat(V5): Update settings pages UI (#13396) 2026-02-19 15:04:40 +05:30
mentions chore: Replace plain editor with advanced editor (#13071) 2026-01-08 15:17:54 +05:30
modal fix: Inbox delete confirmation fails due to whitespace (#12498) 2025-09-23 22:20:43 +05:30
WootWriter feat(internal-chat): implement internal chat system for agents (#247) 2026-04-11 13:50:15 -03:00
AILoader.vue chore: Remove older UI (#11720) 2025-07-01 09:43:44 +05:30
AttachmentsPreview.vue feat: new Captain Editor (#13235) 2026-01-21 13:39:07 +05:30
AutomationActionInput.vue Merge branch 'main' into chore/merge-upstream-4.11.0 2026-02-17 23:05:26 -03:00
AutomationActionScheduledMessageInput.vue fix: update default delay for scheduled messages in automation (#209) 2026-02-04 18:23:25 -03:00
AutomationActionTeamMessageInput.vue chore: Remove vue-multiselect and migrate to next components (#13506) 2026-02-17 16:40:12 +05:30
AutomationFileInput.vue Merge branch 'main' into chore/merge-upstream-4.11.0 2026-02-17 23:05:26 -03:00
BackButton.vue chore: Update buttons in integrations page (#11120) 2025-03-20 21:15:47 +05:30
ChannelItem.vue feat: TikTok channel (#12741) 2025-12-17 07:54:50 -08:00
ChatTypeTabs.vue chore: Update theme colors and add new Inter variable fonts (#13347) 2026-01-28 14:36:04 -08:00
ColorPicker.vue chore: Remove older UI (#11720) 2025-07-01 09:43:44 +05:30
EmptyState.vue chore: Remove older UI (#11720) 2025-07-01 09:43:44 +05:30
FeatureToggle.vue style: apply fixes for eslint issues [cw-3590] (#10210) 2024-10-03 15:02:12 +05:30
FloatingCallWidget.vue feat: Voice Channel (#11602) 2025-12-19 12:41:33 -08:00
InboxName.vue Merge branch 'main' into chore/merge-upstream-4.12.0 2026-03-19 23:24:55 -03:00
LoadingState.vue feat(V5): Update settings pages UI (#13396) 2026-02-19 15:04:40 +05:30
SettingIntroBanner.vue feat(V5): Update settings pages UI (#13396) 2026-02-19 15:04:40 +05:30
ShowMore.vue feat(ee): Review Notes for CSAT Reports (#13289) 2026-01-15 19:53:57 -08:00
TableFooter.vue style: apply fixes for eslint issues [cw-3590] (#10210) 2024-10-03 15:02:12 +05:30
TableFooterPagination.vue chore: Update buttons in dashboard (#11145) 2025-03-31 17:21:32 -07:00
TableFooterResults.vue chore: Remove older UI (#11720) 2025-07-01 09:43:44 +05:30
TableHeaderCell.vue feat: Update design for report pages (#10506) 2024-11-27 18:10:15 +08:00
ThumbnailGroup.vue chore: Replace Thumbnail with Avatar (#12119) 2025-08-11 15:47:17 +05:30
UserAvatarWithName.vue chore: Replace Thumbnail with Avatar (#12119) 2025-08-11 15:47:17 +05:30
VideoCallButton.vue chore: Update reply editor design (#10575) 2025-01-08 17:49:53 +05:30