package com.bitchat.android.ui import androidx.lifecycle.LiveData import androidx.lifecycle.MediatorLiveData import androidx.lifecycle.MutableLiveData import com.bitchat.android.model.BitchatMessage /** * Centralized state definitions and data classes for the chat system */ // Command suggestion data class data class CommandSuggestion( val command: String, val aliases: List = emptyList(), val syntax: String? = null, val description: String ) /** * Contains all the observable state for the chat system */ class ChatState { // Core messages and peer state private val _messages = MutableLiveData>(emptyList()) val messages: LiveData> = _messages private val _connectedPeers = MutableLiveData>(emptyList()) val connectedPeers: LiveData> = _connectedPeers private val _nickname = MutableLiveData() val nickname: LiveData = _nickname private val _isConnected = MutableLiveData(false) val isConnected: LiveData = _isConnected // Private chats private val _privateChats = MutableLiveData>>(emptyMap()) val privateChats: LiveData>> = _privateChats private val _selectedPrivateChatPeer = MutableLiveData(null) val selectedPrivateChatPeer: LiveData = _selectedPrivateChatPeer private val _unreadPrivateMessages = MutableLiveData>(emptySet()) val unreadPrivateMessages: LiveData> = _unreadPrivateMessages // Channels private val _joinedChannels = MutableLiveData>(emptySet()) val joinedChannels: LiveData> = _joinedChannels private val _currentChannel = MutableLiveData(null) val currentChannel: LiveData = _currentChannel private val _channelMessages = MutableLiveData>>(emptyMap()) val channelMessages: LiveData>> = _channelMessages private val _unreadChannelMessages = MutableLiveData>(emptyMap()) val unreadChannelMessages: LiveData> = _unreadChannelMessages private val _passwordProtectedChannels = MutableLiveData>(emptySet()) val passwordProtectedChannels: LiveData> = _passwordProtectedChannels private val _showPasswordPrompt = MutableLiveData(false) val showPasswordPrompt: LiveData = _showPasswordPrompt private val _passwordPromptChannel = MutableLiveData(null) val passwordPromptChannel: LiveData = _passwordPromptChannel // Sidebar state private val _showSidebar = MutableLiveData(false) val showSidebar: LiveData = _showSidebar // Command autocomplete private val _showCommandSuggestions = MutableLiveData(false) val showCommandSuggestions: LiveData = _showCommandSuggestions private val _commandSuggestions = MutableLiveData>(emptyList()) val commandSuggestions: LiveData> = _commandSuggestions // Unread state computed properties val hasUnreadChannels: MediatorLiveData = MediatorLiveData() val hasUnreadPrivateMessages: MediatorLiveData = MediatorLiveData() init { // Initialize unread state mediators hasUnreadChannels.addSource(_unreadChannelMessages) { unreadMap -> hasUnreadChannels.value = unreadMap.values.any { it > 0 } } hasUnreadPrivateMessages.addSource(_unreadPrivateMessages) { unreadSet -> hasUnreadPrivateMessages.value = unreadSet.isNotEmpty() } } // Getters for internal state access fun getMessagesValue() = _messages.value ?: emptyList() fun getConnectedPeersValue() = _connectedPeers.value ?: emptyList() fun getNicknameValue() = _nickname.value fun getPrivateChatsValue() = _privateChats.value ?: emptyMap() fun getSelectedPrivateChatPeerValue() = _selectedPrivateChatPeer.value fun getUnreadPrivateMessagesValue() = _unreadPrivateMessages.value ?: emptySet() fun getJoinedChannelsValue() = _joinedChannels.value ?: emptySet() fun getCurrentChannelValue() = _currentChannel.value fun getChannelMessagesValue() = _channelMessages.value ?: emptyMap() fun getUnreadChannelMessagesValue() = _unreadChannelMessages.value ?: emptyMap() fun getPasswordProtectedChannelsValue() = _passwordProtectedChannels.value ?: emptySet() fun getShowPasswordPromptValue() = _showPasswordPrompt.value ?: false fun getPasswordPromptChannelValue() = _passwordPromptChannel.value fun getShowSidebarValue() = _showSidebar.value ?: false fun getShowCommandSuggestionsValue() = _showCommandSuggestions.value ?: false fun getCommandSuggestionsValue() = _commandSuggestions.value ?: emptyList() // Setters for state updates fun setMessages(messages: List) { _messages.value = messages } fun setConnectedPeers(peers: List) { _connectedPeers.value = peers } fun setNickname(nickname: String) { _nickname.value = nickname } fun setIsConnected(connected: Boolean) { _isConnected.value = connected } fun setPrivateChats(chats: Map>) { _privateChats.value = chats } fun setSelectedPrivateChatPeer(peerID: String?) { _selectedPrivateChatPeer.value = peerID } fun setUnreadPrivateMessages(unread: Set) { _unreadPrivateMessages.value = unread } fun setJoinedChannels(channels: Set) { _joinedChannels.value = channels } fun setCurrentChannel(channel: String?) { _currentChannel.value = channel } fun setChannelMessages(messages: Map>) { _channelMessages.value = messages } fun setUnreadChannelMessages(unread: Map) { _unreadChannelMessages.value = unread } fun setPasswordProtectedChannels(channels: Set) { _passwordProtectedChannels.value = channels } fun setShowPasswordPrompt(show: Boolean) { _showPasswordPrompt.value = show } fun setPasswordPromptChannel(channel: String?) { _passwordPromptChannel.value = channel } fun setShowSidebar(show: Boolean) { _showSidebar.value = show } fun setShowCommandSuggestions(show: Boolean) { _showCommandSuggestions.value = show } fun setCommandSuggestions(suggestions: List) { _commandSuggestions.value = suggestions } }