Events
the kindly sdk provides a unified event system that allows you to subscribe to all sdk events and state changes in real time this matches the web api pattern and provides a comprehensive way to monitor sdk behavior event types the sdk emits the following event types kindly\ load settings and configuration loaded kindly\ message new messages (sent/received) kindly\ buttonclick button interactions kindly\ ui ui actions (open, close, end chat, etc ) kindly\ globalicon global icon events (defined but not currently implemented in mobile sdks) kindly\ state state changes (connection, display status) basic usage subscribe to all events import combine import kindly class myeventhandler { private var cancellables = set\<anycancellable>() func setupeventlistening() { kindlysdk events sink { event in print("event \\(event type rawvalue)") print("timestamp \\(event timestamp)") switch event detail { case load(let settings) print("settings loaded \\(settings name)") case message(let newmessage, let chatlog) print("new message \\(newmessage text ?? "no text")") case buttonclick(let button, let buttontype, , ) print("button clicked \\(button label)") case ui(let action) print("ui action \\(action type rawvalue)") case state(let state) print("state changed connected \\(state isconnected)") case globalicon // note globalicon events are not currently implemented in mobile sdks break } } store(in \&cancellables) } } subscribe to state changes only kindlysdk state sink { state in print("chat displayed \\(state ischatdisplayed)") print("sdk started \\(state isstarted)") print("socket connected \\(state issocketconnected)") print("fully connected \\(state isconnected)") print("connection state \\(state connectionstate)") } store(in \&cancellables) event details load event emitted when sdk settings are loaded from the server kindlysdk events filter { $0 type == load } sink { event in if case load(let settings) = event detail { print("bot \\(settings name) (id \\(settings id))") print("languages \\(settings languages map { $0 code })") print("theme \\(settings style background != nil ? "custom" "default")") } } store(in \&cancellables) message event emitted for both incoming and outgoing messages kindlysdk events filter { $0 type == message } sink { event in if case message(let newmessage, let chatlog) = event detail { print("message from \\(newmessage from) \\(newmessage text ?? "")") print("chat has \\(chatlog count) total messages") } } store(in \&cancellables) button click event emitted when users interact with chat buttons kindlysdk events filter { $0 type == buttonclick } sink { event in if case buttonclick(let button, let buttontype, let chatlog, let lastmessage) = event detail { print("button \\(button label)") print("type \\(buttontype)") print("value \\(button value ?? "")") } } store(in \&cancellables) ui events emitted for user interface actions like opening/closing chat, language changes, etc kindlysdk events filter { $0 type == ui } sink { event in if case ui(let action) = event detail { switch action type { case openchatbubble print("chat opened") case closechatbubble print("chat closed") case endchat print("chat ended") case restartchat print("chat restarted") case changelanguage print("language changed to \\(action languagecode ?? "")") case downloadchat print("chat downloaded") case deletechat print("chat deleted") case showfeedback print("feedback form shown") case submitfeedback print("feedback submitted") case dismissfeedback print("feedback dismissed") } } } store(in \&cancellables) state events emitted when sdk connection or display state changes kindlysdk state sink { state in if state isconnected { print("â
sdk is fully connected and ready!") } else if state isstarted && !state issocketconnected { print("â ī¸ sdk started but socket disconnected") } else if !state isstarted { print("âŗ sdk not started yet") } } store(in \&cancellables) advanced usage track chat display changes kindlysdk state map { $0 ischatdisplayed } removeduplicates() // only emit when value changes sink { isdisplayed in if isdisplayed { print("đą chat interface is now visible") } else { print("đ chat interface is now hidden") } } store(in \&cancellables) monitor connection health kindlysdk state map { state in (state isstarted, state issocketconnected, state isconnected) } removeduplicates { $0 == $1 } sink { isstarted, issocketconnected, isconnected in switch (isstarted, issocketconnected, isconnected) { case (true, true, true) print("đĸ fully connected") case (true, false, false) print("đĄ started but disconnected") case (false, , ) print("đ´ not started") default print("đĄ partial connection") } } store(in \&cancellables) filter multiple event types kindlysdk events filter { event in \[ message, buttonclick, ui] contains(event type) } sink { event in print("user interaction event \\(event type rawvalue)") } store(in \&cancellables) event data models kindlyevent struct kindlyevent { let type kindlyeventtype let timestamp timeinterval let detail kindlyeventdetail } kindlyeventstate struct kindlyeventstate { let ischatdisplayed bool let isstarted bool let issocketconnected bool let isconnected bool let connectionstate string } for more detailed information about event data structures, see the sdk source code documentation memory management always store your combine cancellables to prevent memory leaks private var cancellables = set\<anycancellable>() // in deinit or when done cancellables removeall()