{"version":3,"file":"ListView-jN_Vyb9x.mjs","sources":["../../admin/src/pages/Settings/pages/ApiTokens/ListView.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { ContentLayout, HeaderLayout, LinkButton, Main } from '@strapi/design-system';\nimport {\n  CheckPagePermissions,\n  NoContent,\n  NoPermissions,\n  SettingsPageTitle,\n  useAPIErrorHandler,\n  useFocusWhenNavigate,\n  useGuidedTour,\n  useNotification,\n  useRBAC,\n  useTracking,\n} from '@strapi/helper-plugin';\nimport { Plus } from '@strapi/icons';\nimport { Entity } from '@strapi/types';\nimport qs from 'qs';\nimport { useIntl } from 'react-intl';\nimport { useHistory } from 'react-router-dom';\n\nimport { useTypedSelector } from '../../../../core/store/hooks';\nimport { useOnce } from '../../../../hooks/useOnce';\nimport { useDeleteAPITokenMutation, useGetAPITokensQuery } from '../../../../services/apiTokens';\nimport { API_TOKEN_TYPE } from '../../components/Tokens/constants';\nimport { Table } from '../../components/Tokens/Table';\n\nconst TABLE_HEADERS = [\n  {\n    name: 'name',\n    key: 'name',\n    metadatas: {\n      label: {\n        id: 'Settings.apiTokens.ListView.headers.name',\n        defaultMessage: 'Name',\n      },\n      sortable: true,\n    },\n  },\n  {\n    name: 'description',\n    key: 'description',\n    metadatas: {\n      label: {\n        id: 'Settings.apiTokens.ListView.headers.description',\n        defaultMessage: 'Description',\n      },\n      sortable: false,\n    },\n  },\n  {\n    name: 'createdAt',\n    key: 'createdAt',\n    metadatas: {\n      label: {\n        id: 'Settings.apiTokens.ListView.headers.createdAt',\n        defaultMessage: 'Created at',\n      },\n      sortable: false,\n    },\n  },\n  {\n    name: 'lastUsedAt',\n    key: 'lastUsedAt',\n    metadatas: {\n      label: {\n        id: 'Settings.apiTokens.ListView.headers.lastUsedAt',\n        defaultMessage: 'Last used',\n      },\n      sortable: false,\n    },\n  },\n];\n\nexport const ListView = () => {\n  useFocusWhenNavigate();\n  const { formatMessage } = useIntl();\n  const toggleNotification = useNotification();\n  const permissions = useTypedSelector(\n    (state) => state.admin_app.permissions.settings?.['api-tokens']\n  );\n  const {\n    allowedActions: { canCreate, canDelete, canUpdate, canRead },\n  } = useRBAC(permissions);\n  const { push } = useHistory();\n  const { trackUsage } = useTracking();\n  const { startSection } = useGuidedTour();\n  const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n  React.useEffect(() => {\n    startSection('apiTokens');\n  }, [startSection]);\n\n  React.useEffect(() => {\n    push({ search: qs.stringify({ sort: 'name:ASC' }, { encode: false }) });\n  }, [push]);\n\n  const headers = TABLE_HEADERS.map((header) => ({\n    ...header,\n    metadatas: {\n      ...header.metadatas,\n      label: formatMessage(header.metadatas.label),\n    },\n  }));\n\n  useOnce(() => {\n    trackUsage('willAccessTokenList', {\n      tokenType: API_TOKEN_TYPE,\n    });\n  });\n\n  const {\n    data: apiTokens = [],\n    isLoading,\n    error,\n  } = useGetAPITokensQuery(undefined, {\n    skip: !canRead,\n  });\n\n  React.useEffect(() => {\n    if (error) {\n      toggleNotification({\n        type: 'warning',\n        message: formatAPIError(error),\n      });\n    }\n  }, [error, formatAPIError, toggleNotification]);\n\n  React.useEffect(() => {\n    trackUsage('didAccessTokenList', { number: apiTokens.length, tokenType: API_TOKEN_TYPE });\n  }, [apiTokens, trackUsage]);\n\n  const [deleteToken] = useDeleteAPITokenMutation();\n\n  const handleDelete = async (id: Entity.ID) => {\n    try {\n      const res = await deleteToken(id);\n\n      if ('error' in res) {\n        toggleNotification({\n          type: 'warning',\n          message: formatAPIError(res.error),\n        });\n\n        return;\n      }\n\n      trackUsage('didDeleteToken');\n    } catch {\n      toggleNotification({\n        type: 'warning',\n        message: {\n          id: 'notification.error',\n          defaultMessage: 'Something went wrong',\n        },\n      });\n    }\n  };\n\n  return (\n    <Main aria-busy={isLoading}>\n      {/* TODO: this needs to be translated */}\n      <SettingsPageTitle name=\"API Tokens\" />\n      <HeaderLayout\n        title={formatMessage({ id: 'Settings.apiTokens.title', defaultMessage: 'API Tokens' })}\n        subtitle={formatMessage({\n          id: 'Settings.apiTokens.description',\n          defaultMessage: 'List of generated tokens to consume the API',\n        })}\n        primaryAction={\n          canCreate && (\n            <LinkButton\n              data-testid=\"create-api-token-button\"\n              startIcon={<Plus />}\n              size=\"S\"\n              onClick={() =>\n                trackUsage('willAddTokenFromList', {\n                  tokenType: API_TOKEN_TYPE,\n                })\n              }\n              to=\"/settings/api-tokens/create\"\n            >\n              {formatMessage({\n                id: 'Settings.apiTokens.create',\n                defaultMessage: 'Create new API Token',\n              })}\n            </LinkButton>\n          )\n        }\n      />\n      <ContentLayout>\n        {!canRead && <NoPermissions />}\n        {canRead && apiTokens.length > 0 && (\n          <Table\n            permissions={{ canRead, canDelete, canUpdate }}\n            headers={headers}\n            contentType=\"api-tokens\"\n            isLoading={isLoading}\n            onConfirmDelete={handleDelete}\n            tokens={apiTokens}\n            tokenType={API_TOKEN_TYPE}\n          />\n        )}\n        {canRead && canCreate && apiTokens.length === 0 && (\n          <NoContent\n            content={{\n              id: 'Settings.apiTokens.addFirstToken',\n              defaultMessage: 'Add your first API Token',\n            }}\n            action={\n              <LinkButton variant=\"secondary\" startIcon={<Plus />} to=\"/settings/api-tokens/create\">\n                {formatMessage({\n                  id: 'Settings.apiTokens.addNewToken',\n                  defaultMessage: 'Add new API Token',\n                })}\n              </LinkButton>\n            }\n          />\n        )}\n        {canRead && !canCreate && apiTokens.length === 0 && (\n          <NoContent\n            content={{\n              id: 'Settings.apiTokens.emptyStateLayout',\n              defaultMessage: 'You don’t have any content yet...',\n            }}\n          />\n        )}\n      </ContentLayout>\n    </Main>\n  );\n};\n\nexport const ProtectedListView = () => {\n  const permissions = useTypedSelector(\n    (state) => state.admin_app.permissions.settings?.['api-tokens'].main\n  );\n\n  return (\n    <CheckPagePermissions permissions={permissions}>\n      <ListView />\n    </CheckPagePermissions>\n  );\n};\n"],"names":["qs"],"mappings":"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"}