ContentItem.kt 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. /*
  2. * Nextcloud Talk - Android Client
  3. *
  4. * SPDX-FileCopyrightText: 2024 Your Name <your@email.com>
  5. * SPDX-License-Identifier: GPL-3.0-or-later
  6. */
  7. package com.nextcloud.talk.contacts
  8. import android.content.Context
  9. import android.util.Log
  10. import androidx.compose.foundation.ExperimentalFoundationApi
  11. import androidx.compose.foundation.background
  12. import androidx.compose.foundation.layout.Arrangement
  13. import androidx.compose.foundation.layout.Box
  14. import androidx.compose.foundation.layout.Column
  15. import androidx.compose.foundation.layout.PaddingValues
  16. import androidx.compose.foundation.layout.fillMaxSize
  17. import androidx.compose.foundation.layout.fillMaxWidth
  18. import androidx.compose.foundation.layout.padding
  19. import androidx.compose.foundation.lazy.LazyColumn
  20. import androidx.compose.foundation.lazy.items
  21. import androidx.compose.material3.CircularProgressIndicator
  22. import androidx.compose.material3.HorizontalDivider
  23. import androidx.compose.material3.Surface
  24. import androidx.compose.material3.Text
  25. import androidx.compose.runtime.Composable
  26. import androidx.compose.runtime.mutableStateListOf
  27. import androidx.compose.runtime.remember
  28. import androidx.compose.ui.Alignment
  29. import androidx.compose.ui.Modifier
  30. import androidx.compose.ui.graphics.Color
  31. import androidx.compose.ui.text.font.FontWeight
  32. import androidx.compose.ui.unit.dp
  33. import com.nextcloud.talk.models.json.autocomplete.AutocompleteUser
  34. @Composable
  35. fun ContactsList(contactsUiState: ContactsUiState, contactsViewModel: ContactsViewModel, context: Context) {
  36. when (contactsUiState) {
  37. is ContactsUiState.None -> {
  38. }
  39. is ContactsUiState.Loading -> {
  40. Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
  41. CircularProgressIndicator()
  42. }
  43. }
  44. is ContactsUiState.Success -> {
  45. val contacts = contactsUiState.contacts
  46. Log.d(CompanionClass.TAG, "Contacts:$contacts")
  47. if (contacts != null) {
  48. ContactsItem(contacts, contactsViewModel, context)
  49. }
  50. }
  51. is ContactsUiState.Error -> {
  52. val errorMessage = contactsUiState.message
  53. Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
  54. Text(text = "Error: $errorMessage", color = Color.Red)
  55. }
  56. }
  57. }
  58. }
  59. @OptIn(ExperimentalFoundationApi::class)
  60. @Composable
  61. fun ContactsItem(contacts: List<AutocompleteUser>, contactsViewModel: ContactsViewModel, context: Context) {
  62. val groupedContacts: Map<String, List<AutocompleteUser>> = contacts.groupBy { contact ->
  63. (
  64. if (contact.source == "users") {
  65. contact.label?.first()?.uppercase()
  66. } else {
  67. contact.source?.replaceFirstChar { actorType ->
  68. actorType.uppercase()
  69. }
  70. }
  71. ).toString()
  72. }
  73. val selectedContacts = remember { mutableStateListOf<AutocompleteUser>() }
  74. LazyColumn(
  75. modifier = Modifier
  76. .padding(8.dp)
  77. .fillMaxWidth(),
  78. contentPadding = PaddingValues(all = 10.dp),
  79. verticalArrangement = Arrangement.spacedBy(10.dp)
  80. ) {
  81. groupedContacts.forEach { (initial, contactsForInitial) ->
  82. stickyHeader {
  83. Column {
  84. Surface(Modifier.fillParentMaxWidth()) {
  85. Header(initial)
  86. }
  87. HorizontalDivider(thickness = 0.1.dp, color = Color.Black)
  88. }
  89. }
  90. items(contactsForInitial) { contact ->
  91. ContactItemRow(
  92. contact = contact,
  93. contactsViewModel = contactsViewModel,
  94. context = context,
  95. selectedContacts = selectedContacts
  96. )
  97. Log.d(CompanionClass.TAG, "Contacts:$contact")
  98. }
  99. }
  100. }
  101. }
  102. @Composable
  103. fun Header(header: String) {
  104. Text(
  105. text = header,
  106. modifier = Modifier
  107. .fillMaxSize()
  108. .background(Color.Transparent)
  109. .padding(start = 60.dp),
  110. color = Color.Blue,
  111. fontWeight = FontWeight.Bold
  112. )
  113. }