Skip to content

Instantly share code, notes, and snippets.

View fededri's full-sized avatar

Federico Torres fededri

  • Autodesk
  • Argentina | Mexico
View GitHub Profile
@fededri
fededri / HeartView.kt
Created December 19, 2018 00:20
Heart View made with bezier curves
package com.fedetorres.beziercurves
import android.content.Context
import android.graphics.*
import android.util.AttributeSet
import android.view.View
/**
* Federico Torres
@fededri
fededri / State.kt
Created January 25, 2022 02:38
KMM demo app state
data class MoviesState(
val movies: List<Movie> = emptyList(),
val selectedMovie: Movie? = null,
) {
init {
freeze()
}
}
@fededri
fededri / MoviesActions.kt
Last active January 25, 2022 02:42
KMM demo app actions
sealed class MoviesActions {
object FetchMovies : MoviesActions()
data class SelectMovie(val movie: Movie) : MoviesActions()
data class SaveMovies(val movies: List<Movie>) : MoviesActions()
}
@fededri
fededri / MoviesEffects.kt
Created January 25, 2022 02:49
KMM demo app SideEffects
sealed class MoviesEffects(
override val dispatcher: CoroutineDispatcher = ...,
override val coroutineScope: CoroutineScope? = null) : SideEffectInterface {
object LoadMovies : MoviesEffects()
}
typealias NextResult = Next<MoviesState, MoviesEffects, MovieEvents>
class MoviesUpdater : Updater<MoviesActions, MoviesState, MoviesEffects, MovieEvents> {
override fun onNewAction(
action: MoviesActions,
currentState: MoviesState
): Next<MoviesState, MoviesEffects, MovieEvents> {
return when (action) {
is MoviesActions.FetchMovies -> fetchMovies(action, currentState)
is MoviesActions.SaveMovies -> saveMovies(action, currentState)
class MoviesProcessor() : Processor<MoviesEffects, MoviesActions> {
private val api : TMDApi = TMDApi()
override suspend fun dispatchSideEffect(effect: MoviesEffects): MoviesActions {
return when(effect){
is MoviesEffects.LoadMovies -> getMovies(effect)
}
}
class MoviesViewModel :
ArchViewModel<MoviesActions, MoviesState, MoviesEffects, MovieEvents, Nothing>(
updater = MoviesUpdater(),
initialState = MoviesState(),
initialEffects = setOf(MoviesEffects.LoadMovies()),
processor = MoviesProcessor(threadInfo),
) {
}
class FlowWrapper<T>(private val source: Flow<T>) : Flow<T> by source {
init {
freeze()
}
fun collect(onEach: (T) -> Unit, onCompletion: (cause: Throwable?) -> Unit): Cancellable {
val scope = CoroutineScope(SupervisorJob() + Dispatchers.Main)
scope.launch {
try {
class MoviesFragment : Fragment() {
private val viewModel: MoviesViewModel by activityViewModels {...}
override fun onCreateView(inflater: LayoutInflater): View = ComposeView(inflater.context).apply {
layoutParams = ...
setContent {
val state by viewModel.observeState().collectAsState()
MoviesListView(state = state, onMovieSelected = { movie ->
struct MoviesListScreenView: View {
@State var state: MoviesState = MoviesState(movies: [], selectedMovie: nil)
let viewModel = MoviesViewModel()
var body: some View {
List() {
ForEach(state.movies, id: \.self) { movie in
MovieView(movie, ...)
}
}