Skip to content

Instantly share code, notes, and snippets.

View krzdabrowski's full-sized avatar

Krzysztof Dąbrowski krzdabrowski

View GitHub Profile
abstract class BaseViewModel<UI_STATE : Parcelable, PARTIAL_UI_STATE, EVENT, INTENT>(
(...)
) : ViewModel(),
IntentDelegate<INTENT, PARTIAL_UI_STATE> by IntentDelegateImpl(),
InternalChangesDelegate<PARTIAL_UI_STATE> by InternalChangesDelegateImpl(),
EventDelegate<EVENT> by EventDelegateImpl() {
init {
viewModelScope.launch {
merge(
class EventDelegateImpl<EVENT> : EventDelegate<EVENT> {
private val eventChannel = Channel<EVENT>(Channel.BUFFERED)
override fun getEvents(): Flow<EVENT> = eventChannel.receiveAsFlow()
override suspend fun setEvent(event: EVENT) {
eventChannel.send(event)
}
}
class RocketsViewModelTest {
@JvmField
@RegisterExtension
val mainDispatcherExtension = MainDispatcherExtension()
@RelaxedMockK
private lateinit var getRocketsUseCase: GetRocketsUseCase
(...)
[versions]
hilt = "2.50"
kotlin = "1.9.22"
kotlin-coroutines = "1.7.3"
retrofit = "2.9.0"
room = "2.6.1"
(...)
[plugins]
name: CI workflow
on: pull_request
jobs:
build:
runs-on: macos-latest
timeout-minutes: 30
steps:
const val ROCKET_DIVIDER_TEST_TAG = "rocketDividerTestTag"
@Composable
fun RocketsListContent(
rocketList: List<RocketDisplayable>,
(...)
) {
LazyColumn(...) {
itemsIndexed(
items = rocketList,
private fun refreshRockets(): Flow<PartialState> = flow<PartialState> {
refreshRocketsUseCase()
.onFailure {
emit(Error(it))
}
}.onStart {
emit(Loading)
}
sealed class NavigationDestination(
val route: String
) {
data object Rockets : NavigationDestination("rocketsDestination")
data object Back : NavigationDestination("navigationBack")
}
@HiltViewModel
class RocketsViewModel @Inject constructor(
(...)
private val refreshRocketsUseCase: RefreshRocketsUseCase,
(...)
)
fun interface RefreshRocketsUseCase : suspend () -> Result<Unit>
suspend fun refreshRockets(
rocketRepository: RocketRepository,
): Result<Unit> = resultOf {
rocketRepository.refreshRockets()
}