@stapel/listings-react 0.28.0 → 0.29.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"errors.es.gen.d.ts","sourceRoot":"","sources":["../../../src/i18n/generated/errors.es.gen.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,qBAAqB,EAAE,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,CA2C5E,CAAC"}
1
+ {"version":3,"file":"errors.es.gen.d.ts","sourceRoot":"","sources":["../../../src/i18n/generated/errors.es.gen.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,qBAAqB,EAAE,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,CA4D5E,CAAC"}
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * `es` texts for the backend error codes this catalog carries.
3
3
  *
4
- * PARTIAL, and deliberately typed to say so: 30 key(s) owned by
5
- * stapel_attributes, stapel_listings are absent, because that owner ships no locale catalog
4
+ * PARTIAL, and deliberately typed to say so: 13 key(s) owned by
5
+ * stapel_attributes are absent, because that owner ships no locale catalog
6
6
  * (ERRORS_LOCALE_EXEMPT_OWNERS). English for them still comes from the registry
7
7
  * artifact via the en bundle; the pair layers its own authored `es`
8
8
  * strings over this one until upstream ships translations. `Partial` is what
@@ -15,6 +15,7 @@ export const listingsErrorBundleEs = {
15
15
  "error.400.bad_request": "Solicitud incorrecta",
16
16
  "error.400.captcha_invalid": "La verificación del captcha ha fallado. Inténtalo de nuevo.",
17
17
  "error.400.captcha_required": "Se requiere el token del captcha.",
18
+ "error.400.category_required": "La categoría es obligatoria",
18
19
  "error.400.expected_list": "Se esperaba una lista de elementos",
19
20
  "error.400.field.blank": "{field} no puede estar vacío",
20
21
  "error.400.field.does_not_exist": "{field} no existe",
@@ -27,23 +28,39 @@ export const listingsErrorBundleEs = {
27
28
  "error.400.field.null": "{field} no puede ser nulo",
28
29
  "error.400.field.required": "{field} es obligatorio",
29
30
  "error.400.field.unique": "{field} debe ser único",
31
+ "error.400.image_required": "Se necesita al menos una imagen para publicar",
30
32
  "error.400.invalid_ad_id": "ID de anuncio no válido",
33
+ "error.400.listing_draft_meta_too_large": "El campo draft_meta es demasiado grande (máximo {max_bytes} bytes)",
34
+ "error.400.listing_feature_not_allowed": "La característica {feature} no está permitida en esta categoría",
35
+ "error.400.listing_features_draft_shape": "features_draft debe ser un objeto con los slugs de las características como claves, o la lista de objetos de característica que devuelve la lectura de un anuncio (cada uno con su propio «slug»); se recibió {got_type}. Ejemplo de la forma de objeto aceptada: {example}",
36
+ "error.400.listing_features_draft_unknown_slug": "Cada elemento de una lista features_draft debe llevar su propia cadena «slug» no vacía (el slug que la lectura de un anuncio guarda en ese elemento) para poder asignarlo a la característica correcta; el elemento con índice {index} no la tiene. Ejemplo: {example}",
37
+ "error.400.listing_features_draft_value_shape": "features_draft['{slug}'] debe ser a su vez un objeto de la forma {{\"type\": <tipo de característica>, \"value\": <valor de la característica>}}; se recibió {got_type}. Ejemplo: {example}",
38
+ "error.400.listing_invalid_status_filter": "Estado de anuncio desconocido: {status}",
39
+ "error.400.listing_location_required": "Indica dónde se encuentra el artículo antes de publicar",
40
+ "error.400.listing_zero_price_not_allowed": "No se permite un precio de 0 en esta categoría. Deja el precio vacío para indicar «precio no indicado».",
41
+ "error.400.publish_validation_failed": "La validación del anuncio ha fallado",
31
42
  "error.400.validation_error": "Error de validación",
32
43
  "error.400.verification_failed": "La verificación ha fallado",
33
44
  "error.400.verification_invalid_factor": "Este factor de verificación no está disponible",
34
45
  "error.401.unauthorized": "Se requiere autenticación",
35
46
  "error.402.payment_required": "Se requiere pago",
36
47
  "error.403.forbidden": "No tienes permiso para realizar esta acción",
48
+ "error.403.listing_anonymous_not_allowed": "Una cuenta de invitado no puede publicar anuncios",
49
+ "error.403.listing_not_owner": "Este anuncio no es tuyo",
37
50
  "error.403.network_blocked": "No se permiten solicitudes desde esta red.",
38
51
  "error.403.verification_enrollment_required": "Es necesario registrar un factor de verificación.",
39
52
  "error.403.verification_required": "Se requiere verificación adicional",
40
53
  "error.404.ad_not_found": "Anuncio no encontrado",
54
+ "error.404.listing_not_found": "Anuncio no encontrado",
41
55
  "error.404.not_found": "Recurso solicitado no encontrado",
42
56
  "error.404.verification_challenge_not_found": "Desafío de verificación no encontrado o caducado",
43
57
  "error.405.method_not_allowed": "Método no permitido",
44
58
  "error.406.not_acceptable": "No aceptable",
45
59
  "error.408.request_timeout": "Tiempo de espera de la solicitud agotado",
60
+ "error.409.already_favorited": "El anuncio ya está en favoritos",
46
61
  "error.409.conflict": "El recurso ya existe",
62
+ "error.409.invalid_listing_transition": "Cambio de estado no válido para {from_status}",
63
+ "error.409.listing_cannot_delete_active": "No se puede eliminar un anuncio activo. Archívalo primero.",
47
64
  "error.410.gone": "El recurso se ha eliminado permanentemente",
48
65
  "error.413.payload_too_large": "El cuerpo de la solicitud es demasiado grande",
49
66
  "error.415.unsupported_media_type": "Tipo de contenido no compatible",
@@ -1 +1 @@
1
- {"version":3,"file":"errors.es.gen.js","sourceRoot":"","sources":["../../../src/i18n/generated/errors.es.gen.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAA+C;IAC/E,uBAAuB,EAAE,sBAAsB;IAC/C,2BAA2B,EAAE,6DAA6D;IAC1F,4BAA4B,EAAE,mCAAmC;IACjE,yBAAyB,EAAE,oCAAoC;IAC/D,uBAAuB,EAAE,8BAA8B;IACvD,gCAAgC,EAAE,mBAAmB;IACrD,yBAAyB,EAAE,sBAAsB;IACjD,gCAAgC,EAAE,iCAAiC;IACnE,4BAA4B,EAAE,wDAAwD;IACtF,2BAA2B,EAAE,0CAA0C;IACvE,4BAA4B,EAAE,qDAAqD;IACnF,2BAA2B,EAAE,0CAA0C;IACvE,sBAAsB,EAAE,2BAA2B;IACnD,0BAA0B,EAAE,wBAAwB;IACpD,wBAAwB,EAAE,wBAAwB;IAClD,yBAAyB,EAAE,yBAAyB;IACpD,4BAA4B,EAAE,qBAAqB;IACnD,+BAA+B,EAAE,4BAA4B;IAC7D,uCAAuC,EAAE,gDAAgD;IACzF,wBAAwB,EAAE,2BAA2B;IACrD,4BAA4B,EAAE,kBAAkB;IAChD,qBAAqB,EAAE,6CAA6C;IACpE,2BAA2B,EAAE,4CAA4C;IACzE,4CAA4C,EAAE,mDAAmD;IACjG,iCAAiC,EAAE,oCAAoC;IACvE,wBAAwB,EAAE,uBAAuB;IACjD,qBAAqB,EAAE,kCAAkC;IACzD,4CAA4C,EAAE,kDAAkD;IAChG,8BAA8B,EAAE,qBAAqB;IACrD,0BAA0B,EAAE,cAAc;IAC1C,2BAA2B,EAAE,0CAA0C;IACvE,oBAAoB,EAAE,sBAAsB;IAC5C,gBAAgB,EAAE,4CAA4C;IAC9D,6BAA6B,EAAE,+CAA+C;IAC9E,kCAAkC,EAAE,iCAAiC;IACrE,gCAAgC,EAAE,uBAAuB;IACzD,kBAAkB,EAAE,2BAA2B;IAC/C,+BAA+B,EAAE,uDAAuD;IACxF,sBAAsB,EAAE,2EAA2E;IACnG,6BAA6B,EAAE,uDAAuD;IACtF,oBAAoB,EAAE,gBAAgB;IACtC,+BAA+B,EAAE,yDAAyD;CAC3F,CAAC"}
1
+ {"version":3,"file":"errors.es.gen.js","sourceRoot":"","sources":["../../../src/i18n/generated/errors.es.gen.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAA+C;IAC/E,uBAAuB,EAAE,sBAAsB;IAC/C,2BAA2B,EAAE,6DAA6D;IAC1F,4BAA4B,EAAE,mCAAmC;IACjE,6BAA6B,EAAE,6BAA6B;IAC5D,yBAAyB,EAAE,oCAAoC;IAC/D,uBAAuB,EAAE,8BAA8B;IACvD,gCAAgC,EAAE,mBAAmB;IACrD,yBAAyB,EAAE,sBAAsB;IACjD,gCAAgC,EAAE,iCAAiC;IACnE,4BAA4B,EAAE,wDAAwD;IACtF,2BAA2B,EAAE,0CAA0C;IACvE,4BAA4B,EAAE,qDAAqD;IACnF,2BAA2B,EAAE,0CAA0C;IACvE,sBAAsB,EAAE,2BAA2B;IACnD,0BAA0B,EAAE,wBAAwB;IACpD,wBAAwB,EAAE,wBAAwB;IAClD,0BAA0B,EAAE,+CAA+C;IAC3E,yBAAyB,EAAE,yBAAyB;IACpD,wCAAwC,EAAE,oEAAoE;IAC9G,uCAAuC,EAAE,iEAAiE;IAC1G,wCAAwC,EAAE,6QAA6Q;IACvT,+CAA+C,EAAE,wQAAwQ;IACzT,8CAA8C,EAAE,6LAA6L;IAC7O,yCAAyC,EAAE,yCAAyC;IACpF,qCAAqC,EAAE,yDAAyD;IAChG,0CAA0C,EAAE,yGAAyG;IACrJ,qCAAqC,EAAE,sCAAsC;IAC7E,4BAA4B,EAAE,qBAAqB;IACnD,+BAA+B,EAAE,4BAA4B;IAC7D,uCAAuC,EAAE,gDAAgD;IACzF,wBAAwB,EAAE,2BAA2B;IACrD,4BAA4B,EAAE,kBAAkB;IAChD,qBAAqB,EAAE,6CAA6C;IACpE,yCAAyC,EAAE,mDAAmD;IAC9F,6BAA6B,EAAE,yBAAyB;IACxD,2BAA2B,EAAE,4CAA4C;IACzE,4CAA4C,EAAE,mDAAmD;IACjG,iCAAiC,EAAE,oCAAoC;IACvE,wBAAwB,EAAE,uBAAuB;IACjD,6BAA6B,EAAE,uBAAuB;IACtD,qBAAqB,EAAE,kCAAkC;IACzD,4CAA4C,EAAE,kDAAkD;IAChG,8BAA8B,EAAE,qBAAqB;IACrD,0BAA0B,EAAE,cAAc;IAC1C,2BAA2B,EAAE,0CAA0C;IACvE,6BAA6B,EAAE,iCAAiC;IAChE,oBAAoB,EAAE,sBAAsB;IAC5C,sCAAsC,EAAE,+CAA+C;IACvF,wCAAwC,EAAE,4DAA4D;IACtG,gBAAgB,EAAE,4CAA4C;IAC9D,6BAA6B,EAAE,+CAA+C;IAC9E,kCAAkC,EAAE,iCAAiC;IACrE,gCAAgC,EAAE,uBAAuB;IACzD,kBAAkB,EAAE,2BAA2B;IAC/C,+BAA+B,EAAE,uDAAuD;IACxF,sBAAsB,EAAE,2EAA2E;IACnG,6BAA6B,EAAE,uDAAuD;IACtF,oBAAoB,EAAE,gBAAgB;IACtC,+BAA+B,EAAE,yDAAyD;CAC3F,CAAC"}
@@ -2,8 +2,8 @@ import type { ListingsErrorCode } from "./errors.gen.js";
2
2
  /**
3
3
  * `ru` texts for the backend error codes this catalog carries.
4
4
  *
5
- * PARTIAL, and deliberately typed to say so: 30 key(s) owned by
6
- * stapel_attributes, stapel_listings are absent, because that owner ships no locale catalog
5
+ * PARTIAL, and deliberately typed to say so: 13 key(s) owned by
6
+ * stapel_attributes are absent, because that owner ships no locale catalog
7
7
  * (ERRORS_LOCALE_EXEMPT_OWNERS). English for them still comes from the registry
8
8
  * artifact via the en bundle; the pair layers its own authored `ru`
9
9
  * strings over this one until upstream ships translations. `Partial` is what
@@ -1 +1 @@
1
- {"version":3,"file":"errors.ru.gen.d.ts","sourceRoot":"","sources":["../../../src/i18n/generated/errors.ru.gen.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,qBAAqB,EAAE,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,CA2C5E,CAAC"}
1
+ {"version":3,"file":"errors.ru.gen.d.ts","sourceRoot":"","sources":["../../../src/i18n/generated/errors.ru.gen.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,qBAAqB,EAAE,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,CA4D5E,CAAC"}
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * `ru` texts for the backend error codes this catalog carries.
3
3
  *
4
- * PARTIAL, and deliberately typed to say so: 30 key(s) owned by
5
- * stapel_attributes, stapel_listings are absent, because that owner ships no locale catalog
4
+ * PARTIAL, and deliberately typed to say so: 13 key(s) owned by
5
+ * stapel_attributes are absent, because that owner ships no locale catalog
6
6
  * (ERRORS_LOCALE_EXEMPT_OWNERS). English for them still comes from the registry
7
7
  * artifact via the en bundle; the pair layers its own authored `ru`
8
8
  * strings over this one until upstream ships translations. `Partial` is what
@@ -15,6 +15,7 @@ export const listingsErrorBundleRu = {
15
15
  "error.400.bad_request": "Некорректный запрос",
16
16
  "error.400.captcha_invalid": "Проверка капчи не пройдена. Пожалуйста, попробуйте ещё раз.",
17
17
  "error.400.captcha_required": "Требуется токен капчи.",
18
+ "error.400.category_required": "Категория обязательна",
18
19
  "error.400.expected_list": "Ожидался список элементов",
19
20
  "error.400.field.blank": "Поле «{field}» не может быть пустым",
20
21
  "error.400.field.does_not_exist": "«{field}» не существует",
@@ -27,23 +28,39 @@ export const listingsErrorBundleRu = {
27
28
  "error.400.field.null": "Поле «{field}» не может быть null",
28
29
  "error.400.field.required": "Поле «{field}» обязательно",
29
30
  "error.400.field.unique": "Значение поля «{field}» должно быть уникальным",
31
+ "error.400.image_required": "Для публикации нужна хотя бы одна фотография",
30
32
  "error.400.invalid_ad_id": "Недопустимый идентификатор объявления",
33
+ "error.400.listing_draft_meta_too_large": "Поле draft_meta слишком большое (не более {max_bytes} байт)",
34
+ "error.400.listing_feature_not_allowed": "Характеристика «{feature}» недопустима для этой категории",
35
+ "error.400.listing_features_draft_shape": "features_draft должен быть объектом с ключами-слагами характеристик либо списком объектов характеристик, который возвращает чтение объявления (у каждого есть собственный «slug») — получено {got_type}. Пример допустимой формы объекта: {example}",
36
+ "error.400.listing_features_draft_unknown_slug": "Каждый элемент списка features_draft должен содержать собственную непустую строку «slug» (тот слаг, который чтение объявления сохраняет в этом элементе), чтобы значение вернулось к нужной характеристике — у элемента с индексом {index} его нет. Пример: {example}",
37
+ "error.400.listing_features_draft_value_shape": "features_draft['{slug}'] сам должен быть объектом вида {{\"type\": <тип характеристики>, \"value\": <значение характеристики>}} — получено {got_type}. Пример: {example}",
38
+ "error.400.listing_invalid_status_filter": "Неизвестный статус объявления «{status}»",
39
+ "error.400.listing_location_required": "Перед публикацией укажите, где находится товар",
40
+ "error.400.listing_zero_price_not_allowed": "Цена 0 в этой категории недопустима. Оставьте поле цены пустым — это означает «цена не указана».",
41
+ "error.400.publish_validation_failed": "Объявление не прошло проверку",
31
42
  "error.400.validation_error": "Ошибка валидации",
32
43
  "error.400.verification_failed": "Проверка не пройдена",
33
44
  "error.400.verification_invalid_factor": "Этот способ подтверждения недоступен",
34
45
  "error.401.unauthorized": "Требуется аутентификация",
35
46
  "error.402.payment_required": "Требуется оплата",
36
47
  "error.403.forbidden": "У вас нет прав для выполнения этого действия",
48
+ "error.403.listing_anonymous_not_allowed": "Гостевая учётная запись не может публиковать объявления",
49
+ "error.403.listing_not_owner": "Это не ваше объявление",
37
50
  "error.403.network_blocked": "Запросы из этой сети не разрешены.",
38
51
  "error.403.verification_enrollment_required": "Требуется регистрация фактора подтверждения.",
39
52
  "error.403.verification_required": "Требуется дополнительная проверка",
40
53
  "error.404.ad_not_found": "Объявление не найдено",
54
+ "error.404.listing_not_found": "Объявление не найдено",
41
55
  "error.404.not_found": "Запрошенный ресурс не найден",
42
56
  "error.404.verification_challenge_not_found": "Запрос на подтверждение не найден или истёк",
43
57
  "error.405.method_not_allowed": "Метод не разрешён",
44
58
  "error.406.not_acceptable": "Недопустимый формат ответа",
45
59
  "error.408.request_timeout": "Время ожидания запроса истекло",
60
+ "error.409.already_favorited": "Объявление уже в избранном",
46
61
  "error.409.conflict": "Ресурс уже существует",
62
+ "error.409.invalid_listing_transition": "Недопустимая смена статуса для «{from_status}»",
63
+ "error.409.listing_cannot_delete_active": "Активное объявление нельзя удалить. Сначала перенесите его в архив.",
47
64
  "error.410.gone": "Ресурс был безвозвратно удалён",
48
65
  "error.413.payload_too_large": "Тело запроса слишком большое",
49
66
  "error.415.unsupported_media_type": "Неподдерживаемый тип данных",
@@ -1 +1 @@
1
- {"version":3,"file":"errors.ru.gen.js","sourceRoot":"","sources":["../../../src/i18n/generated/errors.ru.gen.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAA+C;IAC/E,uBAAuB,EAAE,qBAAqB;IAC9C,2BAA2B,EAAE,6DAA6D;IAC1F,4BAA4B,EAAE,wBAAwB;IACtD,yBAAyB,EAAE,2BAA2B;IACtD,uBAAuB,EAAE,qCAAqC;IAC9D,gCAAgC,EAAE,yBAAyB;IAC3D,yBAAyB,EAAE,+CAA+C;IAC1E,gCAAgC,EAAE,yCAAyC;IAC3E,4BAA4B,EAAE,gEAAgE;IAC9F,2BAA2B,EAAE,2DAA2D;IACxF,4BAA4B,EAAE,gEAAgE;IAC9F,2BAA2B,EAAE,2DAA2D;IACxF,sBAAsB,EAAE,mCAAmC;IAC3D,0BAA0B,EAAE,4BAA4B;IACxD,wBAAwB,EAAE,gDAAgD;IAC1E,yBAAyB,EAAE,uCAAuC;IAClE,4BAA4B,EAAE,kBAAkB;IAChD,+BAA+B,EAAE,sBAAsB;IACvD,uCAAuC,EAAE,sCAAsC;IAC/E,wBAAwB,EAAE,0BAA0B;IACpD,4BAA4B,EAAE,kBAAkB;IAChD,qBAAqB,EAAE,8CAA8C;IACrE,2BAA2B,EAAE,oCAAoC;IACjE,4CAA4C,EAAE,8CAA8C;IAC5F,iCAAiC,EAAE,mCAAmC;IACtE,wBAAwB,EAAE,uBAAuB;IACjD,qBAAqB,EAAE,8BAA8B;IACrD,4CAA4C,EAAE,6CAA6C;IAC3F,8BAA8B,EAAE,mBAAmB;IACnD,0BAA0B,EAAE,4BAA4B;IACxD,2BAA2B,EAAE,gCAAgC;IAC7D,oBAAoB,EAAE,uBAAuB;IAC7C,gBAAgB,EAAE,gCAAgC;IAClD,6BAA6B,EAAE,8BAA8B;IAC7D,kCAAkC,EAAE,6BAA6B;IACjE,gCAAgC,EAAE,sCAAsC;IACxE,kBAAkB,EAAE,qBAAqB;IACzC,+BAA+B,EAAE,+DAA+D;IAChG,sBAAsB,EAAE,2EAA2E;IACnG,6BAA6B,EAAE,8DAA8D;IAC7F,oBAAoB,EAAE,qBAAqB;IAC3C,+BAA+B,EAAE,qDAAqD;CACvF,CAAC"}
1
+ {"version":3,"file":"errors.ru.gen.js","sourceRoot":"","sources":["../../../src/i18n/generated/errors.ru.gen.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAA+C;IAC/E,uBAAuB,EAAE,qBAAqB;IAC9C,2BAA2B,EAAE,6DAA6D;IAC1F,4BAA4B,EAAE,wBAAwB;IACtD,6BAA6B,EAAE,uBAAuB;IACtD,yBAAyB,EAAE,2BAA2B;IACtD,uBAAuB,EAAE,qCAAqC;IAC9D,gCAAgC,EAAE,yBAAyB;IAC3D,yBAAyB,EAAE,+CAA+C;IAC1E,gCAAgC,EAAE,yCAAyC;IAC3E,4BAA4B,EAAE,gEAAgE;IAC9F,2BAA2B,EAAE,2DAA2D;IACxF,4BAA4B,EAAE,gEAAgE;IAC9F,2BAA2B,EAAE,2DAA2D;IACxF,sBAAsB,EAAE,mCAAmC;IAC3D,0BAA0B,EAAE,4BAA4B;IACxD,wBAAwB,EAAE,gDAAgD;IAC1E,0BAA0B,EAAE,8CAA8C;IAC1E,yBAAyB,EAAE,uCAAuC;IAClE,wCAAwC,EAAE,6DAA6D;IACvG,uCAAuC,EAAE,2DAA2D;IACpG,wCAAwC,EAAE,qPAAqP;IAC/R,+CAA+C,EAAE,uQAAuQ;IACxT,8CAA8C,EAAE,0KAA0K;IAC1N,yCAAyC,EAAE,0CAA0C;IACrF,qCAAqC,EAAE,gDAAgD;IACvF,0CAA0C,EAAE,kGAAkG;IAC9I,qCAAqC,EAAE,+BAA+B;IACtE,4BAA4B,EAAE,kBAAkB;IAChD,+BAA+B,EAAE,sBAAsB;IACvD,uCAAuC,EAAE,sCAAsC;IAC/E,wBAAwB,EAAE,0BAA0B;IACpD,4BAA4B,EAAE,kBAAkB;IAChD,qBAAqB,EAAE,8CAA8C;IACrE,yCAAyC,EAAE,yDAAyD;IACpG,6BAA6B,EAAE,wBAAwB;IACvD,2BAA2B,EAAE,oCAAoC;IACjE,4CAA4C,EAAE,8CAA8C;IAC5F,iCAAiC,EAAE,mCAAmC;IACtE,wBAAwB,EAAE,uBAAuB;IACjD,6BAA6B,EAAE,uBAAuB;IACtD,qBAAqB,EAAE,8BAA8B;IACrD,4CAA4C,EAAE,6CAA6C;IAC3F,8BAA8B,EAAE,mBAAmB;IACnD,0BAA0B,EAAE,4BAA4B;IACxD,2BAA2B,EAAE,gCAAgC;IAC7D,6BAA6B,EAAE,4BAA4B;IAC3D,oBAAoB,EAAE,uBAAuB;IAC7C,sCAAsC,EAAE,gDAAgD;IACxF,wCAAwC,EAAE,qEAAqE;IAC/G,gBAAgB,EAAE,gCAAgC;IAClD,6BAA6B,EAAE,8BAA8B;IAC7D,kCAAkC,EAAE,6BAA6B;IACjE,gCAAgC,EAAE,sCAAsC;IACxE,kBAAkB,EAAE,qBAAqB;IACzC,+BAA+B,EAAE,+DAA+D;IAChG,sBAAsB,EAAE,2EAA2E;IACnG,6BAA6B,EAAE,8DAA8D;IAC7F,oBAAoB,EAAE,qBAAqB;IAC3C,+BAA+B,EAAE,qDAAqD;CACvF,CAAC"}
package/dist/i18n/ru.d.ts CHANGED
@@ -13,37 +13,45 @@ export { listingsErrorBundleRu } from "./generated/errors.ru.gen.js";
13
13
  *
14
14
  * ── What comes from where ──────────────────────────────────────────────────
15
15
  *
16
- * `stapel-listings` ships **no `translations/` directory at all**, so 21 of
17
- * the 63 registry codes can never come from an upstream catalogue. They split
18
- * by owner:
16
+ * `stapel-listings` 0.22.8 ships `translations/errors.ru.json`, which is the
17
+ * line that used to say the opposite. Of the 72 registry codes:
19
18
  *
20
19
  * - the 42 cross-cutting `stapel_core` codes are GENERATED, merged in from
21
- * stapel-core's own catalogue by `pnpm gen:errors` (spread first below);
22
- * - the **9 `stapel_listings` codes** are authored here and when upstream
23
- * ships a catalogue, nine lines are deleted and no key or text moves;
24
- * - the **12 `stapel_attributes` codes** are NOT here. They belong to
20
+ * stapel-core's own catalogue by `pnpm gen:errors`;
21
+ * - the **17 `stapel_listings` codes** are GENERATED too, from the module's
22
+ * own catalogue the seventeen hand-authored lines that stood in for it
23
+ * are deleted, so each of those strings has exactly one source and the
24
+ * drift gate owns it;
25
+ * - the **13 `stapel_attributes` codes** are NOT here. They belong to
25
26
  * `@stapel/attributes-react`, which already translates them and which is a
26
27
  * peer of this pair anyway. Two packages must not give one refusal two
27
28
  * sentences (spec §13.2, note 3). A host registers both bundles;
28
- * `test/i18n.test.ts` proves the union covers the registry.
29
+ * `test/i18n.test.ts` proves the union covers the registry. stapel-attributes
30
+ * 0.9.3 ships a catalogue of its own now, and merging it in HERE would
31
+ * recreate exactly the two-sources problem this file just removed — the
32
+ * place to consume it is that pair, not this one.
33
+ *
34
+ * The first two bullets are the whole generated spread below; what follows it
35
+ * by hand is UI copy plus one deliberate override, called out where it sits.
29
36
  *
30
37
  * PROVENANCE, stated rather than implied: the core catalogue ships
31
- * `origin=seed:authored` and is UNREVIEWED; the pair-authored strings below
32
- * are the same grade. Neither is a claim of review.
38
+ * `origin=seed:authored` and is UNREVIEWED; the module's own catalogue and the
39
+ * pair-authored UI copy below are the same grade. None of it is a claim of
40
+ * review.
33
41
  */
34
42
  export declare const listingsI18nBundleRu: I18nDictionary;
35
43
  /**
36
- * Register the Russian bundle into a core i18n engine — AND the twelve
44
+ * Register the Russian bundle into a core i18n engine — AND the thirteen
37
45
  * `stapel_attributes` sentences this pair deliberately does not author.
38
46
  *
39
47
  * The split of ownership is right and stays: two packages must not give one
40
48
  * refusal two sentences. What was wrong was leaving the JOIN to a README. A
41
- * host that registered only this bundle got twelve of the composer's most
49
+ * host that registered only this bundle got thirteen of the composer's most
42
50
  * common refusals ("this value is below the minimum", "the description is too
43
51
  * long") in English on a Russian page, and nothing failed anywhere to say so.
44
52
  *
45
53
  * `@stapel/attributes-react` is a peer of this pair and its editors are what
46
- * RAISE those twelve, so a listings-ru host is an attributes-ru host by
54
+ * RAISE those thirteen, so a listings-ru host is an attributes-ru host by
47
55
  * construction; chaining the registration states that instead of asking. It is
48
56
  * idempotent — a host that also registers the bundle itself simply writes the
49
57
  * same keys twice.
@@ -1 +1 @@
1
- {"version":3,"file":"ru.d.ts","sourceRoot":"","sources":["../../src/i18n/ru.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAI/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,eAAO,MAAM,oBAAoB,EAAE,cAyQlC,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAG7D"}
1
+ {"version":3,"file":"ru.d.ts","sourceRoot":"","sources":["../../src/i18n/ru.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAI/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,eAAO,MAAM,oBAAoB,EAAE,cA4OlC,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAG7D"}
package/dist/i18n/ru.js CHANGED
@@ -14,42 +14,51 @@ export { listingsErrorBundleRu } from "./generated/errors.ru.gen.js";
14
14
  *
15
15
  * ── What comes from where ──────────────────────────────────────────────────
16
16
  *
17
- * `stapel-listings` ships **no `translations/` directory at all**, so 21 of
18
- * the 63 registry codes can never come from an upstream catalogue. They split
19
- * by owner:
17
+ * `stapel-listings` 0.22.8 ships `translations/errors.ru.json`, which is the
18
+ * line that used to say the opposite. Of the 72 registry codes:
20
19
  *
21
20
  * - the 42 cross-cutting `stapel_core` codes are GENERATED, merged in from
22
- * stapel-core's own catalogue by `pnpm gen:errors` (spread first below);
23
- * - the **9 `stapel_listings` codes** are authored here and when upstream
24
- * ships a catalogue, nine lines are deleted and no key or text moves;
25
- * - the **12 `stapel_attributes` codes** are NOT here. They belong to
21
+ * stapel-core's own catalogue by `pnpm gen:errors`;
22
+ * - the **17 `stapel_listings` codes** are GENERATED too, from the module's
23
+ * own catalogue the seventeen hand-authored lines that stood in for it
24
+ * are deleted, so each of those strings has exactly one source and the
25
+ * drift gate owns it;
26
+ * - the **13 `stapel_attributes` codes** are NOT here. They belong to
26
27
  * `@stapel/attributes-react`, which already translates them and which is a
27
28
  * peer of this pair anyway. Two packages must not give one refusal two
28
29
  * sentences (spec §13.2, note 3). A host registers both bundles;
29
- * `test/i18n.test.ts` proves the union covers the registry.
30
+ * `test/i18n.test.ts` proves the union covers the registry. stapel-attributes
31
+ * 0.9.3 ships a catalogue of its own now, and merging it in HERE would
32
+ * recreate exactly the two-sources problem this file just removed — the
33
+ * place to consume it is that pair, not this one.
34
+ *
35
+ * The first two bullets are the whole generated spread below; what follows it
36
+ * by hand is UI copy plus one deliberate override, called out where it sits.
30
37
  *
31
38
  * PROVENANCE, stated rather than implied: the core catalogue ships
32
- * `origin=seed:authored` and is UNREVIEWED; the pair-authored strings below
33
- * are the same grade. Neither is a claim of review.
39
+ * `origin=seed:authored` and is UNREVIEWED; the module's own catalogue and the
40
+ * pair-authored UI copy below are the same grade. None of it is a claim of
41
+ * review.
34
42
  */
35
43
  export const listingsI18nBundleRu = {
36
44
  ...listingsErrorBundleRu,
37
- // ── the 10 stapel_listings-owned codes, pair-authored ────────────────────
38
- "error.400.category_required": "Нужно выбрать категорию",
39
- "error.400.image_required": "Чтобы опубликовать объявление, добавьте хотя бы одно фото",
40
- "error.400.listing_feature_not_allowed": "Характеристика «{feature}» не относится к этой категории",
41
- "error.400.listing_invalid_status_filter": "Неизвестный статус объявления: «{status}»",
42
- "error.400.publish_validation_failed": "Объявление не прошло проверку и не опубликовано",
43
- "error.403.listing_anonymous_not_allowed": "Чтобы подать объявление, войдите или зарегистрируйтесь",
44
- "error.403.listing_not_owner": "Это не ваше объявление",
45
- "error.404.listing_not_found": "Объявление не найдено",
46
- "error.409.already_favorited": "Объявление уже в избранном",
47
- // No `{from_status}`: what landed in that slot was the wire value
48
- // ('draft', 'archived'), and the status is already named in the reader's
49
- // own words beside the control. See the note on this pair of keys in
50
- // keys.ts.
45
+ // ── stapel_listings' own refusals: NONE are authored here any more ───────
46
+ //
47
+ // The module ships `translations/errors.ru.json` as of 0.22.8, so all
48
+ // SEVENTEEN codes it owns arrive through the generated spread above. The
49
+ // seventeen lines that used to sit here are deleted rather than kept beside
50
+ // it: a key with two sources drifts, and nothing in this file could tell a
51
+ // reader which of the two a screen had shown them.
52
+ //
53
+ // Exactly ONE key is still overridden, and it is a defect in the upstream
54
+ // text rather than a preference: upstream's ru interpolates {from_status}
55
+ // the WIRE value ('draft', 'archived') into translated prose, which is
56
+ // the sentence a live cabinet already showed a seller once. The placeholder
57
+ // carries nothing the screen lacks: the status is named, in the reader's
58
+ // own words, beside every control this refusal appears under. See the long
59
+ // note on this pair of keys in keys.ts. Remove this override when
60
+ // stapel-listings drops the placeholder from the ru/es catalogues.
51
61
  "error.409.invalid_listing_transition": "Из текущего состояния объявление так перевести нельзя",
52
- "error.409.listing_cannot_delete_active": "Сначала снимите объявление с публикации — активное удалить нельзя",
53
62
  "listings.error.unknown": "Что-то пошло не так с этим объявлением",
54
63
  "listings.status.draft": "Черновик",
55
64
  "listings.status.pending": "На проверке",
@@ -194,21 +203,6 @@ export const listingsI18nBundleRu = {
194
203
  "listings.favorites.empty": "Вы ещё ничего не сохранили",
195
204
  "listings.favorites.empty_hint": "Нажмите «В избранное» в любом объявлении — оно будет ждать здесь.",
196
205
  "listings.favorites.sign_in_hint": "Избранное хранится в аккаунте, поэтому переходит с вами на другие устройства.",
197
- // The two publish checks the 0.17 contract brought with it: a place is
198
- // required, and a zero price in such a category is an empty field rather
199
- // than "free".
200
- "error.400.listing_location_required": "Перед публикацией укажите, где находится товар",
201
- "error.400.listing_zero_price_not_allowed": "В этой категории цена 0 недопустима. Оставьте поле пустым — это и есть «цена не указана».",
202
- // stapel-listings 0.21.2: the composer's per-field provenance sidecar has a
203
- // size ceiling, and the number is the server's own — never restated here.
204
- "error.400.listing_draft_meta_too_large": "Черновик слишком большой (не больше {max_bytes} байт). Уберите часть данных и сохраните ещё раз.",
205
- // stapel-listings 0.22.3: the features_draft WRITE now accepts the shape a
206
- // listing READ returns. These three are the refusals for a body that is
207
- // neither — read by whoever is wiring the integration, so each names the
208
- // shape it wanted instead of advising "try again".
209
- "error.400.listing_features_draft_shape": "features_draft должен быть объектом со слагами признаков в ключах — или тем списком объектов признаков, который возвращает чтение объявления (у каждого свой «slug»). Пришло: {got_type}. Пример принимаемой формы объекта: {example}",
210
- "error.400.listing_features_draft_unknown_slug": "У каждого элемента списка features_draft должен быть свой непустой «slug» — тот, который чтение объявления хранит на этом элементе, иначе значение некуда положить. У элемента с индексом {index} его нет. Пример: {example}",
211
- "error.400.listing_features_draft_value_shape": "features_draft['{slug}'] сам должен быть объектом вида {{\"type\": <тип признака>, \"value\": <значение признака>}}. Пришло: {got_type}. Пример: {example}",
212
206
  "listings.blocked.sign_in": "Войдите, чтобы сделать это",
213
207
  "listings.blocked.guest": "Этот аккаунт пока так не может — сначала завершите настройку",
214
208
  "listings.blocked.mandate_unknown": "Не удалось проверить ваш аккаунт, поэтому мы не угадываем, можно ли вам это",
@@ -227,17 +221,17 @@ export const listingsI18nBundleRu = {
227
221
  "listings.nav.favorites": "Избранное",
228
222
  };
229
223
  /**
230
- * Register the Russian bundle into a core i18n engine — AND the twelve
224
+ * Register the Russian bundle into a core i18n engine — AND the thirteen
231
225
  * `stapel_attributes` sentences this pair deliberately does not author.
232
226
  *
233
227
  * The split of ownership is right and stays: two packages must not give one
234
228
  * refusal two sentences. What was wrong was leaving the JOIN to a README. A
235
- * host that registered only this bundle got twelve of the composer's most
229
+ * host that registered only this bundle got thirteen of the composer's most
236
230
  * common refusals ("this value is below the minimum", "the description is too
237
231
  * long") in English on a Russian page, and nothing failed anywhere to say so.
238
232
  *
239
233
  * `@stapel/attributes-react` is a peer of this pair and its editors are what
240
- * RAISE those twelve, so a listings-ru host is an attributes-ru host by
234
+ * RAISE those thirteen, so a listings-ru host is an attributes-ru host by
241
235
  * construction; chaining the registration states that instead of asking. It is
242
236
  * idempotent — a host that also registers the bundle itself simply writes the
243
237
  * same keys twice.
@@ -1 +1 @@
1
- {"version":3,"file":"ru.js","sourceRoot":"","sources":["../../src/i18n/ru.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ru.js","sourceRoot":"","sources":["../../src/i18n/ru.ts"],"names":[],"mappings":"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"}
package/llms.txt CHANGED
@@ -1,4 +1,4 @@
1
- # @stapel/listings-react 0.28.0
1
+ # @stapel/listings-react 0.29.0
2
2
 
3
3
  Headless React flow pair for stapel-listings (contract >=0.22 <0.23) — business + state, zero visual opinion.
4
4
  Built on @stapel/core: typed client + StapelApiError envelope, auth token refresh,
package/manifest.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$generated": "by scripts/gen-manifest.mjs — do not edit; drift-gated (pnpm gen:manifest:check)",
3
3
  "package": "@stapel/listings-react",
4
- "version": "0.28.0",
4
+ "version": "0.29.0",
5
5
  "backend": {
6
6
  "module": "stapel-listings",
7
7
  "contract": ">=0.22 <0.23"
package/nav-manifest.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "package": "@stapel/listings-react",
3
- "version": "0.28.0",
3
+ "version": "0.29.0",
4
4
  "entries": [
5
5
  {
6
6
  "id": "listings.detail",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stapel/listings-react",
3
- "version": "0.28.0",
3
+ "version": "0.29.0",
4
4
  "description": "Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility and `moderation_status` decides nothing about it, so an edit to a live listing stays live and says 'under review' instead of vanishing. Feature values are drawn and mirrored by @stapel/attributes-react; photos arrive as an injected upload bag whose `refs` ARE `images_draft` and whose `settled` gates the submit; a publish refusal is routed onto the control that caused it by slug. Zero visual opinion in the main entry; an opt-in /default subpath ships the antd skin.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -58,7 +58,7 @@
58
58
  "limit": "31 KB"
59
59
  },
60
60
  {
61
- "name": "i18n/ru — the Russian bundle is opt-in, not carried by the main entry. Raised 5 -> 5.5 KB (measured 5.02): three sentences the wave added — the fourth tab and its empty state, and the delete warning that does not promise the archive to a listing already in it. A bundle sitting exactly ON its limit is a limit the next sentence breaks. Raised 5.5 -> 6 KB (measured 5.48) for the three features_draft refusals the stapel-listings 0.22.3 pin brought with it: the module is locale-exempt upstream, so a code that arrives without a ru sentence renders its own key on a Russian host, and each of these three has to NAME the shape it wanted rather than say \"try again\". 5.48 of 5.5 is twenty bytes of headroom — the rounding this entry already warns about.",
61
+ "name": "i18n/ru — the Russian bundle is opt-in, not carried by the main entry. Raised 5 -> 5.5 KB (measured 5.02): three sentences the wave added — the fourth tab and its empty state, and the delete warning that does not promise the archive to a listing already in it. A bundle sitting exactly ON its limit is a limit the next sentence breaks. Raised 5.5 -> 6 KB (measured 5.48) for the three features_draft refusals the stapel-listings 0.22.3 pin brought with it: each of these three has to NAME the shape it wanted rather than say \"try again\". 5.48 of 5.5 is twenty bytes of headroom — the rounding this entry already warns about. The 0.22.8 pin then moved the seventeen module-owned sentences from this file to the module's own catalogue: same keys, upstream wording, 5.52 KB.",
62
62
  "path": "dist/i18n/ru.js",
63
63
  "limit": "6 KB"
64
64
  },
@@ -102,13 +102,13 @@
102
102
  "size-limit": "^11.2.0",
103
103
  "typescript": "^5.8.3",
104
104
  "vitest": "^3.2.4",
105
- "@stapel/attributes-react": "^0.16.5",
106
- "@stapel/core": "^0.25.4",
107
- "@stapel/currencies-react": "^0.4.0",
105
+ "@stapel/attributes-react": "^0.16.6",
106
+ "@stapel/core": "^0.26.0",
108
107
  "@stapel/image": "^0.4.2",
108
+ "@stapel/currencies-react": "^0.4.0",
109
109
  "@stapel/showcase": "^0.3.0",
110
- "@stapel/tokens": "^0.8.0",
111
- "@stapel/tokens-antd": "^0.17.3"
110
+ "@stapel/tokens-antd": "^0.18.0",
111
+ "@stapel/tokens": "^0.8.0"
112
112
  },
113
113
  "engines": {
114
114
  "node": ">=22"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$generated": "by scripts/gen-events.mjs — do not edit; drift-gated (pnpm gen:events:check)",
3
3
  "package": "@stapel/listings-react",
4
- "version": "0.28.0",
4
+ "version": "0.29.0",
5
5
  "defined": [],
6
6
  "flows": []
7
7
  }
@@ -1369,6 +1369,8 @@ export interface components {
1369
1369
  labels?: string[];
1370
1370
  vocabulary?: string | null;
1371
1371
  level?: string | null;
1372
+ prefix?: string | null;
1373
+ postfix?: string | null;
1372
1374
  };
1373
1375
  /** @description Serializer for the ref_select feature DTO. */
1374
1376
  RefSelectDto: {
@@ -30,13 +30,43 @@
30
30
  * the heart's state is on the heart. This is the AMPLIFIER, never the record.
31
31
  * A future `SkinNotice` in the substrate replaces the body of this function
32
32
  * and nothing else; the callers already speak in resolved sentences.
33
+ *
34
+ * ── An amplifier may not outlive what it amplifies ────────────────────────
35
+ *
36
+ * Both arms hand the notice to a holder MOUNTED OUTSIDE this component tree —
37
+ * antd's `<App>` holder in the first arm, and in the second a React root antd
38
+ * renders into the document the first time the static entry is called. Neither
39
+ * is unmounted by unmounting the surface that spoke, and a standing notice is
40
+ * not an idle DOM node: `@rc-component/notification` counts its two seconds
41
+ * down with a `requestAnimationFrame` LOOP (`useNoticeTimer`), which is live
42
+ * work driven from a root nothing in this package owns.
43
+ *
44
+ * So the notices raised here are RETIRED when the surface that raised them
45
+ * goes. Two things follow, and both are the intent:
46
+ *
47
+ * - a person who presses the heart and immediately navigates away does not
48
+ * get "Saved" floating over the next page, about a listing they left;
49
+ * - nothing this pair started keeps running after the tree it started in is
50
+ * gone. Measured as CI flake: the detail page's heart toast kept stepping
51
+ * its rAF loop past the end of the test file that raised it, and the frame
52
+ * that landed after the environment was torn down threw
53
+ * `ReferenceError: window is not defined` out of react-dom — from a suite
54
+ * in which every test had passed.
33
55
  */
34
- import { useCallback } from "react";
56
+ import { useCallback, useEffect, useRef } from "react";
35
57
  import { App, message as staticMessage } from "antd";
36
58
 
37
59
  /** Say one short sentence. Resolved copy — this is the skin, not a bag. */
38
60
  export type Notice = (text: string) => void;
39
61
 
62
+ /**
63
+ * What antd hands back for a raised notice: CALL it to close the notice early,
64
+ * `then` it to learn that it closed on its own. Typed structurally rather than
65
+ * imported (`antd/es/message/interface`) so this file keeps to antd's public
66
+ * entry — the shape is antd's documented `MessageType` either way.
67
+ */
68
+ type RaisedNotice = (() => void) & PromiseLike<unknown>;
69
+
40
70
  /**
41
71
  * How long a confirmation stands, in seconds.
42
72
  *
@@ -51,18 +81,40 @@ export const NOTICE_SECONDS = 2;
51
81
  export function useNotice(): Notice {
52
82
  const app = App.useApp();
53
83
  const contextual = app.message.success;
84
+ // The notices this surface has raised and that have not closed themselves
85
+ // yet — see the header. A notice retires itself the moment it closes, so
86
+ // this holds at most the handful still on screen.
87
+ const standing = useRef<Set<RaisedNotice>>(new Set());
88
+ useEffect(
89
+ () => () => {
90
+ const open = standing.current;
91
+ standing.current = new Set();
92
+ for (const close of open) close();
93
+ },
94
+ []
95
+ );
96
+ const hold = useCallback((raised: RaisedNotice): void => {
97
+ standing.current.add(raised);
98
+ const retire = (): void => {
99
+ standing.current.delete(raised);
100
+ };
101
+ // Closed by its own timer, by our unmount, or by a host calling
102
+ // `message.destroy()` — every ending resolves this, and a rejection is an
103
+ // ending too. Nothing is awaited: the notice is already on screen.
104
+ raised.then(retire, retire);
105
+ }, []);
54
106
  return useCallback(
55
107
  (text: string): void => {
56
108
  if (typeof contextual === "function") {
57
- contextual(text, NOTICE_SECONDS);
109
+ hold(contextual(text, NOTICE_SECONDS) as RaisedNotice);
58
110
  return;
59
111
  }
60
112
  // No `<App>` above us. antd's static entry renders its own holder into
61
113
  // the document, which is exactly right for a host that never opted in,
62
114
  // and is a no-op on a server where there is no document to render into.
63
115
  if (typeof document === "undefined") return;
64
- staticMessage.success(text, NOTICE_SECONDS);
116
+ hold(staticMessage.success(text, NOTICE_SECONDS) as RaisedNotice);
65
117
  },
66
- [contextual]
118
+ [contextual, hold]
67
119
  );
68
120
  }