Skip to content

Instantly share code, notes, and snippets.

@woky
Created June 4, 2018 23:29
Show Gist options
  • Save woky/9489b9b2885dc4c9a4510ced718023ed to your computer and use it in GitHub Desktop.
Save woky/9489b9b2885dc4c9a4510ced718023ed to your computer and use it in GitHub Desktop.
import { Pinboard } from './Pinboard.js';
////////////////////////////////////////////////////////////////////////////////
const CMD_BOOKMARK = 'bookmark';
const CMD_READLATER = 'readLater';
const FLAG_TOREAD = 1;
let settings = {
syncPeriod: 10,
apiToken: null
};
let pb;
let bookmarksByUrl = new Map();
let localUpdateTime = 0;
let syncing = false;
let addTabsToUrls = new Map();
////////////////////////////////////////////////////////////////////////////////
function openAddTab(tab) {
let u = encodeURIComponent(tab.url);
let t = encodeURIComponent(tab.title);
let url = `https://pinboard.in/add?url=${u}&title=${t}&showtags=yes`;
chrome.tabs.create({ openerTabId: tab.id, url: url }, addTab => { addTabsToUrls.set(addTab.id, tab.url); });
}
async function toggleReadLater(tab) {
let params = {
url: tab.url,
description: tab.title,
};
let existing = (await pb.get({ url: tab.url }))[0];
if (existing) {
params.extended = existing.extended;
params.tags = existing.tags;
params.dt = existing.time;
params.replace = 'yes';
params.shared = existing.shared;
}
params.toread = (!existing || existing.toread == 'no') ? 'yes' : 'no';
if (params.toread == 'no' && params.tags == '') {
await pb.delete(tab.url);
bookmarksByUrl.delete(tab.url);
}
else {
await pb.add(params);
bookmarksByUrl.set(tab.url, params.toread == 'yes' ? FLAG_TOREAD : 0);
}
updateTabBadge(tab);
}
function bookmarkTab(tab, command) {
if (!settings.apiToken)
return;
switch (command) {
case CMD_READLATER:
toggleReadLater(tab);
break;
case CMD_BOOKMARK:
openAddTab(tab);
break;
default:
throw new Error('Unknown command: ' + command);
}
}
function bookmarkCurrentTab(command) {
chrome.tabs.query({ active: true, currentWindow: true }, tabs => {
let tab = tabs[0];
if (tab)
bookmarkTab(tab, command);
});
}
function updateTabBadge(tab) {
if (!tab.url)
return;
let flag = bookmarksByUrl.get(tab.url);
if (flag != null) {
let color = flag & FLAG_TOREAD ? '#CC0033' : '#009933';
chrome.browserAction.setBadgeText({ text: '✓', tabId: tab.id });
chrome.browserAction.setBadgeBackgroundColor({ color: color, tabId: tab.id });
}
else
chrome.browserAction.setBadgeText({ text: '', tabId: tab.id });
}
function addBookmark(b) {
let flag = 0;
if (b.toread == 'yes')
flag |= FLAG_TOREAD;
bookmarksByUrl.set(b.href, flag);
}
function updateTabBadges() {
chrome.tabs.query({}, tabs => {
for (let tab of tabs)
updateTabBadge(tab);
});
}
async function syncBookmarks() {
if (syncing)
return;
syncing = true;
bookmarksByUrl.clear();
try {
let remoteUpdateTime = await pb.lastUpdateTime();
if (remoteUpdateTime > localUpdateTime) {
for (let b of await pb.all())
addBookmark(b);
localUpdateTime = remoteUpdateTime;
}
}
catch (e) {
// TODO signal to user
console.error(e);
}
finally {
syncing = false;
}
updateTabBadges();
}
async function updateBookmark(url) {
bookmarksByUrl.delete(url);
for (let b of await pb.get({ url: url }))
addBookmark(b);
updateTabBadges();
}
function restartSync() {
chrome.alarms.clearAll();
pb = null;
chrome.storage.local.get(settings, (newSettings) => {
settings = newSettings;
if (settings.apiToken != null && settings.syncPeriod >= 5) {
pb = new Pinboard(settings.apiToken);
chrome.alarms.create({ periodInMinutes: settings.syncPeriod });
}
});
}
////////////////////////////////////////////////////////////////////////////////
chrome.runtime.onMessage.addListener((msg, sender) => {
switch (msg) {
case 'closeAddTab':
let url = addTabsToUrls.get(sender.tab.id);
if (url) {
addTabsToUrls.delete(sender.tab.id);
chrome.tabs.remove(sender.tab.id);
updateBookmark(url);
}
else
console.error('Close from unknown tab. URL: ' + sender.tab.url);
break;
case 'restartSync':
restartSync();
break;
default:
console.error('Unknown message: ' + msg);
}
});
chrome.commands.onCommand.addListener(bookmarkCurrentTab);
chrome.browserAction.onClicked.addListener(tab => {
bookmarkTab(tab, CMD_BOOKMARK);
});
chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
updateTabBadge(tab);
});
chrome.alarms.onAlarm.addListener(syncBookmarks);
restartSync();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment