Назад в архив
IV. Клиентские проекты и логистические платформыдополнительноучастникклиент анонимизирован

Food Delivery Storefront

Продакшн-витрина доставки еды (restaurant-chain.uz, сеть Restaurant chain (UZ) / дочерний бренд Restaurant chain (UZ), Узбекистан) — форк Vercel Next.js Commerce, переделанный под кастомный API, мультигородовой роутинг и три языка.

Статус
поддерживается
Период
2020-09-21 → 2026-05-18
AI-сессий
Стек
Языки
TypeScriptJavaScriptCSS
Фреймворки · Инфра
Next.js 14 (Pages Router)React 18Tailwind CSSreact-query v3react-hook-formLeaflet/react-leafletYandex Mapsnext-translatenext-pwaframer-motion
§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-query v3 (серверное состояние/поллинг), 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), браузерное хранилище как слой состояния: пользователь — localStorage mijoz (base64 JSON), локация — sessionStorage yetkazish, активный город — 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-query refetchInterval: 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 при вычислении центра карты (mapCenter useMemo): усреднение координат 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.
§07

Контрибьюторы

git shortlog · все ветки

  1. Dave93424
  2. Belen Curcio499
  3. Luis Alvarez415
  4. shahzodsalimsakov161
  5. root112
  6. cond0r60
  7. Franco Arza56
  8. Administrator49
  9. Julián Benegas34
  10. ghoskin27
  11. Boburt26
  12. Doniman24
57 контрибьюторов· ещё +45 не показаны2011 коммитов всего
Сейчас

Открыт к ролям Senior / Staff инженера и избранному фрилансу — продакшн-AI, платформы и full-stack разработка.

Связаться