UNPKG

atheos-ide

Version:

Web-based IDE framework

148 lines (118 loc) 3.65 kB
//////////////////////////////////////////////////////////////////////////////80 // Draft Init //////////////////////////////////////////////////////////////////////////////80 // Copyright (c) 2020 Liam Siira (liam@siira.io), distributed as-is and without // warranty under the MIT License. See [root]/license.md for more. // This information must remain intact. //////////////////////////////////////////////////////////////////////////////80 // Authors: Isaac Brown, @basilgohar, Atheos Team, @hlsiira //////////////////////////////////////////////////////////////////////////////80 (function(global) { 'use strict'; var atheos = global.atheos; var self = null; carbon.subscribe('system.loadMinor', () => atheos.draft.init()); atheos.draft = { enabled: true, interval: 300000, verbose: false, throttle: null, saving: [], init: function() { self = this; carbon.subscribe('settings.loaded, settings.save', function() { self.enabled = atheos.storage('draft.enabled') === false ? false : self.enabled; self.verbose = atheos.storage('draft.verbose') === true ? true : self.verbose; let interval = atheos.storage('draft.interval'); interval = isNumber(interval) ? interval : self.interval; if (isFunction(self.throttle)) { carbon.unsubscribe('chrono.kilo', self.throttle); } self.throttle = throttle(self.autosave, interval); carbon.subscribe('chrono.kilo', self.throttle); }); carbon.subscribe('active.save', self.delete); carbon.subscribe('active.open', self.check); }, autosave: function() { if (!self.enabled || self.saving.length > 0) return; var changedTabs = atheos.active.unsavedChanges(); if (!changedTabs) return; changedTabs.forEach(function(path) { let session = atheos.active.sessions[path]; if (session.autosaved) return; self.save(session); }); }, check: function(path) { echo({ data: { target: 'draft', action: 'check', path: path }, settled: function(status, reply) { if (status !== 'success') return; atheos.alert.show({ banner: 'Draft of file found!', message: 'Would you like to load the draft file instead?\n' + 'Either option will delete the draft on the server.', actions: { 'Load Draft': function() { self.open(path); }, 'Discard Draft': function() { self.delete(path); } } }); } }); }, delete: function(path) { echo({ data: { target: 'draft', action: 'delete', path: path } }); }, open: function(path) { let session = atheos.active.sessions[path]; if(!session) return; echo({ data: { target: 'draft', action: 'open', path: path }, settled: function(status, reply) { if (status !== 'success') return; session.setValue(reply.content, 1); } }); }, save: function(session) { self.saving.push[session.path]; let content = session.getValue(); echo({ data: { target: 'draft', action: 'save', path: session.path, content }, settled: function(status, reply) { if (status !== 'success') return; let index = self.saving.indexOf(session.path); self.saving = self.saving.splice(index, 1); session.autosaved = true; if (self.verbose && self.saving.length === 0) { atheos.toast.show('success', 'Autosave to draft complete.'); } } }); } }; })(this);