GlobalSearchResultItems.kt 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package eu.kanade.presentation.browse.components
  2. import androidx.compose.foundation.clickable
  3. import androidx.compose.foundation.layout.Arrangement
  4. import androidx.compose.foundation.layout.Box
  5. import androidx.compose.foundation.layout.Column
  6. import androidx.compose.foundation.layout.Row
  7. import androidx.compose.foundation.layout.fillMaxWidth
  8. import androidx.compose.foundation.layout.padding
  9. import androidx.compose.foundation.layout.size
  10. import androidx.compose.material.icons.Icons
  11. import androidx.compose.material.icons.outlined.ArrowForward
  12. import androidx.compose.material.icons.outlined.Error
  13. import androidx.compose.material3.CircularProgressIndicator
  14. import androidx.compose.material3.Icon
  15. import androidx.compose.material3.IconButton
  16. import androidx.compose.material3.MaterialTheme
  17. import androidx.compose.material3.Text
  18. import androidx.compose.runtime.Composable
  19. import androidx.compose.ui.Alignment
  20. import androidx.compose.ui.Modifier
  21. import androidx.compose.ui.res.stringResource
  22. import androidx.compose.ui.unit.dp
  23. import eu.kanade.presentation.util.padding
  24. import eu.kanade.tachiyomi.R
  25. @Composable
  26. fun GlobalSearchResultItem(
  27. title: String,
  28. subtitle: String,
  29. onClick: () -> Unit,
  30. content: @Composable () -> Unit,
  31. ) {
  32. Column {
  33. Row(
  34. modifier = Modifier
  35. .padding(
  36. start = MaterialTheme.padding.medium,
  37. end = MaterialTheme.padding.tiny,
  38. )
  39. .fillMaxWidth()
  40. .clickable(onClick = onClick),
  41. horizontalArrangement = Arrangement.SpaceBetween,
  42. verticalAlignment = Alignment.CenterVertically,
  43. ) {
  44. Column {
  45. Text(
  46. text = title,
  47. style = MaterialTheme.typography.titleMedium,
  48. )
  49. Text(text = subtitle)
  50. }
  51. IconButton(onClick = onClick) {
  52. Icon(imageVector = Icons.Outlined.ArrowForward, contentDescription = null)
  53. }
  54. }
  55. content()
  56. }
  57. }
  58. @Composable
  59. fun GlobalSearchEmptyResultItem() {
  60. Text(
  61. text = stringResource(id = R.string.no_results_found),
  62. modifier = Modifier
  63. .padding(
  64. horizontal = MaterialTheme.padding.medium,
  65. vertical = MaterialTheme.padding.small,
  66. ),
  67. )
  68. }
  69. @Composable
  70. fun GlobalSearchLoadingResultItem() {
  71. Box(
  72. modifier = Modifier
  73. .fillMaxWidth()
  74. .padding(vertical = MaterialTheme.padding.medium),
  75. ) {
  76. CircularProgressIndicator(
  77. modifier = Modifier
  78. .size(16.dp)
  79. .align(Alignment.Center),
  80. strokeWidth = 2.dp,
  81. )
  82. }
  83. }
  84. @Composable
  85. fun GlobalSearchErrorResultItem(message: String?) {
  86. Column(
  87. modifier = Modifier
  88. .padding(vertical = MaterialTheme.padding.medium)
  89. .fillMaxWidth(),
  90. horizontalAlignment = Alignment.CenterHorizontally,
  91. verticalArrangement = Arrangement.Center,
  92. ) {
  93. Icon(imageVector = Icons.Outlined.Error, contentDescription = null)
  94. Text(text = message ?: stringResource(id = R.string.unknown_error))
  95. }
  96. }