KeyBottomSheet.kt 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package org.sirekanyan.outline.ui
  2. import android.content.Intent
  3. import android.widget.Toast
  4. import android.widget.Toast.LENGTH_SHORT
  5. import androidx.compose.foundation.clickable
  6. import androidx.compose.foundation.layout.Column
  7. import androidx.compose.foundation.layout.WindowInsets
  8. import androidx.compose.foundation.layout.navigationBarsPadding
  9. import androidx.compose.foundation.layout.padding
  10. import androidx.compose.material.icons.Icons
  11. import androidx.compose.material.icons.filled.Delete
  12. import androidx.compose.material.icons.filled.Share
  13. import androidx.compose.material3.ExperimentalMaterial3Api
  14. import androidx.compose.material3.Icon
  15. import androidx.compose.material3.ListItem
  16. import androidx.compose.material3.MaterialTheme
  17. import androidx.compose.material3.ModalBottomSheet
  18. import androidx.compose.material3.Text
  19. import androidx.compose.material3.rememberModalBottomSheetState
  20. import androidx.compose.runtime.Composable
  21. import androidx.compose.runtime.rememberCoroutineScope
  22. import androidx.compose.ui.Modifier
  23. import androidx.compose.ui.graphics.RectangleShape
  24. import androidx.compose.ui.platform.LocalClipboardManager
  25. import androidx.compose.ui.platform.LocalContext
  26. import androidx.compose.ui.text.AnnotatedString
  27. import androidx.compose.ui.unit.dp
  28. import kotlinx.coroutines.launch
  29. import org.sirekanyan.outline.api.model.Key
  30. import org.sirekanyan.outline.ui.icons.IconCopy
  31. @Composable
  32. @OptIn(ExperimentalMaterial3Api::class)
  33. fun KeyBottomSheet(key: Key, onDismissRequest: () -> Unit, onDeleteClick: () -> Unit) {
  34. val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true)
  35. val localClipboard = LocalClipboardManager.current
  36. val localContext = LocalContext.current
  37. val coroutineScope = rememberCoroutineScope()
  38. ModalBottomSheet(
  39. onDismissRequest = onDismissRequest,
  40. sheetState = sheetState,
  41. shape = RectangleShape,
  42. dragHandle = {},
  43. windowInsets = WindowInsets(0.dp),
  44. ) {
  45. Column(Modifier.navigationBarsPadding().padding(top = 4.dp)) {
  46. Text(
  47. text = key.accessKey.nameOrDefault,
  48. modifier = Modifier.padding(16.dp),
  49. style = MaterialTheme.typography.labelLarge,
  50. )
  51. ListItem(
  52. headlineContent = { Text("Copy") },
  53. leadingContent = { Icon(IconCopy, null) },
  54. modifier = Modifier.clickable {
  55. localClipboard.setText(AnnotatedString(key.accessKey.accessUrl))
  56. Toast.makeText(localContext, "Copied", LENGTH_SHORT).show()
  57. coroutineScope.launch {
  58. sheetState.hide()
  59. }.invokeOnCompletion {
  60. onDismissRequest()
  61. }
  62. },
  63. )
  64. ListItem(
  65. headlineContent = { Text("Share") },
  66. leadingContent = { Icon(Icons.Default.Share, null) },
  67. modifier = Modifier.clickable {
  68. coroutineScope.launch {
  69. sheetState.hide()
  70. }.invokeOnCompletion {
  71. onDismissRequest()
  72. }
  73. localContext.startActivity(
  74. Intent(Intent.ACTION_SEND)
  75. .putExtra(Intent.EXTRA_TEXT, key.accessKey.accessUrl)
  76. .setType("text/plain")
  77. )
  78. },
  79. )
  80. ListItem(
  81. headlineContent = { Text("Delete") },
  82. leadingContent = { Icon(Icons.Default.Delete, null) },
  83. modifier = Modifier.clickable {
  84. onDeleteClick()
  85. coroutineScope.launch {
  86. sheetState.hide()
  87. }.invokeOnCompletion {
  88. onDismissRequest()
  89. }
  90. },
  91. )
  92. }
  93. }
  94. }