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, 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 ) } } } } }