package com.example.gravitydemo import ai.gravityfield.gravity_sdk.GravitySDK import ai.gravityfield.gravity_sdk.models.* import ai.gravityfield.gravity_sdk.network.Campaign import ai.gravityfield.gravity_sdk.ui.product_view_builder.ProductViewBuilder import androidx.compose.runtime.Composable import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.material3.Text import androidx.compose.ui.Modifier import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.* import androidx.compose.ui.unit.dp import coil3.compose.AsyncImage class MyComposeProductViewBuilder : ProductViewBuilder { @Composable override fun Build(slot: Slot, content: CampaignContent, campaign: Campaign) { val product = slot.toRecommendedProduct() Column( modifier = Modifier .width(164.dp) .clickable { GravitySDK.instance.sendProductEngagement( ProductClickEngagement(slot, content, campaign) ) openProduct(product.url, product.sku) } .padding(8.dp) ) { AsyncImage( model = product.imageUrl, contentDescription = product.name, modifier = Modifier .fillMaxWidth() .height(140.dp), contentScale = ContentScale.Fit, ) Text( text = product.name, maxLines = 2, overflow = TextOverflow.Ellipsis, ) product.oldPrice?.let { Text( text = it, textDecoration = TextDecoration.LineThrough, ) } product.price?.let { Text(text = it, fontWeight = FontWeight.SemiBold) } } } private fun openProduct(url: String?, sku: String) { // Откройте экран товара в приложении или deeplink по url/sku. } private fun Slot.toRecommendedProduct(): RecommendedProduct { return RecommendedProduct( sku = stringValue("sku", "id") ?: slotId ?: strId.toString(), name = stringValue("name") ?: "Товар", price = stringValue("price"), oldPrice = stringValue("old_price", "oldPrice"), imageUrl = stringValue("image_url", "imageUrl"), url = stringValue("url"), ) } private fun Slot.stringValue(vararg keys: String): String? { return keys.firstNotNullOfOrNull { key -> item[key]?.toString()?.takeIf { it.isNotBlank() } } } } data class RecommendedProduct( val sku: String, val name: String, val price: String?, val oldPrice: String?, val imageUrl: String?, val url: String?, )