You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@@ -10,7 +10,7 @@ All notable changes to this project are documented here.
10
10
11
11
#### Delete Message
12
12
- WhatsApp-style delete confirmation modal with three options:
13
-
-**Delete for everyone** — calls Evolution API `DELETE /message/delete/`; only available when every selected message was sent by you (`fromMe`); works within ~60 hours of sending
13
+
-**Delete for everyone** — calls `DELETE /message/delete/`; only available when every selected message was sent by you (`fromMe`); works within ~60 hours of sending
14
14
-**Delete for me** — calls `DELETE /message/deleteMessage/` (best-effort); always removes the message from your local view regardless of API result
15
15
-**Cancel** — dismisses without action
16
16
- Available from the **right-click context menu** (single message) and the **select-mode toolbar** (multi-message batch delete)
@@ -26,11 +26,10 @@ All notable changes to this project are documented here.
26
26
### Bug Fixes
27
27
28
28
#### Security
29
-
-**XSS** — avatar `onerror` attribute no longer uses `innerHTML` with unescaped initials; switched to sibling-element show/hide pattern
30
-
-**XSS** — `quotedMsg.id` is now sanitised (`/[^a-zA-Z0-9_-]/g`) before being embedded in `onclick`
31
-
-**XSS** — image lightbox `onclick` now reads URL from `data-src` attribute instead of embedding the raw URL in the inline handler string
32
-
-**XSS** — group name, subject, and description now escaped with `chatEsc()` in all render paths
33
-
- Group description snippet in group manager now escaped
29
+
- XSS — avatar `onerror` attribute no longer uses `innerHTML` with unescaped initials; switched to sibling-element show/hide pattern
30
+
- XSS — `quotedMsg.id` is now sanitised (`/[^a-zA-Z0-9_-]/g`) before being embedded in `onclick`
31
+
- XSS — image lightbox `onclick` now reads URL from `data-src` attribute instead of embedding the raw URL in the inline handler string
32
+
- XSS — group name, subject, and description now escaped with `chatEsc()` in all render paths
34
33
35
34
#### Crashes / Runtime Errors
36
35
-`chatState.allFetchedMessages` was not initialised in the state object — accessing it before the first conversation opened threw `TypeError`
@@ -39,16 +38,16 @@ All notable changes to this project are documented here.
39
38
-`FileReader` base64 result was indexed with `[1]` without checking that a comma was present in the data URL
40
39
41
40
#### API
42
-
-`chatApiCall` was silently dropping the request body on `DELETE` calls — the Evolution API delete endpoints require a JSON body, so deletes were failing with 400/422 errors
41
+
-`chatApiCall` was silently dropping the request body on `DELETE` calls — the Evolution API delete endpoints require a JSON body, so deletes were failing
43
42
44
43
#### Lifecycle
45
-
- Delete modal was not dismissed when switching conversations — the wrong `remoteJid` (new conversation's JID) would be used if the user confirmed deletion after switching
44
+
- Delete modal was not dismissed when switching conversations — the wrong `remoteJid` (new conversation's JID) could be used if the user confirmed deletion after switching
46
45
- Delete modal was not dismissed when closing a conversation
47
46
-`chatCloseConversation` did not reset `selectMode`, `selectedMsgs`, or the toolbar visibility
48
47
-`chatConfirmDeleteForEveryone` and `chatConfirmDeleteForMe` now guard against `activeJid` being `null`
49
48
50
49
#### UI / State
51
-
- Select-mode toolbar delete button used a fragile `[onclick="..."]` CSS attribute selector to find itself; replaced with a stable `id`
50
+
- Select-mode toolbar delete button used a fragile `[onclick="..."]` CSS attribute selector; replaced with a stable `id`
52
51
- Delete button incorrectly started in an enabled state before `chatUpdateSelectCount` ran; now starts `disabled` in HTML
53
52
-`chatCopySelected` and `chatForwardSelected` used `Array.includes()` (O(n)) to filter selected messages; replaced with `Set.has()` (O(1))
54
53
- Quoted message text defaulted to `undefined` if `m.quotedMsg.text` was missing; now defaults to `''`
@@ -58,22 +57,124 @@ All notable changes to this project are documented here.
58
57
## [1.0.1] — 2026-04-07
59
58
60
59
### Bug Fixes
61
-
- Fixed scroll-up pagination to correctly load older messages from the API
62
-
- Ghost unread indicators no longer appear after marking chats as read
60
+
- Fixed scroll-up pagination to correctly load older messages from the API — scroll position now preserved when prepending older messages
61
+
- Ghost unread indicators on groups cleared optimistically before the API markRead call
62
+
- Fixed stale-JID race in `chatPollMessages`, `chatFetchOlderFromApi`, and `chatSendMediaMsg`
63
+
- Fixed double-send race with `_sending` lock and `finally`-block release
64
+
- Fixed `chatMarkRead` to use per-message `remoteJid` instead of the conversation JID
65
+
- Added `visibilitychange` listener for immediate refresh when the tab regains focus
63
66
64
67
---
65
68
66
69
## [1.0.0] — 2026-04-05
67
70
71
+
### New Features — Chat Inbox
72
+
Full WhatsApp-style chat inbox merged in from the `whatsapp-chat-feature` branch.
73
+
74
+
- Conversation list with avatar, name, last message preview, unread badge, and timestamp
75
+
- Real-time polling — new messages every 3 s, conversation list every 30 s
76
+
- Message bubbles for all types: text, image, video, audio, document, sticker, location, contact, poll, reactions
77
+
- Read receipts — double blue ticks via `MessageUpdate` status history array (SERVER_ACK → DELIVERY_ACK → READ → PLAYED)
78
+
- Reply — quote any message in your reply
79
+
- React — send emoji reactions
80
+
- Select mode — multi-select messages to copy or forward
81
+
- Drag-and-drop reordering of queued messages in Compose and Group Broadcast
82
+
- Persistent unread badges — survive page refresh via `localStorage`
83
+
- Group name resolution — `verifiedName` → `subject` → fallback; persisted to avoid re-fetching
84
+
85
+
---
86
+
87
+
## [0.1.3] — 2026-03-20
88
+
89
+
### New Features
90
+
-**Scheduled Sending** — schedule any Compose or Group Broadcast job to send at a future date/time
91
+
- New **Scheduled** sidebar tab with live pending-job badge
92
+
- Job cards show status, scheduled time, type, recipients, result, and a cancel button
93
+
- 30-second background poller executes jobs automatically while the tab is open
94
+
- API Response bar hidden on Scheduled and Profile Settings tabs (irrelevant there)
95
+
96
+
### Bug Fixes
97
+
- Removed stray `</div>` that was closing the scroll container prematurely
98
+
- Forced tab panel visibility with inline style to fix intermittent rendering glitch
99
+
- Fixed missing closing div before the response panel
100
+
- Reset scroll position to top when switching tabs
101
+
102
+
---
103
+
104
+
## [0.1.2] — 2026-03-15
105
+
106
+
### New Features
107
+
-**Group Broadcast Queue** — Groups › Browse & Send now uses the same multi-card message sequence builder as the Compose tab
108
+
- Groups can receive sequences of Text, Media, Voice, Poll, and Buttons messages in one broadcast
109
+
- Broadcast button shows live totals: "Broadcast 3 messages to 5 groups (15 sends)"
110
+
- Validation runs upfront before any sends begin
111
+
112
+
### Improvements
113
+
- Scheduled jobs: clicking a card body now toggles the details panel
114
+
- Scheduled jobs: uniform button widths
115
+
- Group list max-height increased to 60 vh
116
+
117
+
---
118
+
119
+
## [0.1.1] — 2026-03-10
120
+
121
+
### New Features
122
+
-**Message Queue Builder** in Compose tab — add multiple message cards of different types (Text, Media, Voice, Poll, Buttons) and send them as a sequence to all recipients
123
+
- Each card is independently configurable and removable
124
+
- Send button shows live totals and validates all cards before sending
125
+
- Default text card loaded on page open
126
+
127
+
### Improvements
128
+
- Accept numeric dial prefix in country code field (e.g. `972`, `44`) in addition to ISO codes
0 commit comments