@payloadcms/ui 4.0.0-canary.33 → 4.0.0-canary.35

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.
Files changed (160) hide show
  1. package/dist/elements/APIKeyInput/index.d.ts +2 -0
  2. package/dist/elements/APIKeyInput/index.d.ts.map +1 -1
  3. package/dist/elements/APIKeyInput/index.js +27 -29
  4. package/dist/elements/APIKeyInput/index.js.map +1 -1
  5. package/dist/elements/BulkUpload/FormsManager/createFormData.d.ts +1 -1
  6. package/dist/elements/BulkUpload/FormsManager/createFormData.d.ts.map +1 -1
  7. package/dist/elements/BulkUpload/FormsManager/createFormData.js +7 -3
  8. package/dist/elements/BulkUpload/FormsManager/createFormData.js.map +1 -1
  9. package/dist/elements/BulkUpload/FormsManager/index.d.ts.map +1 -1
  10. package/dist/elements/BulkUpload/FormsManager/index.js +4 -2
  11. package/dist/elements/BulkUpload/FormsManager/index.js.map +1 -1
  12. package/dist/elements/DocumentHeader/Tabs/Tab/index.d.ts +1 -0
  13. package/dist/elements/DocumentHeader/Tabs/Tab/index.d.ts.map +1 -1
  14. package/dist/elements/DocumentHeader/Tabs/Tab/index.js +3 -2
  15. package/dist/elements/DocumentHeader/Tabs/Tab/index.js.map +1 -1
  16. package/dist/elements/DocumentHeader/Tabs/index.d.ts +1 -0
  17. package/dist/elements/DocumentHeader/Tabs/index.d.ts.map +1 -1
  18. package/dist/elements/DocumentHeader/Tabs/index.js +5 -3
  19. package/dist/elements/DocumentHeader/Tabs/index.js.map +1 -1
  20. package/dist/elements/DocumentHeader/index.d.ts +1 -0
  21. package/dist/elements/DocumentHeader/index.d.ts.map +1 -1
  22. package/dist/elements/DocumentHeader/index.js +4 -2
  23. package/dist/elements/DocumentHeader/index.js.map +1 -1
  24. package/dist/elements/Nav/SidebarTabs/renderTabServerFn.js +3 -2
  25. package/dist/elements/Nav/SidebarTabs/renderTabServerFn.js.map +1 -1
  26. package/dist/elements/QueryPresets/QueryPresetBar/index.d.ts.map +1 -1
  27. package/dist/elements/QueryPresets/QueryPresetBar/index.js +14 -1
  28. package/dist/elements/QueryPresets/QueryPresetBar/index.js.map +1 -1
  29. package/dist/forms/Form/context.d.ts +3 -1
  30. package/dist/forms/Form/context.d.ts.map +1 -1
  31. package/dist/forms/Form/context.js +3 -1
  32. package/dist/forms/Form/context.js.map +1 -1
  33. package/dist/forms/Form/index.d.ts.map +1 -1
  34. package/dist/forms/Form/index.js +13 -4
  35. package/dist/forms/Form/index.js.map +1 -1
  36. package/dist/forms/fieldSchemasToFormState/renderField.d.ts.map +1 -1
  37. package/dist/forms/fieldSchemasToFormState/renderField.js +3 -2
  38. package/dist/forms/fieldSchemasToFormState/renderField.js.map +1 -1
  39. package/dist/forms/fieldSchemasToFormState/serverFunctions/mergeAllowedFieldOverrides.d.ts +12 -0
  40. package/dist/forms/fieldSchemasToFormState/serverFunctions/mergeAllowedFieldOverrides.d.ts.map +1 -0
  41. package/dist/forms/fieldSchemasToFormState/serverFunctions/mergeAllowedFieldOverrides.js +42 -0
  42. package/dist/forms/fieldSchemasToFormState/serverFunctions/mergeAllowedFieldOverrides.js.map +1 -0
  43. package/dist/forms/fieldSchemasToFormState/serverFunctions/renderFieldServerFn.d.ts +8 -6
  44. package/dist/forms/fieldSchemasToFormState/serverFunctions/renderFieldServerFn.d.ts.map +1 -1
  45. package/dist/forms/fieldSchemasToFormState/serverFunctions/renderFieldServerFn.js +22 -9
  46. package/dist/forms/fieldSchemasToFormState/serverFunctions/renderFieldServerFn.js.map +1 -1
  47. package/dist/forms/fieldSchemasToFormState/serverFunctions/renderFieldServerFn.spec.js +150 -0
  48. package/dist/forms/fieldSchemasToFormState/serverFunctions/renderFieldServerFn.spec.js.map +1 -0
  49. package/dist/forms/fieldSchemasToFormState/types.d.ts +1 -0
  50. package/dist/forms/fieldSchemasToFormState/types.d.ts.map +1 -1
  51. package/dist/forms/fieldSchemasToFormState/types.js.map +1 -1
  52. package/dist/layouts/Root/index.js +6 -5
  53. package/dist/layouts/Root/index.js.map +1 -1
  54. package/dist/providers/LivePreview/index.d.ts.map +1 -1
  55. package/dist/providers/LivePreview/index.js +13 -6
  56. package/dist/providers/LivePreview/index.js.map +1 -1
  57. package/dist/styles.css +1 -1
  58. package/dist/utilities/buildFormState.d.ts.map +1 -1
  59. package/dist/utilities/buildFormState.js +6 -2
  60. package/dist/utilities/buildFormState.js.map +1 -1
  61. package/dist/utilities/formatAbsoluteURL.d.ts +1 -1
  62. package/dist/utilities/formatAbsoluteURL.d.ts.map +1 -1
  63. package/dist/utilities/formatAbsoluteURL.js +18 -8
  64. package/dist/utilities/formatAbsoluteURL.js.map +1 -1
  65. package/dist/utilities/formatAbsoluteURL.spec.js +27 -0
  66. package/dist/utilities/formatAbsoluteURL.spec.js.map +1 -0
  67. package/dist/utilities/handleServerFunctions.d.ts.map +1 -1
  68. package/dist/utilities/handleServerFunctions.js +4 -2
  69. package/dist/utilities/handleServerFunctions.js.map +1 -1
  70. package/dist/utilities/initReq.d.ts.map +1 -1
  71. package/dist/utilities/initReq.js +40 -5
  72. package/dist/utilities/initReq.js.map +1 -1
  73. package/dist/utilities/initReq.spec.js +226 -0
  74. package/dist/utilities/initReq.spec.js.map +1 -0
  75. package/dist/utilities/isAbsoluteURL.d.ts +3 -0
  76. package/dist/utilities/isAbsoluteURL.d.ts.map +1 -0
  77. package/dist/utilities/isAbsoluteURL.js +15 -0
  78. package/dist/utilities/isAbsoluteURL.js.map +1 -0
  79. package/dist/utilities/isAbsoluteURL.spec.js +11 -0
  80. package/dist/utilities/isAbsoluteURL.spec.js.map +1 -0
  81. package/dist/utilities/isHttpURL.d.ts +3 -0
  82. package/dist/utilities/isHttpURL.d.ts.map +1 -0
  83. package/dist/utilities/isHttpURL.js +12 -0
  84. package/dist/utilities/isHttpURL.js.map +1 -0
  85. package/dist/utilities/isHttpURL.spec.js +25 -0
  86. package/dist/utilities/isHttpURL.spec.js.map +1 -0
  87. package/dist/utilities/isPublicAdminRoute.d.ts.map +1 -1
  88. package/dist/utilities/isPublicAdminRoute.js +9 -6
  89. package/dist/utilities/isPublicAdminRoute.js.map +1 -1
  90. package/dist/utilities/isPublicAdminRoute.spec.js +34 -0
  91. package/dist/utilities/isPublicAdminRoute.spec.js.map +1 -0
  92. package/dist/utilities/schedulePublishHandler.d.ts.map +1 -1
  93. package/dist/utilities/schedulePublishHandler.js +4 -1
  94. package/dist/utilities/schedulePublishHandler.js.map +1 -1
  95. package/dist/views/Account/index.d.ts +1 -1
  96. package/dist/views/Account/index.d.ts.map +1 -1
  97. package/dist/views/Account/index.js +8 -5
  98. package/dist/views/Account/index.js.map +1 -1
  99. package/dist/views/Dashboard/Default/ModularDashboard/index.d.ts.map +1 -1
  100. package/dist/views/Dashboard/Default/ModularDashboard/index.js +1 -0
  101. package/dist/views/Dashboard/Default/ModularDashboard/index.js.map +1 -1
  102. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/getDefaultLayoutServerFn.d.ts.map +1 -1
  103. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/getDefaultLayoutServerFn.js +3 -1
  104. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/getDefaultLayoutServerFn.js.map +1 -1
  105. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/renderWidgetServerFn.d.ts.map +1 -1
  106. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/renderWidgetServerFn.js +2 -0
  107. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/renderWidgetServerFn.js.map +1 -1
  108. package/dist/views/Dashboard/index.d.ts.map +1 -1
  109. package/dist/views/Dashboard/index.js +2 -3
  110. package/dist/views/Dashboard/index.js.map +1 -1
  111. package/dist/views/Document/handleServerFunction.d.ts.map +1 -1
  112. package/dist/views/Document/handleServerFunction.js +2 -0
  113. package/dist/views/Document/handleServerFunction.js.map +1 -1
  114. package/dist/views/Document/index.d.ts +1 -1
  115. package/dist/views/Document/index.d.ts.map +1 -1
  116. package/dist/views/Document/index.js +9 -4
  117. package/dist/views/Document/index.js.map +1 -1
  118. package/dist/views/Document/renderDocumentSlots.d.ts +1 -0
  119. package/dist/views/Document/renderDocumentSlots.d.ts.map +1 -1
  120. package/dist/views/Document/renderDocumentSlots.js +7 -4
  121. package/dist/views/Document/renderDocumentSlots.js.map +1 -1
  122. package/dist/views/Edit/Auth/APIKey.d.ts +1 -1
  123. package/dist/views/Edit/Auth/APIKey.d.ts.map +1 -1
  124. package/dist/views/Edit/Auth/APIKey.js +233 -59
  125. package/dist/views/Edit/Auth/APIKey.js.map +1 -1
  126. package/dist/views/Edit/Auth/APIKeyGenerationModal.d.ts +12 -0
  127. package/dist/views/Edit/Auth/APIKeyGenerationModal.d.ts.map +1 -0
  128. package/dist/views/Edit/Auth/APIKeyGenerationModal.js +117 -0
  129. package/dist/views/Edit/Auth/APIKeyGenerationModal.js.map +1 -0
  130. package/dist/views/Edit/Auth/index.css +91 -0
  131. package/dist/views/Edit/Auth/index.d.ts.map +1 -1
  132. package/dist/views/Edit/Auth/index.js +10 -28
  133. package/dist/views/Edit/Auth/index.js.map +1 -1
  134. package/dist/views/Edit/Auth/types.d.ts +3 -1
  135. package/dist/views/Edit/Auth/types.d.ts.map +1 -1
  136. package/dist/views/Edit/Auth/types.js.map +1 -1
  137. package/dist/views/ForgotPassword/ForgotPasswordForm/index.css +14 -0
  138. package/dist/views/ForgotPassword/ForgotPasswordForm/index.d.ts.map +1 -1
  139. package/dist/views/ForgotPassword/ForgotPasswordForm/index.js +209 -161
  140. package/dist/views/ForgotPassword/ForgotPasswordForm/index.js.map +1 -1
  141. package/dist/views/ForgotPassword/index.d.ts.map +1 -1
  142. package/dist/views/ForgotPassword/index.js +2 -11
  143. package/dist/views/ForgotPassword/index.js.map +1 -1
  144. package/dist/views/List/handleServerFunction.d.ts.map +1 -1
  145. package/dist/views/List/handleServerFunction.js +3 -1
  146. package/dist/views/List/handleServerFunction.js.map +1 -1
  147. package/dist/views/List/index.d.ts.map +1 -1
  148. package/dist/views/List/index.js +2 -1
  149. package/dist/views/List/index.js.map +1 -1
  150. package/dist/views/NotFound/page.d.ts.map +1 -1
  151. package/dist/views/NotFound/page.js +4 -3
  152. package/dist/views/NotFound/page.js.map +1 -1
  153. package/dist/views/Root/index.d.ts.map +1 -1
  154. package/dist/views/Root/index.js +5 -3
  155. package/dist/views/Root/index.js.map +1 -1
  156. package/dist/views/Verify/index.d.ts +1 -1
  157. package/dist/views/Verify/index.d.ts.map +1 -1
  158. package/dist/views/Verify/index.js +4 -4
  159. package/dist/views/Verify/index.js.map +1 -1
  160. package/package.json +4 -4
@@ -34,8 +34,7 @@ export const Auth = props => {
34
34
  verify
35
35
  } = props;
36
36
  const [changingPassword, setChangingPassword] = useState(requirePassword);
37
- const enableAPIKey = useFormFields(_temp);
38
- const dispatchFields = useFormFields(_temp2);
37
+ const dispatchFields = useFormFields(_temp);
39
38
  const modified = useFormModified();
40
39
  const {
41
40
  i18n,
@@ -114,10 +113,8 @@ export const Auth = props => {
114
113
  }
115
114
  const enableFields = (!disableLocalStrategy || typeof disableLocalStrategy === "object" && disableLocalStrategy.enableFields === true) && (showUnlock || showPasswordFields);
116
115
  const disabled = readOnly || isInitializing || isTrashed;
117
- const apiKeyPermissions = docPermissions?.fields === true ? true : docPermissions?.fields?.enableAPIKey;
118
- const apiKeyReadOnly = readOnly || apiKeyPermissions !== true && apiKeyPermissions && typeof apiKeyPermissions === "object" && !apiKeyPermissions?.update;
119
- const enableAPIKeyReadOnly = readOnly || apiKeyPermissions !== true && !apiKeyPermissions?.update;
120
- const canReadApiKey = apiKeyPermissions === true || apiKeyPermissions?.read;
116
+ const apiKeyPermissions = docPermissions?.fields === true ? true : docPermissions?.fields?.apiKey;
117
+ const canManageAPIKey = apiKeyPermissions === true || typeof apiKeyPermissions === "object" && Boolean(apiKeyPermissions?.[operation]);
121
118
  let t2;
122
119
  bb0: {
123
120
  if (docPermissions) {
@@ -221,7 +218,7 @@ export const Auth = props => {
221
218
  }
222
219
  useEffect(t5, t6);
223
220
  const showAuthBlock = enableFields;
224
- const showAPIKeyBlock = useAPIKey && canReadApiKey;
221
+ const showAPIKeyBlock = useAPIKey && canManageAPIKey;
225
222
  const showVerifyBlock = verify && isEditing;
226
223
  if (!(showAuthBlock || showAPIKeyBlock || showVerifyBlock)) {
227
224
  return null;
@@ -310,23 +307,12 @@ export const Auth = props => {
310
307
  disabled: readOnly || isTrashed
311
308
  })]
312
309
  })]
313
- }), showAPIKeyBlock && _jsxs("div", {
310
+ }), showAPIKeyBlock && _jsx("div", {
314
311
  className: `${baseClass}__api-key`,
315
- children: [_jsx(CheckboxField, {
316
- field: {
317
- name: "enableAPIKey",
318
- admin: {
319
- disabled,
320
- readOnly: enableAPIKeyReadOnly
321
- },
322
- label: t("authentication:enableAPIKey")
323
- },
324
- path: "enableAPIKey",
325
- schemaPath: `${collectionSlug}.enableAPIKey`
326
- }), _jsx(APIKey, {
327
- enabled: !!enableAPIKey?.value,
328
- readOnly: apiKeyReadOnly
329
- })]
312
+ children: _jsx(APIKey, {
313
+ readOnly: disabled,
314
+ reveal: typeof useAPIKey === "object" && useAPIKey.reveal === true
315
+ })
330
316
  }), showVerifyBlock && _jsx(CheckboxField, {
331
317
  field: {
332
318
  name: "_verified",
@@ -343,11 +329,7 @@ export const Auth = props => {
343
329
  })
344
330
  });
345
331
  };
346
- function _temp(t0) {
347
- const [fields] = t0;
348
- return fields && fields?.enableAPIKey || null;
349
- }
350
- function _temp2(reducer) {
332
+ function _temp(reducer) {
351
333
  return reducer[1];
352
334
  }
353
335
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["c","_c","formatAdminURL","getFieldPermissions","React","Fragment","useCallback","useEffect","useMemo","useState","toast","Button","EmailAndUsernameFields","CheckboxField","ConfirmPasswordField","PasswordField","useFormFields","useFormModified","useConfig","useDocumentInfo","useTranslation","APIKey","baseClass","Auth","props","$","className","collectionSlug","disableLocalStrategy","email","loginWithUsername","operation","readOnly","requirePassword","setValidateBeforeSubmit","useAPIKey","username","verify","changingPassword","setChangingPassword","enableAPIKey","_temp","dispatchFields","_temp2","modified","i18n","t","docPermissions","isEditing","isInitializing","isTrashed","config","t0","routes","t1","api","showPasswordFields","showUnlock","hasPasswordFieldOverride","fields","hasLoginFieldOverride","permissions","passwordPermissions","field","name","type","parentName","create","update","hasEmailAndUsernameFields","requireEmail","allowEmailLogin","emailPermission","usernamePermission","enableFields","disabled","apiKeyPermissions","apiKeyReadOnly","enableAPIKeyReadOnly","canReadApiKey","read","t2","bb0","Boolean","unlock","undefined","hasPermissionToUnlock","t3","changingPassword_0","errorMessage","path","valid","handleChangePassword","t4","url","apiRoute","response","fetch","body","JSON","stringify","credentials","headers","language","method","status","success","error","t5","t6","showAuthBlock","showAPIKeyBlock","showVerifyBlock","t7","label","startsWith","charAt","slice","toLowerCase","formatHeaderButtonLabel","Controls","_jsxs","children","_jsx","buttonStyle","id","onClick","size","t8","filter","join","autoComplete","required","indexPath","parentPath","parentSchemaPath","schemaPath","admin","enabled","value","reducer"],"sources":["../../../../src/views/Edit/Auth/index.tsx"],"sourcesContent":["'use client'\n\nimport type { SanitizedFieldPermissions } from 'payload'\n\nimport { formatAdminURL, getFieldPermissions } from 'payload/shared'\nimport React, { Fragment, useCallback, useEffect, useMemo, useState } from 'react'\nimport { toast } from 'sonner'\n\nimport type { Props } from './types.js'\n\nimport { Button } from '../../../elements/Button/index.js'\nimport { EmailAndUsernameFields } from '../../../elements/EmailAndUsername/index.js'\nimport { CheckboxField } from '../../../fields/Checkbox/index.js'\nimport { ConfirmPasswordField } from '../../../fields/ConfirmPassword/index.js'\nimport { PasswordField } from '../../../fields/Password/index.js'\nimport { useFormFields, useFormModified } from '../../../forms/Form/context.js'\nimport { useConfig } from '../../../providers/Config/index.js'\nimport { useDocumentInfo } from '../../../providers/DocumentInfo/index.js'\nimport { useTranslation } from '../../../providers/Translation/index.js'\nimport './index.css'\nimport { APIKey } from './APIKey.js'\n\nconst baseClass = 'auth-fields'\n\nexport const Auth: React.FC<Props> = (props) => {\n const {\n className,\n collectionSlug,\n disableLocalStrategy,\n email,\n loginWithUsername,\n operation,\n readOnly,\n requirePassword,\n setValidateBeforeSubmit,\n useAPIKey,\n username,\n verify,\n } = props\n\n const [changingPassword, setChangingPassword] = useState(requirePassword)\n const enableAPIKey = useFormFields(([fields]) => (fields && fields?.enableAPIKey) || null)\n const dispatchFields = useFormFields((reducer) => reducer[1])\n const modified = useFormModified()\n const { i18n, t } = useTranslation()\n const { docPermissions, isEditing, isInitializing, isTrashed } = useDocumentInfo()\n\n const {\n config: {\n routes: { api },\n },\n } = useConfig()\n\n let showPasswordFields: SanitizedFieldPermissions = true\n let showUnlock = true\n const hasPasswordFieldOverride =\n typeof docPermissions.fields === 'object' && 'password' in docPermissions.fields\n const hasLoginFieldOverride =\n typeof docPermissions.fields === 'object' &&\n ('username' in docPermissions.fields || 'email' in docPermissions.fields)\n\n if (hasPasswordFieldOverride) {\n const { permissions: passwordPermissions } = getFieldPermissions({\n field: { name: 'password', type: 'text' },\n operation,\n parentName: '',\n permissions: docPermissions?.fields,\n })\n\n if (operation === 'create') {\n showPasswordFields =\n passwordPermissions === true ||\n ((typeof passwordPermissions === 'object' &&\n passwordPermissions.create) as SanitizedFieldPermissions)\n } else {\n showPasswordFields =\n passwordPermissions === true ||\n ((typeof passwordPermissions === 'object' &&\n passwordPermissions.update) as SanitizedFieldPermissions)\n }\n }\n\n if (hasLoginFieldOverride) {\n const hasEmailAndUsernameFields =\n loginWithUsername && (loginWithUsername.requireEmail || loginWithUsername.allowEmailLogin)\n\n const { operation: emailPermission } = getFieldPermissions({\n field: { name: 'email', type: 'text' },\n operation: 'read',\n parentName: '',\n permissions: docPermissions?.fields,\n })\n\n const { operation: usernamePermission } = getFieldPermissions({\n field: { name: 'username', type: 'text' },\n operation: 'read',\n parentName: '',\n permissions: docPermissions?.fields,\n })\n\n if (hasEmailAndUsernameFields) {\n showUnlock = usernamePermission || emailPermission\n } else if (loginWithUsername && !hasEmailAndUsernameFields) {\n showUnlock = usernamePermission\n } else {\n showUnlock = emailPermission\n }\n }\n\n const enableFields =\n (!disableLocalStrategy ||\n (typeof disableLocalStrategy === 'object' && disableLocalStrategy.enableFields === true)) &&\n (showUnlock || showPasswordFields)\n\n const disabled = readOnly || isInitializing || isTrashed\n\n const apiKeyPermissions =\n docPermissions?.fields === true ? true : docPermissions?.fields?.enableAPIKey\n\n const apiKeyReadOnly =\n readOnly ||\n (apiKeyPermissions !== true &&\n apiKeyPermissions &&\n typeof apiKeyPermissions === 'object' &&\n !apiKeyPermissions?.update)\n\n const enableAPIKeyReadOnly =\n readOnly || (apiKeyPermissions !== true && !apiKeyPermissions?.update)\n\n const canReadApiKey = apiKeyPermissions === true || apiKeyPermissions?.read\n\n const hasPermissionToUnlock: boolean = useMemo(() => {\n if (docPermissions) {\n return Boolean('unlock' in docPermissions ? docPermissions.unlock : undefined)\n }\n\n return false\n }, [docPermissions])\n\n const handleChangePassword = useCallback(\n (changingPassword: boolean) => {\n if (changingPassword) {\n setValidateBeforeSubmit(true)\n\n dispatchFields({\n type: 'UPDATE',\n errorMessage: t('validation:required'),\n path: 'password',\n valid: false,\n })\n\n dispatchFields({\n type: 'UPDATE',\n errorMessage: t('validation:required'),\n path: 'confirm-password',\n valid: false,\n })\n } else {\n setValidateBeforeSubmit(false)\n dispatchFields({ type: 'REMOVE', path: 'password' })\n dispatchFields({ type: 'REMOVE', path: 'confirm-password' })\n }\n\n setChangingPassword(changingPassword)\n },\n [dispatchFields, t, setValidateBeforeSubmit],\n )\n\n const unlock = useCallback(async () => {\n const url = formatAdminURL({\n apiRoute: api,\n path: `/${collectionSlug}/unlock`,\n })\n const response = await fetch(url, {\n body:\n loginWithUsername && username ? JSON.stringify({ username }) : JSON.stringify({ email }),\n credentials: 'include',\n headers: {\n 'Accept-Language': i18n.language,\n 'Content-Type': 'application/json',\n },\n method: 'post',\n })\n\n if (response.status === 200) {\n toast.success(t('authentication:successfullyUnlocked'))\n } else {\n toast.error(t('authentication:failedToUnlock'))\n }\n }, [i18n, api, collectionSlug, email, username, t, loginWithUsername])\n\n useEffect(() => {\n if (!modified) {\n setChangingPassword(false)\n }\n }, [modified])\n\n const showAuthBlock = enableFields\n const showAPIKeyBlock = useAPIKey && canReadApiKey\n const showVerifyBlock = verify && isEditing\n\n if (!(showAuthBlock || showAPIKeyBlock || showVerifyBlock)) {\n return null\n }\n\n const formatHeaderButtonLabel = (label: string): string => {\n if (!i18n?.language?.startsWith('en') || !label) {\n return label\n }\n\n return label.charAt(0) + label.slice(1).toLowerCase()\n }\n\n const Controls =\n enableFields &&\n (changingPassword ||\n (!changingPassword && !requirePassword && !disableLocalStrategy && showPasswordFields) ||\n (!changingPassword && operation === 'update' && hasPermissionToUnlock)) ? (\n <div className={`${baseClass}__controls`}>\n {changingPassword && !requirePassword && (\n <Button\n buttonStyle=\"secondary\"\n disabled={disabled}\n id=\"cancel-change-password\"\n onClick={() => handleChangePassword(false)}\n size=\"medium\"\n >\n {t('general:cancel')}\n </Button>\n )}\n {!changingPassword && !requirePassword && !disableLocalStrategy && showPasswordFields && (\n <Button\n buttonStyle=\"secondary\"\n disabled={disabled}\n id=\"change-password\"\n onClick={() => handleChangePassword(true)}\n size=\"medium\"\n >\n {formatHeaderButtonLabel(t('authentication:changePassword'))}\n </Button>\n )}\n {!changingPassword && operation === 'update' && hasPermissionToUnlock && (\n <Button\n buttonStyle=\"secondary\"\n disabled={disabled || !showUnlock}\n id=\"force-unlock\"\n onClick={() => void unlock()}\n size=\"medium\"\n >\n {formatHeaderButtonLabel(t('authentication:forceUnlock'))}\n </Button>\n )}\n </div>\n ) : null\n\n return (\n <div className={[baseClass, className].filter(Boolean).join(' ')}>\n <div className={`${baseClass}__card`}>\n <div className={`${baseClass}__header`}>\n <div className={`${baseClass}__title`}>{t('authentication:account')}</div>\n {Controls}\n </div>\n <div className={`${baseClass}__body`}>\n {showAuthBlock && (\n <Fragment>\n <EmailAndUsernameFields\n loginWithUsername={loginWithUsername}\n operation={operation}\n permissions={docPermissions?.fields}\n readOnly={readOnly || isTrashed}\n t={t}\n />\n {(changingPassword || requirePassword) &&\n (!disableLocalStrategy || !enableFields) && (\n <div className={`${baseClass}__changing-password`}>\n <PasswordField\n autoComplete=\"new-password\"\n field={{\n name: 'password',\n label: t('authentication:newPassword'),\n required: true,\n }}\n indexPath=\"\"\n parentPath=\"\"\n parentSchemaPath=\"\"\n path=\"password\"\n schemaPath=\"password\"\n />\n <ConfirmPasswordField disabled={readOnly || isTrashed} />\n </div>\n )}\n </Fragment>\n )}\n {showAPIKeyBlock && (\n <div className={`${baseClass}__api-key`}>\n <CheckboxField\n field={{\n name: 'enableAPIKey',\n admin: { disabled, readOnly: enableAPIKeyReadOnly },\n label: t('authentication:enableAPIKey'),\n }}\n path=\"enableAPIKey\"\n schemaPath={`${collectionSlug}.enableAPIKey`}\n />\n <APIKey enabled={!!enableAPIKey?.value} readOnly={apiKeyReadOnly} />\n </div>\n )}\n {showVerifyBlock && (\n <CheckboxField\n field={{\n name: '_verified',\n admin: { disabled, readOnly },\n label: t('authentication:verified'),\n }}\n path=\"_verified\"\n schemaPath={`${collectionSlug}._verified`}\n />\n )}\n </div>\n </div>\n </div>\n )\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;;AAIA,SAASC,cAAc,EAAEC,mBAAmB,QAAQ;AACpD,OAAOC,KAAA,IAASC,QAAQ,EAAEC,WAAW,EAAEC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,QAAQ;AAC3E,SAASC,KAAK,QAAQ;AAItB,SAASC,MAAM,QAAQ;AACvB,SAASC,sBAAsB,QAAQ;AACvC,SAASC,aAAa,QAAQ;AAC9B,SAASC,oBAAoB,QAAQ;AACrC,SAASC,aAAa,QAAQ;AAC9B,SAASC,aAAa,EAAEC,eAAe,QAAQ;AAC/C,SAASC,SAAS,QAAQ;AAC1B,SAASC,eAAe,QAAQ;AAChC,SAASC,cAAc,QAAQ;AAC/B,OAAO;AACP,SAASC,MAAM,QAAQ;AAEvB,MAAMC,SAAA,GAAY;AAElB,OAAO,MAAMC,IAAA,GAAwBC,KAAA;EAAA,MAAAC,CAAA,GAAAxB,EAAA;EACnC;IAAAyB,SAAA;IAAAC,cAAA;IAAAC,oBAAA;IAAAC,KAAA;IAAAC,iBAAA;IAAAC,SAAA;IAAAC,QAAA;IAAAC,eAAA;IAAAC,uBAAA;IAAAC,SAAA;IAAAC,QAAA;IAAAC;EAAA,IAaIb,KAAA;EAEJ,OAAAc,gBAAA,EAAAC,mBAAA,IAAgD9B,QAAA,CAASwB,eAAA;EACzD,MAAAO,YAAA,GAAqBxB,aAAA,CAAAyB,KAAgE;EACrF,MAAAC,cAAA,GAAuB1B,aAAA,CAAA2B,MAAqC;EAC5D,MAAAC,QAAA,GAAiB3B,eAAA;EACjB;IAAA4B,IAAA;IAAAC;EAAA,IAAoB1B,cAAA;EACpB;IAAA2B,cAAA;IAAAC,SAAA;IAAAC,cAAA;IAAAC;EAAA,IAAiE/B,eAAA;EAEjE;IAAAgC,MAAA,EAAAC;EAAA,IAIIlC,SAAA;EAHM;IAAAmC,MAAA,EAAAC;EAAA,IAAAF,EAEP;EADS;IAAAG;EAAA,IAAAD,EAAO;EAInB,IAAAE,kBAAA;EACA,IAAAC,UAAA;EACA,MAAAC,wBAAA,GACE,OAAOX,cAAA,CAAAY,MAAA,KAA0B,YAAY,cAAcZ,cAAA,CAAAY,MAAqB;EAClF,MAAAC,qBAAA,GACE,OAAOb,cAAA,CAAAY,MAAA,KAA0B,aAChC,cAAcZ,cAAA,CAAAY,MAAqB,IAAI,WAAWZ,cAAA,CAAAY,MAAqB,CAAD;EAAA,IAErED,wBAAA;IACF;MAAAG,WAAA,EAAAC;IAAA,IAA6C3D,mBAAA;MAAA4D,KAAA;QAAAC,IAAA,EAC5B;QAAAC,IAAA,EAAkB;MAAA;MAAAlC,SAAA;MAAAmC,UAAA,EAErB;MAAAL,WAAA,EACCd,cAAA,EAAAY;IAAA,CACf;IAAA,IAEI5B,SAAA,KAAc;MAChByB,kBAAA,CAAAA,CAAA,CACEM,mBAAA,SAAwB,IACtB,OAAOA,mBAAA,KAAwB,YAC/BA,mBAAA,CAAAK,MAA0B;IAH9B;MAKAX,kBAAA,CAAAA,CAAA,CACEM,mBAAA,SAAwB,IACtB,OAAOA,mBAAA,KAAwB,YAC/BA,mBAAA,CAAAM,MAA0B;IAH9B;EAAA;EAAA,IAOAR,qBAAA;IACF,MAAAS,yBAAA,GACEvC,iBAAA,KAAsBA,iBAAA,CAAAwC,YAAA,IAAkCxC,iBAAA,CAAAyC,eAAiC,CAAD;IAE1F;MAAAxC,SAAA,EAAAyC;IAAA,IAAuCrE,mBAAA;MAAA4D,KAAA;QAAAC,IAAA,EACtB;QAAAC,IAAA,EAAe;MAAA;MAAAlC,SAAA,EACnB;MAAAmC,UAAA,EACC;MAAAL,WAAA,EACCd,cAAA,EAAAY;IAAA,CACf;IAEA;MAAA5B,SAAA,EAAA0C;IAAA,IAA0CtE,mBAAA;MAAA4D,KAAA;QAAAC,IAAA,EACzB;QAAAC,IAAA,EAAkB;MAAA;MAAAlC,SAAA,EACtB;MAAAmC,UAAA,EACC;MAAAL,WAAA,EACCd,cAAA,EAAAY;IAAA,CACf;IAAA,IAEIU,yBAAA;MACFZ,UAAA,CAAAA,CAAA,CAAagB,kBAAA,IAAsBD,eAAA;IAAnC;MAAA,IACS1C,iBAAA,KAAsBuC,yBAAA;QAC/BZ,UAAA,CAAAA,CAAA,CAAagB,kBAAA;MAAb;QAEAhB,UAAA,CAAAA,CAAA,CAAae,eAAA;MAAb;IAAA;EAAA;EAIJ,MAAAE,YAAA,GACE,CAAC,CAAC9C,oBAAA,IACC,OAAOA,oBAAA,KAAyB,YAAYA,oBAAA,CAAA8C,YAAA,SAA0C,MACxFjB,UAAA,IAAcD,kBAAiB;EAElC,MAAAmB,QAAA,GAAiB3C,QAAA,IAAYiB,cAAA,IAAkBC,SAAA;EAE/C,MAAA0B,iBAAA,GACE7B,cAAA,EAAAY,MAAA,SAA2B,UAAcZ,cAAA,EAAAY,MAAA,EAAAnB,YAAwB;EAEnE,MAAAqC,cAAA,GACE7C,QAAA,IACC4C,iBAAA,SAAsB,IACrBA,iBAAA,IACA,OAAOA,iBAAA,KAAsB,aAC5BA,iBAAA,EAAAR,MAAmB;EAExB,MAAAU,oBAAA,GACE9C,QAAA,IAAa4C,iBAAA,SAAsB,KAASA,iBAAA,EAAAR,MAAmB;EAEjE,MAAAW,aAAA,GAAsBH,iBAAA,SAAsB,IAAQA,iBAAA,EAAAI,IAAmB;EAAA,IAAAC,EAAA;EAAAC,GAAA;IAAA,IAGjEnC,cAAA;MACFkC,EAAA,GAAOE,OAAA,CAAQ,YAAYpC,cAAA,GAAiBA,cAAA,CAAAqC,MAAA,GAAAC,SAAwB;MAAA,MAAAH,GAAA;IAAA;IAGtED,EAAA;EAAO;EALT,MAAAK,qBAAA,GAAuCL,EAMpB;EAAA,IAAAM,EAAA;EAAA,IAAA9D,CAAA,QAAAiB,cAAA,IAAAjB,CAAA,QAAAS,uBAAA,IAAAT,CAAA,QAAAqB,CAAA;IAGjByC,EAAA,GAAAC,kBAAA;MAAA,IACMlD,kBAAA;QACFJ,uBAAA,KAAwB;QAExBQ,cAAA;UAAAuB,IAAA,EACQ;UAAAwB,YAAA,EACQ3C,CAAA,CAAE;UAAA4C,IAAA,EACV;UAAAC,KAAA;QAAA,CAER;QAEAjD,cAAA;UAAAuB,IAAA,EACQ;UAAAwB,YAAA,EACQ3C,CAAA,CAAE;UAAA4C,IAAA,EACV;UAAAC,KAAA;QAAA,CAER;MAAA;QAEAzD,uBAAA,MAAwB;QACxBQ,cAAA;UAAAuB,IAAA,EAAuB;UAAAyB,IAAA,EAAgB;QAAA,CAAW;QAClDhD,cAAA;UAAAuB,IAAA,EAAuB;UAAAyB,IAAA,EAAgB;QAAA,CAAmB;MAAA;MAG5DnD,mBAAA,CAAoBD,kBAAA;IAAA;IACtBb,CAAA,MAAAiB,cAAA;IAAAjB,CAAA,MAAAS,uBAAA;IAAAT,CAAA,MAAAqB,CAAA;IAAArB,CAAA,MAAA8D,EAAA;EAAA;IAAAA,EAAA,GAAA9D,CAAA;EAAA;EAzBF,MAAAmE,oBAAA,GAA6BL,EA0BiB;EAAA,IAAAM,EAAA;EAAA,IAAApE,CAAA,QAAA8B,GAAA,IAAA9B,CAAA,QAAAE,cAAA,IAAAF,CAAA,QAAAI,KAAA,IAAAJ,CAAA,QAAAoB,IAAA,IAAApB,CAAA,QAAAK,iBAAA,IAAAL,CAAA,QAAAqB,CAAA,IAAArB,CAAA,SAAAW,QAAA;IAGnByD,EAAA,SAAAA,CAAA;MACzB,MAAAC,GAAA,GAAY5F,cAAA;QAAA6F,QAAA,EACAxC,GAAA;QAAAmC,IAAA,EACJ,IAAI/D,cAAA;MAAuB,CACnC;MACA,MAAAqE,QAAA,SAAuBC,KAAA,CAAMH,GAAA;QAAAI,IAAA,EAEzBpE,iBAAA,IAAqBM,QAAA,GAAW+D,IAAA,CAAAC,SAAA;UAAAhE;QAAA,CAA0B,IAAK+D,IAAA,CAAAC,SAAA;UAAAvE;QAAA,CAAuB;QAAAwE,WAAA,EAC3E;QAAAC,OAAA;UAAA,mBAEQzD,IAAA,CAAA0D,QAAA;UAAA,gBACH;QAAA;QAAAC,MAAA,EAEV;MAAA,CACV;MAAA,IAEIR,QAAA,CAAAS,MAAA,QAAoB;QACtB/F,KAAA,CAAAgG,OAAA,CAAc5D,CAAA,CAAE;MAAA;QAEhBpC,KAAA,CAAAiG,KAAA,CAAY7D,CAAA,CAAE;MAAA;IAAA;IAElBrB,CAAA,MAAA8B,GAAA;IAAA9B,CAAA,MAAAE,cAAA;IAAAF,CAAA,MAAAI,KAAA;IAAAJ,CAAA,MAAAoB,IAAA;IAAApB,CAAA,MAAAK,iBAAA;IAAAL,CAAA,MAAAqB,CAAA;IAAArB,CAAA,OAAAW,QAAA;IAAAX,CAAA,OAAAoE,EAAA;EAAA;IAAAA,EAAA,GAAApE,CAAA;EAAA;EArBA,MAAA2D,MAAA,GAAeS,EAqBsD;EAAA,IAAAe,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAApF,CAAA,SAAAmB,QAAA;IAE3DgE,EAAA,GAAAA,CAAA;MAAA,KACHhE,QAAA;QACHL,mBAAA,MAAoB;MAAA;IAAA;IAErBsE,EAAA,IAACjE,QAAA;IAASnB,CAAA,OAAAmB,QAAA;IAAAnB,CAAA,OAAAmF,EAAA;IAAAnF,CAAA,OAAAoF,EAAA;EAAA;IAAAD,EAAA,GAAAnF,CAAA;IAAAoF,EAAA,GAAApF,CAAA;EAAA;EAJblB,SAAA,CAAUqG,EAIV,EAAGC,EAAU;EAEb,MAAAC,aAAA,GAAsBpC,YAAA;EACtB,MAAAqC,eAAA,GAAwB5E,SAAA,IAAa4C,aAAA;EACrC,MAAAiC,eAAA,GAAwB3E,MAAA,IAAUW,SAAA;EAAA,MAE5B8D,aAAA,IAAiBC,eAAA,IAAmBC,eAAc;IAAA;EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAxF,CAAA,SAAAoB,IAAA,EAAA0D,QAAA;IAIxBU,EAAA,GAAAC,KAAA;MAAA,IAC1B,CAACrE,IAAA,EAAA0D,QAAA,EAAAY,UAAA,CAA2B,UAAUD,KAAA;QAAA,OACjCA,KAAA;MAAA;MAAA,OAGFA,KAAA,CAAAE,MAAA,EAAa,IAAKF,KAAA,CAAAG,KAAA,EAAY,EAAAC,WAAA,CAAc;IAAA;IACrD7F,CAAA,OAAAoB,IAAA,EAAA0D,QAAA;IAAA9E,CAAA,OAAAwF,EAAA;EAAA;IAAAA,EAAA,GAAAxF,CAAA;EAAA;EANA,MAAA8F,uBAAA,GAAgCN,EAMhC;EAEA,MAAAO,QAAA,GACE9C,YAAA,KACCpC,gBAAA,IACE,CAACA,gBAAA,KAAqBL,eAAA,KAAoBL,oBAAA,IAAwB4B,kBAAA,IAClE,CAAClB,gBAAA,IAAoBP,SAAA,KAAc,YAAYuD,qBAAqB,IACrEmC,KAAA,CAAC;IAAA/F,SAAA,EAAe,GAAAJ,SAAA,YAAwB;IAAAoG,QAAA,GACrCpF,gBAAA,KAAqBL,eAAA,IACpB0F,IAAA,CAAAhH,MAAA;MAAAiH,WAAA,EACc;MAAAjD,QAAA;MAAAkD,EAAA,EAET;MAAAC,OAAA,EAAAA,CAAA,KACYlC,oBAAA,MAAqB;MAAAmC,IAAA,EAC/B;MAAAL,QAAA,EAEJ5E,CAAA,CAAE;IAAA,C,GAGN,CAACR,gBAAA,KAAqBL,eAAA,KAAoBL,oBAAA,IAAwB4B,kBAAA,IACjEmE,IAAA,CAAAhH,MAAA;MAAAiH,WAAA,EACc;MAAAjD,QAAA;MAAAkD,EAAA,EAET;MAAAC,OAAA,EAAAA,CAAA,KACYlC,oBAAA,KAAqB;MAAAmC,IAAA,EAC/B;MAAAL,QAAA,EAEJH,uBAAA,CAAwBzE,CAAA,CAAE;IAAA,C,GAG9B,CAACR,gBAAA,IAAoBP,SAAA,KAAc,YAAYuD,qBAAA,IAC9CqC,IAAA,CAAAhH,MAAA;MAAAiH,WAAA,EACc;MAAAjD,QAAA,EACFA,QAAA,KAAalB,UAAA;MAAAoE,EAAA,EACpB;MAAAC,OAAA,EAAAA,CAAA,UACiB1C,MAAA;MAAA2C,IAAA,EACf;MAAAL,QAAA,EAEJH,uBAAA,CAAwBzE,CAAA,CAAE;IAAA,C;WAI/B;EAAA,IAAAkF,EAAA;EAAA,IAAAvG,CAAA,SAAAC,SAAA;IAGYsG,EAAA,IAAA1G,SAAA,EAAYI,SAAA,EAAAuG,MAAA,CAAA9C,OAAkB;IAAA1D,CAAA,OAAAC,SAAA;IAAAD,CAAA,OAAAuG,EAAA;EAAA;IAAAA,EAAA,GAAAvG,CAAA;EAAA;EAAA,OAA9CkG,IAAA,CAAC;IAAAjG,SAAA,EAAesG,EAA8B,CAAAE,IAAA,CAAc;IAAAR,QAAA,EAC1DD,KAAA,CAAC;MAAA/F,SAAA,EAAe,GAAAJ,SAAA,QAAoB;MAAAoG,QAAA,GAClCD,KAAA,CAAC;QAAA/F,SAAA,EAAe,GAAAJ,SAAA,UAAsB;QAAAoG,QAAA,GACpCC,IAAA,CAAC;UAAAjG,SAAA,EAAe,GAAAJ,SAAA,SAAqB;UAAAoG,QAAA,EAAG5E,CAAA,CAAE;QAAA,C,GACzC0E,QAAA;MAAA,C,GAEHC,KAAA,CAAC;QAAA/F,SAAA,EAAe,GAAAJ,SAAA,QAAoB;QAAAoG,QAAA,GACjCZ,aAAA,IACCW,KAAA,CAAApH,QAAA;UAAAqH,QAAA,GACEC,IAAA,CAAA/G,sBAAA;YAAAkB,iBAAA;YAAAC,SAAA;YAAA8B,WAAA,EAGed,cAAA,EAAAY,MAAA;YAAA3B,QAAA,EACHA,QAAA,IAAYkB,SAAA;YAAAJ;UAAA,C,GAGtB,CAAAR,gBAAA,IAAoBL,eAAc,MACjC,CAACL,oBAAA,KAAyB8C,YAAW,KACpC+C,KAAA,CAAC;YAAA/F,SAAA,EAAe,GAAAJ,SAAA,qBAAiC;YAAAoG,QAAA,GAC/CC,IAAA,CAAA5G,aAAA;cAAAoH,YAAA,EACe;cAAApE,KAAA;gBAAAC,IAAA,EAEL;gBAAAkD,KAAA,EACCpE,CAAA,CAAE;gBAAAsF,QAAA;cAAA;cAAAC,SAAA,EAGD;cAAAC,UAAA,EACC;cAAAC,gBAAA,EACM;cAAA7C,IAAA,EACZ;cAAA8C,UAAA,EACM;YAAA,C,GAEbb,IAAA,CAAA7G,oBAAA;cAAA6D,QAAA,EAAgC3C,QAAA,IAAYkB;YAAA,C;;YAKrD6D,eAAA,IACCU,KAAA,CAAC;UAAA/F,SAAA,EAAe,GAAAJ,SAAA,WAAuB;UAAAoG,QAAA,GACrCC,IAAA,CAAA9G,aAAA;YAAAkD,KAAA;cAAAC,IAAA,EAEU;cAAAyE,KAAA;gBAAA9D,QAAA;gBAAA3C,QAAA,EACuB8C;cAAA;cAAAoC,KAAA,EACtBpE,CAAA,CAAE;YAAA;YAAA4C,IAAA,EAEN;YAAA8C,UAAA,EACO,GAAG7G,cAAA;UAA6B,C,GAE9CgG,IAAA,CAAAtG,MAAA;YAAAqH,OAAA,IAAmBlG,YAAA,EAAAmG,KAAA;YAAA3G,QAAA,EAA+B6C;UAAA,C;YAGrDmC,eAAA,IACCW,IAAA,CAAA9G,aAAA;UAAAkD,KAAA;YAAAC,IAAA,EAEU;YAAAyE,KAAA;cAAA9D,QAAA;cAAA3C;YAAA;YAAAkF,KAAA,EAECpE,CAAA,CAAE;UAAA;UAAA4C,IAAA,EAEN;UAAA8C,UAAA,EACO,GAAG7G,cAAA;QAA0B,C;;;;CAOvD;AA1SqC,SAAAc,MAAAW,EAAA;EAiBC,OAAAO,MAAA,IAAAP,EAAQ;EAAA,OAAKO,MAAC,IAAUA,MAAA,EAAAnB,YAAQ,QAAiB;AAAA;AAjBlD,SAAAG,OAAAiG,OAAA;EAAA,OAkBeA,OAAO;AAAA","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["c","_c","formatAdminURL","getFieldPermissions","React","Fragment","useCallback","useEffect","useMemo","useState","toast","Button","EmailAndUsernameFields","CheckboxField","ConfirmPasswordField","PasswordField","useFormFields","useFormModified","useConfig","useDocumentInfo","useTranslation","APIKey","baseClass","Auth","props","$","className","collectionSlug","disableLocalStrategy","email","loginWithUsername","operation","readOnly","requirePassword","setValidateBeforeSubmit","useAPIKey","username","verify","changingPassword","setChangingPassword","dispatchFields","_temp","modified","i18n","t","docPermissions","isEditing","isInitializing","isTrashed","config","t0","routes","t1","api","showPasswordFields","showUnlock","hasPasswordFieldOverride","fields","hasLoginFieldOverride","permissions","passwordPermissions","field","name","type","parentName","create","update","hasEmailAndUsernameFields","requireEmail","allowEmailLogin","emailPermission","usernamePermission","enableFields","disabled","apiKeyPermissions","apiKey","canManageAPIKey","Boolean","t2","bb0","unlock","undefined","hasPermissionToUnlock","t3","changingPassword_0","errorMessage","path","valid","handleChangePassword","t4","url","apiRoute","response","fetch","body","JSON","stringify","credentials","headers","language","method","status","success","error","t5","t6","showAuthBlock","showAPIKeyBlock","showVerifyBlock","t7","label","startsWith","charAt","slice","toLowerCase","formatHeaderButtonLabel","Controls","_jsxs","children","_jsx","buttonStyle","id","onClick","size","t8","filter","join","autoComplete","required","indexPath","parentPath","parentSchemaPath","schemaPath","reveal","admin","reducer"],"sources":["../../../../src/views/Edit/Auth/index.tsx"],"sourcesContent":["'use client'\n\nimport type { SanitizedFieldPermissions } from 'payload'\n\nimport { formatAdminURL, getFieldPermissions } from 'payload/shared'\nimport React, { Fragment, useCallback, useEffect, useMemo, useState } from 'react'\nimport { toast } from 'sonner'\n\nimport type { Props } from './types.js'\n\nimport { Button } from '../../../elements/Button/index.js'\nimport { EmailAndUsernameFields } from '../../../elements/EmailAndUsername/index.js'\nimport { CheckboxField } from '../../../fields/Checkbox/index.js'\nimport { ConfirmPasswordField } from '../../../fields/ConfirmPassword/index.js'\nimport { PasswordField } from '../../../fields/Password/index.js'\nimport { useFormFields, useFormModified } from '../../../forms/Form/context.js'\nimport { useConfig } from '../../../providers/Config/index.js'\nimport { useDocumentInfo } from '../../../providers/DocumentInfo/index.js'\nimport { useTranslation } from '../../../providers/Translation/index.js'\nimport './index.css'\nimport { APIKey } from './APIKey.js'\n\nconst baseClass = 'auth-fields'\n\nexport const Auth: React.FC<Props> = (props) => {\n const {\n className,\n collectionSlug,\n disableLocalStrategy,\n email,\n loginWithUsername,\n operation,\n readOnly,\n requirePassword,\n setValidateBeforeSubmit,\n useAPIKey,\n username,\n verify,\n } = props\n\n const [changingPassword, setChangingPassword] = useState(requirePassword)\n const dispatchFields = useFormFields((reducer) => reducer[1])\n const modified = useFormModified()\n const { i18n, t } = useTranslation()\n const { docPermissions, isEditing, isInitializing, isTrashed } = useDocumentInfo()\n\n const {\n config: {\n routes: { api },\n },\n } = useConfig()\n\n let showPasswordFields: SanitizedFieldPermissions = true\n let showUnlock = true\n const hasPasswordFieldOverride =\n typeof docPermissions.fields === 'object' && 'password' in docPermissions.fields\n const hasLoginFieldOverride =\n typeof docPermissions.fields === 'object' &&\n ('username' in docPermissions.fields || 'email' in docPermissions.fields)\n\n if (hasPasswordFieldOverride) {\n const { permissions: passwordPermissions } = getFieldPermissions({\n field: { name: 'password', type: 'text' },\n operation,\n parentName: '',\n permissions: docPermissions?.fields,\n })\n\n if (operation === 'create') {\n showPasswordFields =\n passwordPermissions === true ||\n ((typeof passwordPermissions === 'object' &&\n passwordPermissions.create) as SanitizedFieldPermissions)\n } else {\n showPasswordFields =\n passwordPermissions === true ||\n ((typeof passwordPermissions === 'object' &&\n passwordPermissions.update) as SanitizedFieldPermissions)\n }\n }\n\n if (hasLoginFieldOverride) {\n const hasEmailAndUsernameFields =\n loginWithUsername && (loginWithUsername.requireEmail || loginWithUsername.allowEmailLogin)\n\n const { operation: emailPermission } = getFieldPermissions({\n field: { name: 'email', type: 'text' },\n operation: 'read',\n parentName: '',\n permissions: docPermissions?.fields,\n })\n\n const { operation: usernamePermission } = getFieldPermissions({\n field: { name: 'username', type: 'text' },\n operation: 'read',\n parentName: '',\n permissions: docPermissions?.fields,\n })\n\n if (hasEmailAndUsernameFields) {\n showUnlock = usernamePermission || emailPermission\n } else if (loginWithUsername && !hasEmailAndUsernameFields) {\n showUnlock = usernamePermission\n } else {\n showUnlock = emailPermission\n }\n }\n\n const enableFields =\n (!disableLocalStrategy ||\n (typeof disableLocalStrategy === 'object' && disableLocalStrategy.enableFields === true)) &&\n (showUnlock || showPasswordFields)\n\n const disabled = readOnly || isInitializing || isTrashed\n\n const apiKeyPermissions = docPermissions?.fields === true ? true : docPermissions?.fields?.apiKey\n const canManageAPIKey =\n apiKeyPermissions === true ||\n (typeof apiKeyPermissions === 'object' && Boolean(apiKeyPermissions?.[operation]))\n\n const hasPermissionToUnlock: boolean = useMemo(() => {\n if (docPermissions) {\n return Boolean('unlock' in docPermissions ? docPermissions.unlock : undefined)\n }\n\n return false\n }, [docPermissions])\n\n const handleChangePassword = useCallback(\n (changingPassword: boolean) => {\n if (changingPassword) {\n setValidateBeforeSubmit(true)\n\n dispatchFields({\n type: 'UPDATE',\n errorMessage: t('validation:required'),\n path: 'password',\n valid: false,\n })\n\n dispatchFields({\n type: 'UPDATE',\n errorMessage: t('validation:required'),\n path: 'confirm-password',\n valid: false,\n })\n } else {\n setValidateBeforeSubmit(false)\n dispatchFields({ type: 'REMOVE', path: 'password' })\n dispatchFields({ type: 'REMOVE', path: 'confirm-password' })\n }\n\n setChangingPassword(changingPassword)\n },\n [dispatchFields, t, setValidateBeforeSubmit],\n )\n\n const unlock = useCallback(async () => {\n const url = formatAdminURL({\n apiRoute: api,\n path: `/${collectionSlug}/unlock`,\n })\n const response = await fetch(url, {\n body:\n loginWithUsername && username ? JSON.stringify({ username }) : JSON.stringify({ email }),\n credentials: 'include',\n headers: {\n 'Accept-Language': i18n.language,\n 'Content-Type': 'application/json',\n },\n method: 'post',\n })\n\n if (response.status === 200) {\n toast.success(t('authentication:successfullyUnlocked'))\n } else {\n toast.error(t('authentication:failedToUnlock'))\n }\n }, [i18n, api, collectionSlug, email, username, t, loginWithUsername])\n\n useEffect(() => {\n if (!modified) {\n setChangingPassword(false)\n }\n }, [modified])\n\n const showAuthBlock = enableFields\n const showAPIKeyBlock = useAPIKey && canManageAPIKey\n const showVerifyBlock = verify && isEditing\n\n if (!(showAuthBlock || showAPIKeyBlock || showVerifyBlock)) {\n return null\n }\n\n const formatHeaderButtonLabel = (label: string): string => {\n if (!i18n?.language?.startsWith('en') || !label) {\n return label\n }\n\n return label.charAt(0) + label.slice(1).toLowerCase()\n }\n\n const Controls =\n enableFields &&\n (changingPassword ||\n (!changingPassword && !requirePassword && !disableLocalStrategy && showPasswordFields) ||\n (!changingPassword && operation === 'update' && hasPermissionToUnlock)) ? (\n <div className={`${baseClass}__controls`}>\n {changingPassword && !requirePassword && (\n <Button\n buttonStyle=\"secondary\"\n disabled={disabled}\n id=\"cancel-change-password\"\n onClick={() => handleChangePassword(false)}\n size=\"medium\"\n >\n {t('general:cancel')}\n </Button>\n )}\n {!changingPassword && !requirePassword && !disableLocalStrategy && showPasswordFields && (\n <Button\n buttonStyle=\"secondary\"\n disabled={disabled}\n id=\"change-password\"\n onClick={() => handleChangePassword(true)}\n size=\"medium\"\n >\n {formatHeaderButtonLabel(t('authentication:changePassword'))}\n </Button>\n )}\n {!changingPassword && operation === 'update' && hasPermissionToUnlock && (\n <Button\n buttonStyle=\"secondary\"\n disabled={disabled || !showUnlock}\n id=\"force-unlock\"\n onClick={() => void unlock()}\n size=\"medium\"\n >\n {formatHeaderButtonLabel(t('authentication:forceUnlock'))}\n </Button>\n )}\n </div>\n ) : null\n\n return (\n <div className={[baseClass, className].filter(Boolean).join(' ')}>\n <div className={`${baseClass}__card`}>\n <div className={`${baseClass}__header`}>\n <div className={`${baseClass}__title`}>{t('authentication:account')}</div>\n {Controls}\n </div>\n <div className={`${baseClass}__body`}>\n {showAuthBlock && (\n <Fragment>\n <EmailAndUsernameFields\n loginWithUsername={loginWithUsername}\n operation={operation}\n permissions={docPermissions?.fields}\n readOnly={readOnly || isTrashed}\n t={t}\n />\n {(changingPassword || requirePassword) &&\n (!disableLocalStrategy || !enableFields) && (\n <div className={`${baseClass}__changing-password`}>\n <PasswordField\n autoComplete=\"new-password\"\n field={{\n name: 'password',\n label: t('authentication:newPassword'),\n required: true,\n }}\n indexPath=\"\"\n parentPath=\"\"\n parentSchemaPath=\"\"\n path=\"password\"\n schemaPath=\"password\"\n />\n <ConfirmPasswordField disabled={readOnly || isTrashed} />\n </div>\n )}\n </Fragment>\n )}\n {showAPIKeyBlock && (\n <div className={`${baseClass}__api-key`}>\n <APIKey\n readOnly={disabled}\n reveal={typeof useAPIKey === 'object' && useAPIKey.reveal === true}\n />\n </div>\n )}\n {showVerifyBlock && (\n <CheckboxField\n field={{\n name: '_verified',\n admin: { disabled, readOnly },\n label: t('authentication:verified'),\n }}\n path=\"_verified\"\n schemaPath={`${collectionSlug}._verified`}\n />\n )}\n </div>\n </div>\n </div>\n )\n}\n"],"mappings":"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","ignoreList":[]}
@@ -9,7 +9,9 @@ export type Props = {
9
9
  readOnly: boolean;
10
10
  requirePassword?: boolean;
11
11
  setValidateBeforeSubmit: (validate: boolean) => void;
12
- useAPIKey?: boolean;
12
+ useAPIKey?: {
13
+ reveal?: boolean;
14
+ } | boolean;
13
15
  username: string;
14
16
  verify?: boolean;
15
17
  };
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/views/Edit/Auth/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAA;AAExD,MAAM,MAAM,KAAK,GAAG;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,yBAAyB,CAAC,MAAM,CAAC,CAAA;IACjD,oBAAoB,CAAC,EAAE,yBAAyB,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAA;IAChF,KAAK,EAAE,MAAM,CAAA;IACb,iBAAiB,EAAE,yBAAyB,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAA;IACzE,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAC9B,QAAQ,EAAE,OAAO,CAAA;IACjB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,uBAAuB,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAA;IACpD,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/views/Edit/Auth/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAA;AAExD,MAAM,MAAM,KAAK,GAAG;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,yBAAyB,CAAC,MAAM,CAAC,CAAA;IACjD,oBAAoB,CAAC,EAAE,yBAAyB,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAA;IAChF,KAAK,EAAE,MAAM,CAAA;IACb,iBAAiB,EAAE,yBAAyB,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAA;IACzE,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAC9B,QAAQ,EAAE,OAAO,CAAA;IACjB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,uBAAuB,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAA;IACpD,SAAS,CAAC,EACN;QACE,MAAM,CAAC,EAAE,OAAO,CAAA;KACjB,GACD,OAAO,CAAA;IACX,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../../../src/views/Edit/Auth/types.ts"],"sourcesContent":["import type { SanitizedCollectionConfig } from 'payload'\n\nexport type Props = {\n className?: string\n collectionSlug: SanitizedCollectionConfig['slug']\n disableLocalStrategy?: SanitizedCollectionConfig['auth']['disableLocalStrategy']\n email: string\n loginWithUsername: SanitizedCollectionConfig['auth']['loginWithUsername']\n operation: 'create' | 'update'\n readOnly: boolean\n requirePassword?: boolean\n setValidateBeforeSubmit: (validate: boolean) => void\n useAPIKey?: boolean\n username: string\n verify?: boolean\n}\n"],"mappings":"AAEA","ignoreList":[]}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../../../src/views/Edit/Auth/types.ts"],"sourcesContent":["import type { SanitizedCollectionConfig } from 'payload'\n\nexport type Props = {\n className?: string\n collectionSlug: SanitizedCollectionConfig['slug']\n disableLocalStrategy?: SanitizedCollectionConfig['auth']['disableLocalStrategy']\n email: string\n loginWithUsername: SanitizedCollectionConfig['auth']['loginWithUsername']\n operation: 'create' | 'update'\n readOnly: boolean\n requirePassword?: boolean\n setValidateBeforeSubmit: (validate: boolean) => void\n useAPIKey?:\n | {\n reveal?: boolean\n }\n | boolean\n username: string\n verify?: boolean\n}\n"],"mappings":"AAEA","ignoreList":[]}
@@ -16,9 +16,23 @@
16
16
  gap: var(--spacer-3);
17
17
  }
18
18
 
19
+ .forgot-password__form__actions {
20
+ display: flex;
21
+ flex-direction: column;
22
+ align-items: center;
23
+ gap: var(--spacer-2);
24
+ }
25
+
19
26
  .forgot-password__form__submit {
20
27
  display: flex;
21
28
  align-items: center;
22
29
  justify-content: center;
30
+ width: 100%;
31
+ }
32
+
33
+ .forgot-password__form__submit.btn--style-primary.btn--disabled:not(.btn--loading) {
34
+ border: var(--stroke-width-small) solid var(--color-border);
35
+ color: var(--color-text);
36
+ background-color: var(--color-bg-secondary);
23
37
  }
24
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/views/ForgotPassword/ForgotPasswordForm/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAmB,MAAM,OAAO,CAAA;AAWvC,OAAO,aAAa,CAAA;AAIpB,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAsItC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/views/ForgotPassword/ForgotPasswordForm/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAsC,MAAM,OAAO,CAAA;AAa1D,OAAO,aAAa,CAAA;AAkCpB,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAoOtC,CAAA"}
@@ -1,10 +1,11 @@
1
1
  'use client';
2
2
 
3
- import { c as _c } from "react/compiler-runtime";
4
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
5
4
  import { email, formatAdminURL, text } from 'payload/shared';
6
- import React, { useState } from 'react';
5
+ import React, { useEffect, useRef, useState } from 'react';
6
+ import { Button } from '../../../elements/Button/index.js';
7
7
  import { FormHeader } from '../../../elements/FormHeader/index.js';
8
+ import { Link } from '../../../elements/Link/index.js';
8
9
  import { EmailField } from '../../../fields/Email/index.js';
9
10
  import { TextField } from '../../../fields/Text/index.js';
10
11
  import { Form } from '../../../forms/Form/index.js';
@@ -13,181 +14,228 @@ import { useConfig } from '../../../providers/Config/index.js';
13
14
  import { useTranslation } from '../../../providers/Translation/index.js';
14
15
  import './index.css';
15
16
  const baseClass = 'forgot-password__form';
17
+ const formatResendDelay = seconds => `${Math.floor(seconds / 60)}:${String(seconds % 60).padStart(2, '0')}`;
18
+ const removeStoredRequest = sessionStorageKey => {
19
+ try {
20
+ window.sessionStorage.removeItem(sessionStorageKey);
21
+ } catch {
22
+ return;
23
+ }
24
+ };
25
+ const saveStoredRequest = ({
26
+ request,
27
+ sessionStorageKey
28
+ }) => {
29
+ try {
30
+ window.sessionStorage.setItem(sessionStorageKey, JSON.stringify(request));
31
+ } catch {
32
+ return;
33
+ }
34
+ };
16
35
  export const ForgotPasswordForm = () => {
17
- const $ = _c(17);
18
36
  const {
19
37
  config,
20
38
  getEntityConfig
21
39
  } = useConfig();
22
40
  const {
23
- admin: t0,
24
- routes: t1
41
+ admin: {
42
+ routes: {
43
+ login: loginRoute
44
+ },
45
+ user: userSlug
46
+ },
47
+ routes: {
48
+ admin: adminRoute,
49
+ api: apiRoute
50
+ }
25
51
  } = config;
26
- const {
27
- user: userSlug
28
- } = t0;
29
- const {
30
- api: apiRoute
31
- } = t1;
32
52
  const {
33
53
  t
34
54
  } = useTranslation();
35
55
  const [hasSubmitted, setHasSubmitted] = useState(false);
36
- let t2;
37
- if ($[0] !== getEntityConfig || $[1] !== userSlug) {
38
- t2 = getEntityConfig({
39
- collectionSlug: userSlug
40
- });
41
- $[0] = getEntityConfig;
42
- $[1] = userSlug;
43
- $[2] = t2;
44
- } else {
45
- t2 = $[2];
46
- }
47
- const collectionConfig = t2;
56
+ const [resendDelay, setResendDelay] = useState(0);
57
+ const [storedRequest, setStoredRequest] = useState(null);
58
+ const resendAvailableAt = useRef(0);
59
+ const submittedIdentifier = useRef(null);
60
+ const collectionConfig = getEntityConfig({
61
+ collectionSlug: userSlug
62
+ });
48
63
  const loginWithUsername = collectionConfig?.auth?.loginWithUsername;
49
- let t3;
50
- if ($[3] !== loginWithUsername || $[4] !== t) {
51
- t3 = (res, successToast, errorToast) => {
52
- res.json().then(() => {
53
- setHasSubmitted(true);
54
- successToast(t("general:submissionSuccessful"));
55
- }).catch(() => {
56
- errorToast(loginWithUsername ? t("authentication:usernameNotValid") : t("authentication:emailNotValid"));
57
- });
58
- };
59
- $[3] = loginWithUsername;
60
- $[4] = t;
61
- $[5] = t3;
62
- } else {
63
- t3 = $[5];
64
- }
65
- const handleResponse = t3;
66
- let t4;
67
- let t5;
68
- if ($[6] !== apiRoute || $[7] !== config || $[8] !== handleResponse || $[9] !== hasSubmitted || $[10] !== loginWithUsername || $[11] !== t || $[12] !== userSlug) {
69
- t5 = Symbol.for("react.early_return_sentinel");
70
- bb0: {
71
- const initialState = loginWithUsername ? {
72
- username: {
73
- initialValue: "",
74
- valid: true,
75
- value: undefined
76
- }
77
- } : {
78
- email: {
79
- initialValue: "",
80
- valid: true,
81
- value: undefined
82
- }
83
- };
84
- if (hasSubmitted) {
85
- let t6;
86
- if ($[15] !== t) {
87
- t6 = _jsx(FormHeader, {
88
- description: t("authentication:checkYourEmailForPasswordReset"),
89
- heading: t("authentication:emailSent")
90
- });
91
- $[15] = t;
92
- $[16] = t6;
93
- } else {
94
- t6 = $[16];
95
- }
96
- t5 = t6;
97
- break bb0;
64
+ const minRequestInterval = collectionConfig?.auth?.forgotPassword?.minRequestInterval ?? 15000;
65
+ const sessionStorageKey = `payload-forgot-password:${userSlug}`;
66
+ useEffect(() => {
67
+ try {
68
+ const storedValue = window.sessionStorage.getItem(sessionStorageKey);
69
+ if (!storedValue) {
70
+ return;
98
71
  }
99
- t4 = _jsxs(Form, {
100
- action: formatAdminURL({
101
- apiRoute,
102
- path: `/${userSlug}/forgot-password`
103
- }),
104
- className: baseClass,
105
- handleResponse,
106
- initialState,
107
- method: "POST",
108
- children: [_jsx(FormHeader, {
109
- description: loginWithUsername ? t("authentication:forgotPasswordUsernameInstructions") : t("authentication:forgotPasswordEmailInstructions"),
110
- heading: t("authentication:forgotPassword")
111
- }), _jsx("div", {
112
- className: `${baseClass}__inputWrap`,
113
- children: loginWithUsername ? _jsx(TextField, {
114
- field: {
115
- name: "username",
116
- label: t("authentication:username"),
117
- required: true
72
+ const parsedValue = JSON.parse(storedValue);
73
+ if (typeof parsedValue.identifier !== 'string' || typeof parsedValue.resendAvailableAt !== 'number' || parsedValue.resendAvailableAt <= Date.now()) {
74
+ removeStoredRequest(sessionStorageKey);
75
+ return;
76
+ }
77
+ submittedIdentifier.current = parsedValue.identifier;
78
+ resendAvailableAt.current = parsedValue.resendAvailableAt;
79
+ setStoredRequest(parsedValue);
80
+ setResendDelay(Math.max(0, Math.ceil((parsedValue.resendAvailableAt - Date.now()) / 1000)));
81
+ setHasSubmitted(true);
82
+ } catch {
83
+ removeStoredRequest(sessionStorageKey);
84
+ }
85
+ }, [sessionStorageKey]);
86
+ useEffect(() => {
87
+ if (resendDelay === 0) {
88
+ return;
89
+ }
90
+ const timeout = setTimeout(() => {
91
+ setResendDelay(Math.max(0, Math.ceil((resendAvailableAt.current - Date.now()) / 1000)));
92
+ }, 1050);
93
+ return () => clearTimeout(timeout);
94
+ }, [resendDelay]);
95
+ const handleResponse = (res, successToast, errorToast) => {
96
+ res.json().then(() => {
97
+ const nextResendAvailableAt = Date.now() + minRequestInterval;
98
+ const nextStoredRequest = submittedIdentifier.current ? {
99
+ identifier: submittedIdentifier.current,
100
+ resendAvailableAt: nextResendAvailableAt
101
+ } : null;
102
+ resendAvailableAt.current = nextResendAvailableAt;
103
+ setResendDelay(Math.ceil(minRequestInterval / 1000));
104
+ setStoredRequest(nextStoredRequest);
105
+ setHasSubmitted(true);
106
+ if (nextStoredRequest) {
107
+ saveStoredRequest({
108
+ request: nextStoredRequest,
109
+ sessionStorageKey
110
+ });
111
+ }
112
+ successToast(t('general:submissionSuccessful'));
113
+ }).catch(() => {
114
+ errorToast(loginWithUsername ? t('authentication:usernameNotValid') : t('authentication:emailNotValid'));
115
+ });
116
+ };
117
+ const initialState = loginWithUsername ? {
118
+ username: {
119
+ initialValue: storedRequest?.identifier ?? '',
120
+ valid: true,
121
+ value: storedRequest?.identifier
122
+ }
123
+ } : {
124
+ email: {
125
+ initialValue: storedRequest?.identifier ?? '',
126
+ valid: true,
127
+ value: storedRequest?.identifier
128
+ }
129
+ };
130
+ return /*#__PURE__*/_jsx(Form, {
131
+ action: formatAdminURL({
132
+ apiRoute,
133
+ path: `/${userSlug}/forgot-password`
134
+ }),
135
+ className: baseClass,
136
+ handleResponse: handleResponse,
137
+ initialState: initialState,
138
+ method: "POST",
139
+ onSubmit: (_, data) => {
140
+ const identifier = loginWithUsername ? data.username : data.email;
141
+ submittedIdentifier.current = typeof identifier === 'string' ? identifier : null;
142
+ },
143
+ children: hasSubmitted ? /*#__PURE__*/_jsxs(_Fragment, {
144
+ children: [/*#__PURE__*/_jsx(FormHeader, {
145
+ description: t('authentication:checkYourEmailForPasswordReset'),
146
+ heading: t('authentication:emailSent')
147
+ }), /*#__PURE__*/_jsxs("div", {
148
+ className: `${baseClass}__actions`,
149
+ children: [/*#__PURE__*/_jsx(Button, {
150
+ buttonStyle: "primary",
151
+ className: `${baseClass}__submit`,
152
+ disabled: resendDelay > 0,
153
+ type: "submit",
154
+ children: resendDelay > 0 ? `${t('authentication:resend')} (${formatResendDelay(resendDelay)})` : t('authentication:resend')
155
+ }), /*#__PURE__*/_jsx(Link, {
156
+ href: formatAdminURL({
157
+ adminRoute,
158
+ path: loginRoute
159
+ }),
160
+ prefetch: false,
161
+ children: t('authentication:backToLogin')
162
+ })]
163
+ })]
164
+ }) : /*#__PURE__*/_jsxs(_Fragment, {
165
+ children: [/*#__PURE__*/_jsx(FormHeader, {
166
+ description: loginWithUsername ? t('authentication:forgotPasswordUsernameInstructions') : t('authentication:forgotPasswordEmailInstructions'),
167
+ heading: t('authentication:forgotPassword')
168
+ }), /*#__PURE__*/_jsx("div", {
169
+ className: `${baseClass}__inputWrap`,
170
+ children: loginWithUsername ? /*#__PURE__*/_jsx(TextField, {
171
+ field: {
172
+ name: 'username',
173
+ label: t('authentication:username'),
174
+ required: true
175
+ },
176
+ path: "username",
177
+ validate: value => text(value, {
178
+ name: 'username',
179
+ type: 'text',
180
+ blockData: {},
181
+ data: {},
182
+ event: 'onChange',
183
+ path: ['username'],
184
+ preferences: {
185
+ fields: {}
118
186
  },
119
- path: "username",
120
- validate: value => text(value, {
121
- name: "username",
122
- type: "text",
123
- blockData: {},
124
- data: {},
125
- event: "onChange",
126
- path: ["username"],
127
- preferences: {
128
- fields: {}
129
- },
130
- req: {
131
- payload: {
132
- config
133
- },
134
- t
187
+ req: {
188
+ payload: {
189
+ config
135
190
  },
136
- required: true,
137
- siblingData: {}
138
- })
139
- }) : _jsx(EmailField, {
140
- field: {
141
- name: "email",
142
- admin: {
143
- autoComplete: "email"
144
- },
145
- label: t("general:email"),
146
- required: true
191
+ t
147
192
  },
148
- path: "email",
149
- validate: value_0 => email(value_0, {
150
- name: "email",
151
- type: "email",
152
- blockData: {},
153
- data: {},
154
- event: "onChange",
155
- path: ["email"],
156
- preferences: {
157
- fields: {}
158
- },
159
- req: {
160
- payload: {
161
- config
162
- },
163
- t
193
+ required: true,
194
+ siblingData: {}
195
+ })
196
+ }) : /*#__PURE__*/_jsx(EmailField, {
197
+ field: {
198
+ name: 'email',
199
+ admin: {
200
+ autoComplete: 'email'
201
+ },
202
+ label: t('general:email'),
203
+ required: true
204
+ },
205
+ path: "email",
206
+ validate: value_0 => email(value_0, {
207
+ name: 'email',
208
+ type: 'email',
209
+ blockData: {},
210
+ data: {},
211
+ event: 'onChange',
212
+ path: ['email'],
213
+ preferences: {
214
+ fields: {}
215
+ },
216
+ req: {
217
+ payload: {
218
+ config
164
219
  },
165
- required: true,
166
- siblingData: {}
167
- })
220
+ t
221
+ },
222
+ required: true,
223
+ siblingData: {}
168
224
  })
169
- }), _jsx(FormSubmit, {
170
- className: `${baseClass}__submit`,
171
- children: t("general:submit")
172
- })]
173
- });
174
- }
175
- $[6] = apiRoute;
176
- $[7] = config;
177
- $[8] = handleResponse;
178
- $[9] = hasSubmitted;
179
- $[10] = loginWithUsername;
180
- $[11] = t;
181
- $[12] = userSlug;
182
- $[13] = t4;
183
- $[14] = t5;
184
- } else {
185
- t4 = $[13];
186
- t5 = $[14];
187
- }
188
- if (t5 !== Symbol.for("react.early_return_sentinel")) {
189
- return t5;
190
- }
191
- return t4;
225
+ })
226
+ }), /*#__PURE__*/_jsx(FormSubmit, {
227
+ className: `${baseClass}__submit`,
228
+ children: t('general:submit')
229
+ }), /*#__PURE__*/_jsx(Link, {
230
+ className: "forgot-password__back",
231
+ href: formatAdminURL({
232
+ adminRoute,
233
+ path: loginRoute
234
+ }),
235
+ prefetch: false,
236
+ children: t('authentication:backToLogin')
237
+ })]
238
+ })
239
+ }, `${hasSubmitted ? 'submitted' : 'editing'}:${storedRequest?.identifier ?? ''}`);
192
240
  };
193
241
  //# sourceMappingURL=index.js.map