@stapel/listings-react 0.25.9 → 0.26.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.
Files changed (138) hide show
  1. package/CHANGELOG.md +216 -0
  2. package/README.md +77 -9
  3. package/dist/api/generated/schema.d.ts +2 -2
  4. package/dist/api/generated/schema.d.ts.map +1 -1
  5. package/dist/default/CardBadges.d.ts.map +1 -1
  6. package/dist/default/CardBadges.js +3 -1
  7. package/dist/default/CardBadges.js.map +1 -1
  8. package/dist/default/ListingActions.d.ts +108 -0
  9. package/dist/default/ListingActions.d.ts.map +1 -0
  10. package/dist/default/ListingActions.js +29 -0
  11. package/dist/default/ListingActions.js.map +1 -0
  12. package/dist/default/ListingCard.d.ts.map +1 -1
  13. package/dist/default/ListingCard.js +15 -8
  14. package/dist/default/ListingCard.js.map +1 -1
  15. package/dist/default/ListingDetailPane.d.ts +76 -56
  16. package/dist/default/ListingDetailPane.d.ts.map +1 -1
  17. package/dist/default/ListingDetailPane.js +164 -18
  18. package/dist/default/ListingDetailPane.js.map +1 -1
  19. package/dist/default/ListingFeedCard.d.ts.map +1 -1
  20. package/dist/default/ListingFeedCard.js +2 -1
  21. package/dist/default/ListingFeedCard.js.map +1 -1
  22. package/dist/default/ListingPhoto.d.ts.map +1 -1
  23. package/dist/default/ListingPhoto.js +5 -2
  24. package/dist/default/ListingPhoto.js.map +1 -1
  25. package/dist/default/ListingSerpCard.d.ts.map +1 -1
  26. package/dist/default/ListingSerpCard.js +18 -4
  27. package/dist/default/ListingSerpCard.js.map +1 -1
  28. package/dist/default/MyListingsPane.d.ts.map +1 -1
  29. package/dist/default/MyListingsPane.js +45 -21
  30. package/dist/default/MyListingsPane.js.map +1 -1
  31. package/dist/default/ShareAction.d.ts +32 -0
  32. package/dist/default/ShareAction.d.ts.map +1 -0
  33. package/dist/default/ShareAction.js +116 -0
  34. package/dist/default/ShareAction.js.map +1 -0
  35. package/dist/default/actionRow.d.ts +58 -0
  36. package/dist/default/actionRow.d.ts.map +1 -0
  37. package/dist/default/actionRow.js +128 -0
  38. package/dist/default/actionRow.js.map +1 -0
  39. package/dist/default/cardGallery.d.ts +2 -0
  40. package/dist/default/cardGallery.d.ts.map +1 -1
  41. package/dist/default/cardGallery.js +31 -0
  42. package/dist/default/cardGallery.js.map +1 -1
  43. package/dist/default/favorite.d.ts +25 -0
  44. package/dist/default/favorite.d.ts.map +1 -1
  45. package/dist/default/favorite.js +29 -3
  46. package/dist/default/favorite.js.map +1 -1
  47. package/dist/default/icons.d.ts +19 -0
  48. package/dist/default/icons.d.ts.map +1 -1
  49. package/dist/default/icons.js +23 -0
  50. package/dist/default/icons.js.map +1 -1
  51. package/dist/default/index.d.ts +8 -1
  52. package/dist/default/index.d.ts.map +1 -1
  53. package/dist/default/index.js +6 -1
  54. package/dist/default/index.js.map +1 -1
  55. package/dist/default/notice.d.ts +14 -0
  56. package/dist/default/notice.d.ts.map +1 -0
  57. package/dist/default/notice.js +62 -0
  58. package/dist/default/notice.js.map +1 -0
  59. package/dist/headless/ListingComposer.d.ts +36 -2
  60. package/dist/headless/ListingComposer.d.ts.map +1 -1
  61. package/dist/headless/ListingComposer.js +15 -2
  62. package/dist/headless/ListingComposer.js.map +1 -1
  63. package/dist/headless/MyListings.d.ts +39 -18
  64. package/dist/headless/MyListings.d.ts.map +1 -1
  65. package/dist/headless/MyListings.js +41 -19
  66. package/dist/headless/MyListings.js.map +1 -1
  67. package/dist/headless/Share.d.ts +103 -0
  68. package/dist/headless/Share.d.ts.map +1 -0
  69. package/dist/headless/Share.js +190 -0
  70. package/dist/headless/Share.js.map +1 -0
  71. package/dist/i18n/es.d.ts.map +1 -1
  72. package/dist/i18n/es.js +21 -0
  73. package/dist/i18n/es.js.map +1 -1
  74. package/dist/i18n/generated/errors.es.gen.d.ts +1 -1
  75. package/dist/i18n/generated/errors.es.gen.js +1 -1
  76. package/dist/i18n/generated/errors.gen.d.ts +18 -0
  77. package/dist/i18n/generated/errors.gen.d.ts.map +1 -1
  78. package/dist/i18n/generated/errors.gen.js +9 -0
  79. package/dist/i18n/generated/errors.gen.js.map +1 -1
  80. package/dist/i18n/generated/errors.ru.gen.d.ts +1 -1
  81. package/dist/i18n/generated/errors.ru.gen.js +1 -1
  82. package/dist/i18n/keys.d.ts +45 -0
  83. package/dist/i18n/keys.d.ts.map +1 -1
  84. package/dist/i18n/keys.js +60 -0
  85. package/dist/i18n/keys.js.map +1 -1
  86. package/dist/i18n/ru.d.ts.map +1 -1
  87. package/dist/i18n/ru.js +21 -0
  88. package/dist/i18n/ru.js.map +1 -1
  89. package/dist/index.d.ts +5 -3
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +2 -1
  92. package/dist/index.js.map +1 -1
  93. package/dist/model/cardBadges.d.ts +52 -3
  94. package/dist/model/cardBadges.d.ts.map +1 -1
  95. package/dist/model/cardBadges.js +74 -12
  96. package/dist/model/cardBadges.js.map +1 -1
  97. package/dist/model/mineSource.d.ts +9 -3
  98. package/dist/model/mineSource.d.ts.map +1 -1
  99. package/dist/model/mineSource.js.map +1 -1
  100. package/dist/model/status.d.ts +62 -13
  101. package/dist/model/status.d.ts.map +1 -1
  102. package/dist/model/status.js +69 -15
  103. package/dist/model/status.js.map +1 -1
  104. package/llms.txt +8 -3
  105. package/manifest.json +96 -4
  106. package/nav-manifest.json +1 -1
  107. package/package.json +11 -11
  108. package/src/analytics/generated/events.json +1 -1
  109. package/src/api/generated/schema.ts +2 -2
  110. package/src/default/CardBadges.tsx +3 -1
  111. package/src/default/ListingActions.tsx +196 -0
  112. package/src/default/ListingCard.tsx +79 -43
  113. package/src/default/ListingDetailPane.tsx +268 -81
  114. package/src/default/ListingFeedCard.tsx +2 -0
  115. package/src/default/ListingPhoto.tsx +28 -0
  116. package/src/default/ListingSerpCard.tsx +39 -12
  117. package/src/default/MyListingsPane.tsx +77 -44
  118. package/src/default/ShareAction.tsx +260 -0
  119. package/src/default/actionRow.ts +131 -0
  120. package/src/default/cardGallery.ts +31 -0
  121. package/src/default/favorite.tsx +68 -1
  122. package/src/default/icons.tsx +60 -0
  123. package/src/default/index.ts +23 -0
  124. package/src/default/notice.ts +68 -0
  125. package/src/headless/ListingComposer.tsx +68 -4
  126. package/src/headless/MyListings.tsx +89 -38
  127. package/src/headless/Share.tsx +278 -0
  128. package/src/i18n/es.ts +28 -0
  129. package/src/i18n/generated/errors.es.gen.ts +1 -1
  130. package/src/i18n/generated/errors.gen.ts +9 -0
  131. package/src/i18n/generated/errors.json +31 -0
  132. package/src/i18n/generated/errors.ru.gen.ts +1 -1
  133. package/src/i18n/keys.ts +63 -0
  134. package/src/i18n/ru.ts +28 -0
  135. package/src/index.ts +22 -0
  136. package/src/model/cardBadges.ts +124 -12
  137. package/src/model/mineSource.ts +9 -3
  138. package/src/model/status.ts +85 -18
@@ -14,44 +14,65 @@ import type { MyListingsAddress } from "../model/tabAddress.js";
14
14
  * keeps the argument and the seam that came out of it.
15
15
  *
16
16
  * TWO reads, not one, and the second one is the point of this file's shape:
17
- * the three tabs are the SERVER's status groupings, and `blocked` — a
17
+ * the three counted tabs are the SERVER's status groupings, and `blocked` — a
18
18
  * moderation takedown — is in none of them, because `my/counters` counts it
19
19
  * in none of them. A dashboard that only ever asked for a tab's statuses
20
20
  * would hide exactly the listing whose owner most needs to know. So
21
21
  * `blockedRows` is fetched beside them, off the same route, narrowed to
22
22
  * whatever `MY_LISTINGS_UNTABBED_STATUSES` derives.
23
+ *
24
+ * That second read is also the fourth tab's COUNT (D407). `my/counters` has
25
+ * three integers and no fourth, so the removed tab is counted from the rows it
26
+ * holds — which is honest exactly because that read is unpaged and runs
27
+ * whichever tab is open. The one thing it cannot describe is a page cap: a
28
+ * seller with more takedowns than one page of `my/listings` would see the page
29
+ * count and not the total, and there is no counter on the wire to check it
30
+ * against (see `MyListingsBag.tabCounts`).
23
31
  */
24
32
  export interface MyListingsBag {
25
33
  readonly tab: MyListingsTab;
34
+ /**
35
+ * The tabs to DRAW, in order.
36
+ *
37
+ * The server's three always; the removed one only where there is something
38
+ * in it or the person asked for it by address. An empty "Taken down" tab is
39
+ * a scare, and the seller it would scare is the one it has nothing to tell.
40
+ */
26
41
  readonly tabs: readonly MyListingsTab[];
27
42
  setTab(tab: MyListingsTab): void;
28
43
  /** The three real counts, as the server reports them. */
29
44
  readonly counters: LoadState<MyCounters>;
30
45
  /**
31
46
  * The number to DRAW on each tab — the server's counter, raised to what is
32
- * actually on screen.
47
+ * actually on screen, plus the fourth tab's own.
33
48
  *
34
- * D407: a moderator-rejected listing was on the Drafts tab under a badge
35
- * reading `0`. The two sets are grouped in two places — `my/counters`
36
- * aggregates server-side, `MY_LISTINGS_TAB_STATUSES` decides which statuses
37
- * a tab ASKS for — and any disagreement between them (a deployment running
38
- * an older counter, a status added upstream, a grouping changed on one side)
39
- * lands as a badge contradicting the rows underneath it.
49
+ * D407, twice over. The first half: a moderator-rejected listing was on the
50
+ * Drafts tab under a badge reading `0`. The two sets are grouped in two
51
+ * places — `my/counters` aggregates server-side, `MY_LISTINGS_TAB_STATUSES`
52
+ * decides which statuses a tab ASKS for — and any disagreement between them
53
+ * (a deployment running an older counter, a status added upstream, a
54
+ * grouping changed on one side) lands as a badge contradicting the rows
55
+ * underneath it. A count smaller than what a person can see is not a count,
56
+ * so the loaded rows are treated as evidence: for the OPEN tab the number is
57
+ * never below `rows.length`. It is a floor and not a replacement — the rows
58
+ * are one keyset page and the counter is the whole set, so the counter still
59
+ * wins whenever it is the larger of the two.
40
60
  *
41
- * A count smaller than what a person can see is not a count, so the loaded
42
- * rows are treated as evidence: for the OPEN tab the number is never below
43
- * `rows.length`. It is a floor and not a replacement the rows are one
44
- * keyset page and the counter is the whole set, so the counter still wins
45
- * whenever it is the larger of the two.
61
+ * The second half: a takedown was in no tab and therefore in no number, so
62
+ * a cabinet holding one read "Active 0 · Drafts 0 · Archived 0" over it.
63
+ * `removed` is counted from `blockedRows` there is no server counter to
64
+ * read, and the rows are the only evidence on the wire.
46
65
  */
47
66
  readonly tabCounts: LoadState<Readonly<Record<MyListingsTab, number>>>;
48
- /** The rows for the current tab. */
67
+ /** The rows for the current tab — {@link MyListingsBag.blockedRows} while
68
+ * the removed tab is open, and the tab's own keyset page otherwise. */
49
69
  readonly rows: LoadState<readonly MyListingCard[]>;
50
70
  /**
51
- * The rows no tab folds in — a moderation takedown, today. Empty for
52
- * almost every seller; when it is not, it is the most important thing on
53
- * the screen. Never `failed` in a way that hides the tabs: this read is
54
- * independent of `rows` and a skin renders it beside them.
71
+ * The rows the server's own counter folds into no tab — a moderation
72
+ * takedown, today; the removed tab's whole contents and its count. Empty
73
+ * for almost every seller; when it is not, it is the most important thing
74
+ * on the screen. Never `failed` in a way that hides the tabs: this read is
75
+ * independent of the tab's own and a skin renders it beside them.
55
76
  */
56
77
  readonly blockedRows: LoadState<readonly MyListingCard[]>;
57
78
  readonly page: MyListingsParams;
@@ -1 +1 @@
1
- {"version":3,"file":"MyListings.d.ts","sourceRoot":"","sources":["../../src/headless/MyListings.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAUrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAChB,UAAU,EACX,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAK/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAIhE;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,SAAS,aAAa,EAAE,CAAC;IACxC,MAAM,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAAC;IACjC,yDAAyD;IACzD,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;IACzC;;;;;;;;;;;;;;;;OAgBG;IACH,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACvE,oCAAoC;IACpC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,aAAa,EAAE,CAAC,CAAC;IACnD;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,SAAS,aAAa,EAAE,CAAC,CAAC;IAC1D,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,MAAM,IAAI,IAAI,CAAC;IACf,MAAM,IAAI,IAAI,CAAC;IACf,qDAAqD;IACrD,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC;oFACgF;IAChF,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IACnC;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;;;OAQG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC;CACtC;AAED,wBAAgB,aAAa,CAC3B,OAAO,GAAE,oBAAyB,GACjC,aAAa,CA4Hf;AAED,oDAAoD;AACpD,wBAAgB,UAAU,CACxB,KAAK,EAAE,oBAAoB,GAAG;IAC5B,QAAQ,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,SAAS,CAAC;CAC7C,GACA,YAAY,CAGd"}
1
+ {"version":3,"file":"MyListings.d.ts","sourceRoot":"","sources":["../../src/headless/MyListings.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAUrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAChB,UAAU,EACX,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAU/D,OAAO,KAAK,EAAwB,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE9E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAIhE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC;IAC5B;;;;;;OAMG;IACH,QAAQ,CAAC,IAAI,EAAE,SAAS,aAAa,EAAE,CAAC;IACxC,MAAM,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAAC;IACjC,yDAAyD;IACzD,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;IACzC;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACvE;2EACuE;IACvE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,aAAa,EAAE,CAAC,CAAC;IACnD;;;;;;OAMG;IACH,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,SAAS,aAAa,EAAE,CAAC,CAAC;IAC1D,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,MAAM,IAAI,IAAI,CAAC;IACf,MAAM,IAAI,IAAI,CAAC;IACf,qDAAqD;IACrD,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC;oFACgF;IAChF,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IACnC;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;;;OAQG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC;CACtC;AAED,wBAAgB,aAAa,CAC3B,OAAO,GAAE,oBAAyB,GACjC,aAAa,CAqJf;AAED,oDAAoD;AACpD,wBAAgB,UAAU,CACxB,KAAK,EAAE,oBAAoB,GAAG;IAC5B,QAAQ,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,SAAS,CAAC;CAC7C,GACA,YAAY,CAGd"}
@@ -6,7 +6,7 @@ import { defaultMyListingsSource } from "../model/mineSource.js";
6
6
  import { useListingsApi } from "../model/context.js";
7
7
  import { useMyCounters } from "../model/queries.js";
8
8
  import { listingsQueryKeys, pageKey } from "../model/queryKeys.js";
9
- import { MY_LISTINGS_TABS, MY_LISTINGS_UNTABBED_STATUSES } from "../model/status.js";
9
+ import { MY_LISTINGS_COUNTED_TABS, MY_LISTINGS_REMOVED_TAB, MY_LISTINGS_TABS, MY_LISTINGS_UNTABBED_STATUSES, } from "../model/status.js";
10
10
  import { browserAddress, tabFromSearch } from "../model/tabAddress.js";
11
11
  import { LISTINGS_I18N_KEYS } from "../i18n/keys.js";
12
12
  import { useMandateGate } from "./useMandateGate.js";
@@ -25,10 +25,17 @@ export function useMyListings(options = {}) {
25
25
  const injected = options.source;
26
26
  const source = useMemo(() => injected ?? defaultMyListingsSource(api), [injected, api]);
27
27
  const ready = sessionReady && gate.available;
28
+ // The fourth tab is served by `blockedQuery` below, not by the host's
29
+ // source: `MyListingsSource` is typed for the three counted tabs and a host
30
+ // that implemented it before D407 has no answer for a fourth.
31
+ const removed = tab === MY_LISTINGS_REMOVED_TAB;
32
+ const countedTab = removed
33
+ ? MY_LISTINGS_COUNTED_TABS[0]
34
+ : tab;
28
35
  const rowsQuery = useQuery({
29
- queryKey: listingsQueryKeys.mine(tab, pageKey(page)),
30
- queryFn: ({ signal }) => source({ tab, page, signal }),
31
- enabled: ready,
36
+ queryKey: listingsQueryKeys.mine(countedTab, pageKey(page)),
37
+ queryFn: ({ signal }) => source({ tab: countedTab, page, signal }),
38
+ enabled: ready && !removed,
32
39
  retry: false,
33
40
  });
34
41
  // The takedowns, off the same route and deliberately NOT paged: a seller
@@ -40,13 +47,6 @@ export function useMyListings(options = {}) {
40
47
  enabled: ready && MY_LISTINGS_UNTABBED_STATUSES.length > 0,
41
48
  retry: false,
42
49
  });
43
- const rows = useMemo(() => {
44
- if (rowsQuery.status === "error")
45
- return loadFailed(rowsQuery.error);
46
- if (rowsQuery.data !== undefined)
47
- return loadReady(rowsQuery.data.items);
48
- return loadLoading();
49
- }, [rowsQuery.status, rowsQuery.error, rowsQuery.data]);
50
50
  const blockedRows = useMemo(() => {
51
51
  if (MY_LISTINGS_UNTABBED_STATUSES.length === 0)
52
52
  return loadReady([]);
@@ -56,8 +56,23 @@ export function useMyListings(options = {}) {
56
56
  return loadReady(blockedQuery.data.items);
57
57
  return loadLoading();
58
58
  }, [blockedQuery.status, blockedQuery.error, blockedQuery.data]);
59
- const envelope = rowsQuery.data;
60
- // D407, the floor: never a number smaller than the rows on screen. See
59
+ const tabRows = useMemo(() => {
60
+ if (rowsQuery.status === "error")
61
+ return loadFailed(rowsQuery.error);
62
+ if (rowsQuery.data !== undefined)
63
+ return loadReady(rowsQuery.data.items);
64
+ return loadLoading();
65
+ }, [rowsQuery.status, rowsQuery.error, rowsQuery.data]);
66
+ const rows = removed ? blockedRows : tabRows;
67
+ // The takedown count, when it is known. Not a `0` while the read is in
68
+ // flight: the tab strip is drawn off this number and a tab that appeared a
69
+ // beat after the page settled would move the three beside it.
70
+ const blockedCount = blockedRows.status === "ready" ? blockedRows.data.length : undefined;
71
+ // Paging belongs to the tab's own keyset read. The takedowns are fetched
72
+ // unpaged on purpose, so the removed tab has nowhere to go and says so.
73
+ const envelope = removed ? undefined : rowsQuery.data;
74
+ // D407, the floor: never a number smaller than the rows on screen — and a
75
+ // number for the fourth tab, which the server counts nowhere. See
61
76
  // `MyListingsBag.tabCounts`.
62
77
  const tabCounts = useMemo(() => {
63
78
  if (counters.status === "error")
@@ -66,14 +81,21 @@ export function useMyListings(options = {}) {
66
81
  return loadLoading();
67
82
  const server = counters.data;
68
83
  const visible = rows.status === "ready" ? rows.data.length : 0;
69
- return loadReady(Object.fromEntries(MY_LISTINGS_TABS.map((one) => [
70
- one,
71
- one === tab ? Math.max(server[one], visible) : server[one],
72
- ])));
73
- }, [counters.status, counters.error, counters.data, rows, tab]);
84
+ return loadReady({
85
+ ...Object.fromEntries(MY_LISTINGS_COUNTED_TABS.map((one) => [
86
+ one,
87
+ one === tab ? Math.max(server[one], visible) : server[one],
88
+ ])),
89
+ [MY_LISTINGS_REMOVED_TAB]: blockedCount ?? 0,
90
+ });
91
+ }, [counters.status, counters.error, counters.data, rows, tab, blockedCount]);
92
+ // The removed tab is drawn where it has something to say — or where the
93
+ // address named it, so `?tab=removed` opens a real (if empty) tab rather
94
+ // than an activeKey pointing at nothing.
95
+ const tabs = removed || (blockedCount ?? 0) > 0 ? MY_LISTINGS_TABS : MY_LISTINGS_COUNTED_TABS;
74
96
  return {
75
97
  tab,
76
- tabs: MY_LISTINGS_TABS,
98
+ tabs,
77
99
  setTab: (next) => {
78
100
  // A cursor belongs to ONE ordered candidate set. Carried across a tab
79
101
  // change it either bounces or honestly returns page four of a
@@ -1 +1 @@
1
- {"version":3,"file":"MyListings.js","sourceRoot":"","sources":["../../src/headless/MyListings.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MyListings.js","sourceRoot":"","sources":["../../src/headless/MyListings.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ import type { ReactElement, ReactNode } from "react";
2
+ /**
3
+ * Where a share went. `"native"` is the platform sheet (which never says
4
+ * WHICH app the person picked — that is the sheet's privacy property, not a
5
+ * gap here), `"copy"` is the clipboard, and the three networks are the
6
+ * explicit links.
7
+ */
8
+ export type ShareChannel = "native" | "copy" | "telegram" | "whatsapp" | "vk";
9
+ /** The three networks, in the order the menu draws them. */
10
+ export declare const SHARE_NETWORKS: readonly ["telegram", "whatsapp", "vk"];
11
+ export type ShareNetwork = (typeof SHARE_NETWORKS)[number];
12
+ /** One network's ready-made link. */
13
+ export interface ShareLink {
14
+ readonly channel: ShareNetwork;
15
+ /** Absolute, already encoded. Rendered `target="_blank"` with
16
+ * `rel="noopener noreferrer"` — see `<ShareAction>` for why both. */
17
+ readonly href: string;
18
+ }
19
+ export interface ShareTarget {
20
+ /** The canonical, ABSOLUTE address of what is being shared. */
21
+ readonly url: string;
22
+ /** The listing's title. Empty is a real answer — an untitled listing is
23
+ * still shareable — and then the networks carry the link alone. */
24
+ readonly title?: string | undefined;
25
+ }
26
+ /**
27
+ * The three networks' share endpoints, as pure functions of the target.
28
+ *
29
+ * Separate from the hook and exported so the encoding is a thing a test can
30
+ * read rather than a thing a rendered `<a href>` implies. Each is the
31
+ * network's own documented endpoint:
32
+ *
33
+ * Telegram https://t.me/share/url?url=…&text=…
34
+ * WhatsApp https://wa.me/?text=… (one field: title + url)
35
+ * VK https://vk.com/share.php?url=…&title=…
36
+ *
37
+ * `encodeURIComponent` on every field, without exception. A listing title is
38
+ * seller-supplied text — it contains `&`, `#`, `?` and emoji in the wild —
39
+ * and a title pasted raw into a query string does not merely render oddly, it
40
+ * silently truncates the URL the recipient receives at the first `&`.
41
+ */
42
+ export declare function shareLinks(target: ShareTarget): readonly ShareLink[];
43
+ /**
44
+ * Resolve what the host handed in into an absolute address.
45
+ *
46
+ * Three cases and no guessing: an absolute URL is returned as it came, a path
47
+ * is resolved against the document's base, and nothing at all falls back to
48
+ * the address bar (see the file header for why that is the last resort and
49
+ * not the default).
50
+ */
51
+ export declare function resolveShareUrl(url: string | undefined): string | undefined;
52
+ /** Is this environment able to open the platform's own share sheet? */
53
+ export declare function hasNativeShare(): boolean;
54
+ export interface UseShareOptions {
55
+ /** The canonical address, absolute or a path. Absent: the address bar,
56
+ * which is the honest answer only for a host with no route seam. */
57
+ readonly url?: string | undefined;
58
+ /** The listing's title — the sheet's heading and the networks' text. */
59
+ readonly title?: string | undefined;
60
+ /** A sentence under the title in the platform sheet (the price, say). */
61
+ readonly text?: string | undefined;
62
+ /** Analytics. Fired once per completed share, with the channel it went
63
+ * through; `"native"` never says which app, because the sheet does not
64
+ * tell the page. */
65
+ readonly onShared?: ((channel: ShareChannel) => void) | undefined;
66
+ }
67
+ export interface ShareBag {
68
+ /** The absolute address every arm shares. `undefined` only on a server. */
69
+ readonly url: string | undefined;
70
+ /** Does this device have the platform's own sheet? Settles in an effect —
71
+ * see the file header. */
72
+ readonly native: boolean;
73
+ /** The three networks' links, already encoded. */
74
+ readonly links: readonly ShareLink[];
75
+ /**
76
+ * The clipboard write LANDED, and this is what the confirmation is drawn
77
+ * from. It clears itself after {@link SHARE_COPIED_MS} so a menu reopened a
78
+ * minute later is not still congratulating the person.
79
+ */
80
+ readonly copied: boolean;
81
+ /** The clipboard refused (no permission, an insecure origin, a browser
82
+ * without the API). Stated, never swallowed: a person who pressed "copy"
83
+ * and pastes nothing has to be told the press did not work. */
84
+ readonly copyFailed: boolean;
85
+ /** Open the platform sheet. A no-op where there is none — callers branch on
86
+ * {@link ShareBag.native} rather than discovering it here. */
87
+ shareNatively(): void;
88
+ /** Write the address to the clipboard. */
89
+ copy(): void;
90
+ /** Report a network link the person actually followed. The anchor does the
91
+ * navigating; this is the analytics half. */
92
+ report(channel: ShareChannel): void;
93
+ }
94
+ /** How long the "copied" confirmation stands. Long enough to read, short
95
+ * enough that a reopened menu is not still showing it. */
96
+ export declare const SHARE_COPIED_MS = 2400;
97
+ export declare function useShare(options?: UseShareOptions): ShareBag;
98
+ /** Renderless: the bag, handed to a render prop — the shape every headless
99
+ * component in this pair takes. */
100
+ export declare function Share(props: UseShareOptions & {
101
+ children: (bag: ShareBag) => ReactNode;
102
+ }): ReactElement;
103
+ //# sourceMappingURL=Share.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Share.d.ts","sourceRoot":"","sources":["../../src/headless/Share.tsx"],"names":[],"mappings":"AAgDA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAErD;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,IAAI,CAAC;AAE9E,4DAA4D;AAC5D,eAAO,MAAM,cAAc,yCAA0C,CAAC;AAEtE,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,qCAAqC;AACrC,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B;yEACqE;IACrE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,+DAA+D;IAC/D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB;uEACmE;IACnE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,SAAS,EAAE,CAcpE;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAS3E;AAED,uEAAuE;AACvE,wBAAgB,cAAc,IAAI,OAAO,CAGxC;AAED,MAAM,WAAW,eAAe;IAC9B;wEACoE;IACpE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,wEAAwE;IACxE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,yEAAyE;IACzE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC;;wBAEoB;IACpB,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CACnE;AAED,MAAM,WAAW,QAAQ;IACvB,2EAA2E;IAC3E,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC;8BAC0B;IAC1B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,kDAAkD;IAClD,QAAQ,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;IACrC;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB;;mEAE+D;IAC/D,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B;kEAC8D;IAC9D,aAAa,IAAI,IAAI,CAAC;IACtB,0CAA0C;IAC1C,IAAI,IAAI,IAAI,CAAC;IACb;iDAC6C;IAC7C,MAAM,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;CACrC;AAED;0DAC0D;AAC1D,eAAO,MAAM,eAAe,OAAO,CAAC;AAEpC,wBAAgB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,QAAQ,CAoFhE;AAED;mCACmC;AACnC,wBAAgB,KAAK,CACnB,KAAK,EAAE,eAAe,GAAG;IACvB,QAAQ,EAAE,CAAC,GAAG,EAAE,QAAQ,KAAK,SAAS,CAAC;CACxC,GACA,YAAY,CAGd"}
@@ -0,0 +1,190 @@
1
+ import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * Sharing a listing — the verb a classified is judged on and this pair did
4
+ * not have.
5
+ *
6
+ * Measured on the live storefront (owner, 2026-09-06): **no share control of
7
+ * any kind**, on any surface. A person who wanted to send an offer to whoever
8
+ * they are buying it with had the address bar and nothing else, on a phone,
9
+ * where the address bar is the hardest thing on the screen to reach. Every
10
+ * reference classified answers this with one button.
11
+ *
12
+ * ── Two arms, and the device decides which ────────────────────────────────
13
+ *
14
+ * `navigator.share` is the whole answer where it exists: the platform's own
15
+ * sheet, with the person's own apps in it, in their own order. It exists on
16
+ * essentially every phone and on almost no desktop, which is why the second
17
+ * arm is not a fallback for old browsers but the DESKTOP rendering — a small
18
+ * menu with "copy the link" and the three networks a Russian-speaking
19
+ * marketplace actually gets traffic from.
20
+ *
21
+ * `native` is resolved in an EFFECT rather than during render, for the reason
22
+ * `cardGallery.ts`'s `useFinePointer` gives at length: a server render has no
23
+ * `navigator`, and a first client render that disagreed with it is a
24
+ * hydration mismatch on every listing page in the app. It opens `false` — the
25
+ * menu arm — because a menu that appears for one frame and is replaced by a
26
+ * button is invisible, while the reverse is a sheet that fails to open.
27
+ *
28
+ * ── The URL is the HOST'S, never `window.location` ────────────────────────
29
+ *
30
+ * A pair does not own routing (`@stapel/core`'s `ui.ts` argues it). The
31
+ * canonical address of a listing is a route the container built, so it
32
+ * arrives as {@link UseShareOptions.url} and is used verbatim. `location.href`
33
+ * is consulted ONLY when the host supplied nothing — which is honest for a
34
+ * bare mount and wrong the moment an app has a canonical URL, because the
35
+ * address bar on a SERP carries the query, the page, the scroll anchor and
36
+ * whatever tracking parameters the visitor arrived with, and none of that
37
+ * belongs in a link somebody sends to a friend.
38
+ *
39
+ * A RELATIVE `url` ("/l/7" — what every route seam in this fleet speaks) is
40
+ * resolved against the document's own base, so a host hands in the same path
41
+ * it hands `<ListingCard href>` and gets an absolute link out.
42
+ *
43
+ * ── Nothing here renders ──────────────────────────────────────────────────
44
+ *
45
+ * The hook returns hrefs and channel identifiers; the copy lives in the skin.
46
+ * A host drawing its own share menu gets the same three links and the same
47
+ * clipboard write without importing antd.
48
+ */
49
+ import { useCallback, useEffect, useMemo, useState } from "react";
50
+ /** The three networks, in the order the menu draws them. */
51
+ export const SHARE_NETWORKS = ["telegram", "whatsapp", "vk"];
52
+ /**
53
+ * The three networks' share endpoints, as pure functions of the target.
54
+ *
55
+ * Separate from the hook and exported so the encoding is a thing a test can
56
+ * read rather than a thing a rendered `<a href>` implies. Each is the
57
+ * network's own documented endpoint:
58
+ *
59
+ * Telegram https://t.me/share/url?url=…&text=…
60
+ * WhatsApp https://wa.me/?text=… (one field: title + url)
61
+ * VK https://vk.com/share.php?url=…&title=…
62
+ *
63
+ * `encodeURIComponent` on every field, without exception. A listing title is
64
+ * seller-supplied text — it contains `&`, `#`, `?` and emoji in the wild —
65
+ * and a title pasted raw into a query string does not merely render oddly, it
66
+ * silently truncates the URL the recipient receives at the first `&`.
67
+ */
68
+ export function shareLinks(target) {
69
+ const url = encodeURIComponent(target.url);
70
+ const title = target.title ?? "";
71
+ const text = encodeURIComponent(title);
72
+ // WhatsApp takes ONE field, so the title and the link travel together in
73
+ // it; the other two carry the address in its own parameter.
74
+ const whatsapp = encodeURIComponent(title.length > 0 ? `${title} ${target.url}` : target.url);
75
+ return [
76
+ { channel: "telegram", href: `https://t.me/share/url?url=${url}&text=${text}` },
77
+ { channel: "whatsapp", href: `https://wa.me/?text=${whatsapp}` },
78
+ { channel: "vk", href: `https://vk.com/share.php?url=${url}&title=${text}` },
79
+ ];
80
+ }
81
+ /**
82
+ * Resolve what the host handed in into an absolute address.
83
+ *
84
+ * Three cases and no guessing: an absolute URL is returned as it came, a path
85
+ * is resolved against the document's base, and nothing at all falls back to
86
+ * the address bar (see the file header for why that is the last resort and
87
+ * not the default).
88
+ */
89
+ export function resolveShareUrl(url) {
90
+ if (typeof window === "undefined")
91
+ return url;
92
+ const base = window.document.baseURI;
93
+ if (url === undefined || url.length === 0)
94
+ return window.location.href;
95
+ try {
96
+ return new URL(url, base).href;
97
+ }
98
+ catch {
99
+ return url;
100
+ }
101
+ }
102
+ /** Is this environment able to open the platform's own share sheet? */
103
+ export function hasNativeShare() {
104
+ if (typeof navigator === "undefined")
105
+ return false;
106
+ return typeof navigator.share === "function";
107
+ }
108
+ /** How long the "copied" confirmation stands. Long enough to read, short
109
+ * enough that a reopened menu is not still showing it. */
110
+ export const SHARE_COPIED_MS = 2400;
111
+ export function useShare(options = {}) {
112
+ const { url: given, title, text, onShared } = options;
113
+ const [native, setNative] = useState(false);
114
+ const [copied, setCopied] = useState(false);
115
+ const [copyFailed, setCopyFailed] = useState(false);
116
+ // See the header: resolved in an effect so a server render and the
117
+ // hydration pass that must agree with it draw the same arm.
118
+ useEffect(() => {
119
+ setNative(hasNativeShare());
120
+ }, []);
121
+ const url = useMemo(() => resolveShareUrl(given), [given]);
122
+ const links = useMemo(() => (url === undefined ? [] : shareLinks({ url, title })), [url, title]);
123
+ useEffect(() => {
124
+ if (!copied)
125
+ return undefined;
126
+ const timer = setTimeout(() => {
127
+ setCopied(false);
128
+ }, SHARE_COPIED_MS);
129
+ return () => {
130
+ clearTimeout(timer);
131
+ };
132
+ }, [copied]);
133
+ const report = useCallback((channel) => {
134
+ onShared?.(channel);
135
+ }, [onShared]);
136
+ const shareNatively = useCallback(() => {
137
+ if (url === undefined)
138
+ return;
139
+ const share = typeof navigator === "undefined" ? undefined : navigator.share;
140
+ if (typeof share !== "function")
141
+ return;
142
+ // The rejection a share sheet ALWAYS produces is `AbortError` — the
143
+ // person closed it — and that is not a failure to report. Nothing is
144
+ // said either way; the sheet is the feedback.
145
+ void Promise.resolve(share.call(navigator, {
146
+ url,
147
+ ...(title !== undefined && title.length > 0 ? { title } : {}),
148
+ ...(text !== undefined && text.length > 0 ? { text } : {}),
149
+ }))
150
+ .then(() => {
151
+ report("native");
152
+ })
153
+ .catch(() => undefined);
154
+ }, [url, title, text, report]);
155
+ const copy = useCallback(() => {
156
+ if (url === undefined)
157
+ return;
158
+ setCopyFailed(false);
159
+ const clipboard = typeof navigator === "undefined" ? undefined : navigator.clipboard;
160
+ if (clipboard === undefined || typeof clipboard.writeText !== "function") {
161
+ setCopyFailed(true);
162
+ return;
163
+ }
164
+ void Promise.resolve(clipboard.writeText(url))
165
+ .then(() => {
166
+ setCopied(true);
167
+ report("copy");
168
+ })
169
+ .catch(() => {
170
+ setCopyFailed(true);
171
+ });
172
+ }, [url, report]);
173
+ return {
174
+ url,
175
+ native,
176
+ links,
177
+ copied,
178
+ copyFailed,
179
+ shareNatively,
180
+ copy,
181
+ report,
182
+ };
183
+ }
184
+ /** Renderless: the bag, handed to a render prop — the shape every headless
185
+ * component in this pair takes. */
186
+ export function Share(props) {
187
+ const bag = useShare(props);
188
+ return _jsx(_Fragment, { children: props.children(bag) });
189
+ }
190
+ //# sourceMappingURL=Share.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Share.js","sourceRoot":"","sources":["../../src/headless/Share.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"es.d.ts","sourceRoot":"","sources":["../../src/i18n/es.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAI/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,oBAAoB,EAAE,cAkOlC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAG7D"}
1
+ {"version":3,"file":"es.d.ts","sourceRoot":"","sources":["../../src/i18n/es.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAI/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,oBAAoB,EAAE,cA8PlC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAG7D"}
package/dist/i18n/es.js CHANGED
@@ -55,9 +55,20 @@ export const listingsI18nBundleEs = {
55
55
  "listings.card.untitled": "Anuncio sin título",
56
56
  "listings.card.sign_in": "Iniciar sesión",
57
57
  "listings.card.photos": "Fotos de este anuncio",
58
+ "listings.card.photo_counter": "{index} de {total}",
58
59
  "listings.card.price_was": "Antes",
59
60
  "listings.card.price_dropped": "El precio ha bajado",
60
61
  "listings.card.price_raised": "El precio ha subido",
62
+ "listings.share.action": "Compartir",
63
+ "listings.share.copy": "Copiar enlace",
64
+ "listings.share.copied": "Enlace copiado",
65
+ "listings.share.copy_failed": "No pudimos copiar el enlace — cópialo de la barra de direcciones",
66
+ "listings.share.telegram": "Telegram",
67
+ "listings.share.whatsapp": "WhatsApp",
68
+ "listings.share.vk": "VK",
69
+ "listings.favorite.added": "Añadido a favoritos",
70
+ "listings.favorite.removed": "Quitado de favoritos",
71
+ "listings.favorite.count": "{count} lo han guardado",
61
72
  "listings.detail.loading": "Cargando el anuncio…",
62
73
  "listings.detail.load_failed": "No pudimos cargar este anuncio",
63
74
  "listings.detail.retry": "Reintentar",
@@ -127,6 +138,7 @@ export const listingsI18nBundleEs = {
127
138
  "listings.mine.tab.active": "Activos",
128
139
  "listings.mine.tab.drafts": "Borradores",
129
140
  "listings.mine.tab.archived": "Archivo",
141
+ "listings.mine.tab.removed": "Retirados",
130
142
  "listings.mine.loading": "Cargando tus anuncios…",
131
143
  "listings.mine.load_failed": "No pudimos cargar tus anuncios",
132
144
  "listings.mine.empty": "Aquí todavía no hay nada",
@@ -135,6 +147,7 @@ export const listingsI18nBundleEs = {
135
147
  "listings.mine.empty.active": "No tienes nada publicado ni en revisión",
136
148
  "listings.mine.empty.drafts": "Sin borradores: lo que empieces aparecerá aquí",
137
149
  "listings.mine.empty.archived": "Nada archivado, pausado, caducado ni vendido todavía",
150
+ "listings.mine.empty.removed": "Moderación no ha retirado nada tuyo",
138
151
  "listings.mine.blocked.title": "Moderación retiró {count} de tus anuncios",
139
152
  "listings.mine.blocked.title.one": "Moderación retiró uno de tus anuncios",
140
153
  "listings.mine.blocked.title.other": "Moderación retiró {count} de tus anuncios",
@@ -152,6 +165,7 @@ export const listingsI18nBundleEs = {
152
165
  "listings.mine.view": "Ver",
153
166
  "listings.mine.delete_confirm_title": "¿Borrar este anuncio?",
154
167
  "listings.mine.delete_confirm_body": "Desaparece de tu panel y no se puede recuperar. Archivarlo lo conserva.",
168
+ "listings.mine.delete_confirm_body.final": "Desaparece de tu panel y no se puede recuperar.",
155
169
  "listings.favorites.title": "Favoritos",
156
170
  "listings.favorites.loading": "Cargando tus favoritos…",
157
171
  "listings.favorites.load_failed": "No pudimos cargar tus favoritos",
@@ -162,6 +176,13 @@ export const listingsI18nBundleEs = {
162
176
  "error.400.listing_location_required": "Indica dónde está el artículo antes de publicarlo",
163
177
  "error.400.listing_zero_price_not_allowed": "En esta categoría no se permite un precio de 0. Deja el precio vacío para «precio no indicado».",
164
178
  "error.400.listing_draft_meta_too_large": "El borrador es demasiado grande (máximo {max_bytes} bytes). Quita parte de los datos y guarda de nuevo.",
179
+ // stapel-listings 0.22.3: the features_draft WRITE now accepts the shape a
180
+ // listing READ returns. These three are the refusals for a body that is
181
+ // neither — read by whoever is wiring the integration, so each names the
182
+ // shape it wanted instead of advising "try again".
183
+ "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 del anuncio (cada uno con su propio «slug»). Llegó: {got_type}. Ejemplo de la forma de objeto aceptada: {example}",
184
+ "error.400.listing_features_draft_unknown_slug": "Cada elemento de una lista features_draft debe llevar su propio «slug» no vacío — el que la lectura del anuncio guarda en ese elemento — para poder archivarlo bajo la característica correcta. El elemento en el índice {index} no lo tiene. Ejemplo: {example}",
185
+ "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 característica>}}. Llegó: {got_type}. Ejemplo: {example}",
165
186
  "listings.blocked.sign_in": "Inicia sesión para hacer esto",
166
187
  "listings.blocked.guest": "Esta cuenta todavía no puede hacerlo — termina de configurarla primero",
167
188
  "listings.blocked.mandate_unknown": "No pudimos comprobar tu cuenta, así que no adivinamos si puedes hacerlo",
@@ -1 +1 @@
1
- {"version":3,"file":"es.js","sourceRoot":"","sources":["../../src/i18n/es.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"es.js","sourceRoot":"","sources":["../../src/i18n/es.ts"],"names":[],"mappings":"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"}