@@ -41,10 +41,8 @@ import androidx.compose.runtime.DisposableEffect
4141import androidx.compose.runtime.LaunchedEffect
4242import androidx.compose.runtime.collectAsState
4343import androidx.compose.runtime.getValue
44- import androidx.compose.runtime.mutableStateOf
4544import androidx.compose.runtime.remember
4645import androidx.compose.runtime.rememberCoroutineScope
47- import androidx.compose.runtime.setValue
4846import androidx.compose.ui.Alignment
4947import androidx.compose.ui.Modifier
5048import androidx.compose.ui.graphics.ColorFilter
@@ -60,13 +58,15 @@ import com.nextcloud.client.assistant.conversation.ConversationScreen
6058import com.nextcloud.client.assistant.conversation.ConversationViewModel
6159import com.nextcloud.client.assistant.conversation.repository.MockConversationRemoteRepository
6260import com.nextcloud.client.assistant.extensions.getInputTitle
61+ import com.nextcloud.client.assistant.model.AssistantPage
6362import com.nextcloud.client.assistant.model.AssistantScreenState
6463import com.nextcloud.client.assistant.model.ScreenOverlayState
6564import com.nextcloud.client.assistant.repository.local.MockAssistantLocalRepository
6665import com.nextcloud.client.assistant.repository.remote.MockAssistantRemoteRepository
6766import com.nextcloud.client.assistant.task.TaskView
6867import com.nextcloud.client.assistant.taskTypes.TaskTypesRow
6968import com.nextcloud.ui.composeActivity.ComposeActivity
69+ import com.nextcloud.ui.composeActivity.ComposeViewModel
7070import com.nextcloud.ui.composeComponents.alertDialog.SimpleAlertDialog
7171import com.nextcloud.ui.composeComponents.bottomSheet.MoreActionsBottomSheet
7272import com.nextcloud.utils.extensions.getChat
@@ -84,11 +84,13 @@ private const val PULL_TO_REFRESH_DELAY = 1500L
8484@OptIn(ExperimentalMaterial3Api ::class )
8585@Composable
8686fun AssistantScreen (
87+ composeViewModel : ComposeViewModel ,
8788 viewModel : AssistantViewModel ,
8889 conversationViewModel : ConversationViewModel ,
8990 capability : OCCapability ,
9091 activity : Activity
9192) {
93+ val selectedText by composeViewModel.selectedText.collectAsState()
9294 val sessionId by viewModel.sessionId.collectAsState()
9395 val messageId by viewModel.snackbarMessageId.collectAsState()
9496 val screenOverlayState by viewModel.screenOverlayState.collectAsState()
@@ -99,7 +101,8 @@ fun AssistantScreen(
99101 val scope = rememberCoroutineScope()
100102 val pullRefreshState = rememberPullToRefreshState()
101103 val snackbarHostState = remember { SnackbarHostState () }
102- val pagerState = rememberPagerState(initialPage = 1 , pageCount = { 2 })
104+ val pagerState =
105+ rememberPagerState(initialPage = AssistantPage .Content .id, pageCount = { AssistantPage .entries.size })
103106
104107 LaunchedEffect (messageId) {
105108 messageId?.let {
@@ -108,6 +111,21 @@ fun AssistantScreen(
108111 }
109112 }
110113
114+ LaunchedEffect (selectedText) {
115+ selectedText?.let {
116+ if (it.isBlank()) {
117+ return @LaunchedEffect
118+ }
119+
120+ if (pagerState.currentPage == AssistantPage .Conversation .id) {
121+ pagerState.scrollToPage(AssistantPage .Content .id)
122+ }
123+
124+ viewModel.updateInputBarText(it)
125+ snackbarHostState.showSnackbar(activity.getString(R .string.assistant_screen_text_selected))
126+ }
127+ }
128+
111129 LaunchedEffect (sessionId) {
112130 viewModel.startPolling(sessionId)
113131
@@ -127,22 +145,22 @@ fun AssistantScreen(
127145 userScrollEnabled = taskTypes.getChat() != null
128146 ) { page ->
129147 when (page) {
130- 0 -> {
148+ AssistantPage . Conversation .id -> {
131149 ConversationScreen (viewModel = conversationViewModel, close = {
132150 scope.launch {
133- pagerState.scrollToPage(1 )
151+ pagerState.scrollToPage(AssistantPage . Content .id )
134152 }
135153 }, openChat = { newSessionId ->
136154 viewModel.initSessionId(newSessionId)
137155 taskTypes.getChat()?.let { chatTaskType ->
138156 viewModel.selectTaskType(chatTaskType)
139157 }
140158 scope.launch {
141- pagerState.scrollToPage(1 )
159+ pagerState.scrollToPage(AssistantPage . Content .id )
142160 }
143161 })
144162 }
145- 1 -> {
163+ AssistantPage . Content .id -> {
146164 Scaffold (
147165 modifier = Modifier .pullToRefresh(
148166 false ,
@@ -166,14 +184,14 @@ fun AssistantScreen(
166184 viewModel.selectTaskType(task)
167185 }, navigateToConversationList = {
168186 scope.launch {
169- pagerState.scrollToPage(0 )
187+ pagerState.scrollToPage(AssistantPage . Conversation .id )
170188 }
171189 })
172190 }
173191 },
174192 bottomBar = {
175193 if (! taskTypes.isNullOrEmpty()) {
176- ChatInputBar (
194+ InputBar (
177195 sessionId,
178196 selectedTaskType,
179197 viewModel
@@ -233,9 +251,9 @@ fun AssistantScreen(
233251
234252@Suppress(" LongMethod" )
235253@Composable
236- private fun ChatInputBar (sessionId : Long? , selectedTaskType : TaskTypeData ? , viewModel : AssistantViewModel ) {
254+ private fun InputBar (sessionId : Long? , selectedTaskType : TaskTypeData ? , viewModel : AssistantViewModel ) {
237255 val scope = rememberCoroutineScope()
238- var text by remember { mutableStateOf( " " ) }
256+ val text by viewModel.inputBarText.collectAsState()
239257
240258 Surface (
241259 tonalElevation = 3 .dp,
@@ -264,7 +282,7 @@ private fun ChatInputBar(sessionId: Long?, selectedTaskType: TaskTypeData?, view
264282 ) {
265283 OutlinedTextField (
266284 value = text,
267- onValueChange = { text = it },
285+ onValueChange = { viewModel.updateInputBarText(it) },
268286 modifier = Modifier
269287 .weight(1f )
270288 .padding(end = 8 .dp),
@@ -291,7 +309,7 @@ private fun ChatInputBar(sessionId: Long?, selectedTaskType: TaskTypeData?, view
291309
292310 scope.launch {
293311 delay(CHAT_INPUT_DELAY )
294- text = " "
312+ viewModel.updateInputBarText( " " )
295313 }
296314 }
297315 ) {
@@ -413,6 +431,7 @@ private fun AssistantScreenPreview() {
413431 MaterialTheme (
414432 content = {
415433 AssistantScreen (
434+ composeViewModel = ComposeViewModel (),
416435 conversationViewModel = getMockConversationViewModel(),
417436 viewModel = getMockAssistantViewModel(false ),
418437 activity = ComposeActivity (),
@@ -431,6 +450,7 @@ private fun AssistantEmptyScreenPreview() {
431450 MaterialTheme (
432451 content = {
433452 AssistantScreen (
453+ composeViewModel = ComposeViewModel (),
434454 conversationViewModel = getMockConversationViewModel(),
435455 viewModel = getMockAssistantViewModel(true ),
436456 activity = ComposeActivity (),
0 commit comments