tickki_chat_flutter 0.2.1
tickki_chat_flutter: ^0.2.1 copied to clipboard
Tickki Chat SDK for Flutter — embed live agent chat into your app with a drop-in widget or headless primitives.
0.2.1 #
-
Drop-in widget topbar redesign. Replaces the plain "Chat with us" AppBar with a standard chat-product header:
- Business logo (from
branding.logo_url) or a generated initial avatar on the left. - Business name as the title.
- Online / offline indicator with a green-dot status pip directly below the name (was a separate strip before).
- Round translucent close (×) button on the right.
- Colour comes from
branding.primary_colorso it stays on-brand.
All behaviour preserved — same SafeArea, same close-on-pop, same pre-chat / loading / error states. The
strings.titleoverride still applies when no business name is available. - Business logo (from
0.2.0 #
-
Analytics surface added. SDK consumers can now track screens, taps, and custom events that flow into the same Visitor Intelligence pipeline the JS widget feeds — so intent scoring, AI summaries, and the agent dashboard's "what is this visitor doing right now" picture light up for mobile traffic too.
Three integration tiers, escalating from least to most explicit:
-
Auto screen tracking — one line on
MaterialApp:navigatorObservers: [ TickkiAnalyticsNavigatorObserver(analytics: tickki.analytics), ],Every push / replace fires a
screen_viewevent with the route name. Give routes names (RouteSettings(name: 'CheckoutScreen')) for readable analytics labels. -
Ambient tap capture + opt-in named taps — wrap once at the root:
TickkiAnalyticsScope(analytics: tickki.analytics, child: MyApp())Captures every tap as a coordinate-tagged
tapevent without per- widget code. For richer events on specific buttons, wrap the child withTickkiTrackable(name: 'add_to_cart_btn', label: 'Add to cart', child: ...). Wrap sensitive subtrees (password forms, payment fields) inTickkiIgnore(child: ...)to opt out of ambient capture. -
Manual — full control:
tickki.analytics.setVisitorId('user_8432'); tickki.analytics.track('add_to_cart', properties: {'sku': 'abc'}); tickki.analytics.trackScreen('CheckoutScreen'); tickki.analytics.trackTap(label: 'Buy now', key: 'buy_btn');
Events are buffered in-memory and flushed every 5 seconds (or sooner when the buffer hits 20 events). A network failure re-queues the batch at the head of the buffer so a brief outage doesn't drop events.
-
-
Setup requirement: call
tickki.analytics.setVisitorId('...')before tracking. Events without a visitor id are silently dropped — we won't infer an anonymous id, because the consumer's own user-id story is the right source of truth. -
What we deliberately do NOT track: text input values (privacy poison, near-zero analytic value), scroll position (low signal on mobile), long-press / drag gestures (skipped in this release; let us know if you need them).
-
No breaking changes to the existing chat surface — the analytics additions are net-new. Existing
TickkiChat/ChatSession/TickkiChatWidgetcalls behave identically.
0.1.4 #
-
Realtime now actually works. The previous releases shipped a
pusher_channels_flutter-based client, but that package's native iOS / Android SDKs construct the WebSocket URL from aclustername and don't expose ahostoverride — so the SDK was connecting to Pusher Cloud (ws-mt1.pusher.com) instead of your Tickki Reverb host. Net effect: agent replies only appeared after the visitor closed and re-opened the chat (REST history fetch).Replaced with a small hand-rolled Pusher-protocol client over
web_socket_channel. Connects directly to the Reverb host thatGET /chat/configreturns, signs the private channel throughPOST /chat/broadcasting/auth, and emitsMessageCreatedpayloads onChatSession.messagesas they arrive. Includes auto-reconnect with exponential backoff capped at 30s. -
Drops the
pusher_channels_flutterdependency, replaces it withweb_socket_channel ^3.0.1(Flutter SDK-shipped dependency).
0.1.3 #
-
Fix drop-in widget stuck on loading spinner after a session-scoped request failed. When
startSessionsucceeded but a subsequentloadHistory/realtime call threw, the widget's catch path set_errorbut never cleared_loading, and the build method short-circuited on the loading state before reading_error. The net effect was an infinite spinner instead of the diagnosable error screen. Now the catch path resets_loading, the error guard no longer requires_session == null, and the bootstrap entry-point wipes prior state so the "Try again" button gets a clean slate.This downstream-bug surfaced after a backend issue where
resolveSession()queried the wrong column onchat_sdk_sessionsand returned 401 for SDK-issued tokens. The backend is fixed separately; this SDK change ensures any future server-side failure shows a real error rather than an unrecoverable spinner.
0.1.2 #
- Fix endless loading: cap the bundle-id auto-detect at 2 seconds.
When
TickkiChat()was constructed beforeWidgetsFlutterBinding.ensureInitialized()ran (e.g. as a top-levelfinaloutsidemain()),PackageInfo.fromPlatform()could hang indefinitely on the platform channel and the first REST call would block waiting for it. We now time out the lookup and fall back to a null bundle id — if the request then fails the key allow-list, the consumer gets a fast, diagnosableorigin_not_allowederror instead of an infinite spinner.
0.1.1 #
- Auto-detect the host app's bundle id via
package_info_plusand send it asX-Tickki-Bundle-Idon every request. Consumers no longer need to passbundleId:manually when their publishable key has an allow-list — the SDK reads the AndroidapplicationId/ iOSCFBundleIdentifierat runtime. PassingbundleId:explicitly still works as an override (useful for tests or when you want to forge a specific identifier). - Fixes a confusing "origin_not_allowed" failure first-time integrators
hit when they followed the docs literally — the example app didn't
pass
bundleId:so the header was never sent and the allow-list rejected the request.
0.1.0 #
- Initial release.
- Headless surface:
TickkiChatclient with session lifecycle, message send/list, typing/heartbeat, attachment upload, and a private-channel realtime subscription. - Drop-in widget:
TickkiChatWidget.show(context, ...)opens a complete branded chat screen, fetching colors and feature flags from/api/v1/chat/config. - Strings are overridable for i18n; colors are dashboard-controlled.