@workos-inc/widgets 1.7.1 → 1.8.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 +9 -0
- package/dist/cjs/api/endpoint.cjs +1 -0
- package/dist/cjs/api/endpoint.cjs.map +1 -1
- package/dist/cjs/api/endpoint.d.cts +1 -0
- package/dist/cjs/index.cjs +5 -2
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +1 -0
- package/dist/cjs/lib/add-mfa-dialog.cjs +133 -61
- package/dist/cjs/lib/add-mfa-dialog.cjs.map +1 -1
- package/dist/cjs/lib/admin-portal-domain-verification.cjs +41 -5
- package/dist/cjs/lib/admin-portal-domain-verification.cjs.map +1 -1
- package/dist/cjs/lib/admin-portal-sso-connection.cjs +121 -44
- package/dist/cjs/lib/admin-portal-sso-connection.cjs.map +1 -1
- package/dist/cjs/lib/api-keys/api-key-details-card.cjs +25 -3
- package/dist/cjs/lib/api-keys/api-key-details-card.cjs.map +1 -1
- package/dist/cjs/lib/api-keys/api-key-details-dialog.cjs +25 -3
- package/dist/cjs/lib/api-keys/api-key-details-dialog.cjs.map +1 -1
- package/dist/cjs/lib/api-keys/api-keys-search.cjs +13 -4
- package/dist/cjs/lib/api-keys/api-keys-search.cjs.map +1 -1
- package/dist/cjs/lib/api-keys/api-keys-table.cjs +94 -12
- package/dist/cjs/lib/api-keys/api-keys-table.cjs.map +1 -1
- package/dist/cjs/lib/api-keys/api-keys.cjs +16 -2
- package/dist/cjs/lib/api-keys/api-keys.cjs.map +1 -1
- package/dist/cjs/lib/api-keys/create-api-key.cjs +172 -20
- package/dist/cjs/lib/api-keys/create-api-key.cjs.map +1 -1
- package/dist/cjs/lib/api-keys/relative-time.cjs +12 -2
- package/dist/cjs/lib/api-keys/relative-time.cjs.map +1 -1
- package/dist/cjs/lib/api-keys/revoke-api-key-dialog.cjs +49 -7
- package/dist/cjs/lib/api-keys/revoke-api-key-dialog.cjs.map +1 -1
- package/dist/cjs/lib/change-password-dialog.cjs +122 -16
- package/dist/cjs/lib/change-password-dialog.cjs.map +1 -1
- package/dist/cjs/lib/copy-button.cjs +14 -2
- package/dist/cjs/lib/copy-button.cjs.map +1 -1
- package/dist/cjs/lib/copy-button.d.cts +2 -1
- package/dist/cjs/lib/delete-domain-dialog.cjs +52 -19
- package/dist/cjs/lib/delete-domain-dialog.cjs.map +1 -1
- package/dist/cjs/lib/delete-user-dialog.cjs +46 -11
- package/dist/cjs/lib/delete-user-dialog.cjs.map +1 -1
- package/dist/cjs/lib/delete-user-dialog.d.cts +2 -2
- package/dist/cjs/lib/domain-actions.cjs +51 -7
- package/dist/cjs/lib/domain-actions.cjs.map +1 -1
- package/dist/cjs/lib/domain-item.cjs +42 -8
- package/dist/cjs/lib/domain-item.cjs.map +1 -1
- package/dist/cjs/lib/edit-user-profile-dialog.cjs +62 -11
- package/dist/cjs/lib/edit-user-profile-dialog.cjs.map +1 -1
- package/dist/cjs/lib/edit-user-role-dialog.cjs +90 -17
- package/dist/cjs/lib/edit-user-role-dialog.cjs.map +1 -1
- package/dist/cjs/lib/elements.cjs +14 -3
- package/dist/cjs/lib/elements.cjs.map +1 -1
- package/dist/cjs/lib/elements.d.cts +5 -2
- package/dist/cjs/lib/elevated-access.cjs +78 -18
- package/dist/cjs/lib/elevated-access.cjs.map +1 -1
- package/dist/cjs/lib/generic-error.cjs +53 -11
- package/dist/cjs/lib/generic-error.cjs.map +1 -1
- package/dist/cjs/lib/generic-error.d.cts +5 -1
- package/dist/cjs/lib/i18n/intl-context.cjs +47 -0
- package/dist/cjs/lib/i18n/intl-context.cjs.map +1 -0
- package/dist/cjs/lib/i18n/intl-context.d.cts +29 -0
- package/dist/cjs/lib/i18n/translation.cjs +67 -0
- package/dist/cjs/lib/i18n/translation.cjs.map +1 -0
- package/dist/cjs/lib/i18n/translation.d.cts +16 -0
- package/dist/cjs/lib/i18n/use-locale.cjs +33 -0
- package/dist/cjs/lib/i18n/use-locale.cjs.map +1 -0
- package/dist/cjs/lib/i18n/use-locale.d.cts +7 -0
- package/dist/cjs/lib/i18n/use-translation.cjs +47 -0
- package/dist/cjs/lib/i18n/use-translation.cjs.map +1 -0
- package/dist/cjs/lib/i18n/use-translation.d.cts +15 -0
- package/dist/cjs/lib/identity-providers.d.cts +1 -1
- package/dist/cjs/lib/invite-user-dialog.cjs +69 -14
- package/dist/cjs/lib/invite-user-dialog.cjs.map +1 -1
- package/dist/cjs/lib/logout-all-sessions-dialog.cjs +33 -4
- package/dist/cjs/lib/logout-all-sessions-dialog.cjs.map +1 -1
- package/dist/cjs/lib/logout-dialog.cjs +34 -10
- package/dist/cjs/lib/logout-dialog.cjs.map +1 -1
- package/dist/cjs/lib/organization-switcher.cjs +12 -2
- package/dist/cjs/lib/organization-switcher.cjs.map +1 -1
- package/dist/cjs/lib/pipes.cjs +175 -36
- package/dist/cjs/lib/pipes.cjs.map +1 -1
- package/dist/cjs/lib/resend-invite-dialog.cjs +67 -17
- package/dist/cjs/lib/resend-invite-dialog.cjs.map +1 -1
- package/dist/cjs/lib/reset-mfa-dialog.cjs +50 -7
- package/dist/cjs/lib/reset-mfa-dialog.cjs.map +1 -1
- package/dist/cjs/lib/revoke-invite-dialog.cjs +42 -10
- package/dist/cjs/lib/revoke-invite-dialog.cjs.map +1 -1
- package/dist/cjs/lib/save-button.cjs +9 -1
- package/dist/cjs/lib/save-button.cjs.map +1 -1
- package/dist/cjs/lib/set-password-dialog.cjs +101 -13
- package/dist/cjs/lib/set-password-dialog.cjs.map +1 -1
- package/dist/cjs/lib/user-actions-dropdown.cjs +54 -6
- package/dist/cjs/lib/user-actions-dropdown.cjs.map +1 -1
- package/dist/cjs/lib/user-profile.cjs +81 -10
- package/dist/cjs/lib/user-profile.cjs.map +1 -1
- package/dist/cjs/lib/user-security.cjs +127 -25
- package/dist/cjs/lib/user-security.cjs.map +1 -1
- package/dist/cjs/lib/user-sessions.cjs +74 -15
- package/dist/cjs/lib/user-sessions.cjs.map +1 -1
- package/dist/cjs/lib/users-management.cjs +265 -49
- package/dist/cjs/lib/users-management.cjs.map +1 -1
- package/dist/cjs/lib/users-search.cjs +18 -4
- package/dist/cjs/lib/users-search.cjs.map +1 -1
- package/dist/cjs/lib/utils.cjs +10 -7
- package/dist/cjs/lib/utils.cjs.map +1 -1
- package/dist/cjs/lib/utils.d.cts +2 -1
- package/dist/cjs/lib/view-dns-record-dialog.cjs +89 -18
- package/dist/cjs/lib/view-dns-record-dialog.cjs.map +1 -1
- package/dist/cjs/workos-widgets.client.cjs +2 -2
- package/dist/cjs/workos-widgets.client.cjs.map +1 -1
- package/dist/css/lib/provider-icon.css +93 -3
- package/dist/esm/api/endpoint.d.ts +1 -0
- package/dist/esm/api/endpoint.js +1 -0
- package/dist/esm/api/endpoint.js.map +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +3 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/add-mfa-dialog.js +133 -61
- package/dist/esm/lib/add-mfa-dialog.js.map +1 -1
- package/dist/esm/lib/admin-portal-domain-verification.js +41 -5
- package/dist/esm/lib/admin-portal-domain-verification.js.map +1 -1
- package/dist/esm/lib/admin-portal-sso-connection.js +121 -44
- package/dist/esm/lib/admin-portal-sso-connection.js.map +1 -1
- package/dist/esm/lib/api-keys/api-key-details-card.js +25 -3
- package/dist/esm/lib/api-keys/api-key-details-card.js.map +1 -1
- package/dist/esm/lib/api-keys/api-key-details-dialog.js +25 -3
- package/dist/esm/lib/api-keys/api-key-details-dialog.js.map +1 -1
- package/dist/esm/lib/api-keys/api-keys-search.js +13 -4
- package/dist/esm/lib/api-keys/api-keys-search.js.map +1 -1
- package/dist/esm/lib/api-keys/api-keys-table.js +94 -12
- package/dist/esm/lib/api-keys/api-keys-table.js.map +1 -1
- package/dist/esm/lib/api-keys/api-keys.js +16 -2
- package/dist/esm/lib/api-keys/api-keys.js.map +1 -1
- package/dist/esm/lib/api-keys/create-api-key.js +172 -20
- package/dist/esm/lib/api-keys/create-api-key.js.map +1 -1
- package/dist/esm/lib/api-keys/relative-time.js +12 -2
- package/dist/esm/lib/api-keys/relative-time.js.map +1 -1
- package/dist/esm/lib/api-keys/revoke-api-key-dialog.js +49 -7
- package/dist/esm/lib/api-keys/revoke-api-key-dialog.js.map +1 -1
- package/dist/esm/lib/change-password-dialog.js +122 -16
- package/dist/esm/lib/change-password-dialog.js.map +1 -1
- package/dist/esm/lib/copy-button.d.ts +2 -1
- package/dist/esm/lib/copy-button.js +14 -2
- package/dist/esm/lib/copy-button.js.map +1 -1
- package/dist/esm/lib/delete-domain-dialog.js +52 -19
- package/dist/esm/lib/delete-domain-dialog.js.map +1 -1
- package/dist/esm/lib/delete-user-dialog.d.ts +2 -2
- package/dist/esm/lib/delete-user-dialog.js +36 -11
- package/dist/esm/lib/delete-user-dialog.js.map +1 -1
- package/dist/esm/lib/domain-actions.js +41 -7
- package/dist/esm/lib/domain-actions.js.map +1 -1
- package/dist/esm/lib/domain-item.js +42 -8
- package/dist/esm/lib/domain-item.js.map +1 -1
- package/dist/esm/lib/edit-user-profile-dialog.js +62 -11
- package/dist/esm/lib/edit-user-profile-dialog.js.map +1 -1
- package/dist/esm/lib/edit-user-role-dialog.js +90 -17
- package/dist/esm/lib/edit-user-role-dialog.js.map +1 -1
- package/dist/esm/lib/elements.d.ts +5 -2
- package/dist/esm/lib/elements.js +14 -3
- package/dist/esm/lib/elements.js.map +1 -1
- package/dist/esm/lib/elevated-access.js +78 -18
- package/dist/esm/lib/elevated-access.js.map +1 -1
- package/dist/esm/lib/generic-error.d.ts +5 -1
- package/dist/esm/lib/generic-error.js +53 -11
- package/dist/esm/lib/generic-error.js.map +1 -1
- package/dist/esm/lib/i18n/intl-context.d.ts +29 -0
- package/dist/esm/lib/i18n/intl-context.js +12 -0
- package/dist/esm/lib/i18n/intl-context.js.map +1 -0
- package/dist/esm/lib/i18n/translation.d.ts +16 -0
- package/dist/esm/lib/i18n/translation.js +45 -0
- package/dist/esm/lib/i18n/translation.js.map +1 -0
- package/dist/esm/lib/i18n/use-locale.d.ts +7 -0
- package/dist/esm/lib/i18n/use-locale.js +9 -0
- package/dist/esm/lib/i18n/use-locale.js.map +1 -0
- package/dist/esm/lib/i18n/use-translation.d.ts +15 -0
- package/dist/esm/lib/i18n/use-translation.js +23 -0
- package/dist/esm/lib/i18n/use-translation.js.map +1 -0
- package/dist/esm/lib/identity-providers.d.ts +1 -1
- package/dist/esm/lib/invite-user-dialog.js +70 -15
- package/dist/esm/lib/invite-user-dialog.js.map +1 -1
- package/dist/esm/lib/logout-all-sessions-dialog.js +33 -4
- package/dist/esm/lib/logout-all-sessions-dialog.js.map +1 -1
- package/dist/esm/lib/logout-dialog.js +34 -10
- package/dist/esm/lib/logout-dialog.js.map +1 -1
- package/dist/esm/lib/organization-switcher.js +12 -2
- package/dist/esm/lib/organization-switcher.js.map +1 -1
- package/dist/esm/lib/pipes.js +175 -36
- package/dist/esm/lib/pipes.js.map +1 -1
- package/dist/esm/lib/resend-invite-dialog.js +67 -17
- package/dist/esm/lib/resend-invite-dialog.js.map +1 -1
- package/dist/esm/lib/reset-mfa-dialog.js +50 -7
- package/dist/esm/lib/reset-mfa-dialog.js.map +1 -1
- package/dist/esm/lib/revoke-invite-dialog.js +42 -10
- package/dist/esm/lib/revoke-invite-dialog.js.map +1 -1
- package/dist/esm/lib/save-button.js +9 -1
- package/dist/esm/lib/save-button.js.map +1 -1
- package/dist/esm/lib/set-password-dialog.js +101 -13
- package/dist/esm/lib/set-password-dialog.js.map +1 -1
- package/dist/esm/lib/user-actions-dropdown.js +54 -6
- package/dist/esm/lib/user-actions-dropdown.js.map +1 -1
- package/dist/esm/lib/user-profile.js +81 -10
- package/dist/esm/lib/user-profile.js.map +1 -1
- package/dist/esm/lib/user-security.js +127 -25
- package/dist/esm/lib/user-security.js.map +1 -1
- package/dist/esm/lib/user-sessions.js +74 -15
- package/dist/esm/lib/user-sessions.js.map +1 -1
- package/dist/esm/lib/users-management.js +266 -51
- package/dist/esm/lib/users-management.js.map +1 -1
- package/dist/esm/lib/users-search.js +18 -4
- package/dist/esm/lib/users-search.js.map +1 -1
- package/dist/esm/lib/utils.d.ts +2 -1
- package/dist/esm/lib/utils.js +10 -7
- package/dist/esm/lib/utils.js.map +1 -1
- package/dist/esm/lib/view-dns-record-dialog.js +89 -18
- package/dist/esm/lib/view-dns-record-dialog.js.map +1 -1
- package/dist/esm/workos-widgets.client.js +2 -2
- package/dist/esm/workos-widgets.client.js.map +1 -1
- package/package.json +13 -4
|
@@ -39,6 +39,7 @@ var import_api_provider = require("../api/api-provider.js");
|
|
|
39
39
|
var import_react = require("react");
|
|
40
40
|
var import_elements = require("./elements.js");
|
|
41
41
|
var Otp = __toESM(require("./otp-input.js"), 1);
|
|
42
|
+
var import_translation = require("./i18n/translation.js");
|
|
42
43
|
function ElevatedAccess({
|
|
43
44
|
type = "dialog",
|
|
44
45
|
children,
|
|
@@ -98,13 +99,32 @@ function SendVerificationEmailForm({
|
|
|
98
99
|
sendVerification.mutate();
|
|
99
100
|
};
|
|
100
101
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("form", { onSubmit: handleSubmit, children: [
|
|
101
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Title, { children: hasTokenExpired ?
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
102
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Title, { children: hasTokenExpired ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
103
|
+
import_translation.Translation,
|
|
104
|
+
{
|
|
105
|
+
defaultMessage: "Your verification token has expired",
|
|
106
|
+
id: "lb/AsC",
|
|
107
|
+
description: "Dialog title when verification token has expired"
|
|
108
|
+
}
|
|
109
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
110
|
+
import_translation.Translation,
|
|
111
|
+
{
|
|
112
|
+
defaultMessage: "Verify your identity",
|
|
113
|
+
id: "7tGCOh",
|
|
114
|
+
description: "Dialog title for identity verification"
|
|
115
|
+
}
|
|
116
|
+
) }),
|
|
117
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Description, { color: "gray", mb: "5", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
118
|
+
import_translation.Translation,
|
|
119
|
+
{
|
|
120
|
+
defaultMessage: "To continue, we need to confirm your identity. We'll send a temporary verification code to {email}.",
|
|
121
|
+
id: "FTUSRM",
|
|
122
|
+
description: "Description explaining verification code will be sent",
|
|
123
|
+
values: {
|
|
124
|
+
email: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { weight: "bold", highContrast: true, children: me?.email })
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
) }),
|
|
108
128
|
sendVerification.error && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Callout.Root, { color: "red", mt: "-2", mb: "0", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Callout.Text, { children: getMutationErrorMessage(sendVerification.error) }) }),
|
|
109
129
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { justify: "end", align: "center", gap: "3", mt: "5", children: [
|
|
110
130
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Close, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
@@ -113,10 +133,24 @@ function SendVerificationEmailForm({
|
|
|
113
133
|
variant: "secondary",
|
|
114
134
|
type: "button",
|
|
115
135
|
disabled: sendVerification.isPending,
|
|
116
|
-
children:
|
|
136
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
137
|
+
import_translation.Translation,
|
|
138
|
+
{
|
|
139
|
+
defaultMessage: "Cancel",
|
|
140
|
+
id: "hHNj31",
|
|
141
|
+
description: "Cancel button text"
|
|
142
|
+
}
|
|
143
|
+
)
|
|
117
144
|
}
|
|
118
145
|
) }),
|
|
119
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Button, { type: "submit", loading: sendVerification.isPending, children:
|
|
146
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Button, { type: "submit", loading: sendVerification.isPending, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
147
|
+
import_translation.Translation,
|
|
148
|
+
{
|
|
149
|
+
defaultMessage: "Send verification code",
|
|
150
|
+
id: "XsTeXJ",
|
|
151
|
+
description: "Button text to send verification code"
|
|
152
|
+
}
|
|
153
|
+
) })
|
|
120
154
|
] })
|
|
121
155
|
] });
|
|
122
156
|
}
|
|
@@ -160,13 +194,25 @@ function VerificationIdentityForm({
|
|
|
160
194
|
setIsSubmitting(false);
|
|
161
195
|
};
|
|
162
196
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Form.Root, { onSubmit: handleSubmit, children: [
|
|
163
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Title, { children:
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
197
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Title, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
198
|
+
import_translation.Translation,
|
|
199
|
+
{
|
|
200
|
+
defaultMessage: "Verify your identity",
|
|
201
|
+
id: "7tGCOh",
|
|
202
|
+
description: "Dialog title for identity verification"
|
|
203
|
+
}
|
|
204
|
+
) }),
|
|
205
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Description, { color: "gray", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
206
|
+
import_translation.Translation,
|
|
207
|
+
{
|
|
208
|
+
defaultMessage: "A verification code was sent to {email}. Please enter it below.",
|
|
209
|
+
id: "kvxE0S",
|
|
210
|
+
description: "Description explaining where verification code was sent",
|
|
211
|
+
values: {
|
|
212
|
+
email: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { weight: "bold", highContrast: true, children: me?.email })
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
) }),
|
|
170
216
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { direction: "column", gap: "2", mt: "5", mx: "auto", width: "fit-content", children: [
|
|
171
217
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
172
218
|
Otp.Root,
|
|
@@ -192,8 +238,22 @@ function VerificationIdentityForm({
|
|
|
192
238
|
verifyIdentity.error && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { color: "red", size: "2", as: "p", children: getMutationErrorMessage(verifyIdentity.error) })
|
|
193
239
|
] }),
|
|
194
240
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { justify: "end", align: "center", gap: "3", mt: "5", children: [
|
|
195
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Close, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Button, { variant: "secondary", type: "button", children:
|
|
196
|
-
|
|
241
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Close, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Button, { variant: "secondary", type: "button", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
242
|
+
import_translation.Translation,
|
|
243
|
+
{
|
|
244
|
+
defaultMessage: "Cancel",
|
|
245
|
+
id: "hHNj31",
|
|
246
|
+
description: "Cancel button text"
|
|
247
|
+
}
|
|
248
|
+
) }) }),
|
|
249
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Button, { type: "submit", loading: isSubmitting, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
250
|
+
import_translation.Translation,
|
|
251
|
+
{
|
|
252
|
+
defaultMessage: "Confirm",
|
|
253
|
+
id: "EmYENK",
|
|
254
|
+
description: "Confirm button text for verification"
|
|
255
|
+
}
|
|
256
|
+
) })
|
|
197
257
|
] })
|
|
198
258
|
] });
|
|
199
259
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/elevated-access.tsx"],"sourcesContent":["import * as Form from \"@radix-ui/react-form\";\nimport { Callout, Flex, Text } from \"@radix-ui/themes\";\nimport { useMe, useSendVerification, useVerify } from \"../api/endpoint.js\";\nimport { useElevatedAccessToken } from \"../api/api-provider.js\";\nimport { PropsWithChildren, useEffect, useRef, useState } from \"react\";\nimport { AlertDialog, Dialog, Button } from \"./elements.js\";\nimport * as Otp from \"./otp-input.js\";\n\ninterface ElevatedAccessProps extends PropsWithChildren {\n onVerified?: () => Promise<unknown>;\n type?: \"dialog\" | \"alert\";\n}\n\nexport function ElevatedAccess({\n type = \"dialog\",\n children,\n onVerified,\n}: ElevatedAccessProps) {\n const { elevatedAccess } = useElevatedAccessToken();\n const [authenticationChallengeId, setAuthenticationChallengeId] =\n useState<string>();\n\n const prevAccessToken = useRef(elevatedAccess);\n\n useEffect(() => {\n prevAccessToken.current = elevatedAccess;\n }, [elevatedAccess]);\n\n if (elevatedAccess) {\n return <>{children}</>;\n }\n\n if (!authenticationChallengeId) {\n // FIXME: This should be refactored\n // eslint-disable-next-line react-hooks/refs\n const hasTokenExpired = !!prevAccessToken.current;\n\n return (\n <SendVerificationEmailForm\n type={type}\n hasTokenExpired={hasTokenExpired}\n onSuccess={(challengeId) => {\n setAuthenticationChallengeId(challengeId);\n }}\n />\n );\n }\n\n if (authenticationChallengeId) {\n return (\n <VerificationIdentityForm\n type={type}\n authenticationChallengeId={authenticationChallengeId}\n onSuccess={() => {\n // Reset the challenge id\n setAuthenticationChallengeId(undefined);\n\n return onVerified?.();\n }}\n />\n );\n }\n\n return null;\n}\n\ninterface SendVerificationEmailFormProps {\n onSuccess: (challengeId: string) => unknown | Promise<unknown>;\n type: \"dialog\" | \"alert\";\n hasTokenExpired: boolean;\n}\n\nfunction SendVerificationEmailForm({\n onSuccess,\n type,\n hasTokenExpired,\n}: SendVerificationEmailFormProps) {\n const { data: me } = useMe();\n const sendVerification = useSendVerification({\n mutation: { onSuccess: (data) => onSuccess(data.authenticationChallenge) },\n });\n\n const Title = type === \"dialog\" ? Dialog.Title : AlertDialog.Title;\n const Description =\n type === \"dialog\" ? Dialog.Description : AlertDialog.Description;\n const Close = type === \"dialog\" ? Dialog.Close : AlertDialog.Cancel;\n\n const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n sendVerification.mutate();\n };\n\n return (\n <form onSubmit={handleSubmit}>\n <Title>\n {hasTokenExpired\n ? \"Your verification token has expired\"\n : \"Verify your identity\"}\n </Title>\n\n <Description color=\"gray\" mb=\"5\">\n To continue, we need to confirm your identity. We'll send a temporary\n verification code to{\" \"}\n <Text weight=\"bold\" highContrast>\n {me?.email}\n </Text>\n .\n </Description>\n\n {sendVerification.error && (\n <Callout.Root color=\"red\" mt=\"-2\" mb=\"0\">\n <Callout.Text>\n {getMutationErrorMessage(sendVerification.error)}\n </Callout.Text>\n </Callout.Root>\n )}\n\n <Flex justify=\"end\" align=\"center\" gap=\"3\" mt=\"5\">\n <Close>\n <Button\n variant=\"secondary\"\n type=\"button\"\n disabled={sendVerification.isPending}\n >\n Cancel\n </Button>\n </Close>\n <Button type=\"submit\" loading={sendVerification.isPending}>\n Send verification code\n </Button>\n </Flex>\n </form>\n );\n}\n\ninterface VerificationIdentityFormProps {\n onSuccess?: () => unknown | Promise<unknown>;\n authenticationChallengeId: string;\n type: \"dialog\" | \"alert\";\n}\n\nfunction VerificationIdentityForm({\n onSuccess,\n authenticationChallengeId,\n type,\n}: VerificationIdentityFormProps) {\n const { data: me } = useMe();\n const { setElevatedAccess } = useElevatedAccessToken();\n const verifyIdentity = useVerify();\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const Title = type === \"dialog\" ? Dialog.Title : AlertDialog.Title;\n const Description =\n type === \"dialog\" ? Dialog.Description : AlertDialog.Description;\n const Close = type === \"dialog\" ? Dialog.Close : AlertDialog.Cancel;\n const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n const formData = new FormData(event.currentTarget);\n const code = formData.get(\"otp-code\")?.toString() ?? \"\";\n\n setIsSubmitting(true);\n\n try {\n // Mutate async so we can wait for the onSuccess callback as well\n const newAuthState = await verifyIdentity.mutateAsync({\n data: {\n code,\n authenticationChallengeId,\n },\n });\n\n const in10Seconds = new Date(Date.now() + 5 * 1000);\n\n setElevatedAccess({\n token: newAuthState.elevatedAccessToken,\n // expiresAt: newAuthState.expiresAt,\n expiresAt: in10Seconds.toISOString(),\n });\n\n if (onSuccess) {\n await new Promise((resolve) => setTimeout(resolve, 200));\n await onSuccess();\n }\n } catch (error) {\n console.error(error);\n }\n\n setIsSubmitting(false);\n };\n\n return (\n <Form.Root onSubmit={handleSubmit}>\n <Title>Verify your identity</Title>\n\n <Description color=\"gray\">\n A verification code was sent to{\" \"}\n <Text weight=\"bold\" highContrast>\n {me?.email}\n </Text>\n . Please enter it below.\n </Description>\n\n <Flex direction=\"column\" gap=\"2\" mt=\"5\" mx=\"auto\" width=\"fit-content\">\n <Otp.Root\n autoSubmit\n gap=\"2\"\n justify=\"center\"\n columns=\"repeat(6, 48px)\"\n width=\"fit-content\"\n rows=\"48px\"\n name=\"otp-code\"\n readOnly={isSubmitting}\n >\n <Otp.Input required autoFocus autoComplete=\"off\" />\n <Otp.Input required />\n <Otp.Input required />\n <Otp.Input required />\n <Otp.Input required />\n <Otp.Input required />\n </Otp.Root>\n\n {verifyIdentity.error && (\n <Text color=\"red\" size=\"2\" as=\"p\">\n {getMutationErrorMessage(verifyIdentity.error)}\n </Text>\n )}\n </Flex>\n\n <Flex justify=\"end\" align=\"center\" gap=\"3\" mt=\"5\">\n <Close>\n <Button variant=\"secondary\" type=\"button\">\n Cancel\n </Button>\n </Close>\n <Button type=\"submit\" loading={isSubmitting}>\n Confirm\n </Button>\n </Flex>\n </Form.Root>\n );\n}\n\nfunction getMutationErrorMessage(error: unknown) {\n let message = typeof error === \"string\" ? error : \"\";\n\n if (error instanceof Error) {\n message = error.message;\n } else if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof error.message === \"string\"\n ) {\n message = error.message;\n }\n\n if (!message || message === \"Bad Request\") {\n message = \"Invalid code, please try again.\";\n }\n\n return message;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/elevated-access.tsx"],"sourcesContent":["import * as Form from \"@radix-ui/react-form\";\nimport { Callout, Flex, Text } from \"@radix-ui/themes\";\nimport { useMe, useSendVerification, useVerify } from \"../api/endpoint.js\";\nimport { useElevatedAccessToken } from \"../api/api-provider.js\";\nimport { PropsWithChildren, useEffect, useRef, useState } from \"react\";\nimport { AlertDialog, Dialog, Button } from \"./elements.js\";\nimport * as Otp from \"./otp-input.js\";\nimport { Translation } from \"./i18n/translation.js\";\n\ninterface ElevatedAccessProps extends PropsWithChildren {\n onVerified?: () => Promise<unknown>;\n type?: \"dialog\" | \"alert\";\n}\n\nexport function ElevatedAccess({\n type = \"dialog\",\n children,\n onVerified,\n}: ElevatedAccessProps) {\n const { elevatedAccess } = useElevatedAccessToken();\n const [authenticationChallengeId, setAuthenticationChallengeId] =\n useState<string>();\n\n const prevAccessToken = useRef(elevatedAccess);\n\n useEffect(() => {\n prevAccessToken.current = elevatedAccess;\n }, [elevatedAccess]);\n\n if (elevatedAccess) {\n return <>{children}</>;\n }\n\n if (!authenticationChallengeId) {\n // FIXME: This should be refactored\n // eslint-disable-next-line react-hooks/refs\n const hasTokenExpired = !!prevAccessToken.current;\n\n return (\n <SendVerificationEmailForm\n type={type}\n hasTokenExpired={hasTokenExpired}\n onSuccess={(challengeId) => {\n setAuthenticationChallengeId(challengeId);\n }}\n />\n );\n }\n\n if (authenticationChallengeId) {\n return (\n <VerificationIdentityForm\n type={type}\n authenticationChallengeId={authenticationChallengeId}\n onSuccess={() => {\n // Reset the challenge id\n setAuthenticationChallengeId(undefined);\n\n return onVerified?.();\n }}\n />\n );\n }\n\n return null;\n}\n\ninterface SendVerificationEmailFormProps {\n onSuccess: (challengeId: string) => unknown | Promise<unknown>;\n type: \"dialog\" | \"alert\";\n hasTokenExpired: boolean;\n}\n\nfunction SendVerificationEmailForm({\n onSuccess,\n type,\n hasTokenExpired,\n}: SendVerificationEmailFormProps) {\n const { data: me } = useMe();\n const sendVerification = useSendVerification({\n mutation: { onSuccess: (data) => onSuccess(data.authenticationChallenge) },\n });\n\n const Title = type === \"dialog\" ? Dialog.Title : AlertDialog.Title;\n const Description =\n type === \"dialog\" ? Dialog.Description : AlertDialog.Description;\n const Close = type === \"dialog\" ? Dialog.Close : AlertDialog.Cancel;\n\n const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n sendVerification.mutate();\n };\n\n return (\n <form onSubmit={handleSubmit}>\n <Title>\n {hasTokenExpired ? (\n <Translation\n defaultMessage=\"Your verification token has expired\"\n id=\"lb/AsC\"\n description=\"Dialog title when verification token has expired\"\n />\n ) : (\n <Translation\n defaultMessage=\"Verify your identity\"\n id=\"7tGCOh\"\n description=\"Dialog title for identity verification\"\n />\n )}\n </Title>\n\n <Description color=\"gray\" mb=\"5\">\n <Translation\n defaultMessage=\"To continue, we need to confirm your identity. We'll send a temporary verification code to {email}.\"\n id=\"FTUSRM\"\n description=\"Description explaining verification code will be sent\"\n values={{\n email: (\n <Text weight=\"bold\" highContrast>\n {me?.email}\n </Text>\n ),\n }}\n />\n </Description>\n\n {sendVerification.error && (\n <Callout.Root color=\"red\" mt=\"-2\" mb=\"0\">\n <Callout.Text>\n {getMutationErrorMessage(sendVerification.error)}\n </Callout.Text>\n </Callout.Root>\n )}\n\n <Flex justify=\"end\" align=\"center\" gap=\"3\" mt=\"5\">\n <Close>\n <Button\n variant=\"secondary\"\n type=\"button\"\n disabled={sendVerification.isPending}\n >\n <Translation\n defaultMessage=\"Cancel\"\n id=\"hHNj31\"\n description=\"Cancel button text\"\n />\n </Button>\n </Close>\n <Button type=\"submit\" loading={sendVerification.isPending}>\n <Translation\n defaultMessage=\"Send verification code\"\n id=\"XsTeXJ\"\n description=\"Button text to send verification code\"\n />\n </Button>\n </Flex>\n </form>\n );\n}\n\ninterface VerificationIdentityFormProps {\n onSuccess?: () => unknown | Promise<unknown>;\n authenticationChallengeId: string;\n type: \"dialog\" | \"alert\";\n}\n\nfunction VerificationIdentityForm({\n onSuccess,\n authenticationChallengeId,\n type,\n}: VerificationIdentityFormProps) {\n const { data: me } = useMe();\n const { setElevatedAccess } = useElevatedAccessToken();\n const verifyIdentity = useVerify();\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const Title = type === \"dialog\" ? Dialog.Title : AlertDialog.Title;\n const Description =\n type === \"dialog\" ? Dialog.Description : AlertDialog.Description;\n const Close = type === \"dialog\" ? Dialog.Close : AlertDialog.Cancel;\n const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n const formData = new FormData(event.currentTarget);\n const code = formData.get(\"otp-code\")?.toString() ?? \"\";\n\n setIsSubmitting(true);\n\n try {\n // Mutate async so we can wait for the onSuccess callback as well\n const newAuthState = await verifyIdentity.mutateAsync({\n data: {\n code,\n authenticationChallengeId,\n },\n });\n\n const in10Seconds = new Date(Date.now() + 5 * 1000);\n\n setElevatedAccess({\n token: newAuthState.elevatedAccessToken,\n // expiresAt: newAuthState.expiresAt,\n expiresAt: in10Seconds.toISOString(),\n });\n\n if (onSuccess) {\n await new Promise((resolve) => setTimeout(resolve, 200));\n await onSuccess();\n }\n } catch (error) {\n console.error(error);\n }\n\n setIsSubmitting(false);\n };\n\n return (\n <Form.Root onSubmit={handleSubmit}>\n <Title>\n <Translation\n defaultMessage=\"Verify your identity\"\n id=\"7tGCOh\"\n description=\"Dialog title for identity verification\"\n />\n </Title>\n\n <Description color=\"gray\">\n <Translation\n defaultMessage=\"A verification code was sent to {email}. Please enter it below.\"\n id=\"kvxE0S\"\n description=\"Description explaining where verification code was sent\"\n values={{\n email: (\n <Text weight=\"bold\" highContrast>\n {me?.email}\n </Text>\n ),\n }}\n />\n </Description>\n\n <Flex direction=\"column\" gap=\"2\" mt=\"5\" mx=\"auto\" width=\"fit-content\">\n <Otp.Root\n autoSubmit\n gap=\"2\"\n justify=\"center\"\n columns=\"repeat(6, 48px)\"\n width=\"fit-content\"\n rows=\"48px\"\n name=\"otp-code\"\n readOnly={isSubmitting}\n >\n <Otp.Input required autoFocus autoComplete=\"off\" />\n <Otp.Input required />\n <Otp.Input required />\n <Otp.Input required />\n <Otp.Input required />\n <Otp.Input required />\n </Otp.Root>\n\n {verifyIdentity.error && (\n <Text color=\"red\" size=\"2\" as=\"p\">\n {getMutationErrorMessage(verifyIdentity.error)}\n </Text>\n )}\n </Flex>\n\n <Flex justify=\"end\" align=\"center\" gap=\"3\" mt=\"5\">\n <Close>\n <Button variant=\"secondary\" type=\"button\">\n <Translation\n defaultMessage=\"Cancel\"\n id=\"hHNj31\"\n description=\"Cancel button text\"\n />\n </Button>\n </Close>\n <Button type=\"submit\" loading={isSubmitting}>\n <Translation\n defaultMessage=\"Confirm\"\n id=\"EmYENK\"\n description=\"Confirm button text for verification\"\n />\n </Button>\n </Flex>\n </Form.Root>\n );\n}\n\nfunction getMutationErrorMessage(error: unknown) {\n let message = typeof error === \"string\" ? error : \"\";\n\n if (error instanceof Error) {\n message = error.message;\n } else if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof error.message === \"string\"\n ) {\n message = error.message;\n }\n\n if (!message || message === \"Bad Request\") {\n message = \"Invalid code, please try again.\";\n }\n\n return message;\n}\n\n// Note: Error messages in getMutationErrorMessage are kept as plain strings\n// since they are displayed dynamically\n"],"mappings":"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","names":[]}
|
|
@@ -37,11 +37,14 @@ var React = __toESM(require("react"), 1);
|
|
|
37
37
|
var import_themes = require("@radix-ui/themes");
|
|
38
38
|
var import_errors = require("./errors.js");
|
|
39
39
|
var import_react_icons = require("@radix-ui/react-icons");
|
|
40
|
+
var import_translation = require("./i18n/translation.js");
|
|
41
|
+
var import_use_translation = require("./i18n/use-translation.js");
|
|
40
42
|
function GenericError({ error, ...domProps }) {
|
|
43
|
+
const translate = (0, import_use_translation.useTranslation)();
|
|
41
44
|
React.useEffect(() => {
|
|
42
45
|
console.error(error);
|
|
43
46
|
}, [error]);
|
|
44
|
-
const {
|
|
47
|
+
const { message } = getErrorMessage(error, translate);
|
|
45
48
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
46
49
|
import_themes.Flex,
|
|
47
50
|
{
|
|
@@ -68,35 +71,74 @@ function GenericError({ error, ...domProps }) {
|
|
|
68
71
|
}
|
|
69
72
|
),
|
|
70
73
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { direction: "column", gap: "1", maxWidth: "420px", children: [
|
|
71
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Heading, { size: "5", align: "center", mb: "1", wrap: "balance", as: "h3", children:
|
|
74
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Heading, { size: "5", align: "center", mb: "1", wrap: "balance", as: "h3", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
75
|
+
import_translation.Translation,
|
|
76
|
+
{
|
|
77
|
+
defaultMessage: "Error fetching data",
|
|
78
|
+
id: "mjZ9vq",
|
|
79
|
+
description: "Error heading shown when there is a network or authorization error"
|
|
80
|
+
}
|
|
81
|
+
) }),
|
|
72
82
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { as: "p", align: "center", wrap: "balance", color: "gray", children: message })
|
|
73
83
|
] })
|
|
74
84
|
]
|
|
75
85
|
}
|
|
76
86
|
);
|
|
77
87
|
}
|
|
78
|
-
function getErrorMessage(error) {
|
|
88
|
+
function getErrorMessage(error, translate) {
|
|
79
89
|
if (error instanceof import_errors.FetchError) {
|
|
80
90
|
return {
|
|
81
|
-
heading:
|
|
82
|
-
|
|
91
|
+
heading: translate({
|
|
92
|
+
defaultMessage: "Error fetching data",
|
|
93
|
+
description: "Error message heading",
|
|
94
|
+
id: "5QzKdW"
|
|
95
|
+
}),
|
|
96
|
+
message: translate({
|
|
97
|
+
defaultMessage: "An error occurred. You may need to configure CORS in the WorkOS Dashboard.",
|
|
98
|
+
description: "Error message details",
|
|
99
|
+
id: "63rRud"
|
|
100
|
+
})
|
|
83
101
|
};
|
|
84
102
|
}
|
|
85
103
|
if (error instanceof import_errors.NoAuthTokenError) {
|
|
86
104
|
return {
|
|
87
|
-
heading:
|
|
88
|
-
|
|
105
|
+
heading: translate({
|
|
106
|
+
defaultMessage: "Authorization error",
|
|
107
|
+
description: "Error message heading",
|
|
108
|
+
id: "s/dQVI"
|
|
109
|
+
}),
|
|
110
|
+
message: translate({
|
|
111
|
+
defaultMessage: "You likely forgot to provide an authorization token to the widget.",
|
|
112
|
+
description: "Error message details",
|
|
113
|
+
id: "d7mvgq"
|
|
114
|
+
})
|
|
89
115
|
};
|
|
90
116
|
}
|
|
91
117
|
if (error instanceof import_errors.IncorrectPermissionsError) {
|
|
92
118
|
return {
|
|
93
|
-
heading:
|
|
94
|
-
|
|
119
|
+
heading: translate({
|
|
120
|
+
defaultMessage: "Incorrect permissions",
|
|
121
|
+
description: "Error message heading",
|
|
122
|
+
id: "dFmPj3"
|
|
123
|
+
}),
|
|
124
|
+
message: translate({
|
|
125
|
+
defaultMessage: "Check that the correct permissions have been assigned.",
|
|
126
|
+
description: "Error message details",
|
|
127
|
+
id: "hd/Llp"
|
|
128
|
+
})
|
|
95
129
|
};
|
|
96
130
|
}
|
|
97
131
|
return {
|
|
98
|
-
heading:
|
|
99
|
-
|
|
132
|
+
heading: translate({
|
|
133
|
+
defaultMessage: "Error fetching data",
|
|
134
|
+
description: "Error message heading",
|
|
135
|
+
id: "5QzKdW"
|
|
136
|
+
}),
|
|
137
|
+
message: translate({
|
|
138
|
+
defaultMessage: "An unexpected error occurred. Check your network connection or try refreshing the page.",
|
|
139
|
+
description: "Error message details",
|
|
140
|
+
id: "t+CDVJ"
|
|
141
|
+
})
|
|
100
142
|
};
|
|
101
143
|
}
|
|
102
144
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/generic-error.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Flex, Heading, Text } from \"@radix-ui/themes\";\nimport {\n FetchError,\n IncorrectPermissionsError,\n NoAuthTokenError,\n} from \"./errors.js\";\nimport { Cross2Icon } from \"@radix-ui/react-icons\";\n\ntype GenericErrorProps = React.ComponentProps<typeof Flex> & {\n error: unknown;\n};\n\nexport function GenericError({ error, ...domProps }: GenericErrorProps) {\n React.useEffect(() => {\n console.error(error);\n }, [error]);\n\n const {
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/generic-error.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Flex, Heading, Text } from \"@radix-ui/themes\";\nimport {\n FetchError,\n IncorrectPermissionsError,\n NoAuthTokenError,\n} from \"./errors.js\";\nimport { Cross2Icon } from \"@radix-ui/react-icons\";\nimport { Translation } from \"./i18n/translation.js\";\nimport { useTranslation } from \"./i18n/use-translation.js\";\n\ntype GenericErrorProps = React.ComponentProps<typeof Flex> & {\n error: unknown;\n};\n\nexport function GenericError({ error, ...domProps }: GenericErrorProps) {\n const translate = useTranslation();\n React.useEffect(() => {\n console.error(error);\n }, [error]);\n\n const { message } = getErrorMessage(error, translate);\n return (\n <Flex\n p=\"6\"\n justify=\"center\"\n align=\"center\"\n direction=\"column\"\n {...domProps}\n >\n <Flex\n align=\"center\"\n justify=\"center\"\n width=\"32px\"\n height=\"32px\"\n mb=\"2\"\n style={{\n borderRadius: \"9999px\",\n backgroundColor: \"var(--red-a4)\",\n color: \"var(--red-a11)\",\n }}\n >\n <Cross2Icon width=\"24px\" height=\"24px\" />\n </Flex>\n\n <Flex direction=\"column\" gap=\"1\" maxWidth=\"420px\">\n <Heading size=\"5\" align=\"center\" mb=\"1\" wrap=\"balance\" as=\"h3\">\n <Translation\n defaultMessage=\"Error fetching data\"\n id=\"mjZ9vq\"\n description=\"Error heading shown when there is a network or authorization error\"\n />\n </Heading>\n <Text as=\"p\" align=\"center\" wrap=\"balance\" color=\"gray\">\n {message}\n </Text>\n </Flex>\n </Flex>\n );\n}\n\nexport function getErrorMessage(\n error: unknown,\n translate: ({\n defaultMessage,\n description,\n id,\n }: {\n defaultMessage: string;\n description: string;\n id: string;\n }) => string,\n) {\n if (error instanceof FetchError) {\n return {\n heading: translate({\n defaultMessage: \"Error fetching data\",\n description: \"Error message heading\",\n id: \"5QzKdW\",\n }),\n message: translate({\n defaultMessage:\n \"An error occurred. You may need to configure CORS in the WorkOS Dashboard.\",\n description: \"Error message details\",\n id: \"63rRud\",\n }),\n };\n }\n\n if (error instanceof NoAuthTokenError) {\n return {\n heading: translate({\n defaultMessage: \"Authorization error\",\n description: \"Error message heading\",\n id: \"s/dQVI\",\n }),\n message: translate({\n defaultMessage:\n \"You likely forgot to provide an authorization token to the widget.\",\n description: \"Error message details\",\n id: \"d7mvgq\",\n }),\n };\n }\n\n if (error instanceof IncorrectPermissionsError) {\n return {\n heading: translate({\n defaultMessage: \"Incorrect permissions\",\n description: \"Error message heading\",\n id: \"dFmPj3\",\n }),\n message: translate({\n defaultMessage:\n \"Check that the correct permissions have been assigned.\",\n description: \"Error message details\",\n id: \"hd/Llp\",\n }),\n };\n }\n\n return {\n heading: translate({\n defaultMessage: \"Error fetching data\",\n description: \"Error message heading\",\n id: \"5QzKdW\",\n }),\n message: translate({\n defaultMessage:\n \"An unexpected error occurred. Check your network connection or try refreshing the page.\",\n description: \"Error message details\",\n id: \"t+CDVJ\",\n }),\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0CQ;AA1CR,YAAuB;AACvB,oBAAoC;AACpC,oBAIO;AACP,yBAA2B;AAC3B,yBAA4B;AAC5B,6BAA+B;AAMxB,SAAS,aAAa,EAAE,OAAO,GAAG,SAAS,GAAsB;AACtE,QAAM,gBAAY,uCAAe;AACjC,QAAM,UAAU,MAAM;AACpB,YAAQ,MAAM,KAAK;AAAA,EACrB,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,EAAE,QAAQ,IAAI,gBAAgB,OAAO,SAAS;AACpD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,WAAU;AAAA,MACT,GAAG;AAAA,MAEJ;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,SAAQ;AAAA,YACR,OAAM;AAAA,YACN,QAAO;AAAA,YACP,IAAG;AAAA,YACH,OAAO;AAAA,cACL,cAAc;AAAA,cACd,iBAAiB;AAAA,cACjB,OAAO;AAAA,YACT;AAAA,YAEA,sDAAC,iCAAW,OAAM,QAAO,QAAO,QAAO;AAAA;AAAA,QACzC;AAAA,QAEA,6CAAC,sBAAK,WAAU,UAAS,KAAI,KAAI,UAAS,SACxC;AAAA,sDAAC,yBAAQ,MAAK,KAAI,OAAM,UAAS,IAAG,KAAI,MAAK,WAAU,IAAG,MACxD;AAAA,YAAC;AAAA;AAAA,cACC,gBAAe;AAAA,cACf,IAAG;AAAA,cACH,aAAY;AAAA;AAAA,UACd,GACF;AAAA,UACA,4CAAC,sBAAK,IAAG,KAAI,OAAM,UAAS,MAAK,WAAU,OAAM,QAC9C,mBACH;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,gBACd,OACA,WASA;AACA,MAAI,iBAAiB,0BAAY;AAC/B,WAAO;AAAA,MACL,SAAS,UAAU;AAAA,QACjB,gBAAgB;AAAA,QAChB,aAAa;AAAA,QACb,IAAI;AAAA,MACN,CAAC;AAAA,MACD,SAAS,UAAU;AAAA,QACjB,gBACE;AAAA,QACF,aAAa;AAAA,QACb,IAAI;AAAA,MACN,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,iBAAiB,gCAAkB;AACrC,WAAO;AAAA,MACL,SAAS,UAAU;AAAA,QACjB,gBAAgB;AAAA,QAChB,aAAa;AAAA,QACb,IAAI;AAAA,MACN,CAAC;AAAA,MACD,SAAS,UAAU;AAAA,QACjB,gBACE;AAAA,QACF,aAAa;AAAA,QACb,IAAI;AAAA,MACN,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,iBAAiB,yCAA2B;AAC9C,WAAO;AAAA,MACL,SAAS,UAAU;AAAA,QACjB,gBAAgB;AAAA,QAChB,aAAa;AAAA,QACb,IAAI;AAAA,MACN,CAAC;AAAA,MACD,SAAS,UAAU;AAAA,QACjB,gBACE;AAAA,QACF,aAAa;AAAA,QACb,IAAI;AAAA,MACN,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS,UAAU;AAAA,MACjB,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,IAAI;AAAA,IACN,CAAC;AAAA,IACD,SAAS,UAAU;AAAA,MACjB,gBACE;AAAA,MACF,aAAa;AAAA,MACb,IAAI;AAAA,IACN,CAAC;AAAA,EACH;AACF;","names":[]}
|
|
@@ -6,7 +6,11 @@ type GenericErrorProps = React.ComponentProps<typeof Flex> & {
|
|
|
6
6
|
error: unknown;
|
|
7
7
|
};
|
|
8
8
|
declare function GenericError({ error, ...domProps }: GenericErrorProps): react_jsx_runtime.JSX.Element;
|
|
9
|
-
declare function getErrorMessage(error: unknown
|
|
9
|
+
declare function getErrorMessage(error: unknown, translate: ({ defaultMessage, description, id, }: {
|
|
10
|
+
defaultMessage: string;
|
|
11
|
+
description: string;
|
|
12
|
+
id: string;
|
|
13
|
+
}) => string): {
|
|
10
14
|
heading: string;
|
|
11
15
|
message: string;
|
|
12
16
|
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __create = Object.create;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __export = (target, all) => {
|
|
10
|
+
for (var name in all)
|
|
11
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
12
|
+
};
|
|
13
|
+
var __copyProps = (to, from, except, desc) => {
|
|
14
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
15
|
+
for (let key of __getOwnPropNames(from))
|
|
16
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
17
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
18
|
+
}
|
|
19
|
+
return to;
|
|
20
|
+
};
|
|
21
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
22
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
23
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
24
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
25
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
26
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
27
|
+
mod
|
|
28
|
+
));
|
|
29
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
30
|
+
var intl_context_exports = {};
|
|
31
|
+
__export(intl_context_exports, {
|
|
32
|
+
IntlContext: () => IntlContext,
|
|
33
|
+
useIntl: () => useIntl
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(intl_context_exports);
|
|
36
|
+
var React = __toESM(require("react"), 1);
|
|
37
|
+
const IntlContext = React.createContext(null);
|
|
38
|
+
IntlContext.displayName = "IntlContext";
|
|
39
|
+
function useIntl() {
|
|
40
|
+
return React.useContext(IntlContext);
|
|
41
|
+
}
|
|
42
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
43
|
+
0 && (module.exports = {
|
|
44
|
+
IntlContext,
|
|
45
|
+
useIntl
|
|
46
|
+
});
|
|
47
|
+
//# sourceMappingURL=intl-context.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/i18n/intl-context.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nexport type MessageDescriptor = {\n id: string;\n defaultMessage: string;\n description: string;\n};\n\nexport type MessageValues = Record<string, string | React.ReactNode>;\n\n/**\n * Shape of the i18n context value.\n * This mirrors the essential parts of react-intl's IntlShape without importing it.\n */\nexport interface IntlContextValue {\n locale: string;\n formatMessage(\n descriptor: MessageDescriptor,\n values?: MessageValues,\n ): string | React.ReactNode[];\n}\n\n/**\n * Context for optional i18n support.\n * When this context has a value, translations will use react-intl.\n * When this context is null/undefined, translations will fall back to defaultMessage.\n */\nexport const IntlContext = React.createContext<IntlContextValue | null>(null);\nIntlContext.displayName = \"IntlContext\";\n\n/**\n * Hook to access the i18n context.\n * Returns null if no IntlProvider is present in the component tree.\n */\nexport function useIntl(): IntlContextValue | null {\n return React.useContext(IntlContext);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,YAAuB;AA2BhB,MAAM,cAAc,MAAM,cAAuC,IAAI;AAC5E,YAAY,cAAc;AAMnB,SAAS,UAAmC;AACjD,SAAO,MAAM,WAAW,WAAW;AACrC;","names":[]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
type MessageDescriptor = {
|
|
4
|
+
id: string;
|
|
5
|
+
defaultMessage: string;
|
|
6
|
+
description: string;
|
|
7
|
+
};
|
|
8
|
+
type MessageValues = Record<string, string | React.ReactNode>;
|
|
9
|
+
/**
|
|
10
|
+
* Shape of the i18n context value.
|
|
11
|
+
* This mirrors the essential parts of react-intl's IntlShape without importing it.
|
|
12
|
+
*/
|
|
13
|
+
interface IntlContextValue {
|
|
14
|
+
locale: string;
|
|
15
|
+
formatMessage(descriptor: MessageDescriptor, values?: MessageValues): string | React.ReactNode[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Context for optional i18n support.
|
|
19
|
+
* When this context has a value, translations will use react-intl.
|
|
20
|
+
* When this context is null/undefined, translations will fall back to defaultMessage.
|
|
21
|
+
*/
|
|
22
|
+
declare const IntlContext: React.Context<IntlContextValue | null>;
|
|
23
|
+
/**
|
|
24
|
+
* Hook to access the i18n context.
|
|
25
|
+
* Returns null if no IntlProvider is present in the component tree.
|
|
26
|
+
*/
|
|
27
|
+
declare function useIntl(): IntlContextValue | null;
|
|
28
|
+
|
|
29
|
+
export { IntlContext, type IntlContextValue, type MessageDescriptor, type MessageValues, useIntl };
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
var translation_exports = {};
|
|
21
|
+
__export(translation_exports, {
|
|
22
|
+
Translation: () => Translation
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(translation_exports);
|
|
25
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
26
|
+
var import_intl_context = require("./intl-context.js");
|
|
27
|
+
const Translation = (props) => {
|
|
28
|
+
const { defaultMessage, id, description, trailingSpace, values } = props;
|
|
29
|
+
const i18n = (0, import_intl_context.useIntl)();
|
|
30
|
+
if (i18n) {
|
|
31
|
+
const str = i18n.formatMessage({ id, defaultMessage, description }, values);
|
|
32
|
+
return trailingSpace ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
33
|
+
str,
|
|
34
|
+
" "
|
|
35
|
+
] }) : str;
|
|
36
|
+
}
|
|
37
|
+
if (!values) {
|
|
38
|
+
return trailingSpace ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
39
|
+
defaultMessage,
|
|
40
|
+
" "
|
|
41
|
+
] }) : defaultMessage;
|
|
42
|
+
}
|
|
43
|
+
const parts = [];
|
|
44
|
+
let lastIndex = 0;
|
|
45
|
+
const regex = /\{(\w+)\}/g;
|
|
46
|
+
let match;
|
|
47
|
+
while ((match = regex.exec(defaultMessage)) !== null) {
|
|
48
|
+
const [placeholder, key] = match;
|
|
49
|
+
if (match.index > lastIndex) {
|
|
50
|
+
parts.push(defaultMessage.substring(lastIndex, match.index));
|
|
51
|
+
}
|
|
52
|
+
parts.push(values[key] ?? placeholder);
|
|
53
|
+
lastIndex = match.index + placeholder.length;
|
|
54
|
+
}
|
|
55
|
+
if (lastIndex < defaultMessage.length) {
|
|
56
|
+
parts.push(defaultMessage.substring(lastIndex));
|
|
57
|
+
}
|
|
58
|
+
return trailingSpace ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
59
|
+
parts,
|
|
60
|
+
" "
|
|
61
|
+
] }) : parts;
|
|
62
|
+
};
|
|
63
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
64
|
+
0 && (module.exports = {
|
|
65
|
+
Translation
|
|
66
|
+
});
|
|
67
|
+
//# sourceMappingURL=translation.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/i18n/translation.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n useIntl,\n type MessageDescriptor,\n type MessageValues,\n} from \"./intl-context.js\";\n\ntype TranslationProps = MessageDescriptor & {\n trailingSpace?: boolean;\n values?: MessageValues;\n};\n\n/**\n * Translation component that gracefully degrades when no I18nProvider is present.\n *\n * - With I18nProvider: Uses react-intl for full i18n support (react-intl will be bundled)\n * - Without I18nProvider: Renders the defaultMessage with simple value interpolation (no react-intl bundled)\n */\nexport const Translation: React.FC<TranslationProps> = (props) => {\n const { defaultMessage, id, description, trailingSpace, values } = props;\n const i18n = useIntl();\n\n // If I18nProvider is present, use react-intl's formatting\n if (i18n) {\n const str = i18n.formatMessage({ id, defaultMessage, description }, values);\n return trailingSpace ? <>{str} </> : str;\n }\n\n // If no I18nProvider is present, render the defaultMessage with simple interpolation\n if (!values) {\n return trailingSpace ? <>{defaultMessage} </> : defaultMessage;\n }\n\n // Simple interpolation: split by placeholders and interleave with values\n const parts: React.ReactNode[] = [];\n let lastIndex = 0;\n const regex = /\\{(\\w+)\\}/g;\n let match;\n\n while ((match = regex.exec(defaultMessage)) !== null) {\n const [placeholder, key] = match;\n\n // Add text before the placeholder\n if (match.index > lastIndex) {\n parts.push(defaultMessage.substring(lastIndex, match.index));\n }\n\n // Add the interpolated value or placeholder if not found\n parts.push(values[key] ?? placeholder);\n lastIndex = match.index + placeholder.length;\n }\n\n // Add remaining text\n if (lastIndex < defaultMessage.length) {\n parts.push(defaultMessage.substring(lastIndex));\n }\n\n return trailingSpace ? <>{parts} </> : parts;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA2B2B;AAxB3B,0BAIO;AAaA,MAAM,cAA0C,CAAC,UAAU;AAChE,QAAM,EAAE,gBAAgB,IAAI,aAAa,eAAe,OAAO,IAAI;AACnE,QAAM,WAAO,6BAAQ;AAGrB,MAAI,MAAM;AACR,UAAM,MAAM,KAAK,cAAc,EAAE,IAAI,gBAAgB,YAAY,GAAG,MAAM;AAC1E,WAAO,gBAAgB,4EAAG;AAAA;AAAA,MAAI;AAAA,OAAC,IAAM;AAAA,EACvC;AAGA,MAAI,CAAC,QAAQ;AACX,WAAO,gBAAgB,4EAAG;AAAA;AAAA,MAAe;AAAA,OAAC,IAAM;AAAA,EAClD;AAGA,QAAM,QAA2B,CAAC;AAClC,MAAI,YAAY;AAChB,QAAM,QAAQ;AACd,MAAI;AAEJ,UAAQ,QAAQ,MAAM,KAAK,cAAc,OAAO,MAAM;AACpD,UAAM,CAAC,aAAa,GAAG,IAAI;AAG3B,QAAI,MAAM,QAAQ,WAAW;AAC3B,YAAM,KAAK,eAAe,UAAU,WAAW,MAAM,KAAK,CAAC;AAAA,IAC7D;AAGA,UAAM,KAAK,OAAO,GAAG,KAAK,WAAW;AACrC,gBAAY,MAAM,QAAQ,YAAY;AAAA,EACxC;AAGA,MAAI,YAAY,eAAe,QAAQ;AACrC,UAAM,KAAK,eAAe,UAAU,SAAS,CAAC;AAAA,EAChD;AAEA,SAAO,gBAAgB,4EAAG;AAAA;AAAA,IAAM;AAAA,KAAC,IAAM;AACzC;","names":[]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { MessageDescriptor, MessageValues } from './intl-context.cjs';
|
|
3
|
+
|
|
4
|
+
type TranslationProps = MessageDescriptor & {
|
|
5
|
+
trailingSpace?: boolean;
|
|
6
|
+
values?: MessageValues;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Translation component that gracefully degrades when no I18nProvider is present.
|
|
10
|
+
*
|
|
11
|
+
* - With I18nProvider: Uses react-intl for full i18n support (react-intl will be bundled)
|
|
12
|
+
* - Without I18nProvider: Renders the defaultMessage with simple value interpolation (no react-intl bundled)
|
|
13
|
+
*/
|
|
14
|
+
declare const Translation: React.FC<TranslationProps>;
|
|
15
|
+
|
|
16
|
+
export { Translation };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var use_locale_exports = {};
|
|
20
|
+
__export(use_locale_exports, {
|
|
21
|
+
useLocale: () => useLocale
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(use_locale_exports);
|
|
24
|
+
var import_intl_context = require("./intl-context.js");
|
|
25
|
+
function useLocale() {
|
|
26
|
+
const intl = (0, import_intl_context.useIntl)();
|
|
27
|
+
return intl?.locale ?? "en-US";
|
|
28
|
+
}
|
|
29
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
30
|
+
0 && (module.exports = {
|
|
31
|
+
useLocale
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=use-locale.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/i18n/use-locale.ts"],"sourcesContent":["import { useIntl } from \"./intl-context.js\";\n\n/**\n * Hook to get the current locale.\n * Returns the locale from IntlContext if available, otherwise falls back to \"en-US\".\n */\nexport function useLocale(): string {\n const intl = useIntl();\n return intl?.locale ?? \"en-US\";\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAwB;AAMjB,SAAS,YAAoB;AAClC,QAAM,WAAO,6BAAQ;AACrB,SAAO,MAAM,UAAU;AACzB;","names":[]}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
var use_translation_exports = {};
|
|
21
|
+
__export(use_translation_exports, {
|
|
22
|
+
useTranslation: () => useTranslation
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(use_translation_exports);
|
|
25
|
+
var import_intl_context = require("./intl-context.js");
|
|
26
|
+
function useTranslation() {
|
|
27
|
+
const i18n = (0, import_intl_context.useIntl)();
|
|
28
|
+
return (params) => {
|
|
29
|
+
const { defaultMessage, description, id, values } = params;
|
|
30
|
+
if (i18n) {
|
|
31
|
+
return String(
|
|
32
|
+
i18n.formatMessage({ id, defaultMessage, description }, values)
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
if (!values) {
|
|
36
|
+
return defaultMessage;
|
|
37
|
+
}
|
|
38
|
+
return defaultMessage.replace(/\{(\w+)\}/g, (match, key) => {
|
|
39
|
+
return key in values ? String(values[key]) : match;
|
|
40
|
+
});
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
44
|
+
0 && (module.exports = {
|
|
45
|
+
useTranslation
|
|
46
|
+
});
|
|
47
|
+
//# sourceMappingURL=use-translation.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/i18n/use-translation.ts"],"sourcesContent":["\"use client\";\n\nimport { useIntl, type MessageDescriptor } from \"./intl-context.js\";\n\ntype TranslationParams = MessageDescriptor & {\n values?: Record<string, string>;\n};\n\n/**\n * Translation hook that gracefully degrades when no I18nProvider is present.\n *\n * - With I18nProvider: Uses react-intl's formatMessage for full i18n support (react-intl will be bundled)\n * - Without I18nProvider: Returns the defaultMessage with simple string interpolation (no react-intl bundled)\n */\nexport function useTranslation() {\n const i18n = useIntl();\n\n return (params: TranslationParams): string => {\n const { defaultMessage, description, id, values } = params;\n\n // If I18nProvider is present, use react-intl's formatMessage\n if (i18n) {\n // TODO: Do we really want to cast this to a string?\n return String(\n i18n.formatMessage({ id, defaultMessage, description }, values),\n );\n }\n\n // If no I18nProvider is present, return defaultMessage with simple interpolation\n if (!values) {\n return defaultMessage;\n }\n\n // Simple string interpolation for values\n return defaultMessage.replace(/\\{(\\w+)\\}/g, (match, key) => {\n return key in values ? String(values[key]) : match;\n });\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,0BAAgD;AAYzC,SAAS,iBAAiB;AAC/B,QAAM,WAAO,6BAAQ;AAErB,SAAO,CAAC,WAAsC;AAC5C,UAAM,EAAE,gBAAgB,aAAa,IAAI,OAAO,IAAI;AAGpD,QAAI,MAAM;AAER,aAAO;AAAA,QACL,KAAK,cAAc,EAAE,IAAI,gBAAgB,YAAY,GAAG,MAAM;AAAA,MAChE;AAAA,IACF;AAGA,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AAGA,WAAO,eAAe,QAAQ,cAAc,CAAC,OAAO,QAAQ;AAC1D,aAAO,OAAO,SAAS,OAAO,OAAO,GAAG,CAAC,IAAI;AAAA,IAC/C,CAAC;AAAA,EACH;AACF;","names":[]}
|