diff --git a/app/src/main/java/com/novayaplaneta/ui/screens/rewards/RewardsScreen.kt b/app/src/main/java/com/novayaplaneta/ui/screens/rewards/RewardsScreen.kt index 66d3463..c34661d 100644 --- a/app/src/main/java/com/novayaplaneta/ui/screens/rewards/RewardsScreen.kt +++ b/app/src/main/java/com/novayaplaneta/ui/screens/rewards/RewardsScreen.kt @@ -8,6 +8,7 @@ import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.items import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.CalendarToday import androidx.compose.material.icons.filled.Person import androidx.compose.material.icons.filled.Public @@ -21,10 +22,13 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import androidx.compose.ui.window.Dialog import androidx.hilt.navigation.compose.hiltViewModel import com.novayaplaneta.ui.components.NovayaPlanetaLogo import com.novayaplaneta.ui.theme.* @@ -198,10 +202,31 @@ fun RewardsScreen( screenHeightDp = screenHeightDp ) } + + // Кнопка добавления в конце списка + item { + AddRewardButton( + onClick = { viewModel.showAddDialog() }, + screenHeightDp = screenHeightDp, + accentGreen = accentGreen + ) + } } } } } + + // Диалог добавления награды + if (uiState.showAddDialog) { + AddRewardDialog( + rewardTitle = uiState.newRewardTitle, + onTitleChange = { viewModel.updateNewRewardTitle(it) }, + onAdd = { viewModel.addReward("default") }, + onDismiss = { viewModel.hideAddDialog() }, + accentGreen = accentGreen, + screenHeightDp = screenHeightDp + ) + } } } @@ -297,3 +322,148 @@ fun RewardCard( } } +@Composable +fun AddRewardButton( + onClick: () -> Unit, + screenHeightDp: Int, + accentGreen: Color +) { + val cardHeight = 180.dp + + Box( + modifier = Modifier + .fillMaxWidth() + .height(cardHeight) + .clip(RoundedCornerShape(16.dp)) + .background(color = accentGreen) + .clickable(onClick = onClick) + ) { + Column( + modifier = Modifier.fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + Icon( + imageVector = Icons.Filled.Add, + contentDescription = "Добавить награду", + modifier = Modifier.size(60.dp), + tint = Color.White + ) + } + } +} + +@Composable +fun AddRewardDialog( + rewardTitle: String, + onTitleChange: (String) -> Unit, + onAdd: () -> Unit, + onDismiss: () -> Unit, + accentGreen: Color, + screenHeightDp: Int +) { + Dialog(onDismissRequest = onDismiss) { + Card( + modifier = Modifier + .fillMaxWidth(0.8f) + .wrapContentHeight(), + shape = RoundedCornerShape(24.dp), + colors = CardDefaults.cardColors( + containerColor = Color.White + ) + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(24.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(24.dp) + ) { + // Заголовок + val titleSize = (screenHeightDp * 0.03f).toInt().coerceIn(24, 36).sp + Text( + text = "Добавить награду", + fontSize = titleSize, + fontWeight = FontWeight.Bold, + color = Color.Black + ) + + // Поле ввода названия награды + val inputTextSize = (screenHeightDp * 0.02f).toInt().coerceIn(16, 22).sp + OutlinedTextField( + value = rewardTitle, + onValueChange = onTitleChange, + placeholder = { + Text( + text = "Введите название награды", + fontSize = inputTextSize, + color = Color.Gray.copy(alpha = 0.7f) + ) + }, + modifier = Modifier.fillMaxWidth(), + singleLine = true, + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text), + colors = OutlinedTextFieldDefaults.colors( + focusedTextColor = Color.Black, + unfocusedTextColor = Color.Black, + focusedBorderColor = accentGreen, + unfocusedBorderColor = Color.Gray + ), + textStyle = androidx.compose.ui.text.TextStyle( + fontSize = inputTextSize + ) + ) + + // Кнопки внизу + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(16.dp) + ) { + // Кнопка "Назад" + Button( + onClick = onDismiss, + modifier = Modifier + .weight(1f) + .height(56.dp), + shape = RoundedCornerShape(16.dp), + colors = ButtonDefaults.buttonColors( + containerColor = Color.LightGray, + contentColor = Color.Black + ) + ) { + val buttonTextSize = (screenHeightDp * 0.022f).toInt().coerceIn(18, 26).sp + Text( + text = "Назад", + fontSize = buttonTextSize, + fontWeight = FontWeight.Bold + ) + } + + // Кнопка "Добавить" + Button( + onClick = onAdd, + modifier = Modifier + .weight(1f) + .height(56.dp), + enabled = rewardTitle.isNotBlank(), + shape = RoundedCornerShape(16.dp), + colors = ButtonDefaults.buttonColors( + containerColor = accentGreen, + contentColor = Color.White, + disabledContainerColor = Color.LightGray, + disabledContentColor = Color.Gray + ) + ) { + val buttonTextSize = (screenHeightDp * 0.022f).toInt().coerceIn(18, 26).sp + Text( + text = "Добавить", + fontSize = buttonTextSize, + fontWeight = FontWeight.Bold + ) + } + } + } + } + } +} + diff --git a/app/src/main/java/com/novayaplaneta/ui/screens/rewards/RewardsViewModel.kt b/app/src/main/java/com/novayaplaneta/ui/screens/rewards/RewardsViewModel.kt index cf393e1..b08186c 100644 --- a/app/src/main/java/com/novayaplaneta/ui/screens/rewards/RewardsViewModel.kt +++ b/app/src/main/java/com/novayaplaneta/ui/screens/rewards/RewardsViewModel.kt @@ -120,10 +120,49 @@ class RewardsViewModel @Inject constructor( rewardRepository.earnReward(userId, rewardId) } } + + fun showAddDialog() { + _uiState.value = _uiState.value.copy(showAddDialog = true, newRewardTitle = "") + } + + fun hideAddDialog() { + _uiState.value = _uiState.value.copy(showAddDialog = false, newRewardTitle = "") + } + + fun updateNewRewardTitle(title: String) { + _uiState.value = _uiState.value.copy(newRewardTitle = title) + } + + fun addReward(userId: String) { + val title = _uiState.value.newRewardTitle.trim() + if (title.isBlank()) return + + val newReward = Reward( + id = "reward_${System.currentTimeMillis()}", + title = title, + description = null, + imageUrl = null, + points = 10, // Базовое количество очков + earnedAt = null, + userId = userId + ) + + // Добавляем новую награду в список + val currentRewards = _uiState.value.rewards.toMutableList() + currentRewards.add(newReward) + + _uiState.value = _uiState.value.copy( + rewards = currentRewards, + showAddDialog = false, + newRewardTitle = "" + ) + } } data class RewardsUiState( val rewards: List = emptyList(), - val isLoading: Boolean = false + val isLoading: Boolean = false, + val showAddDialog: Boolean = false, + val newRewardTitle: String = "" )