let chatbotSrc = '';
let configs = [];
document.addEventListener('DOMContentLoaded', async function () {
const storageData = await chrome.storage.local.get(["chatbotSrc", "configs", "showChatBot", "chatBotWidth", "chatBotHeight"]);
chatbotSrc = storageData.chatbotSrc || '';
configs = storageData.configs || [];
const showChatBot = storageData.showChatBot === undefined ? true : storageData.showChatBot;
const chatBotWidth = storageData.chatBotWidth || 400;
const chatBotHeight = storageData.chatBotHeight || 700;
await loadConfigs(configs, chatbotSrc);
document.getElementById('addConfigButton').addEventListener('click', handleAddButtonClick);
document.getElementById('startChatButton').addEventListener('click', () => window.location.href = 'popup.html');
// 监听开关和输入框变化事件
const showChatBotSwitch = document.getElementById('showChatBotSwitch');
const chatBotWidthInput = document.getElementById('chatBotWidthInput');
const chatBotHeightInput = document.getElementById('chatBotHeightInput');
showChatBotSwitch.addEventListener('change', () => handleShowChatBotChange(showChatBotSwitch.checked));
chatBotWidthInput.addEventListener('change', () => handleChatBotWidthChange(chatBotWidthInput.value));
chatBotHeightInput.addEventListener('change', () => handleChatBotHeightChange(chatBotHeightInput.value));
// 初始化开关和输入框的值
showChatBotSwitch.checked = showChatBot;
chatBotWidthInput.value = chatBotWidth;
chatBotHeightInput.value = chatBotHeight;
});
async function loadConfigs(configs, chatbotSrc) {
const configList = document.getElementById('configList');
configList.innerHTML = '';
configs.forEach(config => {
const row = createConfigRow(config, chatbotSrc);
configList.appendChild(row);
});
}
function createConfigRow(config, chatbotSrc) {
const row = document.createElement('tr');
row.innerHTML = `
${config.name} |
${config.url} |
|
|
|
`;
row.querySelector('.editButton').addEventListener('click', () => handleEditButtonClick(row, config));
row.querySelector('.deleteButton').addEventListener('click', () => handleDeleteButtonClick(row, config));
row.querySelector('.selectBot').addEventListener('change', () => handleSelectBotChange(config.url));
return row;
}
async function handleDeleteButtonClick(row, config) {
const configList = document.getElementById('configList');
const index = Array.from(configList.children).indexOf(row);
const selectedUrl = config.url;
if (selectedUrl === chatbotSrc) {
chatbotSrc = 'about:blank';
await updateStorage('chatbotSrc', chatbotSrc);
await updateStorage('chatId', '');
await updateStorage('shareId', '');
}
configs.splice(index, 1);
await updateStorage('configs', configs);
row.remove();
}
async function handleSelectBotChange(url) {
chatbotSrc = url;
await updateStorage('chatbotSrc', chatbotSrc);
updateSelectedRadioButton();
}
function updateSelectedRadioButton() {
document.querySelectorAll('.selectBot').forEach(radio => {
if (radio.closest('tr').querySelector('td:nth-child(2)').textContent === chatbotSrc) {
radio.checked = true;
} else {
radio.checked = false;
}
});
}
function showError(message) {
const errorMsg = document.getElementById('errorMsg');
errorMsg.textContent = message;
errorMsg.style.opacity = 1; // 显示错误消息
// 设置一个定时器,在5秒后隐藏错误消息
setTimeout(() => {
errorMsg.style.opacity = 0; // 隐藏错误消息
}, 3000);
}
async function updateStorage(key, value) {
try {
await chrome.storage.local.set({[key]: value});
console.log(`${key} 已更新: ${value}`);
} catch (error) {
console.error(`更新 ${key} 出错:`, error);
}
}
function showEditControls(row, isNewConfig = false, config = null) {
const nameCell = row.querySelector('td:nth-child(1)');
const urlCell = row.querySelector('td:nth-child(2)');
const name = isNewConfig ? '' : config.name;
const url = isNewConfig ? '' : config.url;
nameCell.innerHTML = ``;
urlCell.innerHTML = ``;
const iconContainer = document.createElement('div');
iconContainer.style.display = 'flex';
iconContainer.style.flexDirection = 'column';
iconContainer.style.position = 'absolute';
iconContainer.style.top = '15px';
iconContainer.style.left = '-5px';
const confirmIcon = document.createElement('span');
confirmIcon.textContent = '√';
confirmIcon.style.color = 'green';
confirmIcon.style.cursor = 'pointer';
confirmIcon.style.margin = '0 0 10px 0';
confirmIcon.classList.add('icon-hover');
confirmIcon.classList.add('confirmButton');
confirmIcon.addEventListener('click', () => {
handleConfirmButtonClick(row, isNewConfig);
});
const cancelIcon = document.createElement('span');
cancelIcon.textContent = 'X';
cancelIcon.style.color = 'red';
cancelIcon.style.cursor = 'pointer';
cancelIcon.classList.add('icon-hover');
cancelIcon.classList.add('cancelButton')
cancelIcon.addEventListener('click', () => {
handleCancelButtonClick(row, isNewConfig);
});
iconContainer.appendChild(confirmIcon);
iconContainer.appendChild(cancelIcon);
const cell = row.querySelector('td:nth-child(3)');
cell.insertBefore(iconContainer, cell.firstChild);
}
function handleAddButtonClick() {
const newRow = document.createElement('tr');
newRow.innerHTML = `
|
|
|
|
`;
document.getElementById('configList').appendChild(newRow);
showEditControls(newRow, true);
}
function handleEditButtonClick(row, config) {
disableAllEditButtons();
showEditControls(row, false, config);
}
function isConfigUnique(name, url, index) {
return !configs.some((config, i) =>
i !== index && (config.name === name || config.url === url)
);
}
function checkConfig(name, url, index) {
let errorMsg = '';
if (!name || !url) {
errorMsg = '名称和地址都是必填项。';
} else if (!isConfigUnique(name, url, index)) {
errorMsg = '名称或地址不能重复。';
}
return errorMsg;
}
function handleConfirmButtonClick(row, isNewConfig = false) {
const name = row.querySelector('.editName').value;
const url = row.querySelector('.editUrl').value;
const index = isNewConfig ? -1 : Array.from(document.getElementById('configList').children).indexOf(row);
const errorMsg = checkConfig(name, url, index);
if (errorMsg) {
showError(errorMsg);
return;
}
if (isNewConfig) {
const newConfig = {name, url};
configs.push(newConfig);
updateStorage('configs', configs);
} else {
const config = configs[index];
config.name = name;
if (config.url === chatbotSrc) {
chatbotSrc = url;
updateStorage('chatId', '');
updateStorage('shareId', '');
chrome.runtime.sendMessage({
action: "startRequestInterception",
chatbotSrc: chatbotSrc
});
}
config.url = url;
updateStorage('configs', configs);
updateStorage('chatbotSrc', chatbotSrc);
}
loadConfigs(configs, chatbotSrc);
row.remove();
enableAllEditButtons();
}
function handleCancelButtonClick(row, isNewConfig = false) {
if (isNewConfig) {
row.remove();
} else {
const index = Array.from(document.getElementById('configList').children).indexOf(row);
const config = configs[index];
row.querySelector('td:nth-child(1)').textContent = config.name;
row.querySelector('td:nth-child(2)').textContent = config.url;
row.querySelector('.editButton').disabled = false;
// 移除编辑模式下的确认和取消按钮
const iconContainer = row.querySelector('td:nth-child(3) > div');
if (iconContainer) {
iconContainer.remove();
}
}
enableAllEditButtons();
}
async function handleShowChatBotChange(showChatBot) {
await updateStorage('showChatBot', showChatBot);
}
async function handleChatBotWidthChange(width) {
const parsedWidth = parseInt(width);
if (!isNaN(parsedWidth)) {
await updateStorage('chatBotWidth', parsedWidth);
}
}
async function handleChatBotHeightChange(height) {
const parsedHeight = parseInt(height);
if (!isNaN(parsedHeight)) {
await updateStorage('chatBotHeight', parsedHeight);
}
}
function disableAllEditButtons() {
const allEditButtons = document.querySelectorAll('.editButton');
allEditButtons.forEach(button => {
button.disabled = true;
});
}
function enableAllEditButtons() {
const allEditButtons = document.querySelectorAll('.editButton');
allEditButtons.forEach(button => {
button.disabled = false;
});
}