Files
forkmessager/client-mobile/chats/presentation/components/KlipyPicker.kt
Халимов Рустам 1fb1be47dd Приложение
2026-04-14 01:15:54 +03:00

85 lines
2.9 KiB
Kotlin

package chats.presentation.components
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.grid.GridCells
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
import androidx.compose.foundation.lazy.grid.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Search
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import coil.compose.AsyncImage
import coil.decode.GifDecoder
import coil.decode.ImageDecoderDecoder
import coil.request.ImageRequest
import chats.data.remote.api.KlipyGifDto
@Composable
fun KlipyPicker(
gifs: List<KlipyGifDto>,
isLoading: Boolean,
onGifSelected: (String) -> Unit,
onSearch: (String) -> Unit
) {
var query by remember { mutableStateOf("") }
val context = LocalContext.current
val imageLoader = coil.ImageLoader.Builder(context)
.components {
if (android.os.Build.VERSION.SDK_INT >= 28) {
add(ImageDecoderDecoder.Factory())
} else {
add(GifDecoder.Factory())
}
}
.build()
Column(modifier = Modifier.fillMaxWidth().height(300.dp)) {
OutlinedTextField(
value = query,
onValueChange = {
query = it
onSearch(it)
},
modifier = Modifier.fillMaxWidth().padding(8.dp),
placeholder = { Text("Search GIFs...") },
leadingIcon = { Icon(Icons.Default.Search, contentDescription = null) },
singleLine = true
)
if (isLoading) {
Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
CircularProgressIndicator()
}
} else {
LazyVerticalGrid(
columns = GridCells.Fixed(2),
modifier = Modifier.fillMaxSize(),
contentPadding = PaddingValues(4.dp)
) {
items(gifs) { gif ->
val url = gif.images?.fixed_height?.url ?: ""
AsyncImage(
model = ImageRequest.Builder(context)
.data(url)
.crossfade(true)
.build(),
imageLoader = imageLoader,
contentDescription = gif.title,
modifier = Modifier
.padding(4.dp)
.aspectRatio(1.5f)
.clickable { onGifSelected(url) },
contentScale = ContentScale.Crop
)
}
}
}
}
}