ebchat 5.2.0
ebchat: ^5.2.0 copied to clipboard
Embeddable ebchat chat SDK for Flutter apps. Drop-in chat screen and widgets on the first-party livechat protocol, with host-owned push ("notification outsourcing"), botflow forms and multi-company support.
Changelog #
5.2.0 #
- Voice notes: composer recording with pause/resume and a live amplitude
waveform (
onRecordStart/Stop/Cancel/Pause/Resume,onRecordAmplitude); finished clips land in the new attachment tray for playback and review before anything is uploaded or sent. - Attachment tray: picked files and recordings queue above the composer
(
EbchatAttachmentTray), each removable, voice notes playable in place. Items show in-place upload progress (a spinner, not a vanishing act) and a per-item "Not sent — tap to retry" failed state with the bytes kept — a voice note cannot be re-made. Oversized files are rejected at pick time against the company'smaxAttachmentBytes. - Multi-select attach: new
onPickAttachments(preferred) andonPickAttachmentcomposer hooks — the screen uploads and sends what the picker returns, same path as form answers;onAttachremains as the manual full-control override. The paperclip and mic respect the company's attachments / voice-notes feature toggles from bootstrap. - Inline audio player: real
just_audioplayback with a seekable waveform on every platform — mobile previously had no voice-note playback at all. - Delivery ticks: pending / sent / delivered / read on guest messages,
driven by
ebchat_core 1.1.0'sdeliveryStatus. - Realtime reconnect: a dead socket flips to fast polling while reconnect
attempts back off exponentially, with a built-in "Reconnecting…" banner and
a 30 s safety poll even while connected. The controller's new
connectionStatestream (connected / reconnecting / pollingOnly) is surfaced for host UIs. - Failed-send retry: a send that fails keeps its bubble, marked
"Not sent — tap to retry" (
LivechatDeliveryStatus.failed); tapping the bubble re-sends with the same clientId, so duplicates are impossible. A conversation closed under the guest mid-send carries the unsent text into the reopened conversation as a composer draft instead. - Silent token refresh:
EbChatwires the controller'sonAuthExpired(via the newrealtimeFactory) to re-mint the session on 24 h token expiry; identified users re-send their identity + HMAC so expiry never demotes them to an anonymous guest.uploadAssetalso retries once after a refresh. - App-lifecycle resync: on resume the screen refetches what arrived in the background and revives the socket (iOS freezes sockets); on pause it clears the guest's typing state.
EbChatBackground.handleMessage: background-isolate push handling — re-sessions from the persisted guest id, fetches the pushed conversation's newest messages, and returns{push, latestMessage, unreadCount}for the host's local notification. Needs a persistentSessionStore.- Transcript rewrite: reversed index-based list (
scrollable_positioned_list) with history pagination, scroll-position preservation, a jump-to-bottom button with a new-message dot, message grouping, and quote-jump highlighting. No more forced scroll-to-bottom on every update. - Quote-jump history paging: tapping a quote whose original is older than the loaded window pages history in (bounded) before jumping; a truly missing original says "Original message unavailable" instead of doing nothing.
- Long-press message actions: copy and reply from a bottom sheet — the discoverable path next to swipe-to-reply (which gained a haptic tick at the arm threshold).
- Tappable file & video chips: received files and videos open externally
via
url_launcheron mobile — they were dead, untappable chips before. - Order receipts resolve product names: retailer SKUs seen in the catalog or cart this session render by name in order bubbles instead of raw ids.
- Image decode caps: transcript images decode at display resolution
(
cacheWidthat device DPR) and are height-capped, so a 12 MP photo no longer costs full-size memory per bubble. - Multiline composer: mobile return inserts a newline (the send button sends, WhatsApp-style); hardware-keyboard surfaces keep enter-to-send. The keyboard stays up after sending.
- Footer-hint steering: while a direct-node form waits on the composer, the hint tells the guest what the flow expects ("Share your location or type the address…", "Attach a photo, or type your answer…").
- Catalog & cart error states: a failed catalog load shows retry instead of masquerading as an empty shop; a failed cart submit keeps the cart open with a snackbar; the catalog browser gained an in-sheet cart button + running total bar so add-to-cart has visible feedback while the sheet is up.
- Fullscreen image viewer: pinch/double-tap zoom, swipe down to dismiss.
- Wallpaper: the chat renders on the ebchat brand wallpaper
(
EbchatAssets.wallpaper— deliberately fixed, not themeable; the chat is a light surface even under dark host themes). - Accessibility sweep: semantic labels for tick states and the cart count, 44 px hit targets on small controls (tray remove), dynamic-type-aware tray sizing, screen-reader announcement when recording starts, and read receipts only fire when the transcript is actually visible (foregrounded, at bottom).
- Typing indicators auto-expire after 6 s without a stop signal, and a peer message arriving clears them — no ghost operators.
- Theme: new
metaText,waveformInactive,divider,tickRead, directional bubble radii and incoming-bubble shadow tokens. EbchatStrings: new recording/pause, connectivity ("Reconnecting…"), retry/copy, and form-hint strings — all English-defaulted, so existing custom strings objects keep compiling. Newrtlfield: layout direction now follows the field, not object identity with.ar, so customized Arabic strings render right-to-left.- Image form answers now send
image_url(they rendered as file chips before). - Internal operator notes are never rendered, as defense in depth behind the gateway-side filter.
- Dependencies: added
scrollable_positioned_list,just_audio,url_launcher; removedintl(dates/weekdays are formatted in-package). - README: platform permission setup (iOS usage descriptions, Android
RECORD_AUDIO), voice-note/attachment wiring, connectivity & polling-mode matrix, session persistence, and background push.
5.1.0 #
-
The SDK is two packages, not four.
ebchat_uiis folded into this package andebchat_realtimeintoebchat_core; neither was ever consumed on its own outside this repo, and four pub.dev names meant four versions to keep in lockstep.package:ebchat/ebchat.dartexports everything the widgets did, so nothing changes for a host. -
The declared Flutter floor is now
>=3.35.0, which is what the widgets actually required all along (Image.network'swebHtmlElementStrategy); the previous>=3.24.0was resolvable but wrong. -
Botflow form questions now work on mobile.
EbChatScreenanswers them itself: text questions focus the composer, and photo/file/location questions upload and send through the newonPickFile/onResolveLocationhooks. PreviouslyonFormwas unwired on mobile, so tapping a form question did nothing at all. -
New
EbChatFormKind/EbChatFormRequest/EbChatPickedFile, andEbChat.uploadAssetfor hosts sending attachments themselves. -
Both hooks are optional: media questions fall back to
onAttach, location to typing an address. Unknown question types classify as text rather than dead-ending, so a new botflow QuestionType stays answerable. -
onFormstill overrides everything, for hosts that want full control.
5.0.0 #
- Clean rewrite on the first-party livechat protocol. No API compatibility with the deprecated GetStream-based 3.x/4.x.
EbChat.init(bootstrap + guest/identified session, resume viaSessionStore),EbChatScreen(drop-in chat with auto-reopen on close),EbChatUser(guest / identified + HMAC),EbChatPush.parse(host-owned FCM data payload).- Realtime via
ebchat_realtimewhen the gateway advertises it; polling fallback otherwise.