@@ -33,6 +33,8 @@ import androidx.compose.material3.Icon
3333import androidx.compose.material3.IconButton
3434import androidx.compose.material3.MaterialTheme
3535import androidx.compose.material3.Scaffold
36+ import androidx.compose.material3.SnackbarHost
37+ import androidx.compose.material3.SnackbarHostState
3638import androidx.compose.material3.Text
3739import androidx.compose.material3.TextField
3840import androidx.compose.material3.TextFieldDefaults
@@ -41,9 +43,7 @@ import androidx.compose.runtime.DisposableEffect
4143import androidx.compose.runtime.LaunchedEffect
4244import androidx.compose.runtime.collectAsState
4345import androidx.compose.runtime.getValue
44- import androidx.compose.runtime.mutableStateOf
4546import androidx.compose.runtime.remember
46- import androidx.compose.runtime.setValue
4747import androidx.compose.ui.Alignment
4848import androidx.compose.ui.Modifier
4949import androidx.compose.ui.graphics.Color
@@ -56,50 +56,35 @@ import com.nextcloud.client.assistant.AssistantViewModel
5656import com.nextcloud.client.assistant.model.AssistantScreenState
5757import com.nextcloud.utils.extensions.getActivity
5858import com.owncloud.android.R
59- import com.owncloud.android.lib.resources.assistant.v2.model.TaskTypeData
6059import com.owncloud.android.lib.resources.assistant.v2.model.TranslationLanguage
6160import com.owncloud.android.lib.resources.assistant.v2.model.toTranslationLanguages
6261import com.owncloud.android.utils.ClipboardUtil
6362
6463@Suppress(" LongMethod" )
6564@OptIn(ExperimentalMaterial3Api ::class )
6665@Composable
67- fun TranslationScreen (
68- selectedTaskType : TaskTypeData ? ,
69- viewModel : AssistantViewModel ,
70- textToTranslate : String ,
71- isTaskExists : Boolean
72- ) {
73- val languages = remember(selectedTaskType) { selectedTaskType?.toTranslationLanguages() }
74- val isTranslationTaskCreated by viewModel.isTranslationTaskCreated.collectAsState()
75- val translationTaskOutput by viewModel.translationTaskOutput.collectAsState()
76-
77- var sourceState by remember {
78- mutableStateOf(
79- TranslationSideState (
80- text = textToTranslate,
81- language = languages?.originLanguages?.firstOrNull(),
82- isTarget = false
83- )
84- )
85- }
86- var targetState by remember {
87- mutableStateOf(TranslationSideState (language = languages?.targetLanguages?.firstOrNull(), isTarget = true ))
88- }
66+ fun TranslationScreen (viewModel : TranslationViewModel , assistantViewModel : AssistantViewModel ) {
67+ val context = LocalContext .current
68+ val state by viewModel.screenState.collectAsState()
69+ val messageId by viewModel.snackbarMessageId.collectAsState()
70+ val snackbarHostState = remember { SnackbarHostState () }
8971
90- LaunchedEffect (translationTaskOutput) {
91- targetState = targetState.copy(text = translationTaskOutput)
72+ BackHandler {
73+ assistantViewModel.onTranslationScreenDismissed()
74+ assistantViewModel.updateScreenState(AssistantScreenState .TaskContent )
9275 }
9376
94- BackHandler {
95- viewModel.onTranslationScreenDismissed()
96- viewModel.updateScreenState(AssistantScreenState .TaskContent )
77+ LaunchedEffect (messageId) {
78+ messageId?.let {
79+ snackbarHostState.showSnackbar(context.getString(it))
80+ viewModel.updateSnackbarMessage(null )
81+ }
9782 }
9883
9984 // task is unselected
10085 DisposableEffect (Unit ) {
10186 onDispose {
102- viewModel .onTranslationScreenDismissed()
87+ assistantViewModel .onTranslationScreenDismissed()
10388 }
10489 }
10590
@@ -109,29 +94,30 @@ fun TranslationScreen(
10994 .padding(16 .dp)
11095 .padding(top = 32 .dp),
11196 floatingActionButton = {
112- if (! isTaskExists && ! isTranslationTaskCreated ) {
97+ if (state.fabVisibility ) {
11398 FloatingActionButton (onClick = {
114- val originLang = sourceState.language
115- val targetLang = targetState.language
116- if (originLang != null && targetLang != null ) {
117- viewModel.translate(sourceState.text, originLang, targetLang)
118- }
99+ viewModel.translate()
119100 }, content = {
120101 Icon (painter = painterResource(R .drawable.ic_translate), contentDescription = " translate button" )
121102 })
122103 }
104+ },
105+ snackbarHost = {
106+ SnackbarHost (snackbarHostState)
123107 }
124108 ) { paddingValues ->
125109 LazyColumn (modifier = Modifier .padding(paddingValues)) {
126110 item {
127111 TranslationSection (
128112 labelId = R .string.translation_screen_label_from,
129113 hintId = R .string.translation_screen_hint_source,
130- state = sourceState ,
131- availableLanguages = languages?.originLanguages ? : emptyList() ,
114+ state = state.source ,
115+ availableLanguages = state.taskTypeData.toTranslationLanguages().originLanguages ,
132116 maxDp = 120 .dp,
133117 shimmer = false ,
134- onStateChange = { sourceState = it }
118+ onStateChange = {
119+ viewModel.updateSourceState(it)
120+ }
135121 )
136122 }
137123
@@ -146,16 +132,14 @@ fun TranslationScreen(
146132 item {
147133 TranslationSection (
148134 labelId = R .string.translation_screen_label_to,
149- hintId = if (isTaskExists) {
150- R .string.translation_screen_translating
151- } else {
152- R .string.translation_screen_start_to_translate_task
153- },
154- state = targetState,
155- availableLanguages = languages?.targetLanguages ? : emptyList(),
135+ hintId = state.targetHintMessageId,
136+ state = state.target,
137+ availableLanguages = state.taskTypeData.toTranslationLanguages().targetLanguages,
156138 maxDp = Dp .Unspecified ,
157- shimmer = isTaskExists || isTranslationTaskCreated,
158- onStateChange = { targetState = it }
139+ shimmer = state.shimmer,
140+ onStateChange = {
141+ viewModel.updateTargetState(it)
142+ }
159143 )
160144 }
161145 }
@@ -166,7 +150,7 @@ fun TranslationScreen(
166150@Composable
167151private fun TranslationSection (
168152 labelId : Int ,
169- hintId : Int ,
153+ hintId : Int? ,
170154 state : TranslationSideState ,
171155 availableLanguages : List <TranslationLanguage >,
172156 maxDp : Dp ,
@@ -241,7 +225,7 @@ private fun TranslationSection(
241225 .fillMaxWidth()
242226 .heightIn(min = 120 .dp, max = maxDp),
243227 placeholder = {
244- Text (text = stringResource(hintId ), style = MaterialTheme .typography.headlineSmall)
228+ hintId?. let { Text (text = stringResource(it ), style = MaterialTheme .typography.headlineSmall) }
245229 },
246230 textStyle = MaterialTheme .typography.headlineSmall,
247231 colors = TextFieldDefaults .colors(
0 commit comments