@strapi/admin 5.13.0-beta.1 → 5.13.1
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/admin/admin/src/features/Auth.js +2 -8
- package/dist/admin/admin/src/features/Auth.js.map +1 -1
- package/dist/admin/admin/src/features/Auth.mjs +2 -8
- package/dist/admin/admin/src/features/Auth.mjs.map +1 -1
- package/dist/admin/admin/src/features/Tracking.js.map +1 -1
- package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
- package/dist/admin/admin/src/hooks/useQueryParams.js +1 -7
- package/dist/admin/admin/src/hooks/useQueryParams.js.map +1 -1
- package/dist/admin/admin/src/hooks/useQueryParams.mjs +2 -8
- package/dist/admin/admin/src/hooks/useQueryParams.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/Register.js +1 -1
- package/dist/admin/admin/src/pages/Auth/components/Register.js.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/Register.mjs +1 -1
- package/dist/admin/admin/src/pages/Auth/components/Register.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Home/HomePage.js +4 -76
- package/dist/admin/admin/src/pages/Home/HomePage.js.map +1 -1
- package/dist/admin/admin/src/pages/Home/HomePage.mjs +5 -77
- package/dist/admin/admin/src/pages/Home/HomePage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js +29 -30
- package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs +32 -33
- package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.js +19 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.mjs +21 -3
- package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.js +4 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.mjs +4 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.js +32 -2
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.mjs +32 -2
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.js +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.mjs +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.mjs.map +1 -1
- package/dist/admin/admin/src/translations/ru.json.js +14 -1
- package/dist/admin/admin/src/translations/ru.json.js.map +1 -1
- package/dist/admin/admin/src/translations/ru.json.mjs +14 -1
- package/dist/admin/admin/src/translations/ru.json.mjs.map +1 -1
- package/dist/admin/index.js +0 -2
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +0 -1
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/src/features/Tracking.d.ts +2 -0
- package/dist/admin/src/index.d.ts +0 -1
- package/dist/admin/src/pages/Settings/components/Tokens/FormHead.d.ts +4 -1
- package/dist/server/server/src/content-types/api-token.js +7 -0
- package/dist/server/server/src/content-types/api-token.js.map +1 -1
- package/dist/server/server/src/content-types/api-token.mjs +7 -0
- package/dist/server/server/src/content-types/api-token.mjs.map +1 -1
- package/dist/server/server/src/services/api-token.js +21 -3
- package/dist/server/server/src/services/api-token.js.map +1 -1
- package/dist/server/server/src/services/api-token.mjs +21 -3
- package/dist/server/server/src/services/api-token.mjs.map +1 -1
- package/dist/server/server/src/services/encryption.js +62 -0
- package/dist/server/server/src/services/encryption.js.map +1 -0
- package/dist/server/server/src/services/encryption.mjs +60 -0
- package/dist/server/server/src/services/encryption.mjs.map +1 -0
- package/dist/server/server/src/services/index.js +3 -1
- package/dist/server/server/src/services/index.js.map +1 -1
- package/dist/server/server/src/services/index.mjs +3 -1
- package/dist/server/server/src/services/index.mjs.map +1 -1
- package/dist/server/src/content-types/api-token.d.ts +7 -0
- package/dist/server/src/content-types/api-token.d.ts.map +1 -1
- package/dist/server/src/content-types/index.d.ts +7 -0
- package/dist/server/src/content-types/index.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +11 -0
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/services/api-token.d.ts.map +1 -1
- package/dist/server/src/services/encryption.d.ts +6 -0
- package/dist/server/src/services/encryption.d.ts.map +1 -0
- package/dist/server/src/services/index.d.ts +4 -0
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/validation/project-settings.d.ts +4 -4
- package/dist/shared/contracts/api-token.d.ts +1 -0
- package/dist/shared/contracts/api-token.d.ts.map +1 -1
- package/package.json +8 -8
- package/dist/admin/admin/src/components/SubNav.js +0 -269
- package/dist/admin/admin/src/components/SubNav.js.map +0 -1
- package/dist/admin/admin/src/components/SubNav.mjs +0 -267
- package/dist/admin/admin/src/components/SubNav.mjs.map +0 -1
- package/dist/admin/admin/src/pages/Home/components/ContentManagerWidgets.js +0 -179
- package/dist/admin/admin/src/pages/Home/components/ContentManagerWidgets.js.map +0 -1
- package/dist/admin/admin/src/pages/Home/components/ContentManagerWidgets.mjs +0 -176
- package/dist/admin/admin/src/pages/Home/components/ContentManagerWidgets.mjs.map +0 -1
- package/dist/admin/admin/src/services/homepage.js +0 -28
- package/dist/admin/admin/src/services/homepage.js.map +0 -1
- package/dist/admin/admin/src/services/homepage.mjs +0 -26
- package/dist/admin/admin/src/services/homepage.mjs.map +0 -1
- package/dist/admin/src/components/SubNav.d.ts +0 -33
- package/dist/admin/src/pages/Home/components/ContentManagerWidgets.d.ts +0 -3
- package/dist/admin/src/services/homepage.d.ts +0 -5
- package/dist/server/server/src/controllers/homepage.js +0 -58
- package/dist/server/server/src/controllers/homepage.js.map +0 -1
- package/dist/server/server/src/controllers/homepage.mjs +0 -37
- package/dist/server/server/src/controllers/homepage.mjs.map +0 -1
- package/dist/server/server/src/routes/homepage.js +0 -22
- package/dist/server/server/src/routes/homepage.js.map +0 -1
- package/dist/server/server/src/routes/homepage.mjs +0 -20
- package/dist/server/server/src/routes/homepage.mjs.map +0 -1
- package/dist/server/server/src/services/homepage.js +0 -159
- package/dist/server/server/src/services/homepage.js.map +0 -1
- package/dist/server/server/src/services/homepage.mjs +0 -157
- package/dist/server/server/src/services/homepage.mjs.map +0 -1
- package/dist/server/src/controllers/homepage.d.ts +0 -8
- package/dist/server/src/controllers/homepage.d.ts.map +0 -1
- package/dist/server/src/routes/homepage.d.ts +0 -14
- package/dist/server/src/routes/homepage.d.ts.map +0 -1
- package/dist/server/src/services/homepage.d.ts +0 -14
- package/dist/server/src/services/homepage.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormHead.mjs","sources":["../../../../../../../../admin/src/pages/Settings/components/Tokens/FormHead.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Button, Dialog, Flex } from '@strapi/design-system';\nimport { Check, ArrowClockwise } from '@strapi/icons';\nimport { MessageDescriptor, useIntl } from 'react-intl';\n\nimport { ConfirmDialog } from '../../../../components/ConfirmDialog';\nimport { Layouts } from '../../../../components/Layouts/Layout';\nimport { BackButton } from '../../../../features/BackButton';\nimport { useNotification } from '../../../../features/Notifications';\nimport { useAPIErrorHandler } from '../../../../hooks/useAPIErrorHandler';\nimport { useRegenerateTokenMutation } from '../../../../services/transferTokens';\n\nimport type { Data } from '@strapi/types';\n\ninterface RegenerateProps {\n onRegenerate?: (newKey: string) => void;\n url: string;\n}\n\nconst Regenerate = ({ onRegenerate, url }: RegenerateProps) => {\n const { formatMessage } = useIntl();\n const [showConfirmDialog, setShowConfirmDialog] = React.useState(false);\n\n const [isLoadingConfirmation, setIsLoadingConfirmation] = React.useState(false);\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const [regenerateToken] = useRegenerateTokenMutation();\n\n const regenerateData = async () => {\n try {\n const res = await regenerateToken(url);\n\n if ('error' in res) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n\n return;\n }\n\n if (onRegenerate) {\n onRegenerate(res.data.accessKey);\n }\n } catch (error) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'notification.error',\n defaultMessage: 'Something went wrong',\n }),\n });\n } finally {\n setIsLoadingConfirmation(false);\n }\n };\n\n const handleConfirmRegeneration = async () => {\n regenerateData();\n setShowConfirmDialog(false);\n };\n\n return (\n <Dialog.Root open={showConfirmDialog} onOpenChange={setShowConfirmDialog}>\n <Dialog.Trigger>\n <Button\n startIcon={<ArrowClockwise />}\n type=\"button\"\n size=\"S\"\n variant=\"tertiary\"\n onClick={() => setShowConfirmDialog(true)}\n name=\"regenerate\"\n >\n {formatMessage({\n id: 'Settings.tokens.regenerate',\n defaultMessage: 'Regenerate',\n })}\n </Button>\n </Dialog.Trigger>\n\n <ConfirmDialog\n title={formatMessage({\n id: 'Settings.tokens.RegenerateDialog.title',\n defaultMessage: 'Regenerate token',\n })}\n endAction={\n <Button\n startIcon={<ArrowClockwise />}\n loading={isLoadingConfirmation}\n onClick={handleConfirmRegeneration}\n >\n {formatMessage({\n id: 'Settings.tokens.Button.regenerate',\n defaultMessage: 'Regenerate',\n })}\n </Button>\n }\n >\n {formatMessage({\n id: 'Settings.tokens.popUpWarning.message',\n defaultMessage: 'Are you sure you want to regenerate this token?',\n })}\n </ConfirmDialog>\n </Dialog.Root>\n );\n};\n\ninterface Token {\n id: Data.ID;\n name: string;\n}\n\ninterface FormHeadProps<TToken extends Token | null> {\n title: MessageDescriptor;\n token: TToken;\n canEditInputs: boolean;\n canRegenerate: boolean;\n setToken: (token: TToken) => void;\n isSubmitting: boolean;\n regenerateUrl: string;\n}\n\nexport const FormHead = <TToken extends Token | null>({\n title,\n token,\n setToken,\n canEditInputs,\n canRegenerate,\n isSubmitting,\n regenerateUrl,\n}: FormHeadProps<TToken>) => {\n const { formatMessage } = useIntl();\n const handleRegenerate = (newKey: string) => {\n setToken({\n ...token,\n accessKey: newKey,\n });\n };\n\n return (\n <Layouts.Header\n title={token?.name || formatMessage(title)}\n primaryAction={\n canEditInputs ? (\n <Flex gap={2}>\n {canRegenerate && token?.id && (\n <Regenerate\n onRegenerate={handleRegenerate}\n url={`${regenerateUrl}${token?.id ?? ''}`}\n />\n )}\n <Button\n disabled={isSubmitting}\n loading={isSubmitting}\n startIcon={<Check />}\n type=\"submit\"\n size=\"S\"\n >\n {formatMessage({\n id: 'global.save',\n defaultMessage: 'Save',\n })}\n </Button>\n </Flex>\n ) : (\n canRegenerate &&\n token?.id && (\n <Regenerate\n onRegenerate={handleRegenerate}\n url={`${regenerateUrl}${token?.id ?? ''}`}\n />\n )\n )\n }\n navigationAction={<BackButton />}\n ellipsis\n />\n );\n};\n"],"names":["Regenerate","onRegenerate","url","formatMessage","useIntl","showConfirmDialog","setShowConfirmDialog","React","useState","isLoadingConfirmation","setIsLoadingConfirmation","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","regenerateToken","useRegenerateTokenMutation","regenerateData","res","type","message","error","data","accessKey","id","defaultMessage","handleConfirmRegeneration","_jsxs","Dialog","Root","open","onOpenChange","_jsx","Trigger","Button","startIcon","ArrowClockwise","size","variant","onClick","name","ConfirmDialog","title","endAction","loading","FormHead","token","setToken","canEditInputs","canRegenerate","isSubmitting","regenerateUrl","handleRegenerate","newKey","Layouts","Header","primaryAction","Flex","gap","disabled","Check","navigationAction","BackButton","ellipsis"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FormHead.mjs","sources":["../../../../../../../../admin/src/pages/Settings/components/Tokens/FormHead.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Button, Dialog, Flex, Tooltip } from '@strapi/design-system';\nimport { Check, ArrowClockwise, Eye, EyeStriked } from '@strapi/icons';\nimport { MessageDescriptor, useIntl } from 'react-intl';\n\nimport { ConfirmDialog } from '../../../../components/ConfirmDialog';\nimport { Layouts } from '../../../../components/Layouts/Layout';\nimport { BackButton } from '../../../../features/BackButton';\nimport { useNotification } from '../../../../features/Notifications';\nimport { useAPIErrorHandler } from '../../../../hooks/useAPIErrorHandler';\nimport { useRegenerateTokenMutation } from '../../../../services/transferTokens';\n\nimport type { Data } from '@strapi/types';\n\ninterface RegenerateProps {\n onRegenerate?: (newKey: string) => void;\n url: string;\n}\n\nconst Regenerate = ({ onRegenerate, url }: RegenerateProps) => {\n const { formatMessage } = useIntl();\n const [showConfirmDialog, setShowConfirmDialog] = React.useState(false);\n\n const [isLoadingConfirmation, setIsLoadingConfirmation] = React.useState(false);\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const [regenerateToken] = useRegenerateTokenMutation();\n\n const regenerateData = async () => {\n try {\n const res = await regenerateToken(url);\n\n if ('error' in res) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n\n return;\n }\n\n if (onRegenerate) {\n onRegenerate(res.data.accessKey);\n }\n } catch (error) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'notification.error',\n defaultMessage: 'Something went wrong',\n }),\n });\n } finally {\n setIsLoadingConfirmation(false);\n }\n };\n\n const handleConfirmRegeneration = async () => {\n regenerateData();\n setShowConfirmDialog(false);\n };\n\n return (\n <Dialog.Root open={showConfirmDialog} onOpenChange={setShowConfirmDialog}>\n <Dialog.Trigger>\n <Button\n startIcon={<ArrowClockwise />}\n type=\"button\"\n size=\"S\"\n variant=\"tertiary\"\n onClick={() => setShowConfirmDialog(true)}\n name=\"regenerate\"\n >\n {formatMessage({\n id: 'Settings.tokens.regenerate',\n defaultMessage: 'Regenerate',\n })}\n </Button>\n </Dialog.Trigger>\n\n <ConfirmDialog\n title={formatMessage({\n id: 'Settings.tokens.RegenerateDialog.title',\n defaultMessage: 'Regenerate token',\n })}\n endAction={\n <Button\n startIcon={<ArrowClockwise />}\n loading={isLoadingConfirmation}\n onClick={handleConfirmRegeneration}\n >\n {formatMessage({\n id: 'Settings.tokens.Button.regenerate',\n defaultMessage: 'Regenerate',\n })}\n </Button>\n }\n >\n {formatMessage({\n id: 'Settings.tokens.popUpWarning.message',\n defaultMessage: 'Are you sure you want to regenerate this token?',\n })}\n </ConfirmDialog>\n </Dialog.Root>\n );\n};\n\ninterface Token {\n id: Data.ID;\n name: string;\n}\n\ninterface FormHeadProps<TToken extends Token | null> {\n title: MessageDescriptor;\n token: TToken;\n canEditInputs: boolean;\n canRegenerate: boolean;\n canShowToken?: boolean;\n setToken: (token: TToken) => void;\n toggleToken?: () => void;\n showToken?: boolean;\n isSubmitting: boolean;\n regenerateUrl: string;\n}\n\nexport const FormHead = <TToken extends Token | null>({\n title,\n token,\n setToken,\n toggleToken,\n showToken,\n canShowToken,\n canEditInputs,\n canRegenerate,\n isSubmitting,\n regenerateUrl,\n}: FormHeadProps<TToken>) => {\n const { formatMessage } = useIntl();\n const handleRegenerate = (newKey: string) => {\n setToken({\n ...token,\n accessKey: newKey,\n });\n toggleToken?.();\n };\n\n return (\n <Layouts.Header\n title={token?.name || formatMessage(title)}\n primaryAction={\n canEditInputs ? (\n <Flex gap={2}>\n {canRegenerate && token?.id && (\n <Regenerate\n onRegenerate={handleRegenerate}\n url={`${regenerateUrl}${token?.id ?? ''}`}\n />\n )}\n {token?.id && toggleToken && (\n <Tooltip\n label={\n !canShowToken &&\n formatMessage({\n id: 'Settings.tokens.encryptionKeyMissing',\n defaultMessage:\n 'In order to view the token, you need a valid encryption key in the admin configuration',\n })\n }\n >\n <Button\n type=\"button\"\n startIcon={showToken ? <EyeStriked /> : <Eye />}\n variant=\"secondary\"\n onClick={() => toggleToken?.()}\n disabled={!canShowToken}\n >\n {formatMessage({\n id: 'Settings.tokens.viewToken',\n defaultMessage: 'View token',\n })}\n </Button>\n </Tooltip>\n )}\n <Button\n disabled={isSubmitting}\n loading={isSubmitting}\n startIcon={<Check />}\n type=\"submit\"\n size=\"S\"\n >\n {formatMessage({\n id: 'global.save',\n defaultMessage: 'Save',\n })}\n </Button>\n </Flex>\n ) : (\n canRegenerate &&\n token?.id && (\n <Regenerate\n onRegenerate={handleRegenerate}\n url={`${regenerateUrl}${token?.id ?? ''}`}\n />\n )\n )\n }\n navigationAction={<BackButton />}\n ellipsis\n />\n );\n};\n"],"names":["Regenerate","onRegenerate","url","formatMessage","useIntl","showConfirmDialog","setShowConfirmDialog","React","useState","isLoadingConfirmation","setIsLoadingConfirmation","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","regenerateToken","useRegenerateTokenMutation","regenerateData","res","type","message","error","data","accessKey","id","defaultMessage","handleConfirmRegeneration","_jsxs","Dialog","Root","open","onOpenChange","_jsx","Trigger","Button","startIcon","ArrowClockwise","size","variant","onClick","name","ConfirmDialog","title","endAction","loading","FormHead","token","setToken","toggleToken","showToken","canShowToken","canEditInputs","canRegenerate","isSubmitting","regenerateUrl","handleRegenerate","newKey","Layouts","Header","primaryAction","Flex","gap","Tooltip","label","EyeStriked","Eye","disabled","Check","navigationAction","BackButton","ellipsis"],"mappings":"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"}
|
|
@@ -54,7 +54,10 @@ const TokenBox = ({ token, tokenType })=>{
|
|
|
54
54
|
id: 'Settings.tokens.copy.editTitle',
|
|
55
55
|
defaultMessage: 'This token isn’t accessible anymore.'
|
|
56
56
|
}),
|
|
57
|
-
subtitle: token ? formatMessage({
|
|
57
|
+
subtitle: token ? formatMessage(tokenType === 'api-token' ? {
|
|
58
|
+
id: 'Settings.tokens.copy.subtitle',
|
|
59
|
+
defaultMessage: 'Copy this token for use elsewhere'
|
|
60
|
+
} : {
|
|
58
61
|
id: 'Settings.tokens.copy.lastWarning',
|
|
59
62
|
defaultMessage: 'Make sure to copy this token, you won’t be able to see it again!'
|
|
60
63
|
}) : formatMessage({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenBox.js","sources":["../../../../../../../../admin/src/pages/Settings/components/Tokens/TokenBox.tsx"],"sourcesContent":["import { IconButton } from '@strapi/design-system';\nimport { Duplicate, Key } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { ContentBox } from '../../../../components/ContentBox';\nimport { useNotification } from '../../../../features/Notifications';\nimport { useTracking } from '../../../../features/Tracking';\nimport { useClipboard } from '../../../../hooks/useClipboard';\n\ninterface TokenBoxProps {\n token?: string;\n tokenType: 'transfer-token' | 'api-token';\n}\n\nexport const TokenBox = ({ token, tokenType }: TokenBoxProps) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { trackUsage } = useTracking();\n\n const { copy } = useClipboard();\n\n const handleClick = (token: TokenBoxProps['token']) => async () => {\n if (token) {\n const didCopy = await copy(token);\n\n if (didCopy) {\n trackUsage('didCopyTokenKey', {\n tokenType,\n });\n toggleNotification({\n type: 'success',\n message: formatMessage({ id: 'Settings.tokens.notification.copied' }),\n });\n }\n }\n };\n\n return (\n <ContentBox\n endAction={\n token && (\n <span style={{ alignSelf: 'start' }}>\n <IconButton\n label={formatMessage({\n id: 'app.component.CopyToClipboard.label',\n defaultMessage: 'Copy to clipboard',\n })}\n onClick={handleClick(token)}\n variant=\"ghost\"\n type=\"button\"\n style={{ padding: 0, height: '1.6rem' }}\n >\n <Duplicate />\n </IconButton>\n </span>\n )\n }\n title={\n token ||\n formatMessage({\n id: 'Settings.tokens.copy.editTitle',\n defaultMessage: 'This token isn’t accessible anymore.',\n })\n }\n subtitle={\n token\n ? formatMessage({\n
|
|
1
|
+
{"version":3,"file":"TokenBox.js","sources":["../../../../../../../../admin/src/pages/Settings/components/Tokens/TokenBox.tsx"],"sourcesContent":["import { IconButton } from '@strapi/design-system';\nimport { Duplicate, Key } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { ContentBox } from '../../../../components/ContentBox';\nimport { useNotification } from '../../../../features/Notifications';\nimport { useTracking } from '../../../../features/Tracking';\nimport { useClipboard } from '../../../../hooks/useClipboard';\n\ninterface TokenBoxProps {\n token?: string;\n tokenType: 'transfer-token' | 'api-token';\n}\n\nexport const TokenBox = ({ token, tokenType }: TokenBoxProps) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { trackUsage } = useTracking();\n\n const { copy } = useClipboard();\n\n const handleClick = (token: TokenBoxProps['token']) => async () => {\n if (token) {\n const didCopy = await copy(token);\n\n if (didCopy) {\n trackUsage('didCopyTokenKey', {\n tokenType,\n });\n toggleNotification({\n type: 'success',\n message: formatMessage({ id: 'Settings.tokens.notification.copied' }),\n });\n }\n }\n };\n\n return (\n <ContentBox\n endAction={\n token && (\n <span style={{ alignSelf: 'start' }}>\n <IconButton\n label={formatMessage({\n id: 'app.component.CopyToClipboard.label',\n defaultMessage: 'Copy to clipboard',\n })}\n onClick={handleClick(token)}\n variant=\"ghost\"\n type=\"button\"\n style={{ padding: 0, height: '1.6rem' }}\n >\n <Duplicate />\n </IconButton>\n </span>\n )\n }\n title={\n token ||\n formatMessage({\n id: 'Settings.tokens.copy.editTitle',\n defaultMessage: 'This token isn’t accessible anymore.',\n })\n }\n subtitle={\n token\n ? formatMessage(\n tokenType === 'api-token'\n ? {\n id: 'Settings.tokens.copy.subtitle',\n defaultMessage: 'Copy this token for use elsewhere',\n }\n : {\n id: 'Settings.tokens.copy.lastWarning',\n defaultMessage:\n 'Make sure to copy this token, you won’t be able to see it again!',\n }\n )\n : formatMessage({\n id: 'Settings.tokens.copy.editMessage',\n defaultMessage: 'For security reasons, you can only see your token once.',\n })\n }\n icon={<Key />}\n iconBackground=\"neutral100\"\n />\n );\n};\n"],"names":["TokenBox","token","tokenType","formatMessage","useIntl","toggleNotification","useNotification","trackUsage","useTracking","copy","useClipboard","handleClick","didCopy","type","message","id","_jsx","ContentBox","endAction","span","style","alignSelf","IconButton","label","defaultMessage","onClick","variant","padding","height","Duplicate","title","subtitle","icon","Key","iconBackground"],"mappings":";;;;;;;;;;;MAcaA,QAAW,GAAA,CAAC,EAAEC,KAAK,EAAEC,SAAS,EAAiB,GAAA;IAC1D,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;IAC1B,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,6BAAAA,EAAAA;IAC/B,MAAM,EAAEC,UAAU,EAAE,GAAGC,oBAAAA,EAAAA;IAEvB,MAAM,EAAEC,IAAI,EAAE,GAAGC,yBAAAA,EAAAA;IAEjB,MAAMC,WAAAA,GAAc,CAACV,KAAkC,GAAA,UAAA;AACrD,YAAA,IAAIA,KAAO,EAAA;gBACT,MAAMW,OAAAA,GAAU,MAAMH,IAAKR,CAAAA,KAAAA,CAAAA;AAE3B,gBAAA,IAAIW,OAAS,EAAA;AACXL,oBAAAA,UAAAA,CAAW,iBAAmB,EAAA;AAC5BL,wBAAAA;AACF,qBAAA,CAAA;oBACAG,kBAAmB,CAAA;wBACjBQ,IAAM,EAAA,SAAA;AACNC,wBAAAA,OAAAA,EAASX,aAAc,CAAA;4BAAEY,EAAI,EAAA;AAAsC,yBAAA;AACrE,qBAAA,CAAA;AACF;AACF;AACF,SAAA;AAEA,IAAA,qBACEC,cAACC,CAAAA,qBAAAA,EAAAA;AACCC,QAAAA,SAAAA,EACEjB,uBACEe,cAACG,CAAAA,MAAAA,EAAAA;YAAKC,KAAO,EAAA;gBAAEC,SAAW,EAAA;AAAQ,aAAA;AAChC,YAAA,QAAA,gBAAAL,cAACM,CAAAA,uBAAAA,EAAAA;AACCC,gBAAAA,KAAAA,EAAOpB,aAAc,CAAA;oBACnBY,EAAI,EAAA,qCAAA;oBACJS,cAAgB,EAAA;AAClB,iBAAA,CAAA;AACAC,gBAAAA,OAAAA,EAASd,WAAYV,CAAAA,KAAAA,CAAAA;gBACrByB,OAAQ,EAAA,OAAA;gBACRb,IAAK,EAAA,QAAA;gBACLO,KAAO,EAAA;oBAAEO,OAAS,EAAA,CAAA;oBAAGC,MAAQ,EAAA;AAAS,iBAAA;AAEtC,gBAAA,QAAA,gBAAAZ,cAACa,CAAAA,eAAAA,EAAAA,EAAAA;;;AAKTC,QAAAA,KAAAA,EACE7B,SACAE,aAAc,CAAA;YACZY,EAAI,EAAA,gCAAA;YACJS,cAAgB,EAAA;AAClB,SAAA,CAAA;QAEFO,QACE9B,EAAAA,KAAAA,GACIE,aACED,CAAAA,SAAAA,KAAc,WACV,GAAA;YACEa,EAAI,EAAA,+BAAA;YACJS,cAAgB,EAAA;SAElB,GAAA;YACET,EAAI,EAAA,kCAAA;YACJS,cACE,EAAA;AACJ,SAAA,CAAA,GAENrB,aAAc,CAAA;YACZY,EAAI,EAAA,kCAAA;YACJS,cAAgB,EAAA;AAClB,SAAA,CAAA;AAENQ,QAAAA,IAAAA,gBAAMhB,cAACiB,CAAAA,SAAAA,EAAAA,EAAAA,CAAAA;QACPC,cAAe,EAAA;;AAGrB;;;;"}
|
|
@@ -52,7 +52,10 @@ const TokenBox = ({ token, tokenType })=>{
|
|
|
52
52
|
id: 'Settings.tokens.copy.editTitle',
|
|
53
53
|
defaultMessage: 'This token isn’t accessible anymore.'
|
|
54
54
|
}),
|
|
55
|
-
subtitle: token ? formatMessage({
|
|
55
|
+
subtitle: token ? formatMessage(tokenType === 'api-token' ? {
|
|
56
|
+
id: 'Settings.tokens.copy.subtitle',
|
|
57
|
+
defaultMessage: 'Copy this token for use elsewhere'
|
|
58
|
+
} : {
|
|
56
59
|
id: 'Settings.tokens.copy.lastWarning',
|
|
57
60
|
defaultMessage: 'Make sure to copy this token, you won’t be able to see it again!'
|
|
58
61
|
}) : formatMessage({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenBox.mjs","sources":["../../../../../../../../admin/src/pages/Settings/components/Tokens/TokenBox.tsx"],"sourcesContent":["import { IconButton } from '@strapi/design-system';\nimport { Duplicate, Key } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { ContentBox } from '../../../../components/ContentBox';\nimport { useNotification } from '../../../../features/Notifications';\nimport { useTracking } from '../../../../features/Tracking';\nimport { useClipboard } from '../../../../hooks/useClipboard';\n\ninterface TokenBoxProps {\n token?: string;\n tokenType: 'transfer-token' | 'api-token';\n}\n\nexport const TokenBox = ({ token, tokenType }: TokenBoxProps) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { trackUsage } = useTracking();\n\n const { copy } = useClipboard();\n\n const handleClick = (token: TokenBoxProps['token']) => async () => {\n if (token) {\n const didCopy = await copy(token);\n\n if (didCopy) {\n trackUsage('didCopyTokenKey', {\n tokenType,\n });\n toggleNotification({\n type: 'success',\n message: formatMessage({ id: 'Settings.tokens.notification.copied' }),\n });\n }\n }\n };\n\n return (\n <ContentBox\n endAction={\n token && (\n <span style={{ alignSelf: 'start' }}>\n <IconButton\n label={formatMessage({\n id: 'app.component.CopyToClipboard.label',\n defaultMessage: 'Copy to clipboard',\n })}\n onClick={handleClick(token)}\n variant=\"ghost\"\n type=\"button\"\n style={{ padding: 0, height: '1.6rem' }}\n >\n <Duplicate />\n </IconButton>\n </span>\n )\n }\n title={\n token ||\n formatMessage({\n id: 'Settings.tokens.copy.editTitle',\n defaultMessage: 'This token isn’t accessible anymore.',\n })\n }\n subtitle={\n token\n ? formatMessage({\n
|
|
1
|
+
{"version":3,"file":"TokenBox.mjs","sources":["../../../../../../../../admin/src/pages/Settings/components/Tokens/TokenBox.tsx"],"sourcesContent":["import { IconButton } from '@strapi/design-system';\nimport { Duplicate, Key } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { ContentBox } from '../../../../components/ContentBox';\nimport { useNotification } from '../../../../features/Notifications';\nimport { useTracking } from '../../../../features/Tracking';\nimport { useClipboard } from '../../../../hooks/useClipboard';\n\ninterface TokenBoxProps {\n token?: string;\n tokenType: 'transfer-token' | 'api-token';\n}\n\nexport const TokenBox = ({ token, tokenType }: TokenBoxProps) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { trackUsage } = useTracking();\n\n const { copy } = useClipboard();\n\n const handleClick = (token: TokenBoxProps['token']) => async () => {\n if (token) {\n const didCopy = await copy(token);\n\n if (didCopy) {\n trackUsage('didCopyTokenKey', {\n tokenType,\n });\n toggleNotification({\n type: 'success',\n message: formatMessage({ id: 'Settings.tokens.notification.copied' }),\n });\n }\n }\n };\n\n return (\n <ContentBox\n endAction={\n token && (\n <span style={{ alignSelf: 'start' }}>\n <IconButton\n label={formatMessage({\n id: 'app.component.CopyToClipboard.label',\n defaultMessage: 'Copy to clipboard',\n })}\n onClick={handleClick(token)}\n variant=\"ghost\"\n type=\"button\"\n style={{ padding: 0, height: '1.6rem' }}\n >\n <Duplicate />\n </IconButton>\n </span>\n )\n }\n title={\n token ||\n formatMessage({\n id: 'Settings.tokens.copy.editTitle',\n defaultMessage: 'This token isn’t accessible anymore.',\n })\n }\n subtitle={\n token\n ? formatMessage(\n tokenType === 'api-token'\n ? {\n id: 'Settings.tokens.copy.subtitle',\n defaultMessage: 'Copy this token for use elsewhere',\n }\n : {\n id: 'Settings.tokens.copy.lastWarning',\n defaultMessage:\n 'Make sure to copy this token, you won’t be able to see it again!',\n }\n )\n : formatMessage({\n id: 'Settings.tokens.copy.editMessage',\n defaultMessage: 'For security reasons, you can only see your token once.',\n })\n }\n icon={<Key />}\n iconBackground=\"neutral100\"\n />\n );\n};\n"],"names":["TokenBox","token","tokenType","formatMessage","useIntl","toggleNotification","useNotification","trackUsage","useTracking","copy","useClipboard","handleClick","didCopy","type","message","id","_jsx","ContentBox","endAction","span","style","alignSelf","IconButton","label","defaultMessage","onClick","variant","padding","height","Duplicate","title","subtitle","icon","Key","iconBackground"],"mappings":";;;;;;;;;MAcaA,QAAW,GAAA,CAAC,EAAEC,KAAK,EAAEC,SAAS,EAAiB,GAAA;IAC1D,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,eAAAA,EAAAA;IAC/B,MAAM,EAAEC,UAAU,EAAE,GAAGC,WAAAA,EAAAA;IAEvB,MAAM,EAAEC,IAAI,EAAE,GAAGC,YAAAA,EAAAA;IAEjB,MAAMC,WAAAA,GAAc,CAACV,KAAkC,GAAA,UAAA;AACrD,YAAA,IAAIA,KAAO,EAAA;gBACT,MAAMW,OAAAA,GAAU,MAAMH,IAAKR,CAAAA,KAAAA,CAAAA;AAE3B,gBAAA,IAAIW,OAAS,EAAA;AACXL,oBAAAA,UAAAA,CAAW,iBAAmB,EAAA;AAC5BL,wBAAAA;AACF,qBAAA,CAAA;oBACAG,kBAAmB,CAAA;wBACjBQ,IAAM,EAAA,SAAA;AACNC,wBAAAA,OAAAA,EAASX,aAAc,CAAA;4BAAEY,EAAI,EAAA;AAAsC,yBAAA;AACrE,qBAAA,CAAA;AACF;AACF;AACF,SAAA;AAEA,IAAA,qBACEC,GAACC,CAAAA,UAAAA,EAAAA;AACCC,QAAAA,SAAAA,EACEjB,uBACEe,GAACG,CAAAA,MAAAA,EAAAA;YAAKC,KAAO,EAAA;gBAAEC,SAAW,EAAA;AAAQ,aAAA;AAChC,YAAA,QAAA,gBAAAL,GAACM,CAAAA,UAAAA,EAAAA;AACCC,gBAAAA,KAAAA,EAAOpB,aAAc,CAAA;oBACnBY,EAAI,EAAA,qCAAA;oBACJS,cAAgB,EAAA;AAClB,iBAAA,CAAA;AACAC,gBAAAA,OAAAA,EAASd,WAAYV,CAAAA,KAAAA,CAAAA;gBACrByB,OAAQ,EAAA,OAAA;gBACRb,IAAK,EAAA,QAAA;gBACLO,KAAO,EAAA;oBAAEO,OAAS,EAAA,CAAA;oBAAGC,MAAQ,EAAA;AAAS,iBAAA;AAEtC,gBAAA,QAAA,gBAAAZ,GAACa,CAAAA,SAAAA,EAAAA,EAAAA;;;AAKTC,QAAAA,KAAAA,EACE7B,SACAE,aAAc,CAAA;YACZY,EAAI,EAAA,gCAAA;YACJS,cAAgB,EAAA;AAClB,SAAA,CAAA;QAEFO,QACE9B,EAAAA,KAAAA,GACIE,aACED,CAAAA,SAAAA,KAAc,WACV,GAAA;YACEa,EAAI,EAAA,+BAAA;YACJS,cAAgB,EAAA;SAElB,GAAA;YACET,EAAI,EAAA,kCAAA;YACJS,cACE,EAAA;AACJ,SAAA,CAAA,GAENrB,aAAc,CAAA;YACZY,EAAI,EAAA,kCAAA;YACJS,cAAgB,EAAA;AAClB,SAAA,CAAA;AAENQ,QAAAA,IAAAA,gBAAMhB,GAACiB,CAAAA,GAAAA,EAAAA,EAAAA,CAAAA;QACPC,cAAe,EAAA;;AAGrB;;;;"}
|
|
@@ -56,6 +56,8 @@ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
|
56
56
|
const [apiToken, setApiToken] = React__namespace.useState(locationState?.apiToken?.accessKey ? {
|
|
57
57
|
...locationState.apiToken
|
|
58
58
|
} : null);
|
|
59
|
+
const [showToken, setShowToken] = React__namespace.useState(Boolean(locationState?.apiToken?.accessKey));
|
|
60
|
+
const hideTimerRef = React__namespace.useRef(null);
|
|
59
61
|
const { trackUsage } = Tracking.useTracking();
|
|
60
62
|
const setCurrentStep = Provider.useGuidedTour('EditView', (state)=>state.setCurrentStep);
|
|
61
63
|
const { allowedActions: { canCreate, canUpdate, canRegenerate } } = useRBAC.useRBAC(permissions.settings?.['api-tokens']);
|
|
@@ -182,6 +184,23 @@ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
|
182
184
|
}, [
|
|
183
185
|
data
|
|
184
186
|
]);
|
|
187
|
+
React__namespace.useEffect(()=>{
|
|
188
|
+
// Only set up timer when token is shown
|
|
189
|
+
if (showToken) {
|
|
190
|
+
hideTimerRef.current = setTimeout(()=>{
|
|
191
|
+
setShowToken(false);
|
|
192
|
+
}, 30000); // 30 seconds
|
|
193
|
+
// Cleanup on unmount or when showToken changes
|
|
194
|
+
return ()=>{
|
|
195
|
+
if (hideTimerRef.current) {
|
|
196
|
+
clearTimeout(hideTimerRef.current);
|
|
197
|
+
hideTimerRef.current = null;
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
}, [
|
|
202
|
+
showToken
|
|
203
|
+
]);
|
|
185
204
|
const [createToken] = apiTokens.useCreateAPITokenMutation();
|
|
186
205
|
const [updateToken] = apiTokens.useUpdateAPITokenMutation();
|
|
187
206
|
const handleSubmit = async (body, formik)=>{
|
|
@@ -287,6 +306,13 @@ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
|
287
306
|
value
|
|
288
307
|
});
|
|
289
308
|
};
|
|
309
|
+
const toggleToken = ()=>{
|
|
310
|
+
setShowToken((prev)=>!prev);
|
|
311
|
+
if (hideTimerRef.current) {
|
|
312
|
+
clearTimeout(hideTimerRef.current);
|
|
313
|
+
hideTimerRef.current = null;
|
|
314
|
+
}
|
|
315
|
+
};
|
|
290
316
|
const providerValue = {
|
|
291
317
|
...state,
|
|
292
318
|
onChange: handleChangeCheckbox,
|
|
@@ -294,6 +320,7 @@ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
|
294
320
|
setSelectedAction
|
|
295
321
|
};
|
|
296
322
|
const canEditInputs = canUpdate && !isCreating || canCreate && isCreating;
|
|
323
|
+
const canShowToken = !!apiToken?.accessKey;
|
|
297
324
|
if (isLoading) {
|
|
298
325
|
return /*#__PURE__*/ jsxRuntime.jsx(PageHelpers.Page.Loading, {});
|
|
299
326
|
}
|
|
@@ -333,8 +360,11 @@ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
|
333
360
|
},
|
|
334
361
|
token: apiToken,
|
|
335
362
|
setToken: setApiToken,
|
|
363
|
+
toggleToken: toggleToken,
|
|
364
|
+
showToken: showToken,
|
|
336
365
|
canEditInputs: canEditInputs,
|
|
337
366
|
canRegenerate: canRegenerate,
|
|
367
|
+
canShowToken: canShowToken,
|
|
338
368
|
isSubmitting: isSubmitting,
|
|
339
369
|
regenerateUrl: "/admin/api-tokens/"
|
|
340
370
|
}),
|
|
@@ -344,8 +374,8 @@ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
|
344
374
|
alignItems: "stretch",
|
|
345
375
|
gap: 6,
|
|
346
376
|
children: [
|
|
347
|
-
|
|
348
|
-
token: apiToken
|
|
377
|
+
apiToken?.accessKey && showToken && /*#__PURE__*/ jsxRuntime.jsx(TokenBox.TokenBox, {
|
|
378
|
+
token: apiToken.accessKey,
|
|
349
379
|
tokenType: constants.API_TOKEN_TYPE
|
|
350
380
|
}),
|
|
351
381
|
/*#__PURE__*/ jsxRuntime.jsx(FormApiTokenContainer.FormApiTokenContainer, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditViewPage.js","sources":["../../../../../../../../../admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Flex } from '@strapi/design-system';\nimport { Formik, Form, FormikHelpers } from 'formik';\nimport { useIntl } from 'react-intl';\nimport { useLocation, useMatch, useNavigate } from 'react-router-dom';\n\nimport { useGuidedTour } from '../../../../../components/GuidedTour/Provider';\nimport { Layouts } from '../../../../../components/Layouts/Layout';\nimport { Page } from '../../../../../components/PageHelpers';\nimport { useTypedSelector } from '../../../../../core/store/hooks';\nimport { useNotification } from '../../../../../features/Notifications';\nimport { useTracking } from '../../../../../features/Tracking';\nimport { useAPIErrorHandler } from '../../../../../hooks/useAPIErrorHandler';\nimport { useRBAC } from '../../../../../hooks/useRBAC';\nimport {\n useCreateAPITokenMutation,\n useGetAPITokenQuery,\n useUpdateAPITokenMutation,\n} from '../../../../../services/apiTokens';\nimport { useGetPermissionsQuery, useGetRoutesQuery } from '../../../../../services/contentApi';\nimport { isBaseQueryError } from '../../../../../utils/baseQuery';\nimport { API_TOKEN_TYPE } from '../../../components/Tokens/constants';\nimport { FormHead } from '../../../components/Tokens/FormHead';\nimport { TokenBox } from '../../../components/Tokens/TokenBox';\n\nimport {\n ApiTokenPermissionsContextValue,\n ApiTokenPermissionsProvider,\n} from './apiTokenPermissions';\nimport { FormApiTokenContainer } from './components/FormApiTokenContainer';\nimport { Permissions } from './components/Permissions';\nimport { schema } from './constants';\nimport { initialState, reducer } from './reducer';\n\nimport type { Get, ApiToken } from '../../../../../../../shared/contracts/api-token';\n\n/**\n * TODO: this could definitely be refactored to avoid using redux and instead just use the\n * server response as the source of the truth for the data.\n */\nexport const EditView = () => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { state: locationState } = useLocation();\n const permissions = useTypedSelector((state) => state.admin_app.permissions);\n const [apiToken, setApiToken] = React.useState<ApiToken | null>(\n locationState?.apiToken?.accessKey\n ? {\n ...locationState.apiToken,\n }\n : null\n );\n const { trackUsage } = useTracking();\n const setCurrentStep = useGuidedTour('EditView', (state) => state.setCurrentStep);\n const {\n allowedActions: { canCreate, canUpdate, canRegenerate },\n } = useRBAC(permissions.settings?.['api-tokens']);\n const [state, dispatch] = React.useReducer(reducer, initialState);\n const match = useMatch('/settings/api-tokens/:id');\n const id = match?.params?.id;\n const isCreating = id === 'create';\n const {\n _unstableFormatAPIError: formatAPIError,\n _unstableFormatValidationErrors: formatValidtionErrors,\n } = useAPIErrorHandler();\n\n const navigate = useNavigate();\n\n const contentAPIPermissionsQuery = useGetPermissionsQuery();\n const contentAPIRoutesQuery = useGetRoutesQuery();\n\n /**\n * Separate effects otherwise we could end\n * up duplicating the same notification.\n */\n React.useEffect(() => {\n if (contentAPIPermissionsQuery.error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(contentAPIPermissionsQuery.error),\n });\n }\n }, [contentAPIPermissionsQuery.error, formatAPIError, toggleNotification]);\n\n React.useEffect(() => {\n if (contentAPIRoutesQuery.error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(contentAPIRoutesQuery.error),\n });\n }\n }, [contentAPIRoutesQuery.error, formatAPIError, toggleNotification]);\n\n React.useEffect(() => {\n if (contentAPIPermissionsQuery.data) {\n dispatch({\n type: 'UPDATE_PERMISSIONS_LAYOUT',\n value: contentAPIPermissionsQuery.data,\n });\n }\n }, [contentAPIPermissionsQuery.data]);\n\n React.useEffect(() => {\n if (contentAPIRoutesQuery.data) {\n dispatch({\n type: 'UPDATE_ROUTES',\n value: contentAPIRoutesQuery.data,\n });\n }\n }, [contentAPIRoutesQuery.data]);\n\n React.useEffect(() => {\n if (apiToken) {\n if (apiToken.type === 'read-only') {\n dispatch({\n type: 'ON_CHANGE_READ_ONLY',\n });\n }\n if (apiToken.type === 'full-access') {\n dispatch({\n type: 'SELECT_ALL_ACTIONS',\n });\n }\n if (apiToken.type === 'custom') {\n dispatch({\n type: 'UPDATE_PERMISSIONS',\n value: apiToken?.permissions,\n });\n }\n }\n }, [apiToken]);\n\n React.useEffect(() => {\n trackUsage(isCreating ? 'didAddTokenFromList' : 'didEditTokenFromList', {\n tokenType: API_TOKEN_TYPE,\n });\n }, [isCreating, trackUsage]);\n\n const { data, error, isLoading } = useGetAPITokenQuery(id!, {\n skip: !id || isCreating || !!apiToken,\n });\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n React.useEffect(() => {\n if (data) {\n setApiToken(data);\n\n if (data.type === 'read-only') {\n dispatch({\n type: 'ON_CHANGE_READ_ONLY',\n });\n }\n if (data.type === 'full-access') {\n dispatch({\n type: 'SELECT_ALL_ACTIONS',\n });\n }\n if (data.type === 'custom') {\n dispatch({\n type: 'UPDATE_PERMISSIONS',\n value: data?.permissions,\n });\n }\n }\n }, [data]);\n\n const [createToken] = useCreateAPITokenMutation();\n const [updateToken] = useUpdateAPITokenMutation();\n\n interface FormValues extends Pick<Get.Response['data'], 'name' | 'description'> {\n lifespan: Get.Response['data']['lifespan'] | undefined;\n type: Get.Response['data']['type'] | undefined;\n }\n\n const handleSubmit = async (body: FormValues, formik: FormikHelpers<FormValues>) => {\n trackUsage(isCreating ? 'willCreateToken' : 'willEditToken', {\n tokenType: API_TOKEN_TYPE,\n });\n\n try {\n if (isCreating) {\n const res = await createToken({\n ...body,\n // lifespan must be \"null\" for unlimited (0 would mean instantly expired and isn't accepted)\n lifespan:\n body?.lifespan && body.lifespan !== '0' ? parseInt(body.lifespan.toString(), 10) : null,\n permissions: body.type === 'custom' ? state.selectedActions : null,\n });\n\n if ('error' in res) {\n if (isBaseQueryError(res.error) && res.error.name === 'ValidationError') {\n formik.setErrors(formatValidtionErrors(res.error));\n } else {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n }\n\n return;\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'notification.success.apitokencreated',\n defaultMessage: 'API Token successfully created',\n }),\n });\n\n trackUsage('didCreateToken', {\n type: res.data.type,\n tokenType: API_TOKEN_TYPE,\n });\n\n navigate(`../api-tokens/${res.data.id.toString()}`, {\n state: { apiToken: res.data },\n replace: true,\n });\n setCurrentStep('apiTokens.success');\n } else {\n const res = await updateToken({\n id: id!,\n name: body.name,\n description: body.description,\n type: body.type,\n permissions: body.type === 'custom' ? state.selectedActions : null,\n });\n\n if ('error' in res) {\n if (isBaseQueryError(res.error) && res.error.name === 'ValidationError') {\n formik.setErrors(formatValidtionErrors(res.error));\n } else {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n }\n\n return;\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'notification.success.apitokenedited',\n defaultMessage: 'API Token successfully edited',\n }),\n });\n\n trackUsage('didEditToken', {\n type: res.data.type,\n tokenType: API_TOKEN_TYPE,\n });\n }\n } catch {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'notification.error',\n defaultMessage: 'Something went wrong',\n }),\n });\n }\n };\n\n const [hasChangedPermissions, setHasChangedPermissions] = React.useState(false);\n\n const handleChangeCheckbox = ({\n target: { value },\n }: Parameters<ApiTokenPermissionsContextValue['value']['onChange']>[0]) => {\n setHasChangedPermissions(true);\n dispatch({\n type: 'ON_CHANGE',\n value,\n });\n };\n\n const handleChangeSelectAllCheckbox = ({\n target: { value },\n }: Parameters<ApiTokenPermissionsContextValue['value']['onChangeSelectAll']>[0]) => {\n setHasChangedPermissions(true);\n dispatch({\n type: 'SELECT_ALL_IN_PERMISSION',\n value,\n });\n };\n\n const setSelectedAction = ({\n target: { value },\n }: Parameters<ApiTokenPermissionsContextValue['value']['setSelectedAction']>[0]) => {\n dispatch({\n type: 'SET_SELECTED_ACTION',\n value,\n });\n };\n\n const providerValue = {\n ...state,\n onChange: handleChangeCheckbox,\n onChangeSelectAll: handleChangeSelectAllCheckbox,\n setSelectedAction,\n };\n\n const canEditInputs = (canUpdate && !isCreating) || (canCreate && isCreating);\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n return (\n <ApiTokenPermissionsProvider value={providerValue}>\n <Page.Main>\n <Page.Title>\n {formatMessage(\n { id: 'Settings.PageTitle', defaultMessage: 'Settings - {name}' },\n { name: 'API Tokens' }\n )}\n </Page.Title>\n <Formik\n validationSchema={schema}\n validateOnChange={false}\n initialValues={{\n name: apiToken?.name || '',\n description: apiToken?.description || '',\n type: apiToken?.type,\n lifespan: apiToken?.lifespan,\n }}\n enableReinitialize\n onSubmit={(body, actions) => handleSubmit(body, actions)}\n >\n {({ errors, handleChange, isSubmitting, values, setFieldValue }) => {\n if (hasChangedPermissions && values?.type !== 'custom') {\n setFieldValue('type', 'custom');\n }\n\n return (\n <Form>\n <FormHead\n title={{\n id: 'Settings.apiTokens.createPage.title',\n defaultMessage: 'Create API Token',\n }}\n token={apiToken}\n setToken={setApiToken}\n canEditInputs={canEditInputs}\n canRegenerate={canRegenerate}\n isSubmitting={isSubmitting}\n regenerateUrl=\"/admin/api-tokens/\"\n />\n\n <Layouts.Content>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {Boolean(apiToken?.name) && (\n <TokenBox token={apiToken?.accessKey} tokenType={API_TOKEN_TYPE} />\n )}\n <FormApiTokenContainer\n errors={errors}\n onChange={handleChange}\n canEditInputs={canEditInputs}\n isCreating={isCreating}\n values={values}\n apiToken={apiToken}\n onDispatch={dispatch}\n setHasChangedPermissions={setHasChangedPermissions}\n />\n <Permissions\n disabled={\n !canEditInputs ||\n values?.type === 'read-only' ||\n values?.type === 'full-access'\n }\n />\n </Flex>\n </Layouts.Content>\n </Form>\n );\n }}\n </Formik>\n </Page.Main>\n </ApiTokenPermissionsProvider>\n );\n};\n\nexport const ProtectedEditView = () => {\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions.settings?.['api-tokens'].read\n );\n\n return (\n <Page.Protect permissions={permissions}>\n <EditView />\n </Page.Protect>\n );\n};\n"],"names":["EditView","formatMessage","useIntl","toggleNotification","useNotification","state","locationState","useLocation","permissions","useTypedSelector","admin_app","apiToken","setApiToken","React","useState","accessKey","trackUsage","useTracking","setCurrentStep","useGuidedTour","allowedActions","canCreate","canUpdate","canRegenerate","useRBAC","settings","dispatch","useReducer","reducer","initialState","match","useMatch","id","params","isCreating","_unstableFormatAPIError","formatAPIError","_unstableFormatValidationErrors","formatValidtionErrors","useAPIErrorHandler","navigate","useNavigate","contentAPIPermissionsQuery","useGetPermissionsQuery","contentAPIRoutesQuery","useGetRoutesQuery","useEffect","error","type","message","data","value","tokenType","API_TOKEN_TYPE","isLoading","useGetAPITokenQuery","skip","createToken","useCreateAPITokenMutation","updateToken","useUpdateAPITokenMutation","handleSubmit","body","formik","res","lifespan","parseInt","toString","selectedActions","isBaseQueryError","name","setErrors","defaultMessage","replace","description","hasChangedPermissions","setHasChangedPermissions","handleChangeCheckbox","target","handleChangeSelectAllCheckbox","setSelectedAction","providerValue","onChange","onChangeSelectAll","canEditInputs","_jsx","Page","Loading","ApiTokenPermissionsProvider","_jsxs","Main","Title","Formik","validationSchema","schema","validateOnChange","initialValues","enableReinitialize","onSubmit","actions","errors","handleChange","isSubmitting","values","setFieldValue","Form","FormHead","title","token","setToken","regenerateUrl","Layouts","Content","Flex","direction","alignItems","gap","Boolean","TokenBox","FormApiTokenContainer","onDispatch","Permissions","disabled","ProtectedEditView","read","Protect"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EditViewPage.js","sources":["../../../../../../../../../admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Flex } from '@strapi/design-system';\nimport { Formik, Form, FormikHelpers } from 'formik';\nimport { useIntl } from 'react-intl';\nimport { useLocation, useMatch, useNavigate } from 'react-router-dom';\n\nimport { useGuidedTour } from '../../../../../components/GuidedTour/Provider';\nimport { Layouts } from '../../../../../components/Layouts/Layout';\nimport { Page } from '../../../../../components/PageHelpers';\nimport { useTypedSelector } from '../../../../../core/store/hooks';\nimport { useNotification } from '../../../../../features/Notifications';\nimport { useTracking } from '../../../../../features/Tracking';\nimport { useAPIErrorHandler } from '../../../../../hooks/useAPIErrorHandler';\nimport { useRBAC } from '../../../../../hooks/useRBAC';\nimport {\n useCreateAPITokenMutation,\n useGetAPITokenQuery,\n useUpdateAPITokenMutation,\n} from '../../../../../services/apiTokens';\nimport { useGetPermissionsQuery, useGetRoutesQuery } from '../../../../../services/contentApi';\nimport { isBaseQueryError } from '../../../../../utils/baseQuery';\nimport { API_TOKEN_TYPE } from '../../../components/Tokens/constants';\nimport { FormHead } from '../../../components/Tokens/FormHead';\nimport { TokenBox } from '../../../components/Tokens/TokenBox';\n\nimport {\n ApiTokenPermissionsContextValue,\n ApiTokenPermissionsProvider,\n} from './apiTokenPermissions';\nimport { FormApiTokenContainer } from './components/FormApiTokenContainer';\nimport { Permissions } from './components/Permissions';\nimport { schema } from './constants';\nimport { initialState, reducer } from './reducer';\n\nimport type { Get, ApiToken } from '../../../../../../../shared/contracts/api-token';\n\n/**\n * TODO: this could definitely be refactored to avoid using redux and instead just use the\n * server response as the source of the truth for the data.\n */\nexport const EditView = () => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { state: locationState } = useLocation();\n const permissions = useTypedSelector((state) => state.admin_app.permissions);\n const [apiToken, setApiToken] = React.useState<ApiToken | null>(\n locationState?.apiToken?.accessKey\n ? {\n ...locationState.apiToken,\n }\n : null\n );\n const [showToken, setShowToken] = React.useState(Boolean(locationState?.apiToken?.accessKey));\n const hideTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n const { trackUsage } = useTracking();\n const setCurrentStep = useGuidedTour('EditView', (state) => state.setCurrentStep);\n const {\n allowedActions: { canCreate, canUpdate, canRegenerate },\n } = useRBAC(permissions.settings?.['api-tokens']);\n const [state, dispatch] = React.useReducer(reducer, initialState);\n const match = useMatch('/settings/api-tokens/:id');\n const id = match?.params?.id;\n const isCreating = id === 'create';\n const {\n _unstableFormatAPIError: formatAPIError,\n _unstableFormatValidationErrors: formatValidtionErrors,\n } = useAPIErrorHandler();\n\n const navigate = useNavigate();\n\n const contentAPIPermissionsQuery = useGetPermissionsQuery();\n const contentAPIRoutesQuery = useGetRoutesQuery();\n /**\n * Separate effects otherwise we could end\n * up duplicating the same notification.\n */\n React.useEffect(() => {\n if (contentAPIPermissionsQuery.error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(contentAPIPermissionsQuery.error),\n });\n }\n }, [contentAPIPermissionsQuery.error, formatAPIError, toggleNotification]);\n\n React.useEffect(() => {\n if (contentAPIRoutesQuery.error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(contentAPIRoutesQuery.error),\n });\n }\n }, [contentAPIRoutesQuery.error, formatAPIError, toggleNotification]);\n\n React.useEffect(() => {\n if (contentAPIPermissionsQuery.data) {\n dispatch({\n type: 'UPDATE_PERMISSIONS_LAYOUT',\n value: contentAPIPermissionsQuery.data,\n });\n }\n }, [contentAPIPermissionsQuery.data]);\n\n React.useEffect(() => {\n if (contentAPIRoutesQuery.data) {\n dispatch({\n type: 'UPDATE_ROUTES',\n value: contentAPIRoutesQuery.data,\n });\n }\n }, [contentAPIRoutesQuery.data]);\n\n React.useEffect(() => {\n if (apiToken) {\n if (apiToken.type === 'read-only') {\n dispatch({\n type: 'ON_CHANGE_READ_ONLY',\n });\n }\n if (apiToken.type === 'full-access') {\n dispatch({\n type: 'SELECT_ALL_ACTIONS',\n });\n }\n if (apiToken.type === 'custom') {\n dispatch({\n type: 'UPDATE_PERMISSIONS',\n value: apiToken?.permissions,\n });\n }\n }\n }, [apiToken]);\n\n React.useEffect(() => {\n trackUsage(isCreating ? 'didAddTokenFromList' : 'didEditTokenFromList', {\n tokenType: API_TOKEN_TYPE,\n });\n }, [isCreating, trackUsage]);\n\n const { data, error, isLoading } = useGetAPITokenQuery(id!, {\n skip: !id || isCreating || !!apiToken,\n });\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n React.useEffect(() => {\n if (data) {\n setApiToken(data);\n\n if (data.type === 'read-only') {\n dispatch({\n type: 'ON_CHANGE_READ_ONLY',\n });\n }\n if (data.type === 'full-access') {\n dispatch({\n type: 'SELECT_ALL_ACTIONS',\n });\n }\n if (data.type === 'custom') {\n dispatch({\n type: 'UPDATE_PERMISSIONS',\n value: data?.permissions,\n });\n }\n }\n }, [data]);\n\n React.useEffect(() => {\n // Only set up timer when token is shown\n if (showToken) {\n hideTimerRef.current = setTimeout(() => {\n setShowToken(false);\n }, 30000); // 30 seconds\n\n // Cleanup on unmount or when showToken changes\n return () => {\n if (hideTimerRef.current) {\n clearTimeout(hideTimerRef.current);\n hideTimerRef.current = null;\n }\n };\n }\n }, [showToken]);\n\n const [createToken] = useCreateAPITokenMutation();\n const [updateToken] = useUpdateAPITokenMutation();\n\n interface FormValues extends Pick<Get.Response['data'], 'name' | 'description'> {\n lifespan: Get.Response['data']['lifespan'] | undefined;\n type: Get.Response['data']['type'] | undefined;\n }\n\n const handleSubmit = async (body: FormValues, formik: FormikHelpers<FormValues>) => {\n trackUsage(isCreating ? 'willCreateToken' : 'willEditToken', {\n tokenType: API_TOKEN_TYPE,\n });\n\n try {\n if (isCreating) {\n const res = await createToken({\n ...body,\n // lifespan must be \"null\" for unlimited (0 would mean instantly expired and isn't accepted)\n lifespan:\n body?.lifespan && body.lifespan !== '0' ? parseInt(body.lifespan.toString(), 10) : null,\n permissions: body.type === 'custom' ? state.selectedActions : null,\n });\n\n if ('error' in res) {\n if (isBaseQueryError(res.error) && res.error.name === 'ValidationError') {\n formik.setErrors(formatValidtionErrors(res.error));\n } else {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n }\n\n return;\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'notification.success.apitokencreated',\n defaultMessage: 'API Token successfully created',\n }),\n });\n\n trackUsage('didCreateToken', {\n type: res.data.type,\n tokenType: API_TOKEN_TYPE,\n });\n\n navigate(`../api-tokens/${res.data.id.toString()}`, {\n state: { apiToken: res.data },\n replace: true,\n });\n setCurrentStep('apiTokens.success');\n } else {\n const res = await updateToken({\n id: id!,\n name: body.name,\n description: body.description,\n type: body.type,\n permissions: body.type === 'custom' ? state.selectedActions : null,\n });\n\n if ('error' in res) {\n if (isBaseQueryError(res.error) && res.error.name === 'ValidationError') {\n formik.setErrors(formatValidtionErrors(res.error));\n } else {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n }\n\n return;\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'notification.success.apitokenedited',\n defaultMessage: 'API Token successfully edited',\n }),\n });\n\n trackUsage('didEditToken', {\n type: res.data.type,\n tokenType: API_TOKEN_TYPE,\n });\n }\n } catch {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'notification.error',\n defaultMessage: 'Something went wrong',\n }),\n });\n }\n };\n\n const [hasChangedPermissions, setHasChangedPermissions] = React.useState(false);\n\n const handleChangeCheckbox = ({\n target: { value },\n }: Parameters<ApiTokenPermissionsContextValue['value']['onChange']>[0]) => {\n setHasChangedPermissions(true);\n dispatch({\n type: 'ON_CHANGE',\n value,\n });\n };\n\n const handleChangeSelectAllCheckbox = ({\n target: { value },\n }: Parameters<ApiTokenPermissionsContextValue['value']['onChangeSelectAll']>[0]) => {\n setHasChangedPermissions(true);\n dispatch({\n type: 'SELECT_ALL_IN_PERMISSION',\n value,\n });\n };\n\n const setSelectedAction = ({\n target: { value },\n }: Parameters<ApiTokenPermissionsContextValue['value']['setSelectedAction']>[0]) => {\n dispatch({\n type: 'SET_SELECTED_ACTION',\n value,\n });\n };\n\n const toggleToken = () => {\n setShowToken((prev) => !prev);\n if (hideTimerRef.current) {\n clearTimeout(hideTimerRef.current);\n hideTimerRef.current = null;\n }\n };\n\n const providerValue = {\n ...state,\n onChange: handleChangeCheckbox,\n onChangeSelectAll: handleChangeSelectAllCheckbox,\n setSelectedAction,\n };\n\n const canEditInputs = (canUpdate && !isCreating) || (canCreate && isCreating);\n const canShowToken = !!apiToken?.accessKey;\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n return (\n <ApiTokenPermissionsProvider value={providerValue}>\n <Page.Main>\n <Page.Title>\n {formatMessage(\n { id: 'Settings.PageTitle', defaultMessage: 'Settings - {name}' },\n { name: 'API Tokens' }\n )}\n </Page.Title>\n <Formik\n validationSchema={schema}\n validateOnChange={false}\n initialValues={{\n name: apiToken?.name || '',\n description: apiToken?.description || '',\n type: apiToken?.type,\n lifespan: apiToken?.lifespan,\n }}\n enableReinitialize\n onSubmit={(body, actions) => handleSubmit(body, actions)}\n >\n {({ errors, handleChange, isSubmitting, values, setFieldValue }) => {\n if (hasChangedPermissions && values?.type !== 'custom') {\n setFieldValue('type', 'custom');\n }\n\n return (\n <Form>\n <FormHead\n title={{\n id: 'Settings.apiTokens.createPage.title',\n defaultMessage: 'Create API Token',\n }}\n token={apiToken}\n setToken={setApiToken}\n toggleToken={toggleToken}\n showToken={showToken}\n canEditInputs={canEditInputs}\n canRegenerate={canRegenerate}\n canShowToken={canShowToken}\n isSubmitting={isSubmitting}\n regenerateUrl=\"/admin/api-tokens/\"\n />\n\n <Layouts.Content>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {apiToken?.accessKey && showToken && (\n <TokenBox token={apiToken.accessKey} tokenType={API_TOKEN_TYPE} />\n )}\n\n <FormApiTokenContainer\n errors={errors}\n onChange={handleChange}\n canEditInputs={canEditInputs}\n isCreating={isCreating}\n values={values}\n apiToken={apiToken}\n onDispatch={dispatch}\n setHasChangedPermissions={setHasChangedPermissions}\n />\n <Permissions\n disabled={\n !canEditInputs ||\n values?.type === 'read-only' ||\n values?.type === 'full-access'\n }\n />\n </Flex>\n </Layouts.Content>\n </Form>\n );\n }}\n </Formik>\n </Page.Main>\n </ApiTokenPermissionsProvider>\n );\n};\n\nexport const ProtectedEditView = () => {\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions.settings?.['api-tokens'].read\n );\n\n return (\n <Page.Protect permissions={permissions}>\n <EditView />\n </Page.Protect>\n );\n};\n"],"names":["EditView","formatMessage","useIntl","toggleNotification","useNotification","state","locationState","useLocation","permissions","useTypedSelector","admin_app","apiToken","setApiToken","React","useState","accessKey","showToken","setShowToken","Boolean","hideTimerRef","useRef","trackUsage","useTracking","setCurrentStep","useGuidedTour","allowedActions","canCreate","canUpdate","canRegenerate","useRBAC","settings","dispatch","useReducer","reducer","initialState","match","useMatch","id","params","isCreating","_unstableFormatAPIError","formatAPIError","_unstableFormatValidationErrors","formatValidtionErrors","useAPIErrorHandler","navigate","useNavigate","contentAPIPermissionsQuery","useGetPermissionsQuery","contentAPIRoutesQuery","useGetRoutesQuery","useEffect","error","type","message","data","value","tokenType","API_TOKEN_TYPE","isLoading","useGetAPITokenQuery","skip","current","setTimeout","clearTimeout","createToken","useCreateAPITokenMutation","updateToken","useUpdateAPITokenMutation","handleSubmit","body","formik","res","lifespan","parseInt","toString","selectedActions","isBaseQueryError","name","setErrors","defaultMessage","replace","description","hasChangedPermissions","setHasChangedPermissions","handleChangeCheckbox","target","handleChangeSelectAllCheckbox","setSelectedAction","toggleToken","prev","providerValue","onChange","onChangeSelectAll","canEditInputs","canShowToken","_jsx","Page","Loading","ApiTokenPermissionsProvider","_jsxs","Main","Title","Formik","validationSchema","schema","validateOnChange","initialValues","enableReinitialize","onSubmit","actions","errors","handleChange","isSubmitting","values","setFieldValue","Form","FormHead","title","token","setToken","regenerateUrl","Layouts","Content","Flex","direction","alignItems","gap","TokenBox","FormApiTokenContainer","onDispatch","Permissions","disabled","ProtectedEditView","read","Protect"],"mappings":"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"}
|
|
@@ -35,6 +35,8 @@ import { reducer, initialState } from './reducer.mjs';
|
|
|
35
35
|
const [apiToken, setApiToken] = React.useState(locationState?.apiToken?.accessKey ? {
|
|
36
36
|
...locationState.apiToken
|
|
37
37
|
} : null);
|
|
38
|
+
const [showToken, setShowToken] = React.useState(Boolean(locationState?.apiToken?.accessKey));
|
|
39
|
+
const hideTimerRef = React.useRef(null);
|
|
38
40
|
const { trackUsage } = useTracking();
|
|
39
41
|
const setCurrentStep = useGuidedTour('EditView', (state)=>state.setCurrentStep);
|
|
40
42
|
const { allowedActions: { canCreate, canUpdate, canRegenerate } } = useRBAC(permissions.settings?.['api-tokens']);
|
|
@@ -161,6 +163,23 @@ import { reducer, initialState } from './reducer.mjs';
|
|
|
161
163
|
}, [
|
|
162
164
|
data
|
|
163
165
|
]);
|
|
166
|
+
React.useEffect(()=>{
|
|
167
|
+
// Only set up timer when token is shown
|
|
168
|
+
if (showToken) {
|
|
169
|
+
hideTimerRef.current = setTimeout(()=>{
|
|
170
|
+
setShowToken(false);
|
|
171
|
+
}, 30000); // 30 seconds
|
|
172
|
+
// Cleanup on unmount or when showToken changes
|
|
173
|
+
return ()=>{
|
|
174
|
+
if (hideTimerRef.current) {
|
|
175
|
+
clearTimeout(hideTimerRef.current);
|
|
176
|
+
hideTimerRef.current = null;
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
}, [
|
|
181
|
+
showToken
|
|
182
|
+
]);
|
|
164
183
|
const [createToken] = useCreateAPITokenMutation();
|
|
165
184
|
const [updateToken] = useUpdateAPITokenMutation();
|
|
166
185
|
const handleSubmit = async (body, formik)=>{
|
|
@@ -266,6 +285,13 @@ import { reducer, initialState } from './reducer.mjs';
|
|
|
266
285
|
value
|
|
267
286
|
});
|
|
268
287
|
};
|
|
288
|
+
const toggleToken = ()=>{
|
|
289
|
+
setShowToken((prev)=>!prev);
|
|
290
|
+
if (hideTimerRef.current) {
|
|
291
|
+
clearTimeout(hideTimerRef.current);
|
|
292
|
+
hideTimerRef.current = null;
|
|
293
|
+
}
|
|
294
|
+
};
|
|
269
295
|
const providerValue = {
|
|
270
296
|
...state,
|
|
271
297
|
onChange: handleChangeCheckbox,
|
|
@@ -273,6 +299,7 @@ import { reducer, initialState } from './reducer.mjs';
|
|
|
273
299
|
setSelectedAction
|
|
274
300
|
};
|
|
275
301
|
const canEditInputs = canUpdate && !isCreating || canCreate && isCreating;
|
|
302
|
+
const canShowToken = !!apiToken?.accessKey;
|
|
276
303
|
if (isLoading) {
|
|
277
304
|
return /*#__PURE__*/ jsx(Page.Loading, {});
|
|
278
305
|
}
|
|
@@ -312,8 +339,11 @@ import { reducer, initialState } from './reducer.mjs';
|
|
|
312
339
|
},
|
|
313
340
|
token: apiToken,
|
|
314
341
|
setToken: setApiToken,
|
|
342
|
+
toggleToken: toggleToken,
|
|
343
|
+
showToken: showToken,
|
|
315
344
|
canEditInputs: canEditInputs,
|
|
316
345
|
canRegenerate: canRegenerate,
|
|
346
|
+
canShowToken: canShowToken,
|
|
317
347
|
isSubmitting: isSubmitting,
|
|
318
348
|
regenerateUrl: "/admin/api-tokens/"
|
|
319
349
|
}),
|
|
@@ -323,8 +353,8 @@ import { reducer, initialState } from './reducer.mjs';
|
|
|
323
353
|
alignItems: "stretch",
|
|
324
354
|
gap: 6,
|
|
325
355
|
children: [
|
|
326
|
-
|
|
327
|
-
token: apiToken
|
|
356
|
+
apiToken?.accessKey && showToken && /*#__PURE__*/ jsx(TokenBox, {
|
|
357
|
+
token: apiToken.accessKey,
|
|
328
358
|
tokenType: API_TOKEN_TYPE
|
|
329
359
|
}),
|
|
330
360
|
/*#__PURE__*/ jsx(FormApiTokenContainer, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditViewPage.mjs","sources":["../../../../../../../../../admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Flex } from '@strapi/design-system';\nimport { Formik, Form, FormikHelpers } from 'formik';\nimport { useIntl } from 'react-intl';\nimport { useLocation, useMatch, useNavigate } from 'react-router-dom';\n\nimport { useGuidedTour } from '../../../../../components/GuidedTour/Provider';\nimport { Layouts } from '../../../../../components/Layouts/Layout';\nimport { Page } from '../../../../../components/PageHelpers';\nimport { useTypedSelector } from '../../../../../core/store/hooks';\nimport { useNotification } from '../../../../../features/Notifications';\nimport { useTracking } from '../../../../../features/Tracking';\nimport { useAPIErrorHandler } from '../../../../../hooks/useAPIErrorHandler';\nimport { useRBAC } from '../../../../../hooks/useRBAC';\nimport {\n useCreateAPITokenMutation,\n useGetAPITokenQuery,\n useUpdateAPITokenMutation,\n} from '../../../../../services/apiTokens';\nimport { useGetPermissionsQuery, useGetRoutesQuery } from '../../../../../services/contentApi';\nimport { isBaseQueryError } from '../../../../../utils/baseQuery';\nimport { API_TOKEN_TYPE } from '../../../components/Tokens/constants';\nimport { FormHead } from '../../../components/Tokens/FormHead';\nimport { TokenBox } from '../../../components/Tokens/TokenBox';\n\nimport {\n ApiTokenPermissionsContextValue,\n ApiTokenPermissionsProvider,\n} from './apiTokenPermissions';\nimport { FormApiTokenContainer } from './components/FormApiTokenContainer';\nimport { Permissions } from './components/Permissions';\nimport { schema } from './constants';\nimport { initialState, reducer } from './reducer';\n\nimport type { Get, ApiToken } from '../../../../../../../shared/contracts/api-token';\n\n/**\n * TODO: this could definitely be refactored to avoid using redux and instead just use the\n * server response as the source of the truth for the data.\n */\nexport const EditView = () => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { state: locationState } = useLocation();\n const permissions = useTypedSelector((state) => state.admin_app.permissions);\n const [apiToken, setApiToken] = React.useState<ApiToken | null>(\n locationState?.apiToken?.accessKey\n ? {\n ...locationState.apiToken,\n }\n : null\n );\n const { trackUsage } = useTracking();\n const setCurrentStep = useGuidedTour('EditView', (state) => state.setCurrentStep);\n const {\n allowedActions: { canCreate, canUpdate, canRegenerate },\n } = useRBAC(permissions.settings?.['api-tokens']);\n const [state, dispatch] = React.useReducer(reducer, initialState);\n const match = useMatch('/settings/api-tokens/:id');\n const id = match?.params?.id;\n const isCreating = id === 'create';\n const {\n _unstableFormatAPIError: formatAPIError,\n _unstableFormatValidationErrors: formatValidtionErrors,\n } = useAPIErrorHandler();\n\n const navigate = useNavigate();\n\n const contentAPIPermissionsQuery = useGetPermissionsQuery();\n const contentAPIRoutesQuery = useGetRoutesQuery();\n\n /**\n * Separate effects otherwise we could end\n * up duplicating the same notification.\n */\n React.useEffect(() => {\n if (contentAPIPermissionsQuery.error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(contentAPIPermissionsQuery.error),\n });\n }\n }, [contentAPIPermissionsQuery.error, formatAPIError, toggleNotification]);\n\n React.useEffect(() => {\n if (contentAPIRoutesQuery.error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(contentAPIRoutesQuery.error),\n });\n }\n }, [contentAPIRoutesQuery.error, formatAPIError, toggleNotification]);\n\n React.useEffect(() => {\n if (contentAPIPermissionsQuery.data) {\n dispatch({\n type: 'UPDATE_PERMISSIONS_LAYOUT',\n value: contentAPIPermissionsQuery.data,\n });\n }\n }, [contentAPIPermissionsQuery.data]);\n\n React.useEffect(() => {\n if (contentAPIRoutesQuery.data) {\n dispatch({\n type: 'UPDATE_ROUTES',\n value: contentAPIRoutesQuery.data,\n });\n }\n }, [contentAPIRoutesQuery.data]);\n\n React.useEffect(() => {\n if (apiToken) {\n if (apiToken.type === 'read-only') {\n dispatch({\n type: 'ON_CHANGE_READ_ONLY',\n });\n }\n if (apiToken.type === 'full-access') {\n dispatch({\n type: 'SELECT_ALL_ACTIONS',\n });\n }\n if (apiToken.type === 'custom') {\n dispatch({\n type: 'UPDATE_PERMISSIONS',\n value: apiToken?.permissions,\n });\n }\n }\n }, [apiToken]);\n\n React.useEffect(() => {\n trackUsage(isCreating ? 'didAddTokenFromList' : 'didEditTokenFromList', {\n tokenType: API_TOKEN_TYPE,\n });\n }, [isCreating, trackUsage]);\n\n const { data, error, isLoading } = useGetAPITokenQuery(id!, {\n skip: !id || isCreating || !!apiToken,\n });\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n React.useEffect(() => {\n if (data) {\n setApiToken(data);\n\n if (data.type === 'read-only') {\n dispatch({\n type: 'ON_CHANGE_READ_ONLY',\n });\n }\n if (data.type === 'full-access') {\n dispatch({\n type: 'SELECT_ALL_ACTIONS',\n });\n }\n if (data.type === 'custom') {\n dispatch({\n type: 'UPDATE_PERMISSIONS',\n value: data?.permissions,\n });\n }\n }\n }, [data]);\n\n const [createToken] = useCreateAPITokenMutation();\n const [updateToken] = useUpdateAPITokenMutation();\n\n interface FormValues extends Pick<Get.Response['data'], 'name' | 'description'> {\n lifespan: Get.Response['data']['lifespan'] | undefined;\n type: Get.Response['data']['type'] | undefined;\n }\n\n const handleSubmit = async (body: FormValues, formik: FormikHelpers<FormValues>) => {\n trackUsage(isCreating ? 'willCreateToken' : 'willEditToken', {\n tokenType: API_TOKEN_TYPE,\n });\n\n try {\n if (isCreating) {\n const res = await createToken({\n ...body,\n // lifespan must be \"null\" for unlimited (0 would mean instantly expired and isn't accepted)\n lifespan:\n body?.lifespan && body.lifespan !== '0' ? parseInt(body.lifespan.toString(), 10) : null,\n permissions: body.type === 'custom' ? state.selectedActions : null,\n });\n\n if ('error' in res) {\n if (isBaseQueryError(res.error) && res.error.name === 'ValidationError') {\n formik.setErrors(formatValidtionErrors(res.error));\n } else {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n }\n\n return;\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'notification.success.apitokencreated',\n defaultMessage: 'API Token successfully created',\n }),\n });\n\n trackUsage('didCreateToken', {\n type: res.data.type,\n tokenType: API_TOKEN_TYPE,\n });\n\n navigate(`../api-tokens/${res.data.id.toString()}`, {\n state: { apiToken: res.data },\n replace: true,\n });\n setCurrentStep('apiTokens.success');\n } else {\n const res = await updateToken({\n id: id!,\n name: body.name,\n description: body.description,\n type: body.type,\n permissions: body.type === 'custom' ? state.selectedActions : null,\n });\n\n if ('error' in res) {\n if (isBaseQueryError(res.error) && res.error.name === 'ValidationError') {\n formik.setErrors(formatValidtionErrors(res.error));\n } else {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n }\n\n return;\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'notification.success.apitokenedited',\n defaultMessage: 'API Token successfully edited',\n }),\n });\n\n trackUsage('didEditToken', {\n type: res.data.type,\n tokenType: API_TOKEN_TYPE,\n });\n }\n } catch {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'notification.error',\n defaultMessage: 'Something went wrong',\n }),\n });\n }\n };\n\n const [hasChangedPermissions, setHasChangedPermissions] = React.useState(false);\n\n const handleChangeCheckbox = ({\n target: { value },\n }: Parameters<ApiTokenPermissionsContextValue['value']['onChange']>[0]) => {\n setHasChangedPermissions(true);\n dispatch({\n type: 'ON_CHANGE',\n value,\n });\n };\n\n const handleChangeSelectAllCheckbox = ({\n target: { value },\n }: Parameters<ApiTokenPermissionsContextValue['value']['onChangeSelectAll']>[0]) => {\n setHasChangedPermissions(true);\n dispatch({\n type: 'SELECT_ALL_IN_PERMISSION',\n value,\n });\n };\n\n const setSelectedAction = ({\n target: { value },\n }: Parameters<ApiTokenPermissionsContextValue['value']['setSelectedAction']>[0]) => {\n dispatch({\n type: 'SET_SELECTED_ACTION',\n value,\n });\n };\n\n const providerValue = {\n ...state,\n onChange: handleChangeCheckbox,\n onChangeSelectAll: handleChangeSelectAllCheckbox,\n setSelectedAction,\n };\n\n const canEditInputs = (canUpdate && !isCreating) || (canCreate && isCreating);\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n return (\n <ApiTokenPermissionsProvider value={providerValue}>\n <Page.Main>\n <Page.Title>\n {formatMessage(\n { id: 'Settings.PageTitle', defaultMessage: 'Settings - {name}' },\n { name: 'API Tokens' }\n )}\n </Page.Title>\n <Formik\n validationSchema={schema}\n validateOnChange={false}\n initialValues={{\n name: apiToken?.name || '',\n description: apiToken?.description || '',\n type: apiToken?.type,\n lifespan: apiToken?.lifespan,\n }}\n enableReinitialize\n onSubmit={(body, actions) => handleSubmit(body, actions)}\n >\n {({ errors, handleChange, isSubmitting, values, setFieldValue }) => {\n if (hasChangedPermissions && values?.type !== 'custom') {\n setFieldValue('type', 'custom');\n }\n\n return (\n <Form>\n <FormHead\n title={{\n id: 'Settings.apiTokens.createPage.title',\n defaultMessage: 'Create API Token',\n }}\n token={apiToken}\n setToken={setApiToken}\n canEditInputs={canEditInputs}\n canRegenerate={canRegenerate}\n isSubmitting={isSubmitting}\n regenerateUrl=\"/admin/api-tokens/\"\n />\n\n <Layouts.Content>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {Boolean(apiToken?.name) && (\n <TokenBox token={apiToken?.accessKey} tokenType={API_TOKEN_TYPE} />\n )}\n <FormApiTokenContainer\n errors={errors}\n onChange={handleChange}\n canEditInputs={canEditInputs}\n isCreating={isCreating}\n values={values}\n apiToken={apiToken}\n onDispatch={dispatch}\n setHasChangedPermissions={setHasChangedPermissions}\n />\n <Permissions\n disabled={\n !canEditInputs ||\n values?.type === 'read-only' ||\n values?.type === 'full-access'\n }\n />\n </Flex>\n </Layouts.Content>\n </Form>\n );\n }}\n </Formik>\n </Page.Main>\n </ApiTokenPermissionsProvider>\n );\n};\n\nexport const ProtectedEditView = () => {\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions.settings?.['api-tokens'].read\n );\n\n return (\n <Page.Protect permissions={permissions}>\n <EditView />\n </Page.Protect>\n );\n};\n"],"names":["EditView","formatMessage","useIntl","toggleNotification","useNotification","state","locationState","useLocation","permissions","useTypedSelector","admin_app","apiToken","setApiToken","React","useState","accessKey","trackUsage","useTracking","setCurrentStep","useGuidedTour","allowedActions","canCreate","canUpdate","canRegenerate","useRBAC","settings","dispatch","useReducer","reducer","initialState","match","useMatch","id","params","isCreating","_unstableFormatAPIError","formatAPIError","_unstableFormatValidationErrors","formatValidtionErrors","useAPIErrorHandler","navigate","useNavigate","contentAPIPermissionsQuery","useGetPermissionsQuery","contentAPIRoutesQuery","useGetRoutesQuery","useEffect","error","type","message","data","value","tokenType","API_TOKEN_TYPE","isLoading","useGetAPITokenQuery","skip","createToken","useCreateAPITokenMutation","updateToken","useUpdateAPITokenMutation","handleSubmit","body","formik","res","lifespan","parseInt","toString","selectedActions","isBaseQueryError","name","setErrors","defaultMessage","replace","description","hasChangedPermissions","setHasChangedPermissions","handleChangeCheckbox","target","handleChangeSelectAllCheckbox","setSelectedAction","providerValue","onChange","onChangeSelectAll","canEditInputs","_jsx","Page","Loading","ApiTokenPermissionsProvider","_jsxs","Main","Title","Formik","validationSchema","schema","validateOnChange","initialValues","enableReinitialize","onSubmit","actions","errors","handleChange","isSubmitting","values","setFieldValue","Form","FormHead","title","token","setToken","regenerateUrl","Layouts","Content","Flex","direction","alignItems","gap","Boolean","TokenBox","FormApiTokenContainer","onDispatch","Permissions","disabled","ProtectedEditView","read","Protect"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EditViewPage.mjs","sources":["../../../../../../../../../admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Flex } from '@strapi/design-system';\nimport { Formik, Form, FormikHelpers } from 'formik';\nimport { useIntl } from 'react-intl';\nimport { useLocation, useMatch, useNavigate } from 'react-router-dom';\n\nimport { useGuidedTour } from '../../../../../components/GuidedTour/Provider';\nimport { Layouts } from '../../../../../components/Layouts/Layout';\nimport { Page } from '../../../../../components/PageHelpers';\nimport { useTypedSelector } from '../../../../../core/store/hooks';\nimport { useNotification } from '../../../../../features/Notifications';\nimport { useTracking } from '../../../../../features/Tracking';\nimport { useAPIErrorHandler } from '../../../../../hooks/useAPIErrorHandler';\nimport { useRBAC } from '../../../../../hooks/useRBAC';\nimport {\n useCreateAPITokenMutation,\n useGetAPITokenQuery,\n useUpdateAPITokenMutation,\n} from '../../../../../services/apiTokens';\nimport { useGetPermissionsQuery, useGetRoutesQuery } from '../../../../../services/contentApi';\nimport { isBaseQueryError } from '../../../../../utils/baseQuery';\nimport { API_TOKEN_TYPE } from '../../../components/Tokens/constants';\nimport { FormHead } from '../../../components/Tokens/FormHead';\nimport { TokenBox } from '../../../components/Tokens/TokenBox';\n\nimport {\n ApiTokenPermissionsContextValue,\n ApiTokenPermissionsProvider,\n} from './apiTokenPermissions';\nimport { FormApiTokenContainer } from './components/FormApiTokenContainer';\nimport { Permissions } from './components/Permissions';\nimport { schema } from './constants';\nimport { initialState, reducer } from './reducer';\n\nimport type { Get, ApiToken } from '../../../../../../../shared/contracts/api-token';\n\n/**\n * TODO: this could definitely be refactored to avoid using redux and instead just use the\n * server response as the source of the truth for the data.\n */\nexport const EditView = () => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { state: locationState } = useLocation();\n const permissions = useTypedSelector((state) => state.admin_app.permissions);\n const [apiToken, setApiToken] = React.useState<ApiToken | null>(\n locationState?.apiToken?.accessKey\n ? {\n ...locationState.apiToken,\n }\n : null\n );\n const [showToken, setShowToken] = React.useState(Boolean(locationState?.apiToken?.accessKey));\n const hideTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n const { trackUsage } = useTracking();\n const setCurrentStep = useGuidedTour('EditView', (state) => state.setCurrentStep);\n const {\n allowedActions: { canCreate, canUpdate, canRegenerate },\n } = useRBAC(permissions.settings?.['api-tokens']);\n const [state, dispatch] = React.useReducer(reducer, initialState);\n const match = useMatch('/settings/api-tokens/:id');\n const id = match?.params?.id;\n const isCreating = id === 'create';\n const {\n _unstableFormatAPIError: formatAPIError,\n _unstableFormatValidationErrors: formatValidtionErrors,\n } = useAPIErrorHandler();\n\n const navigate = useNavigate();\n\n const contentAPIPermissionsQuery = useGetPermissionsQuery();\n const contentAPIRoutesQuery = useGetRoutesQuery();\n /**\n * Separate effects otherwise we could end\n * up duplicating the same notification.\n */\n React.useEffect(() => {\n if (contentAPIPermissionsQuery.error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(contentAPIPermissionsQuery.error),\n });\n }\n }, [contentAPIPermissionsQuery.error, formatAPIError, toggleNotification]);\n\n React.useEffect(() => {\n if (contentAPIRoutesQuery.error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(contentAPIRoutesQuery.error),\n });\n }\n }, [contentAPIRoutesQuery.error, formatAPIError, toggleNotification]);\n\n React.useEffect(() => {\n if (contentAPIPermissionsQuery.data) {\n dispatch({\n type: 'UPDATE_PERMISSIONS_LAYOUT',\n value: contentAPIPermissionsQuery.data,\n });\n }\n }, [contentAPIPermissionsQuery.data]);\n\n React.useEffect(() => {\n if (contentAPIRoutesQuery.data) {\n dispatch({\n type: 'UPDATE_ROUTES',\n value: contentAPIRoutesQuery.data,\n });\n }\n }, [contentAPIRoutesQuery.data]);\n\n React.useEffect(() => {\n if (apiToken) {\n if (apiToken.type === 'read-only') {\n dispatch({\n type: 'ON_CHANGE_READ_ONLY',\n });\n }\n if (apiToken.type === 'full-access') {\n dispatch({\n type: 'SELECT_ALL_ACTIONS',\n });\n }\n if (apiToken.type === 'custom') {\n dispatch({\n type: 'UPDATE_PERMISSIONS',\n value: apiToken?.permissions,\n });\n }\n }\n }, [apiToken]);\n\n React.useEffect(() => {\n trackUsage(isCreating ? 'didAddTokenFromList' : 'didEditTokenFromList', {\n tokenType: API_TOKEN_TYPE,\n });\n }, [isCreating, trackUsage]);\n\n const { data, error, isLoading } = useGetAPITokenQuery(id!, {\n skip: !id || isCreating || !!apiToken,\n });\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n React.useEffect(() => {\n if (data) {\n setApiToken(data);\n\n if (data.type === 'read-only') {\n dispatch({\n type: 'ON_CHANGE_READ_ONLY',\n });\n }\n if (data.type === 'full-access') {\n dispatch({\n type: 'SELECT_ALL_ACTIONS',\n });\n }\n if (data.type === 'custom') {\n dispatch({\n type: 'UPDATE_PERMISSIONS',\n value: data?.permissions,\n });\n }\n }\n }, [data]);\n\n React.useEffect(() => {\n // Only set up timer when token is shown\n if (showToken) {\n hideTimerRef.current = setTimeout(() => {\n setShowToken(false);\n }, 30000); // 30 seconds\n\n // Cleanup on unmount or when showToken changes\n return () => {\n if (hideTimerRef.current) {\n clearTimeout(hideTimerRef.current);\n hideTimerRef.current = null;\n }\n };\n }\n }, [showToken]);\n\n const [createToken] = useCreateAPITokenMutation();\n const [updateToken] = useUpdateAPITokenMutation();\n\n interface FormValues extends Pick<Get.Response['data'], 'name' | 'description'> {\n lifespan: Get.Response['data']['lifespan'] | undefined;\n type: Get.Response['data']['type'] | undefined;\n }\n\n const handleSubmit = async (body: FormValues, formik: FormikHelpers<FormValues>) => {\n trackUsage(isCreating ? 'willCreateToken' : 'willEditToken', {\n tokenType: API_TOKEN_TYPE,\n });\n\n try {\n if (isCreating) {\n const res = await createToken({\n ...body,\n // lifespan must be \"null\" for unlimited (0 would mean instantly expired and isn't accepted)\n lifespan:\n body?.lifespan && body.lifespan !== '0' ? parseInt(body.lifespan.toString(), 10) : null,\n permissions: body.type === 'custom' ? state.selectedActions : null,\n });\n\n if ('error' in res) {\n if (isBaseQueryError(res.error) && res.error.name === 'ValidationError') {\n formik.setErrors(formatValidtionErrors(res.error));\n } else {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n }\n\n return;\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'notification.success.apitokencreated',\n defaultMessage: 'API Token successfully created',\n }),\n });\n\n trackUsage('didCreateToken', {\n type: res.data.type,\n tokenType: API_TOKEN_TYPE,\n });\n\n navigate(`../api-tokens/${res.data.id.toString()}`, {\n state: { apiToken: res.data },\n replace: true,\n });\n setCurrentStep('apiTokens.success');\n } else {\n const res = await updateToken({\n id: id!,\n name: body.name,\n description: body.description,\n type: body.type,\n permissions: body.type === 'custom' ? state.selectedActions : null,\n });\n\n if ('error' in res) {\n if (isBaseQueryError(res.error) && res.error.name === 'ValidationError') {\n formik.setErrors(formatValidtionErrors(res.error));\n } else {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n }\n\n return;\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'notification.success.apitokenedited',\n defaultMessage: 'API Token successfully edited',\n }),\n });\n\n trackUsage('didEditToken', {\n type: res.data.type,\n tokenType: API_TOKEN_TYPE,\n });\n }\n } catch {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'notification.error',\n defaultMessage: 'Something went wrong',\n }),\n });\n }\n };\n\n const [hasChangedPermissions, setHasChangedPermissions] = React.useState(false);\n\n const handleChangeCheckbox = ({\n target: { value },\n }: Parameters<ApiTokenPermissionsContextValue['value']['onChange']>[0]) => {\n setHasChangedPermissions(true);\n dispatch({\n type: 'ON_CHANGE',\n value,\n });\n };\n\n const handleChangeSelectAllCheckbox = ({\n target: { value },\n }: Parameters<ApiTokenPermissionsContextValue['value']['onChangeSelectAll']>[0]) => {\n setHasChangedPermissions(true);\n dispatch({\n type: 'SELECT_ALL_IN_PERMISSION',\n value,\n });\n };\n\n const setSelectedAction = ({\n target: { value },\n }: Parameters<ApiTokenPermissionsContextValue['value']['setSelectedAction']>[0]) => {\n dispatch({\n type: 'SET_SELECTED_ACTION',\n value,\n });\n };\n\n const toggleToken = () => {\n setShowToken((prev) => !prev);\n if (hideTimerRef.current) {\n clearTimeout(hideTimerRef.current);\n hideTimerRef.current = null;\n }\n };\n\n const providerValue = {\n ...state,\n onChange: handleChangeCheckbox,\n onChangeSelectAll: handleChangeSelectAllCheckbox,\n setSelectedAction,\n };\n\n const canEditInputs = (canUpdate && !isCreating) || (canCreate && isCreating);\n const canShowToken = !!apiToken?.accessKey;\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n return (\n <ApiTokenPermissionsProvider value={providerValue}>\n <Page.Main>\n <Page.Title>\n {formatMessage(\n { id: 'Settings.PageTitle', defaultMessage: 'Settings - {name}' },\n { name: 'API Tokens' }\n )}\n </Page.Title>\n <Formik\n validationSchema={schema}\n validateOnChange={false}\n initialValues={{\n name: apiToken?.name || '',\n description: apiToken?.description || '',\n type: apiToken?.type,\n lifespan: apiToken?.lifespan,\n }}\n enableReinitialize\n onSubmit={(body, actions) => handleSubmit(body, actions)}\n >\n {({ errors, handleChange, isSubmitting, values, setFieldValue }) => {\n if (hasChangedPermissions && values?.type !== 'custom') {\n setFieldValue('type', 'custom');\n }\n\n return (\n <Form>\n <FormHead\n title={{\n id: 'Settings.apiTokens.createPage.title',\n defaultMessage: 'Create API Token',\n }}\n token={apiToken}\n setToken={setApiToken}\n toggleToken={toggleToken}\n showToken={showToken}\n canEditInputs={canEditInputs}\n canRegenerate={canRegenerate}\n canShowToken={canShowToken}\n isSubmitting={isSubmitting}\n regenerateUrl=\"/admin/api-tokens/\"\n />\n\n <Layouts.Content>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {apiToken?.accessKey && showToken && (\n <TokenBox token={apiToken.accessKey} tokenType={API_TOKEN_TYPE} />\n )}\n\n <FormApiTokenContainer\n errors={errors}\n onChange={handleChange}\n canEditInputs={canEditInputs}\n isCreating={isCreating}\n values={values}\n apiToken={apiToken}\n onDispatch={dispatch}\n setHasChangedPermissions={setHasChangedPermissions}\n />\n <Permissions\n disabled={\n !canEditInputs ||\n values?.type === 'read-only' ||\n values?.type === 'full-access'\n }\n />\n </Flex>\n </Layouts.Content>\n </Form>\n );\n }}\n </Formik>\n </Page.Main>\n </ApiTokenPermissionsProvider>\n );\n};\n\nexport const ProtectedEditView = () => {\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions.settings?.['api-tokens'].read\n );\n\n return (\n <Page.Protect permissions={permissions}>\n <EditView />\n </Page.Protect>\n );\n};\n"],"names":["EditView","formatMessage","useIntl","toggleNotification","useNotification","state","locationState","useLocation","permissions","useTypedSelector","admin_app","apiToken","setApiToken","React","useState","accessKey","showToken","setShowToken","Boolean","hideTimerRef","useRef","trackUsage","useTracking","setCurrentStep","useGuidedTour","allowedActions","canCreate","canUpdate","canRegenerate","useRBAC","settings","dispatch","useReducer","reducer","initialState","match","useMatch","id","params","isCreating","_unstableFormatAPIError","formatAPIError","_unstableFormatValidationErrors","formatValidtionErrors","useAPIErrorHandler","navigate","useNavigate","contentAPIPermissionsQuery","useGetPermissionsQuery","contentAPIRoutesQuery","useGetRoutesQuery","useEffect","error","type","message","data","value","tokenType","API_TOKEN_TYPE","isLoading","useGetAPITokenQuery","skip","current","setTimeout","clearTimeout","createToken","useCreateAPITokenMutation","updateToken","useUpdateAPITokenMutation","handleSubmit","body","formik","res","lifespan","parseInt","toString","selectedActions","isBaseQueryError","name","setErrors","defaultMessage","replace","description","hasChangedPermissions","setHasChangedPermissions","handleChangeCheckbox","target","handleChangeSelectAllCheckbox","setSelectedAction","toggleToken","prev","providerValue","onChange","onChangeSelectAll","canEditInputs","canShowToken","_jsx","Page","Loading","ApiTokenPermissionsProvider","_jsxs","Main","Title","Formik","validationSchema","schema","validateOnChange","initialValues","enableReinitialize","onSubmit","actions","errors","handleChange","isSubmitting","values","setFieldValue","Form","FormHead","title","token","setToken","regenerateUrl","Layouts","Content","Flex","direction","alignItems","gap","TokenBox","FormApiTokenContainer","onDispatch","Permissions","disabled","ProtectedEditView","read","Protect"],"mappings":"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"}
|