diff --git a/app/src/main/java/com/m57/hermescontrol/ui/achievements/AchievementsScreen.kt b/app/src/main/java/com/m57/hermescontrol/ui/achievements/AchievementsScreen.kt index 56be1cda..1ff57fb2 100644 --- a/app/src/main/java/com/m57/hermescontrol/ui/achievements/AchievementsScreen.kt +++ b/app/src/main/java/com/m57/hermescontrol/ui/achievements/AchievementsScreen.kt @@ -101,7 +101,7 @@ fun AchievementsScreen( placeholder = "Search achievements...", ) } - items(filteredAchievements) { achievement -> + items(filteredAchievements, key = { it.id }) { achievement -> val pct = achievement.progress_pct?.toFloat()?.div(100f) ?: 0f Card( diff --git a/app/src/main/java/com/m57/hermescontrol/ui/chat/ChatScreen.kt b/app/src/main/java/com/m57/hermescontrol/ui/chat/ChatScreen.kt index 7c76affb..2b3bf781 100644 --- a/app/src/main/java/com/m57/hermescontrol/ui/chat/ChatScreen.kt +++ b/app/src/main/java/com/m57/hermescontrol/ui/chat/ChatScreen.kt @@ -715,7 +715,7 @@ private fun ChatInputBar( LazyColumn( modifier = Modifier.heightIn(max = 200.dp), ) { - items(filteredCommands) { cmd -> + items(filteredCommands, key = { it }) { cmd -> val description = when (cmd) { "/help" -> stringResource(R.string.command_help_desc) diff --git a/app/src/main/java/com/m57/hermescontrol/ui/common/SharedComponents.kt b/app/src/main/java/com/m57/hermescontrol/ui/common/SharedComponents.kt index b76406a8..99574921 100644 --- a/app/src/main/java/com/m57/hermescontrol/ui/common/SharedComponents.kt +++ b/app/src/main/java/com/m57/hermescontrol/ui/common/SharedComponents.kt @@ -246,7 +246,7 @@ fun FilterChipRow( ), horizontalArrangement = Arrangement.spacedBy(spacing.sm), ) { - items(chips) { chip -> + items(chips, key = { it }) { chip -> FilterChip( selected = chip == selectedChip, onClick = { onChipSelected(chip) }, diff --git a/app/src/main/java/com/m57/hermescontrol/ui/cron/CronJobsScreen.kt b/app/src/main/java/com/m57/hermescontrol/ui/cron/CronJobsScreen.kt index aac78545..f28c627d 100644 --- a/app/src/main/java/com/m57/hermescontrol/ui/cron/CronJobsScreen.kt +++ b/app/src/main/java/com/m57/hermescontrol/ui/cron/CronJobsScreen.kt @@ -89,7 +89,7 @@ fun CronJobsScreen( contentPadding = listContentPadding, verticalArrangement = listItemSpacing, ) { - items(state.jobs) { job -> + items(state.jobs, key = { it.id }) { job -> Card( modifier = Modifier.fillMaxWidth(), colors = diff --git a/app/src/main/java/com/m57/hermescontrol/ui/kanban/KanbanScreen.kt b/app/src/main/java/com/m57/hermescontrol/ui/kanban/KanbanScreen.kt index 883d00f0..fb93d30a 100644 --- a/app/src/main/java/com/m57/hermescontrol/ui/kanban/KanbanScreen.kt +++ b/app/src/main/java/com/m57/hermescontrol/ui/kanban/KanbanScreen.kt @@ -149,7 +149,7 @@ fun KanbanScreen( contentPadding = PaddingValues(16.dp), horizontalArrangement = Arrangement.spacedBy(16.dp), ) { - items(state.columns) { column -> + items(state.columns, key = { it.name }) { column -> val colName = column.name val colTasks = filteredTasks.filter { @@ -178,7 +178,7 @@ fun KanbanScreen( modifier = Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(8.dp), ) { - items(colTasks) { task -> + items(colTasks, key = { it.id }) { task -> TaskCard( task = task, onMoveLeft = diff --git a/app/src/main/java/com/m57/hermescontrol/ui/keys/KeysScreen.kt b/app/src/main/java/com/m57/hermescontrol/ui/keys/KeysScreen.kt index 684f9173..7b5a8462 100644 --- a/app/src/main/java/com/m57/hermescontrol/ui/keys/KeysScreen.kt +++ b/app/src/main/java/com/m57/hermescontrol/ui/keys/KeysScreen.kt @@ -125,7 +125,7 @@ fun KeysScreen( placeholder = "Search keys...", ) } - items(filteredEnvVars.toList()) { (key, config) -> + items(filteredEnvVars.toList(), key = { it.first }) { (key, config) -> var isEditing by remember { mutableStateOf(false) } val revealedVal = state.revealedValues[key] val isRevealed = revealedVal != null diff --git a/app/src/main/java/com/m57/hermescontrol/ui/mcp/McpServersScreen.kt b/app/src/main/java/com/m57/hermescontrol/ui/mcp/McpServersScreen.kt index 0b5016c7..296d3ebf 100644 --- a/app/src/main/java/com/m57/hermescontrol/ui/mcp/McpServersScreen.kt +++ b/app/src/main/java/com/m57/hermescontrol/ui/mcp/McpServersScreen.kt @@ -116,7 +116,7 @@ fun McpServersScreen( placeholder = "Search MCP servers...", ) } - items(filteredServers) { server -> + items(filteredServers, key = { it.name }) { server -> Card( modifier = Modifier.fillMaxWidth(), colors = diff --git a/app/src/main/java/com/m57/hermescontrol/ui/model/ModelScreen.kt b/app/src/main/java/com/m57/hermescontrol/ui/model/ModelScreen.kt index d4c7fb44..8f988220 100644 --- a/app/src/main/java/com/m57/hermescontrol/ui/model/ModelScreen.kt +++ b/app/src/main/java/com/m57/hermescontrol/ui/model/ModelScreen.kt @@ -134,7 +134,7 @@ fun ModelScreen( placeholder = "Search models...", ) } - items(filteredProviders) { provider -> + items(filteredProviders, key = { it.slug }) { provider -> val isExpanded = expandedProviderSlug == provider.slug val isCurrent = provider.is_current == true diff --git a/app/src/main/java/com/m57/hermescontrol/ui/pairing/PairingScreen.kt b/app/src/main/java/com/m57/hermescontrol/ui/pairing/PairingScreen.kt index 5b501b45..6733b6d6 100644 --- a/app/src/main/java/com/m57/hermescontrol/ui/pairing/PairingScreen.kt +++ b/app/src/main/java/com/m57/hermescontrol/ui/pairing/PairingScreen.kt @@ -121,7 +121,7 @@ fun PairingScreen( } } - items(pending) { item -> + items(pending, key = { "${it.platform}_${it.code ?: it.user_id}" }) { item -> Card( modifier = Modifier.fillMaxWidth(), colors = @@ -201,7 +201,7 @@ fun PairingScreen( } } } else { - items(approved) { item -> + items(approved, key = { "${it.platform}_${it.user_id}" }) { item -> Card( modifier = Modifier.fillMaxWidth(), ) { diff --git a/app/src/main/java/com/m57/hermescontrol/ui/plugins/PluginsScreen.kt b/app/src/main/java/com/m57/hermescontrol/ui/plugins/PluginsScreen.kt index 48926943..37b1bf07 100644 --- a/app/src/main/java/com/m57/hermescontrol/ui/plugins/PluginsScreen.kt +++ b/app/src/main/java/com/m57/hermescontrol/ui/plugins/PluginsScreen.kt @@ -119,7 +119,7 @@ fun PluginsScreen( placeholder = "Search plugins...", ) } - items(filteredPlugins) { plugin -> + items(filteredPlugins, key = { it.name }) { plugin -> Card(modifier = Modifier.fillMaxWidth()) { Column(modifier = Modifier.padding(16.dp)) { Row( diff --git a/app/src/main/java/com/m57/hermescontrol/ui/profiles/ProfilesScreen.kt b/app/src/main/java/com/m57/hermescontrol/ui/profiles/ProfilesScreen.kt index 0bcda1da..a800f210 100644 --- a/app/src/main/java/com/m57/hermescontrol/ui/profiles/ProfilesScreen.kt +++ b/app/src/main/java/com/m57/hermescontrol/ui/profiles/ProfilesScreen.kt @@ -118,7 +118,7 @@ fun ProfilesScreen( contentPadding = PaddingValues(16.dp), verticalArrangement = Arrangement.spacedBy(12.dp), ) { - items(state.profiles) { profile -> + items(state.profiles, key = { it.name }) { profile -> val isActive = profile.name == state.activeProfileName Card( modifier = Modifier.fillMaxWidth(), diff --git a/app/src/main/java/com/m57/hermescontrol/ui/sessions/SessionsScreen.kt b/app/src/main/java/com/m57/hermescontrol/ui/sessions/SessionsScreen.kt index b635dc11..d9523b90 100644 --- a/app/src/main/java/com/m57/hermescontrol/ui/sessions/SessionsScreen.kt +++ b/app/src/main/java/com/m57/hermescontrol/ui/sessions/SessionsScreen.kt @@ -105,7 +105,7 @@ fun SessionsScreen( placeholder = "Search sessions...", ) } - items(filteredSessions) { session -> + items(filteredSessions, key = { it.id }) { session -> Card( modifier = Modifier 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 9d5abd1f..498e202f 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 @@ -237,7 +237,7 @@ fun SkillsScreen( } } } else { - items(filtered) { skill -> + items(filtered, key = { it.name }) { skill -> Card( modifier = Modifier.fillMaxWidth(), colors = diff --git a/app/src/main/java/com/m57/hermescontrol/ui/toolsets/ToolsetsScreen.kt b/app/src/main/java/com/m57/hermescontrol/ui/toolsets/ToolsetsScreen.kt index 50231d91..ec79261e 100644 --- a/app/src/main/java/com/m57/hermescontrol/ui/toolsets/ToolsetsScreen.kt +++ b/app/src/main/java/com/m57/hermescontrol/ui/toolsets/ToolsetsScreen.kt @@ -133,7 +133,7 @@ fun ToolsetsScreen( placeholder = "Search toolsets...", ) } - items(filteredToolsets) { toolset -> + items(filteredToolsets, key = { it.name }) { toolset -> Card( modifier = Modifier.fillMaxWidth(), colors = diff --git a/app/src/main/java/com/m57/hermescontrol/ui/webhooks/WebhooksScreen.kt b/app/src/main/java/com/m57/hermescontrol/ui/webhooks/WebhooksScreen.kt index a85aef75..8c87c47f 100644 --- a/app/src/main/java/com/m57/hermescontrol/ui/webhooks/WebhooksScreen.kt +++ b/app/src/main/java/com/m57/hermescontrol/ui/webhooks/WebhooksScreen.kt @@ -192,7 +192,7 @@ fun WebhooksScreen( } } } else { - items(filteredSubscriptions) { sub -> + items(filteredSubscriptions, key = { it.name }) { sub -> Card( modifier = Modifier.fillMaxWidth(), ) {