Добавлен демо-режим: Можно открыть приложение с параметром ?demo в URL В демо-режиме эмулируется Telegram WebApp SDK Добавлена заглушка для демо-пользователя Исправлены типы и интерфейсы: Добавлен тип SafeUser для безопасной работы с mongoose документами Исправлены пропсы компонентов Обновлены типы для покупок в магазине Улучшена обработка ошибок: Добавлены информативные сообщения об ошибках Реализована корректная обработка сетевых ошибок Добавлены toast-уведомления с подробной информацией Улучшен UI: Добавлены спиннеры загрузки Улучшен внешний вид карточек товаров Добавлены информативные сообщения о состоянии
81 lines
2.2 KiB
TypeScript
81 lines
2.2 KiB
TypeScript
import mongoose, { Schema, Document } from 'mongoose';
|
|
|
|
export interface IAchievement {
|
|
id: string;
|
|
name: string;
|
|
description: string;
|
|
dateUnlocked: Date;
|
|
}
|
|
|
|
export interface IInventoryItem {
|
|
itemId: mongoose.Types.ObjectId;
|
|
name: string;
|
|
description: string;
|
|
quantity: number;
|
|
imageUrl: string;
|
|
}
|
|
|
|
export interface IUser extends Document {
|
|
telegramId: string;
|
|
username: string;
|
|
level: number;
|
|
experience: number;
|
|
balance: number;
|
|
achievements: IAchievement[];
|
|
inventory: IInventoryItem[];
|
|
addAchievement: (achievement: IAchievement) => Promise<void>;
|
|
createdAt: Date;
|
|
updatedAt: Date;
|
|
}
|
|
|
|
const UserSchema: Schema = new Schema({
|
|
telegramId: { type: String, required: true, unique: true },
|
|
username: { type: String, required: true },
|
|
level: { type: Number, default: 1 },
|
|
experience: { type: Number, default: 0 },
|
|
balance: { type: Number, default: 0 },
|
|
achievements: [{
|
|
id: String,
|
|
name: String,
|
|
description: String,
|
|
dateUnlocked: { type: Date, default: Date.now }
|
|
}],
|
|
inventory: [{
|
|
itemId: { type: Schema.Types.ObjectId, ref: 'ShopItem' },
|
|
name: String,
|
|
description: String,
|
|
quantity: Number,
|
|
imageUrl: String
|
|
}]
|
|
}, {
|
|
timestamps: true
|
|
});
|
|
|
|
// Метод для добавления опыта и повышения уровня
|
|
UserSchema.methods.addExperience = async function(amount: number) {
|
|
this.experience += amount;
|
|
|
|
// Простая формула для определения необходимого опыта для следующего уровня
|
|
const expNeeded = this.level * 100;
|
|
|
|
while (this.experience >= expNeeded) {
|
|
this.experience -= expNeeded;
|
|
this.level += 1;
|
|
// Бонус за новый уровень
|
|
this.balance += this.level * 10;
|
|
}
|
|
|
|
await this.save();
|
|
};
|
|
|
|
// Метод для добавления достижения
|
|
UserSchema.methods.addAchievement = async function(achievement: IAchievement) {
|
|
if (!this.achievements.some(a => a.id === achievement.id)) {
|
|
this.achievements.push(achievement);
|
|
// Награда за достижение
|
|
this.balance += 50;
|
|
await this.save();
|
|
}
|
|
};
|
|
|
|
export default mongoose.model<IUser>('User', UserSchema);
|