Добавил взможность заглушечные награды добавлят
This commit is contained in:
@@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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 = ""
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user