Skip to content

Commit 8978486

Browse files
committed
better ui ux
Signed-off-by: alperozturk96 <alper_ozturk@proton.me>
1 parent 45a8be7 commit 8978486

2 files changed

Lines changed: 60 additions & 9 deletions

File tree

app/src/main/java/com/nextcloud/client/assistant/AssistantViewModel.kt

Lines changed: 53 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,15 @@ class AssistantViewModel(
6262
private val _snackbarMessageId = MutableStateFlow<Int?>(null)
6363
val snackbarMessageId: StateFlow<Int?> = _snackbarMessageId
6464

65-
private val _isTranslationTask = MutableStateFlow<Boolean>(false)
65+
private val _isTranslationTask = MutableStateFlow(false)
6666
val isTranslationTask: StateFlow<Boolean> = _isTranslationTask
6767

68-
private val _isTranslationTaskCreated = MutableStateFlow<Boolean>(false)
68+
private val _isTranslationTaskCreated = MutableStateFlow(false)
6969
val isTranslationTaskCreated: StateFlow<Boolean> = _isTranslationTaskCreated
7070

71+
private val _translationTaskOutput = MutableStateFlow("")
72+
val translationTaskOutput: StateFlow<String> = _translationTaskOutput
73+
7174
private val selectedTask = MutableStateFlow<Task?>(null)
7275

7376
private val _selectedTaskType = MutableStateFlow<TaskTypeData?>(null)
@@ -204,17 +207,18 @@ class AssistantViewModel(
204207
}
205208
}
206209

210+
// region translation
207211
fun translate(textToTranslate: String, originLanguage: TranslationLanguage, targetLanguage: TranslationLanguage) {
208212
viewModelScope.launch(Dispatchers.IO) {
209-
val task = _selectedTaskType.value
210-
if (task == null) {
213+
val taskType = _selectedTaskType.value
214+
if (taskType == null) {
211215
_snackbarMessageId.update {
212216
R.string.assistant_screen_select_task
213217
}
214218
return@launch
215219
}
216220

217-
val model = task.toTranslationModel()
221+
val model = taskType.toTranslationModel()
218222

219223
if (model == null) {
220224
_snackbarMessageId.update {
@@ -231,15 +235,55 @@ class AssistantViewModel(
231235
model = model.model
232236
)
233237

234-
val result = remoteRepository.translate(input, task)
238+
val result = remoteRepository.translate(input, taskType)
235239
if (result.isSuccess) {
236-
_isTranslationTaskCreated.update {
237-
true
238-
}
240+
_isTranslationTaskCreated.update { true }
241+
242+
val selectedTaskId = selectedTask.value?.id ?: return@launch
243+
244+
pollTranslationResult(
245+
taskType = taskType,
246+
selectedTaskId = selectedTaskId
247+
)
248+
249+
_isTranslationTaskCreated.update { false }
239250
}
240251
}
241252
}
242253

254+
private suspend fun pollTranslationResult(
255+
taskType: TaskTypeData,
256+
selectedTaskId: Long,
257+
maxRetries: Int = 3,
258+
) {
259+
val taskTypeId = taskType.id ?: return
260+
261+
repeat(maxRetries) { attempt ->
262+
val translationTasks = remoteRepository.getTaskList(taskTypeId)
263+
val translationResult = translationTasks
264+
?.find { it.id == selectedTaskId }
265+
?.output
266+
?.output
267+
268+
if (!translationResult.isNullOrBlank()) {
269+
_translationTaskOutput.update { translationResult }
270+
return
271+
}
272+
273+
Log_OC.d(TAG, "Translation not ready yet (attempt ${attempt + 1}/$maxRetries)")
274+
275+
if (attempt < maxRetries - 1) {
276+
delay(POLLING_INTERVAL_MS)
277+
}
278+
}
279+
280+
Log_OC.w(TAG, "Translation polling finished but result is still empty")
281+
updateSnackbarMessage(R.string.translation_screen_task_processing)
282+
onTranslationScreenDismissed()
283+
}
284+
// endregion
285+
286+
243287
// region chat
244288
fun sendChatMessage(content: String, sessionId: Long) = viewModelScope.launch(Dispatchers.IO) {
245289
val request = ChatMessageRequest(

app/src/main/java/com/nextcloud/client/assistant/translate/TranslationScreen.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import androidx.compose.material3.TextField
3838
import androidx.compose.material3.TextFieldDefaults
3939
import androidx.compose.runtime.Composable
4040
import androidx.compose.runtime.DisposableEffect
41+
import androidx.compose.runtime.LaunchedEffect
4142
import androidx.compose.runtime.collectAsState
4243
import androidx.compose.runtime.getValue
4344
import androidx.compose.runtime.mutableStateOf
@@ -71,6 +72,8 @@ fun TranslationScreen(
7172
) {
7273
val languages = remember(selectedTaskType) { selectedTaskType?.toTranslationLanguages() }
7374
val isTranslationTaskCreated by viewModel.isTranslationTaskCreated.collectAsState()
75+
val translationTaskOutput by viewModel.translationTaskOutput.collectAsState()
76+
7477
var sourceState by remember {
7578
mutableStateOf(
7679
TranslationSideState(
@@ -84,6 +87,10 @@ fun TranslationScreen(
8487
mutableStateOf(TranslationSideState(language = languages?.targetLanguages?.firstOrNull(), isTarget = true))
8588
}
8689

90+
LaunchedEffect(translationTaskOutput) {
91+
targetState = targetState.copy(text = translationTaskOutput)
92+
}
93+
8794
BackHandler {
8895
viewModel.onTranslationScreenDismissed()
8996
viewModel.updateScreenState(AssistantScreenState.TaskContent)

0 commit comments

Comments
 (0)