Добавил взможность заглушечные награды добавлят

This commit is contained in:
2025-12-23 22:42:51 +03:00
parent 59087fe6d9
commit 5105e68970
2 changed files with 210 additions and 1 deletions

View File

@@ -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
)
}
}
}
}
}
}

View File

@@ -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<Reward> = emptyList(),
val isLoading: Boolean = false
val isLoading: Boolean = false,
val showAddDialog: Boolean = false,
val newRewardTitle: String = ""
)