robercoding
08/13/2024, 5:06 PMrobercoding
08/13/2024, 5:06 PMViewModelObservableViewModelDataStorefooimport com.rickclephas.kmp.nativecoroutines.NativeCoroutinesState
import com.rickclephas.kmp.observableviewmodel.ViewModel
import com.rickclephas.kmp.observableviewmodel.launch
import com.rickclephas.kmp.observableviewmodel.stateIn
...
open class MyViewModel(useCase: UseCase): ViewModel() {
  private val isProcessing: MutableStateFlow<Boolean> = MutableStateFlow(false)
  @NativeCoroutinesState
  val value: StateFlow<FooState<String>> = combine(isProcessing, useCase.valueFlow) { isProcessing, value ->
     if(isProcessing) {
       return@combine FooState.Processing
     }
     if(value != null) FooState.Success else FooState.Empty
  }.stateIn(viewModelScope, started = SharingStarted.Lazily, initialValue = FooState.Loading)
  
  fun foo(value: String) {
     viewModelScope.launch {
        isProcessing.emit(true)
        useCase.setValue(value)
        isProcessing.emit(false)
     }
  }
}viewModel.foo(value)FooState.ProcessinguseCase.setValue(value)<http://Dispatchers.IO|Dispatchers.IO>viewModelScope.launch(<http://Dispatchers.IO|Dispatchers.IO>) { .. }robercoding
08/13/2024, 5:10 PMRick Clephas
08/13/2024, 5:29 PMUseCasesetValuerobercoding
08/13/2024, 5:37 PMclass UseCaseImpl constructor(private val preference: LocalePreference): UseCase {
    override val locale: Flow<LocaleItem?> = preference.getStringDataFlow(PREFERENCE_APP_LOCALE, null).map {
        it?.toLocaleItem()
    }
    override suspend fun setValue(value: String) {
        preference.setStringData(PREFERENCE_APP_LOCALE, value)
    }
}class LocalePreference(DataStore<Preference>) {
 fun getStringDataFlow(preferenceKey: String, ifNotAvailable: String?): Flow<String?> = developmentDataStore.data.map { preferences ->
        preferences[stringPreferencesKey(preferenceKey)] ?: ifNotAvailable
    }
}robercoding
08/13/2024, 5:39 PMMost likely theSo itās nothing related to the thread? Or what would be the root issue whencall is too fast.setValue
setValuerobercoding
08/13/2024, 5:40 PMisProcessingrobercoding
08/13/2024, 5:41 PMfun foo(value: String) {
     viewModelScope.launch {
        useCase.setValue(value)
     }
  }robercoding
08/13/2024, 5:43 PM.onChange(of: viewModel.appLanguage) {
                let result: PreferenceState<LocaleItem> = viewModel.appLanguage
                let isEmpty = PreferenceState.isEmpty(result)
                let isSuccess = PreferenceState.isSuccess(result)
                let isProcessing = PreferenceState.isProcessing(result)
                withAnimation(.easeInOut) {
                    if isSuccess() {
                        let locale = (result as! PreferenceStateSuccess<LocaleItem>).data
                        self.locale = Locale(identifier: "\(locale!.language)-\(locale!.country)")
                            showMainView = true
                        showOverlay = false
                    } else if isEmpty() {
                        showLanguageView = true
                        showMainView = false
                        showOverlay = false
                    } else if isProcessing() {
//                        showOverlay.toggle()
                    } else {
                        showOverlay = false
                    }
                }
            }Rick Clephas
08/13/2024, 5:43 PMrobercoding
08/13/2024, 5:44 PMSo if setValue is resource intensive it would block the main thread. Unless itās suspendingIn this case, itās suspending or am I missing something here? š¤
robercoding
08/13/2024, 5:47 PMrobercoding
08/13/2024, 5:47 PMRick Clephas
08/13/2024, 5:48 PMrobercoding
08/13/2024, 5:50 PMAmir Hammad
08/13/2024, 9:01 PMrobercoding
08/14/2024, 6:24 AM@StateViewModel@StateViewModel var viewModel = HomeComponent().localeViewModelrobercoding
08/14/2024, 6:51 AMUseCaserobercoding
08/15/2024, 3:12 PMwithAnimationshowOverlaywithAnimationshowOverlayrobercoding
08/15/2024, 3:12 PMrobercoding
08/16/2024, 8:41 PMRick Clephas
08/17/2024, 11:54 AM