delete draft when user explicitly abandoned changes

This commit is contained in:
tophf 2022-01-23 02:53:41 +03:00
parent 7bea0397e9
commit 0d05b27c28
2 changed files with 31 additions and 24 deletions

View File

@ -61,7 +61,13 @@ const styleMan = (() => {
let ready = init(); let ready = init();
let order = {}; let order = {};
chrome.runtime.onConnect.addListener(handleLivePreview); chrome.runtime.onConnect.addListener(port => {
if (port.name === 'livePreview') {
handleLivePreview(port);
} else if (port.name.startsWith('draft:')) {
handleDraft(port);
}
});
// function handleColorScheme() { // function handleColorScheme() {
colorScheme.onChange(() => { colorScheme.onChange(() => {
for (const {style: data} of dataMap.values()) { for (const {style: data} of dataMap.values()) {
@ -372,10 +378,12 @@ const styleMan = (() => {
style); style);
} }
function handleDraft(port) {
const id = port.name.split(':').pop();
port.onDisconnect.addListener(() => API.drafts.delete(Number(id) || id));
}
function handleLivePreview(port) { function handleLivePreview(port) {
if (port.name !== 'livePreview') {
return;
}
let id; let id;
port.onMessage.addListener(style => { port.onMessage.addListener(style => {
if (!id) id = style.id; if (!id) id = style.id;

View File

@ -7,23 +7,23 @@
'use strict'; 'use strict';
(async function AutosaveDrafts() { (async function AutosaveDrafts() {
const NEW = 'new'; const makeId = () => editor.style.id || 'new';
let delay; let delay;
let draftId = editor.style.id || NEW; let port;
connectPort();
const draft = await API.drafts.get(draftId); const draft = await API.drafts.get(makeId());
if (draft && draft.isUsercss === editor.isUsercss) { if (draft && draft.isUsercss === editor.isUsercss) {
const date = makeRelativeDate(draft.date); const date = makeRelativeDate(draft.date);
if (await messageBoxProxy.confirm(t('draftAction'), 'danger', t('draftTitle', date))) { if (await messageBoxProxy.confirm(t('draftAction'), 'danger', t('draftTitle', date))) {
await editor.replaceStyle(draft.style, draft); await editor.replaceStyle(draft.style, draft);
} else { } else {
updateDraft(false); API.drafts.delete(makeId());
} }
} }
editor.dirty.onDataChange(isDirty => { editor.dirty.onChange(isDirty => isDirty ? connectPort() : port.disconnect());
debounce(updateDraft, isDirty ? delay : 0); editor.dirty.onDataChange(isDirty => debounce(updateDraft, isDirty ? delay : 0));
});
prefs.subscribe('editor.autosaveDraft', (key, val) => { prefs.subscribe('editor.autosaveDraft', (key, val) => {
delay = clamp(val * 1000 | 0, 1000, 2 ** 32 - 1); delay = clamp(val * 1000 | 0, 1000, 2 ** 32 - 1);
@ -31,6 +31,10 @@
if (t != null) debounce(updateDraft, t ? delay : 0); if (t != null) debounce(updateDraft, t ? delay : 0);
}, {runNow: true}); }, {runNow: true});
function connectPort() {
port = chrome.runtime.connect({name: 'draft:' + makeId()});
}
function makeRelativeDate(date) { function makeRelativeDate(date) {
let delta = (Date.now() - date) / 1000; let delta = (Date.now() - date) / 1000;
if (delta >= 0 && Intl.RelativeTimeFormat) { if (delta >= 0 && Intl.RelativeTimeFormat) {
@ -53,18 +57,13 @@
} }
function updateDraft(isDirty = editor.dirty.isDirty()) { function updateDraft(isDirty = editor.dirty.isDirty()) {
const newDraftId = editor.style.id || NEW; if (!isDirty) return;
if (isDirty) { API.drafts.put({
API.drafts.put({ date: Date.now(),
date: Date.now(), id: makeId(),
id: newDraftId, isUsercss: editor.isUsercss,
isUsercss: editor.isUsercss, style: editor.getValue(true),
style: editor.getValue(true), si: editor.makeScrollInfo(),
si: editor.makeScrollInfo(), });
});
} else {
API.drafts.delete(draftId); // the old id may have been 0 when a new style is saved now
}
draftId = newDraftId;
} }
})(); })();