@escapenavigator/hooks 1.10.146 → 1.10.147

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -146,6 +146,35 @@ const PlayersAndVariationPicker = ({ slot, currentTariffId, currentDuration, loa
146
146
  const effectiveMin = typeof minPlayers === 'number' && Number.isFinite(minPlayers)
147
147
  ? Math.max(minFromTariff, minPlayers)
148
148
  : minFromTariff;
149
+ // Единственный источник истины «что реально можно выбрать»: ключи
150
+ // прайса тарифа, попадающие в [effectiveMin, effectiveMax] с учётом
151
+ // детей. Ровно те же числа рендерятся кнопками ниже.
152
+ const availablePlayerKeys = (0, react_1.useMemo)(() => playersOptions
153
+ .map((p) => p.key)
154
+ .filter((key) => {
155
+ const total = key + (_children || 0);
156
+ return total >= effectiveMin && total <= effectiveMax;
157
+ }), [playersOptions, effectiveMin, effectiveMax, _children]);
158
+ // Если уже выбранное (или засеянное хостом) число игроков выпало из
159
+ // доступного набора — например, после смены вариации/тарифа на более
160
+ // узкий диапазон — подтягиваем его к ближайшему валидному. Без этого
161
+ // `values.players` остаётся «залипшим» на count, которого в новом
162
+ // тарифе нет, и на бэке `tariff.price[players]` = undefined → NaN →
163
+ // 500 при создании заказа. `_players === 0/undefined` трактуем как
164
+ // «ещё не выбрано» и не трогаем (валидация формы заставит выбрать).
165
+ // biome-ignore lint/correctness/useExhaustiveDependencies: однонаправленный clamp, зависим только от набора и значения
166
+ (0, react_1.useEffect)(() => {
167
+ if (!availablePlayerKeys.length)
168
+ return;
169
+ if (!_players)
170
+ return;
171
+ if (availablePlayerKeys.includes(_players))
172
+ return;
173
+ const nearest = availablePlayerKeys.reduce((acc, key) => Math.abs(key - _players) < Math.abs(acc - _players) ? key : acc);
174
+ setPlayers(nearest);
175
+ onChange === null || onChange === void 0 ? void 0 : onChange('players', nearest);
176
+ // eslint-disable-next-line react-hooks/exhaustive-deps
177
+ }, [availablePlayerKeys, _players]);
149
178
  const childrenOptions = (0, react_1.useMemo)(() => {
150
179
  if (!tariff.child || !maxFromTariff)
151
180
  return [];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@escapenavigator/hooks",
3
- "version": "1.10.146",
3
+ "version": "1.10.147",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -14,9 +14,9 @@
14
14
  "test": "jest"
15
15
  },
16
16
  "dependencies": {
17
- "@escapenavigator/services": "^1.10.154",
17
+ "@escapenavigator/services": "^1.10.155",
18
18
  "@escapenavigator/types": "^1.10.145",
19
- "@escapenavigator/utils": "^1.10.149",
19
+ "@escapenavigator/utils": "^1.10.150",
20
20
  "react": "19.2.6"
21
21
  },
22
22
  "peerDependencies": {
@@ -30,5 +30,5 @@
30
30
  "ts-jest": "^29.1.1",
31
31
  "typescript": "^5.6"
32
32
  },
33
- "gitHead": "4d5f85778c81f86f50c14fba7055dda83e1aafdd"
33
+ "gitHead": "a544fe463f486e809bc002494b1260c6bb596aaf"
34
34
  }