ref: Rename package ch.parano.myice to ch.parano.myicek
Complete the MyIceK rename by updating the Kotlin package from ch.parano.myice to ch.parano.myicek across all source sets (androidMain, commonMain, desktopMain, iosMain, commonTest), the build.gradle.kts (namespace, applicationId, mainClass, desktop packageName) and the iOS Info.plist bundle URL name. The myice:// OAuth scheme is kept unchanged as it depends on the backend. Also add pull-to-refresh to ScheduleScreen using Material 3 PullToRefreshBox, replacing the manual loading overlay.
This commit is contained in:
+14
-14
@@ -15,7 +15,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package ch.parano.myice
|
||||
package ch.parano.myicek
|
||||
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
@@ -24,19 +24,19 @@ import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.setValue
|
||||
import ch.parano.myice.auth.AuthSettings
|
||||
import ch.parano.myice.auth.OAuthClient
|
||||
import ch.parano.myice.cache.ScheduleCache
|
||||
import ch.parano.myice.network.ApiService
|
||||
import ch.parano.myice.network.createHttpClient
|
||||
import ch.parano.myice.ui.screens.EventDetailScreen
|
||||
import ch.parano.myice.ui.screens.LoginScreen
|
||||
import ch.parano.myice.ui.screens.ScheduleScreen
|
||||
import ch.parano.myice.ui.theme.MyIceTheme
|
||||
import ch.parano.myice.viewmodel.AuthState
|
||||
import ch.parano.myice.viewmodel.AuthViewModel
|
||||
import ch.parano.myice.viewmodel.EventDetailViewModel
|
||||
import ch.parano.myice.viewmodel.ScheduleViewModel
|
||||
import ch.parano.myicek.auth.AuthSettings
|
||||
import ch.parano.myicek.auth.OAuthClient
|
||||
import ch.parano.myicek.cache.ScheduleCache
|
||||
import ch.parano.myicek.network.ApiService
|
||||
import ch.parano.myicek.network.createHttpClient
|
||||
import ch.parano.myicek.ui.screens.EventDetailScreen
|
||||
import ch.parano.myicek.ui.screens.LoginScreen
|
||||
import ch.parano.myicek.ui.screens.ScheduleScreen
|
||||
import ch.parano.myicek.ui.theme.MyIceTheme
|
||||
import ch.parano.myicek.viewmodel.AuthState
|
||||
import ch.parano.myicek.viewmodel.AuthViewModel
|
||||
import ch.parano.myicek.viewmodel.EventDetailViewModel
|
||||
import ch.parano.myicek.viewmodel.ScheduleViewModel
|
||||
import com.russhwolf.settings.Settings
|
||||
|
||||
sealed class Screen {
|
||||
+2
-2
@@ -15,9 +15,9 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package ch.parano.myice.auth
|
||||
package ch.parano.myicek.auth
|
||||
|
||||
import ch.parano.myice.network.AuthTokenHolder
|
||||
import ch.parano.myicek.network.AuthTokenHolder
|
||||
import com.russhwolf.settings.Settings
|
||||
|
||||
class AuthSettings(private val settings: Settings) {
|
||||
+1
-1
@@ -15,7 +15,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package ch.parano.myice.auth
|
||||
package ch.parano.myicek.auth
|
||||
|
||||
interface OAuthClient {
|
||||
fun redirectUri(): String
|
||||
+1
-1
@@ -15,7 +15,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package ch.parano.myice.auth
|
||||
package ch.parano.myicek.auth
|
||||
|
||||
internal fun parseAccessTokenFromFragment(fragment: String): String? {
|
||||
val params = fragment.split("&").associate { pair ->
|
||||
+2
-2
@@ -15,9 +15,9 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package ch.parano.myice.cache
|
||||
package ch.parano.myicek.cache
|
||||
|
||||
import ch.parano.myice.models.Event
|
||||
import ch.parano.myicek.models.Event
|
||||
import com.russhwolf.settings.Settings
|
||||
import kotlin.time.Clock
|
||||
import kotlin.time.ExperimentalTime
|
||||
+2
-2
@@ -15,9 +15,9 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package ch.parano.myice.filter
|
||||
package ch.parano.myicek.filter
|
||||
|
||||
import ch.parano.myice.models.Event
|
||||
import ch.parano.myicek.models.Event
|
||||
|
||||
fun extractSubgroup(name: String): String {
|
||||
val parts = name.split(" - ")
|
||||
+1
-1
@@ -15,7 +15,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package ch.parano.myice.filter
|
||||
package ch.parano.myicek.filter
|
||||
|
||||
enum class TypeFilter {
|
||||
ALL, GAMES, PRACTICES;
|
||||
+1
-1
@@ -15,7 +15,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package ch.parano.myice.models
|
||||
package ch.parano.myicek.models
|
||||
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
+1
-1
@@ -15,7 +15,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package ch.parano.myice.models
|
||||
package ch.parano.myicek.models
|
||||
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
+1
-1
@@ -15,7 +15,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package ch.parano.myice.models
|
||||
package ch.parano.myicek.models
|
||||
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
+1
-1
@@ -15,7 +15,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package ch.parano.myice.models
|
||||
package ch.parano.myicek.models
|
||||
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
+1
-1
@@ -15,7 +15,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package ch.parano.myice.models
|
||||
package ch.parano.myicek.models
|
||||
|
||||
import kotlinx.serialization.KSerializer
|
||||
import kotlinx.serialization.SerializationException
|
||||
+1
-1
@@ -15,7 +15,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package ch.parano.myice.models
|
||||
package ch.parano.myicek.models
|
||||
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
+1
-1
@@ -15,7 +15,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package ch.parano.myice.models
|
||||
package ch.parano.myicek.models
|
||||
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
+1
-1
@@ -15,7 +15,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package ch.parano.myice.models
|
||||
package ch.parano.myicek.models
|
||||
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
+1
-1
@@ -15,7 +15,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package ch.parano.myice.network
|
||||
package ch.parano.myicek.network
|
||||
|
||||
object ApiConfig {
|
||||
const val baseUrl = "https://myice.parano.ch"
|
||||
+1
-1
@@ -15,7 +15,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package ch.parano.myice.network
|
||||
package ch.parano.myicek.network
|
||||
|
||||
import io.ktor.client.HttpClient
|
||||
import io.ktor.client.engine.HttpClientEngineConfig
|
||||
+5
-5
@@ -15,12 +15,12 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package ch.parano.myice.network
|
||||
package ch.parano.myicek.network
|
||||
|
||||
import ch.parano.myice.models.Account
|
||||
import ch.parano.myice.models.Event
|
||||
import ch.parano.myice.models.EventDetail
|
||||
import ch.parano.myice.models.UserInfo
|
||||
import ch.parano.myicek.models.Account
|
||||
import ch.parano.myicek.models.Event
|
||||
import ch.parano.myicek.models.EventDetail
|
||||
import ch.parano.myicek.models.UserInfo
|
||||
import io.ktor.client.HttpClient
|
||||
import io.ktor.client.call.body
|
||||
import io.ktor.client.request.get
|
||||
+1
-1
@@ -15,7 +15,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package ch.parano.myice.network
|
||||
package ch.parano.myicek.network
|
||||
|
||||
object AuthTokenHolder {
|
||||
var token: String? = null
|
||||
+1
-1
@@ -15,7 +15,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package ch.parano.myice.ui
|
||||
package ch.parano.myicek.ui
|
||||
|
||||
import androidx.compose.runtime.Composable
|
||||
|
||||
+3
-3
@@ -15,7 +15,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package ch.parano.myice.ui.components
|
||||
package ch.parano.myicek.ui.components
|
||||
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
@@ -33,8 +33,8 @@ import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.unit.dp
|
||||
import ch.parano.myice.models.Event
|
||||
import ch.parano.myice.util.formatEventDateTime
|
||||
import ch.parano.myicek.models.Event
|
||||
import ch.parano.myicek.util.formatEventDateTime
|
||||
|
||||
@Composable
|
||||
fun EventCard(
|
||||
+1
-1
@@ -15,7 +15,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package ch.parano.myice.ui.components
|
||||
package ch.parano.myicek.ui.components
|
||||
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.material3.DropdownMenuItem
|
||||
+1
-1
@@ -15,7 +15,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package ch.parano.myice.ui.components
|
||||
package ch.parano.myicek.ui.components
|
||||
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
+6
-6
@@ -15,7 +15,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package ch.parano.myice.ui.screens
|
||||
package ch.parano.myicek.ui.screens
|
||||
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.Column
|
||||
@@ -45,11 +45,11 @@ import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.unit.dp
|
||||
import ch.parano.myice.ui.PlatformBackHandler
|
||||
import ch.parano.myice.ui.components.LoadingIndicator
|
||||
import ch.parano.myice.util.formatEventDate
|
||||
import ch.parano.myice.util.formatEventTimeRange
|
||||
import ch.parano.myice.viewmodel.EventDetailViewModel
|
||||
import ch.parano.myicek.ui.PlatformBackHandler
|
||||
import ch.parano.myicek.ui.components.LoadingIndicator
|
||||
import ch.parano.myicek.util.formatEventDate
|
||||
import ch.parano.myicek.util.formatEventTimeRange
|
||||
import ch.parano.myicek.viewmodel.EventDetailViewModel
|
||||
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Composable
|
||||
+3
-3
@@ -15,7 +15,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package ch.parano.myice.ui.screens
|
||||
package ch.parano.myicek.ui.screens
|
||||
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.Column
|
||||
@@ -39,8 +39,8 @@ import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.unit.dp
|
||||
import ch.parano.myice.viewmodel.AuthViewModel
|
||||
import ch.parano.myice.viewmodel.AuthState
|
||||
import ch.parano.myicek.viewmodel.AuthViewModel
|
||||
import ch.parano.myicek.viewmodel.AuthState
|
||||
|
||||
@Composable
|
||||
fun LoginScreen(
|
||||
+12
-27
@@ -15,7 +15,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package ch.parano.myice.ui.screens
|
||||
package ch.parano.myicek.ui.screens
|
||||
|
||||
import androidx.compose.animation.AnimatedVisibility
|
||||
import androidx.compose.animation.expandVertically
|
||||
@@ -31,7 +31,7 @@ import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.lazy.LazyColumn
|
||||
import androidx.compose.foundation.lazy.items
|
||||
import androidx.compose.material3.Card
|
||||
import androidx.compose.material3.CircularProgressIndicator
|
||||
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
|
||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
@@ -53,12 +53,12 @@ import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.height
|
||||
import ch.parano.myice.filter.TypeFilter
|
||||
import ch.parano.myice.ui.components.EventCard
|
||||
import ch.parano.myice.ui.components.FilterDropdown
|
||||
import ch.parano.myice.ui.components.LoadingIndicator
|
||||
import ch.parano.myice.viewmodel.AuthViewModel
|
||||
import ch.parano.myice.viewmodel.ScheduleViewModel
|
||||
import ch.parano.myicek.filter.TypeFilter
|
||||
import ch.parano.myicek.ui.components.EventCard
|
||||
import ch.parano.myicek.ui.components.FilterDropdown
|
||||
import ch.parano.myicek.ui.components.LoadingIndicator
|
||||
import ch.parano.myicek.viewmodel.AuthViewModel
|
||||
import ch.parano.myicek.viewmodel.ScheduleViewModel
|
||||
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Composable
|
||||
@@ -82,7 +82,7 @@ fun ScheduleScreen(
|
||||
TopAppBar(
|
||||
title = { Text("MyIceK") },
|
||||
actions = {
|
||||
val email = (authState as? ch.parano.myice.viewmodel.AuthState.Authenticated)?.email
|
||||
val email = (authState as? ch.parano.myicek.viewmodel.AuthState.Authenticated)?.email
|
||||
if (email != null) {
|
||||
Text(
|
||||
text = email,
|
||||
@@ -201,7 +201,9 @@ fun ScheduleScreen(
|
||||
}
|
||||
}
|
||||
}
|
||||
Box(
|
||||
PullToRefreshBox(
|
||||
isRefreshing = scheduleState.isRefreshing,
|
||||
onRefresh = { scheduleViewModel.refreshSchedule() },
|
||||
modifier = Modifier.fillMaxSize(),
|
||||
contentAlignment = Alignment.Center,
|
||||
) {
|
||||
@@ -259,23 +261,6 @@ fun ScheduleScreen(
|
||||
}
|
||||
}
|
||||
}
|
||||
if (scheduleState.isRefreshing) {
|
||||
Box(
|
||||
modifier = Modifier.fillMaxSize(),
|
||||
contentAlignment = Alignment.Center,
|
||||
) {
|
||||
Card {
|
||||
Column(
|
||||
modifier = Modifier.padding(32.dp),
|
||||
horizontalAlignment = Alignment.CenterHorizontally,
|
||||
) {
|
||||
CircularProgressIndicator()
|
||||
Spacer(modifier = Modifier.height(16.dp))
|
||||
Text("Chargement...", fontWeight = FontWeight.Medium)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -15,7 +15,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package ch.parano.myice.ui.theme
|
||||
package ch.parano.myicek.ui.theme
|
||||
|
||||
import androidx.compose.foundation.isSystemInDarkTheme
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
+6
-2
@@ -15,7 +15,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package ch.parano.myice.util
|
||||
package ch.parano.myicek.util
|
||||
|
||||
import kotlinx.datetime.LocalDateTime
|
||||
|
||||
@@ -24,6 +24,10 @@ private val FRENCH_MONTHS = listOf(
|
||||
"juillet", "août", "septembre", "octobre", "novembre", "décembre",
|
||||
)
|
||||
|
||||
private val FRENCH_DAYS = listOf(
|
||||
"Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche",
|
||||
)
|
||||
|
||||
private fun parseOrNull(iso: String): LocalDateTime? = runCatching {
|
||||
LocalDateTime.parse(iso.replace(' ', 'T'))
|
||||
}.getOrNull()
|
||||
@@ -32,7 +36,7 @@ private fun LocalDateTime.dateStr(): String =
|
||||
"${year.toString().padStart(4, '0')}-${monthNumber.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}"
|
||||
|
||||
private fun LocalDateTime.dateStrLong(): String =
|
||||
"$day ${FRENCH_MONTHS[monthNumber - 1]} $year"
|
||||
"${FRENCH_DAYS[date.dayOfWeek.ordinal]} $day ${FRENCH_MONTHS[monthNumber - 1]} $year"
|
||||
|
||||
private fun LocalDateTime.timeStr(): String =
|
||||
if (minute == 0) "${hour}h" else "${hour}h${minute.toString().padStart(2, '0')}"
|
||||
+6
-6
@@ -15,13 +15,13 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package ch.parano.myice.viewmodel
|
||||
package ch.parano.myicek.viewmodel
|
||||
|
||||
import ch.parano.myice.auth.AuthSettings
|
||||
import ch.parano.myice.auth.OAuthClient
|
||||
import ch.parano.myice.network.ApiConfig
|
||||
import ch.parano.myice.network.ApiService
|
||||
import ch.parano.myice.network.AuthTokenHolder
|
||||
import ch.parano.myicek.auth.AuthSettings
|
||||
import ch.parano.myicek.auth.OAuthClient
|
||||
import ch.parano.myicek.network.ApiConfig
|
||||
import ch.parano.myicek.network.ApiService
|
||||
import ch.parano.myicek.network.AuthTokenHolder
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
+3
-3
@@ -15,10 +15,10 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package ch.parano.myice.viewmodel
|
||||
package ch.parano.myicek.viewmodel
|
||||
|
||||
import ch.parano.myice.models.EventDetail
|
||||
import ch.parano.myice.network.ApiService
|
||||
import ch.parano.myicek.models.EventDetail
|
||||
import ch.parano.myicek.network.ApiService
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
+10
-10
@@ -15,17 +15,17 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package ch.parano.myice.viewmodel
|
||||
package ch.parano.myicek.viewmodel
|
||||
|
||||
import ch.parano.myice.auth.AuthSettings
|
||||
import ch.parano.myice.cache.ScheduleCache
|
||||
import ch.parano.myice.filter.TypeFilter
|
||||
import ch.parano.myice.filter.distinctAgegroups
|
||||
import ch.parano.myice.filter.distinctSubgroups
|
||||
import ch.parano.myice.filter.filterEvents
|
||||
import ch.parano.myice.models.Account
|
||||
import ch.parano.myice.models.Event
|
||||
import ch.parano.myice.network.ApiService
|
||||
import ch.parano.myicek.auth.AuthSettings
|
||||
import ch.parano.myicek.cache.ScheduleCache
|
||||
import ch.parano.myicek.filter.TypeFilter
|
||||
import ch.parano.myicek.filter.distinctAgegroups
|
||||
import ch.parano.myicek.filter.distinctSubgroups
|
||||
import ch.parano.myicek.filter.filterEvents
|
||||
import ch.parano.myicek.models.Account
|
||||
import ch.parano.myicek.models.Event
|
||||
import ch.parano.myicek.network.ApiService
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
Reference in New Issue
Block a user