const apiKeyRegex = /sk-[a-zA-Z0-9]{48}/;
const settings = [
{ key: "textCompletion", name: "text-completion" },
{ key: "textImprovement", name: "text-improvement" },
{ key: "textAsk", name: "text-ask" },
];
function addMessage(message) {
$("#message-box").append(`
${message}
`);
}
function addErrorMessage(message) {
$("#message-box").append(`${message}
`);
}
function clearMessages() {
$("#message-box").empty();
}
async function refreshStorage() {
chrome.storage.local.get("openAIAPIKey").then(({ openAIAPIKey }) => {
$("#api-token-form .api-token-status").text(chrome.runtime.lastError || !openAIAPIKey ? "not set" : "set");
});
chrome.storage.local.get(settings.map(({ key }) => key)).then((storage) => {
settings.forEach(({ key, name }) => {
$(`#settings-form input[name='${name}']:checkbox`).prop("checked", storage[key]);
});
});
}
async function handleAPITokenSet(event) {
event.preventDefault();
event.stopPropagation();
clearMessages();
const input = $("#api-token-form").find("input[name='api-token']");
const openAIAPIKey = input.val();
input.val("");
if (!openAIAPIKey || !apiKeyRegex.test(openAIAPIKey)) {
addErrorMessage("Invalid API Token.");
return;
}
try {
await chrome.storage.local.set({ openAIAPIKey });
} catch (error) {
console.log(error);
addErrorMessage("Failed to set API Token.");
return;
}
await refreshStorage();
}
async function handleAPITokenClear(event) {
event.preventDefault();
event.stopPropagation();
clearMessages();
try {
await chrome.storage.local.remove("openAIAPIKey");
} catch (error) {
console.log(error);
addErrorMessage("Failed to remove API Token.");
return;
}
await refreshStorage();
}
function makeHandleSettingChange(key) {
return async (event) => {
event.preventDefault();
event.stopPropagation();
clearMessages();
const value = event.target.checked;
try {
await chrome.storage.local.set({ [key]: value });
} catch (error) {
console.log(error);
addErrorMessage(`Failed to set ${key} setting.`);
return;
}
await refreshStorage();
};
}
$(document).ready(async function () {
$("#api-token-form .submit").on("click", handleAPITokenSet);
$("#api-token-form .clear").on("click", handleAPITokenClear);
settings.forEach(({ key, name }) =>
$(`#settings-form input[name='${name}']:checkbox`).on("change", makeHandleSettingChange(key))
);
await refreshStorage();
});