Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit 94b26ad7 authored by Wolf-Martell Montwé's avatar Wolf-Martell Montwé
Browse files

Add DrawerContract and swipe to refresh integration

parent 67c57b81
Loading
Loading
Loading
Loading
+36 −0
Original line number Diff line number Diff line
package app.k9mail.core.ui.compose.testing

import app.k9mail.core.ui.compose.common.mvi.BaseViewModel

/**
 * Base class for providing fake MVI ViewModels for testing.
 *
 * This class provides a way to capture events and emit effects on a fake ViewModel.
 * The state can be set directly using [applyState].
 *
 * Example usage:
 *
 * ```
 * class FakeViewModel(
 *    initialState: State = State(),
 * ) : BaseFakeViewModel<State, Event, Effect>(initialState), ViewModel
 * ```
 */
abstract class BaseFakeViewModel<STATE, EVENT, EFFECT>(
    initialState: STATE,
) : BaseViewModel<STATE, EVENT, EFFECT>(initialState = initialState) {

    val events = mutableListOf<EVENT>()

    override fun event(event: EVENT) {
        events.add(event)
    }

    fun effect(effect: EFFECT) {
        emitEffect(effect)
    }

    fun applyState(state: STATE) {
        updateState { state }
    }
}
+5 −12
Original line number Diff line number Diff line
package app.k9mail.feature.navigation.drawer

import android.view.Surface
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.ComposeView
import androidx.core.view.GravityCompat
import androidx.drawerlayout.widget.DrawerLayout
import app.k9mail.core.ui.compose.designsystem.atom.Surface
import app.k9mail.core.ui.compose.designsystem.atom.text.TextBodyLarge
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import app.k9mail.core.ui.theme.api.FeatureThemeProvider
import app.k9mail.feature.navigation.drawer.ui.DrawerView
import app.k9mail.legacy.account.Account
import com.mikepenz.materialdrawer.widget.MaterialDrawerSliderView
import org.koin.core.component.KoinComponent
@@ -26,19 +22,16 @@ class FolderDrawer(
    private val drawer: DrawerLayout = parent.findViewById(R.id.navigation_drawer_layout)
    private val drawerView: ComposeView = parent.findViewById(R.id.material_drawer_compose_view)
    private val sliderView: MaterialDrawerSliderView = parent.findViewById(R.id.material_drawer_slider)
    private val swipeRefreshLayout: SwipeRefreshLayout = parent.findViewById(R.id.material_drawer_swipe_refresh)

    init {
        sliderView.visibility = View.GONE
        drawerView.visibility = View.VISIBLE
        swipeRefreshLayout.isEnabled = false

        drawerView.setContent {
            themeProvider.WithTheme {
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = Color.Red,
                ) {
                    TextBodyLarge("Folder Drawer")
                }
                DrawerView()
            }
        }
    }
+11 −0
Original line number Diff line number Diff line
package app.k9mail.feature.navigation.drawer

import app.k9mail.feature.navigation.drawer.ui.DrawerViewModel
import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.core.module.Module
import org.koin.dsl.module

val navigationDrawerModule: Module = module {

    viewModel { DrawerViewModel() }
}
+18 −0
Original line number Diff line number Diff line
package app.k9mail.feature.navigation.drawer.ui

import app.k9mail.core.ui.compose.common.mvi.UnidirectionalViewModel

interface DrawerContract {

    interface ViewModel : UnidirectionalViewModel<State, Event, Effect>

    data class State(
        val isLoading: Boolean = false,
    )

    sealed interface Event {
        data object OnRefresh : Event
    }

    sealed interface Effect
}
+20 −0
Original line number Diff line number Diff line
package app.k9mail.feature.navigation.drawer.ui

import androidx.compose.runtime.Composable
import app.k9mail.core.ui.compose.common.mvi.observe
import app.k9mail.core.ui.compose.designsystem.molecule.PullToRefreshBox
import org.koin.androidx.compose.koinViewModel

@Composable
fun DrawerView(
    viewModel: DrawerContract.ViewModel = koinViewModel<DrawerViewModel>(),
) {
    val (state, dispatch) = viewModel.observe { }

    PullToRefreshBox(
        isRefreshing = state.value.isLoading,
        onRefresh = { dispatch(DrawerContract.Event.OnRefresh) },
    ) {
        DrawerContent()
    }
}
Loading