158 lines
5.3 KiB
JavaScript
158 lines
5.3 KiB
JavaScript
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 = `
|
||
<button id="create-token-btn" class="btn-primary" style="width: 200px; margin-bottom: 30px;">
|
||
Создать токен API
|
||
</button>
|
||
<div id="token-status-message" class="success-message" style="display: none;"></div>
|
||
`;
|
||
|
||
if (tokens.length === 0) {
|
||
$listContainer.html(createButtonHtml + '<p>Активных API токенов не найдено.</p>');
|
||
attachEventHandlers();
|
||
return;
|
||
}
|
||
|
||
const listHtml = tokens.map(item => {
|
||
const displayToken = item.token ?
|
||
`${item.token.substring(0, 8)}...${item.token.substring(item.token.length - 4)}` :
|
||
'Неизвестный токен';
|
||
|
||
return `
|
||
<li class="token-item" data-full-token="${item.token}">
|
||
<div class="token-description">${item.description}</div>
|
||
<div class="token-details">
|
||
<span class="token-value">Ключ: ${displayToken}</span>
|
||
<button class="delete-token-btn btn-icon" data-token="${item.token}" title="Удалить токен">
|
||
<span class="delete-icon">✖</span>
|
||
</button>
|
||
</div>
|
||
</li>
|
||
`;
|
||
}).join('');
|
||
|
||
const html = `
|
||
${createButtonHtml}
|
||
<ul class="token-list">${listHtml}</ul>
|
||
`;
|
||
|
||
$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: () => `
|
||
<h1 class="page-title">API Токены</h1>
|
||
<div id="api-token-container">
|
||
<p>Загрузка токенов...</p>
|
||
</div>
|
||
`,
|
||
mount: async () => {
|
||
const success = await loadTokens();
|
||
if (success) {
|
||
renderTokenList();
|
||
} else {
|
||
$('#api-token-container').html('<p class="error-message">Не удалось загрузить токены. Проверьте соединение с сервером.</p>');
|
||
}
|
||
},
|
||
unmount: () => {
|
||
tokens = [];
|
||
$('#api-token-container').off();
|
||
}
|
||
}; |