import { useCallback, useState } from 'react';
import { reportInteraction } from '@grafana/runtime';
import { Box, Button, Text } from '@grafana/ui';
import { t, Trans } from 'app/core/internationalization';
import {
useCreateCloudMigrationTokenMutation,
useDeleteCloudMigrationTokenMutation,
useGetCloudMigrationTokenQuery,
} from '../../api';
import { maybeAPIError } from '../../api/errors';
import { TokenErrorAlert } from '../TokenErrorAlert';
import { CreateTokenModal } from './CreateTokenModal';
import { DeleteTokenConfirmationModal } from './DeleteTokenConfirmationModal';
import { TokenStatus } from './TokenStatus';
export const MigrationTokenPane = () => {
const [showCreateModal, setShowCreateModal] = useState(false);
const [showDeleteModal, setShowDeleteModal] = useState(false);
const getTokenQuery = useGetCloudMigrationTokenQuery();
const [createTokenMutation, createTokenResponse] = useCreateCloudMigrationTokenMutation();
const [deleteTokenMutation, deleteTokenResponse] = useDeleteCloudMigrationTokenMutation();
const getTokenQueryError = maybeAPIError(getTokenQuery.error);
// GetCloudMigrationToken returns a 404 error if no token exists.
// When a token is deleted and the GetCloudMigrationToken query is refreshed, RTKQ will retain
// both the last successful data ("we have a token!") AND the new error. So we need to explicitly
// check that we don't have an error AND that we have a token.
const hasToken = Boolean(getTokenQuery.data?.id) && getTokenQueryError?.statusCode !== 404;
const isLoading = getTokenQuery.isFetching || createTokenResponse.isLoading;
const handleGenerateToken = useCallback(async () => {
reportInteraction('grafana_e2c_generate_token_clicked');
const resp = await createTokenMutation();
if (!('error' in resp)) {
setShowCreateModal(true);
}
}, [createTokenMutation]);
const handleDeleteToken = useCallback(async () => {
if (!getTokenQuery.data?.id) {
return;
}
reportInteraction('grafana_e2c_delete_token_clicked');
const resp = await deleteTokenMutation({ uid: getTokenQuery.data.id });
if (!('error' in resp)) {
setShowDeleteModal(false);
}
}, [deleteTokenMutation, getTokenQuery.data]);
return (
<>
{createTokenResponse?.isError ? (
) : (
Current status:{' '}
)}
{hasToken ? (
) : (
)}
{
reportInteraction('grafana_e2c_generated_token_modal_dismissed');
setShowCreateModal(false);
}}
migrationToken={createTokenResponse.data?.token}
/>
setShowDeleteModal(false)}
hasError={Boolean(deleteTokenResponse.error)}
/>
>
);
};