85 lines
2.9 KiB
Kotlin
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
|
|
)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|