Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions RELEASE_NOTES_v1.14.0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Release Notes v1.14.0 (Цикл 14) 🌿

## 🎮 Геймификация и Прогресс
- **Quest Map 2.0**: Полностью обновленная интерактивная карта первых 30 дней трезвости.
- **Уникальные вехи**: Каждая ключевая дата (1, 3, 7, 14, 21, 30 дней) теперь имеет свою уникальную иконку и подробное описание.
- **Система наград**: Реализовано модальное окно с детальной информацией о психологических и игровых наградах за каждый этап.

## 🤖 AI-Ассистент и Персонализация
- **Умный Утренний Брифинг**: Ассистент теперь анализирует ваше настроение за вчерашний день. Если день был трудным, утренняя установка будет более поддерживающей и фокусированной на безопасности.
- **Адаптивные советы**: Мотивационные сообщения подстраиваются под текущую ситуацию пользователя.

## 📚 Контент и Обучение
- **Мини-квизы**: В ключевые статьи базы знаний добавлены интерактивные вопросы для закрепления материала.
- **Quick SOS Tips**: В раздел SOS-помощи добавлено 10 новых "быстрых советов" — простых физиологических и когнитивных техник для купирования тяги в моменте.

## 💬 Сообщество и Социализация
- **Интерактивные Челленджи**: Реализована возможность полноценного участия в групповых челленджах.
- **Статус участия**: Обновлен интерфейс ленты сообщества, теперь вы видите свои активные марафоны и количество участников.

## 🎨 Интерфейс и UX
- **Редизайн StatCard**: Карточки статистики на главном экране получили современный вид с градиентами, улучшенными тенями и более четкой визуализацией прогресса до следующего этапа.
- **Haptic Feedback**: Добавлена тактильная отдача при взаимодействии с квизами и элементами квеста.

---
*Sober Path — ваш путь к свободе становится все более интерактивным и поддерживающим.* ⚡
24 changes: 12 additions & 12 deletions TASKS.md
Original file line number Diff line number Diff line change
Expand Up @@ -219,25 +219,25 @@
- [x] Улучшить обратную связь при выполнении задач (Haptics, анимации).
- [x] Подготовить релиз v1.13.0.

# Список задач по улучшению приложения (Цикл 14) - В РАБОТЕ 🏗️
# Список задач по улучшению приложения (Цикл 14) - ВЫПОЛНЕНО ✅

## 🎮 Геймификация и Прогресс
- [ ] Внедрить интерактивную «Карту Квеста» (Quest Map) на первые 30 дней трезвости.
- [ ] Добавить визуализацию этапов квеста с уникальными иконками для ключевых вех (1, 3, 7, 14, 30 дней).
- [x] Внедрить интерактивную «Карту Квеста» (Quest Map) на первые 30 дней трезвости.
- [x] Добавить уникальные иконки для ключевых вех квеста (1, 3, 7, 14, 21, 30 дней).
- [x] Реализовать модальные окна с деталями наград в Quest Map.

## 🤖 AI-Ассистент и Персонализация
- [ ] Реализовать функцию «Утренний брифинг» (Morning Briefing) при первом запуске приложения.
- [ ] Добавить поддержку голосового ввода (Voice Input) для дневника (если возможно технически) или аудио-заметок.
- [x] Реализовать функцию «Утренний брифинг» (Morning Briefing).
- [x] Улучшить адаптивность «Утреннего брифинга» на основе настроения за предыдущий день.

## 📚 Контент и Обучение
- [ ] Внедрить систему «Мини-квизов» в конце статей для проверки знаний.
- [ ] Добавить 10 новых «быстрых советов» (Quick Tips) для SOS-ситуаций.
- [x] Внедрить систему «Мини-квизов» в конце статей для проверки знаний.
- [x] Добавить 10 новых «быстрых советов» (Quick Tips) для SOS-ситуаций.

## 💬 Сообщество и Социализация
- [ ] Реализовать «Групповые челенджи» в ленте сообщества.
- [ ] Улучшить систему уведомлений о реакциях на посты.
- [x] Реализовать систему участия в «Групповых челенджах».
- [x] Обновить UI челенджей для отображения статуса участия.

## 🎨 Интерфейс и UX
- [ ] Обновить дизайн карточек на главной странице для более современного вида.
- [ ] Оптимизировать производительность списков в Сообществе и Базе знаний.
- [ ] Подготовить релиз v1.14.0 и обновить скриншоты.
- [x] Обновить дизайн карточек StatCard на главной странице (градиенты, тени).
- [x] Подготовить релиз v1.14.0 и обновить скриншоты.
11 changes: 11 additions & 0 deletions app/(tabs)/articles.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ interface Article {
}

import { articlesDatabase } from '../../services/articlesDatabase';
import { ArticleQuiz } from '../../components/ArticleQuiz';

const articles: Article[] = articlesDatabase;

Expand Down Expand Up @@ -346,6 +347,16 @@ export default function ArticlesPage() {
);
})}
</View>

{selectedArticle.quiz && (
<ArticleQuiz
questions={selectedArticle.quiz}
onComplete={(score) => {
console.log(`Quiz completed with score: ${score}`);
// Можно добавить логику награды здесь
}}
/>
)}

<View style={styles.actionButtons}>
<TouchableOpacity
Expand Down
77 changes: 70 additions & 7 deletions app/(tabs)/community.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ export default function CommunityPage() {
const [posts, setPosts] = useState<SupportPost[]>([]);
const [expertQA, setExpertQA] = useState<ExpertQA[]>([]);
const [communityGoals, setCommunityGoals] = useState<CommunityGoal[]>([]);
const [groupChallenges, setGroupChallenges] = useState<GroupChallenge[]>([]);
const [groupChallenges, setGroupChallenges] = useState<(GroupChallenge & { isParticipating?: boolean })[]>([]);
const [circles, setCircles] = useState<any[]>([]);
const [selectedCircle, setSelectedCircle] = useState('all');
const [isModalVisible, setIsModalVisible] = useState(false);
Expand All @@ -216,7 +216,8 @@ export default function CommunityPage() {
setStories(CommunityService.getSuccessStories());
setExpertQA(CommunityService.getExpertQA());
setCommunityGoals(CommunityService.getCommunityGoals());
setGroupChallenges(CommunityService.getGroupChallenges());
const loadedChallenges = await CommunityService.getGroupChallenges();
setGroupChallenges(loadedChallenges);

const loadedPosts = await CommunityService.getSupportPosts();
const dailyThread = CommunityService.getDailyThread();
Expand Down Expand Up @@ -306,6 +307,21 @@ export default function CommunityPage() {
Alert.alert('Успех', 'Ваша история опубликована!');
};

const handleToggleChallenge = async (challengeId: string) => {
const joined = await CommunityService.toggleChallengeParticipation(challengeId);
const updatedChallenges = await CommunityService.getGroupChallenges();
setGroupChallenges(updatedChallenges);

Haptics.notificationAsync(
joined ? Haptics.NotificationFeedbackType.Success : Haptics.NotificationFeedbackType.Warning
);

Alert.alert(
joined ? 'Вы присоединились!' : 'Вы покинули челендж',
joined ? 'Вместе идти к цели легче. Удачи!' : 'Вы всегда можете вернуться позже.'
);
};

const filteredPosts = posts.filter(post =>
selectedCircle === 'all' || post.category === selectedCircle
);
Expand All @@ -329,18 +345,40 @@ export default function CommunityPage() {
[1, 2].map(i => <Skeleton key={i} width={250} height={120} borderRadius={16} />)
) : (
groupChallenges.map(challenge => (
<TouchableOpacity key={challenge.id} style={styles.challengeCard}>
<TouchableOpacity
key={challenge.id}
style={[
styles.challengeCard,
challenge.isParticipating && styles.activeChallengeCard
]}
onPress={() => handleToggleChallenge(challenge.id)}
>
<View style={styles.challengeHeader}>
<View style={styles.challengeBadge}>
<Text style={styles.challengeBadgeText}>{challenge.category}</Text>
<View style={[
styles.challengeBadge,
challenge.isParticipating && styles.activeChallengeBadge
]}>
<Text style={[
styles.challengeBadgeText,
challenge.isParticipating && styles.activeChallengeBadgeText
]}>{challenge.category}</Text>
</View>
{challenge.isParticipating && (
<View style={styles.participatingBadge}>
<MaterialIcons name="check" size={12} color="white" />
<Text style={styles.participatingText}>Участвую</Text>
</View>
)}
<Text style={styles.challengeDays}>осталось {challenge.daysRemaining} дн.</Text>
</View>
<Text style={styles.challengeTitle}>{challenge.title}</Text>
<Text style={styles.challengeDesc} numberOfLines={2}>{challenge.description}</Text>
<View style={styles.challengeFooter}>
<MaterialIcons name="people" size={16} color="#666" />
<Text style={styles.challengeParticipants}>{challenge.participants} участников</Text>
<MaterialIcons name="people" size={16} color={challenge.isParticipating ? '#2E7D4A' : '#666'} />
<Text style={[
styles.challengeParticipants,
challenge.isParticipating && { color: '#2E7D4A', fontWeight: 'bold' }
]}>{challenge.participants} участников</Text>
</View>
</TouchableOpacity>
))
Expand Down Expand Up @@ -872,6 +910,31 @@ const styles = StyleSheet.create({
fontSize: 11,
color: '#666',
},
activeChallengeCard: {
borderColor: '#2E7D4A',
borderWidth: 2,
backgroundColor: '#F1F8F1',
},
activeChallengeBadge: {
backgroundColor: '#2E7D4A',
},
activeChallengeBadgeText: {
color: 'white',
},
participatingBadge: {
flexDirection: 'row',
alignItems: 'center',
backgroundColor: '#4CAF50',
paddingHorizontal: 6,
paddingVertical: 2,
borderRadius: 6,
gap: 2,
},
participatingText: {
color: 'white',
fontSize: 9,
fontWeight: 'bold',
},
storyCard: {
backgroundColor: 'white',
width: screenWidth * 0.7,
Expand Down
Binary file added assets/screenshots/v1.14.0_articles.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/screenshots/v1.14.0_community.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/screenshots/v1.14.0_home.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading