@stapel/listings-react 0.1.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.
- package/CHANGELOG.md +1 -0
- package/MODULE.md +191 -0
- package/README.md +169 -0
- package/dist/api/generated/schema.d.ts +1253 -0
- package/dist/api/generated/schema.d.ts.map +1 -0
- package/dist/api/generated/schema.js +2 -0
- package/dist/api/generated/schema.js.map +1 -0
- package/dist/api/listingsApi.d.ts +145 -0
- package/dist/api/listingsApi.d.ts.map +1 -0
- package/dist/api/listingsApi.js +38 -0
- package/dist/api/listingsApi.js.map +1 -0
- package/dist/api/types.d.ts +156 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +37 -0
- package/dist/api/types.js.map +1 -0
- package/dist/default/ErrorAlert.d.ts +9 -0
- package/dist/default/ErrorAlert.d.ts.map +1 -0
- package/dist/default/ErrorAlert.js +27 -0
- package/dist/default/ErrorAlert.js.map +1 -0
- package/dist/default/FavoritesPane.d.ts +18 -0
- package/dist/default/FavoritesPane.d.ts.map +1 -0
- package/dist/default/FavoritesPane.js +28 -0
- package/dist/default/FavoritesPane.js.map +1 -0
- package/dist/default/ListingCard.d.ts +42 -0
- package/dist/default/ListingCard.d.ts.map +1 -0
- package/dist/default/ListingCard.js +37 -0
- package/dist/default/ListingCard.js.map +1 -0
- package/dist/default/ListingComposerPage.d.ts +46 -0
- package/dist/default/ListingComposerPage.d.ts.map +1 -0
- package/dist/default/ListingComposerPage.js +99 -0
- package/dist/default/ListingComposerPage.js.map +1 -0
- package/dist/default/ListingDetailPane.d.ts +33 -0
- package/dist/default/ListingDetailPane.d.ts.map +1 -0
- package/dist/default/ListingDetailPane.js +48 -0
- package/dist/default/ListingDetailPane.js.map +1 -0
- package/dist/default/ListingPhoto.d.ts +25 -0
- package/dist/default/ListingPhoto.d.ts.map +1 -0
- package/dist/default/ListingPhoto.js +20 -0
- package/dist/default/ListingPhoto.js.map +1 -0
- package/dist/default/MyListingsPane.d.ts +25 -0
- package/dist/default/MyListingsPane.d.ts.map +1 -0
- package/dist/default/MyListingsPane.js +84 -0
- package/dist/default/MyListingsPane.js.map +1 -0
- package/dist/default/StatusTags.d.ts +31 -0
- package/dist/default/StatusTags.d.ts.map +1 -0
- package/dist/default/StatusTags.js +40 -0
- package/dist/default/StatusTags.js.map +1 -0
- package/dist/default/icons.d.ts +16 -0
- package/dist/default/icons.d.ts.map +1 -0
- package/dist/default/icons.js +5 -0
- package/dist/default/icons.js.map +1 -0
- package/dist/default/index.d.ts +35 -0
- package/dist/default/index.d.ts.map +1 -0
- package/dist/default/index.js +26 -0
- package/dist/default/index.js.map +1 -0
- package/dist/default/theme.d.ts +25 -0
- package/dist/default/theme.d.ts.map +1 -0
- package/dist/default/theme.js +40 -0
- package/dist/default/theme.js.map +1 -0
- package/dist/default/types.d.ts +12 -0
- package/dist/default/types.d.ts.map +1 -0
- package/dist/default/types.js +2 -0
- package/dist/default/types.js.map +1 -0
- package/dist/flows/registry.d.ts +35 -0
- package/dist/flows/registry.d.ts.map +1 -0
- package/dist/flows/registry.js +33 -0
- package/dist/flows/registry.js.map +1 -0
- package/dist/headless/Favorites.d.ts +52 -0
- package/dist/headless/Favorites.d.ts.map +1 -0
- package/dist/headless/Favorites.js +78 -0
- package/dist/headless/Favorites.js.map +1 -0
- package/dist/headless/ListingActions.d.ts +30 -0
- package/dist/headless/ListingActions.d.ts.map +1 -0
- package/dist/headless/ListingActions.js +54 -0
- package/dist/headless/ListingActions.js.map +1 -0
- package/dist/headless/ListingComposer.d.ts +133 -0
- package/dist/headless/ListingComposer.d.ts.map +1 -0
- package/dist/headless/ListingComposer.js +246 -0
- package/dist/headless/ListingComposer.js.map +1 -0
- package/dist/headless/ListingDetail.d.ts +81 -0
- package/dist/headless/ListingDetail.d.ts.map +1 -0
- package/dist/headless/ListingDetail.js +101 -0
- package/dist/headless/ListingDetail.js.map +1 -0
- package/dist/headless/ListingsProvider.d.ts +17 -0
- package/dist/headless/ListingsProvider.d.ts.map +1 -0
- package/dist/headless/ListingsProvider.js +16 -0
- package/dist/headless/ListingsProvider.js.map +1 -0
- package/dist/headless/MyListings.d.ts +44 -0
- package/dist/headless/MyListings.d.ts.map +1 -0
- package/dist/headless/MyListings.js +82 -0
- package/dist/headless/MyListings.js.map +1 -0
- package/dist/headless/useMandateGate.d.ts +28 -0
- package/dist/headless/useMandateGate.d.ts.map +1 -0
- package/dist/headless/useMandateGate.js +39 -0
- package/dist/headless/useMandateGate.js.map +1 -0
- package/dist/i18n/errorsMap.d.ts +34 -0
- package/dist/i18n/errorsMap.d.ts.map +1 -0
- package/dist/i18n/errorsMap.js +45 -0
- package/dist/i18n/errorsMap.js.map +1 -0
- package/dist/i18n/es.d.ts +21 -0
- package/dist/i18n/es.d.ts.map +1 -0
- package/dist/i18n/es.js +146 -0
- package/dist/i18n/es.js.map +1 -0
- package/dist/i18n/generated/errors.es.gen.d.ts +16 -0
- package/dist/i18n/generated/errors.es.gen.d.ts.map +1 -0
- package/dist/i18n/generated/errors.es.gen.js +58 -0
- package/dist/i18n/generated/errors.es.gen.js.map +1 -0
- package/dist/i18n/generated/errors.gen.d.ts +413 -0
- package/dist/i18n/generated/errors.gen.d.ts.map +1 -0
- package/dist/i18n/generated/errors.gen.js +210 -0
- package/dist/i18n/generated/errors.gen.js.map +1 -0
- package/dist/i18n/generated/errors.ru.gen.d.ts +16 -0
- package/dist/i18n/generated/errors.ru.gen.d.ts.map +1 -0
- package/dist/i18n/generated/errors.ru.gen.js +58 -0
- package/dist/i18n/generated/errors.ru.gen.js.map +1 -0
- package/dist/i18n/keys.d.ts +170 -0
- package/dist/i18n/keys.d.ts.map +1 -0
- package/dist/i18n/keys.js +295 -0
- package/dist/i18n/keys.js.map +1 -0
- package/dist/i18n/ru.d.ts +37 -0
- package/dist/i18n/ru.d.ts.map +1 -0
- package/dist/i18n/ru.js +162 -0
- package/dist/i18n/ru.js.map +1 -0
- package/dist/index.d.ts +103 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +98 -0
- package/dist/index.js.map +1 -0
- package/dist/model/context.d.ts +11 -0
- package/dist/model/context.d.ts.map +1 -0
- package/dist/model/context.js +16 -0
- package/dist/model/context.js.map +1 -0
- package/dist/model/draft.d.ts +138 -0
- package/dist/model/draft.d.ts.map +1 -0
- package/dist/model/draft.js +192 -0
- package/dist/model/draft.js.map +1 -0
- package/dist/model/features.d.ts +69 -0
- package/dist/model/features.d.ts.map +1 -0
- package/dist/model/features.js +73 -0
- package/dist/model/features.js.map +1 -0
- package/dist/model/mineSource.d.ts +47 -0
- package/dist/model/mineSource.d.ts.map +1 -0
- package/dist/model/mineSource.js +45 -0
- package/dist/model/mineSource.js.map +1 -0
- package/dist/model/mutations.d.ts +60 -0
- package/dist/model/mutations.d.ts.map +1 -0
- package/dist/model/mutations.js +165 -0
- package/dist/model/mutations.js.map +1 -0
- package/dist/model/queries.d.ts +75 -0
- package/dist/model/queries.d.ts.map +1 -0
- package/dist/model/queries.js +117 -0
- package/dist/model/queries.js.map +1 -0
- package/dist/model/queryKeys.d.ts +50 -0
- package/dist/model/queryKeys.d.ts.map +1 -0
- package/dist/model/queryKeys.js +24 -0
- package/dist/model/queryKeys.js.map +1 -0
- package/dist/model/runtime.d.ts +69 -0
- package/dist/model/runtime.d.ts.map +1 -0
- package/dist/model/runtime.js +14 -0
- package/dist/model/runtime.js.map +1 -0
- package/dist/model/status.d.ts +117 -0
- package/dist/model/status.d.ts.map +1 -0
- package/dist/model/status.js +164 -0
- package/dist/model/status.js.map +1 -0
- package/dist/model/transitions.d.ts +41 -0
- package/dist/model/transitions.d.ts.map +1 -0
- package/dist/model/transitions.js +25 -0
- package/dist/model/transitions.js.map +1 -0
- package/dist/model/validation.d.ts +135 -0
- package/dist/model/validation.d.ts.map +1 -0
- package/dist/model/validation.js +191 -0
- package/dist/model/validation.js.map +1 -0
- package/dist/nav/manifest.d.ts +46 -0
- package/dist/nav/manifest.d.ts.map +1 -0
- package/dist/nav/manifest.js +56 -0
- package/dist/nav/manifest.js.map +1 -0
- package/llms.txt +118 -0
- package/manifest.json +1044 -0
- package/nav-manifest.json +84 -0
- package/package.json +121 -0
- package/src/analytics/generated/events.json +7 -0
- package/src/api/generated/schema.ts +1255 -0
- package/src/api/listingsApi.ts +237 -0
- package/src/api/types.ts +193 -0
- package/src/default/ErrorAlert.tsx +46 -0
- package/src/default/FavoritesPane.tsx +123 -0
- package/src/default/ListingCard.tsx +178 -0
- package/src/default/ListingComposerPage.tsx +466 -0
- package/src/default/ListingDetailPane.tsx +271 -0
- package/src/default/ListingPhoto.tsx +62 -0
- package/src/default/MyListingsPane.tsx +333 -0
- package/src/default/StatusTags.tsx +86 -0
- package/src/default/icons.tsx +31 -0
- package/src/default/index.ts +35 -0
- package/src/default/theme.tsx +67 -0
- package/src/default/types.ts +12 -0
- package/src/flows/registry.ts +45 -0
- package/src/headless/Favorites.tsx +137 -0
- package/src/headless/ListingActions.tsx +101 -0
- package/src/headless/ListingComposer.tsx +476 -0
- package/src/headless/ListingDetail.tsx +231 -0
- package/src/headless/ListingsProvider.tsx +20 -0
- package/src/headless/MyListings.tsx +148 -0
- package/src/headless/useMandateGate.ts +40 -0
- package/src/i18n/errorsMap.ts +62 -0
- package/src/i18n/es.ts +198 -0
- package/src/i18n/generated/errors.es.gen.ts +64 -0
- package/src/i18n/generated/errors.gen.ts +241 -0
- package/src/i18n/generated/errors.json +499 -0
- package/src/i18n/generated/errors.ru.gen.ts +64 -0
- package/src/i18n/keys.ts +356 -0
- package/src/i18n/ru.ts +215 -0
- package/src/index.ts +260 -0
- package/src/model/context.tsx +28 -0
- package/src/model/draft.ts +307 -0
- package/src/model/features.ts +122 -0
- package/src/model/mineSource.ts +55 -0
- package/src/model/mutations.ts +224 -0
- package/src/model/queries.ts +150 -0
- package/src/model/queryKeys.ts +76 -0
- package/src/model/runtime.ts +87 -0
- package/src/model/status.ts +279 -0
- package/src/model/transitions.ts +62 -0
- package/src/model/validation.ts +271 -0
- package/src/nav/manifest.ts +97 -0
- package/tsconfig.json +26 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { ReactElement, ReactNode } from "react";
|
|
2
|
+
import type { ActionAvailability, LoadState } from "@stapel/core";
|
|
3
|
+
import type { ListingCard, ListingPageParams, MyCounters } from "../api/types.js";
|
|
4
|
+
import type { MyListingsSource } from "../model/mineSource.js";
|
|
5
|
+
import type { MyListingsTab } from "../model/status.js";
|
|
6
|
+
/**
|
|
7
|
+
* The owner's dashboard — and the one screen in this pair whose rows the
|
|
8
|
+
* backend cannot supply.
|
|
9
|
+
*
|
|
10
|
+
* The counters are REAL and are shown. The rows come from an injected
|
|
11
|
+
* `MyListingsSource`, and when there is none `rows` lands in the `failed` arm
|
|
12
|
+
* carrying a NAMED reason rather than as an empty list. `model/mineSource.ts`
|
|
13
|
+
* holds the whole argument and the upstream asks; this file is the bag over
|
|
14
|
+
* it.
|
|
15
|
+
*/
|
|
16
|
+
export interface MyListingsBag {
|
|
17
|
+
readonly tab: MyListingsTab;
|
|
18
|
+
readonly tabs: readonly MyListingsTab[];
|
|
19
|
+
setTab(tab: MyListingsTab): void;
|
|
20
|
+
/** The three real counts. */
|
|
21
|
+
readonly counters: LoadState<MyCounters>;
|
|
22
|
+
/** The rows for the current tab. `failed` with a named reason when no
|
|
23
|
+
* source is wired — never an empty list. */
|
|
24
|
+
readonly rows: LoadState<readonly ListingCard[]>;
|
|
25
|
+
readonly page: ListingPageParams;
|
|
26
|
+
readonly nextPage: ActionAvailability;
|
|
27
|
+
readonly prevPage: ActionAvailability;
|
|
28
|
+
goNext(): void;
|
|
29
|
+
goPrev(): void;
|
|
30
|
+
/** Whether the person may see this screen at all. */
|
|
31
|
+
readonly gate: ActionAvailability;
|
|
32
|
+
refetch(): void;
|
|
33
|
+
}
|
|
34
|
+
export interface UseMyListingsOptions {
|
|
35
|
+
readonly source?: MyListingsSource;
|
|
36
|
+
readonly initialTab?: MyListingsTab;
|
|
37
|
+
readonly limit?: number;
|
|
38
|
+
}
|
|
39
|
+
export declare function useMyListings(options?: UseMyListingsOptions): MyListingsBag;
|
|
40
|
+
/** Renderless: the bag, handed to a render prop. */
|
|
41
|
+
export declare function MyListings(props: UseMyListingsOptions & {
|
|
42
|
+
children: (bag: MyListingsBag) => ReactNode;
|
|
43
|
+
}): ReactElement;
|
|
44
|
+
//# sourceMappingURL=MyListings.d.ts.map
|
|
@@ -0,0 +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,WAAW,EACX,iBAAiB,EACjB,UAAU,EACX,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAI/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAIxD;;;;;;;;;GASG;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,6BAA6B;IAC7B,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;IACzC;gDAC4C;IAC5C,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,WAAW,EAAE,CAAC,CAAC;IACjD,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,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,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,aAAa,CAC3B,OAAO,GAAE,oBAAyB,GACjC,aAAa,CAyEf;AAED,oDAAoD;AACpD,wBAAgB,UAAU,CACxB,KAAK,EAAE,oBAAoB,GAAG;IAC5B,QAAQ,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,SAAS,CAAC;CAC7C,GACA,YAAY,CAGd"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo, useState } from "react";
|
|
3
|
+
import { useQuery } from "@tanstack/react-query";
|
|
4
|
+
import { actionAvailable, actionBlocked, loadFailed, loadLoading, loadReady, useActiveSessionReady, } from "@stapel/core";
|
|
5
|
+
import { MY_LISTINGS_SOURCE_MISSING } from "../model/mineSource.js";
|
|
6
|
+
import { useMyCounters } from "../model/queries.js";
|
|
7
|
+
import { listingsQueryKeys, pageKey } from "../model/queryKeys.js";
|
|
8
|
+
import { MY_LISTINGS_TABS } from "../model/status.js";
|
|
9
|
+
import { LISTINGS_I18N_KEYS } from "../i18n/keys.js";
|
|
10
|
+
import { useMandateGate } from "./useMandateGate.js";
|
|
11
|
+
export function useMyListings(options = {}) {
|
|
12
|
+
const gate = useMandateGate();
|
|
13
|
+
const sessionReady = useActiveSessionReady();
|
|
14
|
+
const [tab, setTabState] = useState(options.initialTab ?? "active");
|
|
15
|
+
const [page, setPage] = useState(options.limit !== undefined ? { limit: options.limit } : {});
|
|
16
|
+
const counters = useMyCounters();
|
|
17
|
+
const { source } = options;
|
|
18
|
+
const rowsQuery = useQuery({
|
|
19
|
+
queryKey: listingsQueryKeys.mine(tab, pageKey(page)),
|
|
20
|
+
queryFn: ({ signal }) => source({ tab, page, signal }),
|
|
21
|
+
enabled: source !== undefined && sessionReady && gate.available,
|
|
22
|
+
retry: false,
|
|
23
|
+
});
|
|
24
|
+
const rows = useMemo(() => {
|
|
25
|
+
if (source === undefined)
|
|
26
|
+
return loadFailed(MY_LISTINGS_SOURCE_MISSING);
|
|
27
|
+
if (rowsQuery.status === "error")
|
|
28
|
+
return loadFailed(rowsQuery.error);
|
|
29
|
+
if (rowsQuery.data !== undefined)
|
|
30
|
+
return loadReady(rowsQuery.data.items);
|
|
31
|
+
return loadLoading();
|
|
32
|
+
}, [source, rowsQuery.status, rowsQuery.error, rowsQuery.data]);
|
|
33
|
+
const envelope = rowsQuery.data;
|
|
34
|
+
return {
|
|
35
|
+
tab,
|
|
36
|
+
tabs: MY_LISTINGS_TABS,
|
|
37
|
+
setTab: (next) => {
|
|
38
|
+
// A cursor belongs to ONE ordered candidate set. Carried across a tab
|
|
39
|
+
// change it either bounces or honestly returns page four of a
|
|
40
|
+
// different list — the same property `@stapel/search-react` writes
|
|
41
|
+
// down for its own keyset state.
|
|
42
|
+
setPage(options.limit !== undefined ? { limit: options.limit } : {});
|
|
43
|
+
setTabState(next);
|
|
44
|
+
},
|
|
45
|
+
counters: counters.status === "error"
|
|
46
|
+
? loadFailed(counters.error)
|
|
47
|
+
: counters.data !== undefined
|
|
48
|
+
? loadReady(counters.data)
|
|
49
|
+
: loadLoading(),
|
|
50
|
+
rows,
|
|
51
|
+
page,
|
|
52
|
+
nextPage: envelope?.has_next === true && envelope.next_anchor != null
|
|
53
|
+
? actionAvailable()
|
|
54
|
+
: actionBlocked(LISTINGS_I18N_KEYS.pageNext),
|
|
55
|
+
prevPage: envelope?.has_prev === true && envelope.prev_anchor != null
|
|
56
|
+
? actionAvailable()
|
|
57
|
+
: actionBlocked(LISTINGS_I18N_KEYS.pagePrev),
|
|
58
|
+
goNext: () => {
|
|
59
|
+
const anchor = envelope?.next_anchor;
|
|
60
|
+
if (anchor == null)
|
|
61
|
+
return;
|
|
62
|
+
setPage((current) => ({ ...current, anchor, direction: "next" }));
|
|
63
|
+
},
|
|
64
|
+
goPrev: () => {
|
|
65
|
+
const anchor = envelope?.prev_anchor;
|
|
66
|
+
if (anchor == null)
|
|
67
|
+
return;
|
|
68
|
+
setPage((current) => ({ ...current, anchor, direction: "prev" }));
|
|
69
|
+
},
|
|
70
|
+
gate,
|
|
71
|
+
refetch: () => {
|
|
72
|
+
void counters.refetch();
|
|
73
|
+
void rowsQuery.refetch();
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/** Renderless: the bag, handed to a render prop. */
|
|
78
|
+
export function MyListings(props) {
|
|
79
|
+
const bag = useMyListings(props);
|
|
80
|
+
return _jsx(_Fragment, { children: props.children(bag) });
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=MyListings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MyListings.js","sourceRoot":"","sources":["../../src/headless/MyListings.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ActionAvailability } from "@stapel/core";
|
|
2
|
+
/**
|
|
3
|
+
* "May this person act at all?" — the first gate on every write in the pair.
|
|
4
|
+
*
|
|
5
|
+
* Posting a listing, saving a draft, marking something sold and saving a
|
|
6
|
+
* favourite are all `IsAuthenticated`. A visitor meeting one of them must be
|
|
7
|
+
* told to sign in, WITH the reason and with a way to do it: a hidden button
|
|
8
|
+
* teaches nothing (private-space canon §6.3), and a 401 after the click
|
|
9
|
+
* teaches it too late.
|
|
10
|
+
*
|
|
11
|
+
* The axis is read through core's `MandateSource` seam, never derived here. A
|
|
12
|
+
* storefront's derivation is "is there a session?"; a tenant app's is
|
|
13
|
+
* `@stapel/workspaces-react`'s. This pair asks and does not care which.
|
|
14
|
+
* `matchMandate` has five required arms, so the two `unresolved` outcomes
|
|
15
|
+
* cannot fall into the refusal's branch by omission:
|
|
16
|
+
*
|
|
17
|
+
* - `asking` — we have not finished asking. The control waits; it does not
|
|
18
|
+
* say "you may not".
|
|
19
|
+
* - `unavailable` — we COULD NOT ask. Also not "you may not": the storefront
|
|
20
|
+
* spec's own negative leg (§7.4) is that `/me` answering 503
|
|
21
|
+
* must not render as a refusal.
|
|
22
|
+
*
|
|
23
|
+
* Outside a `<MandateProvider>` core answers `unresolved/unavailable` rather
|
|
24
|
+
* than throwing, so a pair rendered in a host that never wired the axis
|
|
25
|
+
* degrades to "we could not check" — visible, fixable, and not a blank page.
|
|
26
|
+
*/
|
|
27
|
+
export declare function useMandateGate(): ActionAvailability;
|
|
28
|
+
//# sourceMappingURL=useMandateGate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMandateGate.d.ts","sourceRoot":"","sources":["../../src/headless/useMandateGate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAIvD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,cAAc,IAAI,kBAAkB,CASnD"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { matchMandate, useMandate } from "@stapel/core";
|
|
2
|
+
import { actionAvailable, actionBlocked } from "@stapel/core";
|
|
3
|
+
import { LISTINGS_I18N_KEYS } from "../i18n/keys.js";
|
|
4
|
+
/**
|
|
5
|
+
* "May this person act at all?" — the first gate on every write in the pair.
|
|
6
|
+
*
|
|
7
|
+
* Posting a listing, saving a draft, marking something sold and saving a
|
|
8
|
+
* favourite are all `IsAuthenticated`. A visitor meeting one of them must be
|
|
9
|
+
* told to sign in, WITH the reason and with a way to do it: a hidden button
|
|
10
|
+
* teaches nothing (private-space canon §6.3), and a 401 after the click
|
|
11
|
+
* teaches it too late.
|
|
12
|
+
*
|
|
13
|
+
* The axis is read through core's `MandateSource` seam, never derived here. A
|
|
14
|
+
* storefront's derivation is "is there a session?"; a tenant app's is
|
|
15
|
+
* `@stapel/workspaces-react`'s. This pair asks and does not care which.
|
|
16
|
+
* `matchMandate` has five required arms, so the two `unresolved` outcomes
|
|
17
|
+
* cannot fall into the refusal's branch by omission:
|
|
18
|
+
*
|
|
19
|
+
* - `asking` — we have not finished asking. The control waits; it does not
|
|
20
|
+
* say "you may not".
|
|
21
|
+
* - `unavailable` — we COULD NOT ask. Also not "you may not": the storefront
|
|
22
|
+
* spec's own negative leg (§7.4) is that `/me` answering 503
|
|
23
|
+
* must not render as a refusal.
|
|
24
|
+
*
|
|
25
|
+
* Outside a `<MandateProvider>` core answers `unresolved/unavailable` rather
|
|
26
|
+
* than throwing, so a pair rendered in a host that never wired the axis
|
|
27
|
+
* degrades to "we could not check" — visible, fixable, and not a blank page.
|
|
28
|
+
*/
|
|
29
|
+
export function useMandateGate() {
|
|
30
|
+
const mandate = useMandate();
|
|
31
|
+
return matchMandate(mandate, {
|
|
32
|
+
member: () => actionAvailable(),
|
|
33
|
+
guest: () => actionBlocked(LISTINGS_I18N_KEYS.blockedGuest),
|
|
34
|
+
anonymous: () => actionBlocked(LISTINGS_I18N_KEYS.blockedSignIn),
|
|
35
|
+
asking: () => actionBlocked(LISTINGS_I18N_KEYS.blockedMandateUnknown),
|
|
36
|
+
unavailable: () => actionBlocked(LISTINGS_I18N_KEYS.blockedMandateUnknown),
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=useMandateGate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMandateGate.js","sourceRoot":"","sources":["../../src/headless/useMandateGate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAExD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,OAAO,YAAY,CAAqB,OAAO,EAAE;QAC/C,MAAM,EAAE,GAAG,EAAE,CAAC,eAAe,EAAE;QAC/B,KAAK,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,kBAAkB,CAAC,YAAY,CAAC;QAC3D,SAAS,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,kBAAkB,CAAC,aAAa,CAAC;QAChE,MAAM,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,kBAAkB,CAAC,qBAAqB,CAAC;QACrE,WAAW,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,kBAAkB,CAAC,qBAAqB,CAAC;KAC3E,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Remediation } from "./generated/errors.gen.js";
|
|
2
|
+
export { LISTINGS_ERRORS, LISTINGS_ERROR_CODES, listingsErrorBundleEn, } from "./generated/errors.gen.js";
|
|
3
|
+
export type { ListingsErrorCode, ListingsErrorSpec, Remediation, } from "./generated/errors.gen.js";
|
|
4
|
+
/**
|
|
5
|
+
* The lifecycle refusal, and the one code in this registry that carries the
|
|
6
|
+
* information needed to explain itself: `params.from_status` is the state the
|
|
7
|
+
* server refused to move OUT of (`views._transition`). A skin renders
|
|
8
|
+
* "a listing that is sold cannot be archived that way", not "conflict".
|
|
9
|
+
*/
|
|
10
|
+
export declare const LISTING_INVALID_TRANSITION = "error.409.invalid_listing_transition";
|
|
11
|
+
/** Deleting something that is on sale. The remedy is in the sentence:
|
|
12
|
+
* archive it first. */
|
|
13
|
+
export declare const LISTING_CANNOT_DELETE_ACTIVE = "error.409.listing_cannot_delete_active";
|
|
14
|
+
/**
|
|
15
|
+
* The publish refusal that is NOT a per-field verdict.
|
|
16
|
+
*
|
|
17
|
+
* `publish` answers an invalid draft with a bare `ValidationBatchResult`; this
|
|
18
|
+
* code is what it answers when the PROMOTION fails afterwards — today that
|
|
19
|
+
* means `REQUIRE_IMAGE_ON_PUBLISH` with an empty gallery. Two 400s, two
|
|
20
|
+
* meanings; `model/validation.ts`'s `publishRefusal` is the one place that
|
|
21
|
+
* tells them apart.
|
|
22
|
+
*/
|
|
23
|
+
export declare const LISTING_PUBLISH_VALIDATION_FAILED = "error.400.publish_validation_failed";
|
|
24
|
+
/** Somebody else's listing. Every owner operation routes through
|
|
25
|
+
* `views._get_own` — except `PUT`/`PATCH`, which is why this pair does not
|
|
26
|
+
* call them (`api/listingsApi.ts`). */
|
|
27
|
+
export declare const LISTING_NOT_OWNER = "error.403.listing_not_owner";
|
|
28
|
+
/**
|
|
29
|
+
* Resolve a backend error code to its remediation hint, or `undefined` for a
|
|
30
|
+
* code this module doesn't know (e.g. a cross-cutting `stapel.http.*`
|
|
31
|
+
* fallback). Zero guessing at runtime — a static lookup over the generated map.
|
|
32
|
+
*/
|
|
33
|
+
export declare function explainListingsError(code: string): Remediation | undefined;
|
|
34
|
+
//# sourceMappingURL=errorsMap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorsMap.d.ts","sourceRoot":"","sources":["../../src/i18n/errorsMap.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,GACZ,MAAM,2BAA2B,CAAC;AAEnC;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,yCAAyC,CAAC;AAEjF;uBACuB;AACvB,eAAO,MAAM,4BAA4B,2CACC,CAAC;AAE3C;;;;;;;;GAQG;AACH,eAAO,MAAM,iCAAiC,wCACP,CAAC;AAExC;;uCAEuC;AACvC,eAAO,MAAM,iBAAiB,gCAAgC,CAAC;AAE/D;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAG1E"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The pair's error map (frontend-standard §4 checklist #7, frontend-core
|
|
3
|
+
* §2.5): the generated `code → { status, params, remediation, en }` catalog
|
|
4
|
+
* plus a tiny `explain()` lookup. Backs the manifest `errors` block and gives
|
|
5
|
+
* hosts a mechanical UX branch beside `t(code, params)`. The map itself is
|
|
6
|
+
* generated from the backend registry (`pnpm gen:errors`); this file only
|
|
7
|
+
* adds the lookup helper, names the three refusals a storefront actually
|
|
8
|
+
* meets, and re-exports the public surface.
|
|
9
|
+
*/
|
|
10
|
+
import { LISTINGS_ERRORS } from "./generated/errors.gen.js";
|
|
11
|
+
export { LISTINGS_ERRORS, LISTINGS_ERROR_CODES, listingsErrorBundleEn, } from "./generated/errors.gen.js";
|
|
12
|
+
/**
|
|
13
|
+
* The lifecycle refusal, and the one code in this registry that carries the
|
|
14
|
+
* information needed to explain itself: `params.from_status` is the state the
|
|
15
|
+
* server refused to move OUT of (`views._transition`). A skin renders
|
|
16
|
+
* "a listing that is sold cannot be archived that way", not "conflict".
|
|
17
|
+
*/
|
|
18
|
+
export const LISTING_INVALID_TRANSITION = "error.409.invalid_listing_transition";
|
|
19
|
+
/** Deleting something that is on sale. The remedy is in the sentence:
|
|
20
|
+
* archive it first. */
|
|
21
|
+
export const LISTING_CANNOT_DELETE_ACTIVE = "error.409.listing_cannot_delete_active";
|
|
22
|
+
/**
|
|
23
|
+
* The publish refusal that is NOT a per-field verdict.
|
|
24
|
+
*
|
|
25
|
+
* `publish` answers an invalid draft with a bare `ValidationBatchResult`; this
|
|
26
|
+
* code is what it answers when the PROMOTION fails afterwards — today that
|
|
27
|
+
* means `REQUIRE_IMAGE_ON_PUBLISH` with an empty gallery. Two 400s, two
|
|
28
|
+
* meanings; `model/validation.ts`'s `publishRefusal` is the one place that
|
|
29
|
+
* tells them apart.
|
|
30
|
+
*/
|
|
31
|
+
export const LISTING_PUBLISH_VALIDATION_FAILED = "error.400.publish_validation_failed";
|
|
32
|
+
/** Somebody else's listing. Every owner operation routes through
|
|
33
|
+
* `views._get_own` — except `PUT`/`PATCH`, which is why this pair does not
|
|
34
|
+
* call them (`api/listingsApi.ts`). */
|
|
35
|
+
export const LISTING_NOT_OWNER = "error.403.listing_not_owner";
|
|
36
|
+
/**
|
|
37
|
+
* Resolve a backend error code to its remediation hint, or `undefined` for a
|
|
38
|
+
* code this module doesn't know (e.g. a cross-cutting `stapel.http.*`
|
|
39
|
+
* fallback). Zero guessing at runtime — a static lookup over the generated map.
|
|
40
|
+
*/
|
|
41
|
+
export function explainListingsError(code) {
|
|
42
|
+
return LISTINGS_ERRORS[code]
|
|
43
|
+
?.remediation;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=errorsMap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorsMap.js","sourceRoot":"","sources":["../../src/i18n/errorsMap.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAG5D,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,2BAA2B,CAAC;AAOnC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,sCAAsC,CAAC;AAEjF;uBACuB;AACvB,MAAM,CAAC,MAAM,4BAA4B,GACvC,wCAAwC,CAAC;AAE3C;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAC5C,qCAAqC,CAAC;AAExC;;uCAEuC;AACvC,MAAM,CAAC,MAAM,iBAAiB,GAAG,6BAA6B,CAAC;AAE/D;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAQ,eAAgE,CAAC,IAAI,CAAC;QAC5E,EAAE,WAAW,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { I18nDictionary, I18nEngine } from "@stapel/core";
|
|
2
|
+
export { listingsErrorBundleEs } from "./generated/errors.es.gen.js";
|
|
3
|
+
/**
|
|
4
|
+
* Spanish bundle for listings-react — the `@stapel/listings-react/i18n/es`
|
|
5
|
+
* subpath (i18n-shipping.md §2), opt-in exactly like `./i18n/ru`.
|
|
6
|
+
*
|
|
7
|
+
* It carries the UI copy too, not only the nine module-owned error keys. The
|
|
8
|
+
* composer and the owner's dashboard are the surfaces a seller works in for
|
|
9
|
+
* minutes at a time; a half-translated form there is visible immediately, in
|
|
10
|
+
* the way a half-translated settings pane is not. Same call chat-react made
|
|
11
|
+
* for the buyer↔seller thread.
|
|
12
|
+
*
|
|
13
|
+
* Provenance and the owner split are as in `./ru.ts`: 42 cross-cutting codes
|
|
14
|
+
* generated from stapel-core's catalogue, 9 `stapel_listings` codes authored
|
|
15
|
+
* here until upstream ships `translations/`, and the 12 `stapel_attributes`
|
|
16
|
+
* codes deliberately left to `@stapel/attributes-react`.
|
|
17
|
+
*/
|
|
18
|
+
export declare const listingsI18nBundleEs: I18nDictionary;
|
|
19
|
+
/** Register the Spanish bundle into a core i18n engine. */
|
|
20
|
+
export declare function registerListingsI18nEs(i18n: I18nEngine): void;
|
|
21
|
+
//# sourceMappingURL=es.d.ts.map
|
|
@@ -0,0 +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;AAG/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,oBAAoB,EAAE,cA4KlC,CAAC;AAEF,2DAA2D;AAC3D,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAE7D"}
|
package/dist/i18n/es.js
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { listingsErrorBundleEs } from "./generated/errors.es.gen.js";
|
|
2
|
+
export { listingsErrorBundleEs } from "./generated/errors.es.gen.js";
|
|
3
|
+
/**
|
|
4
|
+
* Spanish bundle for listings-react — the `@stapel/listings-react/i18n/es`
|
|
5
|
+
* subpath (i18n-shipping.md §2), opt-in exactly like `./i18n/ru`.
|
|
6
|
+
*
|
|
7
|
+
* It carries the UI copy too, not only the nine module-owned error keys. The
|
|
8
|
+
* composer and the owner's dashboard are the surfaces a seller works in for
|
|
9
|
+
* minutes at a time; a half-translated form there is visible immediately, in
|
|
10
|
+
* the way a half-translated settings pane is not. Same call chat-react made
|
|
11
|
+
* for the buyer↔seller thread.
|
|
12
|
+
*
|
|
13
|
+
* Provenance and the owner split are as in `./ru.ts`: 42 cross-cutting codes
|
|
14
|
+
* generated from stapel-core's catalogue, 9 `stapel_listings` codes authored
|
|
15
|
+
* here until upstream ships `translations/`, and the 12 `stapel_attributes`
|
|
16
|
+
* codes deliberately left to `@stapel/attributes-react`.
|
|
17
|
+
*/
|
|
18
|
+
export const listingsI18nBundleEs = {
|
|
19
|
+
...listingsErrorBundleEs,
|
|
20
|
+
// ── the 9 stapel_listings-owned codes, pair-authored ─────────────────────
|
|
21
|
+
"error.400.category_required": "Hay que elegir una categoría",
|
|
22
|
+
"error.400.image_required": "Para publicar el anuncio hace falta al menos una foto",
|
|
23
|
+
"error.400.listing_feature_not_allowed": "El detalle «{feature}» no pertenece a esta categoría",
|
|
24
|
+
"error.400.publish_validation_failed": "El anuncio no pasó la revisión y no se publicó",
|
|
25
|
+
"error.403.listing_not_owner": "Este anuncio no es tuyo",
|
|
26
|
+
"error.404.listing_not_found": "No se encontró el anuncio",
|
|
27
|
+
"error.409.already_favorited": "El anuncio ya está en favoritos",
|
|
28
|
+
"error.409.invalid_listing_transition": "Un anuncio en estado «{from_status}» no se puede mover así",
|
|
29
|
+
"error.409.listing_cannot_delete_active": "Archívalo primero — un anuncio a la venta no se puede borrar",
|
|
30
|
+
"listings.error.unknown": "Algo salió mal con este anuncio",
|
|
31
|
+
"listings.status.draft": "Borrador",
|
|
32
|
+
"listings.status.pending": "En revisión",
|
|
33
|
+
"listings.status.published": "Publicado",
|
|
34
|
+
"listings.status.paused": "En pausa",
|
|
35
|
+
"listings.status.expired": "Caducado",
|
|
36
|
+
"listings.status.sold": "Vendido",
|
|
37
|
+
"listings.status.rejected": "Rechazado",
|
|
38
|
+
"listings.status.blocked": "Retirado",
|
|
39
|
+
"listings.status.archived": "Archivado",
|
|
40
|
+
"listings.moderation.first_review": "Enviado a revisión. Saldrá a la venta cuando un moderador lo apruebe.",
|
|
41
|
+
"listings.moderation.live_edit_pending": "Tu anuncio sigue publicado mientras revisamos los cambios — la gente lo ve ahora mismo.",
|
|
42
|
+
"listings.moderation.pending_offline": "Se pidió una revisión, pero este anuncio ya no está a la venta.",
|
|
43
|
+
"listings.moderation.needs_review": "Un moderador lo está mirando a mano.",
|
|
44
|
+
"listings.moderation.live_needs_review": "Publicado, y un moderador está mirando los cambios a mano.",
|
|
45
|
+
"listings.moderation.rejected": "Un moderador rechazó este anuncio. Edítalo y vuelve a enviarlo.",
|
|
46
|
+
"listings.moderation.rejected_still_live": "Un moderador rechazó este anuncio; sigue visible mientras se aplica.",
|
|
47
|
+
"listings.card.no_photo": "Sin foto",
|
|
48
|
+
"listings.card.photo_unavailable": "Foto no disponible",
|
|
49
|
+
"listings.card.price_absent": "Precio a consultar",
|
|
50
|
+
"listings.card.favorite_add": "Guardar en favoritos",
|
|
51
|
+
"listings.card.favorite_remove": "Quitar de favoritos",
|
|
52
|
+
"listings.card.open": "Abrir",
|
|
53
|
+
"listings.detail.loading": "Cargando el anuncio…",
|
|
54
|
+
"listings.detail.load_failed": "No pudimos cargar este anuncio",
|
|
55
|
+
"listings.detail.retry": "Reintentar",
|
|
56
|
+
"listings.detail.not_found": "No hay ningún anuncio en esta dirección",
|
|
57
|
+
"listings.detail.removed": "Este anuncio fue eliminado",
|
|
58
|
+
"listings.detail.not_published": "Este anuncio no está a la venta ahora, así que lo que ves puede estar desactualizado",
|
|
59
|
+
"listings.detail.owner_only_view": "Solo tú ves esto — todavía no está publicado",
|
|
60
|
+
"listings.detail.description": "Descripción",
|
|
61
|
+
"listings.detail.specs": "Detalles",
|
|
62
|
+
"listings.detail.no_specs": "El vendedor no indicó más detalles",
|
|
63
|
+
"listings.detail.unreadable_features": "Detalles que esta versión no pudo leer: {count}",
|
|
64
|
+
"listings.detail.photos_unavailable": "Aquí no se pueden mostrar las fotos — la aplicación no sabe resolverlas",
|
|
65
|
+
"listings.detail.photo_alt": "Foto {index} de {total}",
|
|
66
|
+
"listings.detail.published_at": "Publicado el {date}",
|
|
67
|
+
"listings.detail.expires_at": "A la venta hasta el {date}",
|
|
68
|
+
"listings.detail.stock": "Disponibles: {count}",
|
|
69
|
+
"listings.compose.new_title": "Anuncio nuevo",
|
|
70
|
+
"listings.compose.edit_title": "Editar el anuncio",
|
|
71
|
+
"listings.compose.category": "Categoría",
|
|
72
|
+
"listings.compose.category_help": "La categoría decide qué detalles se le piden al vendedor",
|
|
73
|
+
"listings.compose.category_required": "Elige una categoría primero",
|
|
74
|
+
"listings.compose.category_changed_dropped": "Respuestas que no aplican a esta categoría y se han borrado: {count}",
|
|
75
|
+
"listings.compose.title_label": "Título",
|
|
76
|
+
"listings.compose.title_too_long": "El título debe tener como mucho {max_length} caracteres",
|
|
77
|
+
"listings.compose.description_label": "Descripción",
|
|
78
|
+
"listings.compose.price_label": "Precio",
|
|
79
|
+
"listings.compose.price_invalid": "Escribe el precio como un número, con dos decimales como mucho",
|
|
80
|
+
"listings.compose.currency_label": "Moneda",
|
|
81
|
+
"listings.compose.location_label": "Dónde está",
|
|
82
|
+
"listings.compose.lat_label": "Latitud",
|
|
83
|
+
"listings.compose.lon_label": "Longitud",
|
|
84
|
+
"listings.compose.geo_incomplete": "Una latitud necesita su longitud al lado — media coordenada no apunta a ningún sitio",
|
|
85
|
+
"listings.compose.photos": "Fotos",
|
|
86
|
+
"listings.compose.too_many_images": "Un anuncio admite como mucho {max} fotos",
|
|
87
|
+
"listings.compose.details": "Detalles",
|
|
88
|
+
"listings.compose.details_loading": "Cargando lo que pide esta categoría…",
|
|
89
|
+
"listings.compose.details_failed": "No pudimos cargar lo que pide esta categoría",
|
|
90
|
+
"listings.compose.details_empty": "Esta categoría no pide más detalles",
|
|
91
|
+
"listings.compose.countable": "Vendo un artículo contable",
|
|
92
|
+
"listings.compose.stock": "Cuántas unidades",
|
|
93
|
+
"listings.compose.auto_republish": "Volver a publicar cuando caduque",
|
|
94
|
+
"listings.compose.save": "Guardar borrador",
|
|
95
|
+
"listings.compose.saving": "Guardando…",
|
|
96
|
+
"listings.compose.saved": "Borrador guardado",
|
|
97
|
+
"listings.compose.publish": "Publicar",
|
|
98
|
+
"listings.compose.republish": "Enviar los cambios",
|
|
99
|
+
"listings.compose.publishing": "Enviando…",
|
|
100
|
+
"listings.compose.published_first": "Enviado a revisión. Saldrá a la venta cuando un moderador lo apruebe.",
|
|
101
|
+
"listings.compose.published_live": "Cambios enviados. Tu anuncio sigue publicado mientras los revisamos.",
|
|
102
|
+
"listings.compose.invalid_summary": "Antes de enviarlo, revisa estos detalles: {count}",
|
|
103
|
+
"listings.compose.blocked.no_category": "Elige una categoría — el resto del formulario depende de ella",
|
|
104
|
+
"listings.compose.blocked.unsupported_type": "Esta categoría pide un tipo de detalle que la aplicación todavía no sabe mostrar ({types}), así que aquí no se puede rellenar",
|
|
105
|
+
"listings.compose.blocked.photos_pending": "Espera a que terminen de subirse las fotos",
|
|
106
|
+
"listings.compose.blocked.no_draft": "El borrador todavía no está creado",
|
|
107
|
+
"listings.compose.blocked.busy": "Un momento — el último cambio se está guardando",
|
|
108
|
+
"listings.compose.blocked.mirror": "Corrige primero los campos marcados",
|
|
109
|
+
"listings.compose.blocked.details_unavailable": "No pudimos cargar lo que pide esta categoría, así que no podemos revisar el formulario",
|
|
110
|
+
"listings.mine.title": "Mis anuncios",
|
|
111
|
+
"listings.mine.tab.active": "Activos",
|
|
112
|
+
"listings.mine.tab.drafts": "Borradores",
|
|
113
|
+
"listings.mine.tab.archived": "Archivo",
|
|
114
|
+
"listings.mine.loading": "Cargando tus anuncios…",
|
|
115
|
+
"listings.mine.load_failed": "No pudimos cargar tus anuncios",
|
|
116
|
+
"listings.mine.empty": "Aquí todavía no hay nada",
|
|
117
|
+
"listings.mine.retry": "Reintentar",
|
|
118
|
+
"listings.mine.counters_failed": "No pudimos contar tus anuncios",
|
|
119
|
+
"listings.mine.source_missing": "Esta aplicación todavía no puede enumerar tus anuncios: el servicio de anuncios no tiene una lista limitada al propietario. Los contadores de abajo sí son reales.",
|
|
120
|
+
"listings.mine.live_under_review": "Publicado, cambios en revisión",
|
|
121
|
+
"listings.mine.edit": "Editar",
|
|
122
|
+
"listings.mine.archive": "Archivar",
|
|
123
|
+
"listings.mine.complete": "Marcar como vendido",
|
|
124
|
+
"listings.mine.delete": "Borrar",
|
|
125
|
+
"listings.favorites.title": "Favoritos",
|
|
126
|
+
"listings.favorites.loading": "Cargando tus favoritos…",
|
|
127
|
+
"listings.favorites.load_failed": "No pudimos cargar tus favoritos",
|
|
128
|
+
"listings.favorites.empty": "Todavía no has guardado nada",
|
|
129
|
+
"listings.blocked.sign_in": "Inicia sesión para hacer esto",
|
|
130
|
+
"listings.blocked.guest": "Esta cuenta todavía no puede hacerlo — termina de configurarla primero",
|
|
131
|
+
"listings.blocked.mandate_unknown": "No pudimos comprobar tu cuenta, así que no adivinamos si puedes hacerlo",
|
|
132
|
+
"listings.blocked.transition": "Un anuncio en estado «{from_status}» no se puede mover así",
|
|
133
|
+
"listings.blocked.delete_active": "Archívalo primero — un anuncio a la venta no se puede borrar",
|
|
134
|
+
"listings.blocked.in_flight": "Un momento — eso ya está en marcha",
|
|
135
|
+
"listings.page.prev": "Anterior",
|
|
136
|
+
"listings.page.next": "Siguiente",
|
|
137
|
+
"listings.nav.detail": "Anuncio",
|
|
138
|
+
"listings.nav.compose": "Poner un anuncio",
|
|
139
|
+
"listings.nav.mine": "Mis anuncios",
|
|
140
|
+
"listings.nav.favorites": "Favoritos",
|
|
141
|
+
};
|
|
142
|
+
/** Register the Spanish bundle into a core i18n engine. */
|
|
143
|
+
export function registerListingsI18nEs(i18n) {
|
|
144
|
+
i18n.registerBundle("es", listingsI18nBundleEs);
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"es.js","sourceRoot":"","sources":["../../src/i18n/es.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ListingsErrorCode } from "./errors.gen.js";
|
|
2
|
+
/**
|
|
3
|
+
* `es` texts for the backend error codes this catalog carries.
|
|
4
|
+
*
|
|
5
|
+
* PARTIAL, and deliberately typed to say so: 21 key(s) owned by
|
|
6
|
+
* stapel_attributes, stapel_listings are absent, because that owner ships no locale catalog
|
|
7
|
+
* (ERRORS_LOCALE_EXEMPT_OWNERS). English for them still comes from the registry
|
|
8
|
+
* artifact via the en bundle; the pair layers its own authored `es`
|
|
9
|
+
* strings over this one until upstream ships translations. `Partial` is what
|
|
10
|
+
* makes the gap visible to TypeScript instead of a silent English fallback.
|
|
11
|
+
*
|
|
12
|
+
* Import from the pair's `./i18n/es` subpath, NOT the main entry, so
|
|
13
|
+
* the locale stays out of hosts that don't ship it.
|
|
14
|
+
*/
|
|
15
|
+
export declare const listingsErrorBundleEs: Partial<Record<ListingsErrorCode, string>>;
|
|
16
|
+
//# sourceMappingURL=errors.es.gen.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `es` texts for the backend error codes this catalog carries.
|
|
3
|
+
*
|
|
4
|
+
* PARTIAL, and deliberately typed to say so: 21 key(s) owned by
|
|
5
|
+
* stapel_attributes, stapel_listings are absent, because that owner ships no locale catalog
|
|
6
|
+
* (ERRORS_LOCALE_EXEMPT_OWNERS). English for them still comes from the registry
|
|
7
|
+
* artifact via the en bundle; the pair layers its own authored `es`
|
|
8
|
+
* strings over this one until upstream ships translations. `Partial` is what
|
|
9
|
+
* makes the gap visible to TypeScript instead of a silent English fallback.
|
|
10
|
+
*
|
|
11
|
+
* Import from the pair's `./i18n/es` subpath, NOT the main entry, so
|
|
12
|
+
* the locale stays out of hosts that don't ship it.
|
|
13
|
+
*/
|
|
14
|
+
export const listingsErrorBundleEs = {
|
|
15
|
+
"error.400.bad_request": "Solicitud incorrecta",
|
|
16
|
+
"error.400.captcha_invalid": "La verificación del captcha ha fallado. Inténtalo de nuevo.",
|
|
17
|
+
"error.400.captcha_required": "Se requiere el token del captcha.",
|
|
18
|
+
"error.400.expected_list": "Se esperaba una lista de elementos",
|
|
19
|
+
"error.400.field.blank": "{field} no puede estar vacío",
|
|
20
|
+
"error.400.field.does_not_exist": "{field} no existe",
|
|
21
|
+
"error.400.field.invalid": "{field} no es válido",
|
|
22
|
+
"error.400.field.invalid_choice": "{field} no es una opción válida",
|
|
23
|
+
"error.400.field.max_length": "{field} debe tener como máximo {max_length} caracteres",
|
|
24
|
+
"error.400.field.max_value": "{field} debe ser como máximo {max_value}",
|
|
25
|
+
"error.400.field.min_length": "{field} debe tener al menos {min_length} caracteres",
|
|
26
|
+
"error.400.field.min_value": "{field} debe ser como mínimo {min_value}",
|
|
27
|
+
"error.400.field.null": "{field} no puede ser nulo",
|
|
28
|
+
"error.400.field.required": "{field} es obligatorio",
|
|
29
|
+
"error.400.field.unique": "{field} debe ser único",
|
|
30
|
+
"error.400.invalid_ad_id": "ID de anuncio no válido",
|
|
31
|
+
"error.400.validation_error": "Error de validación",
|
|
32
|
+
"error.400.verification_failed": "La verificación ha fallado",
|
|
33
|
+
"error.400.verification_invalid_factor": "Este factor de verificación no está disponible",
|
|
34
|
+
"error.401.unauthorized": "Se requiere autenticación",
|
|
35
|
+
"error.402.payment_required": "Se requiere pago",
|
|
36
|
+
"error.403.forbidden": "No tienes permiso para realizar esta acción",
|
|
37
|
+
"error.403.network_blocked": "No se permiten solicitudes desde esta red.",
|
|
38
|
+
"error.403.verification_enrollment_required": "Es necesario registrar un factor de verificación.",
|
|
39
|
+
"error.403.verification_required": "Se requiere verificación adicional",
|
|
40
|
+
"error.404.ad_not_found": "Anuncio no encontrado",
|
|
41
|
+
"error.404.not_found": "Recurso solicitado no encontrado",
|
|
42
|
+
"error.404.verification_challenge_not_found": "Desafío de verificación no encontrado o caducado",
|
|
43
|
+
"error.405.method_not_allowed": "Método no permitido",
|
|
44
|
+
"error.406.not_acceptable": "No aceptable",
|
|
45
|
+
"error.408.request_timeout": "Tiempo de espera de la solicitud agotado",
|
|
46
|
+
"error.409.conflict": "El recurso ya existe",
|
|
47
|
+
"error.410.gone": "El recurso se ha eliminado permanentemente",
|
|
48
|
+
"error.413.payload_too_large": "El cuerpo de la solicitud es demasiado grande",
|
|
49
|
+
"error.415.unsupported_media_type": "Tipo de contenido no compatible",
|
|
50
|
+
"error.422.unprocessable_entity": "Entidad no procesable",
|
|
51
|
+
"error.423.locked": "El recurso está bloqueado",
|
|
52
|
+
"error.423.verification_locked": "Demasiados intentos fallidos — verificación bloqueada",
|
|
53
|
+
"error.429.rate_limit": "Demasiados intentos. Inténtalo de nuevo en {retry_after_minutes} minutos.",
|
|
54
|
+
"error.429.too_many_requests": "Demasiadas solicitudes. Inténtalo de nuevo más tarde.",
|
|
55
|
+
"error.500.internal": "Algo salió mal",
|
|
56
|
+
"error.503.mandate_unavailable": "No se puede verificar el mandato del espacio de trabajo",
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=errors.es.gen.js.map
|
|
@@ -0,0 +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"}
|