@@ -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 (
0 commit comments