Display active conversation

This commit is contained in:
Adam Gastineau 2025-09-22 19:43:45 -07:00
parent a7053f4944
commit 337749558f
7 changed files with 55 additions and 21 deletions

View File

@ -34,7 +34,7 @@ import com.open.pin.ui.utils.PinDimensions
import com.open.pin.ui.utils.modifiers.ProvideSnapCoordinator
import com.open.pin.ui.utils.modifiers.SnapCoordinator
import com.penumbraos.mabl.aipincore.view.TouchInterceptor
import com.penumbraos.mabl.aipincore.view.model.ConversationsNav
import com.penumbraos.mabl.aipincore.view.model.ConversationDisplayNav
import com.penumbraos.mabl.aipincore.view.model.NavViewModel
import com.penumbraos.mabl.aipincore.view.model.PlatformViewModel
import com.penumbraos.mabl.aipincore.view.nav.Navigation
@ -75,7 +75,11 @@ fun PlatformUI(uiComponents: UIComponents) {
LaunchedEffect(Unit) {
actualViewModel.openCurrentConversationEvent.collect {
actualViewModel.navViewModel.pushView(ConversationsNav)
val currentConversation =
actualViewModel.conversationRepository.getLastActiveConversation()
if (currentConversation != null) {
actualViewModel.navViewModel.pushView(ConversationDisplayNav(currentConversation.id))
}
}
}
@ -108,23 +112,6 @@ fun PlatformUI(uiComponents: UIComponents) {
}
}
@Composable
fun ConversationDisplay(
modifier: Modifier = Modifier,
messages: List<ConversationMessage>,
) {
Box(
modifier = modifier
.fillMaxSize()
.background(color = PinTheme.colors.background)
) {
ConversationList(
messages = messages,
modifier = Modifier.fillMaxSize()
)
}
}
@Composable
fun ConversationList(
modifier: Modifier = Modifier,
@ -203,7 +190,7 @@ fun ConversationDisplayPreview() {
PinTheme {
ProvideSnapCoordinator(coordinator = snapCoordinator.value) {
ConversationDisplay(messages = messages)
// ConversationDisplay(messages = messages)
}
}
}

View File

@ -7,6 +7,7 @@ import androidx.lifecycle.ViewModel
data object HomeNav
data object MenuNav
data object ConversationsNav
data class ConversationDisplayNav(val conversationId: String)
data object SettingsNav
data object DummyNav

View File

@ -7,6 +7,7 @@ import com.penumbraos.mabl.aipincore.SETTING_APP_ID
import com.penumbraos.mabl.aipincore.SETTING_DEBUG_CATEGORY
import com.penumbraos.mabl.aipincore.SETTING_DEBUG_CURSOR
import com.penumbraos.mabl.data.AppDatabase
import com.penumbraos.mabl.data.repository.ConversationRepository
import com.penumbraos.sdk.PenumbraClient
import com.penumbraos.sdk.api.BooleanSettingListener
import kotlinx.coroutines.CoroutineScope
@ -30,6 +31,11 @@ class PlatformViewModel(
private val _debugChannel = Channel<Boolean>()
val debugChannel = _debugChannel.receiveAsFlow()
val conversationRepository = ConversationRepository(
database.conversationDao(),
database.conversationMessageDao()
)
init {
coroutineScope.launch {
val client = PenumbraClient(context)

View File

@ -0,0 +1,30 @@
package com.penumbraos.mabl.aipincore.view.nav
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.ui.Modifier
import androidx.lifecycle.viewmodel.compose.viewModel
import com.open.pin.ui.PinTheme
import com.penumbraos.mabl.aipincore.ConversationList
import com.penumbraos.mabl.aipincore.view.model.PlatformViewModel
@Composable
fun ConversationDisplay(conversationId: String) {
val viewModel = viewModel<PlatformViewModel>()
val messages = viewModel.conversationRepository.getConversationMessagesFlow(conversationId)
.collectAsState(emptyList())
Box(
modifier = Modifier
.fillMaxSize()
.background(color = PinTheme.colors.background)
) {
ConversationList(
messages = messages.value,
modifier = Modifier.fillMaxSize()
)
}
}

View File

@ -20,6 +20,7 @@ import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation3.runtime.NavEntry
import androidx.navigation3.ui.NavDisplay
import com.open.pin.ui.components.text.PinText
import com.penumbraos.mabl.aipincore.view.model.ConversationDisplayNav
import com.penumbraos.mabl.aipincore.view.model.ConversationsNav
import com.penumbraos.mabl.aipincore.view.model.HomeNav
import com.penumbraos.mabl.aipincore.view.model.MenuNav
@ -70,6 +71,10 @@ fun Navigation(navViewModel: NavViewModel = viewModel<NavViewModel>()) {
Conversations()
}
is ConversationDisplayNav -> NavEntry(key) {
ConversationDisplay(key.conversationId)
}
SettingsNav -> NavEntry(key) {
Settings()
}

View File

@ -5,6 +5,7 @@ import androidx.room.Insert
import androidx.room.Query
import androidx.room.Update
import com.penumbraos.mabl.data.types.Conversation
import kotlinx.coroutines.flow.Flow
@Dao
interface ConversationDao {
@ -15,7 +16,7 @@ interface ConversationDao {
suspend fun getConversation(id: String): Conversation?
@Query("SELECT * FROM conversations ORDER BY lastActivity DESC LIMIT 1")
suspend fun getLastActiveConversation(): Conversation?
fun getLastActiveConversation(): Flow<Conversation?>
@Insert
suspend fun insertConversation(conversation: Conversation)

View File

@ -5,6 +5,7 @@ import com.penumbraos.mabl.data.dao.ConversationMessageDao
import com.penumbraos.mabl.data.types.Conversation
import com.penumbraos.mabl.data.types.ConversationMessage
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.first
class ConversationRepository(
private val conversationDao: ConversationDao,
@ -18,6 +19,9 @@ class ConversationRepository(
suspend fun getConversation(id: String): Conversation? = conversationDao.getConversation(id)
suspend fun getLastActiveConversation(): Conversation? =
conversationDao.getLastActiveConversation().first()
fun getLastActiveConversationFlow(): Flow<Conversation?> =
conversationDao.getLastActiveConversation()
suspend fun createNewConversation(title: String = "New Conversation"): Conversation {