{"version":3,"sources":["node_modules/nodebb-plugin-composer-default/static/lib/composer/drafts.js"],"names":["define","drafts","saveThrottleId","saving","init","postContainer","postData","draftIconEl","find","saveThrottle","resetTimeout","setTimeout","saveDraft","on","$","this","toggleClass","window","e","open","localStorage","getItem","JSON","parse","console","warn","length","forEach","save_id","updateVisibility","migrateGuest","clearTimeout","getDraft","get","uid","split","storage","parseInt","sessionStorage","draft","text","key","value","handle","trigger","canSave","app","user","titleEl","title","val","raw","hasOwnProperty","endsWith","cid","removeDraft","replace","setItem","tags","keys","Object","filter","startsWith","removeItem","set","add","idx","indexOf","push","splice","stringify","test","migrated","Set","renamed","map","parts","slice","join","loadOpen","available","require","composer","saveObj","type","id","newTopic","body","socket","emit","err","topicObj","newReply","undefined","content","editPost","x","DOMException","code","name"],"mappings":"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","file":"node_modules/nodebb-plugin-composer-default/static/lib/composer/drafts.js","sourcesContent":["'use strict';\r\n\r\n/* globals define */\r\n\r\ndefine('composer/drafts', function () {\r\n\r\n\tvar drafts = {};\r\n\tvar\tsaveThrottleId;\r\n\tvar saving = false;\r\n\r\n\tdrafts.init = function(postContainer, postData) {\r\n\t\tvar draftIconEl = postContainer.find('.draft-icon');\r\n\t\tfunction saveThrottle() {\r\n\t\t\tresetTimeout();\r\n\r\n\t\t\tsaveThrottleId = setTimeout(function() {\r\n\t\t\t\tsaveDraft(postContainer, draftIconEl, postData);\r\n\t\t\t}, 1000);\r\n\t\t}\r\n\r\n\t\tpostContainer.on('keyup', 'textarea, input.handle, input.title', saveThrottle);\r\n\t\tpostContainer.on('click', 'input[type=\"checkbox\"]', saveThrottle);\r\n\r\n\t\tdraftIconEl.on('animationend', function () {\r\n\t\t\t$(this).toggleClass('active', false);\r\n\t\t});\r\n\r\n\t\t$(window).on('unload', function (e) {\r\n\t\t\t// Update visibility on all open composers\r\n\t\t\ttry {\r\n\t\t\t\tvar open = localStorage.getItem('drafts:open');\r\n\t\t\t\topen = JSON.parse(open) || [];\r\n\t\t\t} catch (e) {\r\n\t\t\t\tconsole.warn('[composer/drafts] Could not read list of open/available drafts');\r\n\t\t\t\topen = [];\r\n\t\t\t}\r\n\t\t\tif (open.length) {\r\n\t\t\t\topen.forEach(function (save_id) {\r\n\t\t\t\t\tdrafts.updateVisibility('open', save_id);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tdrafts.migrateGuest();\r\n\t};\r\n\r\n\tfunction resetTimeout() {\r\n\t\tif (saveThrottleId) {\r\n\t\t\tclearTimeout(saveThrottleId);\r\n\t\t\tsaveThrottleId = 0;\r\n\t\t}\r\n\t}\r\n\r\n\t// deprecated, for removal v1.14.x\r\n\tdrafts.getDraft = function(save_id) {\r\n\t\tconsole.warn('[composer/drafts] drafts.getDraft is deprecated! Use drafts.get() instead.');\r\n\t\treturn localStorage.getItem(save_id);\r\n\t};\r\n\r\n\tdrafts.get = function(save_id) {\r\n\t\tvar uid = save_id.split(':')[1];\r\n\t\tvar storage = parseInt(uid, 10) ? localStorage : sessionStorage;\r\n\t\tvar draft = {\r\n\t\t\ttext: storage.getItem(save_id),\r\n\t\t};\r\n\t\t['cid', 'title', 'tags'].forEach(function (key) {\r\n\t\t\tconst value = storage.getItem(save_id + ':' + key);\r\n\t\t\tif (value) {\r\n\t\t\t\tdraft[key] = value;\r\n\t\t\t}\r\n\t\t});\r\n\t\tif (!parseInt(uid, 10)) {\r\n\t\t\tdraft.handle = storage.getItem(save_id + ':handle');\r\n\t\t}\r\n\r\n\t\t$(window).trigger('action:composer.drafts.get', {\r\n\t\t\tsave_id: save_id,\r\n\t\t\tdraft: draft,\r\n\t\t\tstorage: storage,\r\n\t\t});\r\n\t\treturn draft;\r\n\t}\r\n\r\n\tfunction saveDraft(postContainer, draftIconEl, postData) {\r\n\t\tif (canSave(app.user.uid ? 'localStorage' : 'sessionStorage') && postData && postData.save_id && postContainer.length) {\r\n\t\t\tconst titleEl = postContainer.find('input.title');\r\n\t\t\tconst title = titleEl && titleEl.val();\r\n\t\t\tvar raw = postContainer.find('textarea').val();\r\n\t\t\tvar storage = app.user.uid ? localStorage : sessionStorage;\r\n\r\n\t\t\tif (postData.hasOwnProperty('cid') && !postData.save_id.endsWith(':cid:' + postData.cid)) {\r\n\t\t\t\t// A new cid was selected, the save_id needs updating\r\n\t\t\t\tdrafts.removeDraft(postData.save_id);\t// First, delete the old draft\r\n\t\t\t\tpostData.save_id = postData.save_id.replace(/cid:\\d+$/, 'cid:' + postData.cid);\t// then create a new save_id\r\n\t\t\t}\r\n\r\n\t\t\tif (raw.length || (title && title.length)) {\r\n\t\t\t\tstorage.setItem(postData.save_id, raw);\r\n\r\n\t\t\t\tif (postData.hasOwnProperty('cid')) {\r\n\t\t\t\t\t// New topic only\r\n\t\t\t\t\tconst tags = postContainer.find('input.tags').val();\r\n\t\t\t\t\tstorage.setItem(postData.save_id + ':tags', tags);\r\n\t\t\t\t\tstorage.setItem(postData.save_id + ':title', title);\r\n\t\t\t\t}\r\n\t\t\t\tif (!app.user.uid) {\r\n\t\t\t\t\tvar handle = postContainer.find('input.handle').val();\r\n\t\t\t\t\tstorage.setItem(postData.save_id + ':handle', handle);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t$(window).trigger('action:composer.drafts.save', {\r\n\t\t\t\t\tstorage: storage,\r\n\t\t\t\t\tpostData: postData,\r\n\t\t\t\t\tpostContainer: postContainer,\r\n\t\t\t\t});\r\n\t\t\t\tdraftIconEl.toggleClass('active', true);\r\n\t\t\t} else {\r\n\t\t\t\tdrafts.removeDraft(postData.save_id);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tdrafts.removeDraft = function(save_id) {\r\n\t\tif (!save_id) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tresetTimeout();\r\n\t\t// Remove save_id from list of open and available drafts\r\n\t\tdrafts.updateVisibility('available', save_id);\r\n\t\tdrafts.updateVisibility('open', save_id);\r\n\r\n\t\tconst keys = Object.keys(localStorage).filter(key => key.startsWith(save_id));\r\n\t\tkeys.forEach(key => localStorage.removeItem(key));\r\n\t\treturn;\r\n\t};\r\n\r\n\tdrafts.updateVisibility = function (set, save_id, add) {\r\n\t\tif (!canSave(app.user.uid ? 'localStorage' : 'sessionStorage') || !save_id) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tvar open = localStorage.getItem('drafts:' + set);\r\n\t\t\topen = open ? JSON.parse(open) : [];\r\n\t\t} catch (e) {\r\n\t\t\tconsole.warn('[composer/drafts] Could not read list of open drafts');\r\n\t\t\tvar open = [];\r\n\t\t}\r\n\t\tvar idx = open.indexOf(save_id);\r\n\r\n\t\tif (add && idx === -1) {\r\n\t\t\topen.push(save_id);\r\n\t\t} else if (!add && idx !== -1) {\r\n\t\t\topen.splice(idx, 1);\r\n\t\t}\t// otherwise do nothing\r\n\r\n\t\tlocalStorage.setItem('drafts:' + set, JSON.stringify(open));\r\n\t};\r\n\r\n\tdrafts.migrateGuest = function () {\r\n\t\t// If any drafts are made while as guest, and user then logs in, assume control of those drafts\r\n\t\tif (canSave('localStorage') && app.user.uid) {\r\n\t\t\tvar test = /^composer:\\d+:\\w+:\\d+(:\\w+)?$/;\r\n\t\t\tvar keys = Object.keys(sessionStorage).filter(function (key) {\r\n\t\t\t\treturn test.test(key);\r\n\t\t\t});\r\n\t\t\tvar migrated = new Set([]);\r\n\t\t\tvar renamed = keys.map(function (key) {\r\n\t\t\t\tvar parts = key.split(':');\r\n\t\t\t\tparts[1] = app.user.uid;\r\n\r\n\t\t\t\tmigrated.add(parts.slice(0, 4).join(':'));\r\n\t\t\t\treturn parts.join(':');\r\n\t\t\t});\r\n\r\n\t\t\tkeys.forEach(function (key, idx) {\r\n\t\t\t\tlocalStorage.setItem(renamed[idx], sessionStorage.getItem(key));\r\n\t\t\t\tsessionStorage.removeItem(key);\r\n\t\t\t});\r\n\r\n\t\t\tmigrated.forEach(function(save_id) {\r\n\t\t\t\tdrafts.updateVisibility('available', save_id, 1);\r\n\t\t\t});\r\n\r\n\t\t\treturn migrated;\r\n\t\t}\r\n\t}\r\n\r\n\tdrafts.loadOpen = function () {\r\n\t\t// Load drafts if they were open\r\n\t\ttry {\r\n\t\t\tvar available = localStorage.getItem('drafts:available');\r\n\t\t\tvar open = localStorage.getItem('drafts:open');\r\n\t\t\tavailable = JSON.parse(available) || [];\r\n\t\t\topen = JSON.parse(open) || [];\r\n\t\t} catch (e) {\r\n\t\t\tconsole.warn('[composer/drafts] Could not read list of open/available drafts');\r\n\t\t\tavailable = [];\r\n\t\t\topen = [];\r\n\t\t}\r\n\r\n\t\tif (available.length && app.user && app.user.uid !== 0) {\r\n\t\t\trequire(['composer'], function (composer) {\r\n\t\t\t\t// Deconstruct each save_id and open up composer\r\n\t\t\t\tavailable.forEach(function (save_id) {\r\n\t\t\t\t\tif (!save_id) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar saveObj = save_id.split(':');\r\n\t\t\t\t\tvar uid = saveObj[1];\r\n\t\t\t\t\tvar type = saveObj[2];\r\n\t\t\t\t\tvar id = saveObj[3];\r\n\t\t\t\t\tvar draft = drafts.get(save_id);\r\n\r\n\t\t\t\t\t// If draft is already open, do nothing\r\n\t\t\t\t\tif (open.indexOf(save_id) !== -1) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Don't open other peoples' drafts\r\n\t\t\t\t\tif (parseInt(app.user.uid, 10) !== parseInt(uid, 10)) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (!draft || (draft.text && draft.title && !draft.text.title && !draft.text.length)) {\r\n\t\t\t\t\t\t// Empty content, remove from list of open drafts\r\n\t\t\t\t\t\tdrafts.updateVisibility('available', save_id);\r\n\t\t\t\t\t\tdrafts.updateVisibility('open', save_id);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (type === 'cid') {\r\n\t\t\t\t\t\tcomposer.newTopic({\r\n\t\t\t\t\t\t\tcid: id,\r\n\t\t\t\t\t\t\ttitle: draft.title,\r\n\t\t\t\t\t\t\tbody: draft.text,\r\n\t\t\t\t\t\t\ttags: []\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} else if (type === 'tid') {\r\n\t\t\t\t\t\tsocket.emit('topics.getTopic', id, function (err, topicObj) {\r\n\t\t\t\t\t\t\tcomposer.newReply(id, undefined, topicObj.title, content.text);\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} else if (type === 'pid') {\r\n\t\t\t\t\t\tcomposer.editPost(id);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t// Feature detection courtesy of: https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API\r\n\tfunction canSave(type) {\r\n\t\tvar storage;\r\n\t\ttry {\r\n\t\t\tstorage = window[type];\r\n\t\t\tvar x = '__storage_test__';\r\n\t\t\tstorage.setItem(x, x);\r\n\t\t\tstorage.removeItem(x);\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tcatch(e) {\r\n\t\t\treturn e instanceof DOMException && (\r\n\t\t\t\t// everything except Firefox\r\n\t\t\t\te.code === 22 ||\r\n\t\t\t\t// Firefox\r\n\t\t\t\te.code === 1014 ||\r\n\t\t\t\t// test name field too, because code might not be present\r\n\t\t\t\t// everything except Firefox\r\n\t\t\t\te.name === 'QuotaExceededError' ||\r\n\t\t\t\t// Firefox\r\n\t\t\t\te.name === 'NS_ERROR_DOM_QUOTA_REACHED') &&\r\n\t\t\t\t// acknowledge QuotaExceededError only if there's something already stored\r\n\t\t\t\t(storage && storage.length !== 0);\r\n\t\t}\r\n\t}\r\n\r\n\treturn drafts;\r\n});"]}