Детали модулей и файлов¶
Уровень: L3 (deep-dive) | Вверх: README.md | Раздел: ../README.md
Модуль api/ — HTTP-клиент и API-модули¶
Назначение: Инкапсуляция всех HTTP-запросов к серверу. Единственная точка взаимодействия с REST API.
| Файл | Строк | Экспорты | Используется в |
|---|---|---|---|
client.ts |
82 | apiClient (axios instance) |
Все api/*.ts модули |
auth.ts |
32 | authApi |
LoginPage, RegisterPage, SettingsPage, authStore |
items.ts |
19 | itemsApi |
offline/services, offline/hooks |
outfits.ts |
47 | outfitsApi |
FeedPage, OutfitBuilderPage, OutfitDetailPage, SharePage |
media.ts |
42 | mediaApi |
AddItemDetailsPage, SettingsPage, offline/services |
feed.ts |
7 | feedApi |
FeedPage |
reference.ts |
19 | referenceApi |
offline/hooks/useLocalReference |
share.ts |
18 | shareApi |
ShareRecipientPage, ProfilePage |
Итого: 8 файлов, ~266 строк.
Модуль components/ui/ — базовые UI-элементы¶
Назначение: Переиспользуемые UI-примитивы без бизнес-логики. Не зависят от API, сторов или маршрутизации (за исключением offline-компонентов).
| Файл | Строк | Экспорты | Используется в |
|---|---|---|---|
MediaCard.tsx |
71 | MediaCard |
ItemCard, OutfitCard |
MediaCard.module.css |
85 | — | MediaCard |
FilterChip.tsx |
53 | FilterChip |
FeedPage, WardrobePage |
FilterChip.module.css |
55 | — | FilterChip |
BottomSheet.tsx |
26 | BottomSheet |
WardrobeItemPage, OutfitDetailPage |
bottomSheet.css |
~30 | — | BottomSheet |
EmptyState.tsx |
31 | EmptyState |
WardrobePage, OutfitsPage, FeedPage |
EmptyState.module.css |
~35 | — | EmptyState |
AuthShell.tsx |
45 | AuthShell |
LoginPage, RegisterPage |
AuthShell.module.css |
75 | — | AuthShell |
ActionIconButton.tsx |
33 | ActionIconButton |
WardrobeItemPage, OutfitDetailPage, PageHeader |
ActionIconButton.module.css |
35 | — | ActionIconButton |
SharedAccessRow.tsx |
65 | SharedAccessRow |
SharedOutfitCard |
SharedAccessRow.module.css |
65 | — | SharedAccessRow |
TextField.tsx |
55 | TextField |
LoginPage, RegisterPage, SettingsPage |
textField.css |
~20 | — | TextField |
SelectField.tsx |
32 | SelectField |
AddItemDetailsPage, WardrobeItemPage |
selectField.css |
~15 | — | SelectField |
PrimaryButton.tsx |
9 | PrimaryButton |
LoginPage, RegisterPage, AddItemDetailsPage |
SecondaryButton.tsx |
9 | SecondaryButton |
SharePage, SettingsPage |
DangerButton.tsx |
9 | DangerButton |
SettingsPage |
buttons.css |
~25 | — | *Button |
SkeletonCard.tsx |
42 | SkeletonCard |
SimilarItemsRail, SimilarOutfitsGrid, FeedPage, WardrobePage |
SkeletonCard.module.css |
50 | — | SkeletonCard |
OfflineBanner.tsx |
47 | OfflineBanner |
AppLayout |
OfflineBanner.module.css |
35 | — | OfflineBanner |
OfflineUnavailable.tsx |
22 | OfflineUnavailable |
OfflineErrorBoundary, ShareRecipientPage |
OfflineUnavailable.module.css |
35 | — | OfflineUnavailable |
OfflineErrorBoundary.tsx |
57 | OfflineErrorBoundary |
App.tsx (обёртка маршрутов) |
UpdateAvailableToast.tsx |
16 | UpdateAvailableToast |
App.tsx |
UpdateAvailableToast.module.css |
40 | — | UpdateAvailableToast |
PendingChangesBadge.tsx |
25 | PendingChangesBadge |
HomePage |
PendingChangesBadge.module.css |
15 | — | PendingChangesBadge |
Итого: ~34 файла, ~1 307 строк.
Модуль components/common/ — бизнес-компоненты¶
Назначение: Компоненты, привязанные к доменным сущностям (Item, Outfit, User). Используют типы из types/api.ts и утилиты из utils/media.ts.
| Файл | Строк | Экспорты | Используется в |
|---|---|---|---|
ItemCard.tsx |
25 | ItemCard |
WardrobePage, ItemSelectPage, SimilarItemsRail |
OutfitCard.tsx |
40 | OutfitCard |
OutfitsPage, HomePage, FeedPage, SimilarOutfitsGrid |
SharedOutfitCard.tsx |
50 | SharedOutfitCard |
ProfilePage |
ProfileAvatarButton.tsx |
34 | ProfileAvatarButton |
HomePage |
ProfileAvatarButton.module.css |
25 | — | ProfileAvatarButton |
SimilarItemsRail.tsx |
41 | SimilarItemsRail |
WardrobeItemPage |
SimilarItemsRail.module.css |
25 | — | SimilarItemsRail |
SimilarOutfitsGrid.tsx |
42 | SimilarOutfitsGrid |
OutfitDetailPage |
SimilarOutfitsGrid.module.css |
20 | — | SimilarOutfitsGrid |
Итого: ~9 файлов, ~302 строки.
Модуль components/layout/ — каркас приложения¶
Назначение: Компоненты верхнего уровня, формирующие визуальный каркас. Используются один раз в App.tsx или в каждой странице.
| Файл | Строк | Экспорты | Используется в |
|---|---|---|---|
AppLayout.tsx |
16 | AppLayout |
App.tsx (Route element) |
AppLayout.module.css |
15 | — | AppLayout |
BottomNav.tsx |
91 | BottomNav |
AppLayout |
BottomNav.module.css |
60 | — | BottomNav |
PageHeader.tsx |
46 | PageHeader |
WardrobeItemPage, OutfitDetailPage, SettingsPage, SharePage и др. |
PageHeader.module.css |
55 | — | PageHeader |
Итого: 6 файлов, ~283 строки.
Модуль hooks/ — пользовательские хуки¶
Назначение: Переиспользуемая логика, не привязанная к конкретному компоненту.
| Файл | Строк | Экспорты | Используется в |
|---|---|---|---|
useDebounce.ts |
12 | useDebounce<T> |
WardrobePage (фильтрация) |
useWeather.ts |
255 | useWeather, readCachedWeather |
HomePage, FeedPage |
useVirtualPagination.ts |
53 | useVirtualPagination<T> |
WardrobePage, OutfitsPage |
useServiceWorker.ts |
32 | useServiceWorker |
App.tsx |
Итого: 4 файла, ~352 строки.
Модуль stores/ — Zustand-сторы¶
Назначение: Глобальное клиентское состояние.
| Файл | Строк | Экспорты | Используется в |
|---|---|---|---|
auth.ts |
85 | useAuthStore |
ProfilePage, SettingsPage, ProfileAvatarButton, ProtectedRoute, apiClient |
outfitBuilder.ts |
70 | useOutfitBuilderStore, BuilderItem, BuilderSlotState |
OutfitBuilderPage, ItemSelectPage |
Итого: 2 файла, ~155 строк.
Модуль offline/ — offline-first функциональность¶
Назначение: Полный цикл работы в офлайне: локальное хранение, CRUD, очередь синхронизации, движок синхронизации.
offline/db/ — схема базы данных¶
| Файл | Строк | Экспорты | Используется в |
|---|---|---|---|
schema.ts |
55 | PlechikiDB |
dexie.ts |
dexie.ts |
4 | db (singleton) |
Все repositories, services, hooks |
offline/hooks/ — хуки для локальных данных¶
| Файл | Строк | Экспорты | Используется в |
|---|---|---|---|
useLocalItems.ts |
110 | useLocalItems, useLocalItem |
WardrobePage, WardrobeItemPage |
useLocalItemsByIds.ts |
26 | useLocalItemsByIds |
OutfitDetailPage, OutfitBuilderPage |
useLocalOutfits.ts |
123 | useLocalOutfits, useLocalOutfit |
OutfitsPage, HomePage |
useLocalOutfitsByIds.ts |
40 | useLocalOutfitsByIds |
— |
useLocalReference.ts |
77 | useLocalReference (+aliased: useLocalColors, useLocalCategories, useLocalSlots, useLocalStyles, useLocalCollections) |
WardrobePage, AddItemDetailsPage, OutfitBuilderPage, FeedPage |
usePendingCount.ts |
21 | usePendingCount |
OfflineBanner, PendingChangesBadge |
offline/network/ — сетевой статус¶
| Файл | Строк | Экспорты | Используется в |
|---|---|---|---|
networkStatus.ts |
32 | networkStatus |
OfflineErrorBoundary, useNetworkStatus |
useNetworkStatus.ts |
14 | useNetworkStatus |
OfflineBanner, FeedPage, ProfilePage |
offline/repositories/ — слой доступа к данным¶
| Файл | Строк | Экспорты | Используется в |
|---|---|---|---|
itemsRepository.ts |
268 | itemsRepository, serverItemToLocal, localItemToApi |
useLocalItems, offlineItemsService, syncEngine |
outfitsRepository.ts |
221 | outfitsRepository, serverOutfitToLocal, outfitFingerprint, findDuplicateOutfit, getOutfitIdsContainingItem |
useLocalOutfits, offlineOutfitsService, syncEngine |
mediaRepository.ts |
42 | mediaRepository |
offlineItemsService |
syncRepository.ts |
96 | syncRepository |
syncEngine, operationQueue |
offline/services/ — бизнес-логика¶
| Файл | Строк | Экспорты | Используется в |
|---|---|---|---|
initialSync.ts |
259 | performInitialSync, registerRefreshSyncListener |
main.tsx |
localData.ts |
44 | clearLocalData |
authStore (logout) |
offlineItemsService.ts |
170 | offlineItemsService |
AddItemDetailsPage, WardrobeItemPage |
offlineOutfitsService.ts |
93 | offlineOutfitsService |
OutfitBuilderPage, OutfitDetailPage |
offline/sync/ — движок синхронизации¶
| Файл | Строк | Экспорты | Используется в |
|---|---|---|---|
syncTypes.ts |
131 | SyncStatus, OperationStatus, OperationType, LocalItem, LocalOutfit, PendingOperation, SyncMetadata, ... |
Все offline модули |
operationQueue.ts |
159 | operationQueue |
syncEngine |
syncEngine.ts |
326 | syncEngine |
main.tsx, offlineServices |
retryPolicy.ts |
22 | calculateNextRetryTime |
syncEngine |
Итого модуль offline: 17 файлов, ~1 933 строки.
Модуль embeddings/ — векторные эмбеддинги¶
Назначение: Клиентский поиск похожих вещей и образов на основе векторных представлений.
| Файл | Строк | Экспорты | Используется в |
|---|---|---|---|
embeddingTypes.ts |
33 | SimilarityResult, SimilaritySearchState, WorkerSearchResponse, WorkerSearchMessage |
similarityService, useEmbeddingSearch |
embeddingRepository.ts |
92 | embeddingRepository |
similarityService, initialSync |
vectorMath.ts |
47 | cosineSimilarity, euclideanDistance, normalizeVector |
search.worker |
outfitEmbeddingService.ts |
40 | outfitEmbeddingService |
offlineOutfitsService |
similarityService.ts |
141 | similarityService |
useEmbeddingSearch |
useEmbeddingSearch.ts |
87 | useSimilarItems, useSimilarOutfits |
WardrobeItemPage, OutfitDetailPage |
search.worker.ts |
43 | Web Worker (self-contained) | similarityService |
Итого: 7 файлов, ~483 строки (включая вспомогательные).
Модуль theme/ — дизайн-система¶
| Файл | Строк | Экспорты | Используется в |
|---|---|---|---|
tokens.ts |
91 | tokens (raw design tokens) |
semanticTokens, antdTheme |
semanticTokens.ts |
39 | semanticTokens |
antdTheme, cssVars.css |
typography.ts |
61 | typography (CSSProperties styles) |
antdTheme |
antdTheme.ts |
113 | antdTheme (ThemeConfig) |
App.tsx (ConfigProvider) |
cssVars.css |
77 | CSS Custom Properties (--pl-*) |
Все .module.css файлы |
Итого: 5 файлов, ~381 строка.
Модуль types/ — TypeScript-типы¶
| Файл | Строк | Экспорты | Используется в |
|---|---|---|---|
api.ts |
288 | User, Item, Outfit, Media, Color, ItemCategory, Slot, StyleNode, Collection, FeedList, + 30 DTO-типов |
Все модули |
index.ts |
1 | — | — |
Итого: 2 файла, ~289 строк.
Модуль utils/ — утилиты¶
| Файл | Строк | Экспорты | Используется в |
|---|---|---|---|
compressImage.ts |
109 | compressImage |
mediaApi.upload |
media.ts |
71 | getItemImageUrl, getOutfitImageUrl, getOutfitHeroImageUrl, getAvatarUrl, getCollectionCoverUrl, isEmptyPlaceholderImage, handleImgError |
ItemCard, OutfitCard, Pages |
feedSessionCache.ts |
84 | clearFeedSessionCache |
authStore.logout |
generateOutfitStoryImage.ts |
121 | generateOutfitStoryJpeg |
SharePage |
ruPluralize.ts |
19 | ruPluralize |
Различные страницы |
showAppConfirm.ts |
16 | showAppConfirm |
OutfitDetailPage, ProfilePage |
Итого: 6 файлов, ~420 строк.
Модуль config/ — конфигурация¶
| Файл | Строк | Экспорты | Используется в |
|---|---|---|---|
attrMappings.ts |
64 | articleTypeToCategoryName, colourToColorName |
AddItemDetailsPage (ML-предсказания) |
Итого: 1 файл, ~64 строки.
Корневые файлы¶
| Файл | Строк | Экспорты | Назначение |
|---|---|---|---|
App.tsx |
65 | App |
Корневой компонент: Router, QueryClientProvider, ConfigProvider, маршруты |
main.tsx |
42 | — | Точка входа: hydrate auth, start syncEngine, performInitialSync, render |
queryClient.ts |
16 | queryClient |
Конфигурация React Query: staleTime 5мин, networkMode always |
index.css |
54 | — | Глобальные стили: reset, safe-area, .sr-only, ant overrides, shimmer |
vite-env.d.ts |
1 | — | Vite environment type reference |
Итого корневых: 5 файлов, ~178 строк.
Сводная статистика¶
| Модуль | Файлов (TS/TSX) | Файлов (CSS) | Строк кода |
|---|---|---|---|
| pages | 16 | 16 | ~3 741 |
| offline | 17 | 0 | ~1 933 |
| components/ui | 17 | 12 | ~1 307 |
| embeddings | 7 | 0 | ~483 |
| utils | 6 | 0 | ~420 |
| theme | 4 | 1 | ~381 |
| hooks | 4 | 0 | ~352 |
| components/common | 6 | 3 | ~302 |
| types | 2 | 0 | ~289 |
| components/layout | 3 | 3 | ~283 |
| api | 8 | 0 | ~266 |
| root | 4 | 1 | ~178 |
| stores | 2 | 0 | ~155 |
| config | 1 | 0 | ~64 |
| routes | 1 | 0 | ~14 |
| Итого | ~98 | ~36 | ~12 168 |