diff --git a/README.md b/README.md
index 21e7b2fe..d105bf5a 100644
--- a/README.md
+++ b/README.md
@@ -159,3 +159,4 @@ Simplified Chinese - [am1006](https://github.com/am1006), [CarimoWuling](https:/
Czech - Menal
German - [basti564](https://twitter.com/basti564)
Catalan - [elmees21](https://twitter.com/elmees21)
+Swedish - [actuallyaridan](https://twitter.com/actuallyaridan)
diff --git a/layouts/settings/index.html b/layouts/settings/index.html
index 6332d566..72b219cc 100644
--- a/layouts/settings/index.html
+++ b/layouts/settings/index.html
@@ -94,6 +94,7 @@
__MSG_oldtwitter_settings__
+
diff --git a/layouts/settings/script.js b/layouts/settings/script.js
index 21537efd..8665e9f0 100644
--- a/layouts/settings/script.js
+++ b/layouts/settings/script.js
@@ -170,6 +170,44 @@ function renderUserData() {
});
}
+async function writeCSSToDB(cssData) {
+ let db = await openDatabase();
+ return new Promise((resolve, reject) => {
+ let transaction = db.transaction(["cssStore"], "readwrite");
+ let store = transaction.objectStore("cssStore");
+ let request = store.put({ id: "customCSS", css: cssData });
+
+ request.onerror = function(event) {
+ reject("Error writing CSS to DB");
+ };
+
+ request.onsuccess = function(event) {
+ resolve();
+ };
+ });
+}
+
+async function readCSSFromDB() {
+ let db = await openDatabase();
+ return new Promise((resolve, reject) => {
+ let transaction = db.transaction(["cssStore"]);
+ let objectStore = transaction.objectStore("cssStore");
+ let request = objectStore.get("customCSS");
+
+ request.onerror = function(event) {
+ reject("Error reading CSS");
+ };
+
+ request.onsuccess = function(event) {
+ if (request.result) {
+ resolve(request.result.css);
+ } else {
+ resolve('');
+ }
+ };
+ });
+}
+
setTimeout(async () => {
if(!vars) {
await loadVars();
@@ -853,12 +891,14 @@ setTimeout(async () => {
}
});
customCSSSave.addEventListener('click', () => {
- chrome.storage.sync.set({
- customCSS: customCSS.value
- }, () => {
- let event = new CustomEvent('customCSS', { detail: customCSS.value });
- customCSSBus.postMessage({type: 'css'});
+ let cssValue = customCSS.value;
+
+ writeCSSToDB(cssValue).then(() => {
+ let event = new CustomEvent('customCSS', { detail: cssValue });
+ customCSSBus.postMessage({ type: 'css' });
document.dispatchEvent(event);
+ }).catch(error => {
+ console.error("Error saving CSS to DB:", error);
});
});
autotranslateLanguageList.addEventListener('change', () => {
@@ -996,8 +1036,9 @@ setTimeout(async () => {
showQuoteCount.checked = !!vars.showQuoteCount;
hideUnfollowersPage.checked = !!vars.hideUnfollowersPage;
if(vars.customCSS) {
- customCSS.value = vars.customCSS;
+ writeCSSToDB(vars.customCSS)
}
+ customCSS.value = await readCSSFromDB();
document.getElementById('stt-div').hidden = vars.timelineType !== 'algo' && vars.timelineType !== 'algov2';
savePreferredQuality.checked = !!vars.savePreferredQuality;
showOriginalImages.checked = !!vars.showOriginalImages;
@@ -1123,10 +1164,11 @@ setTimeout(async () => {
});
input.click();
});
- document.getElementById('export-style').addEventListener('click', () => {
+ document.getElementById('export-style').addEventListener('click', async () => {
+ let customCssfromDb = await readCSSFromDB();
let json = {
customCSSVariables: vars.customCSSVariables,
- customCSS: vars.customCSS,
+ customCSS: customCssfromDb,
font: vars.font,
tweetFont: vars.tweetFont,
linkColor: vars.linkColor
diff --git a/manifest.json b/manifest.json
index baafaab2..0e477af7 100644
--- a/manifest.json
+++ b/manifest.json
@@ -1,7 +1,7 @@
{
"name": "Old Twitter Layout (2023)",
"description": "__MSG_ext_description__",
- "version": "1.8.1.4",
+ "version": "1.8.1.5",
"manifest_version": 3,
"homepage_url": "https://github.com/dimdenGD/OldTwitter",
"background": {
diff --git a/scripts/injection.js b/scripts/injection.js
index cc62f96f..28c00d95 100644
--- a/scripts/injection.js
+++ b/scripts/injection.js
@@ -139,7 +139,7 @@ if (
url.searchParams.set('newtwitter', 'true');
location.replace(url);
}
-const LANGUAGES = ["en", "ru", "uk", "fr", "pt_BR", "es", "el", "ro", "tl", "lv", "he", "ne", "nl", "ja", "tr", "it", "ar", "th", "ko", "pl", "vi", "zh_CN", "zh_TW", "cs", "de", "ca"];
+const LANGUAGES = ["en", "ru", "uk", "fr", "pt_BR", "es", "el", "ro", "tl", "lv", "he", "ne", "nl", "ja", "tr", "it", "ar", "th", "ko", "pl", "vi", "zh_CN", "zh_TW", "cs", "de", "ca", "sv"];
const TRANSLATORS = {
"ru": ["dimden", "https://dimden.dev/"],
"uk": ["dimden", "https://dimden.dev/"],
@@ -205,7 +205,8 @@ const TRANSLATORS = {
],
"cs": ["Menal"],
"de": ["basti564", "https://twitter.com/basti564"],
- "ca": ["elmees21", "https://twitter.com/elmees21"]
+ "ca": ["elmees21", "https://twitter.com/elmees21"],
+ "sv": ["actuallyaridan", "https://twitter.com/actuallyaridan"]
};
let LOC = {};
let LOC_EN = {};
@@ -226,20 +227,89 @@ function isDark() {
return hours < 9 || hours >= 19;
}
let customCSS, profileCSS = false;
+
+async function openDatabase() {
+ return new Promise((resolve, reject) => {
+ let request = indexedDB.open("CustomCSSDatabase", 1);
+
+ request.onerror = function(event) {
+ reject('Database error: ' + event.target.errorCode);
+ };
+
+ request.onsuccess = function(event) {
+ resolve(event.target.result);
+ };
+
+ // Only runs if the database was just created (like on first run)
+ request.onupgradeneeded = function(event) {
+ let db = event.target.result;
+ db.createObjectStore("cssStore", { keyPath: "id" });
+ };
+ });
+}
+
+async function readCSSFromDB() {
+ let db = await openDatabase();
+ return new Promise((resolve, reject) => {
+ let transaction = db.transaction(["cssStore"]);
+ let objectStore = transaction.objectStore("cssStore");
+ let request = objectStore.get("customCSS");
+
+ request.onerror = function(event) {
+ reject("Error reading CSS");
+ };
+
+ request.onsuccess = function(event) {
+ if (request.result) {
+ resolve(request.result.css);
+ } else {
+ resolve('');
+ }
+ };
+ });
+}
+
+async function writeCSSToDB(cssData) {
+ let db = await openDatabase();
+ return new Promise((resolve, reject) => {
+ let transaction = db.transaction(["cssStore"], "readwrite");
+ let store = transaction.objectStore("cssStore");
+ let request = store.put({ id: "customCSS", css: cssData });
+
+ request.onerror = function(event) {
+ reject("Error writing CSS to DB");
+ };
+
+ request.onsuccess = function(event) {
+ resolve();
+ };
+ });
+}
+
async function updateCustomCSS() {
let data = await new Promise(resolve => {
chrome.storage.sync.get(['customCSS'], data => {
resolve(data);
});
});
- if(!data.customCSS) data.customCSS = '';
+
+ if(data.customCSS) {
+ writeCSSToDB(data.customCSS)
+ chrome.storage.sync.remove('customCSS');
+ }
+ data.customCSS = await readCSSFromDB();
+
if(profileCSS) return;
+
if(customCSS) customCSS.remove();
+
customCSS = document.createElement('style');
customCSS.id = 'oldtwitter-custom-css';
customCSS.innerHTML = data.customCSS;
- if(document.head) document.head.appendChild(customCSS);
- else {
+
+ if(document.head) {
+ document.head.appendChild(customCSS);
+ } else {
let int = setInterval(() => {
if(document.head) {
clearInterval(int);
@@ -248,6 +318,7 @@ async function updateCustomCSS() {
}, 100);
}
}
+
async function updateCustomCSSVariables() {
let root = document.querySelector(":root");
let data = await new Promise(resolve => {