DraftAlertDialog.kt 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package com.sirekanian.spacetime.ui
  2. import androidx.compose.foundation.layout.*
  3. import androidx.compose.foundation.text.KeyboardOptions
  4. import androidx.compose.material.*
  5. import androidx.compose.runtime.*
  6. import androidx.compose.ui.Alignment
  7. import androidx.compose.ui.Modifier
  8. import androidx.compose.ui.focus.FocusRequester
  9. import androidx.compose.ui.focus.focusRequester
  10. import androidx.compose.ui.text.input.KeyboardCapitalization
  11. import androidx.compose.ui.text.input.KeyboardType
  12. import androidx.compose.ui.unit.dp
  13. import androidx.compose.ui.window.Dialog
  14. import com.sirekanian.spacetime.MainState
  15. import com.sirekanian.spacetime.model.ImagePage
  16. import com.sirekanian.spacetime.model.createImagePage
  17. @Composable
  18. fun DraftAlertDialog(state: MainState, onConfirm: (ImagePage) -> Unit) {
  19. val draft = state.draft
  20. var name by remember(draft) { mutableStateOf("") }
  21. var date by remember(draft) { mutableStateOf(DateField("")) }
  22. var isNameValid by remember(draft, name) { mutableStateOf(true) }
  23. var isDateValid by remember(draft, date) { mutableStateOf(true) }
  24. if (draft != null) {
  25. MyAlertDialog(
  26. title = {
  27. Text(
  28. text = "Enter Name",
  29. style = MaterialTheme.typography.h6,
  30. )
  31. },
  32. content = {
  33. val focusRequester = remember { FocusRequester() }
  34. OutlinedTextField(
  35. value = name,
  36. onValueChange = { name = it },
  37. modifier = Modifier.focusRequester(focusRequester),
  38. label = { Text("Name") },
  39. isError = !isNameValid,
  40. keyboardOptions = KeyboardOptions(KeyboardCapitalization.Sentences),
  41. singleLine = true,
  42. )
  43. OutlinedTextField(
  44. value = date.value,
  45. onValueChange = { date = DateField(it) },
  46. label = { Text("Date") },
  47. placeholder = { Text("YYYY-MM-DD") },
  48. isError = !isDateValid,
  49. visualTransformation = { DateField(it.text).getVisualTransformation() },
  50. keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
  51. singleLine = true,
  52. )
  53. LaunchedEffect(Unit) {
  54. focusRequester.requestFocus()
  55. }
  56. },
  57. dismissButton = {
  58. TextButton(
  59. onClick = { state.draft = null },
  60. content = { Text("CANCEL") },
  61. )
  62. },
  63. confirmButton = {
  64. TextButton(
  65. onClick = {
  66. isNameValid = name.isNotBlank()
  67. isDateValid = date.isValid()
  68. if (isNameValid && isDateValid) {
  69. onConfirm(createImagePage(name, draft.url, date))
  70. state.draft = null
  71. }
  72. },
  73. content = { Text("OK") },
  74. )
  75. },
  76. onDismiss = {
  77. state.draft = null
  78. },
  79. )
  80. }
  81. }
  82. @Composable
  83. private fun MyAlertDialog(
  84. title: @Composable () -> Unit,
  85. content: @Composable () -> Unit,
  86. dismissButton: @Composable () -> Unit,
  87. confirmButton: @Composable () -> Unit,
  88. onDismiss: () -> Unit,
  89. ) {
  90. Dialog(onDismiss) {
  91. Surface(shape = MaterialTheme.shapes.medium) {
  92. Column {
  93. Column(Modifier.padding(24.dp)) {
  94. title.invoke()
  95. Spacer(Modifier.size(16.dp))
  96. content.invoke()
  97. }
  98. Spacer(Modifier.size(4.dp))
  99. Row(
  100. Modifier
  101. .padding(8.dp)
  102. .fillMaxWidth(),
  103. Arrangement.spacedBy(8.dp, Alignment.End),
  104. ) {
  105. dismissButton.invoke()
  106. confirmButton.invoke()
  107. }
  108. }
  109. }
  110. }
  111. }