Revision loading, sync isses fix

This commit is contained in:
2025-09-24 07:34:25 +00:00
parent 4f120b68f5
commit 9f7f4c470e
5 changed files with 143 additions and 120 deletions

View File

@@ -1,126 +1,54 @@
function saveRevision(source) {
console.log('Syncing started from: ' + source);
import { createBookmarks, removeBookmarks } from "./bookmark.js";
import { saveRevision, getRevision } from "./revision.js";
chrome.bookmarks.getTree(async (tree) => {
const apiUrl = await chrome.storage.sync.get('apiUrl');
const syncToken = await chrome.storage.sync.get("syncToken");
if (!apiUrl || !syncToken)
return;
const savedRev = await chrome.storage.sync.get('revId');
const url = apiUrl.apiUrl + '/saveRevision';
const options = {
headers: {
'content-type': 'application/json',
'syncToken': syncToken.syncToken
},
method: 'POST',
body: JSON.stringify({
'revId': savedRev.revId,
'bookmarks': tree
})
};
try {
const response = await fetch(url, options);
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
const data = await response.json(); // Convert to JSON
chrome.storage.sync.set({ revId: data.revId });
} catch (e) {
// TODO GD: Indicate error
}
});
const syncBookmarks = async (id, bookmark) => {
console.log('Syncing bookmarks!');
await saveRevision();
}
async function getRevision() {
const apiUrl = await chrome.storage.sync.get('apiUrl');
const syncToken = await chrome.storage.sync.get("syncToken");
if (!apiUrl || !syncToken)
const loadBookmarks = async () => {
const data = await getRevision();
if (!data)
return;
const url = apiUrl.apiUrl + '/getRevision';
const options = {
headers: {
'content-type': 'application/json',
'syncToken': syncToken.syncToken
},
method: 'GET'
};
try {
const response = await fetch(url, options);
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
const data = await response.json(); // Convert to JSON
const savedRev = await chrome.storage.sync.get('revId');
if (data.revId === savedRev.revId)
return;
chrome.storage.sync.set({ revId: data.revId });
removeAllChildren("1", () => createBookmarkTree(data.bookmarks, "1"));
removeAllChildren("2", () => createBookmarkTree(data.bookmarks, "2"));
} catch (e) {
// TODO GD: Indicate error
const savedRev = await chrome.storage.sync.get('revId');
if (data.revId === savedRev.revId) {
console.log('Same revision ID, no update required');
return;
}
removeListeners();
chrome.storage.sync.set({ revId: data.revId });
// TODO GD: "Raw" replacement, make this more efficient to avoid flickering
for (var child of data.bookmarks[0].children) {
await removeBookmarks(child.id);
await createBookmarks(child.children, child.id);
}
addListeners();
}
// Recursively delete all children
function removeAllChildren(parentId, callback) {
chrome.bookmarks.getChildren(parentId, (children) => {
if (!children || children.length === 0) return callback?.();
let count = children.length;
children.forEach((child) => {
if (child.url) {
chrome.bookmarks.remove(child.id, () => {
if (--count === 0) callback?.();
});
} else {
removeAllChildren(child.id, () => {
chrome.bookmarks.remove(child.id, () => {
if (--count === 0) callback?.();
});
});
}
});
});
function removeListeners() {
chrome.bookmarks.onCreated.removeListener(syncBookmarks);
chrome.bookmarks.onRemoved.removeListener(syncBookmarks);
chrome.bookmarks.onChanged.removeListener(syncBookmarks);
chrome.bookmarks.onMoved.removeListener(syncBookmarks);
chrome.bookmarks.onChildrenReordered.removeListener(syncBookmarks);
chrome.bookmarks.onImportEnded.removeListener(syncBookmarks);
}
// Sync events
function addListeners() {
chrome.bookmarks.onCreated.addListener(syncBookmarks);
chrome.bookmarks.onRemoved.addListener(syncBookmarks);
chrome.bookmarks.onChanged.addListener(syncBookmarks);
chrome.bookmarks.onMoved.addListener(syncBookmarks);
chrome.bookmarks.onChildrenReordered.addListener(syncBookmarks);
chrome.bookmarks.onImportEnded.addListener(syncBookmarks);
}
chrome.bookmarks.onCreated.addListener((id, bookmark) => {
saveRevision('onCreated');
});
loadBookmarks();
chrome.bookmarks.onRemoved.addListener((id, removeInfo) => {
saveRevision('onRemoved');
});
chrome.bookmarks.onChanged.addListener((id, changeInfo) => {
saveRevision('onChanged');
});
chrome.bookmarks.onMoved.addListener((id, moveInfo) => {
saveRevision('onMoved');
});
chrome.bookmarks.onChildrenReordered.addListener((id, reorderInfo) => {
saveRevision('onChildrenReordered');
});
chrome.bookmarks.onImportEnded.addListener(() => {
saveRevision('onImportEnded');
});
getRevision();
setInterval(getRevision, 5000);
// TODO GD: Make this websocket based
setInterval(loadBookmarks, 10000);