Skip to content
Snippets Groups Projects
Unverified Commit d433de71 authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

wip: update dependencies

parent 6b05e670
No related branches found
No related tags found
No related merge requests found
Showing
with 153 additions and 64 deletions
...@@ -24,9 +24,8 @@ ...@@ -24,9 +24,8 @@
package de.chaosdorf.meteroid.sync package de.chaosdorf.meteroid.sync
import de.chaosdorf.meteroid.model.Server import de.chaosdorf.meteroid.model.AccountInfo
import de.chaosdorf.meteroid.model.ServerRepository import de.chaosdorf.meteroid.model.ServerRepository
import de.chaosdorf.meteroid.model.User
import de.chaosdorf.meteroid.model.UserRepository import de.chaosdorf.meteroid.model.UserRepository
import de.chaosdorf.meteroid.storage.AccountPreferences import de.chaosdorf.meteroid.storage.AccountPreferences
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
...@@ -40,7 +39,7 @@ class AccountProvider @Inject constructor( ...@@ -40,7 +39,7 @@ class AccountProvider @Inject constructor(
serverRepository: ServerRepository, serverRepository: ServerRepository,
userRepository: UserRepository, userRepository: UserRepository,
) { ) {
val account: Flow<Pair<Server, User?>?> = val account: Flow<AccountInfo?> =
accountPreferences.state.flatMapLatest { preferences -> accountPreferences.state.flatMapLatest { preferences ->
if (preferences.server == null) { if (preferences.server == null) {
flowOf(null) flowOf(null)
...@@ -49,10 +48,10 @@ class AccountProvider @Inject constructor( ...@@ -49,10 +48,10 @@ class AccountProvider @Inject constructor(
if (server == null) { if (server == null) {
flowOf(null) flowOf(null)
} else if (preferences.user == null) { } else if (preferences.user == null) {
flowOf(Pair(server, null)) flowOf(AccountInfo(server, null))
} else { } else {
userRepository.getFlow(server.serverId, preferences.user) userRepository.getFlow(server.serverId, preferences.user)
.mapLatest { user -> Pair(server, user) } .mapLatest { user -> AccountInfo(server, user) }
} }
} }
} }
......
...@@ -38,6 +38,7 @@ import androidx.compose.runtime.collectAsState ...@@ -38,6 +38,7 @@ import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.navigation.NavOptions
import de.chaosdorf.meteroid.sync.SyncHandler import de.chaosdorf.meteroid.sync.SyncHandler
import de.chaosdorf.meteroid.ui.navigation.HomeSections import de.chaosdorf.meteroid.ui.navigation.HomeSections
import de.chaosdorf.meteroid.ui.navigation.MeteroidBottomBar import de.chaosdorf.meteroid.ui.navigation.MeteroidBottomBar
...@@ -46,7 +47,7 @@ import de.chaosdorf.meteroid.ui.navigation.MeteroidTopBar ...@@ -46,7 +47,7 @@ import de.chaosdorf.meteroid.ui.navigation.MeteroidTopBar
@Composable @Composable
fun DrinkListScreen( fun DrinkListScreen(
viewModel: DrinkListViewModel, viewModel: DrinkListViewModel,
onNavigate: (String) -> Unit = {} onNavigate: (String, NavOptions) -> Unit
) { ) {
val account by viewModel.account.collectAsState() val account by viewModel.account.collectAsState()
val drinks by viewModel.drinks.collectAsState() val drinks by viewModel.drinks.collectAsState()
...@@ -56,7 +57,7 @@ fun DrinkListScreen( ...@@ -56,7 +57,7 @@ fun DrinkListScreen(
bottomBar = { bottomBar = {
MeteroidBottomBar( MeteroidBottomBar(
currentRoute = HomeSections.PURCHASE, currentRoute = HomeSections.PURCHASE,
historyEnabled = account?.second?.audit == true, historyEnabled = account?.user?.audit == true,
navigateTo = onNavigate navigateTo = onNavigate
) )
} }
......
...@@ -27,6 +27,7 @@ package de.chaosdorf.meteroid.ui.drinks ...@@ -27,6 +27,7 @@ package de.chaosdorf.meteroid.ui.drinks
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import de.chaosdorf.meteroid.model.AccountInfo
import de.chaosdorf.meteroid.model.Drink import de.chaosdorf.meteroid.model.Drink
import de.chaosdorf.meteroid.model.DrinkRepository import de.chaosdorf.meteroid.model.DrinkRepository
import de.chaosdorf.meteroid.model.Server import de.chaosdorf.meteroid.model.Server
...@@ -47,7 +48,7 @@ class DrinkListViewModel @Inject constructor( ...@@ -47,7 +48,7 @@ class DrinkListViewModel @Inject constructor(
repository: DrinkRepository, repository: DrinkRepository,
syncHandler: DrinkSyncHandler syncHandler: DrinkSyncHandler
) : ViewModel() { ) : ViewModel() {
val account: StateFlow<Pair<Server, User?>?> = accountProvider.account val account: StateFlow<AccountInfo?> = accountProvider.account
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null) .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null)
val drinks: StateFlow<List<Drink>> = accountProvider.account val drinks: StateFlow<List<Drink>> = accountProvider.account
......
...@@ -37,6 +37,7 @@ import androidx.compose.runtime.collectAsState ...@@ -37,6 +37,7 @@ import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.navigation.NavOptions
import de.chaosdorf.meteroid.ui.navigation.HomeSections import de.chaosdorf.meteroid.ui.navigation.HomeSections
import de.chaosdorf.meteroid.ui.navigation.MeteroidBottomBar import de.chaosdorf.meteroid.ui.navigation.MeteroidBottomBar
import de.chaosdorf.meteroid.ui.navigation.MeteroidTopBar import de.chaosdorf.meteroid.ui.navigation.MeteroidTopBar
...@@ -44,7 +45,7 @@ import de.chaosdorf.meteroid.ui.navigation.MeteroidTopBar ...@@ -44,7 +45,7 @@ import de.chaosdorf.meteroid.ui.navigation.MeteroidTopBar
@Composable @Composable
fun MoneyListScreen( fun MoneyListScreen(
viewModel: MoneyListViewModel, viewModel: MoneyListViewModel,
onNavigate: (String) -> Unit = {} onNavigate: (String, NavOptions) -> Unit
) { ) {
val account by viewModel.account.collectAsState() val account by viewModel.account.collectAsState()
...@@ -53,7 +54,7 @@ fun MoneyListScreen( ...@@ -53,7 +54,7 @@ fun MoneyListScreen(
bottomBar = { bottomBar = {
MeteroidBottomBar( MeteroidBottomBar(
currentRoute = HomeSections.DEPOSIT, currentRoute = HomeSections.DEPOSIT,
historyEnabled = account?.second?.audit == true, historyEnabled = account?.user?.audit == true,
navigateTo = onNavigate navigateTo = onNavigate
) )
} }
......
...@@ -29,8 +29,7 @@ import androidx.lifecycle.ViewModel ...@@ -29,8 +29,7 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import de.chaosdorf.meteroid.R import de.chaosdorf.meteroid.R
import de.chaosdorf.meteroid.model.Server import de.chaosdorf.meteroid.model.AccountInfo
import de.chaosdorf.meteroid.model.User
import de.chaosdorf.meteroid.sync.AccountProvider import de.chaosdorf.meteroid.sync.AccountProvider
import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
...@@ -51,7 +50,7 @@ enum class MonetaryAmount(val amount: Double, @DrawableRes val image: Int) { ...@@ -51,7 +50,7 @@ enum class MonetaryAmount(val amount: Double, @DrawableRes val image: Int) {
class MoneyListViewModel @Inject constructor( class MoneyListViewModel @Inject constructor(
accountProvider: AccountProvider accountProvider: AccountProvider
) : ViewModel() { ) : ViewModel() {
val account: StateFlow<Pair<Server, User?>?> = accountProvider.account val account: StateFlow<AccountInfo?> = accountProvider.account
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null) .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null)
val money: List<MonetaryAmount> = MonetaryAmount.entries val money: List<MonetaryAmount> = MonetaryAmount.entries
......
...@@ -56,8 +56,6 @@ fun MoneyTile( ...@@ -56,8 +56,6 @@ fun MoneyTile(
contentDescription = null, contentDescription = null,
contentScale = ContentScale.Fit, contentScale = ContentScale.Fit,
modifier = Modifier modifier = Modifier
.clip(CircleShape)
.background(MaterialTheme.colorScheme.primaryContainer)
.aspectRatio(1.0f) .aspectRatio(1.0f)
.padding(8.dp) .padding(8.dp)
) )
......
...@@ -30,11 +30,12 @@ import androidx.compose.material3.NavigationBarItem ...@@ -30,11 +30,12 @@ import androidx.compose.material3.NavigationBarItem
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.navigation.NavOptions
@Composable @Composable
fun <T : MeteroidNavSection> MeteroidBottomBar( fun <T : MeteroidNavSection> MeteroidBottomBar(
currentRoute: T, currentRoute: T,
navigateTo: (String) -> Unit, navigateTo: (String, NavOptions) -> Unit,
historyEnabled: Boolean, historyEnabled: Boolean,
modifier: Modifier = Modifier modifier: Modifier = Modifier
) { ) {
...@@ -44,7 +45,14 @@ fun <T : MeteroidNavSection> MeteroidBottomBar( ...@@ -44,7 +45,14 @@ fun <T : MeteroidNavSection> MeteroidBottomBar(
icon = { Icon(route.icon, contentDescription = route.title) }, icon = { Icon(route.icon, contentDescription = route.title) },
label = { Text(route.title) }, label = { Text(route.title) },
selected = route == currentRoute, selected = route == currentRoute,
onClick = { navigateTo(route.route) }, onClick = {
navigateTo(
route.route,
NavOptions.Builder()
.setPopUpTo(Routes.Home.Root, true)
.build()
)
},
modifier = modifier, modifier = modifier,
enabled = route != HomeSections.HISTORY || historyEnabled enabled = route != HomeSections.HISTORY || historyEnabled
) )
......
...@@ -31,9 +31,12 @@ import androidx.compose.foundation.layout.padding ...@@ -31,9 +31,12 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarColors
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
...@@ -43,37 +46,40 @@ import androidx.compose.ui.layout.ContentScale ...@@ -43,37 +46,40 @@ import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.navigation.NavOptions
import coil.compose.AsyncImage import coil.compose.AsyncImage
import de.chaosdorf.meteroid.model.AccountInfo
import de.chaosdorf.meteroid.model.Server import de.chaosdorf.meteroid.model.Server
import de.chaosdorf.meteroid.model.User import de.chaosdorf.meteroid.model.User
@Composable @Composable
fun MeteroidTopBar( fun MeteroidTopBar(
account: Pair<Server, User?>?, account: AccountInfo?,
onNavigate: (String) -> Unit = {} onNavigate: (String, NavOptions) -> Unit
) { ) {
TopAppBar( TopAppBar(
title = { title = {
Text( Text(
account?.second?.name account?.user?.name
?: account?.first?.name ?: account?.server?.name
?: "Meteroid" ?: "Meteroid"
) )
}, },
navigationIcon = { navigationIcon = {
AsyncImage( AsyncImage(
account?.second?.gravatarUrl(), account?.user?.gravatarUrl(),
contentDescription = "User List", contentDescription = "User List",
contentScale = ContentScale.Crop, contentScale = ContentScale.Crop,
modifier = Modifier modifier = Modifier
.size(48.dp) .padding(start = 6.dp, end = 24.dp)
.size(40.dp)
.clip(CircleShape) .clip(CircleShape)
.border(1.dp, Color.White, CircleShape) .border(1.dp, Color.White, CircleShape)
.background(MaterialTheme.colorScheme.primaryContainer) .background(MaterialTheme.colorScheme.primaryContainer)
) )
}, },
actions = { actions = {
account?.second?.let { user -> account?.user?.let { user ->
val (foreground, background) = val (foreground, background) =
if (user.balance < 0) if (user.balance < 0)
Pair(MaterialTheme.colorScheme.onError, MaterialTheme.colorScheme.error) Pair(MaterialTheme.colorScheme.onError, MaterialTheme.colorScheme.error)
...@@ -95,7 +101,17 @@ fun MeteroidTopBar( ...@@ -95,7 +101,17 @@ fun MeteroidTopBar(
} }
}, },
modifier = Modifier modifier = Modifier
.shadow(4.dp) .clickable {
.clickable { onNavigate(Routes.Users.Root) } onNavigate(
Routes.Users.Root,
NavOptions
.Builder()
.build()
)
},
colors = TopAppBarDefaults.topAppBarColors(
containerColor = MaterialTheme.colorScheme.primaryContainer,
titleContentColor = MaterialTheme.colorScheme.onPrimaryContainer
)
) )
} }
/*
* The MIT License (MIT)
*
* Copyright (c) 2013-2023 Chaosdorf e.V.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package de.chaosdorf.meteroid.ui.purchases
import de.chaosdorf.meteroid.model.Drink
import de.chaosdorf.meteroid.model.Purchase
data class PurchaseInfo(
val purchase: Purchase,
val drink: Drink?
)
...@@ -35,6 +35,7 @@ import androidx.compose.runtime.Composable ...@@ -35,6 +35,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.navigation.NavOptions
import de.chaosdorf.meteroid.sync.SyncHandler import de.chaosdorf.meteroid.sync.SyncHandler
import de.chaosdorf.meteroid.ui.navigation.HomeSections import de.chaosdorf.meteroid.ui.navigation.HomeSections
import de.chaosdorf.meteroid.ui.navigation.MeteroidBottomBar import de.chaosdorf.meteroid.ui.navigation.MeteroidBottomBar
...@@ -43,7 +44,7 @@ import de.chaosdorf.meteroid.ui.navigation.MeteroidTopBar ...@@ -43,7 +44,7 @@ import de.chaosdorf.meteroid.ui.navigation.MeteroidTopBar
@Composable @Composable
fun PurchaseListScreen( fun PurchaseListScreen(
viewModel: PurchaseViewModel, viewModel: PurchaseViewModel,
onNavigate: (route: String) -> Unit = {} onNavigate: (String, NavOptions) -> Unit
) { ) {
val account by viewModel.account.collectAsState() val account by viewModel.account.collectAsState()
val purchases by viewModel.purchases.collectAsState() val purchases by viewModel.purchases.collectAsState()
...@@ -54,7 +55,7 @@ fun PurchaseListScreen( ...@@ -54,7 +55,7 @@ fun PurchaseListScreen(
bottomBar = { bottomBar = {
MeteroidBottomBar( MeteroidBottomBar(
currentRoute = HomeSections.HISTORY, currentRoute = HomeSections.HISTORY,
historyEnabled = account?.second?.audit == true, historyEnabled = account?.user?.audit == true,
navigateTo = onNavigate navigateTo = onNavigate
) )
} }
......
...@@ -27,12 +27,9 @@ package de.chaosdorf.meteroid.ui.purchases ...@@ -27,12 +27,9 @@ package de.chaosdorf.meteroid.ui.purchases
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import de.chaosdorf.meteroid.model.Drink import de.chaosdorf.meteroid.model.AccountInfo
import de.chaosdorf.meteroid.model.DrinkRepository import de.chaosdorf.meteroid.model.DrinkRepository
import de.chaosdorf.meteroid.model.Purchase
import de.chaosdorf.meteroid.model.PurchaseRepository import de.chaosdorf.meteroid.model.PurchaseRepository
import de.chaosdorf.meteroid.model.Server
import de.chaosdorf.meteroid.model.User
import de.chaosdorf.meteroid.sync.AccountProvider import de.chaosdorf.meteroid.sync.AccountProvider
import de.chaosdorf.meteroid.sync.PurchaseSyncHandler import de.chaosdorf.meteroid.sync.PurchaseSyncHandler
import de.chaosdorf.meteroid.sync.SyncHandler import de.chaosdorf.meteroid.sync.SyncHandler
...@@ -53,47 +50,51 @@ class PurchaseViewModel @Inject constructor( ...@@ -53,47 +50,51 @@ class PurchaseViewModel @Inject constructor(
drinkRepository: DrinkRepository, drinkRepository: DrinkRepository,
syncHandler: PurchaseSyncHandler syncHandler: PurchaseSyncHandler
) : ViewModel() { ) : ViewModel() {
val account: StateFlow<Pair<Server, User?>?> = accountProvider.account val account: StateFlow<AccountInfo?> = accountProvider.account
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null) .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null)
val purchases: StateFlow<List<Pair<Purchase, Drink?>>> = accountProvider.account val purchases: StateFlow<List<PurchaseInfo>> = accountProvider.account
.flatMapLatest { account -> .flatMapLatest { account ->
account?.let { (server, user) -> account?.let { (server, maybeUser) ->
user?.let { user -> maybeUser?.let { user ->
combine( combine(
repository.getAllFlow(server.serverId, user.userId), repository.getAllFlow(server.serverId, user.userId),
drinkRepository.getAllFlow(server.serverId) drinkRepository.getAllFlow(server.serverId)
) { purchases, drinks -> ) { purchases, drinks ->
purchases.map { purchase -> purchases.map { purchase ->
Pair(purchase, drinks.firstOrNull { drink -> drink.drinkId == purchase.drinkId }) PurchaseInfo(
purchase,
drinks.firstOrNull { drink -> drink.drinkId == purchase.drinkId }
)
} }
} }
} }
} ?: flowOf(emptyList()) } ?: flowOf(emptyList())
}.mapLatest { list -> }.mapLatest { list ->
list.mergeAdjecentDeposits() list.mergeAdjecentDeposits()
.filter { it.second != null || it.first.difference != 0.0 } .filter { it.drink != null || it.purchase.difference != 0.0 }
}.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), emptyList()) }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), emptyList())
val syncState: StateFlow<SyncHandler.State> = syncHandler.state val syncState: StateFlow<SyncHandler.State> = syncHandler.state
} }
fun List<Pair<Purchase, Drink?>>.mergeAdjecentDeposits(): List<Pair<Purchase, Drink?>> { fun List<PurchaseInfo>.mergeAdjecentDeposits(): List<PurchaseInfo> {
val result = mutableListOf<Pair<Purchase, Drink?>>() val result = mutableListOf<PurchaseInfo>()
for (entry in this) { for (entry in this) {
val previous = result.lastOrNull() val previous = result.lastOrNull()
if (previous != null if (previous != null
&& previous.first.difference > 0 && previous.purchase.difference > 0
&& entry.first.difference > 0 && entry.purchase.difference > 0
&& previous.second == null && previous.drink == null
&& entry.second == null && entry.drink == null
&& entry.first.createdAt.minus(previous.first.createdAt) < 5.minutes && entry.purchase.createdAt.minus(previous.purchase.createdAt) < 5.minutes
) { ) {
result.removeLast() result.removeLast()
result.add( result.add(
Pair( entry.copy(
entry.first.copy(difference = entry.first.difference + previous.first.difference), purchase = entry.purchase.copy(
null difference = entry.purchase.difference + previous.purchase.difference
)
) )
) )
} else { } else {
......
...@@ -68,13 +68,13 @@ fun UserListScreen( ...@@ -68,13 +68,13 @@ fun UserListScreen(
TopAppBar( TopAppBar(
title = { title = {
Text( Text(
server?.first?.name server?.server?.name
?: "Meteroid" ?: "Meteroid"
) )
}, },
navigationIcon = { navigationIcon = {
AsyncImage( AsyncImage(
server?.first?.logoUrl, server?.server?.logoUrl,
contentDescription = "User List", contentDescription = "User List",
contentScale = ContentScale.Crop, contentScale = ContentScale.Crop,
modifier = Modifier modifier = Modifier
......
...@@ -27,6 +27,7 @@ package de.chaosdorf.meteroid.ui.users ...@@ -27,6 +27,7 @@ package de.chaosdorf.meteroid.ui.users
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import de.chaosdorf.meteroid.model.AccountInfo
import de.chaosdorf.meteroid.model.Server import de.chaosdorf.meteroid.model.Server
import de.chaosdorf.meteroid.model.User import de.chaosdorf.meteroid.model.User
import de.chaosdorf.meteroid.model.UserRepository import de.chaosdorf.meteroid.model.UserRepository
...@@ -46,7 +47,7 @@ class UserListViewModel @Inject constructor( ...@@ -46,7 +47,7 @@ class UserListViewModel @Inject constructor(
repository: UserRepository, repository: UserRepository,
syncHandler: UserSyncHandler syncHandler: UserSyncHandler
) : ViewModel() { ) : ViewModel() {
val account: StateFlow<Pair<Server, User?>?> = accountProvider.account val account: StateFlow<AccountInfo?> = accountProvider.account
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null) .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null)
val users: StateFlow<List<User>> = accountProvider.account val users: StateFlow<List<User>> = accountProvider.account
......
[versions] [versions]
androidGradlePlugin = "8.1.2" androidGradlePlugin = "8.1.3"
androidx-activity = "1.8.0" androidx-activity = "1.8.0"
androidx-appcompat = "1.6.1" androidx-appcompat = "1.6.1"
androidx-compose-bom = "2023.10.01" androidx-compose-bom = "2023.10.01"
androidx-compose-compiler = "1.5.3" androidx-compose-compiler = "1.5.4"
androidx-compose-material = "1.5.0-alpha04" androidx-compose-material = "1.5.0-alpha04"
androidx-compose-material3 = "1.2.0-alpha10" androidx-compose-material3 = "1.2.0-alpha10"
androidx-compose-runtimetracing = "1.0.0-alpha04" androidx-compose-runtimetracing = "1.0.0-alpha04"
androidx-compose-tooling = "1.6.0-alpha08" androidx-compose-tooling = "1.6.0-alpha08"
androidx-datastore = "1.0.0" androidx-datastore = "1.0.0"
androidx-hilt = "1.0.0" androidx-hilt = "1.1.0"
androidx-navigation = "2.7.5" androidx-navigation = "2.7.5"
androidx-room = "2.6.0" androidx-room = "2.6.0"
coil = "2.4.0" coil = "2.4.0"
dagger-hilt = "2.48.1" dagger-hilt = "2.48.1"
desugar-jdk = "2.0.4" desugar-jdk = "2.0.4"
kotlin = "1.9.10" kotlin = "1.9.20"
kotlin-ksp = "1.9.10-1.0.13" kotlin-ksp = "1.9.20-1.0.14"
kotlinxCoroutines = "1.7.1" kotlinxCoroutines = "1.7.1"
kotlinxDatetime = "0.4.0" kotlinxDatetime = "0.4.0"
kotlinxSerializationJson = "1.5.1" kotlinxSerializationJson = "1.5.1"
......
/*
* The MIT License (MIT)
*
* Copyright (c) 2013-2023 Chaosdorf e.V.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package de.chaosdorf.meteroid.model
data class AccountInfo(
val server: Server,
val user: User?
)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment