Назначение: Context провайдер для глобального состояния приложения
Состояние:
currentTopic: number- ID текущей активной темы (0 = "All")setCurrentTopic: (topicId: number) => void- функция установки текущей темыallTabs: Topic[]- массив всех закрепленных вкладокsetAllTabs: (tabs: Topic[]) => void- функция обновления вкладок
Использование: Оборачивает корневой компонент приложения
Особенности:
- При монтировании автоматически загружает все вкладки из БД
Назначение: Главный компонент контента приложения
Функциональность:
- Отображение горизонтального списка вкладок (ScrollView)
- Отображение списка тем и заметок текущей темы
- Создание новых тем через модальное окно
- Создание новых заметок (кнопка "+" справа внизу)
- Свайпы для переключения вкладок:
- Свайп влево - следующая вкладка
- Свайп вправо - предыдущая вкладка
- Обработка клавиатуры (автоматический padding снизу при открытии)
- Обновление данных при возврате на экран через
useFocusEffect
Специальная вкладка "All":
- Вкладка с
id: 0всегда присутствует в списке - Показывает все корневые темы (без родителя)
- Нельзя удалить или открепить
UI элементы:
- Кнопка создания темы (FilePlus иконка) - слева внизу
- Кнопка создания задачи ("✓") - по центру внизу (только если
currentTopic !== 0) - Кнопка создания заметки ("+") - справа внизу (только если
currentTopic !== 0)
Назначение: Рекурсивный компонент для отображения темы и её подтем
Пропсы:
topic: Topic- объект темыdeleteTopic: (id: number) => void- функция удаления темыdepth?: number- глубина вложенности (для цветовой схемы, по умолчанию 0)setAsTab?: null | ((topic: Topic) => void)- функция закрепления как вкладки
Функциональность:
- Отображение названия темы
- Раскрытие/сворачивание подтем (chevron иконки)
- Модальное окно настроек (долгое нажатие):
- Удаление темы
- Закрепление/открепление как вкладки (в зависимости от текущего состояния)
- Добавление заметки
- Создание подтемы
- Рекурсивное отображение дочерних тем через локальный
TopicContentComponent - Автоматическое обновление подтем и заметок при разворачивании темы
Внутренние компоненты:
TopicContentComponent- локальный компонент для отображения содержимого темы (избегает require cycle)
Стили: Использует Topic.styles.ts и colorSchemes.js для цветов по глубине
Особенности:
- Использует
useMemoдля оптимизации проверкиisTab - Обновляет данные при каждом разворачивании темы через
useEffect
Назначение: Отображает содержимое темы (подтемы и заметки)
Пропсы:
topic: Topic- текущая темаsubtopics: Topic[]- массив подтемdeleteSubtopic: (id: number) => void- функция удаления подтемыdepth: number- текущая глубинаisExpanded: boolean- флаг развернутости темы
Функциональность:
- Рендерит список подтем (рекурсивно через
Topic) - Разделяет заметки на:
- Невыполненные задачи (отображаются через
Task) - Обычные заметки (отображаются через
Note) - Выполненные задачи (отображаются в виртуальной теме
CompletedTasksGroup)
- Невыполненные задачи (отображаются через
- Автоматически обновляет заметки при разворачивании темы
Порядок отображения:
- Подтемы
- Невыполненные задачи
- Обычные заметки
- Виртуальная тема "Выполненные задачи" (если есть выполненные)
Назначение: Компонент для отображения заметки
Пропсы:
note: Note- объект заметкиdeleteNote: (id: number) => void- функция удаления заметкиtopicId: number- ID темы, к которой принадлежит заметка
Функциональность:
- Отображение заметки в списке
- Отображение даты создания (форматированная через
formatDate) - Переход к редактору заметки при нажатии (через Expo Router)
- Модальное окно настроек (нажатие на MoreVertical):
- Удаление заметки
Особенности:
- Заметка является ссылкой на редактор (
/noteEditorс параметрамиtopicIdиnoteId) - Отображает заголовок (если есть) и содержимое
Назначение: Компонент для отображения задачи
Пропсы:
task: Note- объект задачи (Note сis_task = true)deleteTask: (id: number) => void- функция удаления задачиtopicId: number- ID темы, к которой принадлежит задачаtoggleTaskDone: (taskId: number, done: boolean) => void- функция переключения статуса выполнения
Функциональность:
- Отображение checkbox слева для переключения статуса выполнения
- Текст задачи справа (заголовок или содержимое)
- Зачеркнутый текст для выполненных задач (
done = true) - Переход к редактору задачи при нажатии на текст (через Expo Router)
- Модальное окно настроек (нажатие на MoreVertical):
- Удаление задачи
Особенности:
- При клике на checkbox переключает
doneчерезtoggleTaskDone() - Задача является ссылкой на редактор (
/noteEditorс параметрамиtopicIdиnoteId) - Отображает дату создания (форматированную через
formatDate)
Назначение: Компонент вкладки для быстрого доступа к теме
Пропсы:
tab: Topic- объект темы-вкладкиdeleteTopic: (id: number) => void- функция удаления темы
Функциональность:
- Отображение названия вкладки
- Переключение на тему при нажатии
- Визуальное выделение активной вкладки (жирный шрифт)
- Модальное окно настроек (долгое нажатие):
- Удаление темы
- Открепление вкладки
- Добавление заметки
- Создание подтемы
Особенности:
- Специальная вкладка "All" (
id: 0) не показывает модальное окно - Использует
AppContextдля отслеживания текущей активной темы
Назначение: Переиспользуемый компонент модального окна
Пропсы:
modalVisible: boolean- видимость модального окнаsetModalVisible: (visible: boolean) => void- функция управления видимостьюonClose?: () => void- callback при закрытииchildren: ReactNode- содержимое модального окна
Назначение: Переиспользуемый компонент текстового поля
Расположение: src/shared/TextInput.tsx
Пропсы:
value: string- значение поляsetValue: (text: string) => void- функция обновления значенияstyles?: StyleProp<TextStyle>- кастомные стилиdefaultValue?: string- значение по умолчаниюplaceholder?: string- плейсхолдер
Особенности:
- По умолчанию
multiline={true} - Поддерживает кастомные стили через проп
styles
Главный экран приложения, отображает AppContent
Экран редактора заметок
Параметры роутера:
topicId: number- ID темы (обязателен для создания новой заметки/задачи)noteId?: number- ID заметки/задачи (опционален, для редактирования существующей)isTask?: string | boolean- флаг создания задачи (еслиtrue, создается задача)
Функциональность:
- Автоматическое создание: При первом вводе текста автоматически создается заметка или задача
- Автоматическое обновление: При каждом изменении заметка/задача обновляется в БД
- Автоматическое удаление: Если заметка/задача была создана, но поля стали пустыми - она удаляется
- Поддержка заголовка и содержимого
- Редактирование существующих заметок и задач
- Переключатель "Это задача" для новых заметок (позволяет выбрать тип при создании)
Особенности:
- Использует
useRefдля отслеживания режима создания - Автоматически загружает данные заметки/задачи при открытии с
noteId - При редактировании существующей задачи показывает индикатор "Задача" (readonly)
Все иконки находятся в src/components/Icons/:
AddCircle.js- иконка добавленияChevronDown.js- стрелка вниз (свернуто)ChevronUp.js- стрелка вверх (развернуто)FilePlus.js- добавление файла/заметкиMoreVertical.js- меню действийTrash.js- удалениеWriteANote.js- написание заметки
Формат: SVG компоненты через react-native-svg
useTopics(parentTopicId: number = 0, init: Topic[] = []): {
topics: Topic[],
setTopics: (topics: Topic[]) => void,
createTopic: (parentId: number | null, topicName: string, orderIndex?: number) => Promise<number>,
deleteTopic: (topicId: number) => void,
renameTopic: (topicId: number, newName: string) => void
}Назначение: Хук для работы с темами
Функции:
createTopic- создает тему и автоматически обновляет списокdeleteTopic- удаляет тему и обновляет локальный списокrenameTopic- переименовывает тему в локальном состоянии
useNotes(topicId: number = 0): {
notes: Note[],
setNotes: (notes: Note[]) => void,
createNote: (topicId: number, text: string) => Promise<number>,
updateNote: (noteId: number, content?: string, title?: string) => void,
deleteNote: (noteId: number) => void
}Назначение: Хук для работы с заметками
Функции:
createNote- создает заметку и автоматически обновляет списокupdateNote- обновляет заметку в БД и локальном состоянииdeleteNote- удаляет заметку и обновляет локальный список
Назначение: Хук для управления модальными окнами
Функции:
formatDate(str: string | number): string- форматирует Unix timestamp в читаемую дату- Формат:
DD.MM.YYYY HH:MM
- Формат:
- Рекурсивный рендеринг:
Topicкомпонент рекурсивно рендерит себя черезTopicContentComponent - Context для глобального состояния: Текущая тема и вкладки хранятся в
AppContext - Custom hooks: Логика работы с данными вынесена в хуки (
useNotes,useModal) - Service layer: Все операции с БД через
databaseService.ts - Автоматическое обновление: Компоненты автоматически обновляют данные при разворачивании/монтировании
- Свайпы: Поддержка жестов для переключения между вкладками