Skip to content

Commit 14aa37d

Browse files
committed
feat: add ChatAction sealed interface with CompositionLocal
Threading action lambdas through MessageList -> ContentBubble -> CashBubble (and deeper as more bubble types gain interactions) is verbose. A CompositionLocal matches the project established pattern (LocalVibrator, LocalExchange, LocalCodeNavigator, etc.) and avoids lambda-threading entirely. Introduce ChatAction, ChatActionHandler, and LocalChatActionHandler in the shared chat-ui module. MessageList accepts onAction and provides it via CompositionLocalProvider so nested composables consume it from the local. Cash bubbles are now clickable, dispatching ViewToken to navigate to the token info screen. Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
1 parent 832f09e commit 14aa37d

5 files changed

Lines changed: 268 additions & 225 deletions

File tree

apps/flipcash/features/messenger/src/main/kotlin/com/flipcash/app/messenger/internal/ChatViewModel.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import com.getcode.opencode.model.financial.Fiat
4242
import com.getcode.opencode.model.financial.Limits
4343
import com.getcode.opencode.model.financial.SendLimit
4444
import com.getcode.opencode.model.financial.Token
45+
import com.getcode.solana.keys.Mint
4546
import com.getcode.solana.keys.PublicKey
4647
import com.getcode.util.resources.ResourceHelper
4748
import com.getcode.utils.trace

apps/flipcash/features/messenger/src/main/kotlin/com/flipcash/app/messenger/internal/screens/MessengerScreen.kt

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,11 @@ import androidx.compose.ui.unit.dp
4343
import androidx.lifecycle.compose.collectAsStateWithLifecycle
4444
import androidx.paging.compose.collectAsLazyPagingItems
4545
import com.flipcash.app.contacts.ui.ContactAvatar
46+
import com.flipcash.app.core.AppRoute
4647
import com.flipcash.app.core.contacts.DeviceContact
4748
import com.flipcash.app.messenger.internal.ChatViewModel
4849
import com.flipcash.app.messenger.internal.screens.components.MessageList
50+
import com.flipcash.shared.chat.ui.ChatAction
4951
import com.flipcash.features.messenger.R
5052
import com.getcode.navigation.core.CodeNavigator
5153
import com.getcode.navigation.core.LocalCodeNavigator
@@ -99,19 +101,30 @@ internal fun MessengerScreen(viewModel: ChatViewModel) {
99101
messages = messages,
100102
separatorConfig = state.separatorConfig,
101103
otherReadPointer = otherReadPointer,
102-
onAdvanceReadPointer = { messageId ->
103-
viewModel.dispatchEvent(ChatViewModel.Event.AdvanceReadPointer(messageId))
104-
},
105-
onRetryMessage = { bubble ->
106-
keyboard.hideIfVisible {
107-
viewModel.dispatchEvent(
108-
ChatViewModel.Event.RetryMessage(bubble.pendingClientIdHex, bubble.content)
109-
)
104+
onAction = { action ->
105+
when (action) {
106+
is ChatAction.AdvanceReadPointer -> {
107+
viewModel.dispatchEvent(ChatViewModel.Event.AdvanceReadPointer(action.messageId))
108+
}
109+
ChatAction.RefreshContact -> {
110+
viewModel.dispatchEvent(ChatViewModel.Event.RefreshContact)
111+
}
112+
is ChatAction.RetryMessage -> {
113+
keyboard.hideIfVisible {
114+
viewModel.dispatchEvent(
115+
ChatViewModel.Event.RetryMessage(action.bubble.pendingClientIdHex, action.bubble.content)
116+
)
117+
}
118+
}
119+
is ChatAction.ViewToken -> {
120+
keyboard.hideIfVisible {
121+
viewModel.dispatchEvent(
122+
ChatViewModel.Event.OpenScreen(AppRoute.Token.Info(action.mint))
123+
)
124+
}
125+
}
110126
}
111127
},
112-
onRefreshContact = {
113-
viewModel.dispatchEvent(ChatViewModel.Event.RefreshContact)
114-
},
115128
)
116129
}
117130
}

0 commit comments

Comments
 (0)