feat: home view model implemented
This commit is contained in:
@@ -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
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user