Skip to content

Commit d8de537

Browse files
authored
Merge pull request #63 from rohanb10/repeat
Merge Repeated Snoozes into the main branch
2 parents 195345e + 9e4b230 commit d8de537

File tree

11 files changed

+107
-107
lines changed

11 files changed

+107
-107
lines changed

build.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ def minifyFilesInDirectory(directory, ext, url):
4444
for root, dirs, files in os.walk(directory):
4545
for name in files:
4646
chars = len(ext)
47-
if name.endswith('.min' + ext):
47+
if ext == '.js' or name.endswith('.min' + ext):
48+
# if name.endswith(ext):
4849
shutil.copyfile(os.path.join(root, name), FOLDER + '/' + directory + '/' + name)
4950
elif name.endswith(ext):
5051
print('\n⧖ Minifying ' + '\x1b[1;32;33m' + name + '\x1b[0m ...', end='')
@@ -67,7 +68,7 @@ def replaceInHTMLFiles(original, replacement):
6768
file.write(data)
6869
file.close()
6970

70-
minifyFilesInDirectory('scripts', '.js', 'https://javascript-minifier.com/raw')
71+
minifyFilesInDirectory('scripts', '.js', 'https://www.toptal.com/developers/javascript-minifier/raw')
7172
minifyFilesInDirectory('styles', '.css', 'https://cssminifier.com/raw')
7273

7374
#

html/nap-room.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
</div>
1818
<div tabindex="0" data-hover="Settings" class="settings"><img src="../icons/settings.png"></div>
1919
<div class="changelog-overlay">
20-
<div id="changelog"><!-- <div id="changelog" class="disabled"> -->
20+
<div id="changelog">
21+
<!-- <div id="changelog" class="disabled"> -->
2122
<div class="changelog-container">
2223
<h2 class="center">Snoozz has been updated <span id="v"></span>&nbsp;🎉</h2>
2324
<p>This version is a huge update that brings in one of the most requested features.</p>

html/rise-and-shine.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
<div class="tab-list"></div>
3333
</div>
3434

35+
<script type="text/javascript" src="../scripts/gradient.min.js"></script>
3536
<script type="text/javascript" src="../scripts/dayjs.min.js"></script>
3637
<script type="text/javascript" src="../scripts/common.js"></script>
3738
<script type="text/javascript" src="../scripts/rise.js"></script>

html/settings.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ <h4>Custom Keyboard Shortcuts</h4>
233233
<div tabindex="0" class="btn"><div></div></div>
234234
<div class="mini firefox-info">
235235
<strong>Instructions</strong>
236-
<div>Firefox shortcuts can only be configured on a different page, outside of this extension. To configure your custom shortcuts:</div>
236+
<div>Firefox shortcuts can only be <a target="_blank" href="https://support.mozilla.org/en-US/kb/manage-extension-shortcuts-firefox">configured</a> on a different page, outside of this extension. To configure your custom shortcuts:</div>
237237
<ol>
238238
<li>Open the Firefox Add-Ons page in a new tab: <u><code>about:addons</code></u> (Click URL to copy).</li>
239239
<li>Click on the <a tabindex="0" target="_blank" href="https://bug1303384.bmoattachments.org/attachment.cgi?id=9051647">gear icon</a> in the top right and select <strong>Manage Extension Shortcuts</strong>.</li>

manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "Snoozz - Snooze Tabs & Windows for later",
33
"short_name": "Snoozz",
44
"description": "Declutter your browser by snoozing tabs and windows until you actually need them.",
5-
"version": "2.4.4.3",
5+
"version": "2.5.0",
66

77
"icons": {
88
"128": "icons/ext-icon-128.png",

scripts/background.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,10 @@ async function wakeUpTask(cachedTabs) {
5858

5959
var debounce;
6060
async function setNextAlarm(tabs) {
61-
var next = sleeping(tabs).filter(t => t.wakeUpTime && !t.paused).reduce((t1,t2) => t1.wakeUpTime < t2.wakeUpTime ? t1 : t2);
62-
if (next && next.wakeUpTime <= dayjs().valueOf()) {
61+
var next = sleeping(tabs).filter(t => t.wakeUpTime && !t.paused);
62+
next = next.length ? next.reduce((t1,t2) => t1.wakeUpTime < t2.wakeUpTime ? t1 : t2) : undefined;
63+
if (!next) return;
64+
if (next.wakeUpTime <= dayjs().valueOf()) {
6365
clearTimeout(debounce)
6466
debounce = setTimeout(_ => wakeMeUp(tabs), 3000)
6567
} else {
@@ -198,8 +200,8 @@ function sendToLogs([which, p1]) {
198200

199201
async function init() {
200202
var allTabs = await getSnoozedTabs();
201-
if (allTabs && allTabs.length && allTabs.some(t => t.startUp && !t.opened)) {
202-
allTabs.filter(t => t.startUp && !t.opened).forEach(t => t.wakeUpTime = dayjs().subtract(10, 's').valueOf());
203+
if (allTabs && allTabs.length && allTabs.some(t => (t.startUp || (t.repeat && t.repeat.type === 'startup')) && !t.opened)) {
204+
allTabs.filter(t => (t.startUp || (t.repeat && t.repeat.type === 'startup')) && !t.opened).forEach(t => t.wakeUpTime = dayjs().subtract(10, 's').valueOf());
203205
await saveTabs(allTabs);
204206
}
205207
await wakeUpTask();
@@ -210,7 +212,7 @@ chrome.runtime.onInstalled.addListener(async details => {
210212
setUpExtension();
211213
if (chrome.runtime.setUninstallURL) chrome.runtime.setUninstallURL('https://tally.so/r/mO5GYw');
212214
if (details && details.reason && details.reason == 'update' && details.previousVersion && details.previousVersion != chrome.runtime.getManifest().version) {
213-
if (chrome.runtime.getManifest().version.search(/^\d\.\d\.\d$/) !== 0) return; // skip if minor version
215+
if (chrome.runtime.getManifest().version.search(/^\d{1,3}(\.\d{1,3}){1,2}$/) !== 0) return; // skip if minor version
214216
await new Promise(r => chrome.storage.local.set({'updated': true}, r));
215217
if (chrome.notifications) createNotification(null, 'Snoozz has been updated', 'icons/logo.svg', 'Click here to see what\'s new.', true);
216218
}

scripts/common.js

Lines changed: 34 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -197,23 +197,37 @@ async function openWindow(t, automatic = false) {
197197
return;
198198
}
199199

200-
async function dupeSnoozedTab(tabId, snoozeTime) {
200+
async function editSnoozed(tabId, snoozeTime, duplicating) {
201201
var t = await getSnoozedTabs(tabId);
202202
['startUp', 'opened', 'deleted', 'repeat', 'paused'].forEach(prop => delete t[prop]);
203203
t.wakeUpTime = snoozeTime === 'startup' ? dayjs().add(20, 'y').valueOf() : dayjs(snoozeTime).valueOf(),
204204
t.timeCreated = dayjs().valueOf();
205-
t.id = getRandomId();
205+
t.id = duplicating ? getRandomId() : t.id;
206206
if (snoozeTime === 'startup') t.startUp = true;
207207
await saveTab(t);
208-
return {duped: true}
208+
return duplicating ? {duped: true} : {edited: true}
209209
}
210210

211-
async function editSnoozeTime(tabId, snoozeTime) {
211+
async function editRecurringSnoozed(tabId, data, duplicating) {
212+
var t = await getSnoozedTabs(tabId);
213+
['startUp', 'opened', 'deleted', 'paused'].forEach(prop => delete t[prop]);
214+
t.wakeUpTime = await calculateNextSnoozeTime(data);
215+
t.timeCreated = dayjs().valueOf();
216+
if (data.repeat === 'startup') t.startUp = true;
217+
t.repeat = data;
218+
t.id = duplicating ? getRandomId() : t.id;
219+
await saveTab(t);
220+
return duplicating ? {duped: true} : {edited: true}
221+
}
222+
223+
async function editSnoozeRecurring(tabId, data, ) {
212224
var t = await getSnoozedTabs(tabId);
213225
['startUp', 'opened', 'deleted', 'repeat', 'paused'].forEach(prop => delete t[prop]);
214-
t.wakeUpTime = snoozeTime === 'startup' ? dayjs().add(20, 'y').valueOf() : dayjs(snoozeTime).valueOf(),
226+
if (data.repeat === 'startup') t.startUp = true;
227+
t.wakeUpTime = await calculateNextSnoozeTime(data);
215228
t.modifiedTime = dayjs().valueOf();
216-
if (snoozeTime === 'startup') t.startUp = true;
229+
t.repeat = data;
230+
t.paused = false;
217231
await saveTab(t);
218232
return {edited: true}
219233
}
@@ -224,7 +238,7 @@ async function snoozeTab(snoozeTime, overrideTab) {
224238
if (!activeTab || !activeTab.url) return {};
225239
var sleepyTab = {
226240
id: getRandomId(),
227-
title: activeTab.title ?? getBetterUrl(activeTab.url),
241+
title: activeTab.title || getBetterUrl(activeTab.url),
228242
url: activeTab.url,
229243
...activeTab.pinned ? {pinned: true} : {},
230244
wakeUpTime: snoozeTime === 'startup' ? dayjs().add(20, 'y').valueOf() : dayjs(snoozeTime).valueOf(),
@@ -290,14 +304,14 @@ async function snoozeRecurring(target, data) {
290304
if (data.repeat === 'startup') sleepyObj.startUp = true;
291305

292306
sleepyObj.wakeUpTime = await calculateNextSnoozeTime(data);
293-
console.log(dayjs(sleepyObj.wakeUpTime).format('DD/MM/YY HH:mm'));
307+
// console.log(dayjs(sleepyObj.wakeUpTime).format('DD/MM/YY HH:mm'));
294308

295309
if (validTabs.length === 0) return {};
296310
if (validTabs.length === 1 || target === 'tab') {
297311
var activeTab = validTabs && validTabs.length ? validTabs[0] : await getTabsInWindow(true);
298312
if (!activeTab || !activeTab.url) return {};
299313
Object.assign(sleepyObj, {
300-
title: activeTab.title ?? getBetterUrl(activeTab.url),
314+
title: activeTab.title || getBetterUrl(activeTab.url),
301315
url: activeTab.url,
302316
...activeTab.pinned ? {pinned: true} : {},
303317
});
@@ -325,7 +339,7 @@ async function getTimeWithModifier(choice) {
325339
var options = await getOptions(['morning', 'evening', 'popup']);
326340
var modifier = options.popup ? options.popup[choice] : '';
327341
options = upgradeSettings(options);
328-
var m = options[modifier] ?? [dayjs().hour(), dayjs().minute()];
342+
var m = options[modifier] || [dayjs().hour(), dayjs().minute()];
329343
return dayjs(c.time).add(m[0], 'h').add(m[1], 'm');
330344
}
331345

@@ -357,7 +371,7 @@ async function getChoices(which) {
357371
},
358372
'today-morning': {
359373
label: 'This Morning',
360-
repeatLabel: '-',
374+
repeatLabel: '',
361375
time: NOW.startOf('d').add(config.morning[0], 'h').add(config.morning[1], 'm'),
362376
timeString: 'Today',
363377
repeatTime: '',
@@ -368,7 +382,7 @@ async function getChoices(which) {
368382
},
369383
'today-evening': {
370384
label: `Today ${getEveningLabel(config.evening[0])}`,
371-
repeatLabel: `Everyday`,
385+
repeatLabel: `Everyday, Now`,
372386
time: NOW.startOf('d').add(config.evening[0], 'h').add(config.evening[1], 'm'),
373387
timeString: 'Today',
374388
repeatTime: NOW.format(getHourFormat(true)),
@@ -445,9 +459,10 @@ async function getChoices(which) {
445459
}
446460

447461
async function calculateNextSnoozeTime(data) {
448-
console.log(data);
449462
var NOW = dayjs(), TYPE = data.type, [HOUR, MINUTE] = data.time;
450-
if (TYPE === 'hourly') {
463+
if (TYPE === 'startup') {
464+
return NOW.add(20, 'y');
465+
} else if (TYPE === 'hourly') {
451466
var isNextHour = NOW.minute() >= MINUTE ? 1 : 0;
452467
return NOW.startOf('h').add(isNextHour, 'h').minute(MINUTE).valueOf();
453468
} else if (TYPE === 'daily') {
@@ -476,51 +491,6 @@ async function calculateNextSnoozeTime(data) {
476491
return false;
477492
}
478493

479-
// async function calculateNextSnoozeTime(repeat, start, data) {
480-
// var NOW = dayjs(), start = dayjs(start);
481-
// if (repeat === 'custom' && data) {
482-
// var days = [];
483-
// if (data.weekly) {
484-
// var thisWeek = data.weekly, nextWeek = data.weekly.map(day => day + 7);
485-
// days = nextWeek.concat(thisWeek).map(day => dayjs().startOf('w').add(day, 'd').add(start.hour(), 'h').add(start.minute(), 'm'));
486-
// } else if (data.monthly) {
487-
// var thisMonth = data.monthly.filter(d => d <= dayjs().daysInMonth()).map(d => dayjs().startOf('M').date(d).add(start.hour(), 'h').add(start.minute(), 'm'));
488-
// var nextMonth = data.monthly.filter(d => d <= dayjs().add(1, 'M').daysInMonth()).map(d => dayjs().startOf('M').add(1, 'M').date(d).add(start.hour(), 'h').add(start.minute(), 'm'));
489-
// days = nextMonth.concat(thisMonth);
490-
// }
491-
// return days.filter(d => d > NOW).pop();
492-
// } else if (repeat === 'startup') {
493-
// return NOW.add(20, 'y');
494-
// } else if (repeat === 'hourly') {
495-
// var isThisHour = NOW.minute() < start.minute();
496-
// return NOW.startOf('h').add(isThisHour ? 0 : 1, 'h').minute(start.minute());
497-
// } else if (repeat === 'daily') {
498-
// return dayjs().startOf('d').add(1, 'd').hour(NOW.hour()).minute(NOW.minute());
499-
// } else if (repeat === 'daily_morning') {
500-
// var morning = await getOptions('morning');
501-
// var isToday = NOW.hour() < morning[0] || (NOW.hour() === morning[0] && NOW.minute() < morning[1]);
502-
// return NOW.startOf('d').add(isToday ? 0 : 1, 'd').hour(morning[0]).minute(morning[1]);
503-
// } else if (repeat === 'daily_evening') {
504-
// var evening = await getOptions('evening');
505-
// var isToday = NOW.hour() < evening[0] || (NOW.hour() === evening[0] && NOW.minute() < evening[1]);
506-
// return NOW.startOf('d').add(isToday ? 0 : 1, 'd').hour(evening[0]).minute(evening[1]);
507-
// } else if (repeat === 'weekends') {
508-
// var isThisWeek = NOW.day() < 6 || (NOW.day() === 6 && (NOW.hour() < start.hour() || (NOW.hour() === start.hour() && NOW.minute() < start.minute())));
509-
// return NOW.startOf('w').add(isThisWeek ? 0 : 1, 'w').day(6).hour(start.hour()).minute(start.minute());
510-
// } else if (repeat === 'mondays') {
511-
// var isThisWeek = NOW.day() < 1 || (NOW.day() === 1 && (NOW.hour() < start.hour() || (NOW.hour() === start.hour() && NOW.minute() < start.minute())));
512-
// return NOW.startOf('w').add(isThisWeek ? 0 : 1, 'w').day(1).hour(start.hour()).minute(start.minute());
513-
// } else if (repeat === 'weekly') {
514-
// var isThisWeek = NOW.day() < start.day() || (NOW.day() === start.day() && (NOW.hour() < start.hour() || (NOW.hour() === start.hour() && NOW.minute() < start.minute())));
515-
// return NOW.startOf('w').add(isThisWeek ? 0 : 1, 'w').day(start.day()).hour(start.hour()).minute(start.minute());
516-
// } else if (repeat === 'monthly') {
517-
// var isThisMonth = NOW.date() < start.date() || (NOW.date() === start.date() && (NOW.hour() < start.hour() ||( NOW.hour() === start.hour() && NOW.minute() < start.minute()))) ? 0 : 1;
518-
// var isMonthValid = start.date() <= NOW.daysInMonth(isThisMonth, 'M') ? 0 : 1;
519-
// return NOW.startOf('M').add(isThisMonth + isMonthValid, 'M').date(start.date()).hour(start.hour()).minute(start.minute());
520-
// }
521-
// return false;
522-
// }
523-
524494
/* END ASYNC FUNCTIONS */
525495

526496
// var getFaviconUrl = url => `https://icons.duckduckgo.com/ip3/${getHostname(url)}.ico`
@@ -557,10 +527,10 @@ var sleeping = tabs => tabs.filter(t => !t.opened);
557527
var today = tabs => tabs.filter(t => t.wakeUpTime && dayjs(t.wakeUpTime).dayOfYear() === dayjs().dayOfYear() && dayjs(t.wakeUpTime).year() === dayjs().year())
558528

559529
var isDefault = tabs => tabs.title && ['nap room | snoozz', 'settings | snoozz', 'rise and shine | snoozz', 'New Tab', 'Start Page'].includes(tabs.title);
560-
// var isDefault = tabs => false;
561530

562531
var isValid = tabs => tabs.url && ['http', 'https', 'ftp', 'chrome-extension', 'web-extension', 'moz-extension', 'extension'].includes(tabs.url.substring(0, tabs.url.indexOf(':')));
563-
// var isValid = tabs => true;
532+
533+
var isSameYear = (a, b) => dayjs(a).year() === dayjs(b).year();
564534

565535
var capitalize = s => s.charAt(0).toUpperCase() + s.slice(1);
566536

@@ -592,12 +562,13 @@ var clipboard = text => {
592562
}
593563

594564
var formatSnoozedUntil = t => {
595-
if (t.startUp) return `Next ${capitalize(getBrowser())} Launch`;
565+
if (t.startUp || (t.repeat && t.repeat.type === 'startup')) return `Next ${capitalize(getBrowser())} Launch`;
596566
var ts = t.wakeUpTime;
597567
var date = dayjs(ts);
598568
if (date.dayOfYear() === dayjs().dayOfYear()) return (date.hour() > 17 ? 'Tonight' : 'Today') + date.format(` [@] ${getHourFormat(date.minute() !== 0)}`);
599569
if (date.dayOfYear() === dayjs().add(1,'d').dayOfYear()) return 'Tomorrow' + date.format(` [@] ${getHourFormat(date.minute() !== 0)}`);
600570
if (date.week() === dayjs().week()) return date.format(`dddd [@] ${getHourFormat(date.minute() !== 0)}`);
571+
if (date.year() !== dayjs().year()) return date.format(`ddd, MMM D, YYYY`);
601572
return date.format(`ddd, MMM D [@] ${getHourFormat(date.minute() !== 0)}`);
602573
}
603574

@@ -650,7 +621,7 @@ var bgLog = (logs, colors, timestampColor = 'grey') => {
650621
colors.unshift(timestampColor);
651622
colors = colors.flatMap((v,i,a)=>i !== a.length ? [v, ''] : v).map(c => {
652623
var colors = {green:'limegreen', red:'crimson', blue:'dodgerblue', yellow:'gold', pink:'violet', grey:'slategrey', white: 'navajowhite'}
653-
return 'color:' + (colors[c] ?? 'unset')
624+
return 'color:' + (colors[c] || 'unset')
654625
})
655626
console.log(timestamp + logs, ...colors)
656627
}

scripts/nap_room.js

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,10 @@ function search(t, query) {
188188
if (t.startUp && !t.opened && ('start starting launch launching next time open opening').indexOf(query) > -1) return true;
189189
if (!t.opened && ('snoozed sleeping asleep napping snoozzed snoozing snoozzing').indexOf(query) > -1) return true;
190190
if (t.opened && ('manually deleted removed woke awake history').indexOf(query) > -1) return true;
191+
if (t.tabs && t.tabs.length) {
192+
if (t.tabs.map(tt => tt.url.toLowerCase()).some(url => url.indexOf(query) > -1)) return true;
193+
if (t.tabs.map(tt => tt.title.toLowerCase()).some(title => title.indexOf(query) > -1)) return true;
194+
}
191195
// categories
192196
if (matchQuery(query, getTimeGroup(t, 'wakeUpTime', true).map(tg => tg.replace(/_/g, ' ')))) return true;
193197
if (matchQuery(query, getTimeGroup(t, 'timeCreated', true).map(tg => tg.replace(/_/g, ' ')))) return true;
@@ -253,7 +257,7 @@ function buildTabActions(t, tabDiv) {
253257
editMenuItem = wrapInDiv({className: 'overflow-menu-item edit', innerText: 'Edit Snooze Time', tabIndex: 0});
254258
editMenuItem.onclick = _ => openPopupModal(t.id, 'edit', tabDiv.querySelector('img.icon').getAttribute('src') === '../icons/unknown.png');
255259
dupeMenuItem = wrapInDiv({className: 'overflow-menu-item duplicate', innerText: 'Duplicate & Change Time', tabIndex: 0});
256-
dupeMenuItem.onclick = _ => openPopupModal(t.id, 'dupe', tabDiv.querySelector('img.icon').getAttribute('src') === '../icons/unknown.png');
260+
dupeMenuItem.onclick = _ => openPopupModal(t.id, 'clone', tabDiv.querySelector('img.icon').getAttribute('src') === '../icons/unknown.png');
257261
if (t.repeat) {
258262
if (!t.paused) {
259263
pauseMenuItem = wrapInDiv({className: 'overflow-menu-item pause', innerText: 'Pause Wakeups', tabIndex: 0});
@@ -338,13 +342,13 @@ function getTimeGroup(tab, timeType = 'wakeUpTime', searchQuery = false) {
338342
var group = [];
339343
if (!tab.opened && !tab[timeType]) return group;
340344
var now = dayjs(), time = searchQuery && tab.opened ? dayjs(tab.opened) : dayjs(tab[timeType]);
341-
if (time.week() === now.subtract(1, 'week').week()) group.push('last_week');
342-
if (time.dayOfYear() === now.subtract(1, 'd').dayOfYear()) group.push('yesterday');
343-
if (time.dayOfYear() === now.dayOfYear() && time.year() == now.year()) group.push('today');
344-
if (time.dayOfYear() === now.add(1, 'd').dayOfYear()) group.push('tomorrow');
345-
if (time.week() === now.week()) group.push('this_week');
346-
if (time.week() === now.add(1, 'week').week()) group.push('next_week');
347-
if (time.valueOf() > now.add(1, 'week').valueOf()) group.push('later');
345+
if (time.week() === now.subtract(1, 'week').week() && isSameYear(now, time)) group.push('last_week');
346+
if (time.dayOfYear() === now.subtract(1, 'd').dayOfYear() && isSameYear(now, time)) group.push('yesterday');
347+
if (time.dayOfYear() === now.dayOfYear() && time.year() == now.year() && isSameYear(now, time)) group.push('today');
348+
if (time.dayOfYear() === now.add(1, 'd').dayOfYear() && isSameYear(now, time)) group.push('tomorrow');
349+
if (time.week() === now.week() && isSameYear(now, time)) group.push('this_week');
350+
if (time.week() === now.add(1, 'week').week() && isSameYear(now, time)) group.push('next_week');
351+
if (time.valueOf() > now.add(1, 'week').valueOf()) group.push('later');
348352
return searchQuery ? group : group[0];
349353
}
350354

0 commit comments

Comments
 (0)