diff --git a/live.gen.ts b/live.gen.ts index bb518a11..114de527 100644 --- a/live.gen.ts +++ b/live.gen.ts @@ -36,19 +36,21 @@ import * as $$1 from "./accounts/yourViews.ts"; import * as $$2 from "./accounts/vtex.ts"; import * as $$3 from "./accounts/shopify.ts"; import * as $$4 from "./accounts/occ.ts"; -import * as $$$0 from "./loaders/vtex/legacy/productList.ts"; -import * as $$$1 from "./loaders/vtex/legacy/productDetailsPage.ts"; -import * as $$$2 from "./loaders/vtex/legacy/productListingPage.ts"; -import * as $$$3 from "./loaders/vtex/legacy/relatedProductsLoader.ts"; -import * as $$$4 from "./loaders/vtex/wishlist.ts"; -import * as $$$5 from "./loaders/vtex/navbar.ts"; -import * as $$$6 from "./loaders/vtex/proxy.ts"; -import * as $$$7 from "./loaders/vtex/intelligentSearch/productList.ts"; -import * as $$$8 from "./loaders/vtex/intelligentSearch/productDetailsPage.ts"; -import * as $$$9 from "./loaders/vtex/intelligentSearch/productListingPage.ts"; -import * as $$$10 from "./loaders/vtex/intelligentSearch/suggestions.ts"; -import * as $$$11 from "./loaders/vtex/cart.ts"; -import * as $$$12 from "./loaders/vtex/user.ts"; +import * as $$$0 from "./loaders/messages.ts"; +import * as $$$1 from "./loaders/vtex/legacy/productList.ts"; +import * as $$$2 from "./loaders/vtex/legacy/productDetailsPage.ts"; +import * as $$$3 from "./loaders/vtex/legacy/productListingPage.ts"; +import * as $$$4 from "./loaders/vtex/legacy/relatedProductsLoader.ts"; +import * as $$$5 from "./loaders/vtex/wishlist.ts"; +import * as $$$6 from "./loaders/vtex/navbar.ts"; +import * as $$$7 from "./loaders/vtex/proxy.ts"; +import * as $$$8 from "./loaders/vtex/intelligentSearch/productList.ts"; +import * as $$$9 from "./loaders/vtex/intelligentSearch/productDetailsPage.ts"; +import * as $$$10 from "./loaders/vtex/intelligentSearch/productListingPage.ts"; +import * as $$$11 from "./loaders/vtex/intelligentSearch/suggestions.ts"; +import * as $$$12 from "./loaders/vtex/cart.ts"; +import * as $$$13 from "./loaders/vtex/user.ts"; +import * as $$$14 from "./loaders/message.ts"; import * as $$$$0 from "./routes/404.tsx"; import * as $$$$1 from "./routes/styles.css.ts"; import * as $$$$2 from "./routes/_app.tsx"; @@ -161,19 +163,22 @@ const manifest = { "$live/loaders/state.ts": i1$0, "$live/loaders/workflows/events.ts": i1$1, "$live/loaders/workflows/get.ts": i1$2, - "deco-sites/std/loaders/vtex/cart.ts": $$$11, - "deco-sites/std/loaders/vtex/intelligentSearch/productDetailsPage.ts": $$$8, - "deco-sites/std/loaders/vtex/intelligentSearch/productList.ts": $$$7, - "deco-sites/std/loaders/vtex/intelligentSearch/productListingPage.ts": $$$9, - "deco-sites/std/loaders/vtex/intelligentSearch/suggestions.ts": $$$10, - "deco-sites/std/loaders/vtex/legacy/productDetailsPage.ts": $$$1, - "deco-sites/std/loaders/vtex/legacy/productList.ts": $$$0, - "deco-sites/std/loaders/vtex/legacy/productListingPage.ts": $$$2, - "deco-sites/std/loaders/vtex/legacy/relatedProductsLoader.ts": $$$3, - "deco-sites/std/loaders/vtex/navbar.ts": $$$5, - "deco-sites/std/loaders/vtex/proxy.ts": $$$6, - "deco-sites/std/loaders/vtex/user.ts": $$$12, - "deco-sites/std/loaders/vtex/wishlist.ts": $$$4, + "deco-sites/std/loaders/message.ts": $$$14, + "deco-sites/std/loaders/messages.ts": $$$0, + "deco-sites/std/loaders/vtex/cart.ts": $$$12, + "deco-sites/std/loaders/vtex/intelligentSearch/productDetailsPage.ts": $$$9, + "deco-sites/std/loaders/vtex/intelligentSearch/productList.ts": $$$8, + "deco-sites/std/loaders/vtex/intelligentSearch/productListingPage.ts": + $$$10, + "deco-sites/std/loaders/vtex/intelligentSearch/suggestions.ts": $$$11, + "deco-sites/std/loaders/vtex/legacy/productDetailsPage.ts": $$$2, + "deco-sites/std/loaders/vtex/legacy/productList.ts": $$$1, + "deco-sites/std/loaders/vtex/legacy/productListingPage.ts": $$$3, + "deco-sites/std/loaders/vtex/legacy/relatedProductsLoader.ts": $$$4, + "deco-sites/std/loaders/vtex/navbar.ts": $$$6, + "deco-sites/std/loaders/vtex/proxy.ts": $$$7, + "deco-sites/std/loaders/vtex/user.ts": $$$13, + "deco-sites/std/loaders/vtex/wishlist.ts": $$$5, }, "routes": { "./routes/_app.tsx": $$$$2, diff --git a/loaders/message.ts b/loaders/message.ts new file mode 100644 index 00000000..0e4654ee --- /dev/null +++ b/loaders/message.ts @@ -0,0 +1,25 @@ +import { + Language, + MessageKey, + Messages, + MessageText, +} from "deco-sites/std/loaders/messages.ts"; +import { Context } from "deco-sites/std/packs/vtex/accounts/vtex.ts"; + +export interface Props { + messages: Messages; + lang?: Language; + key: MessageKey; +} + +/** + * @title Get a message from messages + */ +export default function GetMessage( + props: Props, + _req: Request, + ctx: Context, +): MessageText { + const culture = ctx.configVTEX?.defaultLocale ?? "default"; + return props?.messages?.[props.key]?.[culture]; +} diff --git a/loaders/messages.ts b/loaders/messages.ts new file mode 100644 index 00000000..6cf2519b --- /dev/null +++ b/loaders/messages.ts @@ -0,0 +1,65 @@ +export interface i18nMessage { + /** + * @title Language + * @description The target user language + * @default en-US + */ + lang: Language; + /** + * @title Text + */ + text: MessageText; +} +/** + * @title Message key + */ +export type MessageKey = string; +/** + * @title Language + */ +export type Language = string; + +/** + * @title Message text + */ +export type MessageText = string; +export interface Message { + /** + * @title Message key + */ + key: MessageKey; + /** + * @title Messages + * @description Internationalization messages + */ + i18n: i18nMessage[]; + /** + * @title Default Message + */ + defaultText: MessageText; +} + +export interface Props { + messages: Message[]; +} + +export type Messages = Record< + MessageKey, + Record +>; + +/** + * @title Internationalization + * @description Used to display messages in different languages. + */ +export default function Messages(props: Props): Messages { + const msgs: Messages = {}; + for (const message of props?.messages ?? []) { + msgs[message.key] = { default: message.defaultText }; + for (const { lang, text } of (message.i18n ?? [])) { + msgs[message.key][lang] = text; + } + } + + return msgs; +} diff --git a/schemas.gen.json b/schemas.gen.json index e432a6e9..df5cbf9c 100644 --- a/schemas.gen.json +++ b/schemas.gen.json @@ -47,6 +47,8 @@ "$live/loaders/state.ts", "$live/loaders/workflows/events.ts", "$live/loaders/workflows/get.ts", + "deco-sites/std/loaders/message.ts", + "deco-sites/std/loaders/messages.ts", "deco-sites/std/loaders/vtex/cart.ts", "deco-sites/std/loaders/vtex/intelligentSearch/productDetailsPage.ts", "deco-sites/std/loaders/vtex/intelligentSearch/productList.ts", @@ -3695,6 +3697,178 @@ ], "title": "deco-cx/live/loaders/workflows/get.ts@Props" }, + "ZGVjby1zaXRlcy9zdGQvbG9hZGVycy9tZXNzYWdlcy50cw==@MessageText": { + "anyOf": [ + { + "$ref": "#/definitions/Resolvable" + }, + { + "type": "string", + "title": "Message text" + }, + { + "title": "Get a message from messages", + "type": "object", + "allOf": [ + { + "$ref": "#/definitions/ZGVjby1zaXRlcy9zdGQvbG9hZGVycy9tZXNzYWdlLnRz@Props" + } + ], + "required": [ + "__resolveType" + ], + "properties": { + "__resolveType": { + "type": "string", + "enum": [ + "deco-sites/std/loaders/message.ts" + ], + "default": "deco-sites/std/loaders/message.ts" + } + } + } + ] + }, + "ZGVjby1zaXRlcy9zdGQvbG9hZGVycy9tZXNzYWdlcy50cw==@MessageText@record": { + "title": "Unknown record", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/ZGVjby1zaXRlcy9zdGQvbG9hZGVycy9tZXNzYWdlcy50cw==@MessageText" + } + }, + "ZGVjby1zaXRlcy9zdGQvbG9hZGVycy9tZXNzYWdlcy50cw==@MessageText@record@record": { + "anyOf": [ + { + "$ref": "#/definitions/Resolvable" + }, + { + "title": "Unknown record", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/ZGVjby1zaXRlcy9zdGQvbG9hZGVycy9tZXNzYWdlcy50cw==@MessageText@record" + } + }, + { + "title": "Internationalization", + "description": "Used to display messages in different languages.", + "type": "object", + "allOf": [ + { + "$ref": "#/definitions/ZGVjby1zaXRlcy9zdGQvbG9hZGVycy9tZXNzYWdlcy50cw==@Props" + } + ], + "required": [ + "__resolveType" + ], + "properties": { + "__resolveType": { + "type": "string", + "enum": [ + "deco-sites/std/loaders/messages.ts" + ], + "default": "deco-sites/std/loaders/messages.ts" + } + } + } + ] + }, + "ZGVjby1zaXRlcy9zdGQvbG9hZGVycy9tZXNzYWdlcy50cw==@MessageKey": { + "type": "string", + "title": "Message key" + }, + "ZGVjby1zaXRlcy9zdGQvbG9hZGVycy9tZXNzYWdlLnRz@Props": { + "type": "object", + "properties": { + "messages": { + "$ref": "#/definitions/ZGVjby1zaXRlcy9zdGQvbG9hZGVycy9tZXNzYWdlcy50cw==@MessageText@record@record", + "title": "Messages" + }, + "key": { + "$ref": "#/definitions/ZGVjby1zaXRlcy9zdGQvbG9hZGVycy9tZXNzYWdlcy50cw==@MessageKey", + "title": "Key" + } + }, + "required": [ + "messages", + "key" + ], + "title": "deco-sites/std/loaders/message.ts@Props" + }, + "ZGVjby1zaXRlcy9zdGQvbG9hZGVycy9tZXNzYWdlcy50cw==@Language": { + "type": "string", + "title": "Language" + }, + "ZGVjby1zaXRlcy9zdGQvbG9hZGVycy9tZXNzYWdlcy50cw==@i18nMessage": { + "type": "object", + "properties": { + "lang": { + "$ref": "#/definitions/ZGVjby1zaXRlcy9zdGQvbG9hZGVycy9tZXNzYWdlcy50cw==@Language", + "title": "Language", + "description": "The target user language", + "default": "en-US" + }, + "text": { + "$ref": "#/definitions/ZGVjby1zaXRlcy9zdGQvbG9hZGVycy9tZXNzYWdlcy50cw==@MessageText", + "title": "Text" + } + }, + "required": [ + "lang", + "text" + ], + "title": "i18nMessage" + }, + "ZGVjby1zaXRlcy9zdGQvbG9hZGVycy9tZXNzYWdlcy50cw==@i18nMessage[]": { + "type": "array", + "items": { + "$ref": "#/definitions/ZGVjby1zaXRlcy9zdGQvbG9hZGVycy9tZXNzYWdlcy50cw==@i18nMessage" + }, + "title": "i18nMessage[]" + }, + "ZGVjby1zaXRlcy9zdGQvbG9hZGVycy9tZXNzYWdlcy50cw==@Message": { + "type": "object", + "properties": { + "key": { + "$ref": "#/definitions/ZGVjby1zaXRlcy9zdGQvbG9hZGVycy9tZXNzYWdlcy50cw==@MessageKey", + "title": "Message key" + }, + "i18n": { + "$ref": "#/definitions/ZGVjby1zaXRlcy9zdGQvbG9hZGVycy9tZXNzYWdlcy50cw==@i18nMessage[]", + "title": "Messages", + "description": "Internationalization messages" + }, + "defaultText": { + "$ref": "#/definitions/ZGVjby1zaXRlcy9zdGQvbG9hZGVycy9tZXNzYWdlcy50cw==@MessageText", + "title": "Default Message" + } + }, + "required": [ + "key", + "i18n", + "defaultText" + ], + "title": "Message" + }, + "ZGVjby1zaXRlcy9zdGQvbG9hZGVycy9tZXNzYWdlcy50cw==@Message[]": { + "type": "array", + "items": { + "$ref": "#/definitions/ZGVjby1zaXRlcy9zdGQvbG9hZGVycy9tZXNzYWdlcy50cw==@Message" + }, + "title": "Message[]" + }, + "ZGVjby1zaXRlcy9zdGQvbG9hZGVycy9tZXNzYWdlcy50cw==@Props": { + "type": "object", + "properties": { + "messages": { + "$ref": "#/definitions/ZGVjby1zaXRlcy9zdGQvbG9hZGVycy9tZXNzYWdlcy50cw==@Message[]", + "title": "Messages" + } + }, + "required": [ + "messages" + ], + "title": "deco-sites/std/loaders/messages.ts@Props" + }, "ZGVjby1zaXRlcy9zdGQvcGFja3MvdnRleC90eXBlcy50cw==@Fields": { "type": "object", "properties": { @@ -8933,6 +9107,49 @@ } } }, + "ZGVjby1zaXRlcy9zdGQvbG9hZGVycy9tZXNzYWdlLnRz": { + "title": "Get a message from messages", + "type": "object", + "allOf": [ + { + "$ref": "#/definitions/ZGVjby1zaXRlcy9zdGQvbG9hZGVycy9tZXNzYWdlLnRz@Props" + } + ], + "required": [ + "__resolveType" + ], + "properties": { + "__resolveType": { + "type": "string", + "enum": [ + "deco-sites/std/loaders/message.ts" + ], + "default": "deco-sites/std/loaders/message.ts" + } + } + }, + "ZGVjby1zaXRlcy9zdGQvbG9hZGVycy9tZXNzYWdlcy50cw==": { + "title": "Internationalization", + "description": "Used to display messages in different languages.", + "type": "object", + "allOf": [ + { + "$ref": "#/definitions/ZGVjby1zaXRlcy9zdGQvbG9hZGVycy9tZXNzYWdlcy50cw==@Props" + } + ], + "required": [ + "__resolveType" + ], + "properties": { + "__resolveType": { + "type": "string", + "enum": [ + "deco-sites/std/loaders/messages.ts" + ], + "default": "deco-sites/std/loaders/messages.ts" + } + } + }, "ZGVjby1zaXRlcy9zdGQvbG9hZGVycy92dGV4L2NhcnQudHM=": { "title": "deco-sites/std/loaders/vtex/cart.ts", "docs": "https://developers.vtex.com/docs/api-reference/checkout-api#get-/api/checkout/pub/orderForm", @@ -10448,6 +10665,12 @@ { "$ref": "#/definitions/JGxpdmUvbG9hZGVycy93b3JrZmxvd3MvZ2V0LnRz" }, + { + "$ref": "#/definitions/ZGVjby1zaXRlcy9zdGQvbG9hZGVycy9tZXNzYWdlLnRz" + }, + { + "$ref": "#/definitions/ZGVjby1zaXRlcy9zdGQvbG9hZGVycy9tZXNzYWdlcy50cw==" + }, { "$ref": "#/definitions/ZGVjby1zaXRlcy9zdGQvbG9hZGVycy92dGV4L2NhcnQudHM=" },