diff --git a/CHANGELOG.md b/CHANGELOG.md index 3712dbb0c..4f4fa2766 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,6 +54,7 @@ To use this you'll need compatible versions: - Removed an `ErrorBoundary` wrapping all our feature components to make sure all errors are properly catchable by the app - Added a `footer` prop to `EmailOrPhoneForm`, `EmailForm` and `PhoneForm` which is used to override the default sign in/up footers in case the component is for MFA - The passwordless and thirdpartypasswordless sign in/up screens now respect the first configuration (defined in the `MultiFactorAuth` recipe or in the tenant information) when selecting the available contact methods. +- Added TOTP recipe. For more details please check our guide [here](TODO) - Fixed a font loading issue, that caused apps using the default (Rubik) font to appear with the incorrect font weights - Some default styling has changed related to how fonts/font-weights are applied diff --git a/examples/for-tests/src/App.js b/examples/for-tests/src/App.js index 29611c0c3..d6e6e3206 100644 --- a/examples/for-tests/src/App.js +++ b/examples/for-tests/src/App.js @@ -15,6 +15,7 @@ import ThirdPartyEmailPassword from "supertokens-auth-react/recipe/thirdpartyema import ThirdPartyPasswordless from "supertokens-auth-react/recipe/thirdpartypasswordless"; import UserRoles from "supertokens-auth-react/recipe/userroles"; import MultiFactorAuth from "supertokens-auth-react/recipe/multifactorauth"; +import TOTP from "supertokens-auth-react/recipe/totp"; import axios from "axios"; import { useSessionContext } from "supertokens-auth-react/recipe/session"; @@ -332,7 +333,100 @@ const customFields = [ const testContext = getTestContext(); +let storedTOTPDevices = window.localStorage.getItem("totpDevices"); +let totpDevices = storedTOTPDevices ? JSON.parse(storedTOTPDevices) : []; + +function removeTOTPDevice(deviceName) { + const origLength = totpDevices.length; + totpDevices = totpDevices.filter((d) => d.deviceName !== deviceName); + window.localStorage.setItem("totpDevices", JSON.stringify(totpDevices)); + return totpDevices.length !== origLength; +} + +function addTOTPDevice(deviceName) { + totpDevices.push({ + deviceName, + verified: false, + }); + window.localStorage.setItem("totpDevices", JSON.stringify(totpDevices)); +} + +function verifyTOTPDevice(deviceName) { + totpDevices = totpDevices.filter((d) => d.deviceName !== deviceName); + totpDevices.push({ + deviceName, + verified: true, + }); + window.localStorage.setItem("totpDevices", JSON.stringify(totpDevices)); +} +let tryCount = 0; + +setInterval(() => (tryCount = tryCount > 0 ? tryCount - 1 : 0), 30000); +window.resetTOTP = () => { + totpDevices = []; + window.localStorage.setItem("totpDevices", JSON.stringify(totpDevices)); + tryCount = 0; +}; let recipeList = [ + TOTP.init({ + override: { + functions: (oI) => ({ + ...oI, + listDevices: async () => ({ devices: totpDevices, status: "OK" }), + removeDevice: async ({ deviceName }) => { + return { status: "OK", didDeviceExist: removeTOTPDevice(deviceName) }; + }, + createDevice: async ({ deviceName }) => { + deviceName = deviceName ?? `totp-${Date.now()}`; + addTOTPDevice(deviceName); + return { + status: "OK", + deviceName: deviceName, + issuerName: "st", + qrCodeString: deviceName, + secret: `secret-${deviceName}`, + }; + }, + verifyCode: async ({ totp }) => { + const dev = totpDevices.find((d) => d.deviceName.endsWith(totp) && d.verified); + if (dev) { + await fetch("http://localhost:8082/completeFactor", { + method: "POST", + body: JSON.stringify({ id: "totp" }), + headers: new Headers([["Content-Type", "application/json"]]), + }); + return { status: "OK" }; + } + + if (++tryCount > 3) { + return { status: "LIMIT_REACHED_ERROR", retryAfterMs: 30000 }; + } + return { status: "INVALID_TOTP_ERROR" }; + }, + verifyDevice: async ({ deviceName, totp }) => { + const dev = totpDevices.find((d) => d.deviceName === deviceName); + if (!dev) { + return { status: "UNKNOWN_DEVICE_ERROR" }; + } + if (deviceName.endsWith(totp)) { + const wasAlreadyVerified = dev.verified; + verifyTOTPDevice(deviceName); + await fetch("http://localhost:8082/completeFactor", { + method: "POST", + body: JSON.stringify({ id: "totp" }), + headers: new Headers([["Content-Type", "application/json"]]), + }); + return { status: "OK", wasAlreadyVerified }; + } + + if (++tryCount > 3) { + return { status: "LIMIT_REACHED_ERROR", retryAfterMs: 30000 }; + } + return { status: "INVALID_TOTP_ERROR" }; + }, + }), + }, + }), MultiFactorAuth.init({ firstFactors: testContext.firstFactors, }), @@ -645,7 +739,13 @@ export function DashboardHelper({ redirectOnLogout, ...props } = {}) {
session context userID: {sessionContext.userId}
{JSON.stringify(sessionContext.invalidClaims, undefined, 2)}
- MultiFactorAuth.redirectToFactorChooser(true, props.history)}>MFA chooser + { + return MultiFactorAuth.redirectToFactorChooser(true, props.history); + }}> + MFA chooser + ); } diff --git a/examples/for-tests/src/AppWithReactDomRouter.js b/examples/for-tests/src/AppWithReactDomRouter.js index 7c007ceb8..76373238a 100644 --- a/examples/for-tests/src/AppWithReactDomRouter.js +++ b/examples/for-tests/src/AppWithReactDomRouter.js @@ -16,6 +16,7 @@ import { EmailVerificationPreBuiltUI } from "supertokens-auth-react/recipe/email import { ThirdPartyPreBuiltUI } from "supertokens-auth-react/recipe/thirdparty/prebuiltui"; import { AccessDeniedScreen } from "supertokens-auth-react/recipe/session/prebuiltui"; import { MultiFactorAuthPreBuiltUI } from "supertokens-auth-react/recipe/multifactorauth/prebuiltui"; +import { TOTPPreBuiltUI } from "supertokens-auth-react/recipe/totp/prebuiltui"; import { BaseComponent, Home, Contact, Dashboard, DashboardNoAuthRequired } from "./App"; import { getEnabledRecipes } from "./testContext"; @@ -35,7 +36,7 @@ function AppWithReactDomRouter(props) { const emailVerificationMode = window.localStorage.getItem("mode") || "OFF"; const websiteBasePath = window.localStorage.getItem("websiteBasePath") || undefined; - let recipePreBuiltUIList = [MultiFactorAuthPreBuiltUI]; + let recipePreBuiltUIList = [MultiFactorAuthPreBuiltUI, TOTPPreBuiltUI]; if (enabledRecipes.includes("emailpassword")) { recipePreBuiltUIList.push(EmailPasswordPreBuiltUI); } diff --git a/examples/for-tests/src/testContext.js b/examples/for-tests/src/testContext.js index 3851358dd..901c43978 100644 --- a/examples/for-tests/src/testContext.js +++ b/examples/for-tests/src/testContext.js @@ -9,6 +9,7 @@ export function getTestContext() { thirdPartyRedirectURL: localStorage.getItem("thirdPartyRedirectURL"), authRecipe: window.localStorage.getItem("authRecipe") || "emailpassword", usesDynamicLoginMethods: localStorage.getItem("usesDynamicLoginMethods") === "true", + enableAllRecipes: localStorage.getItem("enableAllRecipes") === "true", clientRecipeListForDynamicLogin: localStorage.getItem("clientRecipeListForDynamicLogin"), mockLoginMethodsForDynamicLogin: localStorage.getItem("mockLoginMethodsForDynamicLogin"), staticProviderList: localStorage.getItem("staticProviderList"), @@ -28,18 +29,24 @@ export function getEnabledRecipes() { let enabledRecipes = []; - if (testContext.usesDynamicLoginMethods) { - if (testContext.clientRecipeListForDynamicLogin) { - enabledRecipes = JSON.parse(testContext.clientRecipeListForDynamicLogin); - } else { - enabledRecipes = [ - "emailpassword", - "thirdparty", - "thirdpartyemailpassword", - "passwordless", - "thirdpartypasswordless", - ]; - } + if (testContext.enableAllRecipes) { + enabledRecipes = [ + "emailpassword", + "thirdparty", + "thirdpartyemailpassword", + "passwordless", + "thirdpartypasswordless", + ]; + } else if (testContext.clientRecipeListForDynamicLogin) { + enabledRecipes = JSON.parse(testContext.clientRecipeListForDynamicLogin); + } else if (testContext.usesDynamicLoginMethods) { + enabledRecipes = [ + "emailpassword", + "thirdparty", + "thirdpartyemailpassword", + "passwordless", + "thirdpartypasswordless", + ]; } else { if (testContext.authRecipe === "both") { enabledRecipes.push("emailpassword", "thirdparty"); diff --git a/lib/build/components/assets/blockedIcon.d.ts b/lib/build/components/assets/blockedIcon.d.ts new file mode 100644 index 000000000..1832c8417 --- /dev/null +++ b/lib/build/components/assets/blockedIcon.d.ts @@ -0,0 +1,2 @@ +/// +export declare const BlockedIcon: () => JSX.Element; diff --git a/lib/build/components/assets/totpIcon.d.ts b/lib/build/components/assets/totpIcon.d.ts new file mode 100644 index 000000000..8f2bba229 --- /dev/null +++ b/lib/build/components/assets/totpIcon.d.ts @@ -0,0 +1,2 @@ +/// +export declare const TOTPIcon: () => JSX.Element; diff --git a/lib/build/emailpassword-shared4.js b/lib/build/emailpassword-shared4.js index e2f54ebcc..937af37ee 100644 --- a/lib/build/emailpassword-shared4.js +++ b/lib/build/emailpassword-shared4.js @@ -4,7 +4,8 @@ var genericComponentOverrideContext = require("./genericComponentOverrideContext var EmailPasswordWebJS = require("supertokens-web-js/recipe/emailpassword"); var NormalisedURLPath = require("supertokens-web-js/utils/normalisedURLPath"); var utils = require("./authRecipe-shared.js"); -var validators = require("./emailpassword-shared5.js"); +var constants = require("./emailpassword-shared5.js"); +var validators = require("./emailpassword-shared6.js"); function _interopDefault(e) { return e && e.__esModule ? e : { default: e }; @@ -235,7 +236,7 @@ function normaliseSignInFormFeatureConfig(defaultFormFields, config) { userFormFields = config.formFields // Filter on email and password only. .filter(function (field) { - return validators.MANDATORY_FORM_FIELDS_ID_ARRAY.includes(field.id); + return constants.MANDATORY_FORM_FIELDS_ID_ARRAY.includes(field.id); }) // Sign In fields are never optional. .map(function (field) { @@ -345,7 +346,7 @@ function mergeFormFields(defaultFormFields, userFormFields) { optional = userField.optional; } // If "email" or "password", always mandatory. - if (validators.MANDATORY_FORM_FIELDS_ID_ARRAY.includes(userField.id)) { + if (constants.MANDATORY_FORM_FIELDS_ID_ARRAY.includes(userField.id)) { optional = false; } // Merge. @@ -435,7 +436,7 @@ var EmailPassword = /** @class */ (function (_super) { return genericComponentOverrideContext.__generator(this, function (_a) { if (context.action === "RESET_PASSWORD") { resetPasswordPath = new NormalisedURLPath__default.default( - validators.DEFAULT_RESET_PASSWORD_PATH + constants.DEFAULT_RESET_PASSWORD_PATH ); return [ 2 /*return*/, diff --git a/lib/build/emailpassword-shared5.js b/lib/build/emailpassword-shared5.js index 2f2d37441..8b145c4f7 100644 --- a/lib/build/emailpassword-shared5.js +++ b/lib/build/emailpassword-shared5.js @@ -1,7 +1,5 @@ "use strict"; -var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); - /* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. * * This software is licensed under the Apache License, Version 2.0 (the @@ -19,103 +17,5 @@ var genericComponentOverrideContext = require("./genericComponentOverrideContext var MANDATORY_FORM_FIELDS_ID_ARRAY = ["email", "password"]; var DEFAULT_RESET_PASSWORD_PATH = "/reset-password"; -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -/* - * defaultEmailValidator. - */ -function defaultEmailValidator(value) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - var defaultEmailValidatorRegexp; - return genericComponentOverrideContext.__generator(this, function (_a) { - if (typeof value !== "string") { - return [2 /*return*/, "ERROR_EMAIL_NON_STRING"]; - } - value = value.trim(); - defaultEmailValidatorRegexp = - // eslint-disable-next-line no-useless-escape - /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; - // We check if the email syntax is correct - // As per https://github.com/supertokens/supertokens-auth-react/issues/5#issuecomment-709512438 - // Regex from https://stackoverflow.com/a/46181/3867175 - if (value.match(defaultEmailValidatorRegexp) === null) { - return [2 /*return*/, "ERROR_EMAIL_INVALID"]; - } - return [2 /*return*/, undefined]; - }); - }); -} -/* - * defaultPasswordValidator. - * min 8 characters. - * Contains lowercase, uppercase, and numbers. - */ -function defaultPasswordValidator(value) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - if (typeof value !== "string") { - return [2 /*return*/, "ERROR_PASSWORD_NON_STRING"]; - } - // length >= 8 && < 100 - // must have a number and a character - // as per https://github.com/supertokens/supertokens-auth-react/issues/5#issuecomment-709512438 - if (value.length < 8) { - return [2 /*return*/, "ERROR_PASSWORD_TOO_SHORT"]; - } - if (value.length >= 100) { - return [2 /*return*/, "ERROR_PASSWORD_TOO_LONG"]; - } - if (value.match(/^.*[A-Za-z]+.*$/) === null) { - return [2 /*return*/, "ERROR_PASSWORD_NO_ALPHA"]; - } - if (value.match(/^.*[0-9]+.*$/) === null) { - return [2 /*return*/, "ERROR_PASSWORD_NO_NUM"]; - } - return [2 /*return*/, undefined]; - }); - }); -} -/* - * defaultLoginPasswordValidator. - * type string - */ -function defaultLoginPasswordValidator(value) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - if (typeof value !== "string") { - return [2 /*return*/, "ERROR_PASSWORD_NON_STRING"]; - } - return [2 /*return*/, undefined]; - }); - }); -} -/* - * defaultValidate - */ -// eslint-disable-next-line @typescript-eslint/no-unused-vars -function defaultValidate(_) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - return [2 /*return*/, undefined]; - }); - }); -} - exports.DEFAULT_RESET_PASSWORD_PATH = DEFAULT_RESET_PASSWORD_PATH; exports.MANDATORY_FORM_FIELDS_ID_ARRAY = MANDATORY_FORM_FIELDS_ID_ARRAY; -exports.defaultEmailValidator = defaultEmailValidator; -exports.defaultLoginPasswordValidator = defaultLoginPasswordValidator; -exports.defaultPasswordValidator = defaultPasswordValidator; -exports.defaultValidate = defaultValidate; diff --git a/lib/build/emailpassword-shared6.js b/lib/build/emailpassword-shared6.js index 2916a01a4..97e3b35d7 100644 --- a/lib/build/emailpassword-shared6.js +++ b/lib/build/emailpassword-shared6.js @@ -1,1514 +1,102 @@ "use strict"; var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); -var jsxRuntime = require("react/jsx-runtime"); -var NormalisedURLPath = require("supertokens-web-js/utils/normalisedURLPath"); -var uiEntry = require("./index2.js"); -var authWidgetWrapper = require("./authRecipe-shared2.js"); -var componentOverrideContext = require("./emailpassword-shared3.js"); -var React = require("react"); -var translations = require("./translations.js"); -var translations$1 = require("./emailverification-shared2.js"); -var translationContext = require("./translationContext.js"); -var backButton = require("./emailpassword-shared7.js"); -var arrowLeftIcon = require("./arrowLeftIcon.js"); -var formBase = require("./emailpassword-shared8.js"); -var generalError = require("./emailpassword-shared.js"); -var STGeneralError = require("supertokens-web-js/utils/error"); -var button = require("./emailpassword-shared2.js"); -var recipe = require("./session-shared2.js"); -var SuperTokensBranding = require("./SuperTokensBranding.js"); -var STGeneralError$1 = require("supertokens-web-js/lib/build/error"); -var validators = require("./emailpassword-shared5.js"); -var recipe$1 = require("./emailpassword-shared4.js"); -function _interopDefault(e) { - return e && e.__esModule ? e : { default: e }; -} - -function _interopNamespace(e) { - if (e && e.__esModule) return e; - var n = Object.create(null); - if (e) { - Object.keys(e).forEach(function (k) { - if (k !== "default") { - var d = Object.getOwnPropertyDescriptor(e, k); - Object.defineProperty( - n, - k, - d.get - ? d - : { - enumerable: true, - get: function () { - return e[k]; - }, - } - ); - } +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +/* + * defaultEmailValidator. + */ +function defaultEmailValidator(value) { + return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { + var defaultEmailValidatorRegexp; + return genericComponentOverrideContext.__generator(this, function (_a) { + if (typeof value !== "string") { + return [2 /*return*/, "ERROR_EMAIL_NON_STRING"]; + } + value = value.trim(); + defaultEmailValidatorRegexp = + // eslint-disable-next-line no-useless-escape + /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; + // We check if the email syntax is correct + // As per https://github.com/supertokens/supertokens-auth-react/issues/5#issuecomment-709512438 + // Regex from https://stackoverflow.com/a/46181/3867175 + if (value.match(defaultEmailValidatorRegexp) === null) { + return [2 /*return*/, "ERROR_EMAIL_INVALID"]; + } + return [2 /*return*/, undefined]; }); - } - n.default = e; - return Object.freeze(n); + }); } - -var NormalisedURLPath__default = /*#__PURE__*/ _interopDefault(NormalisedURLPath); -var React__namespace = /*#__PURE__*/ _interopNamespace(React); -var STGeneralError__default = /*#__PURE__*/ _interopDefault(STGeneralError); -var STGeneralError__default$1 = /*#__PURE__*/ _interopDefault(STGeneralError$1); - /* - * Component. + * defaultPasswordValidator. + * min 8 characters. + * Contains lowercase, uppercase, and numbers. */ -function BackToSignInButton(_a) { - var onClick = _a.onClick; - var t = translationContext.useTranslation(); - return jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "secondaryText secondaryLinkWithLeftArrow", onClick: onClick }, - { - children: [ - jsxRuntime.jsx(arrowLeftIcon.ArrowLeftIcon, { color: "rgb(var(--palette-secondaryText))" }), - t("EMAIL_PASSWORD_RESET_SIGN_IN_LINK"), - ], +function defaultPasswordValidator(value) { + return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { + return genericComponentOverrideContext.__generator(this, function (_a) { + if (typeof value !== "string") { + return [2 /*return*/, "ERROR_PASSWORD_NON_STRING"]; } - ) - ); -} - -var EmailPasswordResetPasswordEmail = function (props) { - var t = translationContext.useTranslation(); - var userContext = uiEntry.useUserContext(); - var _a = React.useState("READY"), - status = _a[0], - setStatus = _a[1]; - var _b = React.useState(""), - emailFieldValue = _b[0], - setEmailFieldValue = _b[1]; - var onSuccess = function () { - setStatus("SENT"); - }; - var resend = function () { - setStatus("READY"); - }; - var formFields = props.formFields; - var emailSuccessText = - t("EMAIL_PASSWORD_RESET_SEND_BEFORE_EMAIL") + - (emailFieldValue !== undefined && emailFieldValue.length > 0 - ? emailFieldValue - : t("EMAIL_PASSWORD_RESET_SEND_FALLBACK_EMAIL")) + - t("EMAIL_PASSWORD_RESET_SEND_AFTER_EMAIL"); - if (status === "SENT") { - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "container" }, - { - children: jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "row" }, - { - children: [ - jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "primaryText enterEmailSuccessMessage" }, - { - children: [ - emailSuccessText, - jsxRuntime.jsx( - "span", - genericComponentOverrideContext.__assign( - { - "data-supertokens": "link resendEmailLink", - onClick: resend, - }, - { children: t("EMAIL_PASSWORD_RESET_RESEND_LINK") } - ) - ), - ], - } - ) - ), - jsxRuntime.jsx(BackToSignInButton, { onClick: props.onBackButtonClicked }), - ], - } - ) - ), - } - ) - ); - } - // Otherwise, return Form. - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "container" }, - { - children: jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "row" }, - { - children: [ - jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerTitle withBackButton" }, - { - children: [ - jsxRuntime.jsx(backButton.BackButton, { - onClick: props.onBackButtonClicked, - }), - t("EMAIL_PASSWORD_RESET_HEADER_TITLE"), - jsxRuntime.jsx("span", { - "data-supertokens": "backButtonPlaceholder backButtonCommon", - }), - ], - } - ) - ), - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerSubtitle" }, - { - children: jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "secondaryText" }, - { children: t("EMAIL_PASSWORD_RESET_HEADER_SUBTITLE") } - ) - ), - } - ) - ), - props.error !== undefined && - jsxRuntime.jsx(generalError.GeneralError, { error: props.error }), - jsxRuntime.jsx(formBase.FormBase, { - clearError: props.clearError, - onError: props.onError, - formFields: formFields, - buttonLabel: "EMAIL_PASSWORD_RESET_SEND_BTN", - onSuccess: onSuccess, - callAPI: function (formFields) { - return genericComponentOverrideContext.__awaiter( - void 0, - void 0, - void 0, - function () { - var validationErrors, emailField, resp; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [ - 4 /*yield*/, - genericComponentOverrideContext.validateForm( - formFields, - props.config.resetPasswordUsingTokenFeature - .enterEmailForm.formFields - ), - ]; - case 1: - validationErrors = _a.sent(); - if (validationErrors.length > 0) { - return [ - 2 /*return*/, - { - status: "FIELD_ERROR", - formFields: validationErrors, - }, - ]; - } - emailField = formFields.find(function (field) { - return field.id === "email"; - }); - if (emailField !== undefined) { - setEmailFieldValue(emailField.value); - } - return [ - 4 /*yield*/, - props.recipeImplementation.sendPasswordResetEmail({ - formFields: formFields, - userContext: userContext, - }), - ]; - case 2: - resp = _a.sent(); - if (resp.status === "PASSWORD_RESET_NOT_ALLOWED") { - return [ - 2 /*return*/, - { - status: "FIELD_ERROR", - formFields: [ - { id: "email", error: resp.reason }, - ], - }, - ]; - } - return [2 /*return*/, resp]; - } - }); - } - ); - }, - showLabels: true, - validateOnBlur: true, - }), - ], - } - ) - ), + // length >= 8 && < 100 + // must have a number and a character + // as per https://github.com/supertokens/supertokens-auth-react/issues/5#issuecomment-709512438 + if (value.length < 8) { + return [2 /*return*/, "ERROR_PASSWORD_TOO_SHORT"]; } - ) - ); -}; -var ResetPasswordEmail = uiEntry.withOverride("EmailPasswordResetPasswordEmail", EmailPasswordResetPasswordEmail); - -var EmailPasswordSubmitNewPassword = function (props) { - var t = translationContext.useTranslation(); - var userContext = uiEntry.useUserContext(); - var _a = React.useState("READY"), - status = _a[0], - setStatus = _a[1]; - var onSuccess = function () { - setStatus("SUCCESS"); - }; - var formFields = props.formFields, - onSignInClicked = props.onSignInClicked; - if (status === "SUCCESS") { - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "container" }, - { - children: jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "row" }, - { - children: [ - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerTitle" }, - { children: t("EMAIL_PASSWORD_RESET_SUBMIT_PW_SUCCESS_HEADER_TITLE") } - ) - ), - jsxRuntime.jsx( - formBase.FormRow, - { - children: jsxRuntime.jsxs(React.Fragment, { - children: [ - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { - "data-supertokens": - "primaryText submitNewPasswordSuccessMessage", - }, - { - children: t( - "EMAIL_PASSWORD_RESET_SUBMIT_PW_SUCCESS_DESC" - ), - } - ) - ), - jsxRuntime.jsx(button.Button, { - disabled: false, - isLoading: false, - type: "button", - onClick: onSignInClicked, - label: "EMAIL_PASSWORD_RESET_SUBMIT_PW_SUCCESS_SIGN_IN_BTN", - }), - ], - }), - }, - "form-button" - ), - ], - } - ) - ), - } - ) - ); - } - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "container" }, - { - children: jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "row" }, - { - children: [ - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerTitle" }, - { children: t("EMAIL_PASSWORD_RESET_SUBMIT_PW_HEADER_TITLE") } - ) - ), - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerSubtitle" }, - { - children: jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "secondaryText" }, - { children: t("EMAIL_PASSWORD_RESET_SUBMIT_PW_HEADER_SUBTITLE") } - ) - ), - } - ) - ), - props.error !== undefined && - jsxRuntime.jsx(generalError.GeneralError, { error: props.error }), - jsxRuntime.jsx(formBase.FormBase, { - formFields: formFields, - clearError: props.clearError, - onError: props.onError, - buttonLabel: "EMAIL_PASSWORD_RESET_SUBMIT_PW_CHANGE_PW_BTN", - onSuccess: onSuccess, - validateOnBlur: true, - callAPI: function (fields) { - return genericComponentOverrideContext.__awaiter( - void 0, - void 0, - void 0, - function () { - var validationErrors, response; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [ - 4 /*yield*/, - genericComponentOverrideContext.validateForm( - fields, - props.config.resetPasswordUsingTokenFeature - .submitNewPasswordForm.formFields - ), - ]; - case 1: - validationErrors = _a.sent(); - if (validationErrors.length > 0) { - return [ - 2 /*return*/, - { - status: "FIELD_ERROR", - formFields: validationErrors, - }, - ]; - } - // Verify that both passwords match. - if (fields[0].value !== fields[1].value) { - return [ - 2 /*return*/, - { - status: "FIELD_ERROR", - formFields: [ - { - id: fields[1].id, - error: "ERROR_CONFIRM_PASSWORD_NO_MATCH", - }, - ], - }, - ]; - } - return [ - 4 /*yield*/, - props.recipeImplementation.submitNewPassword({ - formFields: fields, - userContext: userContext, - }), - ]; - case 2: - response = _a.sent(); - if ( - response.status === "RESET_PASSWORD_INVALID_TOKEN_ERROR" - ) { - throw new STGeneralError__default.default( - "EMAIL_PASSWORD_RESET_PASSWORD_INVALID_TOKEN_ERROR" - ); - } - return [ - 2 /*return*/, - response.status === "FIELD_ERROR" - ? response - : { - status: "OK", - }, - ]; - } - }); - } - ); - }, - showLabels: true, - }), - ], - } - ) - ), + if (value.length >= 100) { + return [2 /*return*/, "ERROR_PASSWORD_TOO_LONG"]; } - ) - ); -}; -var SubmitNewPassword = uiEntry.withOverride("EmailPasswordSubmitNewPassword", EmailPasswordSubmitNewPassword); - -/* - * Component. - */ -function ResetPasswordUsingTokenTheme(props) { - /* - * Render. - */ - // If no token, return SubmitNewPassword. - if (props.submitNewPasswordForm !== undefined) { - return jsxRuntime.jsx( - SubmitNewPassword, - genericComponentOverrideContext.__assign({}, props.submitNewPasswordForm) - ); - } - // Otherwise, return EnterEmail. - return jsxRuntime.jsx(ResetPasswordEmail, genericComponentOverrideContext.__assign({}, props.enterEmailForm)); -} -function ResetPasswordUsingTokenThemeWrapper(props) { - var hasFont = translations.hasFontDefined(props.config.rootStyle); - var userStyles = props.submitNewPasswordForm - ? props.config.resetPasswordUsingTokenFeature.submitNewPasswordForm.style - : props.config.resetPasswordUsingTokenFeature.enterEmailForm.style; - return jsxRuntime.jsx( - uiEntry.UserContextWrapper, - genericComponentOverrideContext.__assign( - { userContext: props.userContext }, - { - children: jsxRuntime.jsx( - translations$1.ThemeBase, - genericComponentOverrideContext.__assign( - { loadDefaultFont: !hasFont, userStyles: [props.config.rootStyle, userStyles] }, - { - children: jsxRuntime.jsx( - ResetPasswordUsingTokenTheme, - genericComponentOverrideContext.__assign({}, props) - ), - } - ) - ), + if (value.match(/^.*[A-Za-z]+.*$/) === null) { + return [2 /*return*/, "ERROR_PASSWORD_NO_ALPHA"]; } - ) - ); -} - -var defaultTranslationsEmailPassword = { - en: genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, translations.defaultTranslationsCommon.en), - translations$1.defaultTranslationsEmailVerification.en - ), - { - EMAIL_PASSWORD_EMAIL_LABEL: "Email", - EMAIL_PASSWORD_EMAIL_PLACEHOLDER: "Email address", - EMAIL_PASSWORD_PASSWORD_LABEL: "Password", - EMAIL_PASSWORD_PASSWORD_PLACEHOLDER: "Password", - EMAIL_PASSWORD_SIGN_IN_HEADER_TITLE: "Sign In", - EMAIL_PASSWORD_SIGN_IN_HEADER_SUBTITLE_START: "Not registered yet?", - EMAIL_PASSWORD_SIGN_IN_HEADER_SUBTITLE_SIGN_UP_LINK: "Sign Up", - EMAIL_PASSWORD_SIGN_IN_HEADER_SUBTITLE_END: "", - EMAIL_PASSWORD_SIGN_IN_FOOTER_FORGOT_PW_LINK: "Forgot password?", - EMAIL_PASSWORD_SIGN_IN_SUBMIT_BTN: "SIGN IN", - EMAIL_PASSWORD_SIGN_IN_WRONG_CREDENTIALS_ERROR: "Incorrect email and password combination", - EMAIL_PASSWORD_SIGN_UP_HEADER_TITLE: "Sign Up", - EMAIL_PASSWORD_SIGN_UP_HEADER_SUBTITLE_START: "Already have an account?", - EMAIL_PASSWORD_SIGN_UP_HEADER_SUBTITLE_SIGN_IN_LINK: "Sign In", - EMAIL_PASSWORD_SIGN_UP_HEADER_SUBTITLE_END: "", - EMAIL_PASSWORD_SIGN_UP_FOOTER_START: "By continuing, you agree to our ", - EMAIL_PASSWORD_SIGN_UP_FOOTER_TOS: "Terms of Service", - EMAIL_PASSWORD_SIGN_UP_FOOTER_AND: " and ", - EMAIL_PASSWORD_SIGN_UP_FOOTER_PP: "Privacy Policy", - EMAIL_PASSWORD_SIGN_UP_FOOTER_END: "", - EMAIL_PASSWORD_SIGN_UP_SUBMIT_BTN: "SIGN UP", - EMAIL_PASSWORD_EMAIL_ALREADY_EXISTS: "This email already exists. Please sign in instead", - EMAIL_PASSWORD_RESET_HEADER_TITLE: "Reset your password", - EMAIL_PASSWORD_RESET_HEADER_SUBTITLE: "We will send you an email to reset your password", - EMAIL_PASSWORD_RESET_SEND_FALLBACK_EMAIL: "your account", - EMAIL_PASSWORD_RESET_SEND_BEFORE_EMAIL: "A password reset email has been sent to ", - EMAIL_PASSWORD_RESET_SEND_AFTER_EMAIL: ", if it exists in our system. ", - EMAIL_PASSWORD_RESET_RESEND_LINK: "Resend or change email", - EMAIL_PASSWORD_RESET_SEND_BTN: "Email me", - EMAIL_PASSWORD_RESET_SIGN_IN_LINK: "Sign In", - EMAIL_PASSWORD_RESET_SUBMIT_PW_SUCCESS_HEADER_TITLE: "Success!", - EMAIL_PASSWORD_RESET_SUBMIT_PW_SUCCESS_DESC: "Your password has been updated successfully", - EMAIL_PASSWORD_RESET_SUBMIT_PW_SUCCESS_SIGN_IN_BTN: "SIGN IN", - EMAIL_PASSWORD_NEW_PASSWORD_LABEL: "New password", - EMAIL_PASSWORD_NEW_PASSWORD_PLACEHOLDER: "New password", - EMAIL_PASSWORD_CONFIRM_PASSWORD_LABEL: "Confirm password", - EMAIL_PASSWORD_CONFIRM_PASSWORD_PLACEHOLDER: "Confirm your password", - EMAIL_PASSWORD_RESET_SUBMIT_PW_HEADER_TITLE: "Change your password", - EMAIL_PASSWORD_RESET_SUBMIT_PW_HEADER_SUBTITLE: "Enter a new password below to change your password", - EMAIL_PASSWORD_RESET_SUBMIT_PW_CHANGE_PW_BTN: "CHANGE PASSWORD", - EMAIL_PASSWORD_RESET_PASSWORD_INVALID_TOKEN_ERROR: "Invalid password reset token", - ERROR_EMAIL_NON_STRING: "Email must be of type string", - ERROR_EMAIL_INVALID: "Email is invalid", - ERROR_PASSWORD_NON_STRING: "Password must be of type string", - ERROR_PASSWORD_TOO_SHORT: "Password must contain at least 8 characters, including a number", - ERROR_PASSWORD_TOO_LONG: "Password's length must be lesser than 100 characters", - ERROR_PASSWORD_NO_ALPHA: "Password must contain at least one alphabet", - ERROR_PASSWORD_NO_NUM: "Password must contain at least one number", - ERROR_CONFIRM_PASSWORD_NO_MATCH: "Confirmation password doesn't match", - ERROR_NON_OPTIONAL: "Field is not optional", - /* - * The following are error messages from our backend SDK. - * These are returned as full messages to preserver compatibilty, but they work just like the keys above. - * They are shown as is by default (setting the value to undefined will display the raw translation key) - */ - "This email already exists. Please sign in instead.": undefined, - "Field is not optional": undefined, - "Password must contain at least 8 characters, including a number": undefined, - "Password's length must be lesser than 100 characters": undefined, - "Password must contain at least one alphabet": undefined, - "Password must contain at least one number": undefined, - "Email is invalid": undefined, - "Reset password link was not created because of account take over risk. Please contact support. (ERR_CODE_001)": - undefined, - "Cannot sign up due to security reasons. Please try logging in, use a different login method or contact support. (ERR_CODE_007)": - undefined, - "Cannot sign in due to security reasons. Please try resetting your password, use a different login method or contact support. (ERR_CODE_008)": - undefined, - } - ), -}; - -var ResetPasswordUsingToken$1 = function (props) { - var token = genericComponentOverrideContext.getQueryParams("token"); - var _a = React__namespace.useState(), - error = _a[0], - setError = _a[1]; - var enterEmailFormFeature = props.recipe.config.resetPasswordUsingTokenFeature.enterEmailForm; - var submitNewPasswordFormFeature = props.recipe.config.resetPasswordUsingTokenFeature.submitNewPasswordForm; - var submitNewPasswordForm = - token === undefined || token === null - ? undefined - : { - error: error, - onError: function (error) { - return setError(error); - }, - clearError: function () { - return setError(undefined); - }, - styleFromInit: submitNewPasswordFormFeature.style, - formFields: submitNewPasswordFormFeature.formFields, - recipeImplementation: props.recipe.webJSRecipe, - config: props.recipe.config, - onSignInClicked: function () { - void genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToAuth({ - show: "signin", - history: props.history, - redirectBack: false, - }); - }, - token: token, - }; - var enterEmailForm = { - onBackButtonClicked: function () { - return genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToAuth({ - show: "signin", - history: props.history, - redirectBack: false, - }); - }, - error: error, - onError: function (error) { - return setError(error); - }, - clearError: function () { - return setError(undefined); - }, - styleFromInit: enterEmailFormFeature.style, - formFields: enterEmailFormFeature.formFields, - recipeImplementation: props.recipe.webJSRecipe, - config: props.recipe.config, - }; - var childProps = { - config: props.recipe.config, - submitNewPasswordForm: submitNewPasswordForm, - enterEmailForm: enterEmailForm, - }; - var recipeComponentOverrides = props.useComponentOverrides(); - return jsxRuntime.jsx( - uiEntry.ComponentOverrideContext.Provider, - genericComponentOverrideContext.__assign( - { value: recipeComponentOverrides }, - { - children: jsxRuntime.jsx( - uiEntry.FeatureWrapper, - genericComponentOverrideContext.__assign( - { - useShadowDom: props.recipe.config.useShadowDom, - defaultStore: defaultTranslationsEmailPassword, - }, - { - children: jsxRuntime.jsxs(React.Fragment, { - children: [ - props.children === undefined && - jsxRuntime.jsx( - ResetPasswordUsingTokenThemeWrapper, - genericComponentOverrideContext.__assign({}, childProps) - ), - props.children && - React__namespace.Children.map(props.children, function (child) { - if (React__namespace.isValidElement(child)) { - return React__namespace.cloneElement(child, childProps); - } - return child; - }), - ], - }), - } - ) - ), + if (value.match(/^.*[0-9]+.*$/) === null) { + return [2 /*return*/, "ERROR_PASSWORD_NO_NUM"]; } - ) - ); -}; - -var SignInFooter = uiEntry.withOverride("EmailPasswordSignInFooter", function EmailPasswordSignInFooter(_a) { - var onClick = _a.onClick; - var t = translationContext.useTranslation(); - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "link secondaryText forgotPasswordLink", onClick: onClick }, - { children: t("EMAIL_PASSWORD_SIGN_IN_FOOTER_FORGOT_PW_LINK") } - ) - ); -}); - -var SignInForm = uiEntry.withOverride("EmailPasswordSignInForm", function EmailPasswordSignInForm(props) { - var _this = this; - var userContext = uiEntry.useUserContext(); - return jsxRuntime.jsx(formBase.FormBase, { - formFields: props.formFields, - clearError: props.clearError, - onError: props.onError, - buttonLabel: "EMAIL_PASSWORD_SIGN_IN_SUBMIT_BTN", - onSuccess: props.onSuccess, - callAPI: function (formFields) { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - var validationErrors, response; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [ - 4 /*yield*/, - genericComponentOverrideContext.validateForm( - formFields, - props.config.signInAndUpFeature.signInForm.formFields - ), - ]; - case 1: - validationErrors = _a.sent(); - if (validationErrors.length > 0) { - return [ - 2 /*return*/, - { - status: "FIELD_ERROR", - formFields: validationErrors, - }, - ]; - } - return [ - 4 /*yield*/, - props.recipeImplementation.signIn({ - formFields: formFields, - userContext: userContext, - }), - ]; - case 2: - response = _a.sent(); - if (response.status === "WRONG_CREDENTIALS_ERROR") { - throw new STGeneralError__default.default( - "EMAIL_PASSWORD_SIGN_IN_WRONG_CREDENTIALS_ERROR" - ); - } else if (response.status === "SIGN_IN_NOT_ALLOWED") { - throw new STGeneralError__default.default(response.reason); - } else { - return [2 /*return*/, response]; - } - } - }); - }); - }, - validateOnBlur: false, - showLabels: true, - footer: props.footer, - }); -}); - -var SignInHeader = uiEntry.withOverride("EmailPasswordSignInHeader", function EmailPasswordSignInHeader(_a) { - var onClick = _a.onClick; - var t = translationContext.useTranslation(); - return jsxRuntime.jsxs(React.Fragment, { - children: [ - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerTitle" }, - { children: t("EMAIL_PASSWORD_SIGN_IN_HEADER_TITLE") } - ) - ), - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerSubtitle" }, - { - children: jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "secondaryText" }, - { - children: [ - t("EMAIL_PASSWORD_SIGN_IN_HEADER_SUBTITLE_START"), - jsxRuntime.jsx( - "span", - genericComponentOverrideContext.__assign( - { "data-supertokens": "link", onClick: onClick }, - { children: t("EMAIL_PASSWORD_SIGN_IN_HEADER_SUBTITLE_SIGN_UP_LINK") } - ) - ), - t("EMAIL_PASSWORD_SIGN_IN_HEADER_SUBTITLE_END"), - ], - } - ) - ), - } - ) - ), - jsxRuntime.jsx("div", { "data-supertokens": "divider" }), - ], + return [2 /*return*/, undefined]; + }); }); -}); - -var SignIn = uiEntry.withOverride("EmailPasswordSignIn", function EmailPasswordSignIn(props) { - return jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "container" }, - { - children: [ - jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "row" }, - { - children: [ - jsxRuntime.jsx(SignInHeader, { onClick: props.signUpClicked }), - props.error !== undefined && - jsxRuntime.jsx(generalError.GeneralError, { error: props.error }), - jsxRuntime.jsx( - SignInForm, - genericComponentOverrideContext.__assign({}, props, { - footer: jsxRuntime.jsx(SignInFooter, { - onClick: props.forgotPasswordClick, - }), - }) - ), - ], - } - ) - ), - jsxRuntime.jsx(SuperTokensBranding.SuperTokensBranding, {}), - ], - } - ) - ); -}); - -var SignUpFooter = uiEntry.withOverride("EmailPasswordSignUpFooter", function EmailPasswordSignUpFooter(_a) { - var termsOfServiceLink = _a.termsOfServiceLink, - privacyPolicyLink = _a.privacyPolicyLink; - var t = translationContext.useTranslation(); - if (termsOfServiceLink === undefined && privacyPolicyLink === undefined) { - return null; - } - return jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "secondaryText privacyPolicyAndTermsAndConditions" }, - { - children: [ - t("EMAIL_PASSWORD_SIGN_UP_FOOTER_START"), - termsOfServiceLink !== undefined && - jsxRuntime.jsx( - "a", - genericComponentOverrideContext.__assign( - { - "data-supertokens": "link", - href: termsOfServiceLink, - target: "_blank", - rel: "noopener noreferer", - }, - { children: t("EMAIL_PASSWORD_SIGN_UP_FOOTER_TOS") } - ) - ), - termsOfServiceLink !== undefined && - privacyPolicyLink !== undefined && - t("EMAIL_PASSWORD_SIGN_UP_FOOTER_AND"), - privacyPolicyLink !== undefined && - jsxRuntime.jsx( - "a", - genericComponentOverrideContext.__assign( - { - "data-supertokens": "link", - href: privacyPolicyLink, - target: "_blank", - rel: "noopener noreferer", - }, - { children: t("EMAIL_PASSWORD_SIGN_UP_FOOTER_PP") } - ) - ), - t("EMAIL_PASSWORD_SIGN_UP_FOOTER_END"), - ], - } - ) - ); -}); - +} /* - * Component. + * defaultLoginPasswordValidator. + * type string */ -var SignUpForm = uiEntry.withOverride("EmailPasswordSignUpForm", function EmailPasswordSignUpForm(props) { - var _this = this; - var userContext = uiEntry.useUserContext(); - return jsxRuntime.jsx(formBase.FormBase, { - formFields: props.formFields, - clearError: props.clearError, - onError: props.onError, - buttonLabel: "EMAIL_PASSWORD_SIGN_UP_SUBMIT_BTN", - onSuccess: props.onSuccess, - callAPI: function (formFields) { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - var validationErrors, res; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [ - 4 /*yield*/, - genericComponentOverrideContext.validateForm( - formFields, - props.config.signInAndUpFeature.signUpForm.formFields - ), - ]; - case 1: - validationErrors = _a.sent(); - if (validationErrors.length > 0) { - return [ - 2 /*return*/, - { - status: "FIELD_ERROR", - formFields: validationErrors, - }, - ]; - } - return [ - 4 /*yield*/, - props.recipeImplementation.signUp({ - formFields: formFields, - userContext: userContext, - }), - ]; - case 2: - res = _a.sent(); - if (res.status === "SIGN_UP_NOT_ALLOWED") { - throw new STGeneralError__default$1.default(res.reason); - } - return [2 /*return*/, res]; - } - }); - }); - }, - validateOnBlur: true, - showLabels: true, - footer: props.footer, - }); -}); - -var SignUpHeader = uiEntry.withOverride("EmailPasswordSignUpHeader", function EmailPasswordSignUpHeader(_a) { - var onClick = _a.onClick; - var t = translationContext.useTranslation(); - return jsxRuntime.jsxs(React.Fragment, { - children: [ - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerTitle" }, - { children: t("EMAIL_PASSWORD_SIGN_UP_HEADER_TITLE") } - ) - ), - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerSubtitle" }, - { - children: jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "secondaryText" }, - { - children: [ - t("EMAIL_PASSWORD_SIGN_UP_HEADER_SUBTITLE_START"), - jsxRuntime.jsx( - "span", - genericComponentOverrideContext.__assign( - { "data-supertokens": "link", onClick: onClick }, - { children: t("EMAIL_PASSWORD_SIGN_UP_HEADER_SUBTITLE_SIGN_IN_LINK") } - ) - ), - t("EMAIL_PASSWORD_SIGN_UP_HEADER_SUBTITLE_END"), - ], - } - ) - ), - } - ) - ), - jsxRuntime.jsx("div", { "data-supertokens": "divider" }), - ], - }); -}); - -var SignUp = uiEntry.withOverride("EmailPasswordSignUp", function EmailPasswordSignUp(props) { - return jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "container" }, - { - children: [ - jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "row" }, - { - children: [ - jsxRuntime.jsx(SignUpHeader, { onClick: props.signInClicked }), - props.error !== undefined && - jsxRuntime.jsx(generalError.GeneralError, { error: props.error }), - jsxRuntime.jsx( - SignUpForm, - genericComponentOverrideContext.__assign({}, props, { - footer: jsxRuntime.jsx(SignUpFooter, { - privacyPolicyLink: - props.config.signInAndUpFeature.signUpForm.privacyPolicyLink, - termsOfServiceLink: - props.config.signInAndUpFeature.signUpForm.termsOfServiceLink, - }), - }) - ), - ], - } - ) - ), - jsxRuntime.jsx(SuperTokensBranding.SuperTokensBranding, {}), - ], - } - ) - ); -}); - -var SignInAndUpTheme = function (props) { - // If isSignUp, return signUp. - if (props.featureState.isSignUp) { - return jsxRuntime.jsx( - SignUp, - genericComponentOverrideContext.__assign({}, props.signUpForm, { - signInClicked: function () { - props.dispatch({ type: "setSignIn" }); - }, - }) - ); - } - // Otherwise, return SignIn. - return jsxRuntime.jsx( - SignIn, - genericComponentOverrideContext.__assign({}, props.signInForm, { - signUpClicked: function () { - props.dispatch({ type: "setSignUp" }); - }, - }) - ); -}; -function SignInAndUpThemeWrapper(props) { - var hasFont = translations.hasFontDefined(props.config.rootStyle); - var activeStyle = props.featureState.isSignUp - ? props.config.signInAndUpFeature.signUpForm.style - : props.config.signInAndUpFeature.signInForm.style; - return jsxRuntime.jsx( - uiEntry.UserContextWrapper, - genericComponentOverrideContext.__assign( - { userContext: props.userContext }, - { - children: jsxRuntime.jsx( - translations$1.ThemeBase, - genericComponentOverrideContext.__assign( - { loadDefaultFont: !hasFont, userStyles: [props.config.rootStyle, activeStyle] }, - { - children: jsxRuntime.jsx( - SignInAndUpTheme, - genericComponentOverrideContext.__assign({}, props) - ), - } - ) - ), - } - ) - ); -} - -var useFeatureReducer = function (recipe) { - return React__namespace.useReducer( - function (oldState, action) { - switch (action.type) { - case "setSignIn": - return genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, oldState), - { error: undefined, isSignUp: false } - ); - case "setSignUp": - return genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, oldState), - { error: undefined, isSignUp: true } - ); - case "setError": - return genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, oldState), - { error: action.error } - ); - default: - return oldState; +function defaultLoginPasswordValidator(value) { + return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { + return genericComponentOverrideContext.__generator(this, function (_a) { + if (typeof value !== "string") { + return [2 /*return*/, "ERROR_PASSWORD_NON_STRING"]; } - }, - { - isSignUp: recipe === undefined ? false : recipe.config.signInAndUpFeature.defaultToSignUp, - user: undefined, - error: undefined, - }, - function (initArg) { - var show = genericComponentOverrideContext.getQueryParams("show"); - var isSignUp = initArg.isSignUp; - if (show !== null) { - isSignUp = show === "signup"; - } - return { - isSignUp: isSignUp, - user: undefined, - error: undefined, - }; - } - ); -}; -function useChildProps(recipe$1, state, dispatch, history) { - var _this = this; - var recipeImplementation = React.useMemo( - function () { - return recipe$1 && getModifiedRecipeImplementation(recipe$1.webJSRecipe); - }, - [recipe$1] - ); - var userContext = uiEntry.useUserContext(); - var onSignInSuccess = React.useCallback( - function (response) { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - return [ - 2 /*return*/, - recipe.Session.getInstanceOrThrow().validateGlobalClaimsAndHandleSuccessRedirection( - { - rid: recipe$1.config.recipeId, - successRedirectContext: { - action: "SUCCESS", - isNewRecipeUser: false, - user: response.user, - redirectToPath: genericComponentOverrideContext.getRedirectToPathFromURL(), - }, - }, - userContext, - history - ), - ]; - }); - }); - }, - [recipe$1, userContext, history] - ); - var onSignUpSuccess = React.useCallback( - function (response) { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - return [ - 2 /*return*/, - recipe.Session.getInstanceOrThrow().validateGlobalClaimsAndHandleSuccessRedirection( - { - rid: recipe$1.config.recipeId, - successRedirectContext: { - action: "SUCCESS", - isNewRecipeUser: true, - user: response.user, - redirectToPath: genericComponentOverrideContext.getRedirectToPathFromURL(), - }, - }, - userContext, - history - ), - ]; - }); - }); - }, - [recipe$1, userContext, history] - ); - return React.useMemo( - function () { - if (recipe$1 === undefined || recipeImplementation === undefined) { - return; - } - var signInAndUpFeature = recipe$1.config.signInAndUpFeature; - var signUpFeature = signInAndUpFeature.signUpForm; - var signInFeature = signInAndUpFeature.signInForm; - var signInForm = { - recipeImplementation: recipeImplementation, - config: recipe$1.config, - styleFromInit: signInFeature.style, - formFields: signInFeature.formFields, - error: state.error, - clearError: function () { - return dispatch({ type: "setError", error: undefined }); - }, - onError: function (error) { - return dispatch({ type: "setError", error: error }); - }, - onSuccess: onSignInSuccess, - forgotPasswordClick: function () { - return recipe$1.redirect({ action: "RESET_PASSWORD" }, history); - }, - }; - var signUpForm = { - recipeImplementation: recipeImplementation, - config: recipe$1.config, - styleFromInit: signUpFeature.style, - formFields: getThemeSignUpFeatureFormFields(signUpFeature.formFields, recipe$1, userContext), - error: state.error, - clearError: function () { - return dispatch({ type: "setError", error: undefined }); - }, - onError: function (error) { - return dispatch({ type: "setError", error: error }); - }, - onSuccess: onSignUpSuccess, - }; - return { - config: recipe$1.config, - signInForm: signInForm, - signUpForm: signUpForm, - }; - }, - [recipe$1, state, dispatch] - ); + return [2 /*return*/, undefined]; + }); + }); } -var SignInAndUpFeature = function (props) { - var _a = useFeatureReducer(props.recipe), - state = _a[0], - dispatch = _a[1]; - var childProps = useChildProps(props.recipe, state, dispatch, props.history); - var recipeComponentOverrides = props.useComponentOverrides(); - return jsxRuntime.jsx( - uiEntry.ComponentOverrideContext.Provider, - genericComponentOverrideContext.__assign( - { value: recipeComponentOverrides }, - { - children: jsxRuntime.jsx( - uiEntry.FeatureWrapper, - genericComponentOverrideContext.__assign( - { - useShadowDom: props.recipe.config.useShadowDom, - defaultStore: defaultTranslationsEmailPassword, - }, - { - children: jsxRuntime.jsxs(React.Fragment, { - children: [ - props.children === undefined && - jsxRuntime.jsx( - SignInAndUpThemeWrapper, - genericComponentOverrideContext.__assign({}, childProps, { - featureState: state, - dispatch: dispatch, - }) - ), - props.children && - React__namespace.Children.map(props.children, function (child) { - if (React__namespace.isValidElement(child)) { - return React__namespace.cloneElement( - child, - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, childProps), - { featureState: state, dispatch: dispatch } - ) - ); - } - return child; - }), - ], - }), - } - ) - ), - } - ) - ); -}; -var getModifiedRecipeImplementation = function (origImpl) { - return genericComponentOverrideContext.__assign({}, origImpl); -}; -function getThemeSignUpFeatureFormFields(formFields, recipe, userContext) { - var _this = this; - var emailPasswordOnly = formFields.length === 2; - return formFields.map(function (field) { - return genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, field), { - showIsRequired: (function () { - // If email and password only, do not show required indicator (*). - if (emailPasswordOnly) { - return false; - } - // Otherwise, show for all non optional fields (including email and password). - return field.optional === false; - })(), - validate: (function () { - // If field is not email, return field validate unchanged. - if (field.id !== "email") { - return field.validate; - } - // Otherwise, if email, use syntax validate method and check if email exists. - return function (value) { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - var error, emailExists, err_1; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [4 /*yield*/, field.validate(value)]; - case 1: - error = _a.sent(); - if (error !== undefined) { - return [2 /*return*/, error]; - } - if (typeof value !== "string") { - return [2 /*return*/, "GENERAL_ERROR_EMAIL_NON_STRING"]; - } - _a.label = 2; - case 2: - _a.trys.push([2, 4, , 5]); - return [ - 4 /*yield*/, - recipe.webJSRecipe.doesEmailExist({ - email: value, - userContext: userContext, - }), - ]; - case 3: - emailExists = _a.sent().doesExist; - if (emailExists) { - return [2 /*return*/, "EMAIL_PASSWORD_EMAIL_ALREADY_EXISTS"]; - } - return [3 /*break*/, 5]; - case 4: - err_1 = _a.sent(); - if (STGeneralError__default.default.isThisError(err_1)) { - return [2 /*return*/, err_1.message]; - } - return [3 /*break*/, 5]; - case 5: - return [2 /*return*/, undefined]; - } - }); - }); - }; - })(), +/* + * defaultValidate + */ +// eslint-disable-next-line @typescript-eslint/no-unused-vars +function defaultValidate(_) { + return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { + return genericComponentOverrideContext.__generator(this, function (_a) { + return [2 /*return*/, undefined]; }); }); } -var EmailPasswordPreBuiltUI = /** @class */ (function (_super) { - genericComponentOverrideContext.__extends(EmailPasswordPreBuiltUI, _super); - function EmailPasswordPreBuiltUI(recipeInstance) { - var _this = _super.call(this) || this; - _this.recipeInstance = recipeInstance; - // Instance methods - _this.getFeatures = function (useComponentOverrides) { - if (useComponentOverrides === void 0) { - useComponentOverrides = componentOverrideContext.useContext; - } - var features = {}; - if (_this.recipeInstance.config.signInAndUpFeature.disableDefaultUI !== true) { - var normalisedFullPath = _this.recipeInstance.config.appInfo.websiteBasePath.appendPath( - new NormalisedURLPath__default.default("/") - ); - features[normalisedFullPath.getAsStringDangerous()] = { - matches: genericComponentOverrideContext.matchRecipeIdUsingQueryParams( - _this.recipeInstance.config.recipeId - ), - component: function (props) { - return _this.getFeatureComponent("signinup", props, useComponentOverrides); - }, - recipeID: recipe$1.EmailPassword.RECIPE_ID, - }; - } - if (_this.recipeInstance.config.resetPasswordUsingTokenFeature.disableDefaultUI !== true) { - var normalisedFullPath = _this.recipeInstance.config.appInfo.websiteBasePath.appendPath( - new NormalisedURLPath__default.default(validators.DEFAULT_RESET_PASSWORD_PATH) - ); - features[normalisedFullPath.getAsStringDangerous()] = { - matches: genericComponentOverrideContext.matchRecipeIdUsingQueryParams( - _this.recipeInstance.config.recipeId - ), - component: function (props) { - return _this.getFeatureComponent("resetpassword", props, useComponentOverrides); - }, - recipeID: recipe$1.EmailPassword.RECIPE_ID, - }; - } - return features; - }; - _this.getFeatureComponent = function (componentName, props, useComponentOverrides) { - if (useComponentOverrides === void 0) { - useComponentOverrides = componentOverrideContext.useContext; - } - if (componentName === "signinup") { - if (props.redirectOnSessionExists !== false) { - return jsxRuntime.jsx( - uiEntry.UserContextWrapper, - genericComponentOverrideContext.__assign( - { userContext: props.userContext }, - { - children: jsxRuntime.jsx( - authWidgetWrapper.AuthWidgetWrapper, - genericComponentOverrideContext.__assign( - { authRecipe: _this.recipeInstance, history: props.history }, - { - children: jsxRuntime.jsx( - SignInAndUpFeature, - genericComponentOverrideContext.__assign( - { recipe: _this.recipeInstance }, - props, - { useComponentOverrides: useComponentOverrides } - ) - ), - } - ) - ), - } - ) - ); - } else { - return jsxRuntime.jsx( - uiEntry.UserContextWrapper, - genericComponentOverrideContext.__assign( - { userContext: props.userContext }, - { - children: jsxRuntime.jsx( - SignInAndUpFeature, - genericComponentOverrideContext.__assign({ recipe: _this.recipeInstance }, props, { - useComponentOverrides: useComponentOverrides, - }) - ), - } - ) - ); - } - } else if (componentName === "resetpassword") { - return jsxRuntime.jsx( - uiEntry.UserContextWrapper, - genericComponentOverrideContext.__assign( - { userContext: props.userContext }, - { - children: jsxRuntime.jsx( - ResetPasswordUsingToken$1, - genericComponentOverrideContext.__assign({ recipe: _this.recipeInstance }, props, { - useComponentOverrides: useComponentOverrides, - }) - ), - } - ) - ); - } else { - throw new Error("Should never come here."); - } - }; - return _this; - } - // Static methods - EmailPasswordPreBuiltUI.getInstanceOrInitAndGetInstance = function () { - if (EmailPasswordPreBuiltUI.instance === undefined) { - var recipeInstance = recipe$1.EmailPassword.getInstanceOrThrow(); - EmailPasswordPreBuiltUI.instance = new EmailPasswordPreBuiltUI(recipeInstance); - } - return EmailPasswordPreBuiltUI.instance; - }; - EmailPasswordPreBuiltUI.getFeatures = function (useComponentOverrides) { - if (useComponentOverrides === void 0) { - useComponentOverrides = componentOverrideContext.useContext; - } - return EmailPasswordPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatures(useComponentOverrides); - }; - EmailPasswordPreBuiltUI.getFeatureComponent = function (componentName, props, useComponentOverrides) { - if (useComponentOverrides === void 0) { - useComponentOverrides = componentOverrideContext.useContext; - } - return EmailPasswordPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatureComponent( - componentName, - props, - useComponentOverrides - ); - }; - // For tests - EmailPasswordPreBuiltUI.reset = function () { - if (!genericComponentOverrideContext.isTest()) { - return; - } - EmailPasswordPreBuiltUI.instance = undefined; - return; - }; - EmailPasswordPreBuiltUI.SignInAndUp = function (prop) { - if (prop === void 0) { - prop = {}; - } - return EmailPasswordPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatureComponent("signinup", prop); - }; - EmailPasswordPreBuiltUI.ResetPasswordUsingToken = function (prop) { - return EmailPasswordPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatureComponent("resetpassword", prop); - }; - EmailPasswordPreBuiltUI.ResetPasswordUsingTokenTheme = ResetPasswordUsingTokenThemeWrapper; - EmailPasswordPreBuiltUI.SignInAndUpTheme = SignInAndUpThemeWrapper; - return EmailPasswordPreBuiltUI; -})(uiEntry.RecipeRouter); -var SignInAndUp = EmailPasswordPreBuiltUI.SignInAndUp; -var ResetPasswordUsingToken = EmailPasswordPreBuiltUI.ResetPasswordUsingToken; - -exports.EmailPasswordPreBuiltUI = EmailPasswordPreBuiltUI; -exports.ResetPasswordUsingToken = ResetPasswordUsingToken; -exports.ResetPasswordUsingTokenThemeWrapper = ResetPasswordUsingTokenThemeWrapper; -exports.SignInAndUp = SignInAndUp; -exports.SignInAndUpThemeWrapper = SignInAndUpThemeWrapper; -exports.SignInFooter = SignInFooter; -exports.SignInForm = SignInForm; -exports.SignInHeader = SignInHeader; -exports.SignUpFooter = SignUpFooter; -exports.SignUpForm = SignUpForm; -exports.SignUpHeader = SignUpHeader; -exports.defaultTranslationsEmailPassword = defaultTranslationsEmailPassword; -exports.useChildProps = useChildProps; -exports.useFeatureReducer = useFeatureReducer; +exports.defaultEmailValidator = defaultEmailValidator; +exports.defaultLoginPasswordValidator = defaultLoginPasswordValidator; +exports.defaultPasswordValidator = defaultPasswordValidator; +exports.defaultValidate = defaultValidate; diff --git a/lib/build/emailpassword-shared7.js b/lib/build/emailpassword-shared7.js index d2336cadd..73b9b6e38 100644 --- a/lib/build/emailpassword-shared7.js +++ b/lib/build/emailpassword-shared7.js @@ -2,62 +2,1513 @@ var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); var jsxRuntime = require("react/jsx-runtime"); +var NormalisedURLPath = require("supertokens-web-js/utils/normalisedURLPath"); +var uiEntry = require("./index2.js"); +var authWidgetWrapper = require("./authRecipe-shared2.js"); +var componentOverrideContext = require("./emailpassword-shared3.js"); +var React = require("react"); +var translations = require("./translations.js"); +var translations$1 = require("./emailverification-shared2.js"); +var translationContext = require("./translationContext.js"); +var backButton = require("./emailpassword-shared8.js"); +var arrowLeftIcon = require("./arrowLeftIcon.js"); +var formBase = require("./emailpassword-shared9.js"); +var generalError = require("./emailpassword-shared.js"); +var STGeneralError = require("supertokens-web-js/utils/error"); +var button = require("./emailpassword-shared2.js"); +var recipe = require("./session-shared2.js"); +var SuperTokensBranding = require("./SuperTokensBranding.js"); +var STGeneralError$1 = require("supertokens-web-js/lib/build/error"); +var constants = require("./emailpassword-shared5.js"); +var recipe$1 = require("./emailpassword-shared4.js"); + +function _interopDefault(e) { + return e && e.__esModule ? e : { default: e }; +} + +function _interopNamespace(e) { + if (e && e.__esModule) return e; + var n = Object.create(null); + if (e) { + Object.keys(e).forEach(function (k) { + if (k !== "default") { + var d = Object.getOwnPropertyDescriptor(e, k); + Object.defineProperty( + n, + k, + d.get + ? d + : { + enumerable: true, + get: function () { + return e[k]; + }, + } + ); + } + }); + } + n.default = e; + return Object.freeze(n); +} + +var NormalisedURLPath__default = /*#__PURE__*/ _interopDefault(NormalisedURLPath); +var React__namespace = /*#__PURE__*/ _interopNamespace(React); +var STGeneralError__default = /*#__PURE__*/ _interopDefault(STGeneralError); +var STGeneralError__default$1 = /*#__PURE__*/ _interopDefault(STGeneralError$1); -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ /* - * Imports. + * Component. */ +function BackToSignInButton(_a) { + var onClick = _a.onClick; + var t = translationContext.useTranslation(); + return jsxRuntime.jsxs( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "secondaryText secondaryLinkWithLeftArrow", onClick: onClick }, + { + children: [ + jsxRuntime.jsx(arrowLeftIcon.ArrowLeftIcon, { color: "rgb(var(--palette-secondaryText))" }), + t("EMAIL_PASSWORD_RESET_SIGN_IN_LINK"), + ], + } + ) + ); +} + +var EmailPasswordResetPasswordEmail = function (props) { + var t = translationContext.useTranslation(); + var userContext = uiEntry.useUserContext(); + var _a = React.useState("READY"), + status = _a[0], + setStatus = _a[1]; + var _b = React.useState(""), + emailFieldValue = _b[0], + setEmailFieldValue = _b[1]; + var onSuccess = function () { + setStatus("SENT"); + }; + var resend = function () { + setStatus("READY"); + }; + var formFields = props.formFields; + var emailSuccessText = + t("EMAIL_PASSWORD_RESET_SEND_BEFORE_EMAIL") + + (emailFieldValue !== undefined && emailFieldValue.length > 0 + ? emailFieldValue + : t("EMAIL_PASSWORD_RESET_SEND_FALLBACK_EMAIL")) + + t("EMAIL_PASSWORD_RESET_SEND_AFTER_EMAIL"); + if (status === "SENT") { + return jsxRuntime.jsx( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "container" }, + { + children: jsxRuntime.jsxs( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "row" }, + { + children: [ + jsxRuntime.jsxs( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "primaryText enterEmailSuccessMessage" }, + { + children: [ + emailSuccessText, + jsxRuntime.jsx( + "span", + genericComponentOverrideContext.__assign( + { + "data-supertokens": "link resendEmailLink", + onClick: resend, + }, + { children: t("EMAIL_PASSWORD_RESET_RESEND_LINK") } + ) + ), + ], + } + ) + ), + jsxRuntime.jsx(BackToSignInButton, { onClick: props.onBackButtonClicked }), + ], + } + ) + ), + } + ) + ); + } + // Otherwise, return Form. + return jsxRuntime.jsx( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "container" }, + { + children: jsxRuntime.jsxs( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "row" }, + { + children: [ + jsxRuntime.jsxs( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "headerTitle withBackButton" }, + { + children: [ + jsxRuntime.jsx(backButton.BackButton, { + onClick: props.onBackButtonClicked, + }), + t("EMAIL_PASSWORD_RESET_HEADER_TITLE"), + jsxRuntime.jsx("span", { + "data-supertokens": "backButtonPlaceholder backButtonCommon", + }), + ], + } + ) + ), + jsxRuntime.jsx( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "headerSubtitle" }, + { + children: jsxRuntime.jsx( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "secondaryText" }, + { children: t("EMAIL_PASSWORD_RESET_HEADER_SUBTITLE") } + ) + ), + } + ) + ), + props.error !== undefined && + jsxRuntime.jsx(generalError.GeneralError, { error: props.error }), + jsxRuntime.jsx(formBase.FormBase, { + clearError: props.clearError, + onError: props.onError, + formFields: formFields, + buttonLabel: "EMAIL_PASSWORD_RESET_SEND_BTN", + onSuccess: onSuccess, + callAPI: function (formFields) { + return genericComponentOverrideContext.__awaiter( + void 0, + void 0, + void 0, + function () { + var validationErrors, emailField, resp; + return genericComponentOverrideContext.__generator(this, function (_a) { + switch (_a.label) { + case 0: + return [ + 4 /*yield*/, + genericComponentOverrideContext.validateForm( + formFields, + props.config.resetPasswordUsingTokenFeature + .enterEmailForm.formFields + ), + ]; + case 1: + validationErrors = _a.sent(); + if (validationErrors.length > 0) { + return [ + 2 /*return*/, + { + status: "FIELD_ERROR", + formFields: validationErrors, + }, + ]; + } + emailField = formFields.find(function (field) { + return field.id === "email"; + }); + if (emailField !== undefined) { + setEmailFieldValue(emailField.value); + } + return [ + 4 /*yield*/, + props.recipeImplementation.sendPasswordResetEmail({ + formFields: formFields, + userContext: userContext, + }), + ]; + case 2: + resp = _a.sent(); + if (resp.status === "PASSWORD_RESET_NOT_ALLOWED") { + return [ + 2 /*return*/, + { + status: "FIELD_ERROR", + formFields: [ + { id: "email", error: resp.reason }, + ], + }, + ]; + } + return [2 /*return*/, resp]; + } + }); + } + ); + }, + showLabels: true, + validateOnBlur: true, + }), + ], + } + ) + ), + } + ) + ); +}; +var ResetPasswordEmail = uiEntry.withOverride("EmailPasswordResetPasswordEmail", EmailPasswordResetPasswordEmail); + +var EmailPasswordSubmitNewPassword = function (props) { + var t = translationContext.useTranslation(); + var userContext = uiEntry.useUserContext(); + var _a = React.useState("READY"), + status = _a[0], + setStatus = _a[1]; + var onSuccess = function () { + setStatus("SUCCESS"); + }; + var formFields = props.formFields, + onSignInClicked = props.onSignInClicked; + if (status === "SUCCESS") { + return jsxRuntime.jsx( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "container" }, + { + children: jsxRuntime.jsxs( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "row" }, + { + children: [ + jsxRuntime.jsx( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "headerTitle" }, + { children: t("EMAIL_PASSWORD_RESET_SUBMIT_PW_SUCCESS_HEADER_TITLE") } + ) + ), + jsxRuntime.jsx( + formBase.FormRow, + { + children: jsxRuntime.jsxs(React.Fragment, { + children: [ + jsxRuntime.jsx( + "div", + genericComponentOverrideContext.__assign( + { + "data-supertokens": + "primaryText submitNewPasswordSuccessMessage", + }, + { + children: t( + "EMAIL_PASSWORD_RESET_SUBMIT_PW_SUCCESS_DESC" + ), + } + ) + ), + jsxRuntime.jsx(button.Button, { + disabled: false, + isLoading: false, + type: "button", + onClick: onSignInClicked, + label: "EMAIL_PASSWORD_RESET_SUBMIT_PW_SUCCESS_SIGN_IN_BTN", + }), + ], + }), + }, + "form-button" + ), + ], + } + ) + ), + } + ) + ); + } + return jsxRuntime.jsx( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "container" }, + { + children: jsxRuntime.jsxs( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "row" }, + { + children: [ + jsxRuntime.jsx( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "headerTitle" }, + { children: t("EMAIL_PASSWORD_RESET_SUBMIT_PW_HEADER_TITLE") } + ) + ), + jsxRuntime.jsx( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "headerSubtitle" }, + { + children: jsxRuntime.jsx( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "secondaryText" }, + { children: t("EMAIL_PASSWORD_RESET_SUBMIT_PW_HEADER_SUBTITLE") } + ) + ), + } + ) + ), + props.error !== undefined && + jsxRuntime.jsx(generalError.GeneralError, { error: props.error }), + jsxRuntime.jsx(formBase.FormBase, { + formFields: formFields, + clearError: props.clearError, + onError: props.onError, + buttonLabel: "EMAIL_PASSWORD_RESET_SUBMIT_PW_CHANGE_PW_BTN", + onSuccess: onSuccess, + validateOnBlur: true, + callAPI: function (fields) { + return genericComponentOverrideContext.__awaiter( + void 0, + void 0, + void 0, + function () { + var validationErrors, response; + return genericComponentOverrideContext.__generator(this, function (_a) { + switch (_a.label) { + case 0: + return [ + 4 /*yield*/, + genericComponentOverrideContext.validateForm( + fields, + props.config.resetPasswordUsingTokenFeature + .submitNewPasswordForm.formFields + ), + ]; + case 1: + validationErrors = _a.sent(); + if (validationErrors.length > 0) { + return [ + 2 /*return*/, + { + status: "FIELD_ERROR", + formFields: validationErrors, + }, + ]; + } + // Verify that both passwords match. + if (fields[0].value !== fields[1].value) { + return [ + 2 /*return*/, + { + status: "FIELD_ERROR", + formFields: [ + { + id: fields[1].id, + error: "ERROR_CONFIRM_PASSWORD_NO_MATCH", + }, + ], + }, + ]; + } + return [ + 4 /*yield*/, + props.recipeImplementation.submitNewPassword({ + formFields: fields, + userContext: userContext, + }), + ]; + case 2: + response = _a.sent(); + if ( + response.status === "RESET_PASSWORD_INVALID_TOKEN_ERROR" + ) { + throw new STGeneralError__default.default( + "EMAIL_PASSWORD_RESET_PASSWORD_INVALID_TOKEN_ERROR" + ); + } + return [ + 2 /*return*/, + response.status === "FIELD_ERROR" + ? response + : { + status: "OK", + }, + ]; + } + }); + } + ); + }, + showLabels: true, + }), + ], + } + ) + ), + } + ) + ); +}; +var SubmitNewPassword = uiEntry.withOverride("EmailPasswordSubmitNewPassword", EmailPasswordSubmitNewPassword); + /* * Component. */ -function HeavyArrowLeftIcon(_a) { - var color = _a.color; +function ResetPasswordUsingTokenTheme(props) { + /* + * Render. + */ + // If no token, return SubmitNewPassword. + if (props.submitNewPasswordForm !== undefined) { + return jsxRuntime.jsx( + SubmitNewPassword, + genericComponentOverrideContext.__assign({}, props.submitNewPasswordForm) + ); + } + // Otherwise, return EnterEmail. + return jsxRuntime.jsx(ResetPasswordEmail, genericComponentOverrideContext.__assign({}, props.enterEmailForm)); +} +function ResetPasswordUsingTokenThemeWrapper(props) { + var hasFont = translations.hasFontDefined(props.config.rootStyle); + var userStyles = props.submitNewPasswordForm + ? props.config.resetPasswordUsingTokenFeature.submitNewPasswordForm.style + : props.config.resetPasswordUsingTokenFeature.enterEmailForm.style; return jsxRuntime.jsx( - "svg", + uiEntry.UserContextWrapper, genericComponentOverrideContext.__assign( + { userContext: props.userContext }, { - xmlns: "http://www.w3.org/2000/svg", - width: "16", - height: "13", - viewBox: "0 0 16 13", - "data-supertokens": "heavyArrowLeftIcon", - }, - { - children: jsxRuntime.jsx("path", { - fill: color, - d: "M13 6.8h.022H3.8l2.9 2.9a.761.761 0 0 1 0 1.07l-.451.451a.754.754 0 0 1-1.064 0L.22 6.254a.759.759 0 0 1 0-1.068L5.186.22a.755.755 0 0 1 1.064 0l.45.451a.746.746 0 0 1 .22.532.724.724 0 0 1-.22.522l-2.93 2.92h9.24a.781.781 0 0 1 .764.773v.638A.766.766 0 0 1 13 6.8z", - transform: "translate(1.182 .708)", - }), + children: jsxRuntime.jsx( + translations$1.ThemeBase, + genericComponentOverrideContext.__assign( + { loadDefaultFont: !hasFont, userStyles: [props.config.rootStyle, userStyles] }, + { + children: jsxRuntime.jsx( + ResetPasswordUsingTokenTheme, + genericComponentOverrideContext.__assign({}, props) + ), + } + ) + ), } ) ); } +var defaultTranslationsEmailPassword = { + en: genericComponentOverrideContext.__assign( + genericComponentOverrideContext.__assign( + genericComponentOverrideContext.__assign({}, translations.defaultTranslationsCommon.en), + translations$1.defaultTranslationsEmailVerification.en + ), + { + EMAIL_PASSWORD_EMAIL_LABEL: "Email", + EMAIL_PASSWORD_EMAIL_PLACEHOLDER: "Email address", + EMAIL_PASSWORD_PASSWORD_LABEL: "Password", + EMAIL_PASSWORD_PASSWORD_PLACEHOLDER: "Password", + EMAIL_PASSWORD_SIGN_IN_HEADER_TITLE: "Sign In", + EMAIL_PASSWORD_SIGN_IN_HEADER_SUBTITLE_START: "Not registered yet?", + EMAIL_PASSWORD_SIGN_IN_HEADER_SUBTITLE_SIGN_UP_LINK: "Sign Up", + EMAIL_PASSWORD_SIGN_IN_HEADER_SUBTITLE_END: "", + EMAIL_PASSWORD_SIGN_IN_FOOTER_FORGOT_PW_LINK: "Forgot password?", + EMAIL_PASSWORD_SIGN_IN_SUBMIT_BTN: "SIGN IN", + EMAIL_PASSWORD_SIGN_IN_WRONG_CREDENTIALS_ERROR: "Incorrect email and password combination", + EMAIL_PASSWORD_SIGN_UP_HEADER_TITLE: "Sign Up", + EMAIL_PASSWORD_SIGN_UP_HEADER_SUBTITLE_START: "Already have an account?", + EMAIL_PASSWORD_SIGN_UP_HEADER_SUBTITLE_SIGN_IN_LINK: "Sign In", + EMAIL_PASSWORD_SIGN_UP_HEADER_SUBTITLE_END: "", + EMAIL_PASSWORD_SIGN_UP_FOOTER_START: "By continuing, you agree to our ", + EMAIL_PASSWORD_SIGN_UP_FOOTER_TOS: "Terms of Service", + EMAIL_PASSWORD_SIGN_UP_FOOTER_AND: " and ", + EMAIL_PASSWORD_SIGN_UP_FOOTER_PP: "Privacy Policy", + EMAIL_PASSWORD_SIGN_UP_FOOTER_END: "", + EMAIL_PASSWORD_SIGN_UP_SUBMIT_BTN: "SIGN UP", + EMAIL_PASSWORD_EMAIL_ALREADY_EXISTS: "This email already exists. Please sign in instead", + EMAIL_PASSWORD_RESET_HEADER_TITLE: "Reset your password", + EMAIL_PASSWORD_RESET_HEADER_SUBTITLE: "We will send you an email to reset your password", + EMAIL_PASSWORD_RESET_SEND_FALLBACK_EMAIL: "your account", + EMAIL_PASSWORD_RESET_SEND_BEFORE_EMAIL: "A password reset email has been sent to ", + EMAIL_PASSWORD_RESET_SEND_AFTER_EMAIL: ", if it exists in our system. ", + EMAIL_PASSWORD_RESET_RESEND_LINK: "Resend or change email", + EMAIL_PASSWORD_RESET_SEND_BTN: "Email me", + EMAIL_PASSWORD_RESET_SIGN_IN_LINK: "Sign In", + EMAIL_PASSWORD_RESET_SUBMIT_PW_SUCCESS_HEADER_TITLE: "Success!", + EMAIL_PASSWORD_RESET_SUBMIT_PW_SUCCESS_DESC: "Your password has been updated successfully", + EMAIL_PASSWORD_RESET_SUBMIT_PW_SUCCESS_SIGN_IN_BTN: "SIGN IN", + EMAIL_PASSWORD_NEW_PASSWORD_LABEL: "New password", + EMAIL_PASSWORD_NEW_PASSWORD_PLACEHOLDER: "New password", + EMAIL_PASSWORD_CONFIRM_PASSWORD_LABEL: "Confirm password", + EMAIL_PASSWORD_CONFIRM_PASSWORD_PLACEHOLDER: "Confirm your password", + EMAIL_PASSWORD_RESET_SUBMIT_PW_HEADER_TITLE: "Change your password", + EMAIL_PASSWORD_RESET_SUBMIT_PW_HEADER_SUBTITLE: "Enter a new password below to change your password", + EMAIL_PASSWORD_RESET_SUBMIT_PW_CHANGE_PW_BTN: "CHANGE PASSWORD", + EMAIL_PASSWORD_RESET_PASSWORD_INVALID_TOKEN_ERROR: "Invalid password reset token", + ERROR_EMAIL_NON_STRING: "Email must be of type string", + ERROR_EMAIL_INVALID: "Email is invalid", + ERROR_PASSWORD_NON_STRING: "Password must be of type string", + ERROR_PASSWORD_TOO_SHORT: "Password must contain at least 8 characters, including a number", + ERROR_PASSWORD_TOO_LONG: "Password's length must be lesser than 100 characters", + ERROR_PASSWORD_NO_ALPHA: "Password must contain at least one alphabet", + ERROR_PASSWORD_NO_NUM: "Password must contain at least one number", + ERROR_CONFIRM_PASSWORD_NO_MATCH: "Confirmation password doesn't match", + ERROR_NON_OPTIONAL: "Field is not optional", + /* + * The following are error messages from our backend SDK. + * These are returned as full messages to preserver compatibilty, but they work just like the keys above. + * They are shown as is by default (setting the value to undefined will display the raw translation key) + */ + "This email already exists. Please sign in instead.": undefined, + "Field is not optional": undefined, + "Password must contain at least 8 characters, including a number": undefined, + "Password's length must be lesser than 100 characters": undefined, + "Password must contain at least one alphabet": undefined, + "Password must contain at least one number": undefined, + "Email is invalid": undefined, + "Reset password link was not created because of account take over risk. Please contact support. (ERR_CODE_001)": + undefined, + "Cannot sign up due to security reasons. Please try logging in, use a different login method or contact support. (ERR_CODE_007)": + undefined, + "Cannot sign in due to security reasons. Please try resetting your password, use a different login method or contact support. (ERR_CODE_008)": + undefined, + } + ), +}; + +var ResetPasswordUsingToken$1 = function (props) { + var token = genericComponentOverrideContext.getQueryParams("token"); + var _a = React__namespace.useState(), + error = _a[0], + setError = _a[1]; + var enterEmailFormFeature = props.recipe.config.resetPasswordUsingTokenFeature.enterEmailForm; + var submitNewPasswordFormFeature = props.recipe.config.resetPasswordUsingTokenFeature.submitNewPasswordForm; + var submitNewPasswordForm = + token === undefined || token === null + ? undefined + : { + error: error, + onError: function (error) { + return setError(error); + }, + clearError: function () { + return setError(undefined); + }, + styleFromInit: submitNewPasswordFormFeature.style, + formFields: submitNewPasswordFormFeature.formFields, + recipeImplementation: props.recipe.webJSRecipe, + config: props.recipe.config, + onSignInClicked: function () { + void genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToAuth({ + show: "signin", + history: props.history, + redirectBack: false, + }); + }, + token: token, + }; + var enterEmailForm = { + onBackButtonClicked: function () { + return genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToAuth({ + show: "signin", + history: props.history, + redirectBack: false, + }); + }, + error: error, + onError: function (error) { + return setError(error); + }, + clearError: function () { + return setError(undefined); + }, + styleFromInit: enterEmailFormFeature.style, + formFields: enterEmailFormFeature.formFields, + recipeImplementation: props.recipe.webJSRecipe, + config: props.recipe.config, + }; + var childProps = { + config: props.recipe.config, + submitNewPasswordForm: submitNewPasswordForm, + enterEmailForm: enterEmailForm, + }; + var recipeComponentOverrides = props.useComponentOverrides(); + return jsxRuntime.jsx( + uiEntry.ComponentOverrideContext.Provider, + genericComponentOverrideContext.__assign( + { value: recipeComponentOverrides }, + { + children: jsxRuntime.jsx( + uiEntry.FeatureWrapper, + genericComponentOverrideContext.__assign( + { + useShadowDom: props.recipe.config.useShadowDom, + defaultStore: defaultTranslationsEmailPassword, + }, + { + children: jsxRuntime.jsxs(React.Fragment, { + children: [ + props.children === undefined && + jsxRuntime.jsx( + ResetPasswordUsingTokenThemeWrapper, + genericComponentOverrideContext.__assign({}, childProps) + ), + props.children && + React__namespace.Children.map(props.children, function (child) { + if (React__namespace.isValidElement(child)) { + return React__namespace.cloneElement(child, childProps); + } + return child; + }), + ], + }), + } + ) + ), + } + ) + ); +}; + +var SignInFooter = uiEntry.withOverride("EmailPasswordSignInFooter", function EmailPasswordSignInFooter(_a) { + var onClick = _a.onClick; + var t = translationContext.useTranslation(); + return jsxRuntime.jsx( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "link secondaryText forgotPasswordLink", onClick: onClick }, + { children: t("EMAIL_PASSWORD_SIGN_IN_FOOTER_FORGOT_PW_LINK") } + ) + ); +}); + +var SignInForm = uiEntry.withOverride("EmailPasswordSignInForm", function EmailPasswordSignInForm(props) { + var _this = this; + var userContext = uiEntry.useUserContext(); + return jsxRuntime.jsx(formBase.FormBase, { + formFields: props.formFields, + clearError: props.clearError, + onError: props.onError, + buttonLabel: "EMAIL_PASSWORD_SIGN_IN_SUBMIT_BTN", + onSuccess: props.onSuccess, + callAPI: function (formFields) { + return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { + var validationErrors, response; + return genericComponentOverrideContext.__generator(this, function (_a) { + switch (_a.label) { + case 0: + return [ + 4 /*yield*/, + genericComponentOverrideContext.validateForm( + formFields, + props.config.signInAndUpFeature.signInForm.formFields + ), + ]; + case 1: + validationErrors = _a.sent(); + if (validationErrors.length > 0) { + return [ + 2 /*return*/, + { + status: "FIELD_ERROR", + formFields: validationErrors, + }, + ]; + } + return [ + 4 /*yield*/, + props.recipeImplementation.signIn({ + formFields: formFields, + userContext: userContext, + }), + ]; + case 2: + response = _a.sent(); + if (response.status === "WRONG_CREDENTIALS_ERROR") { + throw new STGeneralError__default.default( + "EMAIL_PASSWORD_SIGN_IN_WRONG_CREDENTIALS_ERROR" + ); + } else if (response.status === "SIGN_IN_NOT_ALLOWED") { + throw new STGeneralError__default.default(response.reason); + } else { + return [2 /*return*/, response]; + } + } + }); + }); + }, + validateOnBlur: false, + showLabels: true, + footer: props.footer, + }); +}); + +var SignInHeader = uiEntry.withOverride("EmailPasswordSignInHeader", function EmailPasswordSignInHeader(_a) { + var onClick = _a.onClick; + var t = translationContext.useTranslation(); + return jsxRuntime.jsxs(React.Fragment, { + children: [ + jsxRuntime.jsx( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "headerTitle" }, + { children: t("EMAIL_PASSWORD_SIGN_IN_HEADER_TITLE") } + ) + ), + jsxRuntime.jsx( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "headerSubtitle" }, + { + children: jsxRuntime.jsxs( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "secondaryText" }, + { + children: [ + t("EMAIL_PASSWORD_SIGN_IN_HEADER_SUBTITLE_START"), + jsxRuntime.jsx( + "span", + genericComponentOverrideContext.__assign( + { "data-supertokens": "link", onClick: onClick }, + { children: t("EMAIL_PASSWORD_SIGN_IN_HEADER_SUBTITLE_SIGN_UP_LINK") } + ) + ), + t("EMAIL_PASSWORD_SIGN_IN_HEADER_SUBTITLE_END"), + ], + } + ) + ), + } + ) + ), + jsxRuntime.jsx("div", { "data-supertokens": "divider" }), + ], + }); +}); + +var SignIn = uiEntry.withOverride("EmailPasswordSignIn", function EmailPasswordSignIn(props) { + return jsxRuntime.jsxs( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "container" }, + { + children: [ + jsxRuntime.jsxs( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "row" }, + { + children: [ + jsxRuntime.jsx(SignInHeader, { onClick: props.signUpClicked }), + props.error !== undefined && + jsxRuntime.jsx(generalError.GeneralError, { error: props.error }), + jsxRuntime.jsx( + SignInForm, + genericComponentOverrideContext.__assign({}, props, { + footer: jsxRuntime.jsx(SignInFooter, { + onClick: props.forgotPasswordClick, + }), + }) + ), + ], + } + ) + ), + jsxRuntime.jsx(SuperTokensBranding.SuperTokensBranding, {}), + ], + } + ) + ); +}); + +var SignUpFooter = uiEntry.withOverride("EmailPasswordSignUpFooter", function EmailPasswordSignUpFooter(_a) { + var termsOfServiceLink = _a.termsOfServiceLink, + privacyPolicyLink = _a.privacyPolicyLink; + var t = translationContext.useTranslation(); + if (termsOfServiceLink === undefined && privacyPolicyLink === undefined) { + return null; + } + return jsxRuntime.jsxs( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "secondaryText privacyPolicyAndTermsAndConditions" }, + { + children: [ + t("EMAIL_PASSWORD_SIGN_UP_FOOTER_START"), + termsOfServiceLink !== undefined && + jsxRuntime.jsx( + "a", + genericComponentOverrideContext.__assign( + { + "data-supertokens": "link", + href: termsOfServiceLink, + target: "_blank", + rel: "noopener noreferer", + }, + { children: t("EMAIL_PASSWORD_SIGN_UP_FOOTER_TOS") } + ) + ), + termsOfServiceLink !== undefined && + privacyPolicyLink !== undefined && + t("EMAIL_PASSWORD_SIGN_UP_FOOTER_AND"), + privacyPolicyLink !== undefined && + jsxRuntime.jsx( + "a", + genericComponentOverrideContext.__assign( + { + "data-supertokens": "link", + href: privacyPolicyLink, + target: "_blank", + rel: "noopener noreferer", + }, + { children: t("EMAIL_PASSWORD_SIGN_UP_FOOTER_PP") } + ) + ), + t("EMAIL_PASSWORD_SIGN_UP_FOOTER_END"), + ], + } + ) + ); +}); + /* * Component. */ -function BackButton(_a) { +var SignUpForm = uiEntry.withOverride("EmailPasswordSignUpForm", function EmailPasswordSignUpForm(props) { + var _this = this; + var userContext = uiEntry.useUserContext(); + return jsxRuntime.jsx(formBase.FormBase, { + formFields: props.formFields, + clearError: props.clearError, + onError: props.onError, + buttonLabel: "EMAIL_PASSWORD_SIGN_UP_SUBMIT_BTN", + onSuccess: props.onSuccess, + callAPI: function (formFields) { + return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { + var validationErrors, res; + return genericComponentOverrideContext.__generator(this, function (_a) { + switch (_a.label) { + case 0: + return [ + 4 /*yield*/, + genericComponentOverrideContext.validateForm( + formFields, + props.config.signInAndUpFeature.signUpForm.formFields + ), + ]; + case 1: + validationErrors = _a.sent(); + if (validationErrors.length > 0) { + return [ + 2 /*return*/, + { + status: "FIELD_ERROR", + formFields: validationErrors, + }, + ]; + } + return [ + 4 /*yield*/, + props.recipeImplementation.signUp({ + formFields: formFields, + userContext: userContext, + }), + ]; + case 2: + res = _a.sent(); + if (res.status === "SIGN_UP_NOT_ALLOWED") { + throw new STGeneralError__default$1.default(res.reason); + } + return [2 /*return*/, res]; + } + }); + }); + }, + validateOnBlur: true, + showLabels: true, + footer: props.footer, + }); +}); + +var SignUpHeader = uiEntry.withOverride("EmailPasswordSignUpHeader", function EmailPasswordSignUpHeader(_a) { var onClick = _a.onClick; + var t = translationContext.useTranslation(); + return jsxRuntime.jsxs(React.Fragment, { + children: [ + jsxRuntime.jsx( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "headerTitle" }, + { children: t("EMAIL_PASSWORD_SIGN_UP_HEADER_TITLE") } + ) + ), + jsxRuntime.jsx( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "headerSubtitle" }, + { + children: jsxRuntime.jsxs( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "secondaryText" }, + { + children: [ + t("EMAIL_PASSWORD_SIGN_UP_HEADER_SUBTITLE_START"), + jsxRuntime.jsx( + "span", + genericComponentOverrideContext.__assign( + { "data-supertokens": "link", onClick: onClick }, + { children: t("EMAIL_PASSWORD_SIGN_UP_HEADER_SUBTITLE_SIGN_IN_LINK") } + ) + ), + t("EMAIL_PASSWORD_SIGN_UP_HEADER_SUBTITLE_END"), + ], + } + ) + ), + } + ) + ), + jsxRuntime.jsx("div", { "data-supertokens": "divider" }), + ], + }); +}); + +var SignUp = uiEntry.withOverride("EmailPasswordSignUp", function EmailPasswordSignUp(props) { + return jsxRuntime.jsxs( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "container" }, + { + children: [ + jsxRuntime.jsxs( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "row" }, + { + children: [ + jsxRuntime.jsx(SignUpHeader, { onClick: props.signInClicked }), + props.error !== undefined && + jsxRuntime.jsx(generalError.GeneralError, { error: props.error }), + jsxRuntime.jsx( + SignUpForm, + genericComponentOverrideContext.__assign({}, props, { + footer: jsxRuntime.jsx(SignUpFooter, { + privacyPolicyLink: + props.config.signInAndUpFeature.signUpForm.privacyPolicyLink, + termsOfServiceLink: + props.config.signInAndUpFeature.signUpForm.termsOfServiceLink, + }), + }) + ), + ], + } + ) + ), + jsxRuntime.jsx(SuperTokensBranding.SuperTokensBranding, {}), + ], + } + ) + ); +}); + +var SignInAndUpTheme = function (props) { + // If isSignUp, return signUp. + if (props.featureState.isSignUp) { + return jsxRuntime.jsx( + SignUp, + genericComponentOverrideContext.__assign({}, props.signUpForm, { + signInClicked: function () { + props.dispatch({ type: "setSignIn" }); + }, + }) + ); + } + // Otherwise, return SignIn. + return jsxRuntime.jsx( + SignIn, + genericComponentOverrideContext.__assign({}, props.signInForm, { + signUpClicked: function () { + props.dispatch({ type: "setSignUp" }); + }, + }) + ); +}; +function SignInAndUpThemeWrapper(props) { + var hasFont = translations.hasFontDefined(props.config.rootStyle); + var activeStyle = props.featureState.isSignUp + ? props.config.signInAndUpFeature.signUpForm.style + : props.config.signInAndUpFeature.signInForm.style; return jsxRuntime.jsx( - "button", + uiEntry.UserContextWrapper, genericComponentOverrideContext.__assign( - { onClick: onClick, "data-supertokens": "backButton backButtonCommon" }, - { children: jsxRuntime.jsx(HeavyArrowLeftIcon, { color: "rgb(var(--palette-textTitle))" }) } + { userContext: props.userContext }, + { + children: jsxRuntime.jsx( + translations$1.ThemeBase, + genericComponentOverrideContext.__assign( + { loadDefaultFont: !hasFont, userStyles: [props.config.rootStyle, activeStyle] }, + { + children: jsxRuntime.jsx( + SignInAndUpTheme, + genericComponentOverrideContext.__assign({}, props) + ), + } + ) + ), + } + ) + ); +} + +var useFeatureReducer = function (recipe) { + return React__namespace.useReducer( + function (oldState, action) { + switch (action.type) { + case "setSignIn": + return genericComponentOverrideContext.__assign( + genericComponentOverrideContext.__assign({}, oldState), + { error: undefined, isSignUp: false } + ); + case "setSignUp": + return genericComponentOverrideContext.__assign( + genericComponentOverrideContext.__assign({}, oldState), + { error: undefined, isSignUp: true } + ); + case "setError": + return genericComponentOverrideContext.__assign( + genericComponentOverrideContext.__assign({}, oldState), + { error: action.error } + ); + default: + return oldState; + } + }, + { + isSignUp: recipe === undefined ? false : recipe.config.signInAndUpFeature.defaultToSignUp, + user: undefined, + error: undefined, + }, + function (initArg) { + var show = genericComponentOverrideContext.getQueryParams("show"); + var isSignUp = initArg.isSignUp; + if (show !== null) { + isSignUp = show === "signup"; + } + return { + isSignUp: isSignUp, + user: undefined, + error: undefined, + }; + } + ); +}; +function useChildProps(recipe$1, state, dispatch, history) { + var _this = this; + var recipeImplementation = React.useMemo( + function () { + return recipe$1 && getModifiedRecipeImplementation(recipe$1.webJSRecipe); + }, + [recipe$1] + ); + var userContext = uiEntry.useUserContext(); + var onSignInSuccess = React.useCallback( + function (response) { + return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { + return genericComponentOverrideContext.__generator(this, function (_a) { + return [ + 2 /*return*/, + recipe.Session.getInstanceOrThrow().validateGlobalClaimsAndHandleSuccessRedirection( + { + rid: recipe$1.config.recipeId, + successRedirectContext: { + action: "SUCCESS", + isNewRecipeUser: false, + user: response.user, + redirectToPath: genericComponentOverrideContext.getRedirectToPathFromURL(), + }, + }, + userContext, + history + ), + ]; + }); + }); + }, + [recipe$1, userContext, history] + ); + var onSignUpSuccess = React.useCallback( + function (response) { + return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { + return genericComponentOverrideContext.__generator(this, function (_a) { + return [ + 2 /*return*/, + recipe.Session.getInstanceOrThrow().validateGlobalClaimsAndHandleSuccessRedirection( + { + rid: recipe$1.config.recipeId, + successRedirectContext: { + action: "SUCCESS", + isNewRecipeUser: true, + user: response.user, + redirectToPath: genericComponentOverrideContext.getRedirectToPathFromURL(), + }, + }, + userContext, + history + ), + ]; + }); + }); + }, + [recipe$1, userContext, history] + ); + return React.useMemo( + function () { + if (recipe$1 === undefined || recipeImplementation === undefined) { + return; + } + var signInAndUpFeature = recipe$1.config.signInAndUpFeature; + var signUpFeature = signInAndUpFeature.signUpForm; + var signInFeature = signInAndUpFeature.signInForm; + var signInForm = { + recipeImplementation: recipeImplementation, + config: recipe$1.config, + styleFromInit: signInFeature.style, + formFields: signInFeature.formFields, + error: state.error, + clearError: function () { + return dispatch({ type: "setError", error: undefined }); + }, + onError: function (error) { + return dispatch({ type: "setError", error: error }); + }, + onSuccess: onSignInSuccess, + forgotPasswordClick: function () { + return recipe$1.redirect({ action: "RESET_PASSWORD" }, history); + }, + }; + var signUpForm = { + recipeImplementation: recipeImplementation, + config: recipe$1.config, + styleFromInit: signUpFeature.style, + formFields: getThemeSignUpFeatureFormFields(signUpFeature.formFields, recipe$1, userContext), + error: state.error, + clearError: function () { + return dispatch({ type: "setError", error: undefined }); + }, + onError: function (error) { + return dispatch({ type: "setError", error: error }); + }, + onSuccess: onSignUpSuccess, + }; + return { + config: recipe$1.config, + signInForm: signInForm, + signUpForm: signUpForm, + }; + }, + [recipe$1, state, dispatch] + ); +} +var SignInAndUpFeature = function (props) { + var _a = useFeatureReducer(props.recipe), + state = _a[0], + dispatch = _a[1]; + var childProps = useChildProps(props.recipe, state, dispatch, props.history); + var recipeComponentOverrides = props.useComponentOverrides(); + return jsxRuntime.jsx( + uiEntry.ComponentOverrideContext.Provider, + genericComponentOverrideContext.__assign( + { value: recipeComponentOverrides }, + { + children: jsxRuntime.jsx( + uiEntry.FeatureWrapper, + genericComponentOverrideContext.__assign( + { + useShadowDom: props.recipe.config.useShadowDom, + defaultStore: defaultTranslationsEmailPassword, + }, + { + children: jsxRuntime.jsxs(React.Fragment, { + children: [ + props.children === undefined && + jsxRuntime.jsx( + SignInAndUpThemeWrapper, + genericComponentOverrideContext.__assign({}, childProps, { + featureState: state, + dispatch: dispatch, + }) + ), + props.children && + React__namespace.Children.map(props.children, function (child) { + if (React__namespace.isValidElement(child)) { + return React__namespace.cloneElement( + child, + genericComponentOverrideContext.__assign( + genericComponentOverrideContext.__assign({}, childProps), + { featureState: state, dispatch: dispatch } + ) + ); + } + return child; + }), + ], + }), + } + ) + ), + } ) ); +}; +var getModifiedRecipeImplementation = function (origImpl) { + return genericComponentOverrideContext.__assign({}, origImpl); +}; +function getThemeSignUpFeatureFormFields(formFields, recipe, userContext) { + var _this = this; + var emailPasswordOnly = formFields.length === 2; + return formFields.map(function (field) { + return genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, field), { + showIsRequired: (function () { + // If email and password only, do not show required indicator (*). + if (emailPasswordOnly) { + return false; + } + // Otherwise, show for all non optional fields (including email and password). + return field.optional === false; + })(), + validate: (function () { + // If field is not email, return field validate unchanged. + if (field.id !== "email") { + return field.validate; + } + // Otherwise, if email, use syntax validate method and check if email exists. + return function (value) { + return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { + var error, emailExists, err_1; + return genericComponentOverrideContext.__generator(this, function (_a) { + switch (_a.label) { + case 0: + return [4 /*yield*/, field.validate(value)]; + case 1: + error = _a.sent(); + if (error !== undefined) { + return [2 /*return*/, error]; + } + if (typeof value !== "string") { + return [2 /*return*/, "GENERAL_ERROR_EMAIL_NON_STRING"]; + } + _a.label = 2; + case 2: + _a.trys.push([2, 4, , 5]); + return [ + 4 /*yield*/, + recipe.webJSRecipe.doesEmailExist({ + email: value, + userContext: userContext, + }), + ]; + case 3: + emailExists = _a.sent().doesExist; + if (emailExists) { + return [2 /*return*/, "EMAIL_PASSWORD_EMAIL_ALREADY_EXISTS"]; + } + return [3 /*break*/, 5]; + case 4: + err_1 = _a.sent(); + if (STGeneralError__default.default.isThisError(err_1)) { + return [2 /*return*/, err_1.message]; + } + return [3 /*break*/, 5]; + case 5: + return [2 /*return*/, undefined]; + } + }); + }); + }; + })(), + }); + }); } -exports.BackButton = BackButton; +var EmailPasswordPreBuiltUI = /** @class */ (function (_super) { + genericComponentOverrideContext.__extends(EmailPasswordPreBuiltUI, _super); + function EmailPasswordPreBuiltUI(recipeInstance) { + var _this = _super.call(this) || this; + _this.recipeInstance = recipeInstance; + // Instance methods + _this.getFeatures = function (useComponentOverrides) { + if (useComponentOverrides === void 0) { + useComponentOverrides = componentOverrideContext.useContext; + } + var features = {}; + if (_this.recipeInstance.config.signInAndUpFeature.disableDefaultUI !== true) { + var normalisedFullPath = _this.recipeInstance.config.appInfo.websiteBasePath.appendPath( + new NormalisedURLPath__default.default("/") + ); + features[normalisedFullPath.getAsStringDangerous()] = { + matches: genericComponentOverrideContext.matchRecipeIdUsingQueryParams( + _this.recipeInstance.config.recipeId + ), + component: function (props) { + return _this.getFeatureComponent("signinup", props, useComponentOverrides); + }, + recipeID: recipe$1.EmailPassword.RECIPE_ID, + }; + } + if (_this.recipeInstance.config.resetPasswordUsingTokenFeature.disableDefaultUI !== true) { + var normalisedFullPath = _this.recipeInstance.config.appInfo.websiteBasePath.appendPath( + new NormalisedURLPath__default.default(constants.DEFAULT_RESET_PASSWORD_PATH) + ); + features[normalisedFullPath.getAsStringDangerous()] = { + matches: genericComponentOverrideContext.matchRecipeIdUsingQueryParams( + _this.recipeInstance.config.recipeId + ), + component: function (props) { + return _this.getFeatureComponent("resetpassword", props, useComponentOverrides); + }, + recipeID: recipe$1.EmailPassword.RECIPE_ID, + }; + } + return features; + }; + _this.getFeatureComponent = function (componentName, props, useComponentOverrides) { + if (useComponentOverrides === void 0) { + useComponentOverrides = componentOverrideContext.useContext; + } + if (componentName === "signinup") { + if (props.redirectOnSessionExists !== false) { + return jsxRuntime.jsx( + uiEntry.UserContextWrapper, + genericComponentOverrideContext.__assign( + { userContext: props.userContext }, + { + children: jsxRuntime.jsx( + authWidgetWrapper.AuthWidgetWrapper, + genericComponentOverrideContext.__assign( + { authRecipe: _this.recipeInstance, history: props.history }, + { + children: jsxRuntime.jsx( + SignInAndUpFeature, + genericComponentOverrideContext.__assign( + { recipe: _this.recipeInstance }, + props, + { useComponentOverrides: useComponentOverrides } + ) + ), + } + ) + ), + } + ) + ); + } else { + return jsxRuntime.jsx( + uiEntry.UserContextWrapper, + genericComponentOverrideContext.__assign( + { userContext: props.userContext }, + { + children: jsxRuntime.jsx( + SignInAndUpFeature, + genericComponentOverrideContext.__assign({ recipe: _this.recipeInstance }, props, { + useComponentOverrides: useComponentOverrides, + }) + ), + } + ) + ); + } + } else if (componentName === "resetpassword") { + return jsxRuntime.jsx( + uiEntry.UserContextWrapper, + genericComponentOverrideContext.__assign( + { userContext: props.userContext }, + { + children: jsxRuntime.jsx( + ResetPasswordUsingToken$1, + genericComponentOverrideContext.__assign({ recipe: _this.recipeInstance }, props, { + useComponentOverrides: useComponentOverrides, + }) + ), + } + ) + ); + } else { + throw new Error("Should never come here."); + } + }; + return _this; + } + // Static methods + EmailPasswordPreBuiltUI.getInstanceOrInitAndGetInstance = function () { + if (EmailPasswordPreBuiltUI.instance === undefined) { + var recipeInstance = recipe$1.EmailPassword.getInstanceOrThrow(); + EmailPasswordPreBuiltUI.instance = new EmailPasswordPreBuiltUI(recipeInstance); + } + return EmailPasswordPreBuiltUI.instance; + }; + EmailPasswordPreBuiltUI.getFeatures = function (useComponentOverrides) { + if (useComponentOverrides === void 0) { + useComponentOverrides = componentOverrideContext.useContext; + } + return EmailPasswordPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatures(useComponentOverrides); + }; + EmailPasswordPreBuiltUI.getFeatureComponent = function (componentName, props, useComponentOverrides) { + if (useComponentOverrides === void 0) { + useComponentOverrides = componentOverrideContext.useContext; + } + return EmailPasswordPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatureComponent( + componentName, + props, + useComponentOverrides + ); + }; + // For tests + EmailPasswordPreBuiltUI.reset = function () { + if (!genericComponentOverrideContext.isTest()) { + return; + } + EmailPasswordPreBuiltUI.instance = undefined; + return; + }; + EmailPasswordPreBuiltUI.SignInAndUp = function (prop) { + if (prop === void 0) { + prop = {}; + } + return EmailPasswordPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatureComponent("signinup", prop); + }; + EmailPasswordPreBuiltUI.ResetPasswordUsingToken = function (prop) { + return EmailPasswordPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatureComponent("resetpassword", prop); + }; + EmailPasswordPreBuiltUI.ResetPasswordUsingTokenTheme = ResetPasswordUsingTokenThemeWrapper; + EmailPasswordPreBuiltUI.SignInAndUpTheme = SignInAndUpThemeWrapper; + return EmailPasswordPreBuiltUI; +})(uiEntry.RecipeRouter); +var SignInAndUp = EmailPasswordPreBuiltUI.SignInAndUp; +var ResetPasswordUsingToken = EmailPasswordPreBuiltUI.ResetPasswordUsingToken; + +exports.EmailPasswordPreBuiltUI = EmailPasswordPreBuiltUI; +exports.ResetPasswordUsingToken = ResetPasswordUsingToken; +exports.ResetPasswordUsingTokenThemeWrapper = ResetPasswordUsingTokenThemeWrapper; +exports.SignInAndUp = SignInAndUp; +exports.SignInAndUpThemeWrapper = SignInAndUpThemeWrapper; +exports.SignInFooter = SignInFooter; +exports.SignInForm = SignInForm; +exports.SignInHeader = SignInHeader; +exports.SignUpFooter = SignUpFooter; +exports.SignUpForm = SignUpForm; +exports.SignUpHeader = SignUpHeader; +exports.defaultTranslationsEmailPassword = defaultTranslationsEmailPassword; +exports.useChildProps = useChildProps; +exports.useFeatureReducer = useFeatureReducer; diff --git a/lib/build/emailpassword-shared8.js b/lib/build/emailpassword-shared8.js index e48dc5334..d2336cadd 100644 --- a/lib/build/emailpassword-shared8.js +++ b/lib/build/emailpassword-shared8.js @@ -2,33 +2,6 @@ var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); var jsxRuntime = require("react/jsx-runtime"); -var React = require("react"); -var STGeneralError = require("supertokens-web-js/utils/error"); -var validators = require("./emailpassword-shared5.js"); -var button = require("./emailpassword-shared2.js"); -require("./index2.js"); -var translationContext = require("./translationContext.js"); - -function _interopDefault(e) { - return e && e.__esModule ? e : { default: e }; -} - -var STGeneralError__default = /*#__PURE__*/ _interopDefault(STGeneralError); - -/* - * Component. - */ -function FormRow(_a) { - var children = _a.children, - hasError = _a.hasError; - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": ["formRow", hasError ? "hasError" : ""].join(" ") }, - { children: children } - ) - ); -} /* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. * @@ -50,798 +23,41 @@ function FormRow(_a) { /* * Component. */ -function CheckedIcon() { +function HeavyArrowLeftIcon(_a) { + var color = _a.color; return jsxRuntime.jsx( "svg", genericComponentOverrideContext.__assign( { xmlns: "http://www.w3.org/2000/svg", - width: "14.862", - height: "12.033", - viewBox: "0 0 14.862 12.033", - "data-supertokens": "checkedIcon", + width: "16", + height: "13", + viewBox: "0 0 16 13", + "data-supertokens": "heavyArrowLeftIcon", }, { children: jsxRuntime.jsx("path", { - fill: "rgb(var(--palette-primary))", - d: "M12.629 49L5.06 56.572l-2.829-2.829L0 55.977l5.057 5.057.654-.651 9.152-9.152z", - transform: "translate(0 -49)", + fill: color, + d: "M13 6.8h.022H3.8l2.9 2.9a.761.761 0 0 1 0 1.07l-.451.451a.754.754 0 0 1-1.064 0L.22 6.254a.759.759 0 0 1 0-1.068L5.186.22a.755.755 0 0 1 1.064 0l.45.451a.746.746 0 0 1 .22.532.724.724 0 0 1-.22.522l-2.93 2.92h9.24a.781.781 0 0 1 .764.773v.638A.766.766 0 0 1 13 6.8z", + transform: "translate(1.182 .708)", }), } ) ); } -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -/* - * Imports. - */ /* * Component. */ -function ErrorIcon() { +function BackButton(_a) { + var onClick = _a.onClick; return jsxRuntime.jsx( - "svg", + "button", genericComponentOverrideContext.__assign( - { - xmlns: "http://www.w3.org/2000/svg", - width: "17", - height: "15", - viewBox: "0 0 17 15", - "data-supertokens": "errorIcon", - }, - { - children: jsxRuntime.jsxs("g", { - children: [ - jsxRuntime.jsx( - "g", - genericComponentOverrideContext.__assign( - { className: "Asdf", fill: "rgb(var(--palette-error))" }, - { - children: jsxRuntime.jsx("path", { - d: "M13.568 14.75H3.432c-.63 0-1.195-.325-1.512-.869-.317-.544-.32-1.196-.01-1.744l5.067-8.943c.315-.556.884-.887 1.523-.887.639 0 1.208.331 1.523.887l5.067 8.943c.31.548.307 1.2-.01 1.744s-.882.869-1.512.869z", - transform: "translate(-824.894 -352.829) translate(824.894 352.829)", - }), - } - ) - ), - jsxRuntime.jsx( - "text", - genericComponentOverrideContext.__assign( - { - fill: "#fff", - fontSize: "10px", - fontWeight: "700", - transform: "translate(-824.894 -352.829) translate(832.014 365.198)", - }, - { - children: jsxRuntime.jsx( - "tspan", - genericComponentOverrideContext.__assign({ x: "0", y: "0" }, { children: "!" }) - ), - } - ) - ), - ], - }), - } + { onClick: onClick, "data-supertokens": "backButton backButtonCommon" }, + { children: jsxRuntime.jsx(HeavyArrowLeftIcon, { color: "rgb(var(--palette-textTitle))" }) } ) ); } -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -/* - * Imports. - */ -/* - * Component. - */ -function ShowPasswordIcon(_a) { - var showPassword = _a.showPassword; - if (showPassword === true) { - return jsxRuntime.jsx("div", { - children: jsxRuntime.jsx( - "svg", - genericComponentOverrideContext.__assign( - { - xmlns: "http://www.w3.org/2000/svg", - width: "18.391", - height: "16.276", - viewBox: "0 0 18.391 16.276", - "data-supertokens": "showPasswordIcon show", - }, - { - children: jsxRuntime.jsxs("g", { - children: [ - jsxRuntime.jsx("g", { - children: jsxRuntime.jsx("g", { - children: jsxRuntime.jsx("g", { - children: jsxRuntime.jsx("path", { - fill: "rgb(var(--palette-textPrimary))", - d: "M29.289 100.33c-2.4-3.63-5.619-5.63-9.069-5.63s-6.67 2-9.069 5.63a.767.767 0 0 0 0 .845c2.4 3.63 5.619 5.63 9.069 5.63s6.67-2 9.069-5.63a.767.767 0 0 0 0-.845zm-9.069 4.944c-2.785 0-5.435-1.6-7.5-4.519 2.065-2.92 4.715-4.519 7.5-4.519s5.435 1.6 7.5 4.519c-2.064 2.92-4.711 4.519-7.5 4.519z", - transform: - "translate(-822 -420.048) translate(822 422.035) translate(-11.025 -94.7)", - }), - }), - }), - }), - jsxRuntime.jsxs( - "g", - genericComponentOverrideContext.__assign( - { - fill: "rgb(var(--palette-textPrimary))", - stroke: "rgb(var(--palette-inputBackground))", - transform: "translate(-822 -420.048) translate(827.164 424.055)", - }, - { - children: [ - jsxRuntime.jsx("circle", { - cx: "4.036", - cy: "4.036", - r: "4.036", - stroke: "none", - }), - jsxRuntime.jsx("circle", { - cx: "4.036", - cy: "4.036", - r: "3.536", - fill: "none", - }), - ], - } - ) - ), - jsxRuntime.jsx("path", { - fill: "none", - stroke: "#707070", - strokeLinecap: "round", - strokeWidth: "2.25px", - d: "M11.981 0L0 11.981", - transform: "translate(-822 -420.048) translate(825.084 421.639)", - }), - jsxRuntime.jsx("path", { - fill: "none", - stroke: "rgb(var(--palette-inputBackground))", - strokeLinecap: "round", - d: "M13.978 0L0 13.978", - transform: "translate(-822 -420.048) translate(825.084 421.639)", - }), - ], - }), - } - ) - ), - }); - } - return jsxRuntime.jsx("div", { - children: jsxRuntime.jsx( - "svg", - genericComponentOverrideContext.__assign( - { - xmlns: "http://www.w3.org/2000/svg", - width: "18.281", - height: "12.033", - viewBox: "0 0 18.281 12.033", - "data-supertokens": "showPasswordIcon hide", - }, - { - children: jsxRuntime.jsxs("g", { - children: [ - jsxRuntime.jsx("g", { - children: jsxRuntime.jsx("g", { - children: jsxRuntime.jsx("g", { - children: jsxRuntime.jsx("path", { - fill: "rgb(var(--palette-textPrimary))", - d: "M29.18 100.3c-2.384-3.608-5.586-5.6-9.015-5.6s-6.63 1.989-9.015 5.6a.763.763 0 0 0 0 .84c2.384 3.608 5.586 5.6 9.015 5.6s6.63-1.989 9.015-5.6a.763.763 0 0 0 0-.84zm-9.015 4.914c-2.769 0-5.4-1.589-7.459-4.492 2.052-2.9 4.686-4.492 7.459-4.492s5.4 1.589 7.459 4.492c-2.056 2.899-4.686 4.489-7.458 4.489z", - transform: - "translate(-822 -422.088) translate(822 422.088) translate(-11.025 -94.7)", - }), - }), - }), - }), - jsxRuntime.jsxs( - "g", - genericComponentOverrideContext.__assign( - { - fill: "rgb(var(--palette-textPrimary))", - stroke: "rgb(var(--palette-inputBackground))", - transform: "translate(-822 -422.088) translate(827.133 424.096)", - }, - { - children: [ - jsxRuntime.jsx("circle", { - cx: "4.012", - cy: "4.012", - r: "4.012", - stroke: "none", - }), - jsxRuntime.jsx("circle", { - cx: "4.012", - cy: "4.012", - r: "3.512", - fill: "none", - }), - ], - } - ) - ), - ], - }), - } - ) - ), - }); -} - -var Input = function (_a) { - var type = _a.type, - name = _a.name, - hasError = _a.hasError, - autoComplete = _a.autoComplete, - onInputFocus = _a.onInputFocus, - onInputBlur = _a.onInputBlur, - onChange = _a.onChange, - value = _a.value, - placeholder = _a.placeholder, - validated = _a.validated, - autofocus = _a.autofocus; - var t = translationContext.useTranslation(); - var _b = React.useState(false), - showPassword = _b[0], - setShowPassword = _b[1]; - /* - * Method. - */ - function handleFocus() { - if (onInputFocus !== undefined) { - onInputFocus(value); - } - } - function handleBlur() { - if (onInputBlur !== undefined) { - onInputBlur(value); - } - } - function handleChange(event) { - if (onChange) { - onChange(event.target.value); - } - } - if (autoComplete === undefined) { - autoComplete = "off"; - } - var inputType = type; - if (type === "password" && showPassword === true) { - inputType = "text"; - } - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "inputContainer" }, - { - children: jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": ["inputWrapper", hasError ? "inputError" : ""].join(" ") }, - { - children: [ - jsxRuntime.jsx("input", { - autoFocus: autofocus, - autoComplete: autoComplete, - "data-supertokens": "input", - className: "supertokens-input", - onFocus: handleFocus, - onBlur: handleBlur, - type: inputType, - name: name, - placeholder: t(placeholder), - onChange: handleChange, - value: value, - }), - hasError === true && - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "inputAdornment inputAdornmentError" }, - { children: jsxRuntime.jsx(ErrorIcon, {}) } - ) - ), - validated === true && - hasError === false && - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "inputAdornment inputAdornmentSuccess" }, - { children: jsxRuntime.jsx(CheckedIcon, {}) } - ) - ), - type === "password" && - value.length > 0 && - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { - onClick: function () { - return setShowPassword(showPassword === false); - }, - "data-supertokens": "inputAdornment showPassword", - }, - { - children: jsxRuntime.jsx(ShowPasswordIcon, { - showPassword: showPassword, - }), - } - ) - ), - ], - } - ) - ), - } - ) - ); -}; - -function InputError(_a) { - var error = _a.error; - var t = translationContext.useTranslation(); - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign({ "data-supertokens": "inputErrorMessage" }, { children: t(error) }) - ); -} - -function Label(_a) { - var value = _a.value, - showIsRequired = _a.showIsRequired; - var t = translationContext.useTranslation(); - return jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "label" }, - { children: [t(value), showIsRequired && value && value.trim() !== "" && " *"] } - ) - ); -} - -var fetchDefaultValue = function (field) { - if (field.getDefaultValue !== undefined) { - var defaultValue = field.getDefaultValue(); - if (typeof defaultValue !== "string") { - throw new Error("getDefaultValue for ".concat(field.id, " must return a string")); - } else { - return defaultValue; - } - } - return ""; -}; -function InputComponentWrapper(props) { - var field = props.field, - type = props.type, - fstate = props.fstate, - onInputFocus = props.onInputFocus, - onInputBlur = props.onInputBlur, - onInputChange = props.onInputChange; - var useCallbackOnInputFocus = React.useCallback( - function (value) { - onInputFocus({ - id: field.id, - value: value, - }); - }, - [onInputFocus, field] - ); - var useCallbackOnInputBlur = React.useCallback( - function (value) { - onInputBlur({ - id: field.id, - value: value, - }); - }, - [onInputBlur, field] - ); - var useCallbackOnInputChange = React.useCallback( - function (value) { - onInputChange({ - id: field.id, - value: value, - }); - }, - [onInputChange, field] - ); - return field.inputComponent !== undefined - ? jsxRuntime.jsx(field.inputComponent, { - type: type, - name: field.id, - validated: fstate.validated === true, - placeholder: field.placeholder, - value: fstate.value, - autoComplete: field.autoComplete, - autofocus: field.autofocus, - onInputFocus: useCallbackOnInputFocus, - onInputBlur: useCallbackOnInputBlur, - onChange: useCallbackOnInputChange, - hasError: fstate.error !== undefined, - }) - : jsxRuntime.jsx(Input, { - type: type, - name: field.id, - validated: fstate.validated === true, - placeholder: field.placeholder, - value: fstate.value, - autoComplete: field.autoComplete, - onInputFocus: useCallbackOnInputFocus, - onInputBlur: useCallbackOnInputBlur, - onChange: useCallbackOnInputChange, - autofocus: field.autofocus, - hasError: fstate.error !== undefined, - }); -} -var FormBase = function (props) { - var footer = props.footer, - buttonLabel = props.buttonLabel, - showLabels = props.showLabels, - validateOnBlur = props.validateOnBlur, - formFields = props.formFields; - var unmounting = React.useRef(new AbortController()); - React.useEffect( - function () { - // We need this because in some cases this gets called multiple times - unmounting.current = new AbortController(); - return function () { - unmounting.current.abort(); - }; - }, - [unmounting] - ); - var _a = React.useState( - props.formFields.map(function (f) { - return { id: f.id, value: fetchDefaultValue(f) }; - }) - ), - fieldStates = _a[0], - setFieldStates = _a[1]; - var _b = React.useState(false), - isLoading = _b[0], - setIsLoading = _b[1]; - var updateFieldState = React.useCallback( - function (id, update) { - setFieldStates(function (os) { - var field = os.find(function (f) { - return f.id === id; - }); - if (field === undefined) { - return genericComponentOverrideContext.__spreadArray( - genericComponentOverrideContext.__spreadArray([], os, true), - [update({ id: id, value: "" })], - false - ); - } - return os - .filter(function (f) { - return f !== field; - }) - .concat(update(field)); - }); - }, - [setFieldStates] - ); - var onInputFocus = React.useCallback( - function (field) { - updateFieldState(field.id, function (os) { - return genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, os), { - validated: false, - }); - }); - }, - [updateFieldState] - ); - var onInputBlur = React.useCallback( - function (field) { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - var fieldConfig, error, _a; - return genericComponentOverrideContext.__generator(this, function (_b) { - switch (_b.label) { - case 0: - if (!validateOnBlur) { - return [2 /*return*/]; - } - fieldConfig = props.formFields.find(function (f) { - return f.id === field.id; - }); - if (!(fieldConfig && field.value !== "")) return [3 /*break*/, 2]; - return [4 /*yield*/, fieldConfig.validate(field.value)]; - case 1: - _a = _b.sent(); - return [3 /*break*/, 3]; - case 2: - _a = undefined; - _b.label = 3; - case 3: - error = _a; - updateFieldState(field.id, function (os) { - return genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, os), - { error: error, validated: error === undefined && field.value.length !== 0 } - ); - }); - return [2 /*return*/]; - } - }); - }); - }, - [validateOnBlur, updateFieldState, props.formFields] - ); - var onInputChange = React.useCallback( - function (field) { - if (typeof field.value !== "string") { - throw new Error("".concat(field.id, " value must be a string")); - } - updateFieldState(field.id, function (os) { - return genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, os), { - value: field.value, - error: undefined, - }); - }); - props.clearError(); - }, - [updateFieldState] - ); - var onFormSubmit = React.useCallback( - function (e) { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - var apiFields, - fieldUpdates, - result, - generalError, - e_1, - _loop_1, - _i, - formFields_1, - field, - errorFields_1, - getErrorMessage_1; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - // Prevent default event propagation. - e.preventDefault(); - // Set loading state. - setIsLoading(true); - setFieldStates(function (os) { - return os.map(function (fs) { - return genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, fs), - { error: undefined } - ); - }); - }); - apiFields = formFields.map(function (field) { - var fieldState = fieldStates.find(function (fs) { - return fs.id === field.id; - }); - return { - id: field.id, - value: fieldState === undefined ? "" : fieldState.value, - }; - }); - fieldUpdates = []; - _a.label = 1; - case 1: - _a.trys.push([1, 6, 7, 8]); - result = void 0; - generalError = void 0; - _a.label = 2; - case 2: - _a.trys.push([2, 4, , 5]); - return [ - 4 /*yield*/, - props.callAPI(apiFields, function (id, value) { - return fieldUpdates.push({ id: id, value: value }); - }), - ]; - case 3: - result = _a.sent(); - return [3 /*break*/, 5]; - case 4: - e_1 = _a.sent(); - if (STGeneralError__default.default.isThisError(e_1)) { - generalError = e_1; - } else { - throw e_1; - } - return [3 /*break*/, 5]; - case 5: - if (unmounting.current.signal.aborted) { - return [2 /*return*/]; - } - _loop_1 = function (field) { - var update = fieldUpdates.find(function (f) { - return f.id === field.id; - }); - if (update || field.clearOnSubmit === true) { - // We can do these one by one, it's almost never more than one field - updateFieldState(field.id, function (os) { - return genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, os), - { value: update ? update.value : "" } - ); - }); - } - }; - for (_i = 0, formFields_1 = formFields; _i < formFields_1.length; _i++) { - field = formFields_1[_i]; - _loop_1(field); - } - if (generalError !== undefined) { - props.onError(generalError.message); - } else { - // If successful - if (result.status === "OK") { - setIsLoading(false); - props.clearError(); - if (props.onSuccess !== undefined) { - props.onSuccess(result); - } - } - if (unmounting.current.signal.aborted) { - return [2 /*return*/]; - } - // If field error. - if (result.status === "FIELD_ERROR") { - errorFields_1 = result.formFields; - getErrorMessage_1 = function (fs) { - var _a; - var errorMessage = - (_a = errorFields_1.find(function (ef) { - return ef.id === fs.id; - })) === null || _a === void 0 - ? void 0 - : _a.error; - if (errorMessage === "Field is not optional") { - var fieldConfigData = props.formFields.find(function (f) { - return f.id === fs.id; - }); - // replace non-optional server error message from nonOptionalErrorMsg - if ( - (fieldConfigData === null || fieldConfigData === void 0 - ? void 0 - : fieldConfigData.nonOptionalErrorMsg) !== undefined - ) { - return fieldConfigData === null || fieldConfigData === void 0 - ? void 0 - : fieldConfigData.nonOptionalErrorMsg; - } - } - return errorMessage; - }; - setFieldStates(function (os) { - return os.map(function (fs) { - return genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, fs), - { error: getErrorMessage_1(fs) } - ); - }); - }); - } - } - return [3 /*break*/, 8]; - case 6: - _a.sent(); - props.onError("SOMETHING_WENT_WRONG_ERROR"); - return [3 /*break*/, 8]; - case 7: - setIsLoading(false); - return [7 /*endfinally*/]; - case 8: - return [2 /*return*/]; - } - }); - }); - }, - [setIsLoading, setFieldStates, props, formFields, fieldStates] - ); - return jsxRuntime.jsxs( - "form", - genericComponentOverrideContext.__assign( - { autoComplete: "on", noValidate: true, onSubmit: onFormSubmit }, - { - children: [ - formFields.map(function (field) { - var type = "text"; - // If email or password, replace field type. - if (validators.MANDATORY_FORM_FIELDS_ID_ARRAY.includes(field.id)) { - type = field.id; - } - if (field.id === "confirm-password") { - type = "password"; - } - var fstate = fieldStates.find(function (s) { - return s.id === field.id; - }); - if (fstate === undefined) { - throw new Error("Should never come here"); - } - return jsxRuntime.jsx( - FormRow, - genericComponentOverrideContext.__assign( - { hasError: fstate.error !== undefined }, - { - children: jsxRuntime.jsxs(React.Fragment, { - children: [ - showLabels && - (field.labelComponent !== undefined - ? field.labelComponent - : jsxRuntime.jsx(Label, { - value: field.label, - showIsRequired: field.showIsRequired, - })), - jsxRuntime.jsx(InputComponentWrapper, { - type: type, - field: field, - fstate: fstate, - onInputFocus: onInputFocus, - onInputBlur: onInputBlur, - onInputChange: onInputChange, - }), - fstate.error && jsxRuntime.jsx(InputError, { error: fstate.error }), - ], - }), - } - ), - field.id - ); - }), - jsxRuntime.jsx( - FormRow, - { - children: jsxRuntime.jsxs(React.Fragment, { - children: [ - jsxRuntime.jsx(button.Button, { - disabled: isLoading, - isLoading: isLoading, - type: "submit", - label: buttonLabel, - }), - footer, - ], - }), - }, - "form-button" - ), - ], - } - ) - ); -}; - -exports.ErrorIcon = ErrorIcon; -exports.FormBase = FormBase; -exports.FormRow = FormRow; -exports.Label = Label; +exports.BackButton = BackButton; diff --git a/lib/build/emailpassword-shared9.js b/lib/build/emailpassword-shared9.js new file mode 100644 index 000000000..51eb9af1f --- /dev/null +++ b/lib/build/emailpassword-shared9.js @@ -0,0 +1,847 @@ +"use strict"; + +var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); +var jsxRuntime = require("react/jsx-runtime"); +var React = require("react"); +var STGeneralError = require("supertokens-web-js/utils/error"); +var constants = require("./emailpassword-shared5.js"); +var button = require("./emailpassword-shared2.js"); +require("./index2.js"); +var translationContext = require("./translationContext.js"); + +function _interopDefault(e) { + return e && e.__esModule ? e : { default: e }; +} + +var STGeneralError__default = /*#__PURE__*/ _interopDefault(STGeneralError); + +/* + * Component. + */ +function FormRow(_a) { + var children = _a.children, + hasError = _a.hasError; + return jsxRuntime.jsx( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": ["formRow", hasError ? "hasError" : ""].join(" ") }, + { children: children } + ) + ); +} + +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +/* + * Imports. + */ +/* + * Component. + */ +function CheckedIcon() { + return jsxRuntime.jsx( + "svg", + genericComponentOverrideContext.__assign( + { + xmlns: "http://www.w3.org/2000/svg", + width: "14.862", + height: "12.033", + viewBox: "0 0 14.862 12.033", + "data-supertokens": "checkedIcon", + }, + { + children: jsxRuntime.jsx("path", { + fill: "rgb(var(--palette-primary))", + d: "M12.629 49L5.06 56.572l-2.829-2.829L0 55.977l5.057 5.057.654-.651 9.152-9.152z", + transform: "translate(0 -49)", + }), + } + ) + ); +} + +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +/* + * Imports. + */ +/* + * Component. + */ +function ErrorIcon() { + return jsxRuntime.jsx( + "svg", + genericComponentOverrideContext.__assign( + { + xmlns: "http://www.w3.org/2000/svg", + width: "17", + height: "15", + viewBox: "0 0 17 15", + "data-supertokens": "errorIcon", + }, + { + children: jsxRuntime.jsxs("g", { + children: [ + jsxRuntime.jsx( + "g", + genericComponentOverrideContext.__assign( + { className: "Asdf", fill: "rgb(var(--palette-error))" }, + { + children: jsxRuntime.jsx("path", { + d: "M13.568 14.75H3.432c-.63 0-1.195-.325-1.512-.869-.317-.544-.32-1.196-.01-1.744l5.067-8.943c.315-.556.884-.887 1.523-.887.639 0 1.208.331 1.523.887l5.067 8.943c.31.548.307 1.2-.01 1.744s-.882.869-1.512.869z", + transform: "translate(-824.894 -352.829) translate(824.894 352.829)", + }), + } + ) + ), + jsxRuntime.jsx( + "text", + genericComponentOverrideContext.__assign( + { + fill: "#fff", + fontSize: "10px", + fontWeight: "700", + transform: "translate(-824.894 -352.829) translate(832.014 365.198)", + }, + { + children: jsxRuntime.jsx( + "tspan", + genericComponentOverrideContext.__assign({ x: "0", y: "0" }, { children: "!" }) + ), + } + ) + ), + ], + }), + } + ) + ); +} + +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +/* + * Imports. + */ +/* + * Component. + */ +function ShowPasswordIcon(_a) { + var showPassword = _a.showPassword; + if (showPassword === true) { + return jsxRuntime.jsx("div", { + children: jsxRuntime.jsx( + "svg", + genericComponentOverrideContext.__assign( + { + xmlns: "http://www.w3.org/2000/svg", + width: "18.391", + height: "16.276", + viewBox: "0 0 18.391 16.276", + "data-supertokens": "showPasswordIcon show", + }, + { + children: jsxRuntime.jsxs("g", { + children: [ + jsxRuntime.jsx("g", { + children: jsxRuntime.jsx("g", { + children: jsxRuntime.jsx("g", { + children: jsxRuntime.jsx("path", { + fill: "rgb(var(--palette-textPrimary))", + d: "M29.289 100.33c-2.4-3.63-5.619-5.63-9.069-5.63s-6.67 2-9.069 5.63a.767.767 0 0 0 0 .845c2.4 3.63 5.619 5.63 9.069 5.63s6.67-2 9.069-5.63a.767.767 0 0 0 0-.845zm-9.069 4.944c-2.785 0-5.435-1.6-7.5-4.519 2.065-2.92 4.715-4.519 7.5-4.519s5.435 1.6 7.5 4.519c-2.064 2.92-4.711 4.519-7.5 4.519z", + transform: + "translate(-822 -420.048) translate(822 422.035) translate(-11.025 -94.7)", + }), + }), + }), + }), + jsxRuntime.jsxs( + "g", + genericComponentOverrideContext.__assign( + { + fill: "rgb(var(--palette-textPrimary))", + stroke: "rgb(var(--palette-inputBackground))", + transform: "translate(-822 -420.048) translate(827.164 424.055)", + }, + { + children: [ + jsxRuntime.jsx("circle", { + cx: "4.036", + cy: "4.036", + r: "4.036", + stroke: "none", + }), + jsxRuntime.jsx("circle", { + cx: "4.036", + cy: "4.036", + r: "3.536", + fill: "none", + }), + ], + } + ) + ), + jsxRuntime.jsx("path", { + fill: "none", + stroke: "#707070", + strokeLinecap: "round", + strokeWidth: "2.25px", + d: "M11.981 0L0 11.981", + transform: "translate(-822 -420.048) translate(825.084 421.639)", + }), + jsxRuntime.jsx("path", { + fill: "none", + stroke: "rgb(var(--palette-inputBackground))", + strokeLinecap: "round", + d: "M13.978 0L0 13.978", + transform: "translate(-822 -420.048) translate(825.084 421.639)", + }), + ], + }), + } + ) + ), + }); + } + return jsxRuntime.jsx("div", { + children: jsxRuntime.jsx( + "svg", + genericComponentOverrideContext.__assign( + { + xmlns: "http://www.w3.org/2000/svg", + width: "18.281", + height: "12.033", + viewBox: "0 0 18.281 12.033", + "data-supertokens": "showPasswordIcon hide", + }, + { + children: jsxRuntime.jsxs("g", { + children: [ + jsxRuntime.jsx("g", { + children: jsxRuntime.jsx("g", { + children: jsxRuntime.jsx("g", { + children: jsxRuntime.jsx("path", { + fill: "rgb(var(--palette-textPrimary))", + d: "M29.18 100.3c-2.384-3.608-5.586-5.6-9.015-5.6s-6.63 1.989-9.015 5.6a.763.763 0 0 0 0 .84c2.384 3.608 5.586 5.6 9.015 5.6s6.63-1.989 9.015-5.6a.763.763 0 0 0 0-.84zm-9.015 4.914c-2.769 0-5.4-1.589-7.459-4.492 2.052-2.9 4.686-4.492 7.459-4.492s5.4 1.589 7.459 4.492c-2.056 2.899-4.686 4.489-7.458 4.489z", + transform: + "translate(-822 -422.088) translate(822 422.088) translate(-11.025 -94.7)", + }), + }), + }), + }), + jsxRuntime.jsxs( + "g", + genericComponentOverrideContext.__assign( + { + fill: "rgb(var(--palette-textPrimary))", + stroke: "rgb(var(--palette-inputBackground))", + transform: "translate(-822 -422.088) translate(827.133 424.096)", + }, + { + children: [ + jsxRuntime.jsx("circle", { + cx: "4.012", + cy: "4.012", + r: "4.012", + stroke: "none", + }), + jsxRuntime.jsx("circle", { + cx: "4.012", + cy: "4.012", + r: "3.512", + fill: "none", + }), + ], + } + ) + ), + ], + }), + } + ) + ), + }); +} + +var Input = function (_a) { + var type = _a.type, + name = _a.name, + hasError = _a.hasError, + autoComplete = _a.autoComplete, + onInputFocus = _a.onInputFocus, + onInputBlur = _a.onInputBlur, + onChange = _a.onChange, + value = _a.value, + placeholder = _a.placeholder, + validated = _a.validated, + autofocus = _a.autofocus; + var t = translationContext.useTranslation(); + var _b = React.useState(false), + showPassword = _b[0], + setShowPassword = _b[1]; + /* + * Method. + */ + function handleFocus() { + if (onInputFocus !== undefined) { + onInputFocus(value); + } + } + function handleBlur() { + if (onInputBlur !== undefined) { + onInputBlur(value); + } + } + function handleChange(event) { + if (onChange) { + onChange(event.target.value); + } + } + if (autoComplete === undefined) { + autoComplete = "off"; + } + var inputType = type; + if (type === "password" && showPassword === true) { + inputType = "text"; + } + return jsxRuntime.jsx( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "inputContainer" }, + { + children: jsxRuntime.jsxs( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": ["inputWrapper", hasError ? "inputError" : ""].join(" ") }, + { + children: [ + jsxRuntime.jsx("input", { + autoFocus: autofocus, + autoComplete: autoComplete, + "data-supertokens": "input", + className: "supertokens-input", + onFocus: handleFocus, + onBlur: handleBlur, + type: inputType, + name: name, + placeholder: t(placeholder), + onChange: handleChange, + value: value, + }), + hasError === true && + jsxRuntime.jsx( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "inputAdornment inputAdornmentError" }, + { children: jsxRuntime.jsx(ErrorIcon, {}) } + ) + ), + validated === true && + hasError === false && + jsxRuntime.jsx( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "inputAdornment inputAdornmentSuccess" }, + { children: jsxRuntime.jsx(CheckedIcon, {}) } + ) + ), + type === "password" && + value.length > 0 && + jsxRuntime.jsx( + "div", + genericComponentOverrideContext.__assign( + { + onClick: function () { + return setShowPassword(showPassword === false); + }, + "data-supertokens": "inputAdornment showPassword", + }, + { + children: jsxRuntime.jsx(ShowPasswordIcon, { + showPassword: showPassword, + }), + } + ) + ), + ], + } + ) + ), + } + ) + ); +}; + +function InputError(_a) { + var error = _a.error; + var t = translationContext.useTranslation(); + return jsxRuntime.jsx( + "div", + genericComponentOverrideContext.__assign({ "data-supertokens": "inputErrorMessage" }, { children: t(error) }) + ); +} + +function Label(_a) { + var value = _a.value, + showIsRequired = _a.showIsRequired; + var t = translationContext.useTranslation(); + return jsxRuntime.jsxs( + "div", + genericComponentOverrideContext.__assign( + { "data-supertokens": "label" }, + { children: [t(value), showIsRequired && value && value.trim() !== "" && " *"] } + ) + ); +} + +var fetchDefaultValue = function (field) { + if (field.getDefaultValue !== undefined) { + var defaultValue = field.getDefaultValue(); + if (typeof defaultValue !== "string") { + throw new Error("getDefaultValue for ".concat(field.id, " must return a string")); + } else { + return defaultValue; + } + } + return ""; +}; +function InputComponentWrapper(props) { + var field = props.field, + type = props.type, + fstate = props.fstate, + onInputFocus = props.onInputFocus, + onInputBlur = props.onInputBlur, + onInputChange = props.onInputChange; + var useCallbackOnInputFocus = React.useCallback( + function (value) { + onInputFocus({ + id: field.id, + value: value, + }); + }, + [onInputFocus, field] + ); + var useCallbackOnInputBlur = React.useCallback( + function (value) { + onInputBlur({ + id: field.id, + value: value, + }); + }, + [onInputBlur, field] + ); + var useCallbackOnInputChange = React.useCallback( + function (value) { + onInputChange({ + id: field.id, + value: value, + }); + }, + [onInputChange, field] + ); + return field.inputComponent !== undefined + ? jsxRuntime.jsx(field.inputComponent, { + type: type, + name: field.id, + validated: fstate.validated === true, + placeholder: field.placeholder, + value: fstate.value, + autoComplete: field.autoComplete, + autofocus: field.autofocus, + onInputFocus: useCallbackOnInputFocus, + onInputBlur: useCallbackOnInputBlur, + onChange: useCallbackOnInputChange, + hasError: fstate.error !== undefined, + }) + : jsxRuntime.jsx(Input, { + type: type, + name: field.id, + validated: fstate.validated === true, + placeholder: field.placeholder, + value: fstate.value, + autoComplete: field.autoComplete, + onInputFocus: useCallbackOnInputFocus, + onInputBlur: useCallbackOnInputBlur, + onChange: useCallbackOnInputChange, + autofocus: field.autofocus, + hasError: fstate.error !== undefined, + }); +} +var FormBase = function (props) { + var footer = props.footer, + buttonLabel = props.buttonLabel, + showLabels = props.showLabels, + validateOnBlur = props.validateOnBlur, + formFields = props.formFields; + var unmounting = React.useRef(new AbortController()); + React.useEffect( + function () { + // We need this because in some cases this gets called multiple times + unmounting.current = new AbortController(); + return function () { + unmounting.current.abort(); + }; + }, + [unmounting] + ); + var _a = React.useState( + props.formFields.map(function (f) { + return { id: f.id, value: fetchDefaultValue(f) }; + }) + ), + fieldStates = _a[0], + setFieldStates = _a[1]; + var _b = React.useState(false), + isLoading = _b[0], + setIsLoading = _b[1]; + var updateFieldState = React.useCallback( + function (id, update) { + setFieldStates(function (os) { + var field = os.find(function (f) { + return f.id === id; + }); + if (field === undefined) { + return genericComponentOverrideContext.__spreadArray( + genericComponentOverrideContext.__spreadArray([], os, true), + [update({ id: id, value: "" })], + false + ); + } + return os + .filter(function (f) { + return f !== field; + }) + .concat(update(field)); + }); + }, + [setFieldStates] + ); + var onInputFocus = React.useCallback( + function (field) { + updateFieldState(field.id, function (os) { + return genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, os), { + validated: false, + }); + }); + }, + [updateFieldState] + ); + var onInputBlur = React.useCallback( + function (field) { + return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { + var fieldConfig, error, _a; + return genericComponentOverrideContext.__generator(this, function (_b) { + switch (_b.label) { + case 0: + if (!validateOnBlur) { + return [2 /*return*/]; + } + fieldConfig = props.formFields.find(function (f) { + return f.id === field.id; + }); + if (!(fieldConfig && field.value !== "")) return [3 /*break*/, 2]; + return [4 /*yield*/, fieldConfig.validate(field.value)]; + case 1: + _a = _b.sent(); + return [3 /*break*/, 3]; + case 2: + _a = undefined; + _b.label = 3; + case 3: + error = _a; + updateFieldState(field.id, function (os) { + return genericComponentOverrideContext.__assign( + genericComponentOverrideContext.__assign({}, os), + { error: error, validated: error === undefined && field.value.length !== 0 } + ); + }); + return [2 /*return*/]; + } + }); + }); + }, + [validateOnBlur, updateFieldState, props.formFields] + ); + var onInputChange = React.useCallback( + function (field) { + if (typeof field.value !== "string") { + throw new Error("".concat(field.id, " value must be a string")); + } + updateFieldState(field.id, function (os) { + return genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, os), { + value: field.value, + error: undefined, + }); + }); + props.clearError(); + }, + [updateFieldState] + ); + var onFormSubmit = React.useCallback( + function (e) { + return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { + var apiFields, + fieldUpdates, + result, + generalError, + e_1, + _loop_1, + _i, + formFields_1, + field, + errorFields_1, + getErrorMessage_1; + return genericComponentOverrideContext.__generator(this, function (_a) { + switch (_a.label) { + case 0: + // Prevent default event propagation. + e.preventDefault(); + // Set loading state. + setIsLoading(true); + setFieldStates(function (os) { + return os.map(function (fs) { + return genericComponentOverrideContext.__assign( + genericComponentOverrideContext.__assign({}, fs), + { error: undefined } + ); + }); + }); + apiFields = formFields.map(function (field) { + var fieldState = fieldStates.find(function (fs) { + return fs.id === field.id; + }); + return { + id: field.id, + value: fieldState === undefined ? "" : fieldState.value, + }; + }); + fieldUpdates = []; + _a.label = 1; + case 1: + _a.trys.push([1, 6, 7, 8]); + result = void 0; + generalError = void 0; + _a.label = 2; + case 2: + _a.trys.push([2, 4, , 5]); + return [ + 4 /*yield*/, + props.callAPI(apiFields, function (id, value) { + return fieldUpdates.push({ id: id, value: value }); + }), + ]; + case 3: + result = _a.sent(); + return [3 /*break*/, 5]; + case 4: + e_1 = _a.sent(); + if (STGeneralError__default.default.isThisError(e_1)) { + generalError = e_1; + } else { + throw e_1; + } + return [3 /*break*/, 5]; + case 5: + if (unmounting.current.signal.aborted) { + return [2 /*return*/]; + } + _loop_1 = function (field) { + var update = fieldUpdates.find(function (f) { + return f.id === field.id; + }); + if (update || field.clearOnSubmit === true) { + // We can do these one by one, it's almost never more than one field + updateFieldState(field.id, function (os) { + return genericComponentOverrideContext.__assign( + genericComponentOverrideContext.__assign({}, os), + { value: update ? update.value : "" } + ); + }); + } + }; + for (_i = 0, formFields_1 = formFields; _i < formFields_1.length; _i++) { + field = formFields_1[_i]; + _loop_1(field); + } + if (generalError !== undefined) { + props.onError(generalError.message); + } else { + // If successful + if (result.status === "OK") { + setIsLoading(false); + props.clearError(); + if (props.onSuccess !== undefined) { + props.onSuccess(result); + } + } + if (unmounting.current.signal.aborted) { + return [2 /*return*/]; + } + // If field error. + if (result.status === "FIELD_ERROR") { + errorFields_1 = result.formFields; + getErrorMessage_1 = function (fs) { + var _a; + var errorMessage = + (_a = errorFields_1.find(function (ef) { + return ef.id === fs.id; + })) === null || _a === void 0 + ? void 0 + : _a.error; + if (errorMessage === "Field is not optional") { + var fieldConfigData = props.formFields.find(function (f) { + return f.id === fs.id; + }); + // replace non-optional server error message from nonOptionalErrorMsg + if ( + (fieldConfigData === null || fieldConfigData === void 0 + ? void 0 + : fieldConfigData.nonOptionalErrorMsg) !== undefined + ) { + return fieldConfigData === null || fieldConfigData === void 0 + ? void 0 + : fieldConfigData.nonOptionalErrorMsg; + } + } + return errorMessage; + }; + setFieldStates(function (os) { + return os.map(function (fs) { + return genericComponentOverrideContext.__assign( + genericComponentOverrideContext.__assign({}, fs), + { error: getErrorMessage_1(fs) } + ); + }); + }); + } + } + return [3 /*break*/, 8]; + case 6: + _a.sent(); + props.onError("SOMETHING_WENT_WRONG_ERROR"); + return [3 /*break*/, 8]; + case 7: + setIsLoading(false); + return [7 /*endfinally*/]; + case 8: + return [2 /*return*/]; + } + }); + }); + }, + [setIsLoading, setFieldStates, props, formFields, fieldStates] + ); + return jsxRuntime.jsxs( + "form", + genericComponentOverrideContext.__assign( + { autoComplete: "on", noValidate: true, onSubmit: onFormSubmit }, + { + children: [ + formFields.map(function (field) { + var type = "text"; + // If email or password, replace field type. + if (constants.MANDATORY_FORM_FIELDS_ID_ARRAY.includes(field.id)) { + type = field.id; + } + if (field.id === "confirm-password") { + type = "password"; + } + var fstate = fieldStates.find(function (s) { + return s.id === field.id; + }); + if (fstate === undefined) { + throw new Error("Should never come here"); + } + return jsxRuntime.jsx( + FormRow, + genericComponentOverrideContext.__assign( + { hasError: fstate.error !== undefined }, + { + children: jsxRuntime.jsxs(React.Fragment, { + children: [ + showLabels && + (field.labelComponent !== undefined + ? field.labelComponent + : jsxRuntime.jsx(Label, { + value: field.label, + showIsRequired: field.showIsRequired, + })), + jsxRuntime.jsx(InputComponentWrapper, { + type: type, + field: field, + fstate: fstate, + onInputFocus: onInputFocus, + onInputBlur: onInputBlur, + onInputChange: onInputChange, + }), + fstate.error && jsxRuntime.jsx(InputError, { error: fstate.error }), + ], + }), + } + ), + field.id + ); + }), + jsxRuntime.jsx( + FormRow, + { + children: jsxRuntime.jsxs(React.Fragment, { + children: [ + jsxRuntime.jsx(button.Button, { + disabled: isLoading, + isLoading: isLoading, + type: "submit", + label: buttonLabel, + }), + footer, + ], + }), + }, + "form-button" + ), + ], + } + ) + ); +}; + +exports.ErrorIcon = ErrorIcon; +exports.FormBase = FormBase; +exports.FormRow = FormRow; +exports.Label = Label; diff --git a/lib/build/emailpassword.js b/lib/build/emailpassword.js index 54ade2cbb..784e001ea 100644 --- a/lib/build/emailpassword.js +++ b/lib/build/emailpassword.js @@ -21,6 +21,7 @@ require("./recipeModule-shared.js"); require("./session-shared2.js"); require("supertokens-web-js/recipe/session"); require("./emailpassword-shared5.js"); +require("./emailpassword-shared6.js"); /* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. * diff --git a/lib/build/emailpasswordprebuiltui.js b/lib/build/emailpasswordprebuiltui.js index 58e98cf2d..df890d7e1 100644 --- a/lib/build/emailpasswordprebuiltui.js +++ b/lib/build/emailpasswordprebuiltui.js @@ -6,7 +6,7 @@ require("supertokens-web-js/utils/normalisedURLPath"); require("./index2.js"); require("./authRecipe-shared2.js"); require("./emailpassword-shared3.js"); -var emailpasswordprebuiltui = require("./emailpassword-shared6.js"); +var emailpasswordprebuiltui = require("./emailpassword-shared7.js"); require("./emailpassword-shared5.js"); require("./emailpassword-shared4.js"); require("supertokens-web-js"); @@ -30,9 +30,9 @@ require("./session-shared.js"); require("./session-shared3.js"); require("./translations.js"); require("./emailverification-shared2.js"); -require("./emailpassword-shared7.js"); -require("./arrowLeftIcon.js"); require("./emailpassword-shared8.js"); +require("./arrowLeftIcon.js"); +require("./emailpassword-shared9.js"); require("supertokens-web-js/utils/error"); require("./emailpassword-shared2.js"); require("./emailpassword-shared.js"); @@ -40,6 +40,7 @@ require("./SuperTokensBranding.js"); require("supertokens-web-js/lib/build/error"); require("supertokens-web-js/recipe/emailpassword"); require("./authRecipe-shared.js"); +require("./emailpassword-shared6.js"); exports.EmailPasswordPreBuiltUI = emailpasswordprebuiltui.EmailPasswordPreBuiltUI; exports.ResetPasswordUsingToken = emailpasswordprebuiltui.ResetPasswordUsingToken; diff --git a/lib/build/index2.js b/lib/build/index2.js index cfcf81a7d..d7f1150c5 100644 --- a/lib/build/index2.js +++ b/lib/build/index2.js @@ -276,7 +276,7 @@ var withOverride = function (overrideKey, DefaultComponent) { }; var styles = - '[data-supertokens~="container"] {\n --palette-background: 255, 255, 255;\n --palette-inputBackground: 250, 250, 250;\n --palette-inputBorder: 224, 224, 224;\n --palette-primary: 255, 155, 51;\n --palette-primaryBorder: 238, 141, 35;\n --palette-success: 65, 167, 0;\n --palette-successBackground: 217, 255, 191;\n --palette-error: 255, 23, 23;\n --palette-errorBackground: 255, 241, 235;\n --palette-textTitle: 34, 34, 34;\n --palette-textLabel: 34, 34, 34;\n --palette-textInput: 34, 34, 34;\n --palette-textPrimary: 101, 101, 101;\n --palette-textLink: 0, 118, 255;\n --palette-buttonText: 255, 255, 255;\n --palette-textGray: 128, 128, 128;\n --palette-superTokensBrandingBackground: 242, 245, 246;\n --palette-superTokensBrandingText: 173, 189, 196;\n\n --font-size-0: 12px;\n --font-size-1: 14px;\n --font-size-2: 16px;\n --font-size-3: 19px;\n --font-size-4: 24px;\n}\n/*\n * Default styles.\n */\n@-webkit-keyframes slideTop {\n 0% {\n -webkit-transform: translateY(-5px);\n transform: translateY(-5px);\n }\n 100% {\n -webkit-transform: translateY(0px);\n transform: translateY(0px);\n }\n}\n@keyframes slideTop {\n 0% {\n -webkit-transform: translateY(-5px);\n transform: translateY(-5px);\n }\n 100% {\n -webkit-transform: translateY(0px);\n transform: translateY(0px);\n }\n}\n@-webkit-keyframes swing-in-top-fwd {\n 0% {\n -webkit-transform: rotateX(-100deg);\n transform: rotateX(-100deg);\n -webkit-transform-origin: top;\n transform-origin: top;\n opacity: 0;\n }\n 100% {\n -webkit-transform: rotateX(0deg);\n transform: rotateX(0deg);\n -webkit-transform-origin: top;\n transform-origin: top;\n opacity: 1;\n }\n}\n@keyframes swing-in-top-fwd {\n 0% {\n -webkit-transform: rotateX(-100deg);\n transform: rotateX(-100deg);\n -webkit-transform-origin: top;\n transform-origin: top;\n opacity: 0;\n }\n 100% {\n -webkit-transform: rotateX(0deg);\n transform: rotateX(0deg);\n -webkit-transform-origin: top;\n transform-origin: top;\n opacity: 1;\n }\n}\n[data-supertokens~="container"] {\n font-family: "Rubik", sans-serif;\n margin: 12px auto;\n margin-top: 26px;\n margin-bottom: 26px;\n width: 420px;\n text-align: center;\n border-radius: 8px;\n box-shadow: 1px 1px 10px rgba(0, 0, 0, 0.16);\n background-color: rgb(var(--palette-background));\n}\n@media (max-width: 440px) {\n [data-supertokens~="container"] {\n width: 95vw;\n }\n}\n[data-supertokens~="row"] {\n margin: 0 auto;\n width: 76%;\n padding-top: 30px;\n padding-bottom: 10px;\n}\n[data-supertokens~="superTokensBranding"] {\n display: block;\n margin: 0 auto;\n background: rgb(var(--palette-superTokensBrandingBackground));\n color: rgb(var(--palette-superTokensBrandingText));\n text-decoration: none;\n width: -webkit-fit-content;\n width: -moz-fit-content;\n width: fit-content;\n border-radius: 6px 6px 0 0;\n padding: 4px 9px;\n font-weight: 400;\n font-size: var(--font-size-0);\n letter-spacing: 0.4px;\n}\n[data-supertokens~="generalError"] {\n background: rgb(var(--palette-errorBackground));\n padding-top: 10px;\n padding-bottom: 10px;\n margin-bottom: 15px;\n padding-left: 18px;\n padding-right: 18px;\n letter-spacing: 0.2px;\n font-size: var(--font-size-1);\n border-radius: 8px;\n color: rgb(var(--palette-error));\n -webkit-animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n word-wrap: break-word;\n}\n[data-supertokens~="headerTitle"] {\n font-size: var(--font-size-4);\n line-height: 40px;\n letter-spacing: 0.58px;\n font-weight: 600;\n margin-bottom: 2px;\n color: rgb(var(--palette-textTitle));\n}\n[data-supertokens~="headerSubtitle"] {\n font-weight: 400;\n margin-bottom: 21px;\n}\n[data-supertokens~="headerSubtitle"][data-supertokens~="secondaryText"] {\n font-weight: 400;\n}\n[data-supertokens~="privacyPolicyAndTermsAndConditions"] {\n max-width: 300px;\n margin-top: 10px;\n}\n[data-supertokens~="privacyPolicyAndTermsAndConditions"] a {\n line-height: 21px;\n}\n/* TODO: split the link style into separate things*/\n/* We add this before primary and secondary text, because if they are applied to the same element the other ones take priority */\n[data-supertokens~="link"] {\n padding-left: 3px;\n padding-right: 3px;\n color: rgb(var(--palette-textLink));\n font-size: var(--font-size-1);\n cursor: pointer;\n letter-spacing: 0.16px;\n line-height: 26px;\n}\n[data-supertokens~="primaryText"] {\n font-size: var(--font-size-1);\n font-weight: 500;\n letter-spacing: 0.4px;\n line-height: 21px;\n color: rgb(var(--palette-textLabel));\n}\n[data-supertokens~="secondaryText"] {\n font-size: var(--font-size-1);\n font-weight: 300;\n letter-spacing: 0.4px;\n color: rgb(var(--palette-textPrimary));\n}\n[data-supertokens~="divider"] {\n margin-top: 1em;\n margin-bottom: 1em;\n border-bottom: 0.3px solid #dddddd;\n align-items: center;\n padding-bottom: 5px;\n}\n[data-supertokens~="headerTinyTitle"] {\n margin-top: 13px;\n font-size: var(--font-size-3);\n letter-spacing: 1.1px;\n font-weight: 500;\n line-height: 28px;\n}\n[data-supertokens~="secondaryLinkWithArrow"] {\n margin-top: 10px;\n margin-bottom: 30px;\n cursor: pointer;\n}\n[data-supertokens~="secondaryLinkWithArrow"]:hover {\n position: relative;\n left: 2px;\n word-spacing: 4px;\n}\n[data-supertokens~="generalSuccess"] {\n color: rgb(var(--palette-success));\n font-size: var(--font-size-1);\n background: rgb(var(--palette-successBackground));\n -webkit-animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n padding: 9px 15px 9px 15px;\n border-radius: 6px;\n display: inline-block;\n}\n[data-supertokens~="spinner"] {\n width: 80px;\n height: auto;\n padding-top: 20px;\n padding-bottom: 40px;\n margin: 0 auto;\n}\n[data-supertokens~="error"] {\n color: rgb(var(--palette-error));\n}\n[data-supertokens~="linkButton"] {\n font-family: "Rubik", sans-serif;\n background-color: transparent;\n border: 0;\n}\n[data-supertokens~="secondaryLinkWithLeftArrow"] {\n font-weight: 500;\n margin-top: 10px;\n margin-bottom: 40px;\n cursor: pointer;\n}\n[data-supertokens~="secondaryLinkWithLeftArrow"] svg {\n margin-right: 0.3em;\n}\n[data-supertokens~="secondaryLinkWithLeftArrow"]:hover svg {\n position: relative;\n left: -4px;\n}\n[data-supertokens~="button"] {\n font-family: "Rubik", sans-serif;\n background-color: rgb(var(--palette-primary));\n color: rgb(var(--palette-buttonText));\n width: 100%;\n height: 34px;\n font-weight: 700;\n border-width: 1px;\n border-style: solid;\n border-radius: 6px;\n border-color: rgb(var(--palette-primaryBorder));\n background-position: center;\n transition: all 0.4s;\n background-size: 12000%;\n cursor: pointer;\n}\n[data-supertokens~="button"]:disabled {\n border: none;\n cursor: no-drop;\n}\n[data-supertokens~="button"]:active {\n outline: none;\n transition: all 0s;\n background-size: 100%;\n -webkit-filter: brightness(0.85);\n filter: brightness(0.85);\n}\n[data-supertokens~="button"]:focus {\n outline: none;\n}\n[data-supertokens~="backButtonCommon"] {\n width: 16px;\n height: 13px;\n}\n[data-supertokens~="backButton"] {\n cursor: pointer;\n border: none;\n background-color: transparent;\n padding: 0px;\n}\n[data-supertokens~="backButtonPlaceholder"] {\n display: block;\n}\n[data-supertokens~="delayedRender"] {\n -webkit-animation-duration: 0.1s;\n animation-duration: 0.1s;\n -webkit-animation-name: animate-fade;\n animation-name: animate-fade;\n -webkit-animation-delay: 0.2s;\n animation-delay: 0.2s;\n -webkit-animation-fill-mode: backwards;\n animation-fill-mode: backwards;\n}\n@-webkit-keyframes animate-fade {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n@keyframes animate-fade {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n[data-supertokens~="footerLinkGroupVert"] {\n display: flex;\n flex-direction: column;\n margin-top: 10px;\n gap: 24px;\n}\n[data-supertokens~="footerLinkGroupVert"] > div {\n margin: 0;\n}\n[data-supertokens~="footerLinkGroupVert"] [data-supertokens~="secondaryText"] {\n font-weight: 400;\n}\n[data-supertokens~="footerLinkGroupVert"] [data-supertokens~="secondaryLinkWithLeftArrow"] {\n font-weight: 500;\n position: relative;\n left: -6px; /* half the width of the left arrow */\n}\n@media (max-width: 360px) {\n [data-supertokens~="footerLinkGroupVert"] {\n flex-direction: column;\n }\n [data-supertokens~="footerLinkGroupVert"] > div {\n margin: 0 auto;\n }\n}\n[data-supertokens~="footerLinkGroupVert"] div:only-child {\n margin-left: auto;\n margin-right: auto;\n margin-top: 14px;\n}\n[data-supertokens~="delayedRender"] {\n -webkit-animation-duration: 0.1s;\n animation-duration: 0.1s;\n -webkit-animation-name: animate-fade;\n animation-name: animate-fade;\n -webkit-animation-delay: 0.2s;\n animation-delay: 0.2s;\n -webkit-animation-fill-mode: backwards;\n animation-fill-mode: backwards;\n}\n@keyframes animate-fade {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n'; + '[data-supertokens~="container"] {\n --palette-background: 255, 255, 255;\n --palette-inputBackground: 250, 250, 250;\n --palette-inputBorder: 224, 224, 224;\n --palette-primary: 255, 155, 51;\n --palette-primaryBorder: 238, 141, 35;\n --palette-success: 65, 167, 0;\n --palette-successBackground: 217, 255, 191;\n --palette-error: 255, 23, 23;\n --palette-errorBackground: 255, 241, 235;\n --palette-textTitle: 34, 34, 34;\n --palette-textLabel: 34, 34, 34;\n --palette-textInput: 34, 34, 34;\n --palette-textPrimary: 101, 101, 101;\n --palette-textLink: 0, 118, 255;\n --palette-buttonText: 255, 255, 255;\n --palette-textGray: 128, 128, 128;\n --palette-superTokensBrandingBackground: 242, 245, 246;\n --palette-superTokensBrandingText: 173, 189, 196;\n\n --font-size-0: 12px;\n --font-size-1: 14px;\n --font-size-2: 16px;\n --font-size-3: 19px;\n --font-size-4: 24px;\n}\n/*\n * Default styles.\n */\n@-webkit-keyframes slideTop {\n 0% {\n -webkit-transform: translateY(-5px);\n transform: translateY(-5px);\n }\n 100% {\n -webkit-transform: translateY(0px);\n transform: translateY(0px);\n }\n}\n@keyframes slideTop {\n 0% {\n -webkit-transform: translateY(-5px);\n transform: translateY(-5px);\n }\n 100% {\n -webkit-transform: translateY(0px);\n transform: translateY(0px);\n }\n}\n@-webkit-keyframes swing-in-top-fwd {\n 0% {\n -webkit-transform: rotateX(-100deg);\n transform: rotateX(-100deg);\n -webkit-transform-origin: top;\n transform-origin: top;\n opacity: 0;\n }\n 100% {\n -webkit-transform: rotateX(0deg);\n transform: rotateX(0deg);\n -webkit-transform-origin: top;\n transform-origin: top;\n opacity: 1;\n }\n}\n@keyframes swing-in-top-fwd {\n 0% {\n -webkit-transform: rotateX(-100deg);\n transform: rotateX(-100deg);\n -webkit-transform-origin: top;\n transform-origin: top;\n opacity: 0;\n }\n 100% {\n -webkit-transform: rotateX(0deg);\n transform: rotateX(0deg);\n -webkit-transform-origin: top;\n transform-origin: top;\n opacity: 1;\n }\n}\n[data-supertokens~="container"] {\n font-family: "Rubik", sans-serif;\n margin: 12px auto;\n margin-top: 26px;\n margin-bottom: 26px;\n width: 420px;\n text-align: center;\n border-radius: 8px;\n box-shadow: 1px 1px 10px rgba(0, 0, 0, 0.16);\n background-color: rgb(var(--palette-background));\n}\n@media (max-width: 440px) {\n [data-supertokens~="container"] {\n width: 95vw;\n }\n}\n[data-supertokens~="row"] {\n margin: 0 auto;\n width: 76%;\n padding-top: 30px;\n padding-bottom: 10px;\n}\n[data-supertokens~="superTokensBranding"] {\n display: block;\n margin: 0 auto;\n background: rgb(var(--palette-superTokensBrandingBackground));\n color: rgb(var(--palette-superTokensBrandingText));\n text-decoration: none;\n width: -webkit-fit-content;\n width: -moz-fit-content;\n width: fit-content;\n border-radius: 6px 6px 0 0;\n padding: 4px 9px;\n font-weight: 400;\n font-size: var(--font-size-0);\n letter-spacing: 0.4px;\n}\n[data-supertokens~="generalError"] {\n background: rgb(var(--palette-errorBackground));\n padding-top: 10px;\n padding-bottom: 10px;\n margin-bottom: 15px;\n padding-left: 18px;\n padding-right: 18px;\n letter-spacing: 0.2px;\n font-size: var(--font-size-1);\n border-radius: 8px;\n color: rgb(var(--palette-error));\n -webkit-animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n word-wrap: break-word;\n}\n[data-supertokens~="headerTitle"] {\n font-size: var(--font-size-4);\n line-height: 40px;\n letter-spacing: 0.58px;\n font-weight: 600;\n margin-bottom: 2px;\n color: rgb(var(--palette-textTitle));\n}\n[data-supertokens~="headerSubtitle"] {\n font-weight: 400;\n margin-bottom: 21px;\n}\n[data-supertokens~="headerSubtitle"][data-supertokens~="secondaryText"] {\n font-weight: 400;\n}\n[data-supertokens~="privacyPolicyAndTermsAndConditions"] {\n max-width: 300px;\n margin-top: 10px;\n}\n[data-supertokens~="privacyPolicyAndTermsAndConditions"] a {\n line-height: 21px;\n}\n/* TODO: split the link style into separate things*/\n/* We add this before primary and secondary text, because if they are applied to the same element the other ones take priority */\n[data-supertokens~="link"] {\n padding-left: 3px;\n padding-right: 3px;\n color: rgb(var(--palette-textLink));\n font-size: var(--font-size-1);\n cursor: pointer;\n letter-spacing: 0.16px;\n line-height: 26px;\n}\n[data-supertokens~="primaryText"] {\n font-size: var(--font-size-1);\n font-weight: 500;\n letter-spacing: 0.4px;\n line-height: 21px;\n color: rgb(var(--palette-textLabel));\n}\n[data-supertokens~="secondaryText"] {\n font-size: var(--font-size-1);\n font-weight: 300;\n letter-spacing: 0.4px;\n color: rgb(var(--palette-textPrimary));\n}\n[data-supertokens~="divider"] {\n margin-top: 1em;\n margin-bottom: 1em;\n border-bottom: 0.3px solid #dddddd;\n align-items: center;\n padding-bottom: 5px;\n}\n[data-supertokens~="headerTinyTitle"] {\n margin-top: 13px;\n font-size: var(--font-size-3);\n letter-spacing: 1.1px;\n font-weight: 500;\n line-height: 28px;\n}\n[data-supertokens~="secondaryLinkWithArrow"] {\n margin-top: 10px;\n margin-bottom: 30px;\n cursor: pointer;\n}\n[data-supertokens~="secondaryLinkWithArrow"]:hover {\n position: relative;\n left: 2px;\n word-spacing: 4px;\n}\n[data-supertokens~="generalSuccess"] {\n color: rgb(var(--palette-success));\n font-size: var(--font-size-1);\n background: rgb(var(--palette-successBackground));\n -webkit-animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n padding: 9px 15px 9px 15px;\n border-radius: 6px;\n display: inline-block;\n}\n[data-supertokens~="spinner"] {\n width: 80px;\n height: auto;\n padding-top: 20px;\n padding-bottom: 40px;\n margin: 0 auto;\n}\n[data-supertokens~="error"] {\n color: rgb(var(--palette-error));\n}\n[data-supertokens~="linkButton"] {\n font-family: "Rubik", sans-serif;\n background-color: transparent;\n border: 0;\n}\n[data-supertokens~="secondaryLinkWithLeftArrow"] {\n font-weight: 500;\n margin-top: 10px;\n margin-bottom: 40px;\n cursor: pointer;\n}\n[data-supertokens~="secondaryLinkWithLeftArrow"] svg {\n margin-right: 0.3em;\n}\n[data-supertokens~="secondaryLinkWithLeftArrow"]:hover svg {\n position: relative;\n left: -4px;\n}\n[data-supertokens~="button"] {\n font-family: "Rubik", sans-serif;\n background-color: rgb(var(--palette-primary));\n color: rgb(var(--palette-buttonText));\n width: 100%;\n height: 34px;\n font-weight: 700;\n border-width: 1px;\n border-style: solid;\n border-radius: 6px;\n border-color: rgb(var(--palette-primaryBorder));\n background-position: center;\n transition: all 0.4s;\n background-size: 12000%;\n cursor: pointer;\n}\n[data-supertokens~="button"]:disabled {\n border: none;\n cursor: no-drop;\n}\n[data-supertokens~="button"]:active {\n outline: none;\n transition: all 0s;\n background-size: 100%;\n -webkit-filter: brightness(0.85);\n filter: brightness(0.85);\n}\n[data-supertokens~="button"]:focus {\n outline: none;\n}\n[data-supertokens~="backButtonCommon"] {\n width: 16px;\n height: 13px;\n}\n[data-supertokens~="backButton"] {\n cursor: pointer;\n border: none;\n background-color: transparent;\n padding: 0px;\n}\n[data-supertokens~="backButtonPlaceholder"] {\n display: block;\n}\n[data-supertokens~="delayedRender"] {\n -webkit-animation-duration: 0.1s;\n animation-duration: 0.1s;\n -webkit-animation-name: animate-fade;\n animation-name: animate-fade;\n -webkit-animation-delay: 0.2s;\n animation-delay: 0.2s;\n -webkit-animation-fill-mode: backwards;\n animation-fill-mode: backwards;\n}\n@-webkit-keyframes animate-fade {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n@keyframes animate-fade {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n[data-supertokens~="footerLinkGroupVert"] {\n display: flex;\n flex-direction: column;\n margin-top: 10px;\n gap: 24px;\n}\n[data-supertokens~="footerLinkGroupVert"] > div {\n margin: 0;\n}\n[data-supertokens~="footerLinkGroupVert"] [data-supertokens~="secondaryText"] {\n font-weight: 400;\n}\n[data-supertokens~="footerLinkGroupVert"] [data-supertokens~="secondaryLinkWithLeftArrow"] {\n font-weight: 500;\n position: relative;\n left: -6px; /* half the width of the left arrow */\n}\n@media (max-width: 360px) {\n [data-supertokens~="footerLinkGroupVert"] {\n flex-direction: column;\n }\n [data-supertokens~="footerLinkGroupVert"] > div {\n margin: 0 auto;\n }\n}\n[data-supertokens~="footerLinkGroupVert"] div:only-child {\n margin-left: auto;\n margin-right: auto;\n margin-top: 14px;\n}\n'; var ThemeBase = function (_a) { var children = _a.children, diff --git a/lib/build/multifactorauth-shared.js b/lib/build/multifactorauth-shared.js index 23669ebb0..23aeb7dee 100644 --- a/lib/build/multifactorauth-shared.js +++ b/lib/build/multifactorauth-shared.js @@ -2,7 +2,6 @@ var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); var MultiFactorAuthWebJS = require("supertokens-web-js/recipe/multifactorauth"); -var utils = require("supertokens-web-js/utils"); var NormalisedURLPath = require("supertokens-web-js/utils/normalisedURLPath"); var postSuperTokensInitCallbacks = require("supertokens-web-js/utils/postSuperTokensInitCallbacks"); var sessionClaimValidatorStore = require("supertokens-web-js/utils/sessionClaimValidatorStore"); @@ -273,7 +272,7 @@ var MultiFactorAuth = /** @class */ (function (_super) { }; MultiFactorAuth.getInstanceOrThrow = function () { if (MultiFactorAuth.instance === undefined) { - var error = "No instance of EmailVerification found. Make sure to call the EmailVerification.init method."; + var error = "No instance of MultiFactorAuth found. Make sure to call the MultiFactorAuth.init method."; // eslint-disable-next-line supertokens-auth-react/no-direct-window-object if (typeof window === "undefined") { error = error + genericComponentOverrideContext.SSR_ERROR; @@ -319,11 +318,15 @@ var MultiFactorAuth = /** @class */ (function (_super) { redirectUrl = genericComponentOverrideContext .getCurrentNormalisedUrlPath() .getAsStringDangerous(); - url = utils.appendQueryParamsToURL(url, { redirectToPath: redirectUrl }); + url = genericComponentOverrideContext.appendQueryParamsToURL(url, { + redirectToPath: redirectUrl, + }); } else { redirectUrl = genericComponentOverrideContext.getRedirectToPathFromURL(); if (redirectUrl) { - url = utils.appendQueryParamsToURL(url, { redirectToPath: redirectUrl }); + url = genericComponentOverrideContext.appendQueryParamsToURL(url, { + redirectToPath: redirectUrl, + }); } } return [ @@ -353,11 +356,15 @@ var MultiFactorAuth = /** @class */ (function (_super) { redirectUrl = genericComponentOverrideContext .getCurrentNormalisedUrlPath() .getAsStringDangerous(); - url = utils.appendQueryParamsToURL(url, { redirectToPath: redirectUrl }); + url = genericComponentOverrideContext.appendQueryParamsToURL(url, { + redirectToPath: redirectUrl, + }); } else { redirectUrl = genericComponentOverrideContext.getRedirectToPathFromURL(); if (redirectUrl) { - url = utils.appendQueryParamsToURL(url, { redirectToPath: redirectUrl }); + url = genericComponentOverrideContext.appendQueryParamsToURL(url, { + redirectToPath: redirectUrl, + }); } } return [ diff --git a/lib/build/multifactorauthprebuiltui.js b/lib/build/multifactorauthprebuiltui.js index 5df6c54ca..7c7dcfcdf 100644 --- a/lib/build/multifactorauthprebuiltui.js +++ b/lib/build/multifactorauthprebuiltui.js @@ -15,7 +15,7 @@ var translations = require("./translations.js"); var translationContext = require("./translationContext.js"); var sessionprebuiltui = require("./sessionprebuiltui.js"); var arrowLeftIcon = require("./arrowLeftIcon.js"); -var backButton = require("./emailpassword-shared7.js"); +var backButton = require("./emailpassword-shared8.js"); require("supertokens-web-js"); require("supertokens-web-js/utils/cookieHandler"); require("supertokens-web-js/utils/postSuperTokensInitCallbacks"); diff --git a/lib/build/passwordless-shared2.js b/lib/build/passwordless-shared2.js index 94a68dd00..b2723095d 100644 --- a/lib/build/passwordless-shared2.js +++ b/lib/build/passwordless-shared2.js @@ -6,7 +6,7 @@ var postSuperTokensInitCallbacks = require("supertokens-web-js/utils/postSuperTo var jsxRuntime = require("react/jsx-runtime"); var utils = require("./authRecipe-shared.js"); var recipe = require("./multifactorauth-shared.js"); -var windowHandler = require("supertokens-web-js/utils/windowHandler"); +var validators = require("./passwordless-shared3.js"); function _interopDefault(e) { return e && e.__esModule ? e : { default: e }; @@ -192,234 +192,6 @@ var getFunctionOverrides = function (onHandleEvent) { }; }; -var phoneNumberUtilsImport; -function getPhoneNumberUtils() { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - var global; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [4 /*yield*/, preloadPhoneNumberUtils()]; - case 1: - _a.sent(); - global = windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.getWindowUnsafe(); - return [2 /*return*/, global.intlTelInputUtils]; - } - }); - }); -} -function preloadPhoneNumberUtils() { - if (phoneNumberUtilsImport === undefined) { - /* eslint-disable @typescript-eslint/ban-ts-comment */ - // @ts-ignore: We need to disable no implicit any here, otherwise we'd need to add types for this module - phoneNumberUtilsImport = Promise.resolve().then(function () { - return require("./utils.js"); - }); - /* eslint-enable @typescript-eslint/ban-ts-comment */ - } - return phoneNumberUtilsImport; -} - -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -function defaultEmailValidator(value) { - if (typeof value !== "string") { - return "GENERAL_ERROR_EMAIL_NON_STRING"; - } - value = value.trim(); - var defaultEmailValidatorRegexp = - // eslint-disable-next-line no-useless-escape - /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; - // We check if the email syntax is correct - // As per https://github.com/supertokens/supertokens-auth-react/issues/5#issuecomment-709512438 - // Regex from https://stackoverflow.com/a/46181/3867175 - if (value.match(defaultEmailValidatorRegexp) === null) { - return "GENERAL_ERROR_EMAIL_INVALID"; - } - return undefined; -} -function defaultPhoneNumberValidator(value) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - var intlTelInputUtils; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - if (typeof value !== "string") { - return [2 /*return*/, "GENERAL_ERROR_PHONE_NON_STRING"]; - } - value = value.trim(); - return [4 /*yield*/, getPhoneNumberUtils()]; - case 1: - intlTelInputUtils = _a.sent(); - if (!intlTelInputUtils.isValidNumber(value, undefined)) { - return [2 /*return*/, "GENERAL_ERROR_PHONE_INVALID"]; - } - return [2 /*return*/, undefined]; - } - }); - }); -} -function defaultEmailValidatorForCombinedInput(value) { - if (typeof value !== "string") { - return "GENERAL_ERROR_EMAIL_OR_PHONE_NON_STRING"; - } - value = value.trim(); - var defaultEmailValidatorRegexp = - // eslint-disable-next-line no-useless-escape - /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; - // We check if the email syntax is correct - // As per https://github.com/supertokens/supertokens-auth-react/issues/5#issuecomment-709512438 - // Regex from https://stackoverflow.com/a/46181/3867175 - if (value.match(defaultEmailValidatorRegexp) === null) { - return "GENERAL_ERROR_EMAIL_OR_PHONE_INVALID"; - } - return undefined; -} -function defaultPhoneNumberValidatorForCombinedInput(value) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - var intlTelInputUtils; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - if (typeof value !== "string") { - return [2 /*return*/, "GENERAL_ERROR_EMAIL_OR_PHONE_NON_STRING"]; - } - value = value.trim(); - return [4 /*yield*/, getPhoneNumberUtils()]; - case 1: - intlTelInputUtils = _a.sent(); - if (!intlTelInputUtils.isValidNumber(value, undefined)) { - return [2 /*return*/, "GENERAL_ERROR_EMAIL_OR_PHONE_INVALID"]; - } - return [2 /*return*/, undefined]; - } - }); - }); -} -function userInputCodeValidate(value) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - if (typeof value !== "string") { - return [2 /*return*/, "GENERAL_ERROR_OTP_NON_STRING"]; - } - if (value.length === 0) { - return [2 /*return*/, "GENERAL_ERROR_OTP_EMPTY"]; - } - return [2 /*return*/, undefined]; - }); - }); -} -/* - * defaultValidate - */ -// eslint-disable-next-line @typescript-eslint/no-unused-vars -function defaultValidate(_) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - return [2 /*return*/, undefined]; - }); - }); -} -function defaultGuessInternationPhoneNumberFromInputPhoneNumber(value, defaultCountryFromConfig) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - var intlTelInputUtils, - libGuess, - phoneNumberCharCount, - filteredInput, - countryData, - matchingCountryCodes, - _i, - matchingCountryCodes_1, - code, - defaultCountry; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - if (value === undefined || value.length === 0) { - return [2 /*return*/, value]; - } - return [4 /*yield*/, getPhoneNumberUtils()]; - case 1: - intlTelInputUtils = _a.sent(); - libGuess = intlTelInputUtils.formatNumber( - value, - defaultCountryFromConfig, - intlTelInputUtils.numberFormat.E164 - ); - if (intlTelInputUtils.isValidNumber(libGuess, defaultCountryFromConfig)) { - return [2 /*return*/, libGuess]; - } - phoneNumberCharCount = (value.match(/(\d|[+\-().])/g) || []).length; - // If the number of valid characters for a phonenumber is less than half the input we assume it's not a phone number. - // I.e.: if less than half of the input is numbers or in: "+-()." - if (value.includes("@") || phoneNumberCharCount < value.length / 2) { - return [2 /*return*/, undefined]; - } - filteredInput = "+" + value.replace(/\D/g, "").replace(/^00/, ""); - if (intlTelInputUtils.isValidNumber(filteredInput, defaultCountryFromConfig)) { - return [ - 2 /*return*/, - intlTelInputUtils.formatNumber( - filteredInput, - defaultCountryFromConfig, - intlTelInputUtils.numberFormat.E164 - ), - ]; - } - countryData = windowHandler.WindowHandlerReference.getReferenceOrThrow() - .windowHandler.getWindowUnsafe() - .intlTelInputGlobals.getCountryData(); - matchingCountryCodes = countryData - .filter(function (c) { - return filteredInput.startsWith("+" + c.dialCode); - }) - .map(function (c) { - return c.iso2; - }); - for ( - _i = 0, matchingCountryCodes_1 = matchingCountryCodes; - _i < matchingCountryCodes_1.length; - _i++ - ) { - code = matchingCountryCodes_1[_i]; - if (intlTelInputUtils.isValidNumber(filteredInput, code)) { - return [ - 2 /*return*/, - intlTelInputUtils.formatNumber( - filteredInput, - code, - intlTelInputUtils.numberFormat.E164 - ), - ]; - } - } - if (defaultCountryFromConfig) { - defaultCountry = countryData.find(function (c) { - return c.iso2 === defaultCountryFromConfig.toLowerCase(); - }); - if (defaultCountry) { - return [2 /*return*/, "+" + defaultCountry.dialCode + filteredInput.substring(1)]; - } - } - // We want to return the value as an international number because the phone number input lib expects it this way - return [2 /*return*/, filteredInput]; - } - }); - }); -} - /* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. * * This software is licensed under the Apache License, Version 2.0 (the @@ -450,23 +222,23 @@ function normalisePasswordlessConfig(config) { }, config.override ); - var validateEmailAddress = defaultEmailValidator; + var validateEmailAddress = validators.defaultEmailValidator; if ( (config.contactMethod === "EMAIL" || config.contactMethod === "EMAIL_OR_PHONE") && config.validateEmailAddress !== undefined ) { validateEmailAddress = config.validateEmailAddress; } else if (config.contactMethod === "EMAIL_OR_PHONE") { - validateEmailAddress = defaultEmailValidatorForCombinedInput; + validateEmailAddress = validators.defaultEmailValidatorForCombinedInput; } - var validatePhoneNumber = defaultPhoneNumberValidator; + var validatePhoneNumber = validators.defaultPhoneNumberValidator; if ( (config.contactMethod === "PHONE" || config.contactMethod === "EMAIL_OR_PHONE") && config.validatePhoneNumber !== undefined ) { validatePhoneNumber = config.validatePhoneNumber; } else if (config.contactMethod === "EMAIL_OR_PHONE") { - validatePhoneNumber = defaultPhoneNumberValidatorForCombinedInput; + validatePhoneNumber = validators.defaultPhoneNumberValidatorForCombinedInput; } return genericComponentOverrideContext.__assign( genericComponentOverrideContext.__assign({}, utils.normaliseAuthRecipe(config)), @@ -530,7 +302,7 @@ function normalizeSignInUpFeatureConfig(signInUpInput, config) { "guessInternationPhoneNumberFromInputPhoneNumber" in signInUpInput && signInUpInput.guessInternationPhoneNumberFromInputPhoneNumber !== undefined ? signInUpInput.guessInternationPhoneNumberFromInputPhoneNumber - : defaultGuessInternationPhoneNumberFromInputPhoneNumber, + : validators.defaultGuessInternationPhoneNumberFromInputPhoneNumber, } ); return signInUpFeature; @@ -695,11 +467,6 @@ var Passwordless = /** @class */ (function (_super) { })(utils.AuthRecipe); exports.Passwordless = Passwordless; -exports.defaultEmailValidator = defaultEmailValidator; -exports.defaultValidate = defaultValidate; exports.getEnabledContactMethods = getEnabledContactMethods; -exports.getPhoneNumberUtils = getPhoneNumberUtils; exports.normalisePasswordlessConfig = normalisePasswordlessConfig; exports.passwordlessFirstFactors = passwordlessFirstFactors; -exports.preloadPhoneNumberUtils = preloadPhoneNumberUtils; -exports.userInputCodeValidate = userInputCodeValidate; diff --git a/lib/build/passwordless-shared3.js b/lib/build/passwordless-shared3.js index 62f455661..5decc31b4 100644 --- a/lib/build/passwordless-shared3.js +++ b/lib/build/passwordless-shared3.js @@ -1,4282 +1,35 @@ "use strict"; var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); -var jsxRuntime = require("react/jsx-runtime"); -var NormalisedURLPath = require("supertokens-web-js/utils/normalisedURLPath"); -var uiEntry = require("./index2.js"); -var authWidgetWrapper = require("./authRecipe-shared2.js"); -var session = require("./session-shared.js"); -var componentOverrideContext = require("./passwordless-shared.js"); -var React = require("react"); -var STGeneralError = require("supertokens-web-js/utils/error"); -var recipe = require("./session-shared2.js"); -var translations = require("./translations.js"); -var translationContext = require("./translationContext.js"); -var button = require("./emailpassword-shared2.js"); var windowHandler = require("supertokens-web-js/utils/windowHandler"); -var recipe$2 = require("./multifactorauth-shared.js"); -var recipe$1 = require("./passwordless-shared2.js"); -var SuperTokensBranding = require("./SuperTokensBranding.js"); -var generalError = require("./emailpassword-shared.js"); -var sessionprebuiltui = require("./sessionprebuiltui.js"); -var checkedRoundIcon = require("./checkedRoundIcon.js"); -var formBase = require("./emailpassword-shared8.js"); -var validators = require("./emailpassword-shared5.js"); -var arrowLeftIcon = require("./arrowLeftIcon.js"); -var multifactorauth = require("./multifactorauth-shared2.js"); -var backButton = require("./emailpassword-shared7.js"); -function _interopDefault(e) { - return e && e.__esModule ? e : { default: e }; -} - -function _interopNamespace(e) { - if (e && e.__esModule) return e; - var n = Object.create(null); - if (e) { - Object.keys(e).forEach(function (k) { - if (k !== "default") { - var d = Object.getOwnPropertyDescriptor(e, k); - Object.defineProperty( - n, - k, - d.get - ? d - : { - enumerable: true, - get: function () { - return e[k]; - }, - } - ); +var phoneNumberUtilsImport; +function getPhoneNumberUtils() { + return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { + var global; + return genericComponentOverrideContext.__generator(this, function (_a) { + switch (_a.label) { + case 0: + return [4 /*yield*/, preloadPhoneNumberUtils()]; + case 1: + _a.sent(); + global = windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.getWindowUnsafe(); + return [2 /*return*/, global.intlTelInputUtils]; } }); - } - n.default = e; - return Object.freeze(n); -} - -var NormalisedURLPath__default = /*#__PURE__*/ _interopDefault(NormalisedURLPath); -var React__namespace = /*#__PURE__*/ _interopNamespace(React); -var STGeneralError__default = /*#__PURE__*/ _interopDefault(STGeneralError); - -var styles = - '/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved.\n *\n * This software is licensed under the Apache License, Version 2.0 (the\n * "License") as published by the Apache Software Foundation.\n *\n * You may not use this file except in compliance with the License. You may\n * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n[data-supertokens~="container"] {\n --palette-background: 255, 255, 255;\n --palette-inputBackground: 250, 250, 250;\n --palette-inputBorder: 224, 224, 224;\n --palette-primary: 255, 155, 51;\n --palette-primaryBorder: 238, 141, 35;\n --palette-success: 65, 167, 0;\n --palette-successBackground: 217, 255, 191;\n --palette-error: 255, 23, 23;\n --palette-errorBackground: 255, 241, 235;\n --palette-textTitle: 34, 34, 34;\n --palette-textLabel: 34, 34, 34;\n --palette-textInput: 34, 34, 34;\n --palette-textPrimary: 101, 101, 101;\n --palette-textLink: 0, 118, 255;\n --palette-buttonText: 255, 255, 255;\n --palette-textGray: 128, 128, 128;\n --palette-superTokensBrandingBackground: 242, 245, 246;\n --palette-superTokensBrandingText: 173, 189, 196;\n\n --font-size-0: 12px;\n --font-size-1: 14px;\n --font-size-2: 16px;\n --font-size-3: 19px;\n --font-size-4: 24px;\n}\n\n/*\n * Default styles.\n */\n\n@-webkit-keyframes slideTop {\n 0% {\n -webkit-transform: translateY(-5px);\n transform: translateY(-5px);\n }\n 100% {\n -webkit-transform: translateY(0px);\n transform: translateY(0px);\n }\n}\n\n@keyframes slideTop {\n 0% {\n -webkit-transform: translateY(-5px);\n transform: translateY(-5px);\n }\n 100% {\n -webkit-transform: translateY(0px);\n transform: translateY(0px);\n }\n}\n\n@-webkit-keyframes swing-in-top-fwd {\n 0% {\n -webkit-transform: rotateX(-100deg);\n transform: rotateX(-100deg);\n -webkit-transform-origin: top;\n transform-origin: top;\n opacity: 0;\n }\n 100% {\n -webkit-transform: rotateX(0deg);\n transform: rotateX(0deg);\n -webkit-transform-origin: top;\n transform-origin: top;\n opacity: 1;\n }\n}\n\n@keyframes swing-in-top-fwd {\n 0% {\n -webkit-transform: rotateX(-100deg);\n transform: rotateX(-100deg);\n -webkit-transform-origin: top;\n transform-origin: top;\n opacity: 0;\n }\n 100% {\n -webkit-transform: rotateX(0deg);\n transform: rotateX(0deg);\n -webkit-transform-origin: top;\n transform-origin: top;\n opacity: 1;\n }\n}\n\n[data-supertokens~="container"] {\n font-family: "Rubik", sans-serif;\n margin: 12px auto;\n margin-top: 26px;\n margin-bottom: 26px;\n width: 420px;\n text-align: center;\n border-radius: 8px;\n box-shadow: 1px 1px 10px rgba(0, 0, 0, 0.16);\n background-color: rgb(var(--palette-background));\n}\n\n@media (max-width: 440px) {\n [data-supertokens~="container"] {\n width: 95vw;\n }\n}\n\n[data-supertokens~="row"] {\n margin: 0 auto;\n width: 76%;\n padding-top: 30px;\n padding-bottom: 10px;\n}\n\n[data-supertokens~="superTokensBranding"] {\n display: block;\n margin: 0 auto;\n background: rgb(var(--palette-superTokensBrandingBackground));\n color: rgb(var(--palette-superTokensBrandingText));\n text-decoration: none;\n width: -webkit-fit-content;\n width: -moz-fit-content;\n width: fit-content;\n border-radius: 6px 6px 0 0;\n padding: 4px 9px;\n font-weight: 400;\n font-size: var(--font-size-0);\n letter-spacing: 0.4px;\n}\n\n[data-supertokens~="generalError"] {\n background: rgb(var(--palette-errorBackground));\n padding-top: 10px;\n padding-bottom: 10px;\n margin-bottom: 15px;\n padding-left: 18px;\n padding-right: 18px;\n letter-spacing: 0.2px;\n font-size: var(--font-size-1);\n border-radius: 8px;\n color: rgb(var(--palette-error));\n -webkit-animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n word-wrap: break-word;\n}\n\n[data-supertokens~="headerTitle"] {\n font-size: var(--font-size-4);\n line-height: 40px;\n letter-spacing: 0.58px;\n font-weight: 600;\n margin-bottom: 2px;\n color: rgb(var(--palette-textTitle));\n}\n\n[data-supertokens~="headerSubtitle"] {\n font-weight: 400;\n margin-bottom: 21px;\n}\n\n[data-supertokens~="headerSubtitle"][data-supertokens~="secondaryText"] {\n font-weight: 400;\n}\n\n[data-supertokens~="privacyPolicyAndTermsAndConditions"] {\n max-width: 300px;\n margin-top: 10px;\n}\n\n[data-supertokens~="privacyPolicyAndTermsAndConditions"] a {\n line-height: 21px;\n}\n\n/* TODO: split the link style into separate things*/\n\n/* We add this before primary and secondary text, because if they are applied to the same element the other ones take priority */\n\n[data-supertokens~="link"] {\n padding-left: 3px;\n padding-right: 3px;\n color: rgb(var(--palette-textLink));\n font-size: var(--font-size-1);\n cursor: pointer;\n letter-spacing: 0.16px;\n line-height: 26px;\n}\n\n[data-supertokens~="primaryText"] {\n font-size: var(--font-size-1);\n font-weight: 500;\n letter-spacing: 0.4px;\n line-height: 21px;\n color: rgb(var(--palette-textLabel));\n}\n\n[data-supertokens~="secondaryText"] {\n font-size: var(--font-size-1);\n font-weight: 300;\n letter-spacing: 0.4px;\n color: rgb(var(--palette-textPrimary));\n}\n\n[data-supertokens~="divider"] {\n margin-top: 1em;\n margin-bottom: 1em;\n border-bottom: 0.3px solid #dddddd;\n align-items: center;\n padding-bottom: 5px;\n}\n\n[data-supertokens~="headerTinyTitle"] {\n margin-top: 13px;\n font-size: var(--font-size-3);\n letter-spacing: 1.1px;\n font-weight: 500;\n line-height: 28px;\n}\n\n[data-supertokens~="secondaryLinkWithArrow"] {\n margin-top: 10px;\n margin-bottom: 30px;\n cursor: pointer;\n}\n\n[data-supertokens~="secondaryLinkWithArrow"]:hover {\n position: relative;\n left: 2px;\n word-spacing: 4px;\n}\n\n[data-supertokens~="generalSuccess"] {\n color: rgb(var(--palette-success));\n font-size: var(--font-size-1);\n background: rgb(var(--palette-successBackground));\n -webkit-animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n padding: 9px 15px 9px 15px;\n border-radius: 6px;\n display: inline-block;\n}\n\n[data-supertokens~="spinner"] {\n width: 80px;\n height: auto;\n padding-top: 20px;\n padding-bottom: 40px;\n margin: 0 auto;\n}\n\n[data-supertokens~="error"] {\n color: rgb(var(--palette-error));\n}\n\n[data-supertokens~="linkButton"] {\n font-family: "Rubik", sans-serif;\n background-color: transparent;\n border: 0;\n}\n\n[data-supertokens~="secondaryLinkWithLeftArrow"] {\n font-weight: 500;\n margin-top: 10px;\n margin-bottom: 40px;\n cursor: pointer;\n}\n\n[data-supertokens~="secondaryLinkWithLeftArrow"] svg {\n margin-right: 0.3em;\n}\n\n[data-supertokens~="secondaryLinkWithLeftArrow"]:hover svg {\n position: relative;\n left: -4px;\n}\n\n[data-supertokens~="button"] {\n font-family: "Rubik", sans-serif;\n background-color: rgb(var(--palette-primary));\n color: rgb(var(--palette-buttonText));\n width: 100%;\n height: 34px;\n font-weight: 700;\n border-width: 1px;\n border-style: solid;\n border-radius: 6px;\n border-color: rgb(var(--palette-primaryBorder));\n background-position: center;\n transition: all 0.4s;\n background-size: 12000%;\n cursor: pointer;\n}\n\n[data-supertokens~="button"]:disabled {\n border: none;\n cursor: no-drop;\n}\n\n[data-supertokens~="button"]:active {\n outline: none;\n transition: all 0s;\n background-size: 100%;\n -webkit-filter: brightness(0.85);\n filter: brightness(0.85);\n}\n\n[data-supertokens~="button"]:focus {\n outline: none;\n}\n\n[data-supertokens~="backButtonCommon"] {\n width: 16px;\n height: 13px;\n}\n\n[data-supertokens~="backButton"] {\n cursor: pointer;\n border: none;\n background-color: transparent;\n padding: 0px;\n}\n\n[data-supertokens~="backButtonPlaceholder"] {\n display: block;\n}\n\n[data-supertokens~="delayedRender"] {\n -webkit-animation-duration: 0.1s;\n animation-duration: 0.1s;\n -webkit-animation-name: animate-fade;\n animation-name: animate-fade;\n -webkit-animation-delay: 0.2s;\n animation-delay: 0.2s;\n -webkit-animation-fill-mode: backwards;\n animation-fill-mode: backwards;\n}\n\n@-webkit-keyframes animate-fade {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n\n@keyframes animate-fade {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n\n[data-supertokens~="footerLinkGroupVert"] {\n display: flex;\n flex-direction: column;\n margin-top: 10px;\n gap: 24px;\n}\n\n[data-supertokens~="footerLinkGroupVert"] > div {\n margin: 0;\n}\n\n[data-supertokens~="footerLinkGroupVert"] [data-supertokens~="secondaryText"] {\n font-weight: 400;\n}\n\n[data-supertokens~="footerLinkGroupVert"] [data-supertokens~="secondaryLinkWithLeftArrow"] {\n font-weight: 500;\n position: relative;\n left: -6px; /* half the width of the left arrow */\n}\n\n@media (max-width: 360px) {\n [data-supertokens~="footerLinkGroupVert"] {\n flex-direction: column;\n }\n [data-supertokens~="footerLinkGroupVert"] > div {\n margin: 0 auto;\n }\n}\n\n[data-supertokens~="footerLinkGroupVert"] div:only-child {\n margin-left: auto;\n margin-right: auto;\n margin-top: 14px;\n}\n\n/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved.\n *\n * This software is licensed under the Apache License, Version 2.0 (the\n * "License") as published by the Apache Software Foundation.\n *\n * You may not use this file except in compliance with the License. You may\n * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n[data-supertokens~="inputContainer"] {\n margin-top: 6px;\n}\n\n[data-supertokens~="inputWrapper"] {\n box-sizing: border-box;\n width: 100%;\n display: flex;\n align-items: center;\n background-color: rgb(var(--palette-inputBackground));\n height: 34px;\n border-radius: 6px;\n border: 1px solid rgb(var(--palette-inputBorder));\n}\n\n[data-supertokens~="inputWrapper"][focus-within] {\n background-color: rgba(var(--palette-inputBackground), 0.25);\n border: 1px solid rgb(var(--palette-primary));\n box-shadow: 0 0 0 0.2rem rgba(var(--palette-primary), 0.25);\n outline: none;\n}\n\n[data-supertokens~="inputWrapper"]:focus-within {\n background-color: rgba(var(--palette-inputBackground), 0.25);\n border: 1px solid rgb(var(--palette-primary));\n box-shadow: 0 0 0 0.2rem rgba(var(--palette-primary), 0.25);\n outline: none;\n}\n\n[data-supertokens~="inputError"] {\n border: 1px solid rgb(var(--palette-error));\n box-shadow: 0 0 0 0.2rem rgba(var(--palette-error), 0.25);\n outline: none;\n}\n\n[data-supertokens~="inputError"][focus-within] {\n border: 1px solid rgb(var(--palette-error));\n box-shadow: 0 0 0 0.2rem rgba(var(--palette-error), 0.25);\n outline: none;\n}\n\n[data-supertokens~="inputError"]:focus-within {\n border: 1px solid rgb(var(--palette-error));\n box-shadow: 0 0 0 0.2rem rgba(var(--palette-error), 0.25);\n outline: none;\n}\n\n[data-supertokens~="input"] {\n box-sizing: border-box;\n padding-left: 15px;\n -webkit-filter: none;\n filter: none;\n color: rgb(var(--palette-textInput));\n background-color: transparent;\n border-radius: 6px;\n font-size: var(--font-size-1);\n border: none;\n padding-right: 25px;\n letter-spacing: 1.2px;\n flex: 9 1 75%;\n width: 75%;\n height: 32px;\n}\n\n[data-supertokens~="input"]:focus {\n border: none;\n outline: none;\n}\n\n[data-supertokens~="input"]:-webkit-autofill,\n[data-supertokens~="input"]:-webkit-autofill:hover,\n[data-supertokens~="input"]:-webkit-autofill:focus,\n[data-supertokens~="input"]:-webkit-autofill:active {\n -webkit-text-fill-color: rgb(var(--palette-textInput));\n box-shadow: 0 0 0 30px rgb(var(--palette-inputBackground)) inset;\n}\n\n[data-supertokens~="inputAdornment"] {\n justify-content: center;\n margin-right: 5px;\n}\n\n[data-supertokens~="showPassword"] {\n cursor: pointer;\n}\n\n[data-supertokens~="forgotPasswordLink"] {\n margin-top: 10px;\n}\n\n[data-supertokens~="enterEmailSuccessMessage"] {\n margin-top: 15px;\n margin-bottom: 15px;\n word-break: break-word;\n}\n\n[data-supertokens~="submitNewPasswordSuccessMessage"] {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n\n[data-supertokens~="inputErrorMessage"] {\n padding-top: 5px;\n padding-bottom: 5px;\n color: rgb(var(--palette-error));\n line-height: 24px;\n font-weight: 400;\n font-size: var(--font-size-1);\n text-align: left;\n -webkit-animation: slideTop 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94) both;\n animation: slideTop 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94) both;\n max-width: 330px;\n}\n\n@media (max-width: 440px) {\n [data-supertokens~="inputErrorMessage"] {\n max-width: 250px;\n }\n}\n\n[data-supertokens~="inputErrorSymbol"] {\n margin-right: 5px;\n top: 1px;\n position: relative;\n left: 2px;\n}\n\n[data-supertokens~="label"] {\n text-align: left;\n font-weight: 600;\n font-size: var(--font-size-1);\n line-height: 24px;\n color: rgb(var(--palette-textLabel));\n}\n\n[data-supertokens~="formRow"] {\n display: flex;\n flex-direction: column;\n padding-top: 0px;\n padding-bottom: 34px;\n}\n\n[data-supertokens~="formRow"][data-supertokens~="hasError"] {\n padding-bottom: 0;\n}\n\n[data-supertokens~="sendVerifyEmailIcon"] {\n margin-top: 11px;\n}\n\n[data-supertokens~="headerTinyTitle"] {\n margin-top: 13px;\n font-size: var(--font-size-3);\n letter-spacing: 1.1px;\n font-weight: 500;\n line-height: 28px;\n}\n\n[data-supertokens~="sendVerifyEmailText"] {\n line-height: 21px;\n font-size: var(--font-size-1);\n text-align: center;\n font-weight: 300;\n letter-spacing: 0.8px;\n}\n\n[data-supertokens~="secondaryLinkWithArrow"] {\n margin-top: 10px;\n margin-bottom: 30px;\n cursor: pointer;\n}\n\n[data-supertokens~="secondaryLinkWithArrow"]:hover {\n position: relative;\n left: 2px;\n word-spacing: 4px;\n}\n\n[data-supertokens~="sendVerifyEmailResend"] {\n margin-top: 13px;\n font-weight: 300;\n}\n\n[data-supertokens~="sendVerifyEmailResend"]:hover {\n text-decoration: underline;\n}\n\n[data-supertokens~="noFormRow"] {\n padding-bottom: 25px;\n}\n\n[data-supertokens~="emailVerificationButtonWrapper"] {\n padding-top: 25px;\n max-width: 96px;\n margin: 0 auto;\n}\n\n[data-supertokens~="withBackButton"] {\n position: relative;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n[data-supertokens~="resendEmailLink"] {\n display: inline-block;\n}\n\n[data-supertokens~="generalSuccess"] {\n margin-bottom: 20px;\n -webkit-animation: swingIn 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) alternate 2 both;\n animation: swingIn 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) alternate 2 both;\n}\n\n[data-supertokens~="codeInputLabelWrapper"] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n[data-supertokens~="headerSubtitle"] strong {\n max-width: 100%;\n display: inline-block;\n vertical-align: bottom;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n[data-supertokens~="sendCodeText"] {\n margin-top: 15px;\n margin-bottom: 20px;\n}\n\n[data-supertokens~="sendCodeText"] strong {\n max-width: 100%;\n display: inline-block;\n vertical-align: bottom;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n[data-supertokens~="resendCodeBtn"] {\n width: auto;\n margin-top: 0;\n line-height: 24px;\n}\n\n[data-supertokens~="resendCodeBtn"]:hover {\n text-decoration: underline;\n}\n\n[data-supertokens~="resendCodeBtn"]:disabled {\n color: rgb(var(--palette-textPrimary));\n cursor: default;\n text-decoration: none;\n}\n\n[data-supertokens~="phoneInputLibRoot"] {\n display: flex;\n align-items: center;\n}\n\n[data-supertokens~="phoneInputWrapper"] {\n display: flex;\n align-items: center;\n}\n\n[data-supertokens~="phoneInputWrapper"] .iti [data-supertokens~="input"] {\n padding-left: 15px;\n}\n\n[data-supertokens~="phoneInputWrapper"] .iti {\n flex: 1 1;\n min-width: 0;\n width: 100%;\n background: transparent;\n border: none;\n color: inherit;\n outline: none;\n}\n\n[data-supertokens~="continueButtonWrapper"] {\n margin-top: 10px;\n margin-bottom: 30px;\n}\n\n.iti__country-list {\n border: 0;\n top: 40px;\n width: min(72.2vw, 320px);\n border-radius: 6;\n box-shadow: 0px 0px 3px 0px rgba(0, 0, 0, 0.16);\n}\n\n.iti__country {\n display: flex;\n align-items: center;\n height: 34px;\n cursor: pointer;\n\n padding: 0 8px;\n}\n\n.iti__country-name {\n color: var(--palette-textLabel);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n margin: "0 16px";\n}\n'; - -var ThemeBase = function (_a) { - var children = _a.children, - userStyles = _a.userStyles, - loadDefaultFont = _a.loadDefaultFont; - return jsxRuntime.jsxs(React.Fragment, { - children: [ - children, - loadDefaultFont && - jsxRuntime.jsx("link", { - href: "//fonts.googleapis.com/css2?family=Rubik:wght@300;400;500;600;700", - rel: "stylesheet", - type: "text/css", - }), - jsxRuntime.jsxs("style", { children: [styles, userStyles.join("\n")] }), - ], - }); -}; - -var PasswordlessLinkClickedScreen = function (props) { - var t = translationContext.useTranslation(); - var _a = React.useState(false), - loading = _a[0], - setLoading = _a[1]; - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "container" }, - { - children: jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "row" }, - { - children: - props.requireUserInteraction === true - ? jsxRuntime.jsxs(React__namespace.default.Fragment, { - children: [ - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerTitle" }, - { children: t("PWLESS_LINK_CLICKED_CONTINUE_HEADER") } - ) - ), - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerSubtitle secondaryText" }, - { children: t("PWLESS_LINK_CLICKED_CONTINUE_DESC") } - ) - ), - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "continueButtonWrapper" }, - { - children: jsxRuntime.jsx(button.Button, { - isLoading: loading, - onClick: function () { - setLoading(true); - props.consumeCode(); - }, - type: "button", - label: "PWLESS_LINK_CLICKED_CONTINUE_BUTTON", - }), - } - ) - ), - ], - }) - : jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "spinner" }, - { children: jsxRuntime.jsx(uiEntry.SpinnerIcon, {}) } - ) - ), - } - ) - ), - } - ) - ); -}; -var LinkClickedScreenWithOverride = uiEntry.withOverride( - "PasswordlessLinkClickedScreen", - PasswordlessLinkClickedScreen -); -var LinkClickedScreen$1 = function (props) { - var hasFont = translations.hasFontDefined(props.config.rootStyle); - return jsxRuntime.jsx( - ThemeBase, - genericComponentOverrideContext.__assign( - { - loadDefaultFont: !hasFont, - userStyles: [props.config.rootStyle, props.config.linkClickedScreenFeature.style], - }, - { - children: jsxRuntime.jsx( - LinkClickedScreenWithOverride, - genericComponentOverrideContext.__assign({}, props) - ), - } - ) - ); -}; - -var defaultTranslationsPasswordless = { - en: genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, translations.defaultTranslationsCommon.en), - { - GENERAL_ERROR_EMAIL_UNDEFINED: "Please set your email", - GENERAL_ERROR_EMAIL_NON_STRING: "Email must be of type string", - GENERAL_ERROR_EMAIL_INVALID: "Email is invalid", - GENERAL_ERROR_PHONE_UNDEFINED: "Please set your phone number", - GENERAL_ERROR_PHONE_NON_STRING: "Phone number must be of type string", - GENERAL_ERROR_PHONE_INVALID: "Phone number is invalid", - GENERAL_ERROR_EMAIL_OR_PHONE_UNDEFINED: "Please set your email or phone number", - GENERAL_ERROR_EMAIL_OR_PHONE_NON_STRING: "Email or Phone number must be of type string", - GENERAL_ERROR_EMAIL_OR_PHONE_INVALID: "Email or Phone number is invalid", - GENERAL_ERROR_OTP_UNDEFINED: "Please fill your OTP", - GENERAL_ERROR_OTP_INVALID: "Invalid OTP", - GENERAL_ERROR_OTP_EXPIRED: "Expired OTP.", - GENERAL_ERROR_OTP_NON_STRING: "OTP must be of type string", - GENERAL_ERROR_OTP_EMPTY: "OTP cannot be empty", - ERROR_SIGN_IN_UP_LINK: "Invalid magic link. Please try again.", - ERROR_SIGN_IN_UP_RESEND_RESTART_FLOW: "Login timed out. Please try again.", - ERROR_SIGN_IN_UP_CODE_CONSUME_RESTART_FLOW: "Login unsuccessful. Please try again.", - PWLESS_CLOSE_TAB_TITLE: "Success!", - PWLESS_CLOSE_TAB_SUBTITLE_LINE1: "You have been successfully signed in.", - PWLESS_CLOSE_TAB_SUBTITLE_LINE2: "Please close this tab", - PWLESS_SIGN_IN_UP_HEADER_TITLE: "Sign Up or Log In", - PWLESS_SIGN_IN_UP_FOOTER_START: "By continuing, you agree to our ", - PWLESS_SIGN_IN_UP_FOOTER_TOS: "Terms of Service", - PWLESS_SIGN_IN_UP_FOOTER_AND: " and ", - PWLESS_SIGN_IN_UP_FOOTER_PP: "Privacy Policy", - PWLESS_SIGN_IN_UP_FOOTER_END: "", - PWLESS_SIGN_IN_UP_EMAIL_LABEL: "Email", - PWLESS_SIGN_IN_UP_PHONE_LABEL: "Phone Number", - PWLESS_SIGN_IN_UP_EMAIL_OR_PHONE_LABEL: "Email or Phone number", - PWLESS_SIGN_IN_UP_CONTINUE_BUTTON: "CONTINUE", - PWLESS_EMAIL_OR_PHONE_INVALID_INPUT_GUESS_PHONE_ERR: - "Please enter a valid phone number with its country code.", - PWLESS_LINK_SENT_RESEND_SUCCESS: "Link resent", - PWLESS_LINK_SENT_RESEND_TITLE: "Link sent!", - PWLESS_LINK_SENT_RESEND_DESC_START_EMAIL: "We sent a link to ", - PWLESS_LINK_SENT_RESEND_DESC_START_PHONE: "We sent a link to your phone number ", - PWLESS_LINK_SENT_RESEND_DESC_END_EMAIL: " Click the link to login or sign up", - PWLESS_LINK_SENT_RESEND_DESC_END_PHONE: "", - PWLESS_SIGN_IN_UP_CHANGE_CONTACT_INFO_EMAIL: "Change email", - PWLESS_SIGN_IN_UP_CHANGE_CONTACT_INFO_PHONE: "Change phone number", - PWLESS_LINK_CLICKED_CONTINUE_HEADER: "Sign Up or Log In", - PWLESS_LINK_CLICKED_CONTINUE_DESC: "Click the button below to log in on this device", - PWLESS_LINK_CLICKED_CONTINUE_BUTTON: "CONTINUE", - PWLESS_RESEND_SUCCESS_EMAIL: "Email resent", - PWLESS_RESEND_SUCCESS_PHONE: "SMS resent", - PWLESS_RESEND_BTN_DISABLED_START: "Resend in ", - PWLESS_RESEND_BTN_DISABLED_END: "", - PWLESS_RESEND_BTN_EMAIL: "Resend Email", - PWLESS_RESEND_BTN_PHONE: "Resend SMS", - PWLESS_USER_INPUT_CODE_HEADER_TITLE: "Enter OTP", - PWLESS_USER_INPUT_CODE_HEADER_SUBTITLE: "An OTP was sent to you at", - PWLESS_USER_INPUT_CODE_HEADER_SUBTITLE_LINK: "An OTP and a magic link was sent to you at", - PWLESS_USER_INPUT_CODE_INPUT_LABEL: "OTP", - PWLESS_MFA_LOGOUT: "Logout", - PWLESS_MFA_HEADER_TITLE_PHONE: "SMS based OTP", - PWLESS_MFA_HEADER_TITLE_EMAIL: "Email based OTP", - PWLESS_MFA_FOOTER_CHOOSER_ANOTHER: "Choose another factor", - PWLESS_MFA_FOOTER_LOGOUT: "Logout", - PWLESS_MFA_OTP_NOT_ALLOWED_TO_SETUP: "You are not allowed to set up OTP.", - /* - * The following are error messages from our backend SDK. - * These are returned as full messages to preserver compatibilty, but they work just like the keys above. - * They are shown as is by default (setting the value to undefined will display the raw translation key) - */ - "Failed to generate a one time code. Please try again": undefined, - "Phone number is invalid": undefined, - "Email is invalid": undefined, - "Cannot sign in / up due to security reasons. Please try a different login method or contact support. (ERR_CODE_002)": - undefined, - "Cannot sign in / up due to security reasons. Please try a different login method or contact support. (ERR_CODE_003)": - undefined, - } - ), -}; - -var LinkClickedScreen = function (props) { - var userContext = uiEntry.useUserContext(); - var _a = React.useState(false), - requireUserInteraction = _a[0], - setRequireUserInteraction = _a[1]; - var consumeCodeAtMount = React.useCallback( - function () { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - var preAuthSessionId, linkCode, loginAttemptInfo; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - preAuthSessionId = genericComponentOverrideContext.getQueryParams("preAuthSessionId"); - linkCode = genericComponentOverrideContext.getURLHash(); - if (!(preAuthSessionId === null || preAuthSessionId.length === 0 || linkCode.length === 0)) - return [3 /*break*/, 2]; - return [ - 4 /*yield*/, - genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToAuth({ - history: props.history, - queryParams: { - error: "signin", - }, - redirectBack: false, - }), - ]; - case 1: - _a.sent(); - return [2 /*return*/, "REDIRECTING"]; - case 2: - return [ - 4 /*yield*/, - props.recipe.webJSRecipe.getLoginAttemptInfo({ userContext: userContext }), - ]; - case 3: - loginAttemptInfo = _a.sent(); - if ( - (loginAttemptInfo === null || loginAttemptInfo === void 0 - ? void 0 - : loginAttemptInfo.preAuthSessionId) !== preAuthSessionId - ) { - return [2 /*return*/, "REQUIRES_INTERACTION"]; - } - return [ - 2 /*return*/, - props.recipe.webJSRecipe.consumeCode({ - userContext: userContext, - }), - ]; - } - }); - }); - }, - [props.recipe, props.history] - ); - var handleConsumeResp = React.useCallback( - function (response) { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - var loginAttemptInfo; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - if (response === "REQUIRES_INTERACTION") { - // We set this here, to make sure it's set after a possible remount - setRequireUserInteraction(true); - } - if (typeof response === "string") { - // In this case we are already redirecting or showing the continue button - return [2 /*return*/]; - } - if (response.status === "RESTART_FLOW_ERROR") { - return [ - 2 /*return*/, - genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToAuth({ - history: props.history, - queryParams: { - error: "restart_link", - }, - redirectBack: false, - }), - ]; - } - if (response.status === "SIGN_IN_UP_NOT_ALLOWED") { - return [ - 2 /*return*/, - genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToAuth({ - history: props.history, - queryParams: { - error: response.reason, - }, - redirectBack: false, - }), - ]; - } - if (!(response.status === "OK")) return [3 /*break*/, 3]; - return [ - 4 /*yield*/, - props.recipe.webJSRecipe.getLoginAttemptInfo({ - userContext: userContext, - }), - ]; - case 1: - loginAttemptInfo = _a.sent(); - return [ - 4 /*yield*/, - props.recipe.webJSRecipe.clearLoginAttemptInfo({ - userContext: userContext, - }), - ]; - case 2: - _a.sent(); - return [ - 2 /*return*/, - recipe.Session.getInstanceOrThrow().validateGlobalClaimsAndHandleSuccessRedirection( - { - rid: props.recipe.config.recipeId, - successRedirectContext: { - action: "SUCCESS", - isNewRecipeUser: response.createdNewRecipeUser, - user: response.user, - redirectToPath: - loginAttemptInfo === null || loginAttemptInfo === void 0 - ? void 0 - : loginAttemptInfo.redirectToPath, - }, - }, - userContext, - props.history - ), - ]; - case 3: - return [2 /*return*/]; - } - }); - }); - }, - [props.history, props.recipe] - ); - var handleConsumeError = React.useCallback( - function (err) { - if (STGeneralError__default.default.isThisError(err)) { - return genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToAuth({ - history: props.history, - queryParams: { - error: "custom", - message: err.message, - }, - redirectBack: false, - }); - } else { - return genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToAuth({ - history: props.history, - queryParams: { - error: "signin", - }, - redirectBack: false, - }); - } - }, - [props.recipe, props.history] - ); - genericComponentOverrideContext.useOnMountAPICall(consumeCodeAtMount, handleConsumeResp, handleConsumeError); - var recipeComponentOverrides = props.useComponentOverrides(); - var childProps = { - recipeImplementation: props.recipe.webJSRecipe, - config: props.recipe.config, - requireUserInteraction: requireUserInteraction, - consumeCode: function () { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - var consumeResp, err_1; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - _a.trys.push([0, 3, , 4]); - return [ - 4 /*yield*/, - props.recipe.webJSRecipe.consumeCode({ - userContext: userContext, - }), - ]; - case 1: - consumeResp = _a.sent(); - return [4 /*yield*/, handleConsumeResp(consumeResp)]; - case 2: - _a.sent(); - return [3 /*break*/, 4]; - case 3: - err_1 = _a.sent(); - void handleConsumeError(err_1); - return [3 /*break*/, 4]; - case 4: - return [2 /*return*/]; - } - }); - }); - }, - }; - return jsxRuntime.jsx( - uiEntry.ComponentOverrideContext.Provider, - genericComponentOverrideContext.__assign( - { value: recipeComponentOverrides }, - { - children: jsxRuntime.jsx( - uiEntry.FeatureWrapper, - genericComponentOverrideContext.__assign( - { - useShadowDom: props.recipe.config.useShadowDom, - defaultStore: defaultTranslationsPasswordless, - }, - { - children: jsxRuntime.jsxs(React.Fragment, { - children: [ - props.children === undefined && - jsxRuntime.jsx( - LinkClickedScreen$1, - genericComponentOverrideContext.__assign({}, childProps) - ), - props.children && - React__namespace.default.Children.map(props.children, function (child) { - if (React__namespace.default.isValidElement(child)) { - return React__namespace.default.cloneElement(child, childProps); - } - return child; - }), - ], - }), - } - ) - ), - } - ) - ); -}; - -var PasswordlessCloseTabScreen = function () { - var t = translationContext.useTranslation(); - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "container" }, - { - children: jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "row noFormRow" }, - { - children: [ - jsxRuntime.jsx(checkedRoundIcon.CheckedRoundIcon, {}), - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerTitle" }, - { children: t("PWLESS_CLOSE_TAB_TITLE") } - ) - ), - jsxRuntime.jsx("div", { "data-supertokens": "divider" }), - jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerSubtitle secondaryText" }, - { - children: [ - t("PWLESS_CLOSE_TAB_SUBTITLE_LINE1"), - jsxRuntime.jsx("br", {}), - t("PWLESS_CLOSE_TAB_SUBTITLE_LINE2"), - ], - } - ) - ), - ], - } - ) - ), - } - ) - ); -}; -var CloseTabScreen = uiEntry.withOverride("PasswordlessCloseTabScreen", PasswordlessCloseTabScreen); - -var SignInUpFooter = uiEntry.withOverride("PasswordlessSignInUpFooter", function PasswordlessSignInUpFooter(_a) { - var termsOfServiceLink = _a.termsOfServiceLink, - privacyPolicyLink = _a.privacyPolicyLink; - var t = translationContext.useTranslation(); - if (termsOfServiceLink === undefined && privacyPolicyLink === undefined) { - return null; - } - return jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "secondaryText privacyPolicyAndTermsAndConditions" }, - { - children: [ - t("PWLESS_SIGN_IN_UP_FOOTER_START"), - termsOfServiceLink !== undefined && - jsxRuntime.jsx( - "a", - genericComponentOverrideContext.__assign( - { - "data-supertokens": "link", - href: termsOfServiceLink, - target: "_blank", - rel: "noopener noreferer", - }, - { children: t("PWLESS_SIGN_IN_UP_FOOTER_TOS") } - ) - ), - termsOfServiceLink !== undefined && - privacyPolicyLink !== undefined && - t("PWLESS_SIGN_IN_UP_FOOTER_AND"), - privacyPolicyLink !== undefined && - jsxRuntime.jsx( - "a", - genericComponentOverrideContext.__assign( - { - "data-supertokens": "link", - href: privacyPolicyLink, - target: "_blank", - rel: "noopener noreferer", - }, - { children: t("PWLESS_SIGN_IN_UP_FOOTER_PP") } - ) - ), - t("PWLESS_SIGN_IN_UP_FOOTER_END"), - ], - } - ) - ); -}); - -var EmailForm = uiEntry.withOverride("PasswordlessEmailForm", function PasswordlessEmailForm(props) { - var _this = this; - var _a; - var userContext = uiEntry.useUserContext(); - return jsxRuntime.jsx(formBase.FormBase, { - clearError: props.clearError, - onError: props.onError, - formFields: [ - { - id: "email", - label: "PWLESS_SIGN_IN_UP_EMAIL_LABEL", - optional: false, - autofocus: true, - placeholder: "", - autoComplete: "email", - // We are using the default validator that allows any string - validate: validators.defaultValidate, - }, - ], - buttonLabel: "PWLESS_SIGN_IN_UP_CONTINUE_BUTTON", - onSuccess: props.onSuccess, - callAPI: function (formFields) { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - var email, validationRes, response; - var _a; - return genericComponentOverrideContext.__generator(this, function (_b) { - switch (_b.label) { - case 0: - email = - (_a = formFields.find(function (field) { - return field.id === "email"; - })) === null || _a === void 0 - ? void 0 - : _a.value; - if (email === undefined) { - throw new STGeneralError__default.default("GENERAL_ERROR_EMAIL_UNDEFINED"); - } - return [4 /*yield*/, props.config.validateEmailAddress(email)]; - case 1: - validationRes = _b.sent(); - if (validationRes !== undefined) { - throw new STGeneralError__default.default(validationRes); - } - return [ - 4 /*yield*/, - props.recipeImplementation.createCode({ - email: email, - userContext: userContext, - }), - ]; - case 2: - response = _b.sent(); - if (response.status === "SIGN_IN_UP_NOT_ALLOWED") { - throw new STGeneralError__default.default(response.reason); - } - return [2 /*return*/, response]; - } - }); - }); - }, - validateOnBlur: false, - showLabels: true, - footer: - (_a = props.footer) !== null && _a !== void 0 - ? _a - : jsxRuntime.jsx(SignInUpFooter, { - privacyPolicyLink: props.config.signInUpFeature.privacyPolicyLink, - termsOfServiceLink: props.config.signInUpFeature.termsOfServiceLink, - }), }); -}); - -function getDefaultExportFromCjs(x) { - return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x; -} - -var intlTelInputExports$1 = {}; -var intlTelInput$2 = { - get exports() { - return intlTelInputExports$1; - }, - set exports(v) { - intlTelInputExports$1 = v; - }, -}; - -var intlTelInputExports = {}; -var intlTelInput$1 = { - get exports() { - return intlTelInputExports; - }, - set exports(v) { - intlTelInputExports = v; - }, -}; - -/* - * International Telephone Input v17.0.21 - * https://github.com/jackocnr/intl-tel-input.git - * Licensed under the MIT license - */ - -(function (module) { - // wrap in UMD - (function (factory) { - if (module.exports) module.exports = factory(); - else window.intlTelInput = factory(); - })(function (undefined$1) { - return (function () { - // Array of country objects for the flag dropdown. - // Here is the criteria for the plugin to support a given country/territory - // - It has an iso2 code: https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 - // - It has it's own country calling code (it is not a sub-region of another country): https://en.wikipedia.org/wiki/List_of_country_calling_codes - // - It has a flag in the region-flags project: https://github.com/behdad/region-flags/tree/gh-pages/png - // - It is supported by libphonenumber (it must be listed on this page): https://github.com/googlei18n/libphonenumber/blob/master/resources/ShortNumberMetadata.xml - // Each country array has the following information: - // [ - // Country name, - // iso2 code, - // International dial code, - // Order (if >1 country with same dial code), - // Area codes - // ] - var allCountries = [ - ["Afghanistan (‫افغانستان‬‎)", "af", "93"], - ["Albania (Shqipëri)", "al", "355"], - ["Algeria (‫الجزائر‬‎)", "dz", "213"], - ["American Samoa", "as", "1", 5, ["684"]], - ["Andorra", "ad", "376"], - ["Angola", "ao", "244"], - ["Anguilla", "ai", "1", 6, ["264"]], - ["Antigua and Barbuda", "ag", "1", 7, ["268"]], - ["Argentina", "ar", "54"], - ["Armenia (Հայաստան)", "am", "374"], - ["Aruba", "aw", "297"], - ["Ascension Island", "ac", "247"], - ["Australia", "au", "61", 0], - ["Austria (Österreich)", "at", "43"], - ["Azerbaijan (Azərbaycan)", "az", "994"], - ["Bahamas", "bs", "1", 8, ["242"]], - ["Bahrain (‫البحرين‬‎)", "bh", "973"], - ["Bangladesh (বাংলাদেশ)", "bd", "880"], - ["Barbados", "bb", "1", 9, ["246"]], - ["Belarus (Беларусь)", "by", "375"], - ["Belgium (België)", "be", "32"], - ["Belize", "bz", "501"], - ["Benin (Bénin)", "bj", "229"], - ["Bermuda", "bm", "1", 10, ["441"]], - ["Bhutan (འབྲུག)", "bt", "975"], - ["Bolivia", "bo", "591"], - ["Bosnia and Herzegovina (Босна и Херцеговина)", "ba", "387"], - ["Botswana", "bw", "267"], - ["Brazil (Brasil)", "br", "55"], - ["British Indian Ocean Territory", "io", "246"], - ["British Virgin Islands", "vg", "1", 11, ["284"]], - ["Brunei", "bn", "673"], - ["Bulgaria (България)", "bg", "359"], - ["Burkina Faso", "bf", "226"], - ["Burundi (Uburundi)", "bi", "257"], - ["Cambodia (កម្ពុជា)", "kh", "855"], - ["Cameroon (Cameroun)", "cm", "237"], - [ - "Canada", - "ca", - "1", - 1, - [ - "204", - "226", - "236", - "249", - "250", - "289", - "306", - "343", - "365", - "387", - "403", - "416", - "418", - "431", - "437", - "438", - "450", - "506", - "514", - "519", - "548", - "579", - "581", - "587", - "604", - "613", - "639", - "647", - "672", - "705", - "709", - "742", - "778", - "780", - "782", - "807", - "819", - "825", - "867", - "873", - "902", - "905", - ], - ], - ["Cape Verde (Kabu Verdi)", "cv", "238"], - ["Caribbean Netherlands", "bq", "599", 1, ["3", "4", "7"]], - ["Cayman Islands", "ky", "1", 12, ["345"]], - ["Central African Republic (République centrafricaine)", "cf", "236"], - ["Chad (Tchad)", "td", "235"], - ["Chile", "cl", "56"], - ["China (中国)", "cn", "86"], - ["Christmas Island", "cx", "61", 2, ["89164"]], - ["Cocos (Keeling) Islands", "cc", "61", 1, ["89162"]], - ["Colombia", "co", "57"], - ["Comoros (‫جزر القمر‬‎)", "km", "269"], - ["Congo (DRC) (Jamhuri ya Kidemokrasia ya Kongo)", "cd", "243"], - ["Congo (Republic) (Congo-Brazzaville)", "cg", "242"], - ["Cook Islands", "ck", "682"], - ["Costa Rica", "cr", "506"], - ["Côte d’Ivoire", "ci", "225"], - ["Croatia (Hrvatska)", "hr", "385"], - ["Cuba", "cu", "53"], - ["Curaçao", "cw", "599", 0], - ["Cyprus (Κύπρος)", "cy", "357"], - ["Czech Republic (Česká republika)", "cz", "420"], - ["Denmark (Danmark)", "dk", "45"], - ["Djibouti", "dj", "253"], - ["Dominica", "dm", "1", 13, ["767"]], - ["Dominican Republic (República Dominicana)", "do", "1", 2, ["809", "829", "849"]], - ["Ecuador", "ec", "593"], - ["Egypt (‫مصر‬‎)", "eg", "20"], - ["El Salvador", "sv", "503"], - ["Equatorial Guinea (Guinea Ecuatorial)", "gq", "240"], - ["Eritrea", "er", "291"], - ["Estonia (Eesti)", "ee", "372"], - ["Eswatini", "sz", "268"], - ["Ethiopia", "et", "251"], - ["Falkland Islands (Islas Malvinas)", "fk", "500"], - ["Faroe Islands (Føroyar)", "fo", "298"], - ["Fiji", "fj", "679"], - ["Finland (Suomi)", "fi", "358", 0], - ["France", "fr", "33"], - ["French Guiana (Guyane française)", "gf", "594"], - ["French Polynesia (Polynésie française)", "pf", "689"], - ["Gabon", "ga", "241"], - ["Gambia", "gm", "220"], - ["Georgia (საქართველო)", "ge", "995"], - ["Germany (Deutschland)", "de", "49"], - ["Ghana (Gaana)", "gh", "233"], - ["Gibraltar", "gi", "350"], - ["Greece (Ελλάδα)", "gr", "30"], - ["Greenland (Kalaallit Nunaat)", "gl", "299"], - ["Grenada", "gd", "1", 14, ["473"]], - ["Guadeloupe", "gp", "590", 0], - ["Guam", "gu", "1", 15, ["671"]], - ["Guatemala", "gt", "502"], - ["Guernsey", "gg", "44", 1, ["1481", "7781", "7839", "7911"]], - ["Guinea (Guinée)", "gn", "224"], - ["Guinea-Bissau (Guiné Bissau)", "gw", "245"], - ["Guyana", "gy", "592"], - ["Haiti", "ht", "509"], - ["Honduras", "hn", "504"], - ["Hong Kong (香港)", "hk", "852"], - ["Hungary (Magyarország)", "hu", "36"], - ["Iceland (Ísland)", "is", "354"], - ["India (भारत)", "in", "91"], - ["Indonesia", "id", "62"], - ["Iran (‫ایران‬‎)", "ir", "98"], - ["Iraq (‫العراق‬‎)", "iq", "964"], - ["Ireland", "ie", "353"], - ["Isle of Man", "im", "44", 2, ["1624", "74576", "7524", "7924", "7624"]], - ["Israel (‫ישראל‬‎)", "il", "972"], - ["Italy (Italia)", "it", "39", 0], - ["Jamaica", "jm", "1", 4, ["876", "658"]], - ["Japan (日本)", "jp", "81"], - ["Jersey", "je", "44", 3, ["1534", "7509", "7700", "7797", "7829", "7937"]], - ["Jordan (‫الأردن‬‎)", "jo", "962"], - ["Kazakhstan (Казахстан)", "kz", "7", 1, ["33", "7"]], - ["Kenya", "ke", "254"], - ["Kiribati", "ki", "686"], - ["Kosovo", "xk", "383"], - ["Kuwait (‫الكويت‬‎)", "kw", "965"], - ["Kyrgyzstan (Кыргызстан)", "kg", "996"], - ["Laos (ລາວ)", "la", "856"], - ["Latvia (Latvija)", "lv", "371"], - ["Lebanon (‫لبنان‬‎)", "lb", "961"], - ["Lesotho", "ls", "266"], - ["Liberia", "lr", "231"], - ["Libya (‫ليبيا‬‎)", "ly", "218"], - ["Liechtenstein", "li", "423"], - ["Lithuania (Lietuva)", "lt", "370"], - ["Luxembourg", "lu", "352"], - ["Macau (澳門)", "mo", "853"], - ["Madagascar (Madagasikara)", "mg", "261"], - ["Malawi", "mw", "265"], - ["Malaysia", "my", "60"], - ["Maldives", "mv", "960"], - ["Mali", "ml", "223"], - ["Malta", "mt", "356"], - ["Marshall Islands", "mh", "692"], - ["Martinique", "mq", "596"], - ["Mauritania (‫موريتانيا‬‎)", "mr", "222"], - ["Mauritius (Moris)", "mu", "230"], - ["Mayotte", "yt", "262", 1, ["269", "639"]], - ["Mexico (México)", "mx", "52"], - ["Micronesia", "fm", "691"], - ["Moldova (Republica Moldova)", "md", "373"], - ["Monaco", "mc", "377"], - ["Mongolia (Монгол)", "mn", "976"], - ["Montenegro (Crna Gora)", "me", "382"], - ["Montserrat", "ms", "1", 16, ["664"]], - ["Morocco (‫المغرب‬‎)", "ma", "212", 0], - ["Mozambique (Moçambique)", "mz", "258"], - ["Myanmar (Burma) (မြန်မာ)", "mm", "95"], - ["Namibia (Namibië)", "na", "264"], - ["Nauru", "nr", "674"], - ["Nepal (नेपाल)", "np", "977"], - ["Netherlands (Nederland)", "nl", "31"], - ["New Caledonia (Nouvelle-Calédonie)", "nc", "687"], - ["New Zealand", "nz", "64"], - ["Nicaragua", "ni", "505"], - ["Niger (Nijar)", "ne", "227"], - ["Nigeria", "ng", "234"], - ["Niue", "nu", "683"], - ["Norfolk Island", "nf", "672"], - ["North Korea (조선 민주주의 인민 공화국)", "kp", "850"], - ["North Macedonia (Северна Македонија)", "mk", "389"], - ["Northern Mariana Islands", "mp", "1", 17, ["670"]], - ["Norway (Norge)", "no", "47", 0], - ["Oman (‫عُمان‬‎)", "om", "968"], - ["Pakistan (‫پاکستان‬‎)", "pk", "92"], - ["Palau", "pw", "680"], - ["Palestine (‫فلسطين‬‎)", "ps", "970"], - ["Panama (Panamá)", "pa", "507"], - ["Papua New Guinea", "pg", "675"], - ["Paraguay", "py", "595"], - ["Peru (Perú)", "pe", "51"], - ["Philippines", "ph", "63"], - ["Poland (Polska)", "pl", "48"], - ["Portugal", "pt", "351"], - ["Puerto Rico", "pr", "1", 3, ["787", "939"]], - ["Qatar (‫قطر‬‎)", "qa", "974"], - ["Réunion (La Réunion)", "re", "262", 0], - ["Romania (România)", "ro", "40"], - ["Russia (Россия)", "ru", "7", 0], - ["Rwanda", "rw", "250"], - ["Saint Barthélemy", "bl", "590", 1], - ["Saint Helena", "sh", "290"], - ["Saint Kitts and Nevis", "kn", "1", 18, ["869"]], - ["Saint Lucia", "lc", "1", 19, ["758"]], - ["Saint Martin (Saint-Martin (partie française))", "mf", "590", 2], - ["Saint Pierre and Miquelon (Saint-Pierre-et-Miquelon)", "pm", "508"], - ["Saint Vincent and the Grenadines", "vc", "1", 20, ["784"]], - ["Samoa", "ws", "685"], - ["San Marino", "sm", "378"], - ["São Tomé and Príncipe (São Tomé e Príncipe)", "st", "239"], - ["Saudi Arabia (‫المملكة العربية السعودية‬‎)", "sa", "966"], - ["Senegal (Sénégal)", "sn", "221"], - ["Serbia (Србија)", "rs", "381"], - ["Seychelles", "sc", "248"], - ["Sierra Leone", "sl", "232"], - ["Singapore", "sg", "65"], - ["Sint Maarten", "sx", "1", 21, ["721"]], - ["Slovakia (Slovensko)", "sk", "421"], - ["Slovenia (Slovenija)", "si", "386"], - ["Solomon Islands", "sb", "677"], - ["Somalia (Soomaaliya)", "so", "252"], - ["South Africa", "za", "27"], - ["South Korea (대한민국)", "kr", "82"], - ["South Sudan (‫جنوب السودان‬‎)", "ss", "211"], - ["Spain (España)", "es", "34"], - ["Sri Lanka (ශ්‍රී ලංකාව)", "lk", "94"], - ["Sudan (‫السودان‬‎)", "sd", "249"], - ["Suriname", "sr", "597"], - ["Svalbard and Jan Mayen", "sj", "47", 1, ["79"]], - ["Sweden (Sverige)", "se", "46"], - ["Switzerland (Schweiz)", "ch", "41"], - ["Syria (‫سوريا‬‎)", "sy", "963"], - ["Taiwan (台灣)", "tw", "886"], - ["Tajikistan", "tj", "992"], - ["Tanzania", "tz", "255"], - ["Thailand (ไทย)", "th", "66"], - ["Timor-Leste", "tl", "670"], - ["Togo", "tg", "228"], - ["Tokelau", "tk", "690"], - ["Tonga", "to", "676"], - ["Trinidad and Tobago", "tt", "1", 22, ["868"]], - ["Tunisia (‫تونس‬‎)", "tn", "216"], - ["Turkey (Türkiye)", "tr", "90"], - ["Turkmenistan", "tm", "993"], - ["Turks and Caicos Islands", "tc", "1", 23, ["649"]], - ["Tuvalu", "tv", "688"], - ["U.S. Virgin Islands", "vi", "1", 24, ["340"]], - ["Uganda", "ug", "256"], - ["Ukraine (Україна)", "ua", "380"], - ["United Arab Emirates (‫الإمارات العربية المتحدة‬‎)", "ae", "971"], - ["United Kingdom", "gb", "44", 0], - ["United States", "us", "1", 0], - ["Uruguay", "uy", "598"], - ["Uzbekistan (Oʻzbekiston)", "uz", "998"], - ["Vanuatu", "vu", "678"], - ["Vatican City (Città del Vaticano)", "va", "39", 1, ["06698"]], - ["Venezuela", "ve", "58"], - ["Vietnam (Việt Nam)", "vn", "84"], - ["Wallis and Futuna (Wallis-et-Futuna)", "wf", "681"], - ["Western Sahara (‫الصحراء الغربية‬‎)", "eh", "212", 1, ["5288", "5289"]], - ["Yemen (‫اليمن‬‎)", "ye", "967"], - ["Zambia", "zm", "260"], - ["Zimbabwe", "zw", "263"], - ["Åland Islands", "ax", "358", 1, ["18"]], - ]; - // loop over all of the countries above, restructuring the data to be objects with named keys - for (var i = 0; i < allCountries.length; i++) { - var c = allCountries[i]; - allCountries[i] = { - name: c[0], - iso2: c[1], - dialCode: c[2], - priority: c[3] || 0, - areaCodes: c[4] || null, - }; - } - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } - } - function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - return Constructor; - } - var intlTelInputGlobals = { - getInstance: function getInstance(input) { - var id = input.getAttribute("data-intl-tel-input-id"); - return window.intlTelInputGlobals.instances[id]; - }, - instances: {}, - // using a global like this allows us to mock it in the tests - documentReady: function documentReady() { - return document.readyState === "complete"; - }, - }; - if (typeof window === "object") window.intlTelInputGlobals = intlTelInputGlobals; - // these vars persist through all instances of the plugin - var id = 0; - var defaults = { - // whether or not to allow the dropdown - allowDropdown: true, - // if there is just a dial code in the input: remove it on blur - autoHideDialCode: true, - // add a placeholder in the input with an example number for the selected country - autoPlaceholder: "polite", - // modify the parentClass - customContainer: "", - // modify the auto placeholder - customPlaceholder: null, - // append menu to specified element - dropdownContainer: null, - // don't display these countries - excludeCountries: [], - // format the input value during initialisation and on setNumber - formatOnDisplay: true, - // geoIp lookup function - geoIpLookup: null, - // inject a hidden input with this name, and on submit, populate it with the result of getNumber - hiddenInput: "", - // initial country - initialCountry: "", - // localized country names e.g. { 'de': 'Deutschland' } - localizedCountries: null, - // don't insert international dial codes - nationalMode: true, - // display only these countries - onlyCountries: [], - // number type to use for placeholders - placeholderNumberType: "MOBILE", - // the countries at the top of the list. defaults to united states and united kingdom - preferredCountries: ["us", "gb"], - // display the country dial code next to the selected flag so it's not part of the typed number - separateDialCode: false, - // specify the path to the libphonenumber script to enable validation/formatting - utilsScript: "", - }; - // https://en.wikipedia.org/wiki/List_of_North_American_Numbering_Plan_area_codes#Non-geographic_area_codes - var regionlessNanpNumbers = [ - "800", - "822", - "833", - "844", - "855", - "866", - "877", - "880", - "881", - "882", - "883", - "884", - "885", - "886", - "887", - "888", - "889", - ]; - // utility function to iterate over an object. can't use Object.entries or native forEach because - // of IE11 - var forEachProp = function forEachProp(obj, callback) { - var keys = Object.keys(obj); - for (var i = 0; i < keys.length; i++) { - callback(keys[i], obj[keys[i]]); - } - }; - // run a method on each instance of the plugin - var forEachInstance = function forEachInstance(method) { - forEachProp(window.intlTelInputGlobals.instances, function (key) { - window.intlTelInputGlobals.instances[key][method](); - }); - }; - // this is our plugin class that we will create an instance of - // eslint-disable-next-line no-unused-vars - var Iti = - /*#__PURE__*/ - (function () { - function Iti(input, options) { - var _this = this; - _classCallCheck(this, Iti); - this.id = id++; - this.telInput = input; - this.activeItem = null; - this.highlightedItem = null; - // process specified options / defaults - // alternative to Object.assign, which isn't supported by IE11 - var customOptions = options || {}; - this.options = {}; - forEachProp(defaults, function (key, value) { - _this.options[key] = customOptions.hasOwnProperty(key) ? customOptions[key] : value; - }); - this.hadInitialPlaceholder = Boolean(input.getAttribute("placeholder")); - } - _createClass(Iti, [ - { - key: "_init", - value: function _init() { - var _this2 = this; - // if in nationalMode, disable options relating to dial codes - if (this.options.nationalMode) this.options.autoHideDialCode = false; - // if separateDialCode then doesn't make sense to A) insert dial code into input - // (autoHideDialCode), and B) display national numbers (because we're displaying the country - // dial code next to them) - if (this.options.separateDialCode) { - this.options.autoHideDialCode = this.options.nationalMode = false; - } - // we cannot just test screen size as some smartphones/website meta tags will report desktop - // resolutions - // Note: for some reason jasmine breaks if you put this in the main Plugin function with the - // rest of these declarations - // Note: to target Android Mobiles (and not Tablets), we must find 'Android' and 'Mobile' - this.isMobile = - /Android.+Mobile|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test( - navigator.userAgent - ); - if (this.isMobile) { - // trigger the mobile dropdown css - document.body.classList.add("iti-mobile"); - // on mobile, we want a full screen dropdown, so we must append it to the body - if (!this.options.dropdownContainer) this.options.dropdownContainer = document.body; - } - // these promises get resolved when their individual requests complete - // this way the dev can do something like iti.promise.then(...) to know when all requests are - // complete - if (typeof Promise !== "undefined") { - var autoCountryPromise = new Promise(function (resolve, reject) { - _this2.resolveAutoCountryPromise = resolve; - _this2.rejectAutoCountryPromise = reject; - }); - var utilsScriptPromise = new Promise(function (resolve, reject) { - _this2.resolveUtilsScriptPromise = resolve; - _this2.rejectUtilsScriptPromise = reject; - }); - this.promise = Promise.all([autoCountryPromise, utilsScriptPromise]); - } else { - // prevent errors when Promise doesn't exist - this.resolveAutoCountryPromise = this.rejectAutoCountryPromise = function () {}; - this.resolveUtilsScriptPromise = this.rejectUtilsScriptPromise = function () {}; - } - // in various situations there could be no country selected initially, but we need to be able - // to assume this variable exists - this.selectedCountryData = {}; - // process all the data: onlyCountries, excludeCountries, preferredCountries etc - this._processCountryData(); - // generate the markup - this._generateMarkup(); - // set the initial state of the input value and the selected flag - this._setInitialState(); - // start all of the event listeners: autoHideDialCode, input keydown, selectedFlag click - this._initListeners(); - // utils script, and auto country - this._initRequests(); - }, - }, - { - key: "_processCountryData", - value: function _processCountryData() { - // process onlyCountries or excludeCountries array if present - this._processAllCountries(); - // process the countryCodes map - this._processCountryCodes(); - // process the preferredCountries - this._processPreferredCountries(); - // translate countries according to localizedCountries option - if (this.options.localizedCountries) this._translateCountriesByLocale(); - // sort countries by name - if (this.options.onlyCountries.length || this.options.localizedCountries) { - this.countries.sort(this._countryNameSort); - } - }, - }, - { - key: "_addCountryCode", - value: function _addCountryCode(iso2, countryCode, priority) { - if (countryCode.length > this.countryCodeMaxLen) { - this.countryCodeMaxLen = countryCode.length; - } - if (!this.countryCodes.hasOwnProperty(countryCode)) { - this.countryCodes[countryCode] = []; - } - // bail if we already have this country for this countryCode - for (var i = 0; i < this.countryCodes[countryCode].length; i++) { - if (this.countryCodes[countryCode][i] === iso2) return; - } - // check for undefined as 0 is falsy - var index = priority !== undefined$1 ? priority : this.countryCodes[countryCode].length; - this.countryCodes[countryCode][index] = iso2; - }, - }, - { - key: "_processAllCountries", - value: function _processAllCountries() { - if (this.options.onlyCountries.length) { - var lowerCaseOnlyCountries = this.options.onlyCountries.map(function (country) { - return country.toLowerCase(); - }); - this.countries = allCountries.filter(function (country) { - return lowerCaseOnlyCountries.indexOf(country.iso2) > -1; - }); - } else if (this.options.excludeCountries.length) { - var lowerCaseExcludeCountries = this.options.excludeCountries.map(function ( - country - ) { - return country.toLowerCase(); - }); - this.countries = allCountries.filter(function (country) { - return lowerCaseExcludeCountries.indexOf(country.iso2) === -1; - }); - } else { - this.countries = allCountries; - } - }, - }, - { - key: "_translateCountriesByLocale", - value: function _translateCountriesByLocale() { - for (var i = 0; i < this.countries.length; i++) { - var iso = this.countries[i].iso2.toLowerCase(); - if (this.options.localizedCountries.hasOwnProperty(iso)) { - this.countries[i].name = this.options.localizedCountries[iso]; - } - } - }, - }, - { - key: "_countryNameSort", - value: function _countryNameSort(a, b) { - return a.name.localeCompare(b.name); - }, - }, - { - key: "_processCountryCodes", - value: function _processCountryCodes() { - this.countryCodeMaxLen = 0; - // here we store just dial codes - this.dialCodes = {}; - // here we store "country codes" (both dial codes and their area codes) - this.countryCodes = {}; - // first: add dial codes - for (var i = 0; i < this.countries.length; i++) { - var c = this.countries[i]; - if (!this.dialCodes[c.dialCode]) this.dialCodes[c.dialCode] = true; - this._addCountryCode(c.iso2, c.dialCode, c.priority); - } - // next: add area codes - // this is a second loop over countries, to make sure we have all of the "root" countries - // already in the map, so that we can access them, as each time we add an area code substring - // to the map, we also need to include the "root" country's code, as that also matches - for (var _i = 0; _i < this.countries.length; _i++) { - var _c = this.countries[_i]; - // area codes - if (_c.areaCodes) { - var rootCountryCode = this.countryCodes[_c.dialCode][0]; - // for each area code - for (var j = 0; j < _c.areaCodes.length; j++) { - var areaCode = _c.areaCodes[j]; - // for each digit in the area code to add all partial matches as well - for (var k = 1; k < areaCode.length; k++) { - var partialDialCode = _c.dialCode + areaCode.substr(0, k); - // start with the root country, as that also matches this dial code - this._addCountryCode(rootCountryCode, partialDialCode); - this._addCountryCode(_c.iso2, partialDialCode); - } - // add the full area code - this._addCountryCode(_c.iso2, _c.dialCode + areaCode); - } - } - } - }, - }, - { - key: "_processPreferredCountries", - value: function _processPreferredCountries() { - this.preferredCountries = []; - for (var i = 0; i < this.options.preferredCountries.length; i++) { - var countryCode = this.options.preferredCountries[i].toLowerCase(); - var countryData = this._getCountryData(countryCode, false, true); - if (countryData) this.preferredCountries.push(countryData); - } - }, - }, - { - key: "_createEl", - value: function _createEl(name, attrs, container) { - var el = document.createElement(name); - if (attrs) - forEachProp(attrs, function (key, value) { - return el.setAttribute(key, value); - }); - if (container) container.appendChild(el); - return el; - }, - }, - { - key: "_generateMarkup", - value: function _generateMarkup() { - // if autocomplete does not exist on the element and its form, then - // prevent autocomplete as there's no safe, cross-browser event we can react to, so it can - // easily put the plugin in an inconsistent state e.g. the wrong flag selected for the - // autocompleted number, which on submit could mean wrong number is saved (esp in nationalMode) - if ( - !this.telInput.hasAttribute("autocomplete") && - !(this.telInput.form && this.telInput.form.hasAttribute("autocomplete")) - ) { - this.telInput.setAttribute("autocomplete", "off"); - } - // containers (mostly for positioning) - var parentClass = "iti"; - if (this.options.allowDropdown) parentClass += " iti--allow-dropdown"; - if (this.options.separateDialCode) parentClass += " iti--separate-dial-code"; - if (this.options.customContainer) { - parentClass += " "; - parentClass += this.options.customContainer; - } - var wrapper = this._createEl("div", { - class: parentClass, - }); - this.telInput.parentNode.insertBefore(wrapper, this.telInput); - this.flagsContainer = this._createEl( - "div", - { - class: "iti__flag-container", - }, - wrapper - ); - wrapper.appendChild(this.telInput); - // selected flag (displayed to left of input) - this.selectedFlag = this._createEl( - "div", - { - class: "iti__selected-flag", - role: "combobox", - "aria-controls": "iti-".concat(this.id, "__country-listbox"), - "aria-owns": "iti-".concat(this.id, "__country-listbox"), - "aria-expanded": "false", - }, - this.flagsContainer - ); - this.selectedFlagInner = this._createEl( - "div", - { - class: "iti__flag", - }, - this.selectedFlag - ); - if (this.options.separateDialCode) { - this.selectedDialCode = this._createEl( - "div", - { - class: "iti__selected-dial-code", - }, - this.selectedFlag - ); - } - if (this.options.allowDropdown) { - // make element focusable and tab navigable - this.selectedFlag.setAttribute("tabindex", "0"); - this.dropdownArrow = this._createEl( - "div", - { - class: "iti__arrow", - }, - this.selectedFlag - ); - // country dropdown: preferred countries, then divider, then all countries - this.countryList = this._createEl("ul", { - class: "iti__country-list iti__hide", - id: "iti-".concat(this.id, "__country-listbox"), - role: "listbox", - "aria-label": "List of countries", - }); - if (this.preferredCountries.length) { - this._appendListItems(this.preferredCountries, "iti__preferred", true); - this._createEl( - "li", - { - class: "iti__divider", - role: "separator", - "aria-disabled": "true", - }, - this.countryList - ); - } - this._appendListItems(this.countries, "iti__standard"); - // create dropdownContainer markup - if (this.options.dropdownContainer) { - this.dropdown = this._createEl("div", { - class: "iti iti--container", - }); - this.dropdown.appendChild(this.countryList); - } else { - this.flagsContainer.appendChild(this.countryList); - } - } - if (this.options.hiddenInput) { - var hiddenInputName = this.options.hiddenInput; - var name = this.telInput.getAttribute("name"); - if (name) { - var i = name.lastIndexOf("["); - // if input name contains square brackets, then give the hidden input the same name, - // replacing the contents of the last set of brackets with the given hiddenInput name - if (i !== -1) - hiddenInputName = "" - .concat(name.substr(0, i), "[") - .concat(hiddenInputName, "]"); - } - this.hiddenInput = this._createEl("input", { - type: "hidden", - name: hiddenInputName, - }); - wrapper.appendChild(this.hiddenInput); - } - }, - }, - { - key: "_appendListItems", - value: function _appendListItems(countries, className, preferred) { - // we create so many DOM elements, it is faster to build a temp string - // and then add everything to the DOM in one go at the end - var tmp = ""; - // for each country - for (var i = 0; i < countries.length; i++) { - var c = countries[i]; - var idSuffix = preferred ? "-preferred" : ""; - // open the list item - tmp += "
  • "); - // add the flag - tmp += "
    " - ); - // and the country name and dial code - tmp += "".concat(c.name, ""); - tmp += "+".concat(c.dialCode, ""); - // close the list item - tmp += "
  • "; - } - this.countryList.insertAdjacentHTML("beforeend", tmp); - }, - }, - { - key: "_setInitialState", - value: function _setInitialState() { - // fix firefox bug: when first load page (with input with value set to number with intl dial - // code) and initialising plugin removes the dial code from the input, then refresh page, - // and we try to init plugin again but this time on number without dial code so get grey flag - var attributeValue = this.telInput.getAttribute("value"); - var inputValue = this.telInput.value; - var useAttribute = - attributeValue && - attributeValue.charAt(0) === "+" && - (!inputValue || inputValue.charAt(0) !== "+"); - var val = useAttribute ? attributeValue : inputValue; - var dialCode = this._getDialCode(val); - var isRegionlessNanp = this._isRegionlessNanp(val); - var _this$options = this.options, - initialCountry = _this$options.initialCountry, - nationalMode = _this$options.nationalMode, - autoHideDialCode = _this$options.autoHideDialCode, - separateDialCode = _this$options.separateDialCode; - // if we already have a dial code, and it's not a regionlessNanp, we can go ahead and set the - // flag, else fall back to the default country - if (dialCode && !isRegionlessNanp) { - this._updateFlagFromNumber(val); - } else if (initialCountry !== "auto") { - // see if we should select a flag - if (initialCountry) { - this._setFlag(initialCountry.toLowerCase()); - } else { - if (dialCode && isRegionlessNanp) { - // has intl dial code, is regionless nanp, and no initialCountry, so default to US - this._setFlag("us"); - } else { - // no dial code and no initialCountry, so default to first in list - this.defaultCountry = this.preferredCountries.length - ? this.preferredCountries[0].iso2 - : this.countries[0].iso2; - if (!val) { - this._setFlag(this.defaultCountry); - } - } - } - // if empty and no nationalMode and no autoHideDialCode then insert the default dial code - if (!val && !nationalMode && !autoHideDialCode && !separateDialCode) { - this.telInput.value = "+".concat(this.selectedCountryData.dialCode); - } - } - // NOTE: if initialCountry is set to auto, that will be handled separately - // format - note this wont be run after _updateDialCode as that's only called if no val - if (val) this._updateValFromNumber(val); - }, - }, - { - key: "_initListeners", - value: function _initListeners() { - this._initKeyListeners(); - if (this.options.autoHideDialCode) this._initBlurListeners(); - if (this.options.allowDropdown) this._initDropdownListeners(); - if (this.hiddenInput) this._initHiddenInputListener(); - }, - }, - { - key: "_initHiddenInputListener", - value: function _initHiddenInputListener() { - var _this3 = this; - this._handleHiddenInputSubmit = function () { - _this3.hiddenInput.value = _this3.getNumber(); - }; - if (this.telInput.form) - this.telInput.form.addEventListener("submit", this._handleHiddenInputSubmit); - }, - }, - { - key: "_getClosestLabel", - value: function _getClosestLabel() { - var el = this.telInput; - while (el && el.tagName !== "LABEL") { - el = el.parentNode; - } - return el; - }, - }, - { - key: "_initDropdownListeners", - value: function _initDropdownListeners() { - var _this4 = this; - // hack for input nested inside label (which is valid markup): clicking the selected-flag to - // open the dropdown would then automatically trigger a 2nd click on the input which would - // close it again - this._handleLabelClick = function (e) { - // if the dropdown is closed, then focus the input, else ignore the click - if (_this4.countryList.classList.contains("iti__hide")) _this4.telInput.focus(); - else e.preventDefault(); - }; - var label = this._getClosestLabel(); - if (label) label.addEventListener("click", this._handleLabelClick); - // toggle country dropdown on click - this._handleClickSelectedFlag = function () { - // only intercept this event if we're opening the dropdown - // else let it bubble up to the top ("click-off-to-close" listener) - // we cannot just stopPropagation as it may be needed to close another instance - if ( - _this4.countryList.classList.contains("iti__hide") && - !_this4.telInput.disabled && - !_this4.telInput.readOnly - ) { - _this4._showDropdown(); - } - }; - this.selectedFlag.addEventListener("click", this._handleClickSelectedFlag); - // open dropdown list if currently focused - this._handleFlagsContainerKeydown = function (e) { - var isDropdownHidden = _this4.countryList.classList.contains("iti__hide"); - if ( - isDropdownHidden && - ["ArrowUp", "Up", "ArrowDown", "Down", " ", "Enter"].indexOf(e.key) !== -1 - ) { - // prevent form from being submitted if "ENTER" was pressed - e.preventDefault(); - // prevent event from being handled again by document - e.stopPropagation(); - _this4._showDropdown(); - } - // allow navigation from dropdown to input on TAB - if (e.key === "Tab") _this4._closeDropdown(); - }; - this.flagsContainer.addEventListener("keydown", this._handleFlagsContainerKeydown); - }, - }, - { - key: "_initRequests", - value: function _initRequests() { - var _this5 = this; - // if the user has specified the path to the utils script, fetch it on window.load, else resolve - if (this.options.utilsScript && !window.intlTelInputUtils) { - // if the plugin is being initialised after the window.load event has already been fired - if (window.intlTelInputGlobals.documentReady()) { - window.intlTelInputGlobals.loadUtils(this.options.utilsScript); - } else { - // wait until the load event so we don't block any other requests e.g. the flags image - window.addEventListener("load", function () { - window.intlTelInputGlobals.loadUtils(_this5.options.utilsScript); - }); - } - } else this.resolveUtilsScriptPromise(); - if (this.options.initialCountry === "auto") this._loadAutoCountry(); - else this.resolveAutoCountryPromise(); - }, - }, - { - key: "_loadAutoCountry", - value: function _loadAutoCountry() { - // 3 options: - // 1) already loaded (we're done) - // 2) not already started loading (start) - // 3) already started loading (do nothing - just wait for loading callback to fire) - if (window.intlTelInputGlobals.autoCountry) { - this.handleAutoCountry(); - } else if (!window.intlTelInputGlobals.startedLoadingAutoCountry) { - // don't do this twice! - window.intlTelInputGlobals.startedLoadingAutoCountry = true; - if (typeof this.options.geoIpLookup === "function") { - this.options.geoIpLookup( - function (countryCode) { - window.intlTelInputGlobals.autoCountry = countryCode.toLowerCase(); - // tell all instances the auto country is ready - // TODO: this should just be the current instances - // UPDATE: use setTimeout in case their geoIpLookup function calls this callback straight - // away (e.g. if they have already done the geo ip lookup somewhere else). Using - // setTimeout means that the current thread of execution will finish before executing - // this, which allows the plugin to finish initialising. - setTimeout(function () { - return forEachInstance("handleAutoCountry"); - }); - }, - function () { - return forEachInstance("rejectAutoCountryPromise"); - } - ); - } - } - }, - }, - { - key: "_initKeyListeners", - value: function _initKeyListeners() { - var _this6 = this; - // update flag on keyup - this._handleKeyupEvent = function () { - if (_this6._updateFlagFromNumber(_this6.telInput.value)) { - _this6._triggerCountryChange(); - } - }; - this.telInput.addEventListener("keyup", this._handleKeyupEvent); - // update flag on cut/paste events (now supported in all major browsers) - this._handleClipboardEvent = function () { - // hack because "paste" event is fired before input is updated - setTimeout(_this6._handleKeyupEvent); - }; - this.telInput.addEventListener("cut", this._handleClipboardEvent); - this.telInput.addEventListener("paste", this._handleClipboardEvent); - }, - }, - { - key: "_cap", - value: function _cap(number) { - var max = this.telInput.getAttribute("maxlength"); - return max && number.length > max ? number.substr(0, max) : number; - }, - }, - { - key: "_initBlurListeners", - value: function _initBlurListeners() { - var _this7 = this; - // on blur or form submit: if just a dial code then remove it - this._handleSubmitOrBlurEvent = function () { - _this7._removeEmptyDialCode(); - }; - if (this.telInput.form) - this.telInput.form.addEventListener("submit", this._handleSubmitOrBlurEvent); - this.telInput.addEventListener("blur", this._handleSubmitOrBlurEvent); - }, - }, - { - key: "_removeEmptyDialCode", - value: function _removeEmptyDialCode() { - if (this.telInput.value.charAt(0) === "+") { - var numeric = this._getNumeric(this.telInput.value); - // if just a plus, or if just a dial code - if (!numeric || this.selectedCountryData.dialCode === numeric) { - this.telInput.value = ""; - } - } - }, - }, - { - key: "_getNumeric", - value: function _getNumeric(s) { - return s.replace(/\D/g, ""); - }, - }, - { - key: "_trigger", - value: function _trigger(name) { - // have to use old school document.createEvent as IE11 doesn't support `new Event()` syntax - var e = document.createEvent("Event"); - e.initEvent(name, true, true); - // can bubble, and is cancellable - this.telInput.dispatchEvent(e); - }, - }, - { - key: "_showDropdown", - value: function _showDropdown() { - this.countryList.classList.remove("iti__hide"); - this.selectedFlag.setAttribute("aria-expanded", "true"); - this._setDropdownPosition(); - // update highlighting and scroll to active list item - if (this.activeItem) { - this._highlightListItem(this.activeItem, false); - this._scrollTo(this.activeItem, true); - } - // bind all the dropdown-related listeners: mouseover, click, click-off, keydown - this._bindDropdownListeners(); - // update the arrow - this.dropdownArrow.classList.add("iti__arrow--up"); - this._trigger("open:countrydropdown"); - }, - }, - { - key: "_toggleClass", - value: function _toggleClass(el, className, shouldHaveClass) { - if (shouldHaveClass && !el.classList.contains(className)) el.classList.add(className); - else if (!shouldHaveClass && el.classList.contains(className)) - el.classList.remove(className); - }, - }, - { - key: "_setDropdownPosition", - value: function _setDropdownPosition() { - var _this8 = this; - if (this.options.dropdownContainer) { - this.options.dropdownContainer.appendChild(this.dropdown); - } - if (!this.isMobile) { - var pos = this.telInput.getBoundingClientRect(); - // windowTop from https://stackoverflow.com/a/14384091/217866 - var windowTop = window.pageYOffset || document.documentElement.scrollTop; - var inputTop = pos.top + windowTop; - var dropdownHeight = this.countryList.offsetHeight; - // dropdownFitsBelow = (dropdownBottom < windowBottom) - var dropdownFitsBelow = - inputTop + this.telInput.offsetHeight + dropdownHeight < - windowTop + window.innerHeight; - var dropdownFitsAbove = inputTop - dropdownHeight > windowTop; - // by default, the dropdown will be below the input. If we want to position it above the - // input, we add the dropup class. - this._toggleClass( - this.countryList, - "iti__country-list--dropup", - !dropdownFitsBelow && dropdownFitsAbove - ); - // if dropdownContainer is enabled, calculate postion - if (this.options.dropdownContainer) { - // by default the dropdown will be directly over the input because it's not in the flow. - // If we want to position it below, we need to add some extra top value. - var extraTop = - !dropdownFitsBelow && dropdownFitsAbove ? 0 : this.telInput.offsetHeight; - // calculate placement - this.dropdown.style.top = "".concat(inputTop + extraTop, "px"); - this.dropdown.style.left = "".concat(pos.left + document.body.scrollLeft, "px"); - // close menu on window scroll - this._handleWindowScroll = function () { - return _this8._closeDropdown(); - }; - window.addEventListener("scroll", this._handleWindowScroll); - } - } - }, - }, - { - key: "_getClosestListItem", - value: function _getClosestListItem(target) { - var el = target; - while (el && el !== this.countryList && !el.classList.contains("iti__country")) { - el = el.parentNode; - } - // if we reached the countryList element, then return null - return el === this.countryList ? null : el; - }, - }, - { - key: "_bindDropdownListeners", - value: function _bindDropdownListeners() { - var _this9 = this; - // when mouse over a list item, just highlight that one - // we add the class "highlight", so if they hit "enter" we know which one to select - this._handleMouseoverCountryList = function (e) { - // handle event delegation, as we're listening for this event on the countryList - var listItem = _this9._getClosestListItem(e.target); - if (listItem) _this9._highlightListItem(listItem, false); - }; - this.countryList.addEventListener("mouseover", this._handleMouseoverCountryList); - // listen for country selection - this._handleClickCountryList = function (e) { - var listItem = _this9._getClosestListItem(e.target); - if (listItem) _this9._selectListItem(listItem); - }; - this.countryList.addEventListener("click", this._handleClickCountryList); - // click off to close - // (except when this initial opening click is bubbling up) - // we cannot just stopPropagation as it may be needed to close another instance - var isOpening = true; - this._handleClickOffToClose = function () { - if (!isOpening) _this9._closeDropdown(); - isOpening = false; - }; - document.documentElement.addEventListener("click", this._handleClickOffToClose); - // listen for up/down scrolling, enter to select, or letters to jump to country name. - // use keydown as keypress doesn't fire for non-char keys and we want to catch if they - // just hit down and hold it to scroll down (no keyup event). - // listen on the document because that's where key events are triggered if no input has focus - var query = ""; - var queryTimer = null; - this._handleKeydownOnDropdown = function (e) { - // prevent down key from scrolling the whole page, - // and enter key from submitting a form etc - e.preventDefault(); - // up and down to navigate - if ( - e.key === "ArrowUp" || - e.key === "Up" || - e.key === "ArrowDown" || - e.key === "Down" - ) - _this9._handleUpDownKey(e.key); - else if (e.key === "Enter") _this9._handleEnterKey(); - else if (e.key === "Escape") _this9._closeDropdown(); - else if (/^[a-zA-ZÀ-ÿа-яА-Я ]$/.test(e.key)) { - // jump to countries that start with the query string - if (queryTimer) clearTimeout(queryTimer); - query += e.key.toLowerCase(); - _this9._searchForCountry(query); - // if the timer hits 1 second, reset the query - queryTimer = setTimeout(function () { - query = ""; - }, 1e3); - } - }; - document.addEventListener("keydown", this._handleKeydownOnDropdown); - }, - }, - { - key: "_handleUpDownKey", - value: function _handleUpDownKey(key) { - var next = - key === "ArrowUp" || key === "Up" - ? this.highlightedItem.previousElementSibling - : this.highlightedItem.nextElementSibling; - if (next) { - // skip the divider - if (next.classList.contains("iti__divider")) { - next = - key === "ArrowUp" || key === "Up" - ? next.previousElementSibling - : next.nextElementSibling; - } - this._highlightListItem(next, true); - } - }, - }, - { - key: "_handleEnterKey", - value: function _handleEnterKey() { - if (this.highlightedItem) this._selectListItem(this.highlightedItem); - }, - }, - { - key: "_searchForCountry", - value: function _searchForCountry(query) { - for (var i = 0; i < this.countries.length; i++) { - if (this._startsWith(this.countries[i].name, query)) { - var listItem = this.countryList.querySelector( - "#iti-".concat(this.id, "__item-").concat(this.countries[i].iso2) - ); - // update highlighting and scroll - this._highlightListItem(listItem, false); - this._scrollTo(listItem, true); - break; - } - } - }, - }, - { - key: "_startsWith", - value: function _startsWith(a, b) { - return a.substr(0, b.length).toLowerCase() === b; - }, - }, - { - key: "_updateValFromNumber", - value: function _updateValFromNumber(originalNumber) { - var number = originalNumber; - if ( - this.options.formatOnDisplay && - window.intlTelInputUtils && - this.selectedCountryData - ) { - var useNational = - !this.options.separateDialCode && - (this.options.nationalMode || number.charAt(0) !== "+"); - var _intlTelInputUtils$nu = intlTelInputUtils.numberFormat, - NATIONAL = _intlTelInputUtils$nu.NATIONAL, - INTERNATIONAL = _intlTelInputUtils$nu.INTERNATIONAL; - var format = useNational ? NATIONAL : INTERNATIONAL; - number = intlTelInputUtils.formatNumber( - number, - this.selectedCountryData.iso2, - format - ); - } - number = this._beforeSetNumber(number); - this.telInput.value = number; - }, - }, - { - key: "_updateFlagFromNumber", - value: function _updateFlagFromNumber(originalNumber) { - // if we're in nationalMode and we already have US/Canada selected, make sure the number starts - // with a +1 so _getDialCode will be able to extract the area code - // update: if we dont yet have selectedCountryData, but we're here (trying to update the flag - // from the number), that means we're initialising the plugin with a number that already has a - // dial code, so fine to ignore this bit - var number = originalNumber; - var selectedDialCode = this.selectedCountryData.dialCode; - var isNanp = selectedDialCode === "1"; - if (number && this.options.nationalMode && isNanp && number.charAt(0) !== "+") { - if (number.charAt(0) !== "1") number = "1".concat(number); - number = "+".concat(number); - } - // update flag if user types area code for another country - if (this.options.separateDialCode && selectedDialCode && number.charAt(0) !== "+") { - number = "+".concat(selectedDialCode).concat(number); - } - // try and extract valid dial code from input - var dialCode = this._getDialCode(number, true); - var numeric = this._getNumeric(number); - var countryCode = null; - if (dialCode) { - var countryCodes = this.countryCodes[this._getNumeric(dialCode)]; - // check if the right country is already selected. this should be false if the number is - // longer than the matched dial code because in this case we need to make sure that if - // there are multiple country matches, that the first one is selected (note: we could - // just check that here, but it requires the same loop that we already have later) - var alreadySelected = - countryCodes.indexOf(this.selectedCountryData.iso2) !== -1 && - numeric.length <= dialCode.length - 1; - var isRegionlessNanpNumber = - selectedDialCode === "1" && this._isRegionlessNanp(numeric); - // only update the flag if: - // A) NOT (we currently have a NANP flag selected, and the number is a regionlessNanp) - // AND - // B) the right country is not already selected - if (!isRegionlessNanpNumber && !alreadySelected) { - // if using onlyCountries option, countryCodes[0] may be empty, so we must find the first - // non-empty index - for (var j = 0; j < countryCodes.length; j++) { - if (countryCodes[j]) { - countryCode = countryCodes[j]; - break; - } - } - } - } else if (number.charAt(0) === "+" && numeric.length) { - // invalid dial code, so empty - // Note: use getNumeric here because the number has not been formatted yet, so could contain - // bad chars - countryCode = ""; - } else if (!number || number === "+") { - // empty, or just a plus, so default - countryCode = this.defaultCountry; - } - if (countryCode !== null) { - return this._setFlag(countryCode); - } - return false; - }, - }, - { - key: "_isRegionlessNanp", - value: function _isRegionlessNanp(number) { - var numeric = this._getNumeric(number); - if (numeric.charAt(0) === "1") { - var areaCode = numeric.substr(1, 3); - return regionlessNanpNumbers.indexOf(areaCode) !== -1; - } - return false; - }, - }, - { - key: "_highlightListItem", - value: function _highlightListItem(listItem, shouldFocus) { - var prevItem = this.highlightedItem; - if (prevItem) prevItem.classList.remove("iti__highlight"); - this.highlightedItem = listItem; - this.highlightedItem.classList.add("iti__highlight"); - if (shouldFocus) this.highlightedItem.focus(); - }, - }, - { - key: "_getCountryData", - value: function _getCountryData(countryCode, ignoreOnlyCountriesOption, allowFail) { - var countryList = ignoreOnlyCountriesOption ? allCountries : this.countries; - for (var i = 0; i < countryList.length; i++) { - if (countryList[i].iso2 === countryCode) { - return countryList[i]; - } - } - if (allowFail) { - return null; - } - throw new Error("No country data for '".concat(countryCode, "'")); - }, - }, - { - key: "_setFlag", - value: function _setFlag(countryCode) { - var prevCountry = this.selectedCountryData.iso2 ? this.selectedCountryData : {}; - // do this first as it will throw an error and stop if countryCode is invalid - this.selectedCountryData = countryCode - ? this._getCountryData(countryCode, false, false) - : {}; - // update the defaultCountry - we only need the iso2 from now on, so just store that - if (this.selectedCountryData.iso2) { - this.defaultCountry = this.selectedCountryData.iso2; - } - this.selectedFlagInner.setAttribute("class", "iti__flag iti__".concat(countryCode)); - // update the selected country's title attribute - var title = countryCode - ? "" - .concat(this.selectedCountryData.name, ": +") - .concat(this.selectedCountryData.dialCode) - : "Unknown"; - this.selectedFlag.setAttribute("title", title); - if (this.options.separateDialCode) { - var dialCode = this.selectedCountryData.dialCode - ? "+".concat(this.selectedCountryData.dialCode) - : ""; - this.selectedDialCode.innerHTML = dialCode; - // offsetWidth is zero if input is in a hidden container during initialisation - var selectedFlagWidth = - this.selectedFlag.offsetWidth || this._getHiddenSelectedFlagWidth(); - // add 6px of padding after the grey selected-dial-code box, as this is what we use in the css - this.telInput.style.paddingLeft = "".concat(selectedFlagWidth + 6, "px"); - } - // and the input's placeholder - this._updatePlaceholder(); - // update the active list item - if (this.options.allowDropdown) { - var prevItem = this.activeItem; - if (prevItem) { - prevItem.classList.remove("iti__active"); - prevItem.setAttribute("aria-selected", "false"); - } - if (countryCode) { - // check if there is a preferred item first, else fall back to standard - var nextItem = - this.countryList.querySelector( - "#iti-".concat(this.id, "__item-").concat(countryCode, "-preferred") - ) || - this.countryList.querySelector( - "#iti-".concat(this.id, "__item-").concat(countryCode) - ); - nextItem.setAttribute("aria-selected", "true"); - nextItem.classList.add("iti__active"); - this.activeItem = nextItem; - this.selectedFlag.setAttribute( - "aria-activedescendant", - nextItem.getAttribute("id") - ); - } - } - // return if the flag has changed or not - return prevCountry.iso2 !== countryCode; - }, - }, - { - key: "_getHiddenSelectedFlagWidth", - value: function _getHiddenSelectedFlagWidth() { - // to get the right styling to apply, all we need is a shallow clone of the container, - // and then to inject a deep clone of the selectedFlag element - var containerClone = this.telInput.parentNode.cloneNode(); - containerClone.style.visibility = "hidden"; - document.body.appendChild(containerClone); - var flagsContainerClone = this.flagsContainer.cloneNode(); - containerClone.appendChild(flagsContainerClone); - var selectedFlagClone = this.selectedFlag.cloneNode(true); - flagsContainerClone.appendChild(selectedFlagClone); - var width = selectedFlagClone.offsetWidth; - containerClone.parentNode.removeChild(containerClone); - return width; - }, - }, - { - key: "_updatePlaceholder", - value: function _updatePlaceholder() { - var shouldSetPlaceholder = - this.options.autoPlaceholder === "aggressive" || - (!this.hadInitialPlaceholder && this.options.autoPlaceholder === "polite"); - if (window.intlTelInputUtils && shouldSetPlaceholder) { - var numberType = intlTelInputUtils.numberType[this.options.placeholderNumberType]; - var placeholder = this.selectedCountryData.iso2 - ? intlTelInputUtils.getExampleNumber( - this.selectedCountryData.iso2, - this.options.nationalMode, - numberType - ) - : ""; - placeholder = this._beforeSetNumber(placeholder); - if (typeof this.options.customPlaceholder === "function") { - placeholder = this.options.customPlaceholder( - placeholder, - this.selectedCountryData - ); - } - this.telInput.setAttribute("placeholder", placeholder); - } - }, - }, - { - key: "_selectListItem", - value: function _selectListItem(listItem) { - // update selected flag and active list item - var flagChanged = this._setFlag(listItem.getAttribute("data-country-code")); - this._closeDropdown(); - this._updateDialCode(listItem.getAttribute("data-dial-code"), true); - // focus the input - this.telInput.focus(); - // put cursor at end - this fix is required for FF and IE11 (with nationalMode=false i.e. auto - // inserting dial code), who try to put the cursor at the beginning the first time - var len = this.telInput.value.length; - this.telInput.setSelectionRange(len, len); - if (flagChanged) { - this._triggerCountryChange(); - } - }, - }, - { - key: "_closeDropdown", - value: function _closeDropdown() { - this.countryList.classList.add("iti__hide"); - this.selectedFlag.setAttribute("aria-expanded", "false"); - // update the arrow - this.dropdownArrow.classList.remove("iti__arrow--up"); - // unbind key events - document.removeEventListener("keydown", this._handleKeydownOnDropdown); - document.documentElement.removeEventListener("click", this._handleClickOffToClose); - this.countryList.removeEventListener("mouseover", this._handleMouseoverCountryList); - this.countryList.removeEventListener("click", this._handleClickCountryList); - // remove menu from container - if (this.options.dropdownContainer) { - if (!this.isMobile) window.removeEventListener("scroll", this._handleWindowScroll); - if (this.dropdown.parentNode) this.dropdown.parentNode.removeChild(this.dropdown); - } - this._trigger("close:countrydropdown"); - }, - }, - { - key: "_scrollTo", - value: function _scrollTo(element, middle) { - var container = this.countryList; - // windowTop from https://stackoverflow.com/a/14384091/217866 - var windowTop = window.pageYOffset || document.documentElement.scrollTop; - var containerHeight = container.offsetHeight; - var containerTop = container.getBoundingClientRect().top + windowTop; - var containerBottom = containerTop + containerHeight; - var elementHeight = element.offsetHeight; - var elementTop = element.getBoundingClientRect().top + windowTop; - var elementBottom = elementTop + elementHeight; - var newScrollTop = elementTop - containerTop + container.scrollTop; - var middleOffset = containerHeight / 2 - elementHeight / 2; - if (elementTop < containerTop) { - // scroll up - if (middle) newScrollTop -= middleOffset; - container.scrollTop = newScrollTop; - } else if (elementBottom > containerBottom) { - // scroll down - if (middle) newScrollTop += middleOffset; - var heightDifference = containerHeight - elementHeight; - container.scrollTop = newScrollTop - heightDifference; - } - }, - }, - { - key: "_updateDialCode", - value: function _updateDialCode(newDialCodeBare, hasSelectedListItem) { - var inputVal = this.telInput.value; - // save having to pass this every time - var newDialCode = "+".concat(newDialCodeBare); - var newNumber; - if (inputVal.charAt(0) === "+") { - // there's a plus so we're dealing with a replacement (doesn't matter if nationalMode or not) - var prevDialCode = this._getDialCode(inputVal); - if (prevDialCode) { - // current number contains a valid dial code, so replace it - newNumber = inputVal.replace(prevDialCode, newDialCode); - } else { - // current number contains an invalid dial code, so ditch it - // (no way to determine where the invalid dial code ends and the rest of the number begins) - newNumber = newDialCode; - } - } else if (this.options.nationalMode || this.options.separateDialCode) { - // don't do anything - return; - } else { - // nationalMode is disabled - if (inputVal) { - // there is an existing value with no dial code: prefix the new dial code - newNumber = newDialCode + inputVal; - } else if (hasSelectedListItem || !this.options.autoHideDialCode) { - // no existing value and either they've just selected a list item, or autoHideDialCode is - // disabled: insert new dial code - newNumber = newDialCode; - } else { - return; - } - } - this.telInput.value = newNumber; - }, - }, - { - key: "_getDialCode", - value: function _getDialCode(number, includeAreaCode) { - var dialCode = ""; - // only interested in international numbers (starting with a plus) - if (number.charAt(0) === "+") { - var numericChars = ""; - // iterate over chars - for (var i = 0; i < number.length; i++) { - var c = number.charAt(i); - // if char is number (https://stackoverflow.com/a/8935649/217866) - if (!isNaN(parseInt(c, 10))) { - numericChars += c; - // if current numericChars make a valid dial code - if (includeAreaCode) { - if (this.countryCodes[numericChars]) { - // store the actual raw string (useful for matching later) - dialCode = number.substr(0, i + 1); - } - } else { - if (this.dialCodes[numericChars]) { - dialCode = number.substr(0, i + 1); - // if we're just looking for a dial code, we can break as soon as we find one - break; - } - } - // stop searching as soon as we can - in this case when we hit max len - if (numericChars.length === this.countryCodeMaxLen) { - break; - } - } - } - } - return dialCode; - }, - }, - { - key: "_getFullNumber", - value: function _getFullNumber() { - var val = this.telInput.value.trim(); - var dialCode = this.selectedCountryData.dialCode; - var prefix; - var numericVal = this._getNumeric(val); - if (this.options.separateDialCode && val.charAt(0) !== "+" && dialCode && numericVal) { - // when using separateDialCode, it is visible so is effectively part of the typed number - prefix = "+".concat(dialCode); - } else { - prefix = ""; - } - return prefix + val; - }, - }, - { - key: "_beforeSetNumber", - value: function _beforeSetNumber(originalNumber) { - var number = originalNumber; - if (this.options.separateDialCode) { - var dialCode = this._getDialCode(number); - // if there is a valid dial code - if (dialCode) { - // in case _getDialCode returned an area code as well - dialCode = "+".concat(this.selectedCountryData.dialCode); - // a lot of numbers will have a space separating the dial code and the main number, and - // some NANP numbers will have a hyphen e.g. +1 684-733-1234 - in both cases we want to get - // rid of it - // NOTE: don't just trim all non-numerics as may want to preserve an open parenthesis etc - var start = - number[dialCode.length] === " " || number[dialCode.length] === "-" - ? dialCode.length + 1 - : dialCode.length; - number = number.substr(start); - } - } - return this._cap(number); - }, - }, - { - key: "_triggerCountryChange", - value: function _triggerCountryChange() { - this._trigger("countrychange"); - }, - }, - { - key: "handleAutoCountry", - value: function handleAutoCountry() { - if (this.options.initialCountry === "auto") { - // we must set this even if there is an initial val in the input: in case the initial val is - // invalid and they delete it - they should see their auto country - this.defaultCountry = window.intlTelInputGlobals.autoCountry; - // if there's no initial value in the input, then update the flag - if (!this.telInput.value) { - this.setCountry(this.defaultCountry); - } - this.resolveAutoCountryPromise(); - } - }, - }, - { - key: "handleUtils", - value: function handleUtils() { - // if the request was successful - if (window.intlTelInputUtils) { - // if there's an initial value in the input, then format it - if (this.telInput.value) { - this._updateValFromNumber(this.telInput.value); - } - this._updatePlaceholder(); - } - this.resolveUtilsScriptPromise(); - }, - }, - { - key: "destroy", - value: function destroy() { - var form = this.telInput.form; - if (this.options.allowDropdown) { - // make sure the dropdown is closed (and unbind listeners) - this._closeDropdown(); - this.selectedFlag.removeEventListener("click", this._handleClickSelectedFlag); - this.flagsContainer.removeEventListener( - "keydown", - this._handleFlagsContainerKeydown - ); - // label click hack - var label = this._getClosestLabel(); - if (label) label.removeEventListener("click", this._handleLabelClick); - } - // unbind hiddenInput listeners - if (this.hiddenInput && form) - form.removeEventListener("submit", this._handleHiddenInputSubmit); - // unbind autoHideDialCode listeners - if (this.options.autoHideDialCode) { - if (form) form.removeEventListener("submit", this._handleSubmitOrBlurEvent); - this.telInput.removeEventListener("blur", this._handleSubmitOrBlurEvent); - } - // unbind key events, and cut/paste events - this.telInput.removeEventListener("keyup", this._handleKeyupEvent); - this.telInput.removeEventListener("cut", this._handleClipboardEvent); - this.telInput.removeEventListener("paste", this._handleClipboardEvent); - // remove attribute of id instance: data-intl-tel-input-id - this.telInput.removeAttribute("data-intl-tel-input-id"); - // remove markup (but leave the original input) - var wrapper = this.telInput.parentNode; - wrapper.parentNode.insertBefore(this.telInput, wrapper); - wrapper.parentNode.removeChild(wrapper); - delete window.intlTelInputGlobals.instances[this.id]; - }, - }, - { - key: "getExtension", - value: function getExtension() { - if (window.intlTelInputUtils) { - return intlTelInputUtils.getExtension( - this._getFullNumber(), - this.selectedCountryData.iso2 - ); - } - return ""; - }, - }, - { - key: "getNumber", - value: function getNumber(format) { - if (window.intlTelInputUtils) { - var iso2 = this.selectedCountryData.iso2; - return intlTelInputUtils.formatNumber(this._getFullNumber(), iso2, format); - } - return ""; - }, - }, - { - key: "getNumberType", - value: function getNumberType() { - if (window.intlTelInputUtils) { - return intlTelInputUtils.getNumberType( - this._getFullNumber(), - this.selectedCountryData.iso2 - ); - } - return -99; - }, - }, - { - key: "getSelectedCountryData", - value: function getSelectedCountryData() { - return this.selectedCountryData; - }, - }, - { - key: "getValidationError", - value: function getValidationError() { - if (window.intlTelInputUtils) { - var iso2 = this.selectedCountryData.iso2; - return intlTelInputUtils.getValidationError(this._getFullNumber(), iso2); - } - return -99; - }, - }, - { - key: "isValidNumber", - value: function isValidNumber() { - var val = this._getFullNumber().trim(); - var countryCode = this.options.nationalMode ? this.selectedCountryData.iso2 : ""; - return window.intlTelInputUtils - ? intlTelInputUtils.isValidNumber(val, countryCode) - : null; - }, - }, - { - key: "setCountry", - value: function setCountry(originalCountryCode) { - var countryCode = originalCountryCode.toLowerCase(); - // check if already selected - if (!this.selectedFlagInner.classList.contains("iti__".concat(countryCode))) { - this._setFlag(countryCode); - this._updateDialCode(this.selectedCountryData.dialCode, false); - this._triggerCountryChange(); - } - }, - }, - { - key: "setNumber", - value: function setNumber(number) { - // we must update the flag first, which updates this.selectedCountryData, which is used for - // formatting the number before displaying it - var flagChanged = this._updateFlagFromNumber(number); - this._updateValFromNumber(number); - if (flagChanged) { - this._triggerCountryChange(); - } - }, - }, - { - key: "setPlaceholderNumberType", - value: function setPlaceholderNumberType(type) { - this.options.placeholderNumberType = type; - this._updatePlaceholder(); - }, - }, - ]); - return Iti; - })(); - /******************** - * STATIC METHODS - ********************/ - // get the country data object - intlTelInputGlobals.getCountryData = function () { - return allCountries; - }; - // inject a