package com.suno.android.ui.bottom_sheets.country_picker import com.google.i18n.phonenumbers.PhoneNumberUtil import com.suno.android.common_core_utils.extensions.xGetFlagEmojiFromRegionCode import com.suno.android.common_mvi.MviProcessorFactory import com.suno.android.common_mvi.MviViewModel import com.suno.android.ui.screens.onboarding.phone.input.Country import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.collections.immutable.PersistentList import kotlinx.collections.immutable.toPersistentList import java.util.Locale import javax.inject.Inject @HiltViewModel class CountryPickerBottomSheetVM @Inject constructor( processorFactory: MviProcessorFactory, ) : MviViewModel( processorFactory = processorFactory, initialState = CountryPickerBottomSheetState( searchQuery = "", filteredCountries = availableCountries, allCountries = availableCountries, ), ) { override suspend fun reduceEvent( currentState: CountryPickerBottomSheetState, event: CountryPickerBottomSheetEvent, emitEffect: suspend (CountryPickerBottomSheetEffect) -> Unit, ): CountryPickerBottomSheetState = when (event) { is CountryPickerBottomSheetEvent.OnSearchQueryChanged -> { val filteredCountries = if (event.query.isEmpty()) { currentState.allCountries } else { currentState.allCountries.filter { country -> country.name.contains(event.query, ignoreCase = true) || country.code.contains(event.query, ignoreCase = true) || country.dialCode.contains(event.query, ignoreCase = true) } } currentState.copy( searchQuery = event.query, filteredCountries = filteredCountries.toPersistentList(), ) } is CountryPickerBottomSheetEvent.OnCountrySelected -> { emitEffect(CountryPickerBottomSheetEffect.OnCountrySelected(event.country)) currentState } } } private val availableCountries: PersistentList = PhoneNumberUtil.getInstance().let { phoneUtil -> val regions = phoneUtil.supportedRegions val countries = regions.map { regionCode -> val countryCode = phoneUtil.getCountryCodeForRegion(regionCode) val flagEmoji = regionCode.xGetFlagEmojiFromRegionCode() val exampleNumber = phoneUtil.getExampleNumberForType( regionCode, PhoneNumberUtil.PhoneNumberType.MOBILE, ) val exampleNumberString = exampleNumber?.let { phoneUtil.format( exampleNumber.clearCountryCode(), PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL, ) } Country( name = Locale("", regionCode).displayCountry, code = regionCode, dialCode = "+$countryCode", flagEmoji = flagEmoji, examplePhoneNumber = exampleNumberString, ) }.sortedBy { it.name } countries.toPersistentList() }