import $ from 'jquery';
import { JSONRPC } from '@/json-rpc.js';
let tokens = [];
async function loadTokens() {
try {
tokens = await JSONRPC.Auth.listTokens();
tokens = tokens || [];
return true;
} catch (e) {
console.error('Ошибка при загрузке токенов:', e);
tokens = [];
return false;
}
}
function renderTokenList() {
const $listContainer = $('#api-token-container');
const createButtonHtml = `
`;
if (tokens.length === 0) {
$listContainer.html(createButtonHtml + 'Активных API токенов не найдено.
');
attachEventHandlers();
return;
}
const listHtml = tokens.map(item => {
const displayToken = item.token ?
`${item.token.substring(0, 8)}...${item.token.substring(item.token.length - 4)}` :
'Неизвестный токен';
return `
${item.description}
Ключ: ${displayToken}
`;
}).join('');
const html = `
${createButtonHtml}
`;
$listContainer.html(html);
attachEventHandlers();
}
function showCreateTokenModal() {
const description = prompt('Введите описание для нового API токена (например, "Токен для Telegram бота"):');
if (description === null) {
return;
}
if (description.trim() === '') {
alert('Описание токена не может быть пустым.');
return;
}
createToken(description.trim());
}
async function createToken(description) {
const $btn = $('#create-token-btn');
const $message = $('#token-status-message');
$message.hide().removeClass('error-message').addClass('success-message');
$btn.prop('disabled', true).text('Создание...');
try {
const newTokenValue = await JSONRPC.Auth.createAPIToken(description);
if (!newTokenValue) {
throw new Error('Сервер не вернул токен.');
}
prompt('ВАЖНО: Ваш новый токен API. Сохраните его, он больше не будет показан!', newTokenValue);
await loadTokens();
renderTokenList();
$message.text(`Токен "${description}" успешно создан.`).show();
} catch (e) {
console.error('Ошибка создания токена:', e);
$message.removeClass('success-message').addClass('error-message').text('Ошибка при создании токена.').show();
} finally {
$btn.prop('disabled', false).text('Создать токен API');
setTimeout(() => $message.fadeOut(), 8000);
}
}
async function deleteToken(token) {
if (!confirm('Вы уверены, что хотите удалить этот API токен?')) {
return;
}
const $item = $(`li.token-item[data-full-token="${token}"]`);
$item.addClass('deleting').css('opacity', 0.5);
try {
await JSONRPC.Auth.removeToken(token);
tokens = tokens.filter(item => item.token !== token);
renderTokenList();
const $message = $('#token-status-message');
$message.text('Токен успешно удален.').addClass('success-message').show();
} catch (e) {
console.error('Ошибка удаления токена:', e);
$item.removeClass('deleting').css('opacity', 1);
const $message = $('#token-status-message');
$message.removeClass('success-message').addClass('error-message').text('Ошибка при удалении токена.').show();
}
}
function attachEventHandlers() {
$('#create-token-btn').off('click').on('click', showCreateTokenModal);
$('#api-token-container').off('click', '.delete-token-btn').on('click', '.delete-token-btn', function () {
const tokenToDelete = $(this).data('token');
if (tokenToDelete) {
deleteToken(tokenToDelete);
}
});
}
export const APITokens = {
render: () => `
API Токены
`,
mount: async () => {
const success = await loadTokens();
if (success) {
renderTokenList();
} else {
$('#api-token-container').html('Не удалось загрузить токены. Проверьте соединение с сервером.
');
}
},
unmount: () => {
tokens = [];
$('#api-token-container').off();
}
};