diff --git a/composeApp/src/commonMain/kotlin/dev/krtirtho/spotube/modules/plugin/components/PluginPermissionsDialog.kt b/composeApp/src/commonMain/kotlin/dev/krtirtho/spotube/modules/plugin/components/PluginPermissionsDialog.kt index 300c1371..0e48fbca 100644 --- a/composeApp/src/commonMain/kotlin/dev/krtirtho/spotube/modules/plugin/components/PluginPermissionsDialog.kt +++ b/composeApp/src/commonMain/kotlin/dev/krtirtho/spotube/modules/plugin/components/PluginPermissionsDialog.kt @@ -25,18 +25,11 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.Button -import androidx.compose.material3.ButtonDefaults -import androidx.compose.material3.Card -import androidx.compose.material3.CardDefaults import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.OutlinedButton -import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -45,8 +38,10 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp -import androidx.compose.ui.window.Dialog -import androidx.compose.ui.window.DialogProperties +import dev.krtirtho.spotube.core.ui.base.Card +import dev.krtirtho.spotube.core.ui.base.OutlineButton +import dev.krtirtho.spotube.core.ui.base.PrimaryButton +import dev.krtirtho.spotube.core.ui.base.ThemedDialog import dev.krtirtho.spotube.modules.plugin.PluginCapability import dev.krtirtho.spotube.modules.plugin.PluginEntry import dev.krtirtho.spotube.resources.iconsax.Iconsax @@ -84,179 +79,131 @@ fun PluginPermissionDialog( onConfirm: (() -> Unit)? = null, onDismiss: () -> Unit, ) { - Dialog( + ThemedDialog( onDismissRequest = onDismiss, - properties = DialogProperties(usePlatformDefaultWidth = false) - ) { - Card( - modifier = Modifier - .widthIn(min = 320.dp, max = 480.dp) - .padding(horizontal = 16.dp), - shape = RoundedCornerShape(20.dp), - elevation = CardDefaults.cardElevation(defaultElevation = 6.dp), - colors = CardDefaults.cardColors( - containerColor = MaterialTheme.colorScheme.surface - ) - ) { - Column(modifier = Modifier.fillMaxWidth()) { + title = { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(14.dp) + ) { Box( modifier = Modifier - .fillMaxWidth() - .background(MaterialTheme.colorScheme.primaryContainer.copy(alpha = 0.4f)) - .padding(24.dp) + .size(48.dp) + .clip(RoundedCornerShape(12.dp)) + .background(MaterialTheme.colorScheme.primary.copy(alpha = 0.12f)), + contentAlignment = Alignment.Center ) { - Column(verticalArrangement = Arrangement.spacedBy(12.dp)) { - Row( - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(14.dp) - ) { - Surface( - modifier = Modifier - .size(48.dp) - .clip(RoundedCornerShape(12.dp)), - color = MaterialTheme.colorScheme.primary.copy(alpha = 0.15f) - ) { - Box(contentAlignment = Alignment.Center) { - Icon( - imageVector = Iconsax.IconsaxBoxAdd, - contentDescription = null, - tint = MaterialTheme.colorScheme.primary, - modifier = Modifier.size(24.dp) - ) - } - } - Column { - Text( - title, - style = MaterialTheme.typography.titleMedium, - fontWeight = FontWeight.SemiBold, - ) - Text( - pluginInfo.name, - style = MaterialTheme.typography.bodyMedium, - color = MaterialTheme.colorScheme.onSurfaceVariant, - maxLines = 1, - overflow = TextOverflow.Ellipsis - ) - } - } - - Row( - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(6.dp) - ) { - Icon( - Iconsax.User, - contentDescription = null, - modifier = Modifier.size(13.dp), - tint = MaterialTheme.colorScheme.onSurfaceVariant - ) - Text( - pluginInfo.author, - style = MaterialTheme.typography.labelSmall, - color = MaterialTheme.colorScheme.onSurfaceVariant - ) - Text( - stringResource( - Res.string.plugin_permissions_author_version, - stringResource(Res.string.plugin_version_label, pluginInfo.version) - ), - style = MaterialTheme.typography.labelSmall, - color = MaterialTheme.colorScheme.onSurfaceVariant - ) - } - - if (pluginInfo.description.isNotBlank()) { - Text( - pluginInfo.description, - style = MaterialTheme.typography.bodySmall, - color = MaterialTheme.colorScheme.onSurfaceVariant, - maxLines = 3, - overflow = TextOverflow.Ellipsis - ) - } - } - } - - HorizontalDivider() - - Column( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 20.dp, vertical = 16.dp), - verticalArrangement = Arrangement.spacedBy(12.dp) - ) { - Surface( - modifier = Modifier.fillMaxWidth(), - shape = RoundedCornerShape(12.dp), - color = MaterialTheme.colorScheme.surfaceVariant.copy(alpha = 0.55f) - ) { - Text( - message, - style = MaterialTheme.typography.bodySmall, - color = MaterialTheme.colorScheme.onSurface, - modifier = Modifier.padding(14.dp) - ) - } - - existingPlugin?.let { - InstalledComparisonCard( - installedPlugin = it, - incomingPlugin = pluginInfo - ) - } - - Text( - stringResource(Res.string.plugin_permissions_requested_title), - style = MaterialTheme.typography.labelMedium, - fontWeight = FontWeight.SemiBold, - color = MaterialTheme.colorScheme.onSurface + Icon( + imageVector = Iconsax.IconsaxBoxAdd, + contentDescription = null, + tint = MaterialTheme.colorScheme.primary, + modifier = Modifier.size(24.dp) ) - - if (pluginInfo.capabilities.isEmpty()) { - Text( - stringResource(Res.string.plugin_permissions_none), - style = MaterialTheme.typography.bodySmall, - color = MaterialTheme.colorScheme.onSurfaceVariant - ) - } else { - pluginInfo.capabilities.forEach { capability -> - CapabilityRow(capability) - } - } } + Column(modifier = Modifier.weight(1f)) { + Text( + title, + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold, + ) + Text( + pluginInfo.name, + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } + } - HorizontalDivider() + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(6.dp), + modifier = Modifier.padding(top = 8.dp) + ) { + Icon( + Iconsax.User, + contentDescription = null, + modifier = Modifier.size(13.dp), + tint = MaterialTheme.colorScheme.onSurfaceVariant + ) + Text( + pluginInfo.author, + style = MaterialTheme.typography.labelSmall, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + Text( + stringResource( + Res.string.plugin_permissions_author_version, + stringResource(Res.string.plugin_version_label, pluginInfo.version) + ), + style = MaterialTheme.typography.labelSmall, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + }, + actions = { + OutlineButton(onClick = onDismiss) { + Text( + if (confirmLabel == null) { + stringResource(Res.string.settings_action_close) + } else { + stringResource(Res.string.settings_action_cancel) + } + ) + } + if (confirmLabel != null && onConfirm != null) { + PrimaryButton(onClick = onConfirm) { + Text(confirmLabel) + } + } + }, + ) { + Column( + verticalArrangement = Arrangement.spacedBy(12.dp) + ) { + if (pluginInfo.description.isNotBlank()) { + Text( + pluginInfo.description, + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, + maxLines = 3, + overflow = TextOverflow.Ellipsis + ) + } - Row( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 20.dp, vertical = 16.dp), - horizontalArrangement = Arrangement.spacedBy(12.dp, Alignment.End) - ) { - OutlinedButton( - onClick = onDismiss, - shape = RoundedCornerShape(10.dp) - ) { - Text( - if (confirmLabel == null) { - stringResource(Res.string.settings_action_close) - } else { - stringResource(Res.string.settings_action_cancel) - } - ) - } - if (confirmLabel != null && onConfirm != null) { - Button( - onClick = onConfirm, - shape = RoundedCornerShape(10.dp), - colors = ButtonDefaults.buttonColors( - containerColor = MaterialTheme.colorScheme.primary - ) - ) { - Text(confirmLabel) - } - } + Card { + Text( + message, + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurface, + modifier = Modifier.padding(14.dp) + ) + } + + existingPlugin?.let { + InstalledComparisonCard( + installedPlugin = it, + incomingPlugin = pluginInfo + ) + } + + Text( + stringResource(Res.string.plugin_permissions_requested_title), + style = MaterialTheme.typography.labelMedium, + fontWeight = FontWeight.SemiBold, + color = MaterialTheme.colorScheme.onSurface + ) + + if (pluginInfo.capabilities.isEmpty()) { + Text( + stringResource(Res.string.plugin_permissions_none), + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } else { + pluginInfo.capabilities.forEach { capability -> + CapabilityRow(capability) } } } @@ -268,10 +215,8 @@ private fun InstalledComparisonCard( installedPlugin: PluginEntry, incomingPlugin: PluginEntry, ) { - Surface( + Card( modifier = Modifier.fillMaxWidth(), - shape = RoundedCornerShape(12.dp), - color = MaterialTheme.colorScheme.secondaryContainer.copy(alpha = 0.45f) ) { Column( modifier = Modifier.padding(14.dp), @@ -344,40 +289,42 @@ private fun CapabilityRow(capability: PluginCapability) { ) } - Row( - modifier = Modifier - .fillMaxWidth() - .clip(RoundedCornerShape(10.dp)) - .background(MaterialTheme.colorScheme.surfaceVariant.copy(alpha = 0.5f)) - .padding(horizontal = 14.dp, vertical = 10.dp), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(14.dp) + Card( + modifier = Modifier.fillMaxWidth(), ) { - Box( + Row( modifier = Modifier - .size(34.dp) - .clip(CircleShape) - .background(MaterialTheme.colorScheme.errorContainer.copy(alpha = 0.6f)), - contentAlignment = Alignment.Center + .fillMaxWidth() + .padding(12.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(14.dp) ) { - Icon( - imageVector = icon, - contentDescription = null, - modifier = Modifier.size(16.dp), - tint = MaterialTheme.colorScheme.error - ) - } - Column { - Text( - label, - style = MaterialTheme.typography.bodyMedium, - fontWeight = FontWeight.Medium - ) - Text( - description, - style = MaterialTheme.typography.labelSmall, - color = MaterialTheme.colorScheme.onSurfaceVariant - ) + Box( + modifier = Modifier + .size(34.dp) + .clip(CircleShape) + .background(MaterialTheme.colorScheme.errorContainer.copy(alpha = 0.6f)), + contentAlignment = Alignment.Center + ) { + Icon( + imageVector = icon, + contentDescription = null, + modifier = Modifier.size(16.dp), + tint = MaterialTheme.colorScheme.error + ) + } + Column { + Text( + label, + style = MaterialTheme.typography.bodyMedium, + fontWeight = FontWeight.Medium + ) + Text( + description, + style = MaterialTheme.typography.labelSmall, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } } } -} \ No newline at end of file +}