From c07ce935b4dd6faf3d70705537a81b61dcb436dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ionu=C8=9B=20Colceriu?= Date: Tue, 12 Mar 2024 16:37:36 +0200 Subject: [PATCH] Dark mode for the browser action popup (#530) * Add a dark theme for the browser action popup. * Speed up the template insert autocomplete method, by tweaking the way we update stats and waiting for the plugins to finish running. * Increase the average words-per-minute (used for calculating time saved) to 35. --- package-lock.json | 158 ++++++++++++++++++----------------- package.json | 2 +- src/content/autocomplete.js | 16 +--- src/content/keyboard.js | 2 +- src/content/plugin.js | 25 +++--- src/icons/briskine-combo.svg | 16 +++- src/popup/popup-dashboard.js | 9 +- src/popup/popup-theme.js | 5 ++ src/popup/popup.css | 29 +++---- src/popup/popup.js | 4 +- src/store/store-api.js | 9 +- 11 files changed, 143 insertions(+), 132 deletions(-) mode change 100755 => 100644 src/icons/briskine-combo.svg create mode 100644 src/popup/popup-theme.js diff --git a/package-lock.json b/package-lock.json index 208f07838..cf715a01a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "briskine", - "version": "7.12.1", + "version": "7.12.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "briskine", - "version": "7.12.1", + "version": "7.12.2", "license": "GPL-3.0-or-later", "dependencies": { "@webcomponents/custom-elements": "^1.4.3", @@ -2584,54 +2584,41 @@ ] }, "node_modules/archiver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.0.tgz", - "integrity": "sha512-R9HM9egs8FfktSqUqyjlKmvF4U+CWNqm/2tlROV+lOFg79MLdT67ae1l3hU47pGy8twSXxHoiefMCh43w0BriQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", + "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", "dev": true, "dependencies": { - "archiver-utils": "^5.0.0", + "archiver-utils": "^5.0.2", "async": "^3.2.4", "buffer-crc32": "^1.0.0", "readable-stream": "^4.0.0", "readdir-glob": "^1.1.2", "tar-stream": "^3.0.0", - "zip-stream": "^6.0.0" + "zip-stream": "^6.0.1" }, "engines": { "node": ">= 14" } }, "node_modules/archiver-utils": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.1.tgz", - "integrity": "sha512-MMAoLdMvT/nckofX1tCLrf7uJce4jTNkiT6smA2u57AOImc1nce7mR3EDujxL5yv6/MnILuQH4sAsPtDS8kTvg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", + "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", "dev": true, "dependencies": { "glob": "^10.0.0", "graceful-fs": "^4.2.0", + "is-stream": "^2.0.1", "lazystream": "^1.0.0", "lodash": "^4.17.15", "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" + "readable-stream": "^4.0.0" }, "engines": { "node": ">= 14" } }, - "node_modules/archiver-utils/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -3455,9 +3442,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001596", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001596.tgz", - "integrity": "sha512-zpkZ+kEr6We7w63ORkoJ2pOfBwBkY/bJrG/UZ90qNb45Isblu8wzDgevEOrRL1r9dWayHjYiiyCMEXPn4DweGQ==", + "version": "1.0.30001597", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz", + "integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==", "dev": true, "funding": [ { @@ -3997,13 +3984,14 @@ } }, "node_modules/compress-commons": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.1.tgz", - "integrity": "sha512-l7occIJn8YwlCEbWUCrG6gPms9qnJTCZSaznCa5HaV+yJMH4kM8BDc7q9NyoQuoiB2O6jKgTcTeY462qw6MyHw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", + "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", "dev": true, "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^6.0.0", + "is-stream": "^2.0.1", "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" }, @@ -5281,9 +5269,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.698", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.698.tgz", - "integrity": "sha512-f9iZD1t3CLy1AS6vzM5EKGa6p9pRcOeEFXRFbaG2Ta+Oe7MkfRQ3fsvPYidzHe1h4i0JvIvpcY55C+B6BZNGtQ==", + "version": "1.4.699", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.699.tgz", + "integrity": "sha512-I7q3BbQi6e4tJJN5CRcyvxhK0iJb34TV8eJQcgh+fR2fQ8miMgZcEInckCo1U9exDHbfz7DLDnFn8oqH/VcRKw==", "dev": true }, "node_modules/emoji-regex": { @@ -7672,9 +7660,9 @@ } }, "node_modules/hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { "function-bind": "^1.1.2" }, @@ -8333,9 +8321,12 @@ "optional": true }, "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8445,9 +8436,12 @@ } }, "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8543,20 +8537,26 @@ "dev": true }, "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8704,7 +8704,6 @@ "version": "4.13.1", "resolved": "https://registry.npmjs.org/jose/-/jose-4.13.1.tgz", "integrity": "sha512-MSJQC5vXco5Br38mzaQKiq9mwt7lwj2eXpgpRyQYNHYt2lq1PjkWa7DLXX0WVcQLE9HhMh3jPiufS7fhJf+CLQ==", - "deprecated": "this version is no longer supported", "dev": true, "funding": { "url": "https://github.com/sponsors/panva" @@ -10659,9 +10658,9 @@ } }, "node_modules/normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", + "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", "dev": true, "engines": { "node": ">=14.16" @@ -13454,16 +13453,16 @@ } }, "node_modules/set-function-length": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", - "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dependencies": { - "define-data-property": "^1.1.2", + "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -15869,29 +15868,32 @@ } }, "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-typed-array": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", - "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dependencies": { - "available-typed-arrays": "^1.0.6", - "call-bind": "^1.0.5", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.1" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -16266,13 +16268,13 @@ } }, "node_modules/zip-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.0.tgz", - "integrity": "sha512-X0WFquRRDtL9HR9hc1OrabOP/VKJEX7gAr2geayt3b7dLgXgSXI6ucC4CphLQP/aQt2GyHIYgmXxtC+dVdghAQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", + "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", "dev": true, "dependencies": { "archiver-utils": "^5.0.0", - "compress-commons": "^6.0.0", + "compress-commons": "^6.0.2", "readable-stream": "^4.0.0" }, "engines": { diff --git a/package.json b/package.json index 3ec3f8445..1952bbca6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "briskine", - "version": "7.12.1", + "version": "7.12.2", "description": "Write everything faster.", "private": true, "type": "module", diff --git a/src/content/autocomplete.js b/src/content/autocomplete.js index a6641931d..422adadd7 100644 --- a/src/content/autocomplete.js +++ b/src/content/autocomplete.js @@ -124,16 +124,8 @@ export function getSelectedWord (params) { } } -export function autocomplete (params) { - runPlugins(Object.assign({}, params)) - - store.updateTemplateStats(params.quicktext.id) - - // updates word stats - const wordCount = (params.quicktext._body_plaintext || '').split(' ').length - store.getExtensionData().then((data) => { - store.setExtensionData({ - words: data.words + wordCount - }) - }) +export async function autocomplete (params) { + await runPlugins(Object.assign({}, params)) + await store.updateTemplateStats(params.quicktext) + return params } diff --git a/src/content/keyboard.js b/src/content/keyboard.js index 576b047b2..3bb2500f9 100644 --- a/src/content/keyboard.js +++ b/src/content/keyboard.js @@ -115,7 +115,7 @@ async function keyboardAutocomplete (e) { getSelection(element).setBaseAndExtent(anchorNode, anchorOffset, focusNode, focusOffset) } - return autocomplete({ + autocomplete({ element: element, quicktext: template, word: word, diff --git a/src/content/plugin.js b/src/content/plugin.js index 1bb677a5c..c07e04a17 100644 --- a/src/content/plugin.js +++ b/src/content/plugin.js @@ -2,24 +2,23 @@ * Plugin */ -var plugins = []; +var plugins = [] export function register (plugin) { - plugins.push(plugin); + plugins.push(plugin) } // sequentially run promises until one returns true, or we reach the end -export function run (params = {}, index = 0) { - var plugin = plugins[index]; - if (!plugin) { - return true; - } +export async function run (params = {}, index = 0) { + var plugin = plugins[index] + if (!plugin) { + return true + } - return Promise.resolve().then(() => plugin(params)).then((done) => { - if (done === true) { - return true; - } + const done = await Promise.resolve().then(() => plugin(params)) + if (done === true) { + return true + } - return run(params, index + 1); - }); + return run(params, index + 1) } diff --git a/src/icons/briskine-combo.svg b/src/icons/briskine-combo.svg old mode 100755 new mode 100644 index afd4747cc..67cdd6c01 --- a/src/icons/briskine-combo.svg +++ b/src/icons/briskine-combo.svg @@ -1 +1,15 @@ - + + + + + + + + + + + + + + + diff --git a/src/popup/popup-dashboard.js b/src/popup/popup-dashboard.js index 75da37f61..51459ea4a 100644 --- a/src/popup/popup-dashboard.js +++ b/src/popup/popup-dashboard.js @@ -23,13 +23,14 @@ function niceTime (minutes) { } function getStats (words = 0) { - const avgWPM = 25 - // average WPM: http://en.wikipedia.org/wiki/Words_per_minute + const avgWPM = 35 + // average WPM + // http://en.wikipedia.org/wiki/Words_per_minute const time = niceTime(Math.round(words / avgWPM)) return { time: time, - words: words + words: words, } } @@ -291,7 +292,7 @@ customElements.define( ${this.user.email} diff --git a/src/popup/popup-theme.js b/src/popup/popup-theme.js new file mode 100644 index 000000000..ef65b1934 --- /dev/null +++ b/src/popup/popup-theme.js @@ -0,0 +1,5 @@ +export default function setTheme () { + const theme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light' + document.documentElement.setAttribute('data-bs-theme', theme) +} + diff --git a/src/popup/popup.css b/src/popup/popup.css index 1b4e00724..62d6ae72f 100644 --- a/src/popup/popup.css +++ b/src/popup/popup.css @@ -5,13 +5,9 @@ :root { --bs-border-radius: 3px; - --bs-body-color: #7e7084; - - --background-color: #fff; - --background-color-overlay: #f3f4f5; - --green: #37c837; --yellow: #ffcc00; + --blue: #0d7af6; } html { @@ -19,14 +15,13 @@ html { } body { - min-height: 250px; - background-color: var(--background-color); + background-color: var(--bs-tertiary-bg); } @media (min-width: 42em) { body { padding: 2em; - background-color: var(--background-color-overlay); + min-height: 100%; } } @@ -45,8 +40,9 @@ label { .popup-container { /* browser action width */ width: 22em; + min-height: 250px; margin: 0 auto; - background-color: var(--background-color); + background-color: var(--bs-body-bg); } @media (min-width: 22em) { @@ -73,7 +69,6 @@ label { */ a, .btn-link { - color: #1e48b3; text-decoration: none; } @@ -199,7 +194,7 @@ a:hover, /* popup-dashboard */ .popup-logo { - border-bottom: 1px solid #ececec; + border-bottom: 1px solid var(--bs-tertiary-bg); } .popup-menu { @@ -221,15 +216,11 @@ a:hover, } .popup-menu a:hover { - background-color: #f9f9f9; + background-color: var(--bs-tertiary-bg); text-decoration: none; } -.popup-menu a:active { - background-color: #e6e6e6; -} - .popup-menu .icon { display: inline-flex; margin-right: .8em; @@ -240,7 +231,7 @@ a:hover, .popup-menu a:hover .icon { transform: scale(1.4); - color: #0607fb; + color: var(--blue); } .popup-stats { @@ -273,8 +264,9 @@ a:hover, .btn-logout { padding-top: .4em; padding-bottom: .4em; + padding-right: 0; - color: #808080; + color: var(--bs-secondary); font-size: inherit; } @@ -282,7 +274,6 @@ a:hover, min-width: 5em; border: 0; margin-left: auto; - padding-right: 0; white-space: nowrap; } diff --git a/src/popup/popup.js b/src/popup/popup.js index 412ed64ca..23da5777e 100644 --- a/src/popup/popup.js +++ b/src/popup/popup.js @@ -6,14 +6,16 @@ import './popup.css' import './popup-login.js' import './popup-dashboard.js' import store from '../store/store-client.js' +import setTheme from './popup-theme.js' customElements.define( 'popup-container', class extends HTMLElement { constructor() { super() - this.loggedIn = null + setTheme() + this.loggedIn = null this.checkLogin() store.on('login', () => { diff --git a/src/store/store-api.js b/src/store/store-api.js index 9a036b327..c2887b94c 100644 --- a/src/store/store-api.js +++ b/src/store/store-api.js @@ -628,14 +628,19 @@ export async function setActiveCustomer (customerId) { }) } -export function updateTemplateStats (id) { +export function updateTemplateStats ({id = '', _body_plaintext = ''}) { return getExtensionData() .then((data) => { + // last used cache let lastuseCache = data.templatesLastUsed || {} lastuseCache[id] = new Date().toISOString() + // time saved (words) + const wordCount = (_body_plaintext || '').split(' ').length + const words = data.words + wordCount return setExtensionData({ - templatesLastUsed: lastuseCache + templatesLastUsed: lastuseCache, + words: words, }) }) }