import { usePage } from '@inertiajs/react'; import { ActionIcon, Button, Card, CopyButton, Group, Text, } from '@mantine/core'; import { modals } from '@mantine/modals'; import { useTranslation } from 'react-i18next'; import { TbPlus, TbTrash } from 'react-icons/tb'; import { SimpleTable } from '~/components/common/simple_table/simple_table'; import { useApiTokens } from '~/hooks/use_api_tokens'; import { ApiToken } from '~/types/app'; import { CreateTokenModal } from './create_token_modal'; const useGetCreatedToken = () => { const newlyCreatedToken = usePage<{ token?: ApiToken; }>().props.token; return newlyCreatedToken; }; export function ApiTokens() { const { t } = useTranslation(); const { tokens, createToken, revokeToken } = useApiTokens(); const newlyCreatedToken = useGetCreatedToken(); const handleCreateTokenModal = () => { modals.open({ title: t('api-tokens.create-new'), children: ( createToken(name)} onClose={() => modals.closeAll()} /> ), }); }; const handleRevokeToken = async (tokenId: number) => { const token = tokens.find((t) => t.identifier === tokenId); if (!token) return; modals.openConfirmModal({ title: ( <> {t('api-tokens.revoke')} "{token.name}" ), children: {t('api-tokens.confirm-revoke')}, labels: { confirm: t('api-tokens.revoke'), cancel: t('cancel'), }, confirmProps: { color: 'red' }, onConfirm: () => revokeToken(tokenId), }); }; const generateTokenRow = (token: ApiToken) => newlyCreatedToken?.identifier === token.identifier && ( <> {t('api-tokens.new-token')}{' '} {newlyCreatedToken.token && ( {({ copied, copy }) => ( )} )} ); const generateRow = (token: ApiToken) => ({ key: token.identifier.toString(), name: token.name, token: generateTokenRow(token) || undefined, expiresAt: token.expiresAt, lastUsedAt: token.lastUsedAt, actions: [ handleRevokeToken(token.identifier)} > , ], }); const rows = tokens.map(generateRow); return ( {t('api-tokens.title')} {tokens.length === 0 && ( {t('api-tokens.no-tokens')} )} {tokens.length > 0 && } ); }