/* * This file is part of GNU Taler * (C) 2022 Taler Systems S.A. * * GNU Taler is free software; you can redistribute it and/or modify it under the * terms of the GNU General Public License as published by the Free Software * Foundation; either version 3, or (at your option) any later version. * * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with * GNU Taler; see the file COPYING. If not, see */ package net.taler.wallet.compose import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.runtime.State import androidx.compose.runtime.collectAsState import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.flowWithLifecycle import com.google.accompanist.themeadapter.material3.Mdc3Theme import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.StateFlow import kotlin.coroutines.CoroutineContext import kotlin.coroutines.EmptyCoroutineContext @Composable fun rememberFlow( flow: Flow, lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current, ): Flow = remember(key1 = flow, key2 = lifecycleOwner) { flow.flowWithLifecycle(lifecycleOwner.lifecycle, Lifecycle.State.STARTED) } @Composable fun Flow.collectAsStateLifecycleAware( initial: R, context: CoroutineContext = EmptyCoroutineContext, ): State { val lifecycleAwareFlow = rememberFlow(flow = this) return lifecycleAwareFlow.collectAsState(initial = initial, context = context) } @Suppress("StateFlowValueCalledInComposition") @Composable fun StateFlow.collectAsStateLifecycleAware( context: CoroutineContext = EmptyCoroutineContext, ): State = collectAsStateLifecycleAware(initial = value, context = context) @Composable fun TalerSurface(content: @Composable () -> Unit) { Mdc3Theme { Surface { content() } } }