From 478a083a8f36294ba0bf5a0ae9072a03dcf4e11e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ionu=C8=9B=20Colceriu?= Date: Mon, 4 Mar 2024 10:53:40 +0200 Subject: [PATCH] Authentication improvements (#527) * Improve authentication check and first run after log in. * Add a minimum height to the browser action popup. * Disable spellcheck on the dialog search field. * Split non-store-specific functionality into separate files. --- package-lock.json | 491 +++++++++++++++++++---------------- package.json | 4 +- src/content/dialog/dialog.js | 2 +- src/popup/popup.css | 1 + src/store/default-data.js | 162 ++++++++++++ src/store/extension-data.js | 35 +++ src/store/open-popup.js | 18 ++ src/store/plain-text.js | 4 + src/store/store-api.js | 275 +++----------------- 9 files changed, 530 insertions(+), 462 deletions(-) create mode 100644 src/store/default-data.js create mode 100644 src/store/extension-data.js create mode 100644 src/store/open-popup.js create mode 100644 src/store/plain-text.js diff --git a/package-lock.json b/package-lock.json index 6333a8b6..f0b8791b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "briskine", - "version": "7.11.3", + "version": "7.11.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "briskine", - "version": "7.11.3", + "version": "7.11.5", "license": "GPL-3.0-or-later", "dependencies": { "@webcomponents/custom-elements": "^1.4.3", @@ -23,7 +23,7 @@ "webextension-polyfill": "^0.10.0" }, "devDependencies": { - "archiver": "^6.0.0", + "archiver": "^7.0.0", "chai": "^5.0.0", "copy-webpack-plugin": "^12.0.0", "css-loader": "^6.0.0", @@ -243,9 +243,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -449,9 +449,9 @@ } }, "node_modules/@fastify/busboy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", - "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", "engines": { "node": ">=14" } @@ -492,9 +492,9 @@ "integrity": "sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw==" }, "node_modules/@firebase/app": { - "version": "0.9.27", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.9.27.tgz", - "integrity": "sha512-p2Dvl1ge4kRsyK5+wWcmdAIE9MSwZ0pDKAYB51LZgZuz6wciUZk4E1yAEdkfQlRxuHehn+Ol9WP5Qk2XQZiHGg==", + "version": "0.9.28", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.9.28.tgz", + "integrity": "sha512-MS0+EtNixrwJbVDs5Bt/lhUhzeWGUtUoP6X+zYZck5GAZwI5g4F91noVA9oIXlFlpn6Q1xIbiaHA2GwGk7/7Ag==", "dependencies": { "@firebase/component": "0.6.5", "@firebase/logger": "0.4.0", @@ -544,11 +544,11 @@ "integrity": "sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ==" }, "node_modules/@firebase/app-compat": { - "version": "0.2.27", - "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.27.tgz", - "integrity": "sha512-SYlqocfUDKPHR6MSFC8hree0BTiWFu5o8wbf6zFlYXyG41w7TcHp4wJi4H/EL5V6cM4kxwruXTJtqXX/fRAZtw==", + "version": "0.2.28", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.28.tgz", + "integrity": "sha512-Mr2NbeM1Oaayuw5unUAMzt+7/MN+e2uklT1l87D+ZLJl2UvhZAZmMt74GjEI9N3sDYKMeszSbszBqtJ1fGVafQ==", "dependencies": { - "@firebase/app": "0.9.27", + "@firebase/app": "0.9.28", "@firebase/component": "0.6.5", "@firebase/logger": "0.4.0", "@firebase/util": "1.9.4", @@ -561,15 +561,15 @@ "integrity": "sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==" }, "node_modules/@firebase/auth": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.6.0.tgz", - "integrity": "sha512-Qhl35eJTV6BwvuueTPCY6x8kUlYyzALtjp/Ws0X3fw3AnjVVfuVb7oQ3Xh5VPVfMFhaIuUAd1KXwcAuIklkSDw==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.6.1.tgz", + "integrity": "sha512-oOuQVOxtxKr+kTTqEkkI2qXIeGbkNLpA8FzO030LF4KXmMcETqsPaIqw7Aw1Y4Zl82l1qpZtpc4vN4Da2qZdfQ==", "dependencies": { "@firebase/component": "0.6.5", "@firebase/logger": "0.4.0", "@firebase/util": "1.9.4", "tslib": "^2.1.0", - "undici": "5.26.5" + "undici": "5.28.3" }, "peerDependencies": { "@firebase/app": "0.x", @@ -582,16 +582,16 @@ } }, "node_modules/@firebase/auth-compat": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.2.tgz", - "integrity": "sha512-pRgje5BPCNR1vXyvGOVXwOHtv88A2WooXfklI8sV7/jWi03ExFqNfpJT26GUo/oD39NoKJ3Kt6rD5gVvdV7lMw==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.3.tgz", + "integrity": "sha512-2pVtVEvu8P7SF6jSPfLPKWUClQFj+StqAZ0fD/uQ6mv8DyWn7AuuANFEu7Pv96JPcaL6Gy9jC5dFqjpptjqSRA==", "dependencies": { - "@firebase/auth": "1.6.0", + "@firebase/auth": "1.6.1", "@firebase/auth-types": "0.12.0", "@firebase/component": "0.6.5", "@firebase/util": "1.9.4", "tslib": "^2.1.0", - "undici": "5.26.5" + "undici": "5.28.3" }, "peerDependencies": { "@firebase/app-compat": "0.x" @@ -657,9 +657,9 @@ } }, "node_modules/@firebase/firestore": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.4.2.tgz", - "integrity": "sha512-YaX6ypa/RzU6OkxzUQlpSxwhOIWdTraCNz7sMsbaSEjjl/pj/QvX6TqjkdWGzuBYh2S6rz7ErhDO0g39oZZw/g==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.4.3.tgz", + "integrity": "sha512-Ix61zbeuTsHf0WFbk6+67n89Vzd9M8MMTdnz7c7z+BRE3BS5Vuc3gX5ZcHFjqPkQJ7rpLB1egHsYe4Przp5C2g==", "dependencies": { "@firebase/component": "0.6.5", "@firebase/logger": "0.4.0", @@ -668,7 +668,7 @@ "@grpc/grpc-js": "~1.9.0", "@grpc/proto-loader": "^0.7.8", "tslib": "^2.1.0", - "undici": "5.26.5" + "undici": "5.28.3" }, "engines": { "node": ">=10.10.0" @@ -678,12 +678,12 @@ } }, "node_modules/@firebase/firestore-compat": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.25.tgz", - "integrity": "sha512-+xI7WmsgZCBhMn/+uhDKcg+lsOUJ9FJyt5PGTzkFPbCsozWfeQZ7eVnfPh0rMkUOf0yIQ924RIe04gwvEIbcoQ==", + "version": "0.3.26", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.26.tgz", + "integrity": "sha512-dNrKiH5Cn6ItANV9nJI2Y0msKBj/skO7skDlRo/BUSQE1DKbNzumxpJEz+PK/PV1nTegnRgVvs47gpQeVWXtYQ==", "dependencies": { "@firebase/component": "0.6.5", - "@firebase/firestore": "4.4.2", + "@firebase/firestore": "4.4.3", "@firebase/firestore-types": "3.0.0", "@firebase/util": "1.9.4", "tslib": "^2.1.0" @@ -702,9 +702,9 @@ } }, "node_modules/@firebase/functions": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.11.1.tgz", - "integrity": "sha512-3uUa1hB79Gmy6E1gHTfzoHeZolBeHc/I/n3+lOCDe6BOos9AHmzRjKygcFE/7VA2FJjitCE0K+OHI6+OuoY8fQ==", + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.11.2.tgz", + "integrity": "sha512-2NULTYOZbu0rXczwfYdqQH0w1FmmYrKjTy1YPQSHLCAkMBdfewoKmVm4Lyo2vRn0H9ZndciLY7NszKDFt9MKCQ==", "dependencies": { "@firebase/app-check-interop-types": "0.3.0", "@firebase/auth-interop-types": "0.2.1", @@ -712,19 +712,19 @@ "@firebase/messaging-interop-types": "0.2.0", "@firebase/util": "1.9.4", "tslib": "^2.1.0", - "undici": "5.26.5" + "undici": "5.28.3" }, "peerDependencies": { "@firebase/app": "0.x" } }, "node_modules/@firebase/functions-compat": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.7.tgz", - "integrity": "sha512-uXe6Kmku5lNogp3OpPBcOJbSvnaCOn+YxS3zlXKNU6Q/NLwcvO3RY1zwYyctCos2RemEw3KEQ7YdzcECXjHWLw==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.8.tgz", + "integrity": "sha512-VDHSw6UOu8RxfgAY/q8e+Jn+9Fh60Fc28yck0yfMsi2e0BiWgonIMWkFspFGGLgOJebTHl+hc+9v91rhzU6xlg==", "dependencies": { "@firebase/component": "0.6.5", - "@firebase/functions": "0.11.1", + "@firebase/functions": "0.11.2", "@firebase/functions-types": "0.6.0", "@firebase/util": "1.9.4", "tslib": "^2.1.0" @@ -891,26 +891,26 @@ "integrity": "sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA==" }, "node_modules/@firebase/storage": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.12.1.tgz", - "integrity": "sha512-KJ5NV7FUh54TeTlEjdkTTX60ciCKOp9EqlbLnpdcXUYRJg0Z4810TXbilPc1z7fTIG4iPjtdi95bGE9n4dBX8A==", + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.12.2.tgz", + "integrity": "sha512-MzanOBcxDx9oOwDaDPMuiYxd6CxcN1xZm+os5uNE3C1itbRKLhM9rzpODDKWzcbnHHFtXk3Q3lsK/d3Xa1WYYw==", "dependencies": { "@firebase/component": "0.6.5", "@firebase/util": "1.9.4", "tslib": "^2.1.0", - "undici": "5.26.5" + "undici": "5.28.3" }, "peerDependencies": { "@firebase/app": "0.x" } }, "node_modules/@firebase/storage-compat": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.4.tgz", - "integrity": "sha512-Y0m5e2gS/wB9Ioth2X/Sgz76vcxvqgQrCmfa9qwhss/N31kxY2Gks6Frv0nrE18AjVfcSmcfDitqUwxcMOTRSg==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.5.tgz", + "integrity": "sha512-5dJXfY5NxCF5NAk4dLvJqC+m6cgcf0Fr29nrMHwhwI34pBheQq2PdRZqALsqZCES9dnHTuFNlqGQDpLr+Ph4rw==", "dependencies": { "@firebase/component": "0.6.5", - "@firebase/storage": "0.12.1", + "@firebase/storage": "0.12.2", "@firebase/storage-types": "0.8.0", "@firebase/util": "1.9.4", "tslib": "^2.1.0" @@ -1306,9 +1306,9 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { "node": ">=6.0.0" @@ -1678,9 +1678,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.56.4", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.4.tgz", - "integrity": "sha512-lG1GLUnL5vuRBGb3MgWUWLdGMH2Hps+pERuyQXCfWozuGKdnhf9Pbg4pkcrVUHjKrU7Rl+GCZ/299ObBXZFAxg==", + "version": "8.56.5", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.5.tgz", + "integrity": "sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw==", "dev": true, "dependencies": { "@types/estree": "*", @@ -1784,9 +1784,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.11.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.21.tgz", - "integrity": "sha512-/ySDLGscFPNasfqStUuWWPfL78jompfIoVzLJPVVAHBh6rpG68+pI2Gk+fNLeI8/f1yPYL4s46EleVIc20F1Ow==", + "version": "20.11.22", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.22.tgz", + "integrity": "sha512-/G+IxWxma6V3E+pqK1tSl2Fo1kl41pK1yeCyDsgkF9WlVAme4j5ISYM2zR11bgLFJGLN5sVK40T4RJNuiZbEjA==", "dependencies": { "undici-types": "~5.26.4" } @@ -2584,30 +2584,30 @@ ] }, "node_modules/archiver": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-6.0.2.tgz", - "integrity": "sha512-UQ/2nW7NMl1G+1UnrLypQw1VdT9XZg/ECcKPq7l+STzStrSivFIXIp34D8M5zeNGW5NoOupdYCHv6VySCPNNlw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.0.tgz", + "integrity": "sha512-R9HM9egs8FfktSqUqyjlKmvF4U+CWNqm/2tlROV+lOFg79MLdT67ae1l3hU47pGy8twSXxHoiefMCh43w0BriQ==", "dev": true, "dependencies": { - "archiver-utils": "^4.0.1", + "archiver-utils": "^5.0.0", "async": "^3.2.4", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", + "buffer-crc32": "^1.0.0", + "readable-stream": "^4.0.0", "readdir-glob": "^1.1.2", "tar-stream": "^3.0.0", - "zip-stream": "^5.0.1" + "zip-stream": "^6.0.0" }, "engines": { - "node": ">= 12.0.0" + "node": ">= 14" } }, "node_modules/archiver-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-4.0.1.tgz", - "integrity": "sha512-Q4Q99idbvzmgCTEAAhi32BkOyq8iVI5EwdO0PmBDSGIzzjYNdcFn7Q7k3OzbLy4kLUPXfJtG6fO2RjftXbobBg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.1.tgz", + "integrity": "sha512-MMAoLdMvT/nckofX1tCLrf7uJce4jTNkiT6smA2u57AOImc1nce7mR3EDujxL5yv6/MnILuQH4sAsPtDS8kTvg==", "dev": true, "dependencies": { - "glob": "^8.0.0", + "glob": "^10.0.0", "graceful-fs": "^4.2.0", "lazystream": "^1.0.0", "lodash": "^4.17.15", @@ -2615,47 +2615,21 @@ "readable-stream": "^3.6.0" }, "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/archiver-utils/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/archiver-utils/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 14" } }, - "node_modules/archiver-utils/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "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": { - "brace-expansion": "^2.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">=10" + "node": ">= 6" } }, "node_modules/argparse": { @@ -3042,6 +3016,20 @@ "readable-stream": "^3.4.0" } }, + "node_modules/bl/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/blob-util": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", @@ -3283,12 +3271,12 @@ } }, "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", "dev": true, "engines": { - "node": "*" + "node": ">=8.0.0" } }, "node_modules/buffer-equal-constant-time": { @@ -4009,18 +3997,18 @@ } }, "node_modules/compress-commons": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-5.0.3.tgz", - "integrity": "sha512-/UIcLWvwAQyVibgpQDPtfNM3SvqN7G9elAPAV7GM0L53EbNWwWiCsWtK8Fwed/APEbptPHXs5PuW+y8Bq8lFTA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.0.tgz", + "integrity": "sha512-t6IJvJfBdf7ZvRENJeRFsNq9KaVOlUbQUwA9mlCR6fLa1NLVLbuLobXOKSNTjLZFms7PsqUFNwwRpQNu1go40Q==", "dev": true, "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^5.0.0", "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" + "readable-stream": "^4.0.0" }, "engines": { - "node": ">= 12.0.0" + "node": ">= 14" } }, "node_modules/compressible": { @@ -4345,9 +4333,9 @@ } }, "node_modules/crc32-stream": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-5.0.0.tgz", - "integrity": "sha512-B0EPa1UK+qnpBZpG+7FgPCu0J2ETLpXq09o9BkLkEAhdB6Z61Qo4pJ3JYu0c+Qi+/SAL7QThqnzS06pmSSyZaw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-5.0.1.tgz", + "integrity": "sha512-lO1dFui+CEUh/ztYIpgpKItKW9Bb4NWakCRJrnqAbFIYD+OZAwb2VfD5T5eXMw2FNcsDHkQcNl/Wh3iVXYwU6g==", "dev": true, "dependencies": { "crc-32": "^1.2.0", @@ -4357,6 +4345,20 @@ "node": ">= 12.0.0" } }, + "node_modules/crc32-stream/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/cross-env": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.1.tgz", @@ -4751,9 +4753,9 @@ "dev": true }, "node_modules/csv-parse": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-5.5.4.tgz", - "integrity": "sha512-sPkvzL64UHoHZMj10z3r0RxwpjaY/vhM4vcAv+t+SDS6p9Joq8IFHe2TVUj4NDXy8l1Q7q8g/2ehtRTHmsU8ig==", + "version": "5.5.5", + "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-5.5.5.tgz", + "integrity": "sha512-erCk7tyU3yLWAhk6wvKxnyPtftuy/6Ak622gOO7BCJ05+TYffnPCJF905wmOQm+BpkX54OdAl8pveJwUdpnCXQ==", "dev": true }, "node_modules/cypress": { @@ -5240,6 +5242,20 @@ "stream-shift": "^1.0.0" } }, + "node_modules/duplexify/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/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -5278,9 +5294,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.685", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.685.tgz", - "integrity": "sha512-yDYeobbTEe4TNooEzOQO6xFqg9XnAkVy2Lod1C1B2it8u47JNLYvl9nLDWBamqUakWB8Jc1hhS1uHUNYTNQdfw==", + "version": "1.4.687", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.687.tgz", + "integrity": "sha512-Ic85cOuXSP6h7KM0AIJ2hpJ98Bo4hyTUjc4yjMbkvD+8yTxEhfK9+8exT2KKYsSjnCn2tGsKVSZwE7ZgTORQCw==", "dev": true }, "node_modules/emoji-regex": { @@ -6343,25 +6359,25 @@ } }, "node_modules/firebase": { - "version": "10.8.0", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.8.0.tgz", - "integrity": "sha512-UJpC24vw8JFuHEOQyArBGKTUd7+kohLISCzHyn0M/prP0KOTx2io1eyLliEid330QqnWI7FOlPxoU97qecCSfQ==", + "version": "10.8.1", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.8.1.tgz", + "integrity": "sha512-4B2jzhU/aumfKL446MG41/T5+t+9d9urf5XGrjC0HRQUm4Ya/amV48HBchnje69ExaJP5f2WxO9OX3wh9ee4wA==", "dependencies": { "@firebase/analytics": "0.10.1", "@firebase/analytics-compat": "0.2.7", - "@firebase/app": "0.9.27", + "@firebase/app": "0.9.28", "@firebase/app-check": "0.8.2", "@firebase/app-check-compat": "0.3.9", - "@firebase/app-compat": "0.2.27", + "@firebase/app-compat": "0.2.28", "@firebase/app-types": "0.9.0", - "@firebase/auth": "1.6.0", - "@firebase/auth-compat": "0.5.2", + "@firebase/auth": "1.6.1", + "@firebase/auth-compat": "0.5.3", "@firebase/database": "1.0.3", "@firebase/database-compat": "1.0.3", - "@firebase/firestore": "4.4.2", - "@firebase/firestore-compat": "0.3.25", - "@firebase/functions": "0.11.1", - "@firebase/functions-compat": "0.3.7", + "@firebase/firestore": "4.4.3", + "@firebase/firestore-compat": "0.3.26", + "@firebase/functions": "0.11.2", + "@firebase/functions-compat": "0.3.8", "@firebase/installations": "0.6.5", "@firebase/installations-compat": "0.2.5", "@firebase/messaging": "0.12.6", @@ -6370,8 +6386,8 @@ "@firebase/performance-compat": "0.2.5", "@firebase/remote-config": "0.4.5", "@firebase/remote-config-compat": "0.2.5", - "@firebase/storage": "0.12.1", - "@firebase/storage-compat": "0.3.4", + "@firebase/storage": "0.12.2", + "@firebase/storage-compat": "0.3.5", "@firebase/util": "1.9.4" } }, @@ -6514,6 +6530,15 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/firebase-tools/node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/firebase-tools/node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -6618,6 +6643,20 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/firebase-tools/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/firebase-tools/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -11324,46 +11363,6 @@ "split2": "^4.0.0" } }, - "node_modules/pino-abstract-transport/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/pino-abstract-transport/node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", - "dev": true, - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/pino-std-serializers": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", @@ -12609,17 +12608,43 @@ } }, "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==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { - "node": ">= 6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/readable-stream/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, "node_modules/readdir-glob": { @@ -14271,6 +14296,20 @@ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, + "node_modules/tar-fs/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/tar-fs/node_modules/tar-stream": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", @@ -14506,33 +14545,12 @@ "dev": true }, "node_modules/tmp": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.2.tgz", - "integrity": "sha512-ETcvHhaIc9J2MDEAH6N67j9bvBvu/3Gb764qaGhwtFvjtvhegqoqSpofgeyq1Sc24mW5pdyUDs9HP5j3ehkxRw==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", "dev": true, - "dependencies": { - "rimraf": "^5.0.5" - }, "engines": { - "node": ">=14" - } - }, - "node_modules/tmp/node_modules/rimraf": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", - "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", - "dev": true, - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=14.14" } }, "node_modules/to-regex-range": { @@ -14741,9 +14759,9 @@ "dev": true }, "node_modules/undici": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.5.tgz", - "integrity": "sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==", + "version": "5.28.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz", + "integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==", "dependencies": { "@fastify/busboy": "^2.0.0" }, @@ -15954,6 +15972,20 @@ "node": ">= 12.0.0" } }, + "node_modules/winston-transport/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/winston/node_modules/@colors/colors": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", @@ -15963,6 +15995,20 @@ "node": ">=0.1.90" } }, + "node_modules/winston/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/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -16200,6 +16246,15 @@ "fd-slicer": "~1.1.0" } }, + "node_modules/yauzl/node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -16223,17 +16278,17 @@ } }, "node_modules/zip-stream": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-5.0.2.tgz", - "integrity": "sha512-LfOdrUvPB8ZoXtvOBz6DlNClfvi//b5d56mSWyJi7XbH/HfhOHfUhOqxhT/rUiR7yiktlunqRo+jY6y/cWC/5g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.0.tgz", + "integrity": "sha512-X0WFquRRDtL9HR9hc1OrabOP/VKJEX7gAr2geayt3b7dLgXgSXI6ucC4CphLQP/aQt2GyHIYgmXxtC+dVdghAQ==", "dev": true, "dependencies": { - "archiver-utils": "^4.0.1", - "compress-commons": "^5.0.1", - "readable-stream": "^3.6.0" + "archiver-utils": "^5.0.0", + "compress-commons": "^6.0.0", + "readable-stream": "^4.0.0" }, "engines": { - "node": ">= 12.0.0" + "node": ">= 14" } } } diff --git a/package.json b/package.json index a6d7f387..e220d56e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "briskine", - "version": "7.11.3", + "version": "7.11.5", "description": "Write everything faster.", "private": true, "type": "module", @@ -41,7 +41,7 @@ ], "license": "GPL-3.0-or-later", "devDependencies": { - "archiver": "^6.0.0", + "archiver": "^7.0.0", "chai": "^5.0.0", "copy-webpack-plugin": "^12.0.0", "css-loader": "^6.0.0", diff --git a/src/content/dialog/dialog.js b/src/content/dialog/dialog.js index 25e4ace2..672120a4 100644 --- a/src/content/dialog/dialog.js +++ b/src/content/dialog/dialog.js @@ -502,7 +502,7 @@ function template({ > diff --git a/src/popup/popup.css b/src/popup/popup.css index e38ef5a8..1b4e0072 100644 --- a/src/popup/popup.css +++ b/src/popup/popup.css @@ -19,6 +19,7 @@ html { } body { + min-height: 250px; background-color: var(--background-color); } diff --git a/src/store/default-data.js b/src/store/default-data.js new file mode 100644 index 00000000..5252118d --- /dev/null +++ b/src/store/default-data.js @@ -0,0 +1,162 @@ +/* globals ENV */ +import plainText from './plain-text.js' + +export const defaultSettings = { + dialog_enabled: true, + dialog_button: true, + dialog_shortcut: 'ctrl+space', + + expand_enabled: true, + expand_shortcut: 'tab', + + blacklist: [], + share_all: false, +} + +export const defaultTags = [ + {title: 'en', color: 'blue'}, + {title: 'greetings', color: 'green'}, + {title: 'followup'}, + {title: 'closing'}, + {title: 'personal'}, +].map((tag, index) => { + return { + ...tag, + id: String(index), + } +}) + +function filterDefaultTags (titles = []) { + return defaultTags + .filter((tag) => { + if (titles.length) { + return titles.includes(tag.title) + } + return true + }) + .map((tag) => tag.id) +} + +export function getDefaultTemplates () { + const defaultTemplates = [ + { + title: 'Say Hello', + shortcut: 'h', + subject: '', + tags: filterDefaultTags(['en', 'greetings']), + body: '
Hello {{to.first_name}},
' + }, + { + title: 'Nice talking to you', + shortcut: 'nic', + subject: '', + tags: filterDefaultTags(['en', 'followup']), + body: '
It was nice talking to you.
' + }, + { + title: 'Kind Regards', + shortcut: 'kr', + subject: '', + tags: filterDefaultTags(['en', 'closing']), + body: '
Kind regards,
{{from.first_name}}.
' + }, + { + title: 'My email', + shortcut: 'e', + subject: '', + tags: filterDefaultTags(['en', 'personal']), + body: '
{{from.email}}
' + } + ] + + if (ENV === 'development') { + let allVarsBody = [ 'account', 'from', 'to', 'cc', 'bcc' ].map((field) => { + return ` +
+ # ${field} +
+ {{#each ${field}}} +
+ {{@key}}: {{this}} +
+ {{/each}} + ` + }).join('') + + allVarsBody += ` +
subject: {{subject}}
+
next week: {{moment add='7;days' format='DD MMMM'}}
+
last week: {{moment subtract='7;days'}}
+
week number: {{moment week=''}}
+
choice: {{choice 'Hello, Hi, Hey'}}
+
domain: {{domain to.email}}
+
+ ` + + defaultTemplates.push({ + title: 'allvars', + shortcut: 'allvars', + subject: 'Subject', + body: allVarsBody, + to: 'to@briskine.com', + cc: 'cc@briskine.com, cc2@briskine.com', + bcc: 'bcc@briskine.com', + from: 'contact@briskine.com' + }) + + defaultTemplates.push({ + title: 'broken', + shortcut: 'broken', + body: 'Hello {{to.first_name}' + }) + + defaultTemplates.push({ + title: 'attachment', + shortcut: 'attachment', + body: 'attachment', + attachments: [ + { + name: 'briskine.svg', + url: 'https://www.briskine.com/favicon.svg', + }, + { + name: 'briskine.doc', + url: 'https://www.briskine.com/favicon.svg', + }, + { + name: 'briskine.pdf', + url: 'https://www.briskine.com/favicon.svg', + }, + { + name: 'briskine.zip', + url: 'https://www.briskine.com/favicon.svg', + }, + { + name: 'briskine.mp3', + url: 'https://www.briskine.com/favicon.svg', + }, + { + name: 'briskine.webm', + url: 'https://www.briskine.com/favicon.svg', + }, + { + name: 'briskine.txt', + url: 'https://www.briskine.com/favicon.svg', + }, + { + name: 'briskine.generic', + url: 'https://www.briskine.com/favicon.svg', + }, + ] + }) + } + + return defaultTemplates + .map((template, index) => { + const id = String(index) + return Object.assign({ + id: id, + _body_plaintext: plainText(template.body), + }, template) + }) +} diff --git a/src/store/extension-data.js b/src/store/extension-data.js new file mode 100644 index 00000000..daf91fac --- /dev/null +++ b/src/store/extension-data.js @@ -0,0 +1,35 @@ +import browser from 'webextension-polyfill' + +import trigger from './store-trigger.js' + +const extensionDataKey = 'briskine' +const defaultExtensionData = { + words: 0, + templatesLastUsed: {}, + dialogSort: 'last_used', + dialogTags: true, + lastSync: Date.now(), +} + +export function getExtensionData () { + return browser.storage.local.get(extensionDataKey) + .then((data) => { + return Object.assign({}, defaultExtensionData, data[extensionDataKey]) + }) +} + +export function setExtensionData (params = {}) { + return browser.storage.local.get(extensionDataKey) + .then((data) => { + // merge existing data with defaults and new data + return Object.assign({}, defaultExtensionData, data[extensionDataKey], params) + }) + .then((newData) => { + const dataWrap = {} + dataWrap[extensionDataKey] = newData + + trigger('extension-data-updated', newData) + + return browser.storage.local.set(dataWrap) + }) +} diff --git a/src/store/open-popup.js b/src/store/open-popup.js new file mode 100644 index 00000000..14af1006 --- /dev/null +++ b/src/store/open-popup.js @@ -0,0 +1,18 @@ +/* globals MANIFEST */ +import browser from 'webextension-polyfill' + +const actionNamespace = (MANIFEST === '2') ? 'browserAction' : 'action' + +export async function openPopup () { + try { + await browser[actionNamespace].openPopup() + } catch (err) { + // browserAction.openPopup is not supported in all browsers yet. + // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/action/openPopup + // Open the action popup in a new tab. + const popupUrl = browser.runtime.getURL('popup/popup.html') + browser.tabs.create({ + url: `${popupUrl}?source=tab` + }) + } +} diff --git a/src/store/plain-text.js b/src/store/plain-text.js new file mode 100644 index 00000000..ddc1394d --- /dev/null +++ b/src/store/plain-text.js @@ -0,0 +1,4 @@ +// naive html to text conversion +export default function plainText (html = '') { + return html.replace(/(<[^>]*>)|( )/g, '').replace(/\s+/g, ' ').trim() +} diff --git a/src/store/store-api.js b/src/store/store-api.js index c551dadd..0532bf08 100644 --- a/src/store/store-api.js +++ b/src/store/store-api.js @@ -1,4 +1,4 @@ -/* globals ENV, FIREBASE_CONFIG, MANIFEST */ +/* globals ENV, FIREBASE_CONFIG */ import browser from 'webextension-polyfill' import {initializeApp} from 'firebase/app' @@ -27,6 +27,12 @@ import config from '../config.js' import trigger from './store-trigger.js' import fuzzySearch from './search.js' import badgeUpdate from '../background/badge-update.js' +import {getDefaultTemplates, defaultTags, defaultSettings} from './default-data.js' +import plainText from './plain-text.js' +import {getExtensionData, setExtensionData} from './extension-data.js' + +export {getExtensionData, setExtensionData} from './extension-data.js' +export {openPopup} from './open-popup.js' const firebaseApp = initializeApp(FIREBASE_CONFIG) const firebaseAuth = initializeAuth(firebaseApp, { @@ -45,11 +51,6 @@ if (ENV === 'development') { connectFirestoreEmulator(db, 'localhost', 5002); } -// naive html to text conversion -function plainText (html = '') { - return html.replace(/(<[^>]*>)|( )/g, '').replace(/\s+/g, ' ').trim() -} - // convert firestore timestamps to dates const timestamps = [ 'created_datetime', @@ -131,21 +132,21 @@ function getCollectionQuery (name, user) { } if (name === 'templatesOwned') { - return templatesOwnedQuery(user); + return templatesOwnedQuery(user) } if (name === 'templatesShared') { - return templatesSharedQuery(user); + return templatesSharedQuery(user) } if (name === 'templatesEveryone') { - return templatesEveryoneQuery(user); + return templatesEveryoneQuery(user) } return query( collection(db, name), - where(...collectionQuery[name]) - ); + where(...collectionQuery[name]), + ) } const collectionRequestQueue = {} @@ -318,18 +319,6 @@ function getUserToken () { }) } -const defaultSettings = { - dialog_enabled: true, - dialog_button: true, - dialog_shortcut: 'ctrl+space', - - expand_enabled: true, - expand_shortcut: 'tab', - - blacklist: [], - share_all: false, -} - export function getSettings () { return getSignedInUser() .then((user) => { @@ -387,7 +376,9 @@ async function getSignedInUser () { const customer = await getActiveCustomer(user) // if we're no longer part of cached customer, // store default customer and refresh data. - if (customer !== user.customer) { + // on first run after login, user.customer is null, + // and will be populated once signinWithToken is done. + if (user.customer && user.customer !== customer) { setActiveCustomer(customer) } @@ -396,10 +387,6 @@ async function getSignedInUser () { customer: customer, } } - - // logged-out in storage - clearDataCache() - await signOut(firebaseAuth) } else { // automatic firebase logout if (Object.keys(user).length) { @@ -422,154 +409,6 @@ function setSignedInUser (user) { }) } -const defaultTags = [ - {title: 'en', color: 'blue'}, - {title: 'greetings', color: 'green'}, - {title: 'followup'}, - {title: 'closing'}, - {title: 'personal'}, -].map((tag, index) => { - return { - ...tag, - id: String(index), - } -}) - -function filterDefaultTags (titles = []) { - return defaultTags - .filter((tag) => { - if (titles.length) { - return titles.includes(tag.title) - } - return true - }) - .map((tag) => tag.id) -} - -function getDefaultTemplates () { - const defaultTemplates = [ - { - title: 'Say Hello', - shortcut: 'h', - subject: '', - tags: filterDefaultTags(['en', 'greetings']), - body: '
Hello {{to.first_name}},
' - }, - { - title: 'Nice talking to you', - shortcut: 'nic', - subject: '', - tags: filterDefaultTags(['en', 'followup']), - body: '
It was nice talking to you.
' - }, - { - title: 'Kind Regards', - shortcut: 'kr', - subject: '', - tags: filterDefaultTags(['en', 'closing']), - body: '
Kind regards,
{{from.first_name}}.
' - }, - { - title: 'My email', - shortcut: 'e', - subject: '', - tags: filterDefaultTags(['en', 'personal']), - body: '
{{from.email}}
' - } - ] - - if (ENV === 'development') { - let allVarsBody = [ 'account', 'from', 'to', 'cc', 'bcc' ].map((field) => { - return ` -
- # ${field} -
- {{#each ${field}}} -
- {{@key}}: {{this}} -
- {{/each}} - ` - }).join('') - - allVarsBody += ` -
subject: {{subject}}
-
next week: {{moment add='7;days' format='DD MMMM'}}
-
last week: {{moment subtract='7;days'}}
-
week number: {{moment week=''}}
-
choice: {{choice 'Hello, Hi, Hey'}}
-
domain: {{domain to.email}}
-
- ` - - defaultTemplates.push({ - title: 'allvars', - shortcut: 'allvars', - subject: 'Subject', - body: allVarsBody, - to: 'to@briskine.com', - cc: 'cc@briskine.com, cc2@briskine.com', - bcc: 'bcc@briskine.com', - from: 'contact@briskine.com' - }) - - defaultTemplates.push({ - title: 'broken', - shortcut: 'broken', - body: 'Hello {{to.first_name}' - }) - - defaultTemplates.push({ - title: 'attachment', - shortcut: 'attachment', - body: 'attachment', - attachments: [ - { - name: 'briskine.svg', - url: 'https://www.briskine.com/favicon.svg', - }, - { - name: 'briskine.doc', - url: 'https://www.briskine.com/favicon.svg', - }, - { - name: 'briskine.pdf', - url: 'https://www.briskine.com/favicon.svg', - }, - { - name: 'briskine.zip', - url: 'https://www.briskine.com/favicon.svg', - }, - { - name: 'briskine.mp3', - url: 'https://www.briskine.com/favicon.svg', - }, - { - name: 'briskine.webm', - url: 'https://www.briskine.com/favicon.svg', - }, - { - name: 'briskine.txt', - url: 'https://www.briskine.com/favicon.svg', - }, - { - name: 'briskine.generic', - url: 'https://www.briskine.com/favicon.svg', - }, - ] - }) - } - - return defaultTemplates - .map((template, index) => { - const id = String(index) - return Object.assign({ - id: id, - _body_plaintext: plainText(template.body), - }, template) - }) -} - function isFree (user) { return getCollection({ user: user, @@ -725,23 +564,25 @@ export async function logout () { }) } -function signinWithToken (token = '') { - return signInWithCustomToken(firebaseAuth, token) - .then((res) => { - badgeUpdate(true) - return Promise.all([ - res.user, - getActiveCustomer({ - id: res.user.uid - }), - ]) - }) - .then(([user, customerId]) => { - return setSignedInUser({ - id: user.uid, - customer: customerId, - }) - }) +async function signinWithToken (token = '') { + const auth = await signInWithCustomToken(firebaseAuth, token) + // immediately set stored user, in case we call getSignedInUser, + // before signinWithToken is done. + const user = await setSignedInUser({ + id: auth.user.uid, + customer: null, + }) + + badgeUpdate(true) + + // triggers users-updated because of getCollection, + // which in turn triggers getSignedInUser. + const customer = await getActiveCustomer(user) + + return setSignedInUser({ + id: user.id, + customer: customer, + }) } export function getCustomer (customerId) { @@ -793,38 +634,6 @@ export async function setActiveCustomer (customerId) { }) } -const extensionDataKey = 'briskine' -const defaultExtensionData = { - words: 0, - templatesLastUsed: {}, - dialogSort: 'last_used', - dialogTags: true, - lastSync: Date.now(), -} - -export function getExtensionData () { - return browser.storage.local.get(extensionDataKey) - .then((data) => { - return Object.assign({}, defaultExtensionData, data[extensionDataKey]) - }) -} - -export function setExtensionData (params = {}) { - return browser.storage.local.get(extensionDataKey) - .then((data) => { - // merge existing data with defaults and new data - return Object.assign({}, defaultExtensionData, data[extensionDataKey], params) - }) - .then((newData) => { - const dataWrap = {} - dataWrap[extensionDataKey] = newData - - trigger('extension-data-updated', newData) - - return browser.storage.local.set(dataWrap) - }) -} - export function updateTemplateStats (id) { return getExtensionData() .then((data) => { @@ -927,22 +736,6 @@ export function searchTemplates (query = '') { }) } -const actionNamespace = (MANIFEST === '2') ? 'browserAction' : 'action' - -export async function openPopup () { - try { - await browser[actionNamespace].openPopup() - } catch (err) { - // browserAction.openPopup is not supported in all browsers yet. - // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/action/openPopup - // Open the action popup in a new tab. - const popupUrl = browser.runtime.getURL('popup/popup.html') - browser.tabs.create({ - url: `${popupUrl}?source=tab` - }) - } -} - async function setInitialBadge () { try { await getSignedInUser()