# Обзор проекта StickerBot

## Общее описание

StickerBot - это Telegram MiniApp для генерации стикеров из пользовательских изображений. Приложение позволяет пользователям загружать свои фотографии, обрезать их, выбирать стиль и образ для генерации стикеров, а затем получать готовые стикеры.

## Архитектура проекта

Проект построен на принципе разделения клиентской и серверной логики:

```mermaid
graph TD
    A[Клиент/MiniApp] --> B[Telegram WebApp API]
    A --> C[Сервер]
    C --> D[API генерации]
    
    B -- "user_id, username" --> C
    C -- "статус, результаты" --> A
```

### Технологический стек

- **Фронтенд**: React + TypeScript + Vite
- **Маршрутизация**: React Router
- **Стили**: CSS Modules
- **API**: REST API

## Структура проекта

### Основные директории

- **src/components/** - компоненты пользовательского интерфейса
  - **blocks/** - переиспользуемые блоки UI (кнопки, поля ввода, загрузка фото)
  - **layout/** - компоненты макета (заголовок, навигация)
  - **shared/** - общие компоненты (просмотр изображений, обработка ошибок)
- **src/screens/** - экраны приложения
- **src/config/** - конфигурации (стили, экраны)
- **src/constants/** - константы (базовый воркфлоу)
- **src/services/** - сервисы для работы с API
- **src/types/** - типы TypeScript
- **src/assets/** - статические ресурсы (изображения, промпты)

### Ключевые файлы

- **src/App.tsx** - основной компонент приложения с маршрутизацией
- **src/main.tsx** - точка входа в приложение
- **src/screens/Home.tsx** - домашний экран
- **src/screens/CropPhoto.tsx** - экран обрезки фото
- **src/services/api.ts** - сервис для работы с API
- **src/config/homeScreen.ts** - конфигурация домашнего экрана
- **src/config/stylePresets.ts** - предустановленные стили для стикеров
- **src/constants/baseWorkflow.ts** - базовый воркфлоу для генерации стикеров
- **src/assets/prompts.ts** - промпты для генерации стикеров

## Маршрутизация

Приложение использует React Router для навигации между экранами:

- **Онбординг**:
  - `/onboarding/welcome` - приветственный экран
  - `/onboarding/how-to` - инструкции по использованию
  - `/onboarding/sticker-packs` - информация о наборах стикеров
- **Основные экраны**:
  - `/` - домашний экран
  - `/create` - создание стикера
  - `/gallery` - галерея сгенерированных стикеров
  - `/packs` - наборы стикеров
  - `/profile` - профиль пользователя
  - `/history` - история генераций
  - `/crop-photo` - обрезка фото

## Компонентная структура

### Блоки UI

Приложение использует компонентный подход с блоками UI, которые рендерятся через компонент BlockRenderer:

- **ScrollableButtonsBlock** - блок с прокручиваемыми кнопками
- **GridButtonsBlock** - блок с сеткой кнопок
- **UploadPhotoBlock** - блок для загрузки фото
- **DividerBlock** - разделитель
- **TextInputBlock** - блок для ввода текста
- **GenerateButton** - кнопка для генерации стикеров
- **StepTitle** - заголовок шага

### Макет

Компонент Layout обеспечивает общую структуру интерфейса:

- **Header** - заголовок
- **Navigation** - навигация
- **ErrorBoundary** - обработка ошибок
- **Suspense** - обработка состояния загрузки

## Процесс генерации стикера

```mermaid
graph TD
    A[Загрузка фото] -->|Перенаправление на экран обрезки| B[Обрезка фото]
    B -->|Возврат на главный экран| C[Выбор стиля]
    C --> D[Выбор образа]
    D --> E[Генерация стикера]
    E -->|API запрос| F[Получение результата]
```

1. **Загрузка изображения**:
   - Пользователь загружает фото через компонент UploadPhotoBlock
   - Поддерживается перетаскивание и выбор файла

2. **Обрезка изображения**:
   - Пользователь перенаправляется на экран CropPhoto
   - Возможность масштабирования и перемещения изображения
   - Выбор области для стикера
   - Преобразование в base64 и передача на главный экран

3. **Выбор стиля**:
   - Доступные стили: чиби, реализм, эмоции
   - Каждый стиль имеет свои предустановленные образы

4. **Выбор образа**:
   - Для стиля "чиби": спорткар, скейтборд, кофе, цветы и т.д.
   - Для стиля "реализм": деловой, повседневный, спортивный и т.д.
   - Для стиля "эмоции": радость, грусть, злость и т.д.

5. **Генерация стикера**:
   - Отправка запроса на сервер через API
   - Использование базового воркфлоу с заменой изображения и промпта

## Взаимодействие с API

### API Эндпоинты

- **POST /generate_image** - генерация изображения
- **GET /images_links/{user_id}** - получение списка изображений

### Сервис API

Сервис apiService предоставляет методы:

- **getGeneratedImages** - получение списка сгенерированных изображений
- **generateImage** - генерация нового изображения

### Процесс генерации

1. Создание копии базового воркфлоу
2. Вставка изображения в формате base64
3. Замена промпта в зависимости от выбранного образа
4. Отправка запроса на сервер
5. Получение результата

## Стили и образы

### Стили

- **chibi** - стиль чиби (мультяшный, милый)
- **realism** - реалистичный стиль
- **emotions** - стиль эмоций

### Образы для стиля "чиби"

- спорткар
- скейтборд
- кофе
- цветы
- шарик
- книга
- мороженое
- зонт
- коктейль
- подарок
- собака
- газета
- велосипед
- серфер
- детектив
- байкер
- фея
- ученый
- ковбой
- рыцарь
- балерина
- пожарный
- шеф-повар

### Образы для стиля "реализм"

- деловой
- повседневный
- спортивный
- вечерний
- пляжный
- зимний
- ретро
- киберпанк
- военный
- стимпанк

### Образы для стиля "эмоции"

- радость
- грусть
- злость
- любовь
- удивление
- страх
- сонный
- крутой
- глупый
- думающий

## Технические особенности

### Конфигурационный подход

Интерфейс строится на основе конфигурации (homeScreenConfig), что позволяет легко изменять структуру экранов без изменения кода.

### Компонент BlockRenderer

Рендерит различные блоки в зависимости от их типа, что обеспечивает гибкость и переиспользуемость компонентов.

### Воркфлоу генерации

Сложная конфигурация для нейросети (baseWorkflow), которая включает в себя различные модели и операции для генерации стикеров.

### Обработка изображений

- Локальная обработка изображений перед отправкой
- Кэширование результатов в галерее
- Отложенная загрузка изображений
- Обработка состояний загрузки и ошибок

## Безопасность

1. Все API запросы выполняются только через сервер
2. Клиент не имеет прямого доступа к API генерации
3. Валидация пользователя происходит на сервере
4. Проверка баланса выполняется на сервере перед генерацией

## Дальнейшее развитие

1. Добавление новых стилей генерации
2. Система рейтинга стикеров
3. Социальные функции (шаринг, коллекции)
4. Интеграция с другими сервисами Telegram
