feat: home view model implemented

This commit is contained in:
2026-02-27 10:12:48 +03:30
parent ce86dc27ea
commit 1afd90d5d6
14 changed files with 228 additions and 23 deletions
@@ -11,6 +11,7 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import com.approagency.drug.presentation.screens.HomeScreen
import com.approagency.drug.ui.theme.DrugTheme
class MainActivity : ComponentActivity() {
@@ -20,28 +21,9 @@ class MainActivity : ComponentActivity() {
setContent {
DrugTheme {
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
Greeting(
name = "Android",
modifier = Modifier.padding(innerPadding)
)
HomeScreen(modifier = Modifier.padding(innerPadding))
}
}
}
}
}
@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
Text(
text = "Hello $name!",
modifier = modifier
)
}
@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
DrugTheme {
Greeting("Android")
}
}
@@ -1,9 +1,13 @@
package com.approagency.drug.di
import android.app.Application
import com.approagency.drug.data.repository.DrugRepositoryImpl
import com.approagency.drug.domain.repository.DrugRepository
import com.approagency.drug.domain.usecase.GetDrugSearchUseCase
import com.approagency.drug.presentation.viewModel.HomeViewModel
import com.approagency.drug.utils.Config
import org.koin.core.module.dsl.viewModel
import org.koin.dsl.module
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
@@ -29,5 +33,7 @@ val appModule= module {
GetDrugSearchUseCase(get())
}
//
//view model
viewModel { (app: Application) ->
HomeViewModel(app, get())}
}
@@ -2,10 +2,14 @@ package com.approagency.drug.presentation.screens
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import com.approagency.drug.presentation.viewModel.HomeViewModel
import org.koin.androidx.compose.koinViewModel
@Composable
fun HomeScreen(
modifier: Modifier,
view
)
viewModel: HomeViewModel = koinViewModel()
){
}
@@ -0,0 +1,66 @@
package com.approagency.drug.presentation.viewModel
import android.net.http.HttpException
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.approagency.drug.data.dto.DrugListResponse
import com.approagency.drug.domain.model.DrugSearchParams
import com.approagency.drug.domain.usecase.GetDrugSearchUseCase
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asSharedFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
class HomeViewModel (
private val getDrugSearchUseCase: GetDrugSearchUseCase
): ViewModel() {
private val _uiState = MutableStateFlow(DrugSearchState())
val uiState : StateFlow<DrugSearchState> = _uiState
// Add SharedFlow for one-time events
private val _event = MutableSharedFlow<HomeEvent>()
val event = _event.asSharedFlow()
fun searchDrugs(drugSearchParams: DrugSearchParams) {
_uiState.update { it.copy(isLoading = true) }
viewModelScope.launch {
try {
val result = getDrugSearchUseCase.invoke(drugSearchParams)
_uiState.update { it.copy(
isLoading = false,
drugsData = result
) }
} catch (e: HttpException) {
handleError(e.message)
}catch (e: Exception) {
handleError(e.localizedMessage ?: "Unknown error")
}
}
}
private suspend fun handleError(message: String?) {
_uiState.update { it.copy(isLoading = false) }
_event.emit(HomeEvent.ShowError(message ?: "Error occurred"))
}
// Clear error when consumed
fun clearError() {
_uiState.update { it.copy(error = null) }
}
}
sealed class HomeEvent {
data class ShowError(val message: String) : HomeEvent()
data class NavigateToDetails(val drugId: String) : HomeEvent()
}
data class DrugSearchState(
val isLoading: Boolean = false,
val drugsData: Result<DrugListResponse?>? = null,
val error:String? = null
)