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:
@@ -83,11 +83,11 @@ kotlin {
|
||||
}
|
||||
|
||||
android {
|
||||
namespace = "ch.parano.myice"
|
||||
namespace = "ch.parano.myicek"
|
||||
compileSdk = 36
|
||||
|
||||
defaultConfig {
|
||||
applicationId = "ch.parano.myice"
|
||||
applicationId = "ch.parano.myicek"
|
||||
minSdk = 24
|
||||
targetSdk = 35
|
||||
versionCode = 1
|
||||
@@ -118,10 +118,10 @@ android {
|
||||
|
||||
compose.desktop {
|
||||
application {
|
||||
mainClass = "ch.parano.myice.MainKt"
|
||||
mainClass = "ch.parano.myicek.MainKt"
|
||||
nativeDistributions {
|
||||
targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb)
|
||||
packageName = "myice"
|
||||
packageName = "myicek"
|
||||
packageVersion = "1.0.0"
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -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
|
||||
package ch.parano.myicek
|
||||
|
||||
import android.os.Bundle
|
||||
import androidx.activity.ComponentActivity
|
||||
import androidx.activity.compose.setContent
|
||||
import androidx.activity.enableEdgeToEdge
|
||||
import ch.parano.myice.auth.AndroidOAuthClient
|
||||
import ch.parano.myicek.auth.AndroidOAuthClient
|
||||
|
||||
class MainActivity : ComponentActivity() {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
+2
-2
@@ -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
|
||||
package ch.parano.myicek
|
||||
|
||||
import android.app.Activity
|
||||
import android.net.Uri
|
||||
import android.os.Bundle
|
||||
import ch.parano.myice.auth.OAuthCallbackHolder
|
||||
import ch.parano.myicek.auth.OAuthCallbackHolder
|
||||
|
||||
class OAuthCallbackActivity : Activity() {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
+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
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
+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.engine.HttpClientEngineConfig
|
||||
import io.ktor.client.engine.HttpClientEngineFactory
|
||||
+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.activity.compose.BackHandler
|
||||
import androidx.compose.runtime.Composable
|
||||
+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
|
||||
+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.MapSettings
|
||||
import com.russhwolf.settings.Settings
|
||||
import kotlin.test.Test
|
||||
+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
|
||||
import kotlin.test.Test
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
+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.json.Json
|
||||
import kotlin.test.Test
|
||||
+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.network
|
||||
package ch.parano.myicek.network
|
||||
|
||||
import ch.parano.myice.models.EventDetail
|
||||
import ch.parano.myicek.models.EventDetail
|
||||
import io.ktor.client.HttpClient
|
||||
import io.ktor.client.engine.mock.MockEngine
|
||||
import io.ktor.client.engine.mock.respond
|
||||
+10
-4
@@ -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 kotlin.test.Test
|
||||
import kotlin.test.assertEquals
|
||||
@@ -28,7 +28,7 @@ class EventDateTimeFormatterTest {
|
||||
start = "2024-11-10T14:00:00",
|
||||
end = "2024-11-10T16:15:00",
|
||||
)
|
||||
assertEquals("10 novembre 2024 de 14h à 16h15", formatted)
|
||||
assertEquals("Dimanche 10 novembre 2024 de 14h à 16h15", formatted)
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -37,7 +37,7 @@ class EventDateTimeFormatterTest {
|
||||
start = "2026-08-09 10:00:00",
|
||||
end = "2026-08-09 12:00:00",
|
||||
)
|
||||
assertEquals("9 août 2026 de 10h à 12h", formatted)
|
||||
assertEquals("Dimanche 9 août 2026 de 10h à 12h", formatted)
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -46,7 +46,7 @@ class EventDateTimeFormatterTest {
|
||||
start = "2024-11-10T20:00:00",
|
||||
end = "2024-11-11T01:30:00",
|
||||
)
|
||||
assertEquals("10 novembre 2024 de 20h à 1h30 (11 novembre 2024)", formatted)
|
||||
assertEquals("Dimanche 10 novembre 2024 de 20h à 1h30 (Lundi 11 novembre 2024)", formatted)
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -66,4 +66,10 @@ class EventDateTimeFormatterTest {
|
||||
val formatted = formatEventDateTime(start = "s", end = "e")
|
||||
assertEquals("s - e", formatted)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun formatsEventDateWithDayOfWeek() {
|
||||
val formatted = formatEventDate("2026-08-09T10:00:00")
|
||||
assertEquals("Dimanche 9 août 2026", formatted)
|
||||
}
|
||||
}
|
||||
+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.cache.ScheduleCache
|
||||
import ch.parano.myice.filter.TypeFilter
|
||||
import ch.parano.myice.models.Account
|
||||
import ch.parano.myice.models.Event
|
||||
import ch.parano.myice.network.ApiService
|
||||
import ch.parano.myicek.cache.ScheduleCache
|
||||
import ch.parano.myicek.filter.TypeFilter
|
||||
import ch.parano.myicek.models.Account
|
||||
import ch.parano.myicek.models.Event
|
||||
import ch.parano.myicek.network.ApiService
|
||||
import com.russhwolf.settings.MapSettings
|
||||
import io.ktor.client.HttpClient
|
||||
import io.ktor.client.engine.mock.MockEngine
|
||||
+2
-2
@@ -15,11 +15,11 @@
|
||||
// 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.ui.window.Window
|
||||
import androidx.compose.ui.window.application
|
||||
import ch.parano.myice.auth.DesktopOAuthClient
|
||||
import ch.parano.myicek.auth.DesktopOAuthClient
|
||||
|
||||
fun main() = application {
|
||||
Window(onCloseRequest = ::exitApplication, title = "MyIceK") {
|
||||
+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
|
||||
|
||||
import kotlinx.coroutines.CompletableDeferred
|
||||
import kotlinx.coroutines.TimeoutCancellationException
|
||||
+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.engine.HttpClientEngineConfig
|
||||
import io.ktor.client.engine.HttpClientEngineFactory
|
||||
+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
|
||||
|
||||
+2
-2
@@ -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
|
||||
package ch.parano.myicek
|
||||
|
||||
import androidx.compose.ui.window.ComposeUIViewController
|
||||
import ch.parano.myice.auth.IosOAuthClient
|
||||
import ch.parano.myicek.auth.IosOAuthClient
|
||||
|
||||
fun MainViewController() = ComposeUIViewController {
|
||||
App(oauthClient = IosOAuthClient())
|
||||
+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
|
||||
|
||||
import kotlinx.cinterop.ExperimentalForeignApi
|
||||
import kotlinx.coroutines.TimeoutCancellationException
|
||||
+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.engine.HttpClientEngineConfig
|
||||
import io.ktor.client.engine.HttpClientEngineFactory
|
||||
+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
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
<array>
|
||||
<dict>
|
||||
<key>CFBundleURLName</key>
|
||||
<string>ch.parano.myice</string>
|
||||
<string>ch.parano.myicek</string>
|
||||
<key>CFBundleURLSchemes</key>
|
||||
<array>
|
||||
<string>myice</string>
|
||||
|
||||
Reference in New Issue
Block a user