Skip to content

Commit 20f3db1

Browse files
authored
copy snackbar message text on settings screen (#521)
1 parent 1c10cf8 commit 20f3db1

File tree

11 files changed

+45
-17
lines changed

11 files changed

+45
-17
lines changed

desktop-compose-app/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ kotlin {
2525
implementation(project(":shared"))
2626
implementation(project(":shared-compose-ui"))
2727
implementation(libs.androidx.navigation.compose)
28+
implementation(project.dependencies.platform(libs.coroutines.bom))
2829
implementation(libs.coroutines.swing)
2930
implementation(compose.desktop.currentOs)
3031
implementation(project.dependencies.platform(libs.koin.bom))

gradle/libs.versions.toml

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ agp = "8.7.3"
88
gms = "4.4.2"
99
crashlytics = "3.0.2"
1010
compose = "1.7.1"
11-
coroutines = "1.9.0"
11+
coroutines = "1.10.1"
1212
sqlDelight = "2.0.2"
1313
androidxSqlite = "2.4.0"
1414
saferoom = "1.3.0"
@@ -43,10 +43,11 @@ androidSecurityLint = "1.0.3"
4343
appdirs = "1.3.0"
4444

4545
[libraries]
46-
coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" }
47-
coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "coroutines" }
48-
coroutines-swing = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-swing", version.ref = "coroutines" }
49-
coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "coroutines" }
46+
coroutines-bom = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-bom", version.ref = "coroutines" }
47+
coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core" }
48+
coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android" }
49+
coroutines-swing = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-swing" }
50+
coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test" }
5051

5152
sqlDelight-runtime = { module = "app.cash.sqldelight:runtime", version.ref = "sqlDelight" }
5253
sqlDelight-android = { module = "app.cash.sqldelight:android-driver", version.ref = "sqlDelight" }

iosApp/Podfile.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,4 @@ SPEC CHECKSUMS:
2424

2525
PODFILE CHECKSUM: 0dc93a6f6109335ea8cd3f91d2c87cc8c99f04a3
2626

27-
COCOAPODS: 1.12.1
27+
COCOAPODS: 1.15.2

iosApp/Pods/Manifest.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

iosApp/Pods/Pods.xcodeproj/project.pbxproj

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-frameworks.sh

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

shared-compose-ui/src/commonMain/composeResources/values-ru/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,5 @@
5353
<string name="dialog_title_conform_password">Подтверждение пароля</string>
5454
<string name="dialog_title_enter_password">Ввод пароля</string>
5555
<string name="dialog_title_change_title">Редактирование заголовка</string>
56+
<string name="copy">Копировать</string>
5657
</resources>

shared-compose-ui/src/commonMain/composeResources/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,5 @@
5353
<string name="dialog_title_conform_password">Confirming password</string>
5454
<string name="dialog_title_enter_password">Entering password</string>
5555
<string name="dialog_title_change_title">Editing title</string>
56+
<string name="copy">Copy</string>
5657
</resources>

shared-compose-ui/src/commonMain/kotlin/com/softartdev/notedelight/ui/SettingsScreen.kt

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ import androidx.compose.material3.Scaffold
2828
import androidx.compose.material3.SnackbarDuration
2929
import androidx.compose.material3.SnackbarHost
3030
import androidx.compose.material3.SnackbarHostState
31+
import androidx.compose.material3.SnackbarResult
32+
import androidx.compose.material3.SnackbarResult.ActionPerformed
3133
import androidx.compose.material3.Switch
3234
import androidx.compose.material3.Text
3335
import androidx.compose.material3.TopAppBar
@@ -37,11 +39,14 @@ import androidx.compose.runtime.getValue
3739
import androidx.compose.runtime.remember
3840
import androidx.compose.ui.Modifier
3941
import androidx.compose.ui.graphics.vector.ImageVector
42+
import androidx.compose.ui.platform.ClipboardManager
43+
import androidx.compose.ui.platform.LocalClipboardManager
4044
import androidx.compose.ui.semantics.contentDescription
4145
import androidx.compose.ui.semantics.semantics
4246
import androidx.compose.ui.semantics.testTag
4347
import androidx.compose.ui.semantics.toggleableState
4448
import androidx.compose.ui.state.ToggleableState
49+
import androidx.compose.ui.text.AnnotatedString
4550
import androidx.compose.ui.unit.dp
4651
import androidx.lifecycle.compose.LifecycleResumeEffect
4752
import androidx.lifecycle.coroutineScope
@@ -52,13 +57,15 @@ import com.softartdev.notedelight.ui.icon.FileLock
5257
import com.softartdev.theme.material3.ThemePreferenceItem
5358
import kotlinx.coroutines.launch
5459
import notedelight.shared_compose_ui.generated.resources.Res
60+
import notedelight.shared_compose_ui.generated.resources.copy
5561
import notedelight.shared_compose_ui.generated.resources.pref_title_check_cipher_version
5662
import notedelight.shared_compose_ui.generated.resources.pref_title_enable_encryption
5763
import notedelight.shared_compose_ui.generated.resources.pref_title_set_password
5864
import notedelight.shared_compose_ui.generated.resources.pref_title_show_db_path
5965
import notedelight.shared_compose_ui.generated.resources.security
6066
import notedelight.shared_compose_ui.generated.resources.settings
6167
import notedelight.shared_compose_ui.generated.resources.theme
68+
import org.jetbrains.compose.resources.getString
6269
import org.jetbrains.compose.resources.stringResource
6370

6471
@Composable
@@ -67,20 +74,24 @@ fun SettingsScreen(
6774
snackbarHostState: SnackbarHostState = remember { SnackbarHostState() }
6875
) {
6976
val result: SecurityResult by settingsViewModel.stateFlow.collectAsState()
77+
val clipboardManager: ClipboardManager = LocalClipboardManager.current
78+
7079
LifecycleResumeEffect(key1 = settingsViewModel, key2 = result) {
7180
result.checkEncryption()
7281
result.snackBarMessage?.takeIf(String::isNotEmpty)?.let { msg: String ->
7382
lifecycle.coroutineScope.launch {
74-
snackbarHostState.showSnackbar(message = msg, duration = SnackbarDuration.Long)
83+
val snackResult: SnackbarResult = snackbarHostState.showSnackbar(
84+
message = msg,
85+
duration = SnackbarDuration.Long,
86+
actionLabel = getString(Res.string.copy),
87+
)
88+
if (snackResult == ActionPerformed) clipboardManager.setText(AnnotatedString(msg))
7589
}
7690
result.disposeOneTimeEvents()
7791
}
7892
onPauseOrDispose { result.disposeOneTimeEvents() }
7993
}
80-
SettingsScreenBody(
81-
result = result,
82-
snackbarHostState = snackbarHostState,
83-
)
94+
SettingsScreenBody(result, snackbarHostState)
8495
}
8596

8697
@Composable

shared-compose-ui/src/commonMain/kotlin/com/softartdev/notedelight/ui/dialog/EditTitleDialog.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,14 @@ import androidx.compose.runtime.Composable
1313
import androidx.compose.runtime.LaunchedEffect
1414
import androidx.compose.runtime.collectAsState
1515
import androidx.compose.runtime.getValue
16+
import androidx.compose.runtime.mutableStateOf
1617
import androidx.compose.runtime.remember
18+
import androidx.compose.runtime.setValue
1719
import androidx.compose.ui.Modifier
1820
import androidx.compose.ui.semantics.contentDescription
1921
import androidx.compose.ui.semantics.semantics
22+
import androidx.compose.ui.text.TextRange
23+
import androidx.compose.ui.text.input.TextFieldValue
2024
import com.softartdev.notedelight.shared.presentation.title.EditTitleResult
2125
import com.softartdev.notedelight.shared.presentation.title.EditTitleViewModel
2226
import notedelight.shared_compose_ui.generated.resources.Res
@@ -53,11 +57,15 @@ fun ShowEditTitleDialog(
5357
) = AlertDialog(
5458
title = { Text(text = stringResource(Res.string.dialog_title_change_title)) },
5559
text = {
60+
var textRange by remember { mutableStateOf(TextRange(0, result.title.length)) }
5661
Column {
5762
if (result.loading) LinearProgressIndicator(modifier = Modifier.fillMaxWidth())
5863
TextField(
59-
value = result.title,
60-
onValueChange = result.onEditTitle,
64+
value = TextFieldValue(text = result.title, selection = textRange),
65+
onValueChange = {
66+
textRange = it.selection
67+
result.onEditTitle(it.text)
68+
},
6169
label = {
6270
val res = if (result.isError) Res.string.empty_title else Res.string.enter_title
6371
Text(stringResource(res))

0 commit comments

Comments
 (0)