package com.radiola.ui.components import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource 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.foundation.shape.CircleShape import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import com.composables.icons.lucide.Lucide import com.composables.icons.lucide.Music import com.radiola.deeplink.DeeplinkNavigator import com.radiola.domain.model.DeeplinkService import com.radiola.domain.model.Track import com.radiola.ui.player.PlayerViewModel import com.radiola.ui.theme.RadiolaTheme import com.radiola.ui.theme.pressScale @OptIn(ExperimentalMaterial3Api::class) @Composable fun DeeplinkBottomSheet( track: Track, onDismiss: () -> Unit, modifier: Modifier = Modifier, viewModel: PlayerViewModel = hiltViewModel() ) { val context = androidx.compose.ui.platform.LocalContext.current val enabledServices by viewModel.enabledServices.collectAsState() val colors = RadiolaTheme.colors ModalBottomSheet( onDismissRequest = onDismiss, modifier = modifier, containerColor = colors.elevated ) { Column(modifier = Modifier.padding(horizontal = 20.dp, vertical = 8.dp)) { Text( text = "Найти трек", style = MaterialTheme.typography.titleLarge, color = colors.textPrimary ) Spacer(Modifier.height(4.dp)) Text( text = "${track.artist} — ${track.song}", style = MaterialTheme.typography.bodyMedium, color = colors.textSecondary, maxLines = 1, overflow = TextOverflow.Ellipsis ) Spacer(Modifier.height(20.dp)) } // Сетка кнопок сервисов — монохромные, без официальных логотипов LazyVerticalGrid( columns = GridCells.Fixed(4), modifier = Modifier .fillMaxWidth() .padding(horizontal = 16.dp), contentPadding = PaddingValues(bottom = 32.dp), horizontalArrangement = Arrangement.spacedBy(12.dp), verticalArrangement = Arrangement.spacedBy(16.dp) ) { items(enabledServices) { service -> ServiceGridBtn( service = service, onClick = { DeeplinkNavigator.openSearch(context, track, service) onDismiss() } ) } } } } /** Монохромная кнопка сервиса в сетке боттомшита. */ @Composable private fun ServiceGridBtn( service: DeeplinkService, onClick: () -> Unit ) { val colors = RadiolaTheme.colors val interaction = remember { MutableInteractionSource() } Column( modifier = Modifier .pressScale(interactionSource = interaction) .clickable(interactionSource = interaction, indication = null, onClick = onClick), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(6.dp) ) { Box( modifier = Modifier .size(52.dp) .clip(CircleShape) .background(colors.surface2), contentAlignment = Alignment.Center ) { val logoRes = serviceLogoRes(service) if (logoRes != null) { Icon( painter = androidx.compose.ui.res.painterResource(logoRes), contentDescription = service.displayName, tint = colors.textSecondary, modifier = Modifier.size(24.dp) ) } else { Icon( imageVector = Lucide.Music, contentDescription = service.displayName, tint = colors.textSecondary, modifier = Modifier.size(22.dp) ) } } Text( text = service.displayName, style = MaterialTheme.typography.labelSmall, color = colors.textSecondary, maxLines = 1, overflow = TextOverflow.Ellipsis ) } }