§01
Обзор
- Что это: e-commerce-платформа доставки еды для Узбекистана. Основа — Vercel Next.js Commerce, но провайдер заменён на кастомный (
framework/local), который ходит во внешний REST/GraphQL API за товарами, категориями и заказами. Мультигородовой роутинг (/[city]/...), 3 языка (ru/uz/en), отслеживание заказа на карте в реальном времени, PWA. - Тип / статус / роль: web-app · maintained · contributor (командный проект, не соло).
- Активный период: база проекта с 2020-09 (upstream от Vercel). Вклад пользователя — с 2021-06-18 по 2026-05-18, то есть ~5 лет с перерывами; проект живой (последний коммит — май 2026, рефакторинг конфига).
§02
Стек
- Языки: TypeScript (основной), JavaScript, CSS-модули.
- Фреймворки/библиотеки: Next.js
14.2.35(Pages Router), React 18, Tailwind CSS (JIT, кастомные брейкпоинты и брендовые цвета),react-queryv3 (серверное состояние/поллинг),react-hook-form,axios+ кастомныйframework-фетчер,leaflet/react-leaflet(трекинг заказа),@pbe/react-yandex-maps+react-yandex-maps(выбор адреса/геокодинг),next-translate(i18n),next-pwa,framer-motion,libphonenumber-js,react-otp-input,react-hot-toast,keen-slider/react-slick/@egjs/react-flicking(карусели),next-seo,react-google-recaptcha-v3,react-facebook-pixel. - Инфра/деплой: кастомный Express-сервер (
server.js, порт 4646), PM2 (ecosystem.config.js,pm2.config.js),nginx.conf,deploy.sh(standalone-деплой). CI нет; pre-commit — husky + lint-staged (prettier). Хостинг — свои серверы (среди авторовroot@choparpizza.uz,davr@restaurant-chain.uz). - Данные: внешний API (
API_URL/publicRuntimeConfig.apiUrl), браузерное хранилище как слой состояния: пользователь — localStoragemijoz(base64 JSON), локация — sessionStorageyetkazish, активный город — cookies (activeCity,city_slug). Локали подтягиваются в рантайме из API (/api/get_langs). - Заметный тулинг: GraphQL codegen (legacy от Commerce, неактивен),
bun.lockb+yarn.lock+package-lock.json(три lock-файла → пакетные менеджеры менялись со временем),next-unusedдля поиска мёртвого кода, BUNDLE_ANALYZE.
§03
Что реализовано
IMPORTANT: большинство коммит-месседжей пользователя — мусор ("asdf", "asd", "remove", "s"), поэтому пункты ниже выведены из самого кода/диффов, а не из текста коммитов.
- Кастомный commerce-провайдер `framework/local` — заменил Shopify/BigCommerce/Swell на кастомный слой API: операции
get-site-info,get-all-products,get-product,get-page, хуки корзины/авторизации/вишлиста, кастомныйfetcher.ts. Это ядро адаптации форка под узбекский бэкенд. - Роутинг с привязкой к городу — корневой
/редиректит на/{city_slug}(дефолтtashkent), все страницы живут подpages/[city]/, валидация города на сервере черезgetSiteInfo(404, если города нет). - Отслеживание заказа на карте (
c8c6c7a7, авг 2025, +899 строк): страницыpages/[city]/track/[id]/иpages/[city]/order/[id]/track/(через паттерн.client.tsxдля чистого CSR). - OTP-авторизация — цепочка коммитов "otpinput", "otp", "otpinput upgrade" (
react-otp-input), плюс "creditcard", "payment", "payment type" — флоу оплаты и верификации. - Иконка курьера по типу транспорта (
b9420dd0, сен 2025):drive_type(bike/foot/car) → разные иконки lucide-react/react-icons. - Рефакторинг конфига (
5ff70a20, май 2026): убрал рантайм-фетч/api/configs/public+ base64-декод + sessionStorage из 8 клиентских компонентов, заменив на типизированныйNEXT_PUBLIC_LES_*env-конфиг (lib/data/storefront-config.ts). - Фикс перформанса/LCP (
cb93c2b5): заменил сырой<img>наnext/imageв MainSlider, убрал неиспользуемые импорты Flicking. - Standalone-деплой (
1c41379a): deploy.sh + PM2 + nginx. - Объём: 403 коммита пользователя из 2011 (остальное — upstream от Vercel: Luis Alvarez 401, Belen Curcio 352 и т.д., + команда: shahaa/Shahzod 154, Doniman, Ilhombek, Boburt). Активность волнами: пики в 2023 (заказы/категории/карточки), 2025 (трекинг, курьеры), 2026 (рефакторинг конфига). Проект живой и поддерживается.
§04
Технические челленджи
- SSR-безопасный трекинг на Leaflet с поллингом (
pages/[city]/track/[id]/index.client.tsx): Leaflet несовместим с SSR → решено черезdynamic(..., { ssr: false })дляMapContainer/TileLayer/Marker, условныйrequire('leaflet')подtypeof window !== 'undefined'и замену дефолтных иконок (L.Icon.Default.mergeOptions). Позиция курьера обновляется в реальном времени черезreact-queryrefetchInterval: 5000, который отключается (shouldFetch=false), как только API возвращаетsuccess:false— защита от бесконечного поллинга мёртвого заказа. → Демонстрирует: понимание SSR/гидратации, real-time UX и управление жизненным циклом запросов. - Кастомная иконка Leaflet из React-компонента (тот же файл,
getCourierIcon): React-иконка (lucide/react-icons) рендерится в строку черезrenderToStaticMarkup(<IconComponent/>)и встраивается вL.divIconс инлайновой CSS-анимацией@keyframes pulse-courier. Цвет/иконка выбираются поdrive_type. → Нетривиальный мост между React и императивным API Leaflet. - Guard при вычислении центра карты (
mapCenteruseMemo): усреднение координат from/to с проверкамиisNaNна каждом шаге и каскадным фолбэком (from+to → from → to → дефолт для активного города). → Аккуратная обработка граничных случаев при неполных данных API. - Замена рантайм-конфига на env (
5ff70a20): дифф убирает паттерн "fetch → Buffer.from(base64) → JSON.parse → sessionStorage" в 8 компонентах иpages/api/geocode.ts, переходя на типизированныйstorefrontConfigиз env. → Рефакторинг ради меньшего числа клиентских round-trip'ов и типобезопасности; зрелое инженерное решение (хотя и AI-assisted — см. ниже). - Абстракция провайдера Vercel Commerce над чужим API (
framework/local/api/operations/get-site-info.ts,fetcher.ts): реализация интерфейсов@commerce(OperationContext, типыCity/LinkItem/SocialIcons), агрегация меню+городов+категорий в единыйgetSiteInfo, резолвcurrentCityпо slug. → Работа внутри чужой плагинной архитектуры без нарушения её контрактов.
§05
AI-разработка
- Найдено сессий: 0 — локальной директории сессий Claude Code для этого проекта нет (у соседних chopar/les-* проектов есть, а у этого нет).
- Что делалось с AI: при этом 5 коммитов помечены `Co-Authored-By: Claude (Opus 4.7, 1M context)` — то есть AI использовался, но без записанной CC-сессии для этого репозитория (вероятно, из другой директории/инструмента). AI-assisted коммиты: рефакторинг env-конфига (
5ff70a20), standalone PM2+nginx деплой (1c41379a), LCP-фикс с next/image (cb93c2b5), фикс DNS-фетча + редизайн 404 (6762281b), merge (73f6c10b). - Паттерны AI-воркфлоу: AI применялся для узко очерченных, хорошо ограниченных задач — рефакторинги с чётким скоупом ("8 компонентов", "5 ключей"), оптимизация перформанса, обвязка инфраструктуры. Коммит-месседжи на этих коммитах драматически лучше остальных (структурированные, с буллет-списком изменений) — классическая подпись AI-ассиста.
- Полноценных сессий Claude Code в проекте нет.
§06
Достижения и метрики
- Реальный продакшн: restaurant-chain.uz — живой сайт сети ресторанов (подтверждается соцссылками
facebook.com/lesailesuz,instagram.com/lesailesuzв коде и доменами авторов@restaurant-chain.uz,@choparpizza.uz). - Масштаб кодовой базы: 2011 коммитов всего, ~403 от пользователя; мультигород + 3 языка (ru/uz/en); ~24 директории компонентов под
components_new/(header, cart, order, profile, sale, delivery, branch, news…). - Долгожительство: ~5 лет поддержки (2021→2026), что само по себе сигнал реального продакшн-использования.
- Интеграции (из кода): OpenStreetMap/Leaflet, Yandex Maps + геокодер, Facebook Pixel, reCAPTCHA v3, типы оплаты, OTP-верификация, PWA.