Skip to content

refactor(vue): provide/inject для подкомпонентов заказа#204

Merged
biz87 merged 1 commit intobetafrom
refactor/issue-196-order-provide-inject
Apr 18, 2026
Merged

refactor(vue): provide/inject для подкомпонентов заказа#204
biz87 merged 1 commit intobetafrom
refactor/issue-196-order-provide-inject

Conversation

@Ibochkarev
Copy link
Copy Markdown
Member

Описание

Реализует issue #196: вместо длинной передачи функций через props между OrderView и вкладками используется идиоматичный Vue 3 паттерн.

  • provide(ORDER_CONTEXT_KEY) — общий контекст (state, действия, хелперы полей из useOrderFieldHelpers), ключ — Symbol('ms3.orderContext') для исключения коллизий.
  • Composables: useOrderFormatters, useOrderFieldHelpers, useOrderLogFormatters (в логах при необходимости передаётся formatPrice из первого composable).
  • Вкладки получают через props только данные, специфичные для вкладки (orderFieldsBySection, addressFieldsBySection, products, logs и т.д.); после inject — явная проверка контекста до деструктуризации.

Поведение UI не менялось намеренно — это структурный рефакторинг.

Тип изменений

  • Исправление бага (non-breaking change)
  • Новая функциональность (non-breaking change)
  • Breaking change (изменение, ломающее обратную совместимость)
  • Рефакторинг (без изменения функциональности)
  • Документация
  • Другое (опишите):

Связанные Issues

Closes #196

Как это было протестировано?

  • Ручное тестирование
  • Автоматические тесты (PHPStan, ESLint)
  • Тестирование на разных версиях PHP/MODX

Конфигурация тестирования:

  • MiniShop3: ветка PR
  • MODX: —
  • PHP: —

Для Vue: npm run lint и npm run build в vueManager выполняются без ошибок.

Скриншоты (если применимо)

До После

Не требуются (без визуальных изменений).

Чеклист

  • Код соответствует стилю проекта
  • Добавлены/обновлены комментарии в сложных местах
  • Изменения не ломают существующую функциональность
  • Лексиконы добавлены на двух языках (ru/en) — не применимо
  • PHPStan проходит без новых ошибок — PHP не менялся
  • ESLint проходит без ошибок (для JS/Vue изменений)
  • Обновлён CHANGELOG.md (для значимых изменений)

Дополнительные заметки

Соответствует предложенному плану в issue: composables для утилит, provide/inject для зависимостей вглубь дерева, сокращение props до данных вкладки.

- ORDER_CONTEXT_KEY (Symbol), provide в OrderView, inject во вкладках с проверкой
- useOrderFormatters, useOrderFieldHelpers, useOrderLogFormatters
- Узкие props у вкладок; formatPrice передаётся в useOrderLogFormatters
- CHANGELOG: запись под 1.9.0-beta1
@Ibochkarev Ibochkarev requested a review from biz87 April 17, 2026 07:03
@Ibochkarev Ibochkarev changed the title refactor(vue): provide/inject для подкомпонентов заказа (#196) refactor(vue): provide/inject для подкомпонентов заказа Apr 17, 2026
Copy link
Copy Markdown
Member

@biz87 biz87 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ревью

Чистый структурный рефакторинг. Код стал значительно читаемее — OrderView похудел на ~300 строк, логика разнесена по composables с ясными зонами ответственности. Одобряю.

Что хорошо

  • Symbol('ms3.orderContext') — правильный подход, исключает коллизии строковых ключей
  • ✅ Pure composable (useOrderFormatters) отделён от stateful (useOrderFieldHelpers) — правильная границ
  • ✅ Guard pattern с throw Error при отсутствии inject — fail-fast, понятная диагностика
  • ✅ Удалён eslint-disable vue/no-mutating-props — теперь order приходит через inject как ref, а не как prop, что корректнее
  • ✅ Props вкладок сокращены до данных — orderFieldsBySection, products, logs и т.д.
  • useOrderLogFormatters({ formatPrice }) — DI через параметр, не создаёт лишний экземпляр

Мелкие замечания (не блокеры)

1. Двойной console.error + throw

if (import.meta.env.DEV && !orderCtx) {
  console.error('[OrderInfoTab] Missing inject...')
}
if (!orderCtx) {
  throw new Error('[OrderInfoTab] orderContext is required...')
}

throw уже покажет ошибку в консоли. DEV-check перед ним избыточен. Но не критично — можно оставить для наглядности в devtools.

2. Inconsistency: formatters через inject vs через composable

  • OrderInfoTab / OrderAddressTab получают formatDate, formatPrice из inject (контекст OrderView)
  • OrderHistoryTab / OrderProductsTab создают свой useOrderFormatters()

Функционально нет разницы (pure functions), но подход разный. Если это осознанный выбор (вкладки с inject зависят от контекста, а history/products могут работать автономно) — ок. Если нет — стоит унифицировать.


LGTM 👍

@biz87 biz87 merged commit be16394 into beta Apr 18, 2026
@Ibochkarev Ibochkarev deleted the refactor/issue-196-order-provide-inject branch April 18, 2026 16:53
@biz87 biz87 mentioned this pull request Apr 20, 2026
2 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

refactor: заменить передачу функций через props на provide/inject в подкомпонентах заказа

2 participants