//
// Set default icon
// Use
as storage
//
async function getDefaultIcon() {
function getStoredIcon(result) {
return result.iconMime && result.icon;
}
function onStoredIconError() {
return false;
}
const getIcon = browser.storage.sync.get(["iconMime", "icon"]);
const iconStored = await getIcon.then(getStoredIcon, onStoredIconError);
if (!iconStored) {
const toDataURL = (url) =>
fetch(url)
.then((response) => response.blob())
.then(
(blob) =>
new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onloadend = () => resolve(reader.result);
reader.onerror = reject;
reader.readAsDataURL(blob);
})
);
// Convert image to storage param
let { iconMime, iconBase64 } = await toDataURL("icons/blank-icon.png").then(
(dataUrl) => {
const data = dataUrl.split(":").pop().split(",");
return { iconMime: data[0].split(";")[0], iconBase64: data[1] };
}
);
// Store default icon (base64)
browser.storage.sync.set({
iconMime: iconMime,
icon: iconBase64,
});
// Store in HTML
const iconDiv = document.getElementById("icon");
iconDiv.setAttribute("data-icon-mime", iconMime);
iconDiv.setAttribute("data-icon", iconBase64);
}
}
//
// Get window startup state
//
async function getStartupState() {
function getStartupState(result) {
const startMinimized = result.startMinimized || "false";
return startMinimized === "true" ? "minimized" : "normal";
}
function onStartupStateError() {
return "normal";
}
const getState = browser.storage.sync.get("startMinimized");
return await getState.then(getStartupState, onStartupStateError);
}
//
// Get minimize on close state
//
async function getMinimizeOnClose() {
function getMinimizeOnClosePref(result) {
const minimizeOnClose = result.minimizeOnClose || "true";
return minimizeOnClose === "true";
}
function onMinimizeOnClosePrefError() {
return true;
}
const getState = browser.storage.sync.get("minimizeOnClose");
return await getState.then(
getMinimizeOnClosePref,
onMinimizeOnClosePrefError
);
}
//
// Check filters
//
function checkFilters(filters) {
let newFilters = [];
if (filters === undefined) {
// Create base filters
for (const account of SysTrayX.Messaging.accounts) {
const inbox = account.folders.filter((folder) => folder.type == "inbox");
if (inbox.length > 0) {
let folder = { ...inbox[0], accountName: account.name };
delete folder.type;
delete folder.subFolders;
newFilters.push({
unread: true,
folder: folder,
});
}
}
//
// Store the converted filters
//
browser.storage.sync.set({
filters: newFilters,
});
} else if (filters.length > 0) {
// Check the format
// Find a folder in a account structure
function findFolder(accountId, path) {
const account = SysTrayX.Messaging.accounts.filter(
(account) => account.id === accountId
);
if (SysTrayX.browserInfo.version.split(".")[0] < 74) {
//
// Search the pre TB74 account structure
//
const folder = account[0].folders.filter(
(folder) => folder.path === path
);
const folders = account[0].folders.filter((folder) =>
folder.path.startsWith(path)
);
if (folders.length === 0) {
return undefined;
} else if (folders.length === 1) {
return folder[0].name;
} else {
return "^ Add base folder";
}
} else {
//
// Search the TB74+ account structure
//
let arrayOfFolders = [];
function traverse(folders, path) {
if (!folders) {
return;
}
for (let f of folders) {
if (f.path === path) arrayOfFolders.push(f);
traverse(f.subFolders, path);
}
}
traverse(account[0].folders, path);
if (arrayOfFolders.length === 0) {
return undefined;
} else if (arrayOfFolders[0].subFolders.length > 0) {
return "^ Add base folder";
} else {
return arrayOfFolders[0].name;
}
}
}
if (filters[0].folder.accountName === undefined) {
// Old format, convert
console.log("Converting old filters");
// Create an id -> name map
accountNames = {};
for (const account of SysTrayX.Messaging.accounts) {
accountNames[account.id] = account.name;
}
for (let i = 0; i < filters.length; ++i) {
let filter = filters[i];
const accountName = accountNames[filter.folder.accountId];
if (accountName === undefined) {
continue;
}
// Account still active
filter.folder.accountName = accountName;
const name = findFolder(filter.folder.accountId, filter.folder.path);
if (name === undefined) {
continue;
}
// Folder still active
filter.folder.name = name;
// Store the new filter
newFilters.push(filter);
}
//
// Store the converted filters
//
browser.storage.sync.set({
filters: newFilters,
});
} else {
// Need to check if the accounts still exist
// Create an id -> name map
accountNames = {};
for (const account of SysTrayX.Messaging.accounts) {
accountNames[account.id] = account.name;
}
let filtersChanged = false;
for (let i = 0; i < filters.length; ++i) {
let filter = filters[i];
const accountName = accountNames[filter.folder.accountId];
if (accountName === undefined) {
let filtersChanged = true;
continue;
}
const name = findFolder(filter.folder.accountId, filter.folder.path);
if (name === undefined) {
let filtersChanged = true;
continue;
}
// Store the new filter
newFilters.push(filter);
}
if (filtersChanged) {
//
// Store the converted filters
//
browser.storage.sync.set({
filters: newFilters,
});
}
}
}
return newFilters;
}
//
// Get filters
//
async function getFilters() {
function getFiltersCb(result) {
const filters = result.filters || undefined;
const newFilters = checkFilters(filters);
return newFilters;
}
function onFiltersError() {
return undefined;
}
const getFiltersStorage = browser.storage.sync.get("filters");
return await getFiltersStorage.then(getFiltersCb, onFiltersError);
}
//
// Get count type
//
async function getCountType() {
function getCountTypeCb(result) {
return result.countType || "0";
}
function onCountTypeError() {
return undefined;
}
const getCountType = browser.storage.sync.get("countType");
return await getCountType.then(getCountTypeCb, onCountTypeError);
}