@contember/react-client-tenant 2.1.0-alpha.2 → 2.1.0-alpha.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/development/src/components/forms/LoginForm.cjs +2 -0
- package/dist/development/src/components/forms/LoginForm.cjs.map +1 -1
- package/dist/development/src/components/forms/LoginForm.js +2 -0
- package/dist/development/src/components/forms/LoginForm.js.map +1 -1
- package/dist/development/src/components/idp/IDP.cjs +4 -4
- package/dist/development/src/components/idp/IDP.cjs.map +1 -1
- package/dist/development/src/components/idp/IDP.js +4 -4
- package/dist/development/src/components/idp/IDP.js.map +1 -1
- package/dist/production/src/components/forms/LoginForm.cjs +2 -0
- package/dist/production/src/components/forms/LoginForm.cjs.map +1 -1
- package/dist/production/src/components/forms/LoginForm.js +2 -0
- package/dist/production/src/components/forms/LoginForm.js.map +1 -1
- package/dist/production/src/components/idp/IDP.cjs +2 -2
- package/dist/production/src/components/idp/IDP.cjs.map +1 -1
- package/dist/production/src/components/idp/IDP.js +2 -2
- package/dist/production/src/components/idp/IDP.js.map +1 -1
- package/dist/types/components/idp/IDP.d.ts +2 -1
- package/dist/types/components/idp/IDP.d.ts.map +1 -1
- package/dist/types/hooks/mutations/auth/useChangeMyPasswordMutation.d.ts +2 -0
- package/dist/types/hooks/mutations/auth/useChangeMyPasswordMutation.d.ts.map +1 -1
- package/dist/types/hooks/mutations/auth/useSignInMutation.d.ts +2 -0
- package/dist/types/hooks/mutations/auth/useSignInMutation.d.ts.map +1 -1
- package/dist/types/hooks/mutations/passwordReset/useResetPasswordMutation.d.ts +2 -0
- package/dist/types/hooks/mutations/passwordReset/useResetPasswordMutation.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/src/components/forms/LoginForm.tsx +2 -0
- package/src/components/idp/IDP.tsx +3 -2
|
@@ -78,6 +78,8 @@ const errorToField = {
|
|
|
78
78
|
"UNKNOWN_EMAIL": "email",
|
|
79
79
|
"PERSON_DISABLED": "email",
|
|
80
80
|
"INVALID_OTP_TOKEN": "otpToken",
|
|
81
|
+
"INVALID_CREDENTIALS": "password",
|
|
82
|
+
"RATE_LIMIT_EXCEEDED": "password",
|
|
81
83
|
"OTP_REQUIRED": void 0
|
|
82
84
|
};
|
|
83
85
|
exports.LoginForm = LoginForm;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LoginForm.cjs","sources":["../../../../../../packages/react-client-tenant/src/components/forms/LoginForm.tsx"],"sourcesContent":["import { ReactElement, useCallback, useMemo } from 'react'\nimport * as TenantApi from '@contember/graphql-client-tenant'\nimport { TenantForm } from './TenantForm'\nimport { SignInErrorCode } from '@contember/graphql-client-tenant'\nimport { FormContextValue, FormError, FormState } from '../../types'\nimport { useForm } from '../../contexts'\nimport { useSetSessionToken } from '@contember/react-client'\nimport { SignInMutationResult, useSignInMutation } from '../../hooks'\nimport { useRedirectToBacklinkCallback } from '../../internal/hooks/useRedirectToBacklink'\n\n\nexport type LoginFormValues = {\n\temail: string\n\tpassword: string\n\totpToken: string\n}\n\nexport type LoginFormErrorCode =\n\t| SignInErrorCode\n\t| 'FIELD_REQUIRED'\n\t| 'INVALID_VALUE'\n\t| 'UNKNOWN_ERROR'\n\nexport type LoginFormState =\n\t| FormState\n\t| 'otp-required'\n\nexport type LoginFormError = FormError<LoginFormValues, LoginFormErrorCode>\n\nexport type LoginFormContextValue = FormContextValue<LoginFormValues, LoginFormErrorCode, LoginFormState>\n\nexport interface LoginFormProps {\n\texpiration?: number\n\tchildren: ReactElement\n\tonSuccess?: () => void\n}\n\nexport const useLoginForm = useForm as () => LoginFormContextValue\n\nconst headers = {\n\t'X-Contember-Token-Path': 'data.mutation.result.token',\n}\n\nconst DEFAULT_LOGIN_EXPIRATION = 14 * 24 * 60 // 14 days\n\nexport const LoginForm = ({ children, expiration = DEFAULT_LOGIN_EXPIRATION, onSuccess }: LoginFormProps) => {\n\tconst login = useSignInMutation({ headers })\n\tconst redirectToBacklink = useRedirectToBacklinkCallback()\n\tconst setSessionToken = useSetSessionToken()\n\treturn (\n\t\t<TenantForm<LoginFormContextValue, SignInMutationResult>\n\t\t\tonSuccess={args => {\n\t\t\t\tonSuccess?.()\n\t\t\t\tsetSessionToken(args.result.token)\n\t\t\t\tredirectToBacklink()\n\t\t\t}}\n\t\t\terrorMapping={errorToField}\n\t\t\tinitialValues={{\n\t\t\t\temail: '',\n\t\t\t\tpassword: '',\n\t\t\t\totpToken: '',\n\t\t\t}}\n\t\t\tvalidate={({ values, state }) => {\n\t\t\t\tconst errors: LoginFormError[] = []\n\t\t\t\tif (!values.email) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'email' })\n\t\t\t\t} else if (!values.email.match(/^.+@.+$/)) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'email' })\n\t\t\t\t}\n\n\t\t\t\tif (!values.password) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'password' })\n\t\t\t\t} else if (values.password.length < 6) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'password' })\n\t\t\t\t}\n\t\t\t\tif (!values.otpToken && state === 'otp-required') {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'otpToken' })\n\t\t\t\t} else if (values.otpToken && !values.otpToken.match(/^\\d{6}$/)) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'otpToken' })\n\t\t\t\t}\n\t\t\t\treturn errors\n\t\t\t}}\n\t\t\texecute={async ({ values }) => {\n\t\t\t\tconst result = await login({\n\t\t\t\t\temail: values.email!,\n\t\t\t\t\tpassword: values.password!,\n\t\t\t\t\totpToken: values.otpToken || undefined,\n\t\t\t\t\texpiration: expiration,\n\t\t\t\t})\n\n\t\t\t\tif (!result.ok && result.error === 'OTP_REQUIRED') {\n\t\t\t\t\treturn { ...result, state: 'otp-required' }\n\t\t\t\t}\n\n\t\t\t\treturn result\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</TenantForm>\n\t)\n\n}\nconst errorToField: Record<TenantApi.SignInErrorCode, keyof LoginFormValues | undefined> = {\n\t'INVALID_PASSWORD': 'password',\n\t'NO_PASSWORD_SET': 'password',\n\t'UNKNOWN_EMAIL': 'email',\n\t'PERSON_DISABLED': 'email',\n\t'INVALID_OTP_TOKEN': 'otpToken',\n\t'OTP_REQUIRED': undefined,\n}\n"],"names":["useForm","useSignInMutation","useRedirectToBacklinkCallback","useSetSessionToken","jsxDEV","TenantForm","this"],"mappings":";;;;;;;;AAqCO,MAAM,eAAeA,SAAAA;AAE5B,MAAM,UAAU;AAAA,EACf,0BAA0B;AAC3B;AAEA,MAAM,2BAA2B,KAAK,KAAK;AAEpC,MAAM,YAAY,CAAC,EAAE,UAAU,aAAa,0BAA0B,gBAAgC;AAC5G,QAAM,QAAQC,kBAAAA,kBAAkB,EAAE,SAAS;AAC3C,QAAM,qBAAqBC,sBAAAA,8BAA8B;AACzD,QAAM,kBAAkBC,YAAAA,mBAAmB;AAE1C,SAAAC,8BAAA;AAAA,IAACC,WAAA;AAAA,IAAA;AAAA,MACA,WAAW,CAAQ,SAAA;AACN,oBAAA;AACI,wBAAA,KAAK,OAAO,KAAK;AACd,2BAAA;AAAA,MACpB;AAAA,MACA,cAAc;AAAA,MACd,eAAe;AAAA,QACd,OAAO;AAAA,QACP,UAAU;AAAA,QACV,UAAU;AAAA,MACX;AAAA,MACA,UAAU,CAAC,EAAE,QAAQ,YAAY;AAChC,cAAM,SAA2B,CAAC;AAC9B,YAAA,CAAC,OAAO,OAAO;AAClB,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,SAAS;AAAA,mBAC5C,CAAC,OAAO,MAAM,MAAM,SAAS,GAAG;AAC1C,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,SAAS;AAAA,QAAA;AAGlD,YAAA,CAAC,OAAO,UAAU;AACrB,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,YAAY;AAAA,QAC/C,WAAA,OAAO,SAAS,SAAS,GAAG;AACtC,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,YAAY;AAAA,QAAA;AAEzD,YAAI,CAAC,OAAO,YAAY,UAAU,gBAAgB;AACjD,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,YAAY;AAAA,QAAA,WAC/C,OAAO,YAAY,CAAC,OAAO,SAAS,MAAM,SAAS,GAAG;AAChE,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,YAAY;AAAA,QAAA;AAElD,eAAA;AAAA,MACR;AAAA,MACA,SAAS,OAAO,EAAE,aAAa;AACxB,cAAA,SAAS,MAAM,MAAM;AAAA,UAC1B,OAAO,OAAO;AAAA,UACd,UAAU,OAAO;AAAA,UACjB,UAAU,OAAO,YAAY;AAAA,UAC7B;AAAA,QAAA,CACA;AAED,YAAI,CAAC,OAAO,MAAM,OAAO,UAAU,gBAAgB;AAClD,iBAAO,EAAE,GAAG,QAAQ,OAAO,eAAe;AAAA,QAAA;AAGpC,eAAA;AAAA,MACR;AAAA,MAEC;AAAA,IAAA;AAAA,IA/CF;AAAA,IAAA;AAAA,IAAA;AAAA,MAAA,UAAA;AAAA,MAAA,YAAA;AAAA,MAAA,cAAA;AAAA,IAAA;AAAA,IAAAC;AAAAA,EAgDA;AAGF;AACA,MAAM,eAAqF;AAAA,EAC1F,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,gBAAgB;AACjB;;;"}
|
|
1
|
+
{"version":3,"file":"LoginForm.cjs","sources":["../../../../../../packages/react-client-tenant/src/components/forms/LoginForm.tsx"],"sourcesContent":["import { ReactElement, useCallback, useMemo } from 'react'\nimport * as TenantApi from '@contember/graphql-client-tenant'\nimport { TenantForm } from './TenantForm'\nimport { SignInErrorCode } from '@contember/graphql-client-tenant'\nimport { FormContextValue, FormError, FormState } from '../../types'\nimport { useForm } from '../../contexts'\nimport { useSetSessionToken } from '@contember/react-client'\nimport { SignInMutationResult, useSignInMutation } from '../../hooks'\nimport { useRedirectToBacklinkCallback } from '../../internal/hooks/useRedirectToBacklink'\n\n\nexport type LoginFormValues = {\n\temail: string\n\tpassword: string\n\totpToken: string\n}\n\nexport type LoginFormErrorCode =\n\t| SignInErrorCode\n\t| 'FIELD_REQUIRED'\n\t| 'INVALID_VALUE'\n\t| 'UNKNOWN_ERROR'\n\nexport type LoginFormState =\n\t| FormState\n\t| 'otp-required'\n\nexport type LoginFormError = FormError<LoginFormValues, LoginFormErrorCode>\n\nexport type LoginFormContextValue = FormContextValue<LoginFormValues, LoginFormErrorCode, LoginFormState>\n\nexport interface LoginFormProps {\n\texpiration?: number\n\tchildren: ReactElement\n\tonSuccess?: () => void\n}\n\nexport const useLoginForm = useForm as () => LoginFormContextValue\n\nconst headers = {\n\t'X-Contember-Token-Path': 'data.mutation.result.token',\n}\n\nconst DEFAULT_LOGIN_EXPIRATION = 14 * 24 * 60 // 14 days\n\nexport const LoginForm = ({ children, expiration = DEFAULT_LOGIN_EXPIRATION, onSuccess }: LoginFormProps) => {\n\tconst login = useSignInMutation({ headers })\n\tconst redirectToBacklink = useRedirectToBacklinkCallback()\n\tconst setSessionToken = useSetSessionToken()\n\treturn (\n\t\t<TenantForm<LoginFormContextValue, SignInMutationResult>\n\t\t\tonSuccess={args => {\n\t\t\t\tonSuccess?.()\n\t\t\t\tsetSessionToken(args.result.token)\n\t\t\t\tredirectToBacklink()\n\t\t\t}}\n\t\t\terrorMapping={errorToField}\n\t\t\tinitialValues={{\n\t\t\t\temail: '',\n\t\t\t\tpassword: '',\n\t\t\t\totpToken: '',\n\t\t\t}}\n\t\t\tvalidate={({ values, state }) => {\n\t\t\t\tconst errors: LoginFormError[] = []\n\t\t\t\tif (!values.email) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'email' })\n\t\t\t\t} else if (!values.email.match(/^.+@.+$/)) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'email' })\n\t\t\t\t}\n\n\t\t\t\tif (!values.password) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'password' })\n\t\t\t\t} else if (values.password.length < 6) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'password' })\n\t\t\t\t}\n\t\t\t\tif (!values.otpToken && state === 'otp-required') {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'otpToken' })\n\t\t\t\t} else if (values.otpToken && !values.otpToken.match(/^\\d{6}$/)) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'otpToken' })\n\t\t\t\t}\n\t\t\t\treturn errors\n\t\t\t}}\n\t\t\texecute={async ({ values }) => {\n\t\t\t\tconst result = await login({\n\t\t\t\t\temail: values.email!,\n\t\t\t\t\tpassword: values.password!,\n\t\t\t\t\totpToken: values.otpToken || undefined,\n\t\t\t\t\texpiration: expiration,\n\t\t\t\t})\n\n\t\t\t\tif (!result.ok && result.error === 'OTP_REQUIRED') {\n\t\t\t\t\treturn { ...result, state: 'otp-required' }\n\t\t\t\t}\n\n\t\t\t\treturn result\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</TenantForm>\n\t)\n\n}\nconst errorToField: Record<TenantApi.SignInErrorCode, keyof LoginFormValues | undefined> = {\n\t'INVALID_PASSWORD': 'password',\n\t'NO_PASSWORD_SET': 'password',\n\t'UNKNOWN_EMAIL': 'email',\n\t'PERSON_DISABLED': 'email',\n\t'INVALID_OTP_TOKEN': 'otpToken',\n\t'INVALID_CREDENTIALS': 'password',\n\t'RATE_LIMIT_EXCEEDED': 'password',\n\t'OTP_REQUIRED': undefined,\n}\n"],"names":["useForm","useSignInMutation","useRedirectToBacklinkCallback","useSetSessionToken","jsxDEV","TenantForm","this"],"mappings":";;;;;;;;AAqCO,MAAM,eAAeA,SAAAA;AAE5B,MAAM,UAAU;AAAA,EACf,0BAA0B;AAC3B;AAEA,MAAM,2BAA2B,KAAK,KAAK;AAEpC,MAAM,YAAY,CAAC,EAAE,UAAU,aAAa,0BAA0B,gBAAgC;AAC5G,QAAM,QAAQC,kBAAAA,kBAAkB,EAAE,SAAS;AAC3C,QAAM,qBAAqBC,sBAAAA,8BAA8B;AACzD,QAAM,kBAAkBC,YAAAA,mBAAmB;AAE1C,SAAAC,8BAAA;AAAA,IAACC,WAAA;AAAA,IAAA;AAAA,MACA,WAAW,CAAQ,SAAA;AACN,oBAAA;AACI,wBAAA,KAAK,OAAO,KAAK;AACd,2BAAA;AAAA,MACpB;AAAA,MACA,cAAc;AAAA,MACd,eAAe;AAAA,QACd,OAAO;AAAA,QACP,UAAU;AAAA,QACV,UAAU;AAAA,MACX;AAAA,MACA,UAAU,CAAC,EAAE,QAAQ,YAAY;AAChC,cAAM,SAA2B,CAAC;AAC9B,YAAA,CAAC,OAAO,OAAO;AAClB,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,SAAS;AAAA,mBAC5C,CAAC,OAAO,MAAM,MAAM,SAAS,GAAG;AAC1C,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,SAAS;AAAA,QAAA;AAGlD,YAAA,CAAC,OAAO,UAAU;AACrB,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,YAAY;AAAA,QAC/C,WAAA,OAAO,SAAS,SAAS,GAAG;AACtC,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,YAAY;AAAA,QAAA;AAEzD,YAAI,CAAC,OAAO,YAAY,UAAU,gBAAgB;AACjD,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,YAAY;AAAA,QAAA,WAC/C,OAAO,YAAY,CAAC,OAAO,SAAS,MAAM,SAAS,GAAG;AAChE,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,YAAY;AAAA,QAAA;AAElD,eAAA;AAAA,MACR;AAAA,MACA,SAAS,OAAO,EAAE,aAAa;AACxB,cAAA,SAAS,MAAM,MAAM;AAAA,UAC1B,OAAO,OAAO;AAAA,UACd,UAAU,OAAO;AAAA,UACjB,UAAU,OAAO,YAAY;AAAA,UAC7B;AAAA,QAAA,CACA;AAED,YAAI,CAAC,OAAO,MAAM,OAAO,UAAU,gBAAgB;AAClD,iBAAO,EAAE,GAAG,QAAQ,OAAO,eAAe;AAAA,QAAA;AAGpC,eAAA;AAAA,MACR;AAAA,MAEC;AAAA,IAAA;AAAA,IA/CF;AAAA,IAAA;AAAA,IAAA;AAAA,MAAA,UAAA;AAAA,MAAA,YAAA;AAAA,MAAA,cAAA;AAAA,IAAA;AAAA,IAAAC;AAAAA,EAgDA;AAGF;AACA,MAAM,eAAqF;AAAA,EAC1F,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,gBAAgB;AACjB;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LoginForm.js","sources":["../../../../../../packages/react-client-tenant/src/components/forms/LoginForm.tsx"],"sourcesContent":["import { ReactElement, useCallback, useMemo } from 'react'\nimport * as TenantApi from '@contember/graphql-client-tenant'\nimport { TenantForm } from './TenantForm'\nimport { SignInErrorCode } from '@contember/graphql-client-tenant'\nimport { FormContextValue, FormError, FormState } from '../../types'\nimport { useForm } from '../../contexts'\nimport { useSetSessionToken } from '@contember/react-client'\nimport { SignInMutationResult, useSignInMutation } from '../../hooks'\nimport { useRedirectToBacklinkCallback } from '../../internal/hooks/useRedirectToBacklink'\n\n\nexport type LoginFormValues = {\n\temail: string\n\tpassword: string\n\totpToken: string\n}\n\nexport type LoginFormErrorCode =\n\t| SignInErrorCode\n\t| 'FIELD_REQUIRED'\n\t| 'INVALID_VALUE'\n\t| 'UNKNOWN_ERROR'\n\nexport type LoginFormState =\n\t| FormState\n\t| 'otp-required'\n\nexport type LoginFormError = FormError<LoginFormValues, LoginFormErrorCode>\n\nexport type LoginFormContextValue = FormContextValue<LoginFormValues, LoginFormErrorCode, LoginFormState>\n\nexport interface LoginFormProps {\n\texpiration?: number\n\tchildren: ReactElement\n\tonSuccess?: () => void\n}\n\nexport const useLoginForm = useForm as () => LoginFormContextValue\n\nconst headers = {\n\t'X-Contember-Token-Path': 'data.mutation.result.token',\n}\n\nconst DEFAULT_LOGIN_EXPIRATION = 14 * 24 * 60 // 14 days\n\nexport const LoginForm = ({ children, expiration = DEFAULT_LOGIN_EXPIRATION, onSuccess }: LoginFormProps) => {\n\tconst login = useSignInMutation({ headers })\n\tconst redirectToBacklink = useRedirectToBacklinkCallback()\n\tconst setSessionToken = useSetSessionToken()\n\treturn (\n\t\t<TenantForm<LoginFormContextValue, SignInMutationResult>\n\t\t\tonSuccess={args => {\n\t\t\t\tonSuccess?.()\n\t\t\t\tsetSessionToken(args.result.token)\n\t\t\t\tredirectToBacklink()\n\t\t\t}}\n\t\t\terrorMapping={errorToField}\n\t\t\tinitialValues={{\n\t\t\t\temail: '',\n\t\t\t\tpassword: '',\n\t\t\t\totpToken: '',\n\t\t\t}}\n\t\t\tvalidate={({ values, state }) => {\n\t\t\t\tconst errors: LoginFormError[] = []\n\t\t\t\tif (!values.email) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'email' })\n\t\t\t\t} else if (!values.email.match(/^.+@.+$/)) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'email' })\n\t\t\t\t}\n\n\t\t\t\tif (!values.password) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'password' })\n\t\t\t\t} else if (values.password.length < 6) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'password' })\n\t\t\t\t}\n\t\t\t\tif (!values.otpToken && state === 'otp-required') {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'otpToken' })\n\t\t\t\t} else if (values.otpToken && !values.otpToken.match(/^\\d{6}$/)) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'otpToken' })\n\t\t\t\t}\n\t\t\t\treturn errors\n\t\t\t}}\n\t\t\texecute={async ({ values }) => {\n\t\t\t\tconst result = await login({\n\t\t\t\t\temail: values.email!,\n\t\t\t\t\tpassword: values.password!,\n\t\t\t\t\totpToken: values.otpToken || undefined,\n\t\t\t\t\texpiration: expiration,\n\t\t\t\t})\n\n\t\t\t\tif (!result.ok && result.error === 'OTP_REQUIRED') {\n\t\t\t\t\treturn { ...result, state: 'otp-required' }\n\t\t\t\t}\n\n\t\t\t\treturn result\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</TenantForm>\n\t)\n\n}\nconst errorToField: Record<TenantApi.SignInErrorCode, keyof LoginFormValues | undefined> = {\n\t'INVALID_PASSWORD': 'password',\n\t'NO_PASSWORD_SET': 'password',\n\t'UNKNOWN_EMAIL': 'email',\n\t'PERSON_DISABLED': 'email',\n\t'INVALID_OTP_TOKEN': 'otpToken',\n\t'OTP_REQUIRED': undefined,\n}\n"],"names":["this"],"mappings":";;;;;;AAqCO,MAAM,eAAe;AAE5B,MAAM,UAAU;AAAA,EACf,0BAA0B;AAC3B;AAEA,MAAM,2BAA2B,KAAK,KAAK;AAEpC,MAAM,YAAY,CAAC,EAAE,UAAU,aAAa,0BAA0B,gBAAgC;AAC5G,QAAM,QAAQ,kBAAkB,EAAE,SAAS;AAC3C,QAAM,qBAAqB,8BAA8B;AACzD,QAAM,kBAAkB,mBAAmB;AAE1C,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACA,WAAW,CAAQ,SAAA;AACN,oBAAA;AACI,wBAAA,KAAK,OAAO,KAAK;AACd,2BAAA;AAAA,MACpB;AAAA,MACA,cAAc;AAAA,MACd,eAAe;AAAA,QACd,OAAO;AAAA,QACP,UAAU;AAAA,QACV,UAAU;AAAA,MACX;AAAA,MACA,UAAU,CAAC,EAAE,QAAQ,YAAY;AAChC,cAAM,SAA2B,CAAC;AAC9B,YAAA,CAAC,OAAO,OAAO;AAClB,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,SAAS;AAAA,mBAC5C,CAAC,OAAO,MAAM,MAAM,SAAS,GAAG;AAC1C,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,SAAS;AAAA,QAAA;AAGlD,YAAA,CAAC,OAAO,UAAU;AACrB,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,YAAY;AAAA,QAC/C,WAAA,OAAO,SAAS,SAAS,GAAG;AACtC,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,YAAY;AAAA,QAAA;AAEzD,YAAI,CAAC,OAAO,YAAY,UAAU,gBAAgB;AACjD,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,YAAY;AAAA,QAAA,WAC/C,OAAO,YAAY,CAAC,OAAO,SAAS,MAAM,SAAS,GAAG;AAChE,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,YAAY;AAAA,QAAA;AAElD,eAAA;AAAA,MACR;AAAA,MACA,SAAS,OAAO,EAAE,aAAa;AACxB,cAAA,SAAS,MAAM,MAAM;AAAA,UAC1B,OAAO,OAAO;AAAA,UACd,UAAU,OAAO;AAAA,UACjB,UAAU,OAAO,YAAY;AAAA,UAC7B;AAAA,QAAA,CACA;AAED,YAAI,CAAC,OAAO,MAAM,OAAO,UAAU,gBAAgB;AAClD,iBAAO,EAAE,GAAG,QAAQ,OAAO,eAAe;AAAA,QAAA;AAGpC,eAAA;AAAA,MACR;AAAA,MAEC;AAAA,IAAA;AAAA,IA/CF;AAAA,IAAA;AAAA,IAAA;AAAA,MAAA,UAAA;AAAA,MAAA,YAAA;AAAA,MAAA,cAAA;AAAA,IAAA;AAAA,IAAAA;AAAAA,EAgDA;AAGF;AACA,MAAM,eAAqF;AAAA,EAC1F,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,gBAAgB;AACjB;"}
|
|
1
|
+
{"version":3,"file":"LoginForm.js","sources":["../../../../../../packages/react-client-tenant/src/components/forms/LoginForm.tsx"],"sourcesContent":["import { ReactElement, useCallback, useMemo } from 'react'\nimport * as TenantApi from '@contember/graphql-client-tenant'\nimport { TenantForm } from './TenantForm'\nimport { SignInErrorCode } from '@contember/graphql-client-tenant'\nimport { FormContextValue, FormError, FormState } from '../../types'\nimport { useForm } from '../../contexts'\nimport { useSetSessionToken } from '@contember/react-client'\nimport { SignInMutationResult, useSignInMutation } from '../../hooks'\nimport { useRedirectToBacklinkCallback } from '../../internal/hooks/useRedirectToBacklink'\n\n\nexport type LoginFormValues = {\n\temail: string\n\tpassword: string\n\totpToken: string\n}\n\nexport type LoginFormErrorCode =\n\t| SignInErrorCode\n\t| 'FIELD_REQUIRED'\n\t| 'INVALID_VALUE'\n\t| 'UNKNOWN_ERROR'\n\nexport type LoginFormState =\n\t| FormState\n\t| 'otp-required'\n\nexport type LoginFormError = FormError<LoginFormValues, LoginFormErrorCode>\n\nexport type LoginFormContextValue = FormContextValue<LoginFormValues, LoginFormErrorCode, LoginFormState>\n\nexport interface LoginFormProps {\n\texpiration?: number\n\tchildren: ReactElement\n\tonSuccess?: () => void\n}\n\nexport const useLoginForm = useForm as () => LoginFormContextValue\n\nconst headers = {\n\t'X-Contember-Token-Path': 'data.mutation.result.token',\n}\n\nconst DEFAULT_LOGIN_EXPIRATION = 14 * 24 * 60 // 14 days\n\nexport const LoginForm = ({ children, expiration = DEFAULT_LOGIN_EXPIRATION, onSuccess }: LoginFormProps) => {\n\tconst login = useSignInMutation({ headers })\n\tconst redirectToBacklink = useRedirectToBacklinkCallback()\n\tconst setSessionToken = useSetSessionToken()\n\treturn (\n\t\t<TenantForm<LoginFormContextValue, SignInMutationResult>\n\t\t\tonSuccess={args => {\n\t\t\t\tonSuccess?.()\n\t\t\t\tsetSessionToken(args.result.token)\n\t\t\t\tredirectToBacklink()\n\t\t\t}}\n\t\t\terrorMapping={errorToField}\n\t\t\tinitialValues={{\n\t\t\t\temail: '',\n\t\t\t\tpassword: '',\n\t\t\t\totpToken: '',\n\t\t\t}}\n\t\t\tvalidate={({ values, state }) => {\n\t\t\t\tconst errors: LoginFormError[] = []\n\t\t\t\tif (!values.email) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'email' })\n\t\t\t\t} else if (!values.email.match(/^.+@.+$/)) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'email' })\n\t\t\t\t}\n\n\t\t\t\tif (!values.password) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'password' })\n\t\t\t\t} else if (values.password.length < 6) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'password' })\n\t\t\t\t}\n\t\t\t\tif (!values.otpToken && state === 'otp-required') {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'otpToken' })\n\t\t\t\t} else if (values.otpToken && !values.otpToken.match(/^\\d{6}$/)) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'otpToken' })\n\t\t\t\t}\n\t\t\t\treturn errors\n\t\t\t}}\n\t\t\texecute={async ({ values }) => {\n\t\t\t\tconst result = await login({\n\t\t\t\t\temail: values.email!,\n\t\t\t\t\tpassword: values.password!,\n\t\t\t\t\totpToken: values.otpToken || undefined,\n\t\t\t\t\texpiration: expiration,\n\t\t\t\t})\n\n\t\t\t\tif (!result.ok && result.error === 'OTP_REQUIRED') {\n\t\t\t\t\treturn { ...result, state: 'otp-required' }\n\t\t\t\t}\n\n\t\t\t\treturn result\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</TenantForm>\n\t)\n\n}\nconst errorToField: Record<TenantApi.SignInErrorCode, keyof LoginFormValues | undefined> = {\n\t'INVALID_PASSWORD': 'password',\n\t'NO_PASSWORD_SET': 'password',\n\t'UNKNOWN_EMAIL': 'email',\n\t'PERSON_DISABLED': 'email',\n\t'INVALID_OTP_TOKEN': 'otpToken',\n\t'INVALID_CREDENTIALS': 'password',\n\t'RATE_LIMIT_EXCEEDED': 'password',\n\t'OTP_REQUIRED': undefined,\n}\n"],"names":["this"],"mappings":";;;;;;AAqCO,MAAM,eAAe;AAE5B,MAAM,UAAU;AAAA,EACf,0BAA0B;AAC3B;AAEA,MAAM,2BAA2B,KAAK,KAAK;AAEpC,MAAM,YAAY,CAAC,EAAE,UAAU,aAAa,0BAA0B,gBAAgC;AAC5G,QAAM,QAAQ,kBAAkB,EAAE,SAAS;AAC3C,QAAM,qBAAqB,8BAA8B;AACzD,QAAM,kBAAkB,mBAAmB;AAE1C,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACA,WAAW,CAAQ,SAAA;AACN,oBAAA;AACI,wBAAA,KAAK,OAAO,KAAK;AACd,2BAAA;AAAA,MACpB;AAAA,MACA,cAAc;AAAA,MACd,eAAe;AAAA,QACd,OAAO;AAAA,QACP,UAAU;AAAA,QACV,UAAU;AAAA,MACX;AAAA,MACA,UAAU,CAAC,EAAE,QAAQ,YAAY;AAChC,cAAM,SAA2B,CAAC;AAC9B,YAAA,CAAC,OAAO,OAAO;AAClB,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,SAAS;AAAA,mBAC5C,CAAC,OAAO,MAAM,MAAM,SAAS,GAAG;AAC1C,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,SAAS;AAAA,QAAA;AAGlD,YAAA,CAAC,OAAO,UAAU;AACrB,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,YAAY;AAAA,QAC/C,WAAA,OAAO,SAAS,SAAS,GAAG;AACtC,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,YAAY;AAAA,QAAA;AAEzD,YAAI,CAAC,OAAO,YAAY,UAAU,gBAAgB;AACjD,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,YAAY;AAAA,QAAA,WAC/C,OAAO,YAAY,CAAC,OAAO,SAAS,MAAM,SAAS,GAAG;AAChE,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,YAAY;AAAA,QAAA;AAElD,eAAA;AAAA,MACR;AAAA,MACA,SAAS,OAAO,EAAE,aAAa;AACxB,cAAA,SAAS,MAAM,MAAM;AAAA,UAC1B,OAAO,OAAO;AAAA,UACd,UAAU,OAAO;AAAA,UACjB,UAAU,OAAO,YAAY;AAAA,UAC7B;AAAA,QAAA,CACA;AAED,YAAI,CAAC,OAAO,MAAM,OAAO,UAAU,gBAAgB;AAClD,iBAAO,EAAE,GAAG,QAAQ,OAAO,eAAe;AAAA,QAAA;AAGpC,eAAA;AAAA,MACR;AAAA,MAEC;AAAA,IAAA;AAAA,IA/CF;AAAA,IAAA;AAAA,IAAA;AAAA,MAAA,UAAA;AAAA,MAAA,YAAA;AAAA,MAAA,cAAA;AAAA,IAAA;AAAA,IAAAA;AAAAA,EAgDA;AAGF;AACA,MAAM,eAAqF;AAAA,EAC1F,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,gBAAgB;AACjB;"}
|
|
@@ -6,7 +6,7 @@ const contexts = require("../../contexts.cjs");
|
|
|
6
6
|
const useHandleIDPResponse = require("../../internal/hooks/useHandleIDPResponse.cjs");
|
|
7
7
|
const useIDPAutoInit = require("../../internal/hooks/useIDPAutoInit.cjs");
|
|
8
8
|
const useInitIDPRedirect = require("../../internal/hooks/useInitIDPRedirect.cjs");
|
|
9
|
-
const IDP = ({ children, onResponseError, onInitError, onLogin }) => {
|
|
9
|
+
const IDP = ({ children, onResponseError, onInitError, onLogin, expiration }) => {
|
|
10
10
|
const hasOauthResponse = React.useMemo(() => {
|
|
11
11
|
const params = new URLSearchParams(window.location.search);
|
|
12
12
|
return params.has("state") && (params.has("code") || params.has("id_token"));
|
|
@@ -21,7 +21,7 @@ const IDP = ({ children, onResponseError, onInitError, onLogin }) => {
|
|
|
21
21
|
}
|
|
22
22
|
return { type: "nothing" };
|
|
23
23
|
});
|
|
24
|
-
useHandleIDPResponse.useHandleIDPResponse({ hasOauthResponse, setState, onLogin });
|
|
24
|
+
useHandleIDPResponse.useHandleIDPResponse({ hasOauthResponse, setState, onLogin, expiration });
|
|
25
25
|
const initRedirect = useInitIDPRedirect.useInitIDPRedirect({ setState });
|
|
26
26
|
const isFirstRender = React.useRef(true);
|
|
27
27
|
React.useEffect(() => {
|
|
@@ -44,11 +44,11 @@ const IDP = ({ children, onResponseError, onInitError, onLogin }) => {
|
|
|
44
44
|
}, [onInitError, onResponseError, state]);
|
|
45
45
|
return /* @__PURE__ */ jsxDevRuntime.jsxDEV(contexts.IDPStateContextProvider.Provider, { value: state, children: /* @__PURE__ */ jsxDevRuntime.jsxDEV(contexts.IDPMethodsContextProvider.Provider, { value: { initRedirect }, children }, void 0, false, {
|
|
46
46
|
fileName: "/home/runner/work/contember/contember/packages/react-client-tenant/src/components/idp/IDP.tsx",
|
|
47
|
-
lineNumber:
|
|
47
|
+
lineNumber: 60,
|
|
48
48
|
columnNumber: 4
|
|
49
49
|
}, void 0) }, void 0, false, {
|
|
50
50
|
fileName: "/home/runner/work/contember/contember/packages/react-client-tenant/src/components/idp/IDP.tsx",
|
|
51
|
-
lineNumber:
|
|
51
|
+
lineNumber: 59,
|
|
52
52
|
columnNumber: 3
|
|
53
53
|
}, void 0);
|
|
54
54
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IDP.cjs","sources":["../../../../../../packages/react-client-tenant/src/components/idp/IDP.tsx"],"sourcesContent":["import { ReactNode, useEffect, useMemo, useRef, useState } from 'react'\nimport { IDPMethodsContextProvider, IDPStateContextProvider } from '../../contexts'\nimport { IDPInitError, IDPResponseError, IDPStateValue } from '../../types/idp'\nimport { useHandleIDPResponse } from '../../internal/hooks/useHandleIDPResponse'\nimport { useIDPAutoInitProvider } from '../../internal/hooks/useIDPAutoInit'\nimport { useInitIDPRedirect } from '../../internal/hooks/useInitIDPRedirect'\n\nexport interface IDPProps {\n\tchildren: ReactNode\n\tonLogin?: () => void\n\tonInitError?: (error: IDPInitError) => void\n\tonResponseError?: (error: IDPResponseError) => void\n}\n\nexport const IDP = ({ children, onResponseError, onInitError, onLogin }: IDPProps) => {\n\tconst hasOauthResponse = useMemo(() => {\n\t\tconst params = new URLSearchParams(window.location.search)\n\t\treturn params.has('state') && (params.has('code') || params.has('id_token'))\n\t}, [])\n\n\tconst autoInit = useIDPAutoInitProvider()\n\tconst [state, setState] = useState<IDPStateValue>(() => {\n\t\tif (hasOauthResponse) {\n\t\t\treturn { type: 'processing_response' }\n\t\t}\n\t\tif (autoInit) {\n\t\t\treturn { type: 'processing_init' }\n\t\t}\n\t\treturn { type: 'nothing' }\n\t})\n\tuseHandleIDPResponse({ hasOauthResponse, setState, onLogin })\n\n\tconst initRedirect = useInitIDPRedirect({ setState })\n\n\tconst isFirstRender = useRef(true)\n\tuseEffect(() => {\n\t\tif (!autoInit) {\n\t\t\treturn\n\t\t}\n\t\tif (!isFirstRender.current) {\n\t\t\treturn\n\t\t}\n\t\tisFirstRender.current = false\n\t\tinitRedirect({ provider: autoInit })\n\t}, [autoInit, initRedirect])\n\n\tuseEffect(() => {\n\t\tif (state.type === 'init_failed' && onInitError) {\n\t\t\tonInitError(state.error)\n\t\t}\n\t\tif (state.type === 'response_failed' && onResponseError) {\n\t\t\tonResponseError(state.error)\n\t\t}\n\t}, [onInitError, onResponseError, state])\n\n\n\treturn (\n\t\t<IDPStateContextProvider.Provider value={state}>\n\t\t\t<IDPMethodsContextProvider.Provider value={{ initRedirect }}>\n\t\t\t\t{children}\n\t\t\t</IDPMethodsContextProvider.Provider>\n\t\t</IDPStateContextProvider.Provider>\n\t)\n\n}\n"],"names":["useMemo","useIDPAutoInitProvider","useState","useHandleIDPResponse","useInitIDPRedirect","useRef","useEffect","jsxDEV","IDPStateContextProvider","IDPMethodsContextProvider","this"],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"file":"IDP.cjs","sources":["../../../../../../packages/react-client-tenant/src/components/idp/IDP.tsx"],"sourcesContent":["import { ReactNode, useEffect, useMemo, useRef, useState } from 'react'\nimport { IDPMethodsContextProvider, IDPStateContextProvider } from '../../contexts'\nimport { IDPInitError, IDPResponseError, IDPStateValue } from '../../types/idp'\nimport { useHandleIDPResponse } from '../../internal/hooks/useHandleIDPResponse'\nimport { useIDPAutoInitProvider } from '../../internal/hooks/useIDPAutoInit'\nimport { useInitIDPRedirect } from '../../internal/hooks/useInitIDPRedirect'\n\nexport interface IDPProps {\n\tchildren: ReactNode\n\tonLogin?: () => void\n\tonInitError?: (error: IDPInitError) => void\n\tonResponseError?: (error: IDPResponseError) => void\n\texpiration?: number\n}\n\nexport const IDP = ({ children, onResponseError, onInitError, onLogin, expiration }: IDPProps) => {\n\tconst hasOauthResponse = useMemo(() => {\n\t\tconst params = new URLSearchParams(window.location.search)\n\t\treturn params.has('state') && (params.has('code') || params.has('id_token'))\n\t}, [])\n\n\tconst autoInit = useIDPAutoInitProvider()\n\tconst [state, setState] = useState<IDPStateValue>(() => {\n\t\tif (hasOauthResponse) {\n\t\t\treturn { type: 'processing_response' }\n\t\t}\n\t\tif (autoInit) {\n\t\t\treturn { type: 'processing_init' }\n\t\t}\n\t\treturn { type: 'nothing' }\n\t})\n\tuseHandleIDPResponse({ hasOauthResponse, setState, onLogin, expiration: expiration })\n\n\tconst initRedirect = useInitIDPRedirect({ setState })\n\n\tconst isFirstRender = useRef(true)\n\tuseEffect(() => {\n\t\tif (!autoInit) {\n\t\t\treturn\n\t\t}\n\t\tif (!isFirstRender.current) {\n\t\t\treturn\n\t\t}\n\t\tisFirstRender.current = false\n\t\tinitRedirect({ provider: autoInit })\n\t}, [autoInit, initRedirect])\n\n\tuseEffect(() => {\n\t\tif (state.type === 'init_failed' && onInitError) {\n\t\t\tonInitError(state.error)\n\t\t}\n\t\tif (state.type === 'response_failed' && onResponseError) {\n\t\t\tonResponseError(state.error)\n\t\t}\n\t}, [onInitError, onResponseError, state])\n\n\n\treturn (\n\t\t<IDPStateContextProvider.Provider value={state}>\n\t\t\t<IDPMethodsContextProvider.Provider value={{ initRedirect }}>\n\t\t\t\t{children}\n\t\t\t</IDPMethodsContextProvider.Provider>\n\t\t</IDPStateContextProvider.Provider>\n\t)\n\n}\n"],"names":["useMemo","useIDPAutoInitProvider","useState","useHandleIDPResponse","useInitIDPRedirect","useRef","useEffect","jsxDEV","IDPStateContextProvider","IDPMethodsContextProvider","this"],"mappings":";;;;;;;;AAea,MAAA,MAAM,CAAC,EAAE,UAAU,iBAAiB,aAAa,SAAS,iBAA2B;AAC3F,QAAA,mBAAmBA,MAAAA,QAAQ,MAAM;AACtC,UAAM,SAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM;AAClD,WAAA,OAAO,IAAI,OAAO,MAAM,OAAO,IAAI,MAAM,KAAK,OAAO,IAAI,UAAU;AAAA,EAC3E,GAAG,EAAE;AAEL,QAAM,WAAWC,eAAAA,uBAAuB;AACxC,QAAM,CAAC,OAAO,QAAQ,IAAIC,eAAwB,MAAM;AACvD,QAAI,kBAAkB;AACd,aAAA,EAAE,MAAM,sBAAsB;AAAA,IAAA;AAEtC,QAAI,UAAU;AACN,aAAA,EAAE,MAAM,kBAAkB;AAAA,IAAA;AAE3B,WAAA,EAAE,MAAM,UAAU;AAAA,EAAA,CACzB;AACDC,uBAAAA,qBAAqB,EAAE,kBAAkB,UAAU,SAAS,YAAwB;AAEpF,QAAM,eAAeC,mBAAAA,mBAAmB,EAAE,UAAU;AAE9C,QAAA,gBAAgBC,aAAO,IAAI;AACjCC,QAAAA,UAAU,MAAM;AACf,QAAI,CAAC,UAAU;AACd;AAAA,IAAA;AAEG,QAAA,CAAC,cAAc,SAAS;AAC3B;AAAA,IAAA;AAED,kBAAc,UAAU;AACX,iBAAA,EAAE,UAAU,UAAU;AAAA,EAAA,GACjC,CAAC,UAAU,YAAY,CAAC;AAE3BA,QAAAA,UAAU,MAAM;AACX,QAAA,MAAM,SAAS,iBAAiB,aAAa;AAChD,kBAAY,MAAM,KAAK;AAAA,IAAA;AAEpB,QAAA,MAAM,SAAS,qBAAqB,iBAAiB;AACxD,sBAAgB,MAAM,KAAK;AAAA,IAAA;AAAA,EAE1B,GAAA,CAAC,aAAa,iBAAiB,KAAK,CAAC;AAGxC,SACEC,8BAAAA,OAAAC,SAAAA,wBAAwB,UAAxB,EAAiC,OAAO,OACxC,UAAAD,qCAACE,SAAAA,0BAA0B,UAA1B,EAAmC,OAAO,EAAE,aAAA,GAC3C,YADF,QAAA,OAAA;AAAA,IAAA,UAAA;AAAA,IAAA,YAAA;AAAA,IAAA,cAAA;AAAA,EAAA,GAAAC,MAEA,EAHD,GAAA,QAAA,OAAA;AAAA,IAAA,UAAA;AAAA,IAAA,YAAA;AAAA,IAAA,cAAA;AAAA,EAIA,GAAAA,MAAA;AAGF;;"}
|
|
@@ -4,7 +4,7 @@ import { IDPStateContextProvider, IDPMethodsContextProvider } from "../../contex
|
|
|
4
4
|
import { useHandleIDPResponse } from "../../internal/hooks/useHandleIDPResponse.js";
|
|
5
5
|
import { useIDPAutoInitProvider } from "../../internal/hooks/useIDPAutoInit.js";
|
|
6
6
|
import { useInitIDPRedirect } from "../../internal/hooks/useInitIDPRedirect.js";
|
|
7
|
-
const IDP = ({ children, onResponseError, onInitError, onLogin }) => {
|
|
7
|
+
const IDP = ({ children, onResponseError, onInitError, onLogin, expiration }) => {
|
|
8
8
|
const hasOauthResponse = useMemo(() => {
|
|
9
9
|
const params = new URLSearchParams(window.location.search);
|
|
10
10
|
return params.has("state") && (params.has("code") || params.has("id_token"));
|
|
@@ -19,7 +19,7 @@ const IDP = ({ children, onResponseError, onInitError, onLogin }) => {
|
|
|
19
19
|
}
|
|
20
20
|
return { type: "nothing" };
|
|
21
21
|
});
|
|
22
|
-
useHandleIDPResponse({ hasOauthResponse, setState, onLogin });
|
|
22
|
+
useHandleIDPResponse({ hasOauthResponse, setState, onLogin, expiration });
|
|
23
23
|
const initRedirect = useInitIDPRedirect({ setState });
|
|
24
24
|
const isFirstRender = useRef(true);
|
|
25
25
|
useEffect(() => {
|
|
@@ -42,11 +42,11 @@ const IDP = ({ children, onResponseError, onInitError, onLogin }) => {
|
|
|
42
42
|
}, [onInitError, onResponseError, state]);
|
|
43
43
|
return /* @__PURE__ */ jsxDEV(IDPStateContextProvider.Provider, { value: state, children: /* @__PURE__ */ jsxDEV(IDPMethodsContextProvider.Provider, { value: { initRedirect }, children }, void 0, false, {
|
|
44
44
|
fileName: "/home/runner/work/contember/contember/packages/react-client-tenant/src/components/idp/IDP.tsx",
|
|
45
|
-
lineNumber:
|
|
45
|
+
lineNumber: 60,
|
|
46
46
|
columnNumber: 4
|
|
47
47
|
}, void 0) }, void 0, false, {
|
|
48
48
|
fileName: "/home/runner/work/contember/contember/packages/react-client-tenant/src/components/idp/IDP.tsx",
|
|
49
|
-
lineNumber:
|
|
49
|
+
lineNumber: 59,
|
|
50
50
|
columnNumber: 3
|
|
51
51
|
}, void 0);
|
|
52
52
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IDP.js","sources":["../../../../../../packages/react-client-tenant/src/components/idp/IDP.tsx"],"sourcesContent":["import { ReactNode, useEffect, useMemo, useRef, useState } from 'react'\nimport { IDPMethodsContextProvider, IDPStateContextProvider } from '../../contexts'\nimport { IDPInitError, IDPResponseError, IDPStateValue } from '../../types/idp'\nimport { useHandleIDPResponse } from '../../internal/hooks/useHandleIDPResponse'\nimport { useIDPAutoInitProvider } from '../../internal/hooks/useIDPAutoInit'\nimport { useInitIDPRedirect } from '../../internal/hooks/useInitIDPRedirect'\n\nexport interface IDPProps {\n\tchildren: ReactNode\n\tonLogin?: () => void\n\tonInitError?: (error: IDPInitError) => void\n\tonResponseError?: (error: IDPResponseError) => void\n}\n\nexport const IDP = ({ children, onResponseError, onInitError, onLogin }: IDPProps) => {\n\tconst hasOauthResponse = useMemo(() => {\n\t\tconst params = new URLSearchParams(window.location.search)\n\t\treturn params.has('state') && (params.has('code') || params.has('id_token'))\n\t}, [])\n\n\tconst autoInit = useIDPAutoInitProvider()\n\tconst [state, setState] = useState<IDPStateValue>(() => {\n\t\tif (hasOauthResponse) {\n\t\t\treturn { type: 'processing_response' }\n\t\t}\n\t\tif (autoInit) {\n\t\t\treturn { type: 'processing_init' }\n\t\t}\n\t\treturn { type: 'nothing' }\n\t})\n\tuseHandleIDPResponse({ hasOauthResponse, setState, onLogin })\n\n\tconst initRedirect = useInitIDPRedirect({ setState })\n\n\tconst isFirstRender = useRef(true)\n\tuseEffect(() => {\n\t\tif (!autoInit) {\n\t\t\treturn\n\t\t}\n\t\tif (!isFirstRender.current) {\n\t\t\treturn\n\t\t}\n\t\tisFirstRender.current = false\n\t\tinitRedirect({ provider: autoInit })\n\t}, [autoInit, initRedirect])\n\n\tuseEffect(() => {\n\t\tif (state.type === 'init_failed' && onInitError) {\n\t\t\tonInitError(state.error)\n\t\t}\n\t\tif (state.type === 'response_failed' && onResponseError) {\n\t\t\tonResponseError(state.error)\n\t\t}\n\t}, [onInitError, onResponseError, state])\n\n\n\treturn (\n\t\t<IDPStateContextProvider.Provider value={state}>\n\t\t\t<IDPMethodsContextProvider.Provider value={{ initRedirect }}>\n\t\t\t\t{children}\n\t\t\t</IDPMethodsContextProvider.Provider>\n\t\t</IDPStateContextProvider.Provider>\n\t)\n\n}\n"],"names":["this"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"IDP.js","sources":["../../../../../../packages/react-client-tenant/src/components/idp/IDP.tsx"],"sourcesContent":["import { ReactNode, useEffect, useMemo, useRef, useState } from 'react'\nimport { IDPMethodsContextProvider, IDPStateContextProvider } from '../../contexts'\nimport { IDPInitError, IDPResponseError, IDPStateValue } from '../../types/idp'\nimport { useHandleIDPResponse } from '../../internal/hooks/useHandleIDPResponse'\nimport { useIDPAutoInitProvider } from '../../internal/hooks/useIDPAutoInit'\nimport { useInitIDPRedirect } from '../../internal/hooks/useInitIDPRedirect'\n\nexport interface IDPProps {\n\tchildren: ReactNode\n\tonLogin?: () => void\n\tonInitError?: (error: IDPInitError) => void\n\tonResponseError?: (error: IDPResponseError) => void\n\texpiration?: number\n}\n\nexport const IDP = ({ children, onResponseError, onInitError, onLogin, expiration }: IDPProps) => {\n\tconst hasOauthResponse = useMemo(() => {\n\t\tconst params = new URLSearchParams(window.location.search)\n\t\treturn params.has('state') && (params.has('code') || params.has('id_token'))\n\t}, [])\n\n\tconst autoInit = useIDPAutoInitProvider()\n\tconst [state, setState] = useState<IDPStateValue>(() => {\n\t\tif (hasOauthResponse) {\n\t\t\treturn { type: 'processing_response' }\n\t\t}\n\t\tif (autoInit) {\n\t\t\treturn { type: 'processing_init' }\n\t\t}\n\t\treturn { type: 'nothing' }\n\t})\n\tuseHandleIDPResponse({ hasOauthResponse, setState, onLogin, expiration: expiration })\n\n\tconst initRedirect = useInitIDPRedirect({ setState })\n\n\tconst isFirstRender = useRef(true)\n\tuseEffect(() => {\n\t\tif (!autoInit) {\n\t\t\treturn\n\t\t}\n\t\tif (!isFirstRender.current) {\n\t\t\treturn\n\t\t}\n\t\tisFirstRender.current = false\n\t\tinitRedirect({ provider: autoInit })\n\t}, [autoInit, initRedirect])\n\n\tuseEffect(() => {\n\t\tif (state.type === 'init_failed' && onInitError) {\n\t\t\tonInitError(state.error)\n\t\t}\n\t\tif (state.type === 'response_failed' && onResponseError) {\n\t\t\tonResponseError(state.error)\n\t\t}\n\t}, [onInitError, onResponseError, state])\n\n\n\treturn (\n\t\t<IDPStateContextProvider.Provider value={state}>\n\t\t\t<IDPMethodsContextProvider.Provider value={{ initRedirect }}>\n\t\t\t\t{children}\n\t\t\t</IDPMethodsContextProvider.Provider>\n\t\t</IDPStateContextProvider.Provider>\n\t)\n\n}\n"],"names":["this"],"mappings":";;;;;;AAea,MAAA,MAAM,CAAC,EAAE,UAAU,iBAAiB,aAAa,SAAS,iBAA2B;AAC3F,QAAA,mBAAmB,QAAQ,MAAM;AACtC,UAAM,SAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM;AAClD,WAAA,OAAO,IAAI,OAAO,MAAM,OAAO,IAAI,MAAM,KAAK,OAAO,IAAI,UAAU;AAAA,EAC3E,GAAG,EAAE;AAEL,QAAM,WAAW,uBAAuB;AACxC,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,MAAM;AACvD,QAAI,kBAAkB;AACd,aAAA,EAAE,MAAM,sBAAsB;AAAA,IAAA;AAEtC,QAAI,UAAU;AACN,aAAA,EAAE,MAAM,kBAAkB;AAAA,IAAA;AAE3B,WAAA,EAAE,MAAM,UAAU;AAAA,EAAA,CACzB;AACD,uBAAqB,EAAE,kBAAkB,UAAU,SAAS,YAAwB;AAEpF,QAAM,eAAe,mBAAmB,EAAE,UAAU;AAE9C,QAAA,gBAAgB,OAAO,IAAI;AACjC,YAAU,MAAM;AACf,QAAI,CAAC,UAAU;AACd;AAAA,IAAA;AAEG,QAAA,CAAC,cAAc,SAAS;AAC3B;AAAA,IAAA;AAED,kBAAc,UAAU;AACX,iBAAA,EAAE,UAAU,UAAU;AAAA,EAAA,GACjC,CAAC,UAAU,YAAY,CAAC;AAE3B,YAAU,MAAM;AACX,QAAA,MAAM,SAAS,iBAAiB,aAAa;AAChD,kBAAY,MAAM,KAAK;AAAA,IAAA;AAEpB,QAAA,MAAM,SAAS,qBAAqB,iBAAiB;AACxD,sBAAgB,MAAM,KAAK;AAAA,IAAA;AAAA,EAE1B,GAAA,CAAC,aAAa,iBAAiB,KAAK,CAAC;AAGxC,SACE,uBAAA,wBAAwB,UAAxB,EAAiC,OAAO,OACxC,UAAA,uBAAC,0BAA0B,UAA1B,EAAmC,OAAO,EAAE,aAAA,GAC3C,YADF,QAAA,OAAA;AAAA,IAAA,UAAA;AAAA,IAAA,YAAA;AAAA,IAAA,cAAA;AAAA,EAAA,GAAAA,MAEA,EAHD,GAAA,QAAA,OAAA;AAAA,IAAA,UAAA;AAAA,IAAA,YAAA;AAAA,IAAA,cAAA;AAAA,EAIA,GAAAA,MAAA;AAGF;"}
|
|
@@ -70,6 +70,8 @@ const errorToField = {
|
|
|
70
70
|
"UNKNOWN_EMAIL": "email",
|
|
71
71
|
"PERSON_DISABLED": "email",
|
|
72
72
|
"INVALID_OTP_TOKEN": "otpToken",
|
|
73
|
+
"INVALID_CREDENTIALS": "password",
|
|
74
|
+
"RATE_LIMIT_EXCEEDED": "password",
|
|
73
75
|
"OTP_REQUIRED": void 0
|
|
74
76
|
};
|
|
75
77
|
exports.LoginForm = LoginForm;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LoginForm.cjs","sources":["../../../../../../packages/react-client-tenant/src/components/forms/LoginForm.tsx"],"sourcesContent":["import { ReactElement, useCallback, useMemo } from 'react'\nimport * as TenantApi from '@contember/graphql-client-tenant'\nimport { TenantForm } from './TenantForm'\nimport { SignInErrorCode } from '@contember/graphql-client-tenant'\nimport { FormContextValue, FormError, FormState } from '../../types'\nimport { useForm } from '../../contexts'\nimport { useSetSessionToken } from '@contember/react-client'\nimport { SignInMutationResult, useSignInMutation } from '../../hooks'\nimport { useRedirectToBacklinkCallback } from '../../internal/hooks/useRedirectToBacklink'\n\n\nexport type LoginFormValues = {\n\temail: string\n\tpassword: string\n\totpToken: string\n}\n\nexport type LoginFormErrorCode =\n\t| SignInErrorCode\n\t| 'FIELD_REQUIRED'\n\t| 'INVALID_VALUE'\n\t| 'UNKNOWN_ERROR'\n\nexport type LoginFormState =\n\t| FormState\n\t| 'otp-required'\n\nexport type LoginFormError = FormError<LoginFormValues, LoginFormErrorCode>\n\nexport type LoginFormContextValue = FormContextValue<LoginFormValues, LoginFormErrorCode, LoginFormState>\n\nexport interface LoginFormProps {\n\texpiration?: number\n\tchildren: ReactElement\n\tonSuccess?: () => void\n}\n\nexport const useLoginForm = useForm as () => LoginFormContextValue\n\nconst headers = {\n\t'X-Contember-Token-Path': 'data.mutation.result.token',\n}\n\nconst DEFAULT_LOGIN_EXPIRATION = 14 * 24 * 60 // 14 days\n\nexport const LoginForm = ({ children, expiration = DEFAULT_LOGIN_EXPIRATION, onSuccess }: LoginFormProps) => {\n\tconst login = useSignInMutation({ headers })\n\tconst redirectToBacklink = useRedirectToBacklinkCallback()\n\tconst setSessionToken = useSetSessionToken()\n\treturn (\n\t\t<TenantForm<LoginFormContextValue, SignInMutationResult>\n\t\t\tonSuccess={args => {\n\t\t\t\tonSuccess?.()\n\t\t\t\tsetSessionToken(args.result.token)\n\t\t\t\tredirectToBacklink()\n\t\t\t}}\n\t\t\terrorMapping={errorToField}\n\t\t\tinitialValues={{\n\t\t\t\temail: '',\n\t\t\t\tpassword: '',\n\t\t\t\totpToken: '',\n\t\t\t}}\n\t\t\tvalidate={({ values, state }) => {\n\t\t\t\tconst errors: LoginFormError[] = []\n\t\t\t\tif (!values.email) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'email' })\n\t\t\t\t} else if (!values.email.match(/^.+@.+$/)) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'email' })\n\t\t\t\t}\n\n\t\t\t\tif (!values.password) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'password' })\n\t\t\t\t} else if (values.password.length < 6) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'password' })\n\t\t\t\t}\n\t\t\t\tif (!values.otpToken && state === 'otp-required') {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'otpToken' })\n\t\t\t\t} else if (values.otpToken && !values.otpToken.match(/^\\d{6}$/)) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'otpToken' })\n\t\t\t\t}\n\t\t\t\treturn errors\n\t\t\t}}\n\t\t\texecute={async ({ values }) => {\n\t\t\t\tconst result = await login({\n\t\t\t\t\temail: values.email!,\n\t\t\t\t\tpassword: values.password!,\n\t\t\t\t\totpToken: values.otpToken || undefined,\n\t\t\t\t\texpiration: expiration,\n\t\t\t\t})\n\n\t\t\t\tif (!result.ok && result.error === 'OTP_REQUIRED') {\n\t\t\t\t\treturn { ...result, state: 'otp-required' }\n\t\t\t\t}\n\n\t\t\t\treturn result\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</TenantForm>\n\t)\n\n}\nconst errorToField: Record<TenantApi.SignInErrorCode, keyof LoginFormValues | undefined> = {\n\t'INVALID_PASSWORD': 'password',\n\t'NO_PASSWORD_SET': 'password',\n\t'UNKNOWN_EMAIL': 'email',\n\t'PERSON_DISABLED': 'email',\n\t'INVALID_OTP_TOKEN': 'otpToken',\n\t'OTP_REQUIRED': undefined,\n}\n"],"names":["useForm","useSignInMutation","useRedirectToBacklinkCallback","useSetSessionToken","jsx","TenantForm"],"mappings":";;;;;;;;AAqCO,MAAM,eAAeA,SAAAA;AAE5B,MAAM,UAAU;AAAA,EACf,0BAA0B;AAC3B;AAEA,MAAM,2BAA2B,KAAK,KAAK;AAEpC,MAAM,YAAY,CAAC,EAAE,UAAU,aAAa,0BAA0B,gBAAgC;AAC5G,QAAM,QAAQC,kBAAAA,kBAAkB,EAAE,SAAS;AAC3C,QAAM,qBAAqBC,sBAAAA,8BAA8B;AACzD,QAAM,kBAAkBC,YAAAA,mBAAmB;AAE1C,SAAAC,2BAAA;AAAA,IAACC,WAAA;AAAA,IAAA;AAAA,MACA,WAAW,CAAQ,SAAA;AACN,oBAAA;AACI,wBAAA,KAAK,OAAO,KAAK;AACd,2BAAA;AAAA,MACpB;AAAA,MACA,cAAc;AAAA,MACd,eAAe;AAAA,QACd,OAAO;AAAA,QACP,UAAU;AAAA,QACV,UAAU;AAAA,MACX;AAAA,MACA,UAAU,CAAC,EAAE,QAAQ,YAAY;AAChC,cAAM,SAA2B,CAAC;AAC9B,YAAA,CAAC,OAAO,OAAO;AAClB,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,SAAS;AAAA,mBAC5C,CAAC,OAAO,MAAM,MAAM,SAAS,GAAG;AAC1C,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,SAAS;AAAA,QAAA;AAGlD,YAAA,CAAC,OAAO,UAAU;AACrB,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,YAAY;AAAA,QAC/C,WAAA,OAAO,SAAS,SAAS,GAAG;AACtC,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,YAAY;AAAA,QAAA;AAEzD,YAAI,CAAC,OAAO,YAAY,UAAU,gBAAgB;AACjD,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,YAAY;AAAA,QAAA,WAC/C,OAAO,YAAY,CAAC,OAAO,SAAS,MAAM,SAAS,GAAG;AAChE,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,YAAY;AAAA,QAAA;AAElD,eAAA;AAAA,MACR;AAAA,MACA,SAAS,OAAO,EAAE,aAAa;AACxB,cAAA,SAAS,MAAM,MAAM;AAAA,UAC1B,OAAO,OAAO;AAAA,UACd,UAAU,OAAO;AAAA,UACjB,UAAU,OAAO,YAAY;AAAA,UAC7B;AAAA,QAAA,CACA;AAED,YAAI,CAAC,OAAO,MAAM,OAAO,UAAU,gBAAgB;AAClD,iBAAO,EAAE,GAAG,QAAQ,OAAO,eAAe;AAAA,QAAA;AAGpC,eAAA;AAAA,MACR;AAAA,MAEC;AAAA,IAAA;AAAA,EACF;AAGF;AACA,MAAM,eAAqF;AAAA,EAC1F,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,gBAAgB;AACjB;;;"}
|
|
1
|
+
{"version":3,"file":"LoginForm.cjs","sources":["../../../../../../packages/react-client-tenant/src/components/forms/LoginForm.tsx"],"sourcesContent":["import { ReactElement, useCallback, useMemo } from 'react'\nimport * as TenantApi from '@contember/graphql-client-tenant'\nimport { TenantForm } from './TenantForm'\nimport { SignInErrorCode } from '@contember/graphql-client-tenant'\nimport { FormContextValue, FormError, FormState } from '../../types'\nimport { useForm } from '../../contexts'\nimport { useSetSessionToken } from '@contember/react-client'\nimport { SignInMutationResult, useSignInMutation } from '../../hooks'\nimport { useRedirectToBacklinkCallback } from '../../internal/hooks/useRedirectToBacklink'\n\n\nexport type LoginFormValues = {\n\temail: string\n\tpassword: string\n\totpToken: string\n}\n\nexport type LoginFormErrorCode =\n\t| SignInErrorCode\n\t| 'FIELD_REQUIRED'\n\t| 'INVALID_VALUE'\n\t| 'UNKNOWN_ERROR'\n\nexport type LoginFormState =\n\t| FormState\n\t| 'otp-required'\n\nexport type LoginFormError = FormError<LoginFormValues, LoginFormErrorCode>\n\nexport type LoginFormContextValue = FormContextValue<LoginFormValues, LoginFormErrorCode, LoginFormState>\n\nexport interface LoginFormProps {\n\texpiration?: number\n\tchildren: ReactElement\n\tonSuccess?: () => void\n}\n\nexport const useLoginForm = useForm as () => LoginFormContextValue\n\nconst headers = {\n\t'X-Contember-Token-Path': 'data.mutation.result.token',\n}\n\nconst DEFAULT_LOGIN_EXPIRATION = 14 * 24 * 60 // 14 days\n\nexport const LoginForm = ({ children, expiration = DEFAULT_LOGIN_EXPIRATION, onSuccess }: LoginFormProps) => {\n\tconst login = useSignInMutation({ headers })\n\tconst redirectToBacklink = useRedirectToBacklinkCallback()\n\tconst setSessionToken = useSetSessionToken()\n\treturn (\n\t\t<TenantForm<LoginFormContextValue, SignInMutationResult>\n\t\t\tonSuccess={args => {\n\t\t\t\tonSuccess?.()\n\t\t\t\tsetSessionToken(args.result.token)\n\t\t\t\tredirectToBacklink()\n\t\t\t}}\n\t\t\terrorMapping={errorToField}\n\t\t\tinitialValues={{\n\t\t\t\temail: '',\n\t\t\t\tpassword: '',\n\t\t\t\totpToken: '',\n\t\t\t}}\n\t\t\tvalidate={({ values, state }) => {\n\t\t\t\tconst errors: LoginFormError[] = []\n\t\t\t\tif (!values.email) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'email' })\n\t\t\t\t} else if (!values.email.match(/^.+@.+$/)) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'email' })\n\t\t\t\t}\n\n\t\t\t\tif (!values.password) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'password' })\n\t\t\t\t} else if (values.password.length < 6) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'password' })\n\t\t\t\t}\n\t\t\t\tif (!values.otpToken && state === 'otp-required') {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'otpToken' })\n\t\t\t\t} else if (values.otpToken && !values.otpToken.match(/^\\d{6}$/)) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'otpToken' })\n\t\t\t\t}\n\t\t\t\treturn errors\n\t\t\t}}\n\t\t\texecute={async ({ values }) => {\n\t\t\t\tconst result = await login({\n\t\t\t\t\temail: values.email!,\n\t\t\t\t\tpassword: values.password!,\n\t\t\t\t\totpToken: values.otpToken || undefined,\n\t\t\t\t\texpiration: expiration,\n\t\t\t\t})\n\n\t\t\t\tif (!result.ok && result.error === 'OTP_REQUIRED') {\n\t\t\t\t\treturn { ...result, state: 'otp-required' }\n\t\t\t\t}\n\n\t\t\t\treturn result\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</TenantForm>\n\t)\n\n}\nconst errorToField: Record<TenantApi.SignInErrorCode, keyof LoginFormValues | undefined> = {\n\t'INVALID_PASSWORD': 'password',\n\t'NO_PASSWORD_SET': 'password',\n\t'UNKNOWN_EMAIL': 'email',\n\t'PERSON_DISABLED': 'email',\n\t'INVALID_OTP_TOKEN': 'otpToken',\n\t'INVALID_CREDENTIALS': 'password',\n\t'RATE_LIMIT_EXCEEDED': 'password',\n\t'OTP_REQUIRED': undefined,\n}\n"],"names":["useForm","useSignInMutation","useRedirectToBacklinkCallback","useSetSessionToken","jsx","TenantForm"],"mappings":";;;;;;;;AAqCO,MAAM,eAAeA,SAAAA;AAE5B,MAAM,UAAU;AAAA,EACf,0BAA0B;AAC3B;AAEA,MAAM,2BAA2B,KAAK,KAAK;AAEpC,MAAM,YAAY,CAAC,EAAE,UAAU,aAAa,0BAA0B,gBAAgC;AAC5G,QAAM,QAAQC,kBAAAA,kBAAkB,EAAE,SAAS;AAC3C,QAAM,qBAAqBC,sBAAAA,8BAA8B;AACzD,QAAM,kBAAkBC,YAAAA,mBAAmB;AAE1C,SAAAC,2BAAA;AAAA,IAACC,WAAA;AAAA,IAAA;AAAA,MACA,WAAW,CAAQ,SAAA;AACN,oBAAA;AACI,wBAAA,KAAK,OAAO,KAAK;AACd,2BAAA;AAAA,MACpB;AAAA,MACA,cAAc;AAAA,MACd,eAAe;AAAA,QACd,OAAO;AAAA,QACP,UAAU;AAAA,QACV,UAAU;AAAA,MACX;AAAA,MACA,UAAU,CAAC,EAAE,QAAQ,YAAY;AAChC,cAAM,SAA2B,CAAC;AAC9B,YAAA,CAAC,OAAO,OAAO;AAClB,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,SAAS;AAAA,mBAC5C,CAAC,OAAO,MAAM,MAAM,SAAS,GAAG;AAC1C,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,SAAS;AAAA,QAAA;AAGlD,YAAA,CAAC,OAAO,UAAU;AACrB,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,YAAY;AAAA,QAC/C,WAAA,OAAO,SAAS,SAAS,GAAG;AACtC,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,YAAY;AAAA,QAAA;AAEzD,YAAI,CAAC,OAAO,YAAY,UAAU,gBAAgB;AACjD,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,YAAY;AAAA,QAAA,WAC/C,OAAO,YAAY,CAAC,OAAO,SAAS,MAAM,SAAS,GAAG;AAChE,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,YAAY;AAAA,QAAA;AAElD,eAAA;AAAA,MACR;AAAA,MACA,SAAS,OAAO,EAAE,aAAa;AACxB,cAAA,SAAS,MAAM,MAAM;AAAA,UAC1B,OAAO,OAAO;AAAA,UACd,UAAU,OAAO;AAAA,UACjB,UAAU,OAAO,YAAY;AAAA,UAC7B;AAAA,QAAA,CACA;AAED,YAAI,CAAC,OAAO,MAAM,OAAO,UAAU,gBAAgB;AAClD,iBAAO,EAAE,GAAG,QAAQ,OAAO,eAAe;AAAA,QAAA;AAGpC,eAAA;AAAA,MACR;AAAA,MAEC;AAAA,IAAA;AAAA,EACF;AAGF;AACA,MAAM,eAAqF;AAAA,EAC1F,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,gBAAgB;AACjB;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LoginForm.js","sources":["../../../../../../packages/react-client-tenant/src/components/forms/LoginForm.tsx"],"sourcesContent":["import { ReactElement, useCallback, useMemo } from 'react'\nimport * as TenantApi from '@contember/graphql-client-tenant'\nimport { TenantForm } from './TenantForm'\nimport { SignInErrorCode } from '@contember/graphql-client-tenant'\nimport { FormContextValue, FormError, FormState } from '../../types'\nimport { useForm } from '../../contexts'\nimport { useSetSessionToken } from '@contember/react-client'\nimport { SignInMutationResult, useSignInMutation } from '../../hooks'\nimport { useRedirectToBacklinkCallback } from '../../internal/hooks/useRedirectToBacklink'\n\n\nexport type LoginFormValues = {\n\temail: string\n\tpassword: string\n\totpToken: string\n}\n\nexport type LoginFormErrorCode =\n\t| SignInErrorCode\n\t| 'FIELD_REQUIRED'\n\t| 'INVALID_VALUE'\n\t| 'UNKNOWN_ERROR'\n\nexport type LoginFormState =\n\t| FormState\n\t| 'otp-required'\n\nexport type LoginFormError = FormError<LoginFormValues, LoginFormErrorCode>\n\nexport type LoginFormContextValue = FormContextValue<LoginFormValues, LoginFormErrorCode, LoginFormState>\n\nexport interface LoginFormProps {\n\texpiration?: number\n\tchildren: ReactElement\n\tonSuccess?: () => void\n}\n\nexport const useLoginForm = useForm as () => LoginFormContextValue\n\nconst headers = {\n\t'X-Contember-Token-Path': 'data.mutation.result.token',\n}\n\nconst DEFAULT_LOGIN_EXPIRATION = 14 * 24 * 60 // 14 days\n\nexport const LoginForm = ({ children, expiration = DEFAULT_LOGIN_EXPIRATION, onSuccess }: LoginFormProps) => {\n\tconst login = useSignInMutation({ headers })\n\tconst redirectToBacklink = useRedirectToBacklinkCallback()\n\tconst setSessionToken = useSetSessionToken()\n\treturn (\n\t\t<TenantForm<LoginFormContextValue, SignInMutationResult>\n\t\t\tonSuccess={args => {\n\t\t\t\tonSuccess?.()\n\t\t\t\tsetSessionToken(args.result.token)\n\t\t\t\tredirectToBacklink()\n\t\t\t}}\n\t\t\terrorMapping={errorToField}\n\t\t\tinitialValues={{\n\t\t\t\temail: '',\n\t\t\t\tpassword: '',\n\t\t\t\totpToken: '',\n\t\t\t}}\n\t\t\tvalidate={({ values, state }) => {\n\t\t\t\tconst errors: LoginFormError[] = []\n\t\t\t\tif (!values.email) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'email' })\n\t\t\t\t} else if (!values.email.match(/^.+@.+$/)) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'email' })\n\t\t\t\t}\n\n\t\t\t\tif (!values.password) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'password' })\n\t\t\t\t} else if (values.password.length < 6) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'password' })\n\t\t\t\t}\n\t\t\t\tif (!values.otpToken && state === 'otp-required') {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'otpToken' })\n\t\t\t\t} else if (values.otpToken && !values.otpToken.match(/^\\d{6}$/)) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'otpToken' })\n\t\t\t\t}\n\t\t\t\treturn errors\n\t\t\t}}\n\t\t\texecute={async ({ values }) => {\n\t\t\t\tconst result = await login({\n\t\t\t\t\temail: values.email!,\n\t\t\t\t\tpassword: values.password!,\n\t\t\t\t\totpToken: values.otpToken || undefined,\n\t\t\t\t\texpiration: expiration,\n\t\t\t\t})\n\n\t\t\t\tif (!result.ok && result.error === 'OTP_REQUIRED') {\n\t\t\t\t\treturn { ...result, state: 'otp-required' }\n\t\t\t\t}\n\n\t\t\t\treturn result\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</TenantForm>\n\t)\n\n}\nconst errorToField: Record<TenantApi.SignInErrorCode, keyof LoginFormValues | undefined> = {\n\t'INVALID_PASSWORD': 'password',\n\t'NO_PASSWORD_SET': 'password',\n\t'UNKNOWN_EMAIL': 'email',\n\t'PERSON_DISABLED': 'email',\n\t'INVALID_OTP_TOKEN': 'otpToken',\n\t'OTP_REQUIRED': undefined,\n}\n"],"names":[],"mappings":";;;;;;AAqCO,MAAM,eAAe;AAE5B,MAAM,UAAU;AAAA,EACf,0BAA0B;AAC3B;AAEA,MAAM,2BAA2B,KAAK,KAAK;AAEpC,MAAM,YAAY,CAAC,EAAE,UAAU,aAAa,0BAA0B,gBAAgC;AAC5G,QAAM,QAAQ,kBAAkB,EAAE,SAAS;AAC3C,QAAM,qBAAqB,8BAA8B;AACzD,QAAM,kBAAkB,mBAAmB;AAE1C,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACA,WAAW,CAAQ,SAAA;AACN,oBAAA;AACI,wBAAA,KAAK,OAAO,KAAK;AACd,2BAAA;AAAA,MACpB;AAAA,MACA,cAAc;AAAA,MACd,eAAe;AAAA,QACd,OAAO;AAAA,QACP,UAAU;AAAA,QACV,UAAU;AAAA,MACX;AAAA,MACA,UAAU,CAAC,EAAE,QAAQ,YAAY;AAChC,cAAM,SAA2B,CAAC;AAC9B,YAAA,CAAC,OAAO,OAAO;AAClB,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,SAAS;AAAA,mBAC5C,CAAC,OAAO,MAAM,MAAM,SAAS,GAAG;AAC1C,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,SAAS;AAAA,QAAA;AAGlD,YAAA,CAAC,OAAO,UAAU;AACrB,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,YAAY;AAAA,QAC/C,WAAA,OAAO,SAAS,SAAS,GAAG;AACtC,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,YAAY;AAAA,QAAA;AAEzD,YAAI,CAAC,OAAO,YAAY,UAAU,gBAAgB;AACjD,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,YAAY;AAAA,QAAA,WAC/C,OAAO,YAAY,CAAC,OAAO,SAAS,MAAM,SAAS,GAAG;AAChE,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,YAAY;AAAA,QAAA;AAElD,eAAA;AAAA,MACR;AAAA,MACA,SAAS,OAAO,EAAE,aAAa;AACxB,cAAA,SAAS,MAAM,MAAM;AAAA,UAC1B,OAAO,OAAO;AAAA,UACd,UAAU,OAAO;AAAA,UACjB,UAAU,OAAO,YAAY;AAAA,UAC7B;AAAA,QAAA,CACA;AAED,YAAI,CAAC,OAAO,MAAM,OAAO,UAAU,gBAAgB;AAClD,iBAAO,EAAE,GAAG,QAAQ,OAAO,eAAe;AAAA,QAAA;AAGpC,eAAA;AAAA,MACR;AAAA,MAEC;AAAA,IAAA;AAAA,EACF;AAGF;AACA,MAAM,eAAqF;AAAA,EAC1F,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,gBAAgB;AACjB;"}
|
|
1
|
+
{"version":3,"file":"LoginForm.js","sources":["../../../../../../packages/react-client-tenant/src/components/forms/LoginForm.tsx"],"sourcesContent":["import { ReactElement, useCallback, useMemo } from 'react'\nimport * as TenantApi from '@contember/graphql-client-tenant'\nimport { TenantForm } from './TenantForm'\nimport { SignInErrorCode } from '@contember/graphql-client-tenant'\nimport { FormContextValue, FormError, FormState } from '../../types'\nimport { useForm } from '../../contexts'\nimport { useSetSessionToken } from '@contember/react-client'\nimport { SignInMutationResult, useSignInMutation } from '../../hooks'\nimport { useRedirectToBacklinkCallback } from '../../internal/hooks/useRedirectToBacklink'\n\n\nexport type LoginFormValues = {\n\temail: string\n\tpassword: string\n\totpToken: string\n}\n\nexport type LoginFormErrorCode =\n\t| SignInErrorCode\n\t| 'FIELD_REQUIRED'\n\t| 'INVALID_VALUE'\n\t| 'UNKNOWN_ERROR'\n\nexport type LoginFormState =\n\t| FormState\n\t| 'otp-required'\n\nexport type LoginFormError = FormError<LoginFormValues, LoginFormErrorCode>\n\nexport type LoginFormContextValue = FormContextValue<LoginFormValues, LoginFormErrorCode, LoginFormState>\n\nexport interface LoginFormProps {\n\texpiration?: number\n\tchildren: ReactElement\n\tonSuccess?: () => void\n}\n\nexport const useLoginForm = useForm as () => LoginFormContextValue\n\nconst headers = {\n\t'X-Contember-Token-Path': 'data.mutation.result.token',\n}\n\nconst DEFAULT_LOGIN_EXPIRATION = 14 * 24 * 60 // 14 days\n\nexport const LoginForm = ({ children, expiration = DEFAULT_LOGIN_EXPIRATION, onSuccess }: LoginFormProps) => {\n\tconst login = useSignInMutation({ headers })\n\tconst redirectToBacklink = useRedirectToBacklinkCallback()\n\tconst setSessionToken = useSetSessionToken()\n\treturn (\n\t\t<TenantForm<LoginFormContextValue, SignInMutationResult>\n\t\t\tonSuccess={args => {\n\t\t\t\tonSuccess?.()\n\t\t\t\tsetSessionToken(args.result.token)\n\t\t\t\tredirectToBacklink()\n\t\t\t}}\n\t\t\terrorMapping={errorToField}\n\t\t\tinitialValues={{\n\t\t\t\temail: '',\n\t\t\t\tpassword: '',\n\t\t\t\totpToken: '',\n\t\t\t}}\n\t\t\tvalidate={({ values, state }) => {\n\t\t\t\tconst errors: LoginFormError[] = []\n\t\t\t\tif (!values.email) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'email' })\n\t\t\t\t} else if (!values.email.match(/^.+@.+$/)) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'email' })\n\t\t\t\t}\n\n\t\t\t\tif (!values.password) {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'password' })\n\t\t\t\t} else if (values.password.length < 6) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'password' })\n\t\t\t\t}\n\t\t\t\tif (!values.otpToken && state === 'otp-required') {\n\t\t\t\t\terrors.push({ code: 'FIELD_REQUIRED', field: 'otpToken' })\n\t\t\t\t} else if (values.otpToken && !values.otpToken.match(/^\\d{6}$/)) {\n\t\t\t\t\terrors.push({ code: 'INVALID_VALUE', field: 'otpToken' })\n\t\t\t\t}\n\t\t\t\treturn errors\n\t\t\t}}\n\t\t\texecute={async ({ values }) => {\n\t\t\t\tconst result = await login({\n\t\t\t\t\temail: values.email!,\n\t\t\t\t\tpassword: values.password!,\n\t\t\t\t\totpToken: values.otpToken || undefined,\n\t\t\t\t\texpiration: expiration,\n\t\t\t\t})\n\n\t\t\t\tif (!result.ok && result.error === 'OTP_REQUIRED') {\n\t\t\t\t\treturn { ...result, state: 'otp-required' }\n\t\t\t\t}\n\n\t\t\t\treturn result\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</TenantForm>\n\t)\n\n}\nconst errorToField: Record<TenantApi.SignInErrorCode, keyof LoginFormValues | undefined> = {\n\t'INVALID_PASSWORD': 'password',\n\t'NO_PASSWORD_SET': 'password',\n\t'UNKNOWN_EMAIL': 'email',\n\t'PERSON_DISABLED': 'email',\n\t'INVALID_OTP_TOKEN': 'otpToken',\n\t'INVALID_CREDENTIALS': 'password',\n\t'RATE_LIMIT_EXCEEDED': 'password',\n\t'OTP_REQUIRED': undefined,\n}\n"],"names":[],"mappings":";;;;;;AAqCO,MAAM,eAAe;AAE5B,MAAM,UAAU;AAAA,EACf,0BAA0B;AAC3B;AAEA,MAAM,2BAA2B,KAAK,KAAK;AAEpC,MAAM,YAAY,CAAC,EAAE,UAAU,aAAa,0BAA0B,gBAAgC;AAC5G,QAAM,QAAQ,kBAAkB,EAAE,SAAS;AAC3C,QAAM,qBAAqB,8BAA8B;AACzD,QAAM,kBAAkB,mBAAmB;AAE1C,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACA,WAAW,CAAQ,SAAA;AACN,oBAAA;AACI,wBAAA,KAAK,OAAO,KAAK;AACd,2BAAA;AAAA,MACpB;AAAA,MACA,cAAc;AAAA,MACd,eAAe;AAAA,QACd,OAAO;AAAA,QACP,UAAU;AAAA,QACV,UAAU;AAAA,MACX;AAAA,MACA,UAAU,CAAC,EAAE,QAAQ,YAAY;AAChC,cAAM,SAA2B,CAAC;AAC9B,YAAA,CAAC,OAAO,OAAO;AAClB,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,SAAS;AAAA,mBAC5C,CAAC,OAAO,MAAM,MAAM,SAAS,GAAG;AAC1C,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,SAAS;AAAA,QAAA;AAGlD,YAAA,CAAC,OAAO,UAAU;AACrB,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,YAAY;AAAA,QAC/C,WAAA,OAAO,SAAS,SAAS,GAAG;AACtC,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,YAAY;AAAA,QAAA;AAEzD,YAAI,CAAC,OAAO,YAAY,UAAU,gBAAgB;AACjD,iBAAO,KAAK,EAAE,MAAM,kBAAkB,OAAO,YAAY;AAAA,QAAA,WAC/C,OAAO,YAAY,CAAC,OAAO,SAAS,MAAM,SAAS,GAAG;AAChE,iBAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,YAAY;AAAA,QAAA;AAElD,eAAA;AAAA,MACR;AAAA,MACA,SAAS,OAAO,EAAE,aAAa;AACxB,cAAA,SAAS,MAAM,MAAM;AAAA,UAC1B,OAAO,OAAO;AAAA,UACd,UAAU,OAAO;AAAA,UACjB,UAAU,OAAO,YAAY;AAAA,UAC7B;AAAA,QAAA,CACA;AAED,YAAI,CAAC,OAAO,MAAM,OAAO,UAAU,gBAAgB;AAClD,iBAAO,EAAE,GAAG,QAAQ,OAAO,eAAe;AAAA,QAAA;AAGpC,eAAA;AAAA,MACR;AAAA,MAEC;AAAA,IAAA;AAAA,EACF;AAGF;AACA,MAAM,eAAqF;AAAA,EAC1F,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,gBAAgB;AACjB;"}
|
|
@@ -6,7 +6,7 @@ const contexts = require("../../contexts.cjs");
|
|
|
6
6
|
const useHandleIDPResponse = require("../../internal/hooks/useHandleIDPResponse.cjs");
|
|
7
7
|
const useIDPAutoInit = require("../../internal/hooks/useIDPAutoInit.cjs");
|
|
8
8
|
const useInitIDPRedirect = require("../../internal/hooks/useInitIDPRedirect.cjs");
|
|
9
|
-
const IDP = ({ children, onResponseError, onInitError, onLogin }) => {
|
|
9
|
+
const IDP = ({ children, onResponseError, onInitError, onLogin, expiration }) => {
|
|
10
10
|
const hasOauthResponse = React.useMemo(() => {
|
|
11
11
|
const params = new URLSearchParams(window.location.search);
|
|
12
12
|
return params.has("state") && (params.has("code") || params.has("id_token"));
|
|
@@ -21,7 +21,7 @@ const IDP = ({ children, onResponseError, onInitError, onLogin }) => {
|
|
|
21
21
|
}
|
|
22
22
|
return { type: "nothing" };
|
|
23
23
|
});
|
|
24
|
-
useHandleIDPResponse.useHandleIDPResponse({ hasOauthResponse, setState, onLogin });
|
|
24
|
+
useHandleIDPResponse.useHandleIDPResponse({ hasOauthResponse, setState, onLogin, expiration });
|
|
25
25
|
const initRedirect = useInitIDPRedirect.useInitIDPRedirect({ setState });
|
|
26
26
|
const isFirstRender = React.useRef(true);
|
|
27
27
|
React.useEffect(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IDP.cjs","sources":["../../../../../../packages/react-client-tenant/src/components/idp/IDP.tsx"],"sourcesContent":["import { ReactNode, useEffect, useMemo, useRef, useState } from 'react'\nimport { IDPMethodsContextProvider, IDPStateContextProvider } from '../../contexts'\nimport { IDPInitError, IDPResponseError, IDPStateValue } from '../../types/idp'\nimport { useHandleIDPResponse } from '../../internal/hooks/useHandleIDPResponse'\nimport { useIDPAutoInitProvider } from '../../internal/hooks/useIDPAutoInit'\nimport { useInitIDPRedirect } from '../../internal/hooks/useInitIDPRedirect'\n\nexport interface IDPProps {\n\tchildren: ReactNode\n\tonLogin?: () => void\n\tonInitError?: (error: IDPInitError) => void\n\tonResponseError?: (error: IDPResponseError) => void\n}\n\nexport const IDP = ({ children, onResponseError, onInitError, onLogin }: IDPProps) => {\n\tconst hasOauthResponse = useMemo(() => {\n\t\tconst params = new URLSearchParams(window.location.search)\n\t\treturn params.has('state') && (params.has('code') || params.has('id_token'))\n\t}, [])\n\n\tconst autoInit = useIDPAutoInitProvider()\n\tconst [state, setState] = useState<IDPStateValue>(() => {\n\t\tif (hasOauthResponse) {\n\t\t\treturn { type: 'processing_response' }\n\t\t}\n\t\tif (autoInit) {\n\t\t\treturn { type: 'processing_init' }\n\t\t}\n\t\treturn { type: 'nothing' }\n\t})\n\tuseHandleIDPResponse({ hasOauthResponse, setState, onLogin })\n\n\tconst initRedirect = useInitIDPRedirect({ setState })\n\n\tconst isFirstRender = useRef(true)\n\tuseEffect(() => {\n\t\tif (!autoInit) {\n\t\t\treturn\n\t\t}\n\t\tif (!isFirstRender.current) {\n\t\t\treturn\n\t\t}\n\t\tisFirstRender.current = false\n\t\tinitRedirect({ provider: autoInit })\n\t}, [autoInit, initRedirect])\n\n\tuseEffect(() => {\n\t\tif (state.type === 'init_failed' && onInitError) {\n\t\t\tonInitError(state.error)\n\t\t}\n\t\tif (state.type === 'response_failed' && onResponseError) {\n\t\t\tonResponseError(state.error)\n\t\t}\n\t}, [onInitError, onResponseError, state])\n\n\n\treturn (\n\t\t<IDPStateContextProvider.Provider value={state}>\n\t\t\t<IDPMethodsContextProvider.Provider value={{ initRedirect }}>\n\t\t\t\t{children}\n\t\t\t</IDPMethodsContextProvider.Provider>\n\t\t</IDPStateContextProvider.Provider>\n\t)\n\n}\n"],"names":["useMemo","useIDPAutoInitProvider","useState","useHandleIDPResponse","useInitIDPRedirect","useRef","useEffect","jsx","IDPStateContextProvider","IDPMethodsContextProvider"],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"file":"IDP.cjs","sources":["../../../../../../packages/react-client-tenant/src/components/idp/IDP.tsx"],"sourcesContent":["import { ReactNode, useEffect, useMemo, useRef, useState } from 'react'\nimport { IDPMethodsContextProvider, IDPStateContextProvider } from '../../contexts'\nimport { IDPInitError, IDPResponseError, IDPStateValue } from '../../types/idp'\nimport { useHandleIDPResponse } from '../../internal/hooks/useHandleIDPResponse'\nimport { useIDPAutoInitProvider } from '../../internal/hooks/useIDPAutoInit'\nimport { useInitIDPRedirect } from '../../internal/hooks/useInitIDPRedirect'\n\nexport interface IDPProps {\n\tchildren: ReactNode\n\tonLogin?: () => void\n\tonInitError?: (error: IDPInitError) => void\n\tonResponseError?: (error: IDPResponseError) => void\n\texpiration?: number\n}\n\nexport const IDP = ({ children, onResponseError, onInitError, onLogin, expiration }: IDPProps) => {\n\tconst hasOauthResponse = useMemo(() => {\n\t\tconst params = new URLSearchParams(window.location.search)\n\t\treturn params.has('state') && (params.has('code') || params.has('id_token'))\n\t}, [])\n\n\tconst autoInit = useIDPAutoInitProvider()\n\tconst [state, setState] = useState<IDPStateValue>(() => {\n\t\tif (hasOauthResponse) {\n\t\t\treturn { type: 'processing_response' }\n\t\t}\n\t\tif (autoInit) {\n\t\t\treturn { type: 'processing_init' }\n\t\t}\n\t\treturn { type: 'nothing' }\n\t})\n\tuseHandleIDPResponse({ hasOauthResponse, setState, onLogin, expiration: expiration })\n\n\tconst initRedirect = useInitIDPRedirect({ setState })\n\n\tconst isFirstRender = useRef(true)\n\tuseEffect(() => {\n\t\tif (!autoInit) {\n\t\t\treturn\n\t\t}\n\t\tif (!isFirstRender.current) {\n\t\t\treturn\n\t\t}\n\t\tisFirstRender.current = false\n\t\tinitRedirect({ provider: autoInit })\n\t}, [autoInit, initRedirect])\n\n\tuseEffect(() => {\n\t\tif (state.type === 'init_failed' && onInitError) {\n\t\t\tonInitError(state.error)\n\t\t}\n\t\tif (state.type === 'response_failed' && onResponseError) {\n\t\t\tonResponseError(state.error)\n\t\t}\n\t}, [onInitError, onResponseError, state])\n\n\n\treturn (\n\t\t<IDPStateContextProvider.Provider value={state}>\n\t\t\t<IDPMethodsContextProvider.Provider value={{ initRedirect }}>\n\t\t\t\t{children}\n\t\t\t</IDPMethodsContextProvider.Provider>\n\t\t</IDPStateContextProvider.Provider>\n\t)\n\n}\n"],"names":["useMemo","useIDPAutoInitProvider","useState","useHandleIDPResponse","useInitIDPRedirect","useRef","useEffect","jsx","IDPStateContextProvider","IDPMethodsContextProvider"],"mappings":";;;;;;;;AAea,MAAA,MAAM,CAAC,EAAE,UAAU,iBAAiB,aAAa,SAAS,iBAA2B;AAC3F,QAAA,mBAAmBA,MAAAA,QAAQ,MAAM;AACtC,UAAM,SAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM;AAClD,WAAA,OAAO,IAAI,OAAO,MAAM,OAAO,IAAI,MAAM,KAAK,OAAO,IAAI,UAAU;AAAA,EAC3E,GAAG,EAAE;AAEL,QAAM,WAAWC,eAAAA,uBAAuB;AACxC,QAAM,CAAC,OAAO,QAAQ,IAAIC,eAAwB,MAAM;AACvD,QAAI,kBAAkB;AACd,aAAA,EAAE,MAAM,sBAAsB;AAAA,IAAA;AAEtC,QAAI,UAAU;AACN,aAAA,EAAE,MAAM,kBAAkB;AAAA,IAAA;AAE3B,WAAA,EAAE,MAAM,UAAU;AAAA,EAAA,CACzB;AACDC,uBAAAA,qBAAqB,EAAE,kBAAkB,UAAU,SAAS,YAAwB;AAEpF,QAAM,eAAeC,mBAAAA,mBAAmB,EAAE,UAAU;AAE9C,QAAA,gBAAgBC,aAAO,IAAI;AACjCC,QAAAA,UAAU,MAAM;AACf,QAAI,CAAC,UAAU;AACd;AAAA,IAAA;AAEG,QAAA,CAAC,cAAc,SAAS;AAC3B;AAAA,IAAA;AAED,kBAAc,UAAU;AACX,iBAAA,EAAE,UAAU,UAAU;AAAA,EAAA,GACjC,CAAC,UAAU,YAAY,CAAC;AAE3BA,QAAAA,UAAU,MAAM;AACX,QAAA,MAAM,SAAS,iBAAiB,aAAa;AAChD,kBAAY,MAAM,KAAK;AAAA,IAAA;AAEpB,QAAA,MAAM,SAAS,qBAAqB,iBAAiB;AACxD,sBAAgB,MAAM,KAAK;AAAA,IAAA;AAAA,EAE1B,GAAA,CAAC,aAAa,iBAAiB,KAAK,CAAC;AAGxC,SACEC,2BAAAA,IAAAC,SAAAA,wBAAwB,UAAxB,EAAiC,OAAO,OACxC,UAAAD,2BAAAA,IAACE,SAAAA,0BAA0B,UAA1B,EAAmC,OAAO,EAAE,aAAa,GACxD,SACF,CAAA,GACD;AAGF;;"}
|
|
@@ -4,7 +4,7 @@ import { IDPStateContextProvider, IDPMethodsContextProvider } from "../../contex
|
|
|
4
4
|
import { useHandleIDPResponse } from "../../internal/hooks/useHandleIDPResponse.js";
|
|
5
5
|
import { useIDPAutoInitProvider } from "../../internal/hooks/useIDPAutoInit.js";
|
|
6
6
|
import { useInitIDPRedirect } from "../../internal/hooks/useInitIDPRedirect.js";
|
|
7
|
-
const IDP = ({ children, onResponseError, onInitError, onLogin }) => {
|
|
7
|
+
const IDP = ({ children, onResponseError, onInitError, onLogin, expiration }) => {
|
|
8
8
|
const hasOauthResponse = useMemo(() => {
|
|
9
9
|
const params = new URLSearchParams(window.location.search);
|
|
10
10
|
return params.has("state") && (params.has("code") || params.has("id_token"));
|
|
@@ -19,7 +19,7 @@ const IDP = ({ children, onResponseError, onInitError, onLogin }) => {
|
|
|
19
19
|
}
|
|
20
20
|
return { type: "nothing" };
|
|
21
21
|
});
|
|
22
|
-
useHandleIDPResponse({ hasOauthResponse, setState, onLogin });
|
|
22
|
+
useHandleIDPResponse({ hasOauthResponse, setState, onLogin, expiration });
|
|
23
23
|
const initRedirect = useInitIDPRedirect({ setState });
|
|
24
24
|
const isFirstRender = useRef(true);
|
|
25
25
|
useEffect(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IDP.js","sources":["../../../../../../packages/react-client-tenant/src/components/idp/IDP.tsx"],"sourcesContent":["import { ReactNode, useEffect, useMemo, useRef, useState } from 'react'\nimport { IDPMethodsContextProvider, IDPStateContextProvider } from '../../contexts'\nimport { IDPInitError, IDPResponseError, IDPStateValue } from '../../types/idp'\nimport { useHandleIDPResponse } from '../../internal/hooks/useHandleIDPResponse'\nimport { useIDPAutoInitProvider } from '../../internal/hooks/useIDPAutoInit'\nimport { useInitIDPRedirect } from '../../internal/hooks/useInitIDPRedirect'\n\nexport interface IDPProps {\n\tchildren: ReactNode\n\tonLogin?: () => void\n\tonInitError?: (error: IDPInitError) => void\n\tonResponseError?: (error: IDPResponseError) => void\n}\n\nexport const IDP = ({ children, onResponseError, onInitError, onLogin }: IDPProps) => {\n\tconst hasOauthResponse = useMemo(() => {\n\t\tconst params = new URLSearchParams(window.location.search)\n\t\treturn params.has('state') && (params.has('code') || params.has('id_token'))\n\t}, [])\n\n\tconst autoInit = useIDPAutoInitProvider()\n\tconst [state, setState] = useState<IDPStateValue>(() => {\n\t\tif (hasOauthResponse) {\n\t\t\treturn { type: 'processing_response' }\n\t\t}\n\t\tif (autoInit) {\n\t\t\treturn { type: 'processing_init' }\n\t\t}\n\t\treturn { type: 'nothing' }\n\t})\n\tuseHandleIDPResponse({ hasOauthResponse, setState, onLogin })\n\n\tconst initRedirect = useInitIDPRedirect({ setState })\n\n\tconst isFirstRender = useRef(true)\n\tuseEffect(() => {\n\t\tif (!autoInit) {\n\t\t\treturn\n\t\t}\n\t\tif (!isFirstRender.current) {\n\t\t\treturn\n\t\t}\n\t\tisFirstRender.current = false\n\t\tinitRedirect({ provider: autoInit })\n\t}, [autoInit, initRedirect])\n\n\tuseEffect(() => {\n\t\tif (state.type === 'init_failed' && onInitError) {\n\t\t\tonInitError(state.error)\n\t\t}\n\t\tif (state.type === 'response_failed' && onResponseError) {\n\t\t\tonResponseError(state.error)\n\t\t}\n\t}, [onInitError, onResponseError, state])\n\n\n\treturn (\n\t\t<IDPStateContextProvider.Provider value={state}>\n\t\t\t<IDPMethodsContextProvider.Provider value={{ initRedirect }}>\n\t\t\t\t{children}\n\t\t\t</IDPMethodsContextProvider.Provider>\n\t\t</IDPStateContextProvider.Provider>\n\t)\n\n}\n"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"IDP.js","sources":["../../../../../../packages/react-client-tenant/src/components/idp/IDP.tsx"],"sourcesContent":["import { ReactNode, useEffect, useMemo, useRef, useState } from 'react'\nimport { IDPMethodsContextProvider, IDPStateContextProvider } from '../../contexts'\nimport { IDPInitError, IDPResponseError, IDPStateValue } from '../../types/idp'\nimport { useHandleIDPResponse } from '../../internal/hooks/useHandleIDPResponse'\nimport { useIDPAutoInitProvider } from '../../internal/hooks/useIDPAutoInit'\nimport { useInitIDPRedirect } from '../../internal/hooks/useInitIDPRedirect'\n\nexport interface IDPProps {\n\tchildren: ReactNode\n\tonLogin?: () => void\n\tonInitError?: (error: IDPInitError) => void\n\tonResponseError?: (error: IDPResponseError) => void\n\texpiration?: number\n}\n\nexport const IDP = ({ children, onResponseError, onInitError, onLogin, expiration }: IDPProps) => {\n\tconst hasOauthResponse = useMemo(() => {\n\t\tconst params = new URLSearchParams(window.location.search)\n\t\treturn params.has('state') && (params.has('code') || params.has('id_token'))\n\t}, [])\n\n\tconst autoInit = useIDPAutoInitProvider()\n\tconst [state, setState] = useState<IDPStateValue>(() => {\n\t\tif (hasOauthResponse) {\n\t\t\treturn { type: 'processing_response' }\n\t\t}\n\t\tif (autoInit) {\n\t\t\treturn { type: 'processing_init' }\n\t\t}\n\t\treturn { type: 'nothing' }\n\t})\n\tuseHandleIDPResponse({ hasOauthResponse, setState, onLogin, expiration: expiration })\n\n\tconst initRedirect = useInitIDPRedirect({ setState })\n\n\tconst isFirstRender = useRef(true)\n\tuseEffect(() => {\n\t\tif (!autoInit) {\n\t\t\treturn\n\t\t}\n\t\tif (!isFirstRender.current) {\n\t\t\treturn\n\t\t}\n\t\tisFirstRender.current = false\n\t\tinitRedirect({ provider: autoInit })\n\t}, [autoInit, initRedirect])\n\n\tuseEffect(() => {\n\t\tif (state.type === 'init_failed' && onInitError) {\n\t\t\tonInitError(state.error)\n\t\t}\n\t\tif (state.type === 'response_failed' && onResponseError) {\n\t\t\tonResponseError(state.error)\n\t\t}\n\t}, [onInitError, onResponseError, state])\n\n\n\treturn (\n\t\t<IDPStateContextProvider.Provider value={state}>\n\t\t\t<IDPMethodsContextProvider.Provider value={{ initRedirect }}>\n\t\t\t\t{children}\n\t\t\t</IDPMethodsContextProvider.Provider>\n\t\t</IDPStateContextProvider.Provider>\n\t)\n\n}\n"],"names":[],"mappings":";;;;;;AAea,MAAA,MAAM,CAAC,EAAE,UAAU,iBAAiB,aAAa,SAAS,iBAA2B;AAC3F,QAAA,mBAAmB,QAAQ,MAAM;AACtC,UAAM,SAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM;AAClD,WAAA,OAAO,IAAI,OAAO,MAAM,OAAO,IAAI,MAAM,KAAK,OAAO,IAAI,UAAU;AAAA,EAC3E,GAAG,EAAE;AAEL,QAAM,WAAW,uBAAuB;AACxC,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,MAAM;AACvD,QAAI,kBAAkB;AACd,aAAA,EAAE,MAAM,sBAAsB;AAAA,IAAA;AAEtC,QAAI,UAAU;AACN,aAAA,EAAE,MAAM,kBAAkB;AAAA,IAAA;AAE3B,WAAA,EAAE,MAAM,UAAU;AAAA,EAAA,CACzB;AACD,uBAAqB,EAAE,kBAAkB,UAAU,SAAS,YAAwB;AAEpF,QAAM,eAAe,mBAAmB,EAAE,UAAU;AAE9C,QAAA,gBAAgB,OAAO,IAAI;AACjC,YAAU,MAAM;AACf,QAAI,CAAC,UAAU;AACd;AAAA,IAAA;AAEG,QAAA,CAAC,cAAc,SAAS;AAC3B;AAAA,IAAA;AAED,kBAAc,UAAU;AACX,iBAAA,EAAE,UAAU,UAAU;AAAA,EAAA,GACjC,CAAC,UAAU,YAAY,CAAC;AAE3B,YAAU,MAAM;AACX,QAAA,MAAM,SAAS,iBAAiB,aAAa;AAChD,kBAAY,MAAM,KAAK;AAAA,IAAA;AAEpB,QAAA,MAAM,SAAS,qBAAqB,iBAAiB;AACxD,sBAAgB,MAAM,KAAK;AAAA,IAAA;AAAA,EAE1B,GAAA,CAAC,aAAa,iBAAiB,KAAK,CAAC;AAGxC,SACE,oBAAA,wBAAwB,UAAxB,EAAiC,OAAO,OACxC,UAAA,oBAAC,0BAA0B,UAA1B,EAAmC,OAAO,EAAE,aAAa,GACxD,SACF,CAAA,GACD;AAGF;"}
|
|
@@ -5,6 +5,7 @@ export interface IDPProps {
|
|
|
5
5
|
onLogin?: () => void;
|
|
6
6
|
onInitError?: (error: IDPInitError) => void;
|
|
7
7
|
onResponseError?: (error: IDPResponseError) => void;
|
|
8
|
+
expiration?: number;
|
|
8
9
|
}
|
|
9
|
-
export declare const IDP: ({ children, onResponseError, onInitError, onLogin }: IDPProps) => import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export declare const IDP: ({ children, onResponseError, onInitError, onLogin, expiration }: IDPProps) => import("react/jsx-runtime").JSX.Element;
|
|
10
11
|
//# sourceMappingURL=IDP.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IDP.d.ts","sourceRoot":"","sources":["../../../../src/components/idp/IDP.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAwC,MAAM,OAAO,CAAA;AAEvE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAiB,MAAM,iBAAiB,CAAA;AAK/E,MAAM,WAAW,QAAQ;IACxB,QAAQ,EAAE,SAAS,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAA;IAC3C,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"IDP.d.ts","sourceRoot":"","sources":["../../../../src/components/idp/IDP.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAwC,MAAM,OAAO,CAAA;AAEvE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAiB,MAAM,iBAAiB,CAAA;AAK/E,MAAM,WAAW,QAAQ;IACxB,QAAQ,EAAE,SAAS,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAA;IAC3C,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAA;IACnD,UAAU,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,eAAO,MAAM,GAAG,GAAI,iEAAiE,QAAQ,4CAkD5F,CAAA"}
|
|
@@ -5,6 +5,8 @@ export declare const changeMyPasswordMutation: TenantApi.MutationFetcher<{
|
|
|
5
5
|
} & {
|
|
6
6
|
readonly error?: ({
|
|
7
7
|
readonly code: TenantApi.ChangeMyPasswordErrorCode;
|
|
8
|
+
} & {
|
|
9
|
+
readonly weakPasswordReasons?: ReadonlyArray<TenantApi.WeakPasswordReason>;
|
|
8
10
|
} & {
|
|
9
11
|
readonly developerMessage: string;
|
|
10
12
|
}) | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useChangeMyPasswordMutation.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/mutations/auth/useChangeMyPasswordMutation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,kCAAkC,CAAA;AAG7D,eAAO,MAAM,wBAAwB
|
|
1
|
+
{"version":3,"file":"useChangeMyPasswordMutation.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/mutations/auth/useChangeMyPasswordMutation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,kCAAkC,CAAA;AAG7D,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;EAOnC,CAAA;AAEF,eAAO,MAAM,2BAA2B;;;qHAAiD,CAAA;AACzF,MAAM,MAAM,iCAAiC,GAAG,UAAU,CAAC,UAAU,CAAC,OAAO,2BAA2B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSignInMutation.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/mutations/auth/useSignInMutation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,kCAAkC,CAAA;AAE7D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAGjD,QAAA,MAAM,oBAAoB;;;;;;;;;;MAAmE,CAAA;AAE7F,MAAM,MAAM,oBAAoB,GAAG,SAAS,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAEzE,eAAO,MAAM,cAAc
|
|
1
|
+
{"version":3,"file":"useSignInMutation.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/mutations/auth/useSignInMutation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,kCAAkC,CAAA;AAE7D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAGjD,QAAA,MAAM,oBAAoB;;;;;;;;;;MAAmE,CAAA;AAE7F,MAAM,MAAM,oBAAoB,GAAG,SAAS,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAEzE,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQzB,CAAA;AAGF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;8BAE5B,CAAA;AAEF,MAAM,MAAM,uBAAuB,GAAG,UAAU,CAAC,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA"}
|
|
@@ -5,6 +5,8 @@ export declare const resetPasswordMutation: TenantApi.MutationFetcher<{
|
|
|
5
5
|
} & {
|
|
6
6
|
readonly error?: ({
|
|
7
7
|
readonly code: TenantApi.ResetPasswordErrorCode;
|
|
8
|
+
} & {
|
|
9
|
+
readonly weakPasswordReasons?: ReadonlyArray<TenantApi.WeakPasswordReason>;
|
|
8
10
|
} & {
|
|
9
11
|
readonly developerMessage: string;
|
|
10
12
|
} & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useResetPasswordMutation.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/mutations/passwordReset/useResetPasswordMutation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,kCAAkC,CAAA;AAI7D,eAAO,MAAM,qBAAqB
|
|
1
|
+
{"version":3,"file":"useResetPasswordMutation.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/mutations/passwordReset/useResetPasswordMutation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,kCAAkC,CAAA;AAI7D,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;EAOhC,CAAA;AAEF,eAAO,MAAM,wBAAwB;;;kHAEnC,CAAA;AACF,MAAM,MAAM,8BAA8B,GAAG,UAAU,CAAC,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA"}
|