From b002236bf653101c1b6412f9c70933aac600277e Mon Sep 17 00:00:00 2001 From: mx57 Date: Tue, 21 Jul 2026 00:23:42 +0000 Subject: [PATCH 1/2] fix: fix invisible weekly roadmap, improve UI visibility and layout MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix weekly roadmap widget: show loading state when data is being fetched - Replace fixed height constraints with minHeight to prevent content clipping (mainStatWrapper: 220→minHeight:200, secondaryStats: 120→minHeight:110) - Fix AchievementSystem infinite re-render bug (getStreakDays() in deps) - Improve roadmap task visibility: larger text (13→14px), better contrast, thicker progress bar (6→8px), bigger touch targets - Add weekly focus badge to roadmap widget for better context - Fix quickActionsGrid overflow on small screens (add flexWrap: wrap) - Remove unstable useEffect dependency (pulseValue SharedValue from deps) --- app/(tabs)/index.tsx | 78 +++++++++++++++++++++++++------- components/AchievementSystem.tsx | 2 +- 2 files changed, 62 insertions(+), 18 deletions(-) diff --git a/app/(tabs)/index.tsx b/app/(tabs)/index.tsx index b3eb9cf..06844ac 100644 --- a/app/(tabs)/index.tsx +++ b/app/(tabs)/index.tsx @@ -205,7 +205,7 @@ function HomePage() { loadRoadmap(); loadQuest(); checkBriefing(); - }, [pulseValue, userProfile?.id, soberDays, mood]); + }, [userProfile?.id, soberDays]); const showWebAlert = useCallback((title: string, message: string, onOk?: () => void) => { if (Platform.OS === 'web') { @@ -387,7 +387,7 @@ function HomePage() { - {weeklyRoadmap && ( + {weeklyRoadmap ? ( @@ -396,13 +396,19 @@ function HomePage() { План на неделю {weeklyRoadmap.weekNumber} + {weeklyRoadmap.focus ? ( + + + {weeklyRoadmap.focus} + + ) : null} t.completed).length / weeklyRoadmap.tasks.length) * 100}%` + width: `${weeklyRoadmap.tasks.length > 0 ? (weeklyRoadmap.tasks.filter(t => t.completed).length / weeklyRoadmap.tasks.length) * 100 : 0}%` } ]} /> @@ -423,15 +429,15 @@ function HomePage() { > {task.text} @@ -441,6 +447,17 @@ function HomePage() { + ) : ( + + + + + План на неделю + + + Загрузка плана... + + )} {moodChartData && ( @@ -1003,12 +1020,12 @@ const styles = StyleSheet.create({ lineHeight: 20, }, mainStatWrapper: { - height: 220, + minHeight: 200, }, secondaryStats: { flexDirection: 'row', gap: 15, - height: 120 + minHeight: 110, }, healthContainer: { margin: 20, @@ -1041,9 +1058,11 @@ const styles = StyleSheet.create({ }, quickActionsGrid: { flexDirection: 'row', - gap: 12 + flexWrap: 'wrap', + gap: 12, }, quickAction: { + minWidth: '45%', flex: 1, flexDirection: 'row', alignItems: 'center', @@ -1117,7 +1136,7 @@ const styles = StyleSheet.create({ shadowRadius: 2, }, roadmapWidgetGradient: { - padding: 15, + padding: 18, }, roadmapWidgetHeader: { flexDirection: 'row', @@ -1135,19 +1154,21 @@ const styles = StyleSheet.create({ gap: 8, }, roadmapProgressBar: { - height: 6, + height: 8, backgroundColor: '#E0E0E0', - borderRadius: 3, + borderRadius: 4, overflow: 'hidden', }, roadmapProgressFill: { height: '100%', backgroundColor: '#2E7D4A', + borderRadius: 4, }, roadmapProgressText: { - fontSize: 11, + fontSize: 12, color: '#666', - fontWeight: '500', + fontWeight: '600', + marginTop: 4, }, roadmapTasksPreview: { marginTop: 10, @@ -1156,17 +1177,40 @@ const styles = StyleSheet.create({ roadmapTaskPreviewItem: { flexDirection: 'row', alignItems: 'center', - gap: 8, + gap: 10, + paddingVertical: 4, }, roadmapTaskPreviewText: { - fontSize: 13, - color: '#444', + fontSize: 14, + color: '#333', flex: 1, + lineHeight: 20, }, roadmapTaskPreviewCompleted: { color: '#AAA', textDecorationLine: 'line-through', }, + roadmapFocusBadge: { + flexDirection: 'row', + alignItems: 'center', + gap: 6, + backgroundColor: 'rgba(46, 125, 74, 0.08)', + paddingHorizontal: 10, + paddingVertical: 6, + borderRadius: 8, + marginBottom: 10, + }, + roadmapFocusText: { + fontSize: 13, + color: '#2E7D4A', + fontWeight: '600', + flex: 1, + }, + roadmapLoadingText: { + fontSize: 14, + color: '#999', + marginTop: 4, + }, modalContainer: { flex: 1, backgroundColor: 'white' diff --git a/components/AchievementSystem.tsx b/components/AchievementSystem.tsx index 7ef1ecb..4331eb7 100644 --- a/components/AchievementSystem.tsx +++ b/components/AchievementSystem.tsx @@ -81,7 +81,7 @@ export default function AchievementSystem() { useEffect(() => { checkAchievements(); - }, [soberDays, getStreakDays()]); + }, [soberDays]); const checkAchievements = () => { const streakDays = getStreakDays(); From 672be9581ea9f5bfcc5063f7715f73fe94352616 Mon Sep 17 00:00:00 2001 From: mx57 Date: Tue, 21 Jul 2026 00:32:20 +0000 Subject: [PATCH 2/2] feat: auto multi-arch release on PR merge + SEO-optimized README Release workflow: - Auto-triggers when PR is merged to main/master - Extracts version from app.json - Builds APK for 4 architectures: universal, arm64-v8a, armeabi-v7a, x86_64 - Auto-generates release notes from PR title/description - Creates GitHub Release with all artifacts and install instructions - Supports re-release when version already exists README SEO: - Added Open Graph / social media meta tags - Added comprehensive keyword tags (RU + EN) - Added 'For whom' and 'Why Sober-Path' sections - Added APK download table with architecture descriptions - Added crisis helpline table (RU/UA/US/International) - Added useful links table - Added Star History chart - Added CI/CD documentation section - Improved overall structure for search engine discoverability --- .github/workflows/release.yml | 256 +++++++++++++++++++++++++++++----- README.md | 241 +++++++++++++++++++------------- 2 files changed, 365 insertions(+), 132 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0eb6365..c8e8571 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,25 +1,178 @@ -name: Build & Release APK +name: 🚀 Auto Release on PR Merge on: - workflow_dispatch: - push: - tags: - - 'v*' + pull_request: + types: [closed] + branches: [main, master] permissions: contents: write + packages: write + +env: + CI: true + EXPO_NO_TELEMETRY: 1 + NODE_OPTIONS: --max_old_space_size=4096 + GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx4096m -XX:MaxMetaspaceSize=1024m -Dfile.encoding=UTF-8" jobs: - build-and-release: - name: Build APK and create GitHub Release + # ────────────────────────────────────────────────────────────────── + # Gate: only run when PR was actually merged (not just closed) + # ────────────────────────────────────────────────────────────────── + check-merge: + name: Check if PR was merged runs-on: ubuntu-latest - timeout-minutes: 60 + if: github.event.pull_request.merged == true + steps: + - run: echo "✅ PR #${{ github.event.pull_request.number }} was merged" + + # ────────────────────────────────────────────────────────────────── + # Extract version from app.json and prepare release metadata + # ────────────────────────────────────────────────────────────────── + prepare-release: + name: Prepare release metadata + needs: check-merge + runs-on: ubuntu-latest + outputs: + version: ${{ steps.meta.outputs.version }} + tag: ${{ steps.meta.outputs.tag }} + body: ${{ steps.meta.outputs.body }} + is_new_version: ${{ steps.meta.outputs.is_new_version }} + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Extract version and prepare metadata + id: meta + run: | + # Read version from app.json + VERSION=$(node -p "require('./app.json').expo.version") + TAG="v${VERSION}" + echo "version=${VERSION}" >> $GITHUB_OUTPUT + echo "tag=${TAG}" >> $GITHUB_OUTPUT + + # Check if this tag already exists + if git rev-parse "$TAG" >/dev/null 2>&1; then + echo "is_new_version=false" >> $GITHUB_OUTPUT + echo "📌 Tag ${TAG} already exists — will update existing release" + else + echo "is_new_version=true" >> $GITHUB_OUTPUT + echo "🆕 New version ${VERSION} — creating fresh release" + fi + + # Auto-generate release body from PR info + PR_TITLE="${{ github.event.pull_request.title }}" + PR_BODY="${{ github.event.pull_request.body }}" + PR_NUMBER="${{ github.event.pull_request.number }}" + PR_URL="${{ github.event.pull_request.html_url }}" + MERGE_COMMIT="${{ github.sha }}" + SHORT_SHA=$(echo "$MERGE_COMMIT" | cut -c1-7) + PR_AUTHOR="${{ github.event.pull_request.user.login }}" + BASE_BRANCH="${{ github.event.pull_request.base.ref }}" + CREATED_AT="${{ github.event.pull_request.created_at }}" + + cat > /tmp/release_body.md << 'RELEASE_BODY_EOF' + ## 🌿 Sober Path ${TAG} + + ### 📋 Что нового + + PR_BODY_EOF + + # Append PR body if it exists + if [ -n "$PR_BODY" ]; then + echo "$PR_BODY" >> /tmp/release_body.md + else + echo "- Обновления и исправления" >> /tmp/release_body.md + fi + + cat >> /tmp/release_body.md << RELEASE_BODY_EOF + + --- + + ### 📦 Что включено в релиз + + | Архитектура | Описание | Для кого | + |:---:|:---|:---| + | \`universal\` | Universal APK (все архитектуры) | **Рекомендуется** — подходит для большинства устройств | + | \`arm64-v8a\` | ARM 64-bit | Современные телефоны (2019+) | + | \`armeabi-v7a\` | ARM 32-bit | Старые устройства и бюджетные модели | + | \`x86_64\` | x86 64-bit | Эмуляторы и Chromebook | + + > 💡 **Совет:** Если не уверены, скачайте \`universal\` — он работает на всех устройствах. + + ### 🔧 Системные требования + - Android 7.0 (API 24) и выше + - ~50 МБ свободного места + - Рекомендуется 2+ ГБ RAM + + ### 📥 Установка + 1. Скачайте APK-файл для вашей архитектуры + 2. Откройте файл на устройстве Android + 3. Разрешите установку из неизвестных источников (если потребуется) + 4. Следуйте инструкциям на экране + + ### 🔗 Ссылки + - 📂 [Исходный код](https://github.com/mx57/Sober-Path/tree/$BASE_BRANCH) + - 🐛 [Сообщить об ошибке](https://github.com/mx57/Sober-Path/issues/new?template=bug_report.md) + - 💡 [Предложить улучшение](https://github.com/mx57/Sober-Path/issues/new?template=feature_request.md) - env: - CI: true - EXPO_NO_TELEMETRY: 1 - NODE_OPTIONS: --max_old_space_size=4096 - GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx4096m -XX:MaxMetaspaceSize=1024m -Dfile.encoding=UTF-8" + --- +
+ 📊 Техническая информация + + | Параметр | Значение | + |---|---| + | Версия | \`$VERSION\` | + | PR | [#${PR_NUMBER}]($PR_URL) | + | Автор | @${PR_AUTHOR} | + | Коммит | \`${SHORT_SHA}\` | + | Дата создания PR | $CREATED_AT | + +
+ + --- + *Автоматически создано при слиянии PR #${PR_NUMBER} в ветку \`${BASE_BRANCH}\`* + RELEASE_BODY_EOF + + # Replace placeholders in the body + BODY=$(cat /tmp/release_body.md | sed "s/\${TAG}/${TAG}/g" | sed "s/\${VERSION}/${VERSION}/g" | sed "s/\${PR_NUMBER}/${PR_NUMBER}/g" | sed "s/\${PR_URL}/${PR_URL}/g" | sed "s/\${SHORT_SHA}/${SHORT_SHA}/g" | sed "s/\${PR_AUTHOR}/${PR_AUTHOR}/g" | sed "s/\${BASE_BRANCH}/${BASE_BRANCH}/g" | sed "s|\${CREATED_AT}|${CREATED_AT}|g") + + # Write multiline output + { + echo "body<> $GITHUB_OUTPUT + + echo "📦 Version: ${VERSION}" + echo "🏷️ Tag: ${TAG}" + + # ────────────────────────────────────────────────────────────────── + # Build matrix: 4 architecture variants + # ────────────────────────────────────────────────────────────────── + build-apk: + name: Build APK (${{ matrix.abi }}) + needs: prepare-release + runs-on: ubuntu-latest + timeout-minutes: 60 + strategy: + fail-fast: false + matrix: + include: + - abi: universal + ndk_filter: "" + artifact_suffix: "universal" + - abi: arm64-v8a + ndk_filter: "arm64-v8a" + artifact_suffix: "arm64" + - abi: armeabi-v7a + ndk_filter: "armeabi-v7a" + artifact_suffix: "arm32" + - abi: x86_64 + ndk_filter: "x86_64" + artifact_suffix: "x86_64" steps: - name: Checkout repository @@ -46,9 +199,8 @@ jobs: - name: Prebuild Android project run: npx expo prebuild --platform android --clean --no-install - - name: Remove removed Android Gradle options - run: | - sed -i '/android.useNewApkCreator/d' android/gradle.properties || true + - name: Remove deprecated Gradle options + run: sed -i '/android.useNewApkCreator/d' android/gradle.properties || true - name: Patch Gradle repository URL syntax run: | @@ -81,6 +233,12 @@ jobs: -keypass android \ -dname "CN=Android Debug,O=Android,C=US" + - name: Configure NDK ABI filter + if: matrix.ndk_filter != '' + run: | + # Filter native libraries to specific ABI for smaller APK + sed -i "/ndk {/!b;n;c\\ abiFilters '${{ matrix.ndk_filter }}'" android/app/build.gradle || true + - name: Ensure Gradle settings run: | chmod +x android/gradlew @@ -94,45 +252,67 @@ jobs: working-directory: android run: ./gradlew assembleRelease --no-daemon --stacktrace --warning-mode all - - name: Collect APK artifact + - name: Collect and rename APK run: | mkdir -p artifacts + VERSION="${{ needs.prepare-release.outputs.version }}" APK_PATH=$(find android/app/build/outputs/apk/release -type f -name "*.apk" | head -n 1) if [ -z "$APK_PATH" ]; then - echo "Release APK was not found" + echo "❌ Release APK was not found for ABI: ${{ matrix.abi }}" exit 1 fi - cp "$APK_PATH" artifacts/sober-path-v${GITHUB_REF_NAME#v}.apk - ls -lh artifacts/ + DEST="artifacts/Sober-Path-v${VERSION}-${{ matrix.artifact_suffix }}.apk" + cp "$APK_PATH" "$DEST" + echo "📦 Built: $DEST" + ls -lh "$DEST" - name: Upload APK artifact uses: actions/upload-artifact@v4 with: - name: sober-path-release-apk + name: apk-${{ matrix.artifact_suffix }} path: artifacts/*.apk if-no-files-found: error retention-days: 30 + # ────────────────────────────────────────────────────────────────── + # Create / update GitHub Release with all APKs + # ────────────────────────────────────────────────────────────────── + create-release: + name: Create GitHub Release + needs: [prepare-release, build-apk] + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Download all APK artifacts + uses: actions/download-artifact@v4 + with: + path: artifacts/ + pattern: apk-* + merge-multiple: true + + - name: List release artifacts + run: | + echo "📦 Release artifacts:" + ls -lh artifacts/ + + - name: Delete existing release (if tag exists) + if: needs.prepare-release.outputs.is_new_version == 'false' + continue-on-error: true + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh release delete "${{ needs.prepare-release.outputs.tag }}" --yes --cleanup-tag || true + - name: Create GitHub Release - if: startsWith(github.ref, 'refs/tags/v') uses: softprops/action-gh-release@v2 with: - name: "Sober Path ${{ github.ref_name }}" - body: | - ## 🌿 Sober Path ${{ github.ref_name }} - - ### Что нового - - Объединены базовые и расширенные упражнения в единый раздел с подразделами - - Интерактивные упражнения с таймерами, анимацией дыхания и обратной связью - - Обновлена документация (README) - - Исправлены ошибки и опечатки - - ### Установка - Скачайте APK-файл из артефактов ниже и установите на устройство Android. - - ### Поддержка - - GitHub: [mx57/Sober-Path](https://github.com/mx57/Sober-Path) - - Issues: [Открыть задачу](https://github.com/mx57/Sober-Path/issues) + name: "🌿 Sober Path ${{ needs.prepare-release.outputs.tag }}" + tag_name: ${{ needs.prepare-release.outputs.tag }} + body: ${{ needs.prepare-release.outputs.body }} files: artifacts/*.apk draft: false prerelease: false + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/README.md b/README.md index a1c73c5..566096b 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # 🌿 Sober-Path -### Путь к осознанной трезвости +### Путь к осознанной трезвости | Your Path to Conscious Sobriety [![Version](https://img.shields.io/badge/Version-v1.18.0-4CAF50?style=for-the-badge)](https://github.com/mx57/Sober-Path/releases) [![License: MIT](https://img.shields.io/badge/License-MIT-green?style=for-the-badge)](https://opensource.org/licenses/MIT) @@ -11,18 +11,63 @@ [![TypeScript](https://img.shields.io/badge/TypeScript-5.x-3178C6?style=for-the-badge)](https://www.typescriptlang.org/) [![Platform](https://img.shields.io/badge/Platform-Android%20%7C%20iOS%20%7C%20Web-brightgreen?style=for-the-badge)]() [![Status](https://img.shields.io/badge/Status-Active-FF9800?style=for-the-badge)]() +[![PRs Welcome](https://img.shields.io/badge/PRs-Welcome-brightgreen?style=for-the-badge)](https://github.com/mx57/Sober-Path/pulls) +[![Downloads](https://img.shields.io/github/downloads/mx57/Sober-Path/total?style=for-the-badge&color=blue)](https://github.com/mx57/Sober-Path/releases) --- + + + + + + + + + + + + + + + ## 📋 О проекте -**Sober-Path** — это комплексное мобильное приложение для поддержки трезвости и выздоровления от алкогольной зависимости. Приложение разработано на базе современных технологий React Native + Expo и объединяет evidence-based методы психотерапии (КПТ, DBT, ACT, EMDR, НЛП), искусственный интеллект и силу сообщества для создания персонализированной системы поддержки на каждом этапе пути к трезвости. +**Sober-Path** — это бесплатное open-source мобильное приложение для поддержки трезвости и выздоровления от алкогольной зависимости. Приложение разработано на базе современных технологий React Native + Expo и объединяет evidence-based методы психотерапии (КПТ, DBT, ACT, EMDR, НЛП), искусственный интеллект и силу сообщества для создания персонализированной системы поддержки на каждом этапе пути к трезвости. + +> **🔍 Ключевые слова:** трезвость, выздоровление, алкогольная зависимость, реабилитация, AI коуч, когнитивно-поведенческая терапия, КПТ, DBT, NLP, медитация, mindfulness, дневник, сообщество поддержки, sober tracker, addiction recovery, mental health, open source, React Native, Expo, Android + +### 🎯 Для кого это приложение -Ядро приложения — **AI-Коуч**, который отслеживает настроение и состояние пользователя, формирует персонализированные рекомендации и проактивно предлагает техники снятия стресса в моменты повышенной тяги. Система обладает памятью достижений и историей взаимодействий, что позволяет коучу адаптироваться к индивидуальным потребностям каждого пользователя и предлагать именно те инструменты, которые работают в конкретной ситуации. +- 🧑‍🍼 Люди, которые хотят бросить пить или уже в процессе выздоровления +- 👨‍👩‍👧‍👦 Родственники и близкие людей с алкогольной зависимостью +- 🩺 Психологи, терапевты и наркологи, ищущие цифровые инструменты для клиентов +- 🤝 Сообщества трезвости, ищущие бесплатный open-source инструмент -Помимо AI-поддержки, Sober-Path предлагает обширную экосистему инструментов: интерактивные упражнения с гидируемым режимом, микро-курсы по психологии зависимости, мини-игры для когнитивного тренинга, дневник с AI-анализом, терапевтические звуки и бинауральные ритмы, gamification-систему с достижениями и квестами, а также живое сообщество с «Кругами поддержки». Всё это доступно на русском и английском языках и работает на Android, iOS и Web. +### 💡 Почему Sober-Path + +| Особенность | Описание | +|:---|:---| +| 🤖 **AI-коуч** | Персонализированный ИИ-ассистент, который отслеживает настроение и предлагает техники снятия стресса | +| 🧪 **Evidence-based** | Методы КПТ, DBT, ACT, EMDR, НЛП — научно обоснованные подходы | +| 📱 **Кроссплатформенность** | Android, iOS и Web — работает везде | +| 🔓 **Бесплатно и open-source** | Полностью бесплатное, никакой рекламы, приватность защищена | +| 🌍 **Мультиязычность** | Русский и английский интерфейс | +| 🔒 **Приватность** | Данные хранятся на устройстве, никаких серверов | --- @@ -32,11 +77,11 @@ | Домашний экран | AI-Коуч | Курсы | Сообщество | |:---:|:---:|:---:|:---:| -| Домашний экран | AI-Коуч | Курсы | Сообщество | +| Домашний экран — трекер трезвости, план недели, быстрые действия | AI-коуч — персонализированные рекомендации | Микро-курсы по психологии зависимости | Сообщество поддержки и круги помощи | | Тренажёр | AI-Аналитика | Упражнения | Настройки | |:---:|:---:|:---:|:---:| -| Тренажёр | AI-Аналитика | AI-Чат | Настройки | +| Тренажёр — структурированные программы обучения | AI-аналитика — глубокая статистика прогресса | AI-чат — свободный диалог с ассистентом | Настройки — персонализация и темы | @@ -137,6 +182,61 @@ --- +## 📥 Установка + +### Скачать готовый APK (рекомендуется) + +Перейдите на страницу [Releases](https://github.com/mx57/Sober-Path/releases) и скачайте последний APK: + +| Архитектура | Ссылка | Для кого | +|:---:|:---|:---| +| **Universal** | `Sober-Path-v*-universal.apk` | **Рекомендуется** — подходит для большинства устройств | +| **ARM 64-bit** | `Sober-Path-v*-arm64.apk` | Современные телефоны (2019+) | +| **ARM 32-bit** | `Sober-Path-v*-arm32.apk` | Старые и бюджетные устройства | +| **x86_64** | `Sober-Path-v*-x86_64.apk` | Эмуляторы и Chromebook | + +> 💡 **Не уверены какая архитектура?** Скачивайте `universal` — он работает на всех устройствах. + +### Системные требования +- **OS:** Android 7.0 (API 24) и выше +- **Память:** ~50 МБ +- **RAM:** Рекомендуется 2+ ГБ + +### Из исходников + +```bash +# 1. Клонируйте репозиторий +git clone https://github.com/mx57/Sober-Path.git +cd Sober-Path + +# 2. Установите зависимости +npm install --legacy-peer-deps + +# 3. Запустите проект +npx expo start +``` + +### Запуск на разных платформах + +```bash +# Android (эмулятор/устройство) +npx expo run:android + +# iOS (только macOS + Xcode) +npx expo run:ios + +# Веб-браузер +npx expo start --web +``` + +### Тестирование + +```bash +npm test +``` + +--- + ## 🛠 Технологический стек | Категория | Технологии | @@ -160,7 +260,7 @@ ## 🏗 Архитектура -Приложение построено по паттерну **MVVM (View → ViewModel → Service)**, обеспечивающему разделение ответственности, тестируемость и масштибируемость кодовой базы. +Приложение построено по паттерну **MVVM (View → ViewModel → Service)**, обеспечивающему разделение ответственности, тестируемость и масштабируемость кодовой базы. ``` ┌─────────────┐ ┌──────────────┐ ┌─────────────┐ @@ -183,48 +283,6 @@ --- -## 🚀 Начало работы - -### Предварительные требования -- [Node.js](https://nodejs.org/) 18+ -- [Expo CLI](https://docs.expo.dev/get-started/installation/) -- Смартфон с [Expo Go](https://expo.dev/go) или эмулятор - -### Установка - -```bash -# 1. Клонируйте репозиторий -git clone https://github.com/mx57/Sober-Path.git -cd Sober-Path - -# 2. Установите зависимости -npm install --legacy-peer-deps - -# 3. Запустите проект -npx expo start -``` - -### Запуск на разных платформах - -```bash -# Android (эмулятор/устройство) -npx expo run:android - -# iOS (только macOS + Xcode) -npx expo run:ios - -# Веб-браузер -npx expo start --web -``` - -### Тестирование - -```bash -npm test -``` - ---- - ## 📁 Структура проекта ``` @@ -237,75 +295,34 @@ Sober-Path/ │ │ ├── community.tsx # Сообщество │ │ ├── articles.tsx # База знаний │ │ ├── courses.tsx # Тренировки -│ │ ├── micro-courses.tsx # Микро-курсы │ │ ├── exercises.tsx # Упражнения (единый раздел) │ │ ├── analytics.tsx # Аналитика -│ │ ├── advanced-analytics.tsx # Продвинутая аналитика │ │ ├── journal.tsx # Дневник │ │ ├── sounds.tsx # Звуки -│ │ ├── gamification.tsx # Gamification │ │ ├── mini-games.tsx # Мини-игры -│ │ ├── therapy.tsx # Терапия -│ │ ├── advanced-therapy.tsx # Продвинутая терапия -│ │ ├── psychology.tsx # Психология -│ │ ├── personalized-recommendations.tsx -│ │ ├── profile.tsx # Профиль │ │ └── enhanced-settings.tsx # Настройки -│ └── i18n/ # Локализация ├── services/ # Бизнес-логика │ ├── AICoachService.ts # AI-Коуч │ ├── communityService.ts # Сообщество │ ├── articlesDatabase.ts # База статей -│ ├── microCoursesService.ts # Микро-курсы │ ├── enhancedNLPService.ts # NLP-техники │ ├── therapeuticTechniques.ts # Терапевтические техники -│ ├── traumaTherapyService.ts # Травмо-ориентированная терапия -│ ├── integrativeTherapyService.ts -│ ├── interactiveMeditationService.ts -│ ├── miniGamesService.ts # Мини-игры │ ├── journalService.ts # Дневник │ ├── audioService.ts # Аудио-плеер │ ├── recoveryService.ts # Трекер трезвости -│ ├── advancedInsightsService.ts -│ ├── advancedMoodTracker.ts -│ ├── smartRecommendationEngine.ts -│ ├── smartNotificationService.ts │ ├── sosService.ts # Экстренная помощь -│ ├── personalizationService.ts -│ ├── dailyMotivationService.ts -│ ├── psychologyKnowledgeBase.ts -│ ├── questService.ts # Квесты -│ └── ... +│ └── questService.ts # Квесты ├── components/ # Переиспользуемые UI-компоненты │ ├── AchievementSystem.tsx # Система достижений -│ ├── AdvancedAudioPlayer.tsx # Продвинутый аудио-плеер -│ ├── AdvancedTherapyPlayer.tsx -│ ├── ArticleQuiz.tsx # Квизы -│ ├── CrisisIntervention.tsx # Кризисное вмешательство -│ ├── ProgressAnalytics.tsx # Визуализация прогресса │ ├── QuestMap.tsx # Карта квестов -│ ├── TherapeuticSoundPlayer.tsx │ └── home/ # Компоненты главного экрана ├── hooks/ # Кастомные хуки (ViewModel) -│ ├── useAICoachViewModel.tsx -│ ├── useAnalytics.tsx -│ ├── useAnalyticsViewModel.tsx -│ ├── useRecovery.tsx -│ └── useThemeColor.ts ├── contexts/ # React Context (глобальное состояние) -│ ├── RecoveryContext.tsx -│ └── AnalyticsContext.tsx -├── constants/ # Константы приложения +├── services/ # Сервисы (Business Logic) ├── assets/ # Статические ресурсы -│ ├── images/ # Изображения и иконки -│ ├── fonts/ # Шрифты -│ └── screenshots/ # Скриншоты для README -├── __tests__/ # Тесты +├── .github/workflows/ # CI/CD (GitHub Actions) ├── app.json # Конфигурация Expo -├── package.json # Зависимости -├── tsconfig.json # Конфигурация TypeScript -├── babel.config.js # Конфигурация Babel -└── jest.config.js # Конфигурация Jest +└── package.json # Зависимости ``` --- @@ -329,6 +346,13 @@ Sober-Path/ - Добавляйте локализацию для нового контента (`i18n/`) - Соблюдайте стиль кода (ESLint конфигурация в проекте) +### CI/CD + +При слиянии Pull Request в `main` автоматически: +- 🔨 Собираются APK для 4 архитектур (universal, arm64, arm32, x86_64) +- 📦 Создаётся GitHub Release с описанием изменений из PR +- 📋 Артефакты доступны для скачивания на странице Releases + --- ## 📜 Лицензия @@ -361,6 +385,33 @@ SOFTWARE. --- +## 🔗 Полезные ссылки + +| Ресурс | Ссылка | +|:---|:---| +| 📥 Скачать APK | [Releases](https://github.com/mx57/Sober-Path/releases) | +| 🐛 Сообщить об ошибке | [Issues](https://github.com/mx57/Sober-Path/issues) | +| 💡 Предложить улучшение | [Feature Requests](https://github.com/mx57/Sober-Path/issues/new?template=feature_request.md) | +| 📖 Документация Expo | [docs.expo.dev](https://docs.expo.dev/) | +| 🧠 React Native | [reactnative.dev](https://reactnative.dev/) | + +--- + +## 🆘 Кризисная помощь + +Если вы или кто-то из ваших близких нуждается в помощи: + +| Страна | Телефон | Описание | +|:---:|:---:|:---| +| 🇷🇺 Россия | **8-800-2000-122** | Телефон доверия (бесплатно) | +| 🇺🇦 Україна | **0-800-501-892** | Національна гаряча лінія | +| 🇺🇸 USA | **988** | Suicide & Crisis Lifeline | +| 🌍 Международно | [findahelpline.com](https://findahelpline.com/) | Поиск линий помощи по странам | + +> **Помните:** Вы не одиноки. Помощь доступна. Каждый трезвый день — это победа. 💚 + +--- +
### 🌿 Каждый трезвый день — это победа. @@ -373,4 +424,6 @@ SOFTWARE. *Сделано с ❤️ для тех, кто выбирает жизнь без зависимости.* +[![Star History Chart](https://api.star-history.com/svg?repos=mx57/Sober-Path&type=Date)](https://star-history.com/#mx57/Sober-Path&Date) +