From 4287723ab0c497d70c90d87c1584c6757ee39727 Mon Sep 17 00:00:00 2001 From: Hy4ri Date: Fri, 11 Sep 2026 17:45:33 +0300 Subject: [PATCH] refactor(skills): reconcile duplicate components and drop dead category filter Use extracted components/SkillEditorDialog and SourceBadge. Drop unused CategoryFilter enum. --- .../hermescontrol/ui/skills/SkillsScreen.kt | 166 +----------------- .../ui/skills/SkillsViewModel.kt | 4 - 2 files changed, 2 insertions(+), 168 deletions(-) diff --git a/app/src/main/java/com/m57/hermescontrol/ui/skills/SkillsScreen.kt b/app/src/main/java/com/m57/hermescontrol/ui/skills/SkillsScreen.kt index 070c4110..b1f06cf2 100644 --- a/app/src/main/java/com/m57/hermescontrol/ui/skills/SkillsScreen.kt +++ b/app/src/main/java/com/m57/hermescontrol/ui/skills/SkillsScreen.kt @@ -89,6 +89,8 @@ import com.m57.hermescontrol.ui.common.SkeletonListState import com.m57.hermescontrol.ui.common.ToastEffect import com.m57.hermescontrol.ui.common.listItemSpacing import com.m57.hermescontrol.ui.common.toDetailRows +import com.m57.hermescontrol.ui.skills.components.SkillEditorDialog +import com.m57.hermescontrol.ui.skills.components.SourceBadge internal const val CATEGORY_ALL = "All" @@ -515,29 +517,6 @@ private fun SkillCard( } } } -// ── Source Badge ─────────────────────────────────────────────────────── - -@Composable -private fun SourceBadge(source: String) { - val (color, label) = - when (source) { - "hub" -> MaterialTheme.colorScheme.tertiary to "hub" - "built-in" -> MaterialTheme.colorScheme.secondary to "built-in" - "optional" -> MaterialTheme.colorScheme.outline to "opt" - else -> MaterialTheme.colorScheme.outline to source - } - Surface( - color = color.copy(alpha = 0.15f), - shape = MaterialTheme.shapes.small, - ) { - Text( - text = label, - style = MaterialTheme.typography.labelSmall, - color = color, - modifier = Modifier.padding(horizontal = 6.dp, vertical = 2.dp), - ) - } -} // ── Hub Browse View ───────────────────────────────────────────────────── @@ -1270,144 +1249,3 @@ fun SkillPreviewDialog( } } } - -// ── Skill Editor Dialog (existing, preserved unchanged) ──────────────── - -@Composable -fun SkillEditorDialog( - skillName: String, - isLoading: Boolean, - initialContent: String?, - isSaving: Boolean, - saveSuccess: Boolean, - onSave: (String) -> Unit, - onDismiss: () -> Unit, - onClearSaveSuccess: () -> Unit, -) { - var contentText by remember(initialContent) { mutableStateOf(initialContent.orEmpty()) } - var showDiscardConfirm by remember { mutableStateOf(false) } - - val hasChanges = - remember(initialContent, contentText) { - val original = initialContent.orEmpty() - original != contentText - } - - LaunchedEffect(saveSuccess) { - if (saveSuccess) { - onClearSaveSuccess() - onDismiss() - } - } - - Dialog( - onDismissRequest = { - if (hasChanges) { - showDiscardConfirm = true - } else { - onDismiss() - } - }, - properties = DialogProperties(usePlatformDefaultWidth = false), - ) { - Card( - modifier = - Modifier - .fillMaxSize() - .padding(16.dp), - colors = - CardDefaults.cardColors( - containerColor = MaterialTheme.colorScheme.surface, - ), - ) { - HermesScaffold( - title = { Text(stringResource(R.string.skills_edit_title, skillName)) }, - navigationIcon = - NavIcon.Back( - onBack = { - if (hasChanges) { - showDiscardConfirm = true - } else { - onDismiss() - } - }, - ), - actions = { - if (!isLoading) { - IconButton( - onClick = { onSave(contentText) }, - enabled = !isSaving, - ) { - if (isSaving) { - CircularProgressIndicator( - modifier = Modifier.fillMaxSize(0.6f), - strokeWidth = 2.dp, - color = MaterialTheme.colorScheme.onSurface, - ) - } else { - Icon( - imageVector = Icons.Filled.Save, - contentDescription = stringResource(R.string.content_desc_save_changes), - ) - } - } - } - }, - ) { padding -> - Box( - modifier = - Modifier - .fillMaxSize(), - ) { - when { - isLoading -> { - LoadingState() - } - - else -> { - OutlinedTextField( - value = contentText, - onValueChange = { contentText = it }, - modifier = - Modifier - .fillMaxSize() - .padding(16.dp), - textStyle = - TextStyle( - fontFamily = FontFamily.Monospace, - color = MaterialTheme.colorScheme.onSurface, - ), - placeholder = { - Text(stringResource(R.string.skills_content_placeholder)) - }, - ) - } - } - } - } - } - } - - if (showDiscardConfirm) { - AlertDialog( - onDismissRequest = { showDiscardConfirm = false }, - title = { Text(stringResource(R.string.skills_discard_title)) }, - text = { Text(stringResource(R.string.skills_discard_message)) }, - confirmButton = { - TextButton( - onClick = { - showDiscardConfirm = false - onDismiss() - }, - ) { - Text(stringResource(R.string.action_discard)) - } - }, - dismissButton = { - TextButton(onClick = { showDiscardConfirm = false }) { - Text(stringResource(R.string.action_cancel)) - } - }, - ) - } -} diff --git a/app/src/main/java/com/m57/hermescontrol/ui/skills/SkillsViewModel.kt b/app/src/main/java/com/m57/hermescontrol/ui/skills/SkillsViewModel.kt index 40dad9e7..a7dc2215 100644 --- a/app/src/main/java/com/m57/hermescontrol/ui/skills/SkillsViewModel.kt +++ b/app/src/main/java/com/m57/hermescontrol/ui/skills/SkillsViewModel.kt @@ -39,10 +39,6 @@ enum class SkillFilter( DISABLED(R.string.skills_status_disabled), } -enum class CategoryFilter { - ALL, -} - data class SkillsUiState( val isLoading: Boolean = false, val skills: List = emptyList(),