From 6d51dbbbda133f582b5421ef813c534b29452593 Mon Sep 17 00:00:00 2001 From: Danielle Voznyy Date: Fri, 25 Oct 2024 16:07:37 -0400 Subject: [PATCH] chore: Bump dependencies fix: Disable task groups, they are causing recomposition issues that lead to empty lists sometimes chore: Switch to short month names to better fit smaller screens --- app-android/build.gradle.kts | 4 +- .../src/main/res/xml/widget_quickadd.xml | 5 - app-common/build.gradle.kts | 2 +- .../tasks/tasks/ui/elements/list/TaskList.kt | 115 +++++++++--------- .../tasks/ui/elements/list/TaskListTitle.kt | 4 +- gradle.properties | 2 +- gradle/libs.versions.toml | 37 +++--- 7 files changed, 78 insertions(+), 91 deletions(-) delete mode 100644 app-android/src/main/res/xml/widget_quickadd.xml diff --git a/app-android/build.gradle.kts b/app-android/build.gradle.kts index 07a6b8f..aa98536 100644 --- a/app-android/build.gradle.kts +++ b/app-android/build.gradle.kts @@ -12,8 +12,8 @@ dependencies { implementation(libs.androidx.activity.compose) // implementation(libs.androidx.glance.appwidget) // implementation(libs.androidx.glance.material3) - implementation("androidx.glance:glance-appwidget:1.0.0") - implementation("androidx.glance:glance-material3:1.0.0") +// implementation("androidx.glance:glance-appwidget:1.1.1") +// implementation("androidx.glance:glance-material3:1.1.1") implementation(libs.kotlin.multiplatform.appdirs) implementation(libs.koin.android) implementation(libs.androidx.startup.runtime) diff --git a/app-android/src/main/res/xml/widget_quickadd.xml b/app-android/src/main/res/xml/widget_quickadd.xml deleted file mode 100644 index 4d6e4bc..0000000 --- a/app-android/src/main/res/xml/widget_quickadd.xml +++ /dev/null @@ -1,5 +0,0 @@ - - diff --git a/app-common/build.gradle.kts b/app-common/build.gradle.kts index d4e3a77..8b08674 100644 --- a/app-common/build.gradle.kts +++ b/app-common/build.gradle.kts @@ -55,7 +55,7 @@ kotlin { implementation(libs.uuid) implementation(libs.ktor.client.core) - implementation(libs.ktor.serialization.json.eap) + implementation(libs.ktor.serialization.json) implementation(libs.ktor.client.content.negotiation) implementation(libs.ktor.client.auth) implementation(libs.multiplatform.settings) diff --git a/app-common/src/commonMain/kotlin/me/dvyy/tasks/tasks/ui/elements/list/TaskList.kt b/app-common/src/commonMain/kotlin/me/dvyy/tasks/tasks/ui/elements/list/TaskList.kt index c16806a..e9c93ac 100644 --- a/app-common/src/commonMain/kotlin/me/dvyy/tasks/tasks/ui/elements/list/TaskList.kt +++ b/app-common/src/commonMain/kotlin/me/dvyy/tasks/tasks/ui/elements/list/TaskList.kt @@ -1,6 +1,5 @@ package me.dvyy.tasks.tasks.ui.elements.list -import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.draganddrop.dragAndDropTarget import androidx.compose.foundation.layout.* @@ -76,81 +75,77 @@ fun TaskList( key = listId, ) val tasks = tasks.loadedOrNull() ?: return@Column +// println("Loading ${listId.date} with ${tasks.size}") val scrollState = rememberScrollState() val scrollModifier = if (scrollable) Modifier.verticalScroll(scrollState) else Modifier - // Split into two lists based on filter -// val (shown, incompleteTasks) = tasks.partition { it.state.completed } - fun String.isGroupToggle() = startsWith("--") || startsWith("==") - Column( - modifier = Modifier - ) { + Column { val selectedTask by viewModel.selectedTask.collectAsState() - val groupedTasks = mutableListOf(mutableListOf()) - tasks.forEach { task -> - if (task.state.text.isGroupToggle()) groupedTasks.add(mutableListOf(task)) - else groupedTasks.lastOrNull()?.add(task) - } +// val groupedTasks = mutableListOf(mutableListOf()) +// tasks.forEach { task -> +// if (task.state.text.isGroupToggle()) groupedTasks.add(mutableListOf(task)) +// else groupedTasks.lastOrNull()?.add(task) +// } Column(scrollModifier.padding(horizontal = 6.dp)) { - groupedTasks.forEachIndexed { groupIndex, tasksInGroup -> - var isGroupHidden by remember { mutableStateOf(tasksInGroup.firstOrNull()?.state?.completed == true) } - tasksInGroup.forEachIndexed { index, task -> - key(task.uuid) { - val selected = selectedTask?.taskId == task.uuid - val focusRequested = selected && selectedTask?.requestFocus == true +// groupedTasks.forEachIndexed { groupIndex, tasksInGroup -> +// var isGroupHidden by remember { mutableStateOf(tasksInGroup.firstOrNull()?.state?.completed == true) } + tasks.forEachIndexed { index, task -> + key(task.uuid) { + val selected = selectedTask?.taskId == task.uuid + val focusRequested = selected && selectedTask?.requestFocus == true // val onChange = remember(task) { getInteractions(task) }::onTaskChanged - // cached task is the SSOT in this context, some things like text updates take too long to update in db - CachedUpdate( - key = task.uuid, - value = task.state, - onValueChanged = { viewModel.onTaskChanged(task.uuid, it) } - ) { cachedTask, setTask -> - val focusManager = LocalFocusManager.current - val keyboardOpen by keyboardAsState() - val isGroupToggle = index == 0 && cachedTask.text.isGroupToggle() + // cached task is the SSOT in this context, some things like text updates take too long to update in db + CachedUpdate( + key = task.uuid, + value = task.state, + onValueChanged = { viewModel.onTaskChanged(task.uuid, it) } + ) { cachedTask, setTask -> + val focusManager = LocalFocusManager.current + val keyboardOpen by keyboardAsState() + val isGroupToggle = index == 0 && cachedTask.text.isGroupToggle() - LaunchedEffect(cachedTask) { - if (isGroupToggle) isGroupHidden = cachedTask.completed - } +// LaunchedEffect(cachedTask) { +// if (isGroupToggle) isGroupHidden = cachedTask.completed +// } - LaunchedEffect(keyboardOpen) { - if (!keyboardOpen) { - focusManager.clearFocus() - } + LaunchedEffect(keyboardOpen) { + if (!keyboardOpen) { + focusManager.clearFocus() } + } - val taskInteractions = remember(cachedTask) { - viewModel.interactionsFor(task.uuid, listId, cachedTask, setTask) - } + val taskInteractions = remember(cachedTask) { + viewModel.interactionsFor(task.uuid, listId, cachedTask, setTask) + } - AnimatedVisibility(isGroupToggle || !isGroupHidden) { - Column { - ReorderableTask(key = task.uuid, reorderInteractions = reorderInteractions) { - Task( - cachedTask, - setTask, - selected, - taskInteractions, - focusRequested = focusRequested, - forceShowCheckbox = isGroupToggle, - overrideCheckboxIcon = if (isGroupToggle) AppIcons.ArrowDropDown else null, - overrideCheckboxCompletedIcon = if (isGroupToggle) AppIcons.ArrowDropUp else null, - ) - } - if (!isGroupToggle) HorizontalDivider() - } +// AnimatedVisibility(isGroupToggle || !isGroupHidden) { + Column { + ReorderableTask(key = task.uuid, reorderInteractions = reorderInteractions) { + Task( + cachedTask, + setTask, + selected, + taskInteractions, + focusRequested = focusRequested, + forceShowCheckbox = isGroupToggle, + overrideCheckboxIcon = if (isGroupToggle) AppIcons.ArrowDropDown else null, + overrideCheckboxCompletedIcon = if (isGroupToggle) AppIcons.ArrowDropUp else null, + ) } - - if (isGroupToggle) HorizontalDivider( - thickness = 2.dp, - color = cachedTask.highlight.color - .takeIf { it != Color.Transparent } - ?: MaterialTheme.colorScheme.onSurface - ) + if (!isGroupToggle) HorizontalDivider() } +// } + + if (isGroupToggle) HorizontalDivider( + thickness = 2.dp, + color = cachedTask.highlight.color + .takeIf { it != Color.Transparent } + ?: MaterialTheme.colorScheme.onSurface + ) +// } } } } diff --git a/app-common/src/commonMain/kotlin/me/dvyy/tasks/tasks/ui/elements/list/TaskListTitle.kt b/app-common/src/commonMain/kotlin/me/dvyy/tasks/tasks/ui/elements/list/TaskListTitle.kt index a87ad73..b499f49 100644 --- a/app-common/src/commonMain/kotlin/me/dvyy/tasks/tasks/ui/elements/list/TaskListTitle.kt +++ b/app-common/src/commonMain/kotlin/me/dvyy/tasks/tasks/ui/elements/list/TaskListTitle.kt @@ -22,6 +22,8 @@ import me.dvyy.tasks.model.TaskListProperties import me.dvyy.tasks.tasks.ui.CachedUpdate import me.dvyy.tasks.utils.Loadable import me.dvyy.tasks.utils.loadedOrNull +import java.time.format.TextStyle +import java.util.* @Composable fun TaskListTitle( @@ -46,7 +48,7 @@ fun TaskListTitle( if (props.date != null) { val date = props.date!! Text( - "${date.month.name.lowercase().capitalize()} ${date.dayOfMonth}", + "${date.month.getDisplayName(TextStyle.SHORT, Locale.getDefault()).lowercase().capitalize()} ${date.dayOfMonth}", Modifier.weight(1f, true), style = MaterialTheme.typography.headlineMedium, fontWeight = FontWeight.Bold, diff --git a/gradle.properties b/gradle.properties index d62115b..fb98688 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ group=me.dvyy -version=1.1.0-alpha.2 +version=1.1.0-alpha.3 org.jetbrains.compose.experimental.wasm.enabled=true kotlin.native.ignoreDisabledTargets=true kotlin.mpp.stability.nowarn=true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 03ee785..b248006 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,34 +3,31 @@ agp = "8.2.0" android-compileSdk = "34" android-minSdk = "24" android-targetSdk = "34" -androidx-activityCompose = "1.9.2" +androidx-activityCompose = "1.9.3" androidx-appcompat = "1.7.0" androidx-constraintlayout = "2.1.4" androidx-core-ktx = "1.13.1" androidx-espresso-core = "3.6.1" androidx-material = "1.12.0" androidx-test-junit = "1.2.1" -androidx-glance = "1.1.0-rc01" -compose = "1.7.0-beta02" -exposed = "0.51.1" +compose = "1.7.0" +exposed = "0.55.0" h2 = "2.2.224" hikaricp = "5.1.0" -jdbcDriver = "2.0.2" jib = "3.4.3" junit = "4.13.2" -koin = "4.0.0-RC2" -kotlin = "2.0.20" +koin = "4.0.0" +kotlin = "2.0.21" kotlinMultiplatformAppdirs = "1.2.0" -coroutines = "1.8.1" +coroutines = "1.9.0" kotest = "5.9.1" kotlinResult = "2.0.0" kotlinxDatetime = "0.6.1" -kotlinxSerialization = "1.7.2" -ktor = "2.3.12" -ktor-eap = "3.0.0-rc-1" -lifecycleViewmodelCompose = "2.8.0-beta02" -logback = "1.5.7" -foundationAndroid = "1.7.2" +kotlinxSerialization = "1.7.3" +ktor = "3.0.0" +lifecycleViewmodelCompose = "2.8.0" +logback = "1.5.9" +foundationAndroid = "1.7.4" material3WindowSizeClassMultiplatform = "0.5.0" multiplatformSettings = "1.2.0" postgresql = "42.7.4" @@ -39,7 +36,6 @@ uuid = "0.8.4" navigationCompose = "2.7.0-alpha03" slf4j = "2.0.9" sqlDelight = "2.1.0-SNAPSHOT" -oidc = "0.10.0" colorpicker = "1.1.0" startupRuntime = "1.2.0" workRuntimeKtx = "2.9.1" @@ -91,12 +87,11 @@ kotest-property = { module = "io.kotest:kotest-property", version.ref = "kotest" kotest-runner-junit5 = { module = "io.kotest:kotest-runner-junit5", version.ref = "kotest" } ktor-server-core = { module = "io.ktor:ktor-server-core-jvm", version.ref = "ktor" } ktor-server-netty = { module = "io.ktor:ktor-server-netty-jvm", version.ref = "ktor" } -ktor-client-auth = { module = "io.ktor:ktor-client-auth", version.ref = "ktor-eap" } -ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor-eap" } -ktor-client-okhttp = { module = "io.ktor:ktor-client-okhttp", version.ref = "ktor-eap" } -ktor-client-darwin = { module = "io.ktor:ktor-client-darwin", version.ref = "ktor-eap" } -ktor-client-content-negotiation = { module = "io.ktor:ktor-client-content-negotiation", version.ref = "ktor-eap" } -ktor-serialization-json-eap = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor-eap" } +ktor-client-auth = { module = "io.ktor:ktor-client-auth", version.ref = "ktor" } +ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" } +ktor-client-okhttp = { module = "io.ktor:ktor-client-okhttp", version.ref = "ktor" } +ktor-client-darwin = { module = "io.ktor:ktor-client-darwin", version.ref = "ktor" } +ktor-client-content-negotiation = { module = "io.ktor:ktor-client-content-negotiation", version.ref = "ktor" } ktor-serialization-json = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" } androidx-foundation-android = { group = "androidx.compose.foundation", name = "foundation-android", version.ref = "foundationAndroid" } material3-window-sizeclass-multiplatform = { module = "dev.chrisbanes.material3:material3-window-size-class-multiplatform", version.ref = "material3WindowSizeClassMultiplatform" }