Advertisement
Guest User

Overlapping jetpack compose code.

a guest
Jul 16th, 2024
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 8.50 KB | None | 0 0
  1. import android.net.Uri
  2. import androidx.compose.animation.AnimatedVisibility
  3. import androidx.compose.animation.animateContentSize
  4. import androidx.compose.animation.scaleIn
  5. import androidx.compose.animation.scaleOut
  6. import androidx.compose.foundation.background
  7. import androidx.compose.foundation.border
  8. import androidx.compose.foundation.clickable
  9. import androidx.compose.foundation.horizontalScroll
  10. import androidx.compose.foundation.layout.Box
  11. import androidx.compose.foundation.layout.Column
  12. import androidx.compose.foundation.layout.Row
  13. import androidx.compose.foundation.layout.Spacer
  14. import androidx.compose.foundation.layout.WindowInsets
  15. import androidx.compose.foundation.layout.fillMaxSize
  16. import androidx.compose.foundation.layout.fillMaxWidth
  17. import androidx.compose.foundation.layout.height
  18. import androidx.compose.foundation.layout.navigationBars
  19. import androidx.compose.foundation.layout.padding
  20. import androidx.compose.foundation.layout.size
  21. import androidx.compose.foundation.layout.width
  22. import androidx.compose.foundation.layout.windowInsetsBottomHeight
  23. import androidx.compose.foundation.layout.wrapContentSize
  24. import androidx.compose.foundation.rememberScrollState
  25. import androidx.compose.foundation.shape.RoundedCornerShape
  26. import androidx.compose.foundation.text.KeyboardOptions
  27. import androidx.compose.material.IconButton
  28. import androidx.compose.material.TextField
  29. import androidx.compose.material.TextFieldDefaults
  30. import androidx.compose.runtime.Composable
  31. import androidx.compose.ui.Alignment
  32. import androidx.compose.ui.Modifier
  33. import androidx.compose.ui.draw.clip
  34. import androidx.compose.ui.graphics.Color
  35. import androidx.compose.ui.graphics.ColorFilter
  36. import androidx.compose.ui.graphics.graphicsLayer
  37. import androidx.compose.ui.layout.ContentScale
  38. import androidx.compose.ui.text.font.FontWeight
  39. import androidx.compose.ui.text.input.KeyboardCapitalization
  40. import androidx.compose.ui.tooling.preview.Preview
  41. import androidx.compose.ui.unit.dp
  42. import androidx.compose.ui.unit.sp
  43. import androidx.compose.ui.zIndex
  44. import com.wkiddiebox.compose.ui.element.image.Icon
  45. import com.wkiddiebox.compose.ui.element.image.Icons
  46. import com.wkiddiebox.compose.ui.element.image.Image
  47. import com.wkiddiebox.compose.ui.element.text.Clause
  48. import com.wkiddiebox.compose.ui.element.text.Text
  49. import com.wkiddiebox.compose.ui.element.text.asText
  50. import com.wkiddiebox.compose.ui.theme.KiddieboxTheme
  51. import com.wkiddiebox.compose.ui.theme.Theme
  52. import com.wkiddiebox.compose.ui.theme.Theme.shape
  53. import com.wkiddiebox.feature.messaging.ui.R
  54.  
  55. private const val TEXT_FONT_SIZE = 16
  56. private const val SEND_BUTTON_IMAGE_SIZE = 30
  57. private const val DISMISSABLE_IMAGE_SIZE = 100
  58.  
  59. @Composable
  60. fun MessageTextField(
  61.     value: String,
  62.     placeholder: Clause,
  63.     imageUri: List<Uri>?,
  64.     onCaptureImageClick: () -> Unit,
  65.     onPickImageClick: () -> Unit,
  66.     onSendButtonClick: () -> Unit,
  67.     onRemoveImageClick: (Uri) -> Unit,
  68.     onValueChange: (value: String) -> Unit
  69. ) {
  70.  
  71.     val containerShape = RoundedCornerShape(
  72.         topStart = 20.dp,
  73.         topEnd = 20.dp
  74.     )
  75.  
  76.     Box {
  77.         Column(
  78.             modifier = Modifier
  79.                 .clip(containerShape)
  80.                 .border(
  81.                     width = 0.2.dp,
  82.                     color = Theme.colors.border.primaryOnLight,
  83.                     shape = containerShape
  84.                 )
  85.                 .background(color = Theme.colors.surfaceInteractive.enabledOnLight)
  86.                 .padding(
  87.                     top = Theme.spacing.x3
  88.                 )
  89.         ) {
  90.             TextField(
  91.                 value = value,
  92.                 onValueChange = onValueChange,
  93.                 modifier = Modifier.fillMaxWidth(),
  94.                 keyboardOptions = KeyboardOptions(capitalization = KeyboardCapitalization.Sentences),
  95.                 colors = TextFieldDefaults.textFieldColors(
  96.                     backgroundColor = Color.Transparent,
  97.                     focusedIndicatorColor = Color.Transparent,
  98.                     unfocusedIndicatorColor = Color.Transparent,
  99.                     unfocusedLabelColor = Color.Transparent
  100.                 ),
  101.                 textStyle = Theme.typography.textField.copy(
  102.                     fontWeight = FontWeight.Medium,
  103.                     fontSize = TEXT_FONT_SIZE.sp,
  104.                 ),
  105.                 placeholder = {
  106.                     Text(clause = placeholder)
  107.                 },
  108.                 trailingIcon = {
  109.                     IconButton(
  110.                         onClick = onSendButtonClick,
  111.                         enabled = if (value.isNotBlank()) true else false,
  112.                         content = {
  113.                             SendButton()
  114.                         }
  115.                     )
  116.                 },
  117.                 maxLines = 6
  118.             )
  119.  
  120.             Column(modifier = Modifier.height(25.dp)) {
  121.                 AnimatedVisibility(
  122.                     visible = value.isNotBlank(),
  123.                     enter = scaleIn(),
  124.                     exit = scaleOut()
  125.                 ) {
  126.                     Row(modifier = Modifier.padding(start = Theme.spacing.x4)) {
  127.                         Image(
  128.                             image = Image.Drawable(R.drawable.ic_camera),
  129.                             modifier = Modifier
  130.                                 .size(22.dp)
  131.                                 .clickable {
  132.                                     onCaptureImageClick.invoke()
  133.                                 }
  134.                         )
  135.                         Spacer(modifier = Modifier.width(Theme.spacing.x3))
  136.                         Image(
  137.                             image = Image.Drawable(R.drawable.ic_upload),
  138.                             modifier = Modifier
  139.                                 .size(22.dp)
  140.                                 .clickable {
  141.                                     onPickImageClick.invoke()
  142.                                 }
  143.                         )
  144.                     }
  145.                 }
  146.             }
  147.             Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.navigationBars))
  148.         }
  149.  
  150.         Row(
  151.             modifier = Modifier
  152.                 .fillMaxWidth()
  153.                 .horizontalScroll(rememberScrollState())
  154.                 .align(Alignment.BottomStart)
  155.                 .zIndex(2f)
  156.                 .graphicsLayer {
  157.                     translationX = 100f
  158.                     translationY = -200f
  159.                 }
  160.         ) {
  161.             DismissibleImage(
  162.                 uri = Uri.EMPTY,
  163.                 onRemove = { }
  164.             )
  165.         }
  166.     }
  167. }
  168.  
  169. @Composable
  170. private fun SendButton() {
  171.     Box(
  172.         modifier = Modifier
  173.             .clip(shape.imageShape)
  174.             .background(
  175.                 color = Theme.colors.element.tertiaryOnLight,
  176.                 shape = shape.imageShape
  177.             ),
  178.         contentAlignment = Alignment.Center
  179.     ) {
  180.         Image(
  181.             image = Icons.Utils.next,
  182.             modifier = Modifier.size(SEND_BUTTON_IMAGE_SIZE.dp),
  183.             colorFilter = ColorFilter.tint(color = Color.White)
  184.         )
  185.     }
  186. }
  187.  
  188. @Composable
  189. private fun DismissibleImage(uri: Uri, onRemove: () -> Unit) {
  190.     Box(
  191.         modifier = Modifier.wrapContentSize()
  192.     ) {
  193.        
  194.         Box(
  195.             modifier = Modifier
  196.                 .clip(RoundedCornerShape(10.dp))
  197.                 .background(color = Theme.colors.surface.primaryDark)
  198.                 .size(DISMISSABLE_IMAGE_SIZE.dp)
  199.         )
  200.  
  201.         Icon(
  202.             image = Icons.Navigation.close,
  203.             modifier = Modifier
  204.                 .size(Theme.spacing.x8)
  205.                 .zIndex(1f)
  206.                 .graphicsLayer {
  207.                     translationX = -25f
  208.                     translationY = -25f
  209.                 },
  210.             onClick = onRemove
  211.         )
  212.     }
  213. }
  214.  
  215. @Preview
  216. @Composable
  217. fun MessageTextFieldPreview() {
  218.     KiddieboxTheme {
  219.         Box(
  220.             modifier = Modifier
  221.                 .fillMaxSize()
  222.                 .background(color = Theme.colors.surface.primaryLight),
  223.             contentAlignment = Alignment.Center
  224.         ) {
  225.             MessageTextField(
  226.                 value = "some messages here",
  227.                 onCaptureImageClick = {},
  228.                 onPickImageClick = {},
  229.                 onRemoveImageClick = {},
  230.                 onSendButtonClick = {},
  231.                 placeholder = "Type your message here".asText(),
  232.                 onValueChange = {
  233.  
  234.                 },
  235.                 imageUri = null
  236.             )
  237.         }
  238.     }
  239. }
  240.  
  241.  
  242.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement