From 880af87ddf144bdfc506670bd732f1235a881f59 Mon Sep 17 00:00:00 2001 From: Devin Binnie <52460000+devinbinnie@users.noreply.github.com> Date: Wed, 7 Jul 2021 18:49:48 -0400 Subject: [PATCH] [MM-36421] Replace server tabs with dropdown menu (#1647) * WIP * WIP * PoC for dropdown - logic stuff * Most of the logic for the dropdown * Working dropdown menu to pick servers * Mentions, unreads and expired working. Many styles are working. * Some more styles * Dark mode and other stuff * Some cleanup * Generate build * PR feedback * More PR feedback --- .circleci/config.yml | 2 +- package-lock.json | 229 +++++++-- package.json | 2 + src/common/communication.ts | 9 + src/common/utils/constants.ts | 6 + src/main/appState.ts | 7 +- src/main/main.ts | 6 + src/main/preload/dropdown.js | 45 ++ src/main/preload/loadingScreenPreload.js | 12 +- src/main/preload/mattermost.js | 6 +- src/main/utils.ts | 5 +- src/main/views/MattermostView.ts | 24 +- src/main/views/teamDropdownView.ts | 114 +++++ src/main/views/viewManager.ts | 3 +- src/main/windows/windowManager.ts | 5 + .../fonts/compass-icons/compass-icons.eot | Bin 0 -> 43632 bytes .../fonts/compass-icons/compass-icons.svg | 460 ++++++++++++++++++ .../fonts/compass-icons/compass-icons.ttf | Bin 0 -> 43444 bytes .../fonts/compass-icons/compass-icons.woff | Bin 0 -> 23924 bytes .../fonts/compass-icons/compass-icons.woff2 | Bin 0 -> 19676 bytes src/renderer/components/MainPage.tsx | 23 + src/renderer/components/TabBar.tsx | 2 + .../components/TeamDropdownButton.tsx | 63 +++ src/renderer/css/compass-icons.css | 284 +++++++++++ src/renderer/css/components/TabBar.css | 4 - .../css/components/TeamDropdownButton.scss | 116 +++++ src/renderer/css/dropdown.scss | 198 ++++++++ src/renderer/css/fonts.css | 41 ++ src/renderer/css/index.css | 62 +-- src/renderer/dropdown.tsx | 166 +++++++ webpack.config.main.js | 1 + webpack.config.renderer.js | 14 + 32 files changed, 1792 insertions(+), 117 deletions(-) create mode 100644 src/main/preload/dropdown.js create mode 100644 src/main/views/teamDropdownView.ts create mode 100644 src/renderer/assets/fonts/compass-icons/compass-icons.eot create mode 100644 src/renderer/assets/fonts/compass-icons/compass-icons.svg create mode 100644 src/renderer/assets/fonts/compass-icons/compass-icons.ttf create mode 100644 src/renderer/assets/fonts/compass-icons/compass-icons.woff create mode 100644 src/renderer/assets/fonts/compass-icons/compass-icons.woff2 create mode 100644 src/renderer/components/TeamDropdownButton.tsx create mode 100755 src/renderer/css/compass-icons.css create mode 100644 src/renderer/css/components/TeamDropdownButton.scss create mode 100644 src/renderer/css/dropdown.scss create mode 100644 src/renderer/css/fonts.css create mode 100644 src/renderer/dropdown.tsx diff --git a/.circleci/config.yml b/.circleci/config.yml index d9be24a1..6b70ffb3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -446,7 +446,7 @@ workflows: branches: only: - /^release-\d+(\.\d+){1,2}(-rc.*)?/ - - react_bootstrap_upgrade + - pull/1647 - store_artifacts: # for master/PR builds diff --git a/package-lock.json b/package-lock.json index 53f10e8a..8f794317 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,6 +26,7 @@ "react-bootstrap": "^1.6.1", "react-dom": "^16.14.0", "react-transition-group": "^2.5.0", + "sass": "^1.35.1", "semver": "^5.5.0", "underscore": "^1.9.1", "valid-url": "^1.0.9", @@ -84,6 +85,7 @@ "mocha": "^5.2.0", "mocha-circleci-reporter": "0.0.3", "npm-run-all": "^4.1.5", + "sass-loader": "^10.2.0", "shebang-loader": "^0.0.1", "spectron": "^14.0.0", "style-loader": "^0.23.1", @@ -6838,7 +6840,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -8417,7 +8418,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true, "engines": { "node": ">=8" } @@ -9517,7 +9517,6 @@ "version": "3.4.2", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", - "dev": true, "dependencies": { "anymatch": "~3.1.1", "braces": "~3.0.2", @@ -9536,7 +9535,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -9548,7 +9546,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -9560,7 +9557,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -9572,7 +9568,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -9581,7 +9576,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -15548,7 +15542,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, "os": [ "darwin" ], @@ -17386,7 +17379,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -17575,7 +17567,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -17621,7 +17612,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -19974,7 +19964,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -20984,7 +20973,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -23092,7 +23080,6 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -23631,6 +23618,122 @@ "truncate-utf8-bytes": "^1.0.0" } }, + "node_modules/sass": { + "version": "1.35.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.35.1.tgz", + "integrity": "sha512-oCisuQJstxMcacOPmxLNiLlj4cUyN2+8xJnG7VanRoh2GOLr9RqkvI4AxA4a6LHVg/rsu+PmxXeGhrdSF9jCiQ==", + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/sass-loader": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.2.0.tgz", + "integrity": "sha512-kUceLzC1gIHz0zNJPpqRsJyisWatGYNFRmv2CKZK2/ngMJgLqxTbXwe/hJ85luyvZkgqU3VlJ33UVF2T/0g6mw==", + "dev": true, + "dependencies": { + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "neo-async": "^2.6.2", + "schema-utils": "^3.0.0", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0", + "sass": "^1.3.0", + "webpack": "^4.36.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/sass-loader/node_modules/loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/sass-loader/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sass-loader/node_modules/schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/sass-loader/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sass-loader/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -33278,7 +33381,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -34592,8 +34694,7 @@ "binary-extensions": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" }, "binaryextensions": { "version": "4.15.0", @@ -35514,7 +35615,6 @@ "version": "3.4.2", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", - "dev": true, "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", @@ -35530,7 +35630,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -35539,7 +35638,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "requires": { "to-regex-range": "^5.0.1" } @@ -35548,7 +35646,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -35556,14 +35653,12 @@ "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "requires": { "is-number": "^7.0.0" } @@ -40455,8 +40550,7 @@ "fsevents": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==" }, "function-bind": { "version": "1.1.1", @@ -41939,7 +42033,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "requires": { "binary-extensions": "^2.0.0" } @@ -42084,8 +42177,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-finite": { "version": "1.1.0", @@ -42119,7 +42211,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -44052,8 +44143,7 @@ "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "normalize-range": { "version": "0.1.2", @@ -44851,8 +44941,7 @@ "picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" }, "pidtree": { "version": "0.3.1", @@ -46519,7 +46608,6 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "dev": true, "requires": { "picomatch": "^2.2.1" } @@ -46969,6 +47057,75 @@ "truncate-utf8-bytes": "^1.0.0" } }, + "sass": { + "version": "1.35.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.35.1.tgz", + "integrity": "sha512-oCisuQJstxMcacOPmxLNiLlj4cUyN2+8xJnG7VanRoh2GOLr9RqkvI4AxA4a6LHVg/rsu+PmxXeGhrdSF9jCiQ==", + "requires": { + "chokidar": ">=3.0.0 <4.0.0" + } + }, + "sass-loader": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.2.0.tgz", + "integrity": "sha512-kUceLzC1gIHz0zNJPpqRsJyisWatGYNFRmv2CKZK2/ngMJgLqxTbXwe/hJ85luyvZkgqU3VlJ33UVF2T/0g6mw==", + "dev": true, + "requires": { + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "neo-async": "^2.6.2", + "schema-utils": "^3.0.0", + "semver": "^7.3.2" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", diff --git a/package.json b/package.json index 923363ac..b29fa176 100644 --- a/package.json +++ b/package.json @@ -108,6 +108,7 @@ "mocha": "^5.2.0", "mocha-circleci-reporter": "0.0.3", "npm-run-all": "^4.1.5", + "sass-loader": "^10.2.0", "shebang-loader": "^0.0.1", "spectron": "^14.0.0", "style-loader": "^0.23.1", @@ -136,6 +137,7 @@ "react-bootstrap": "^1.6.1", "react-dom": "^16.14.0", "react-transition-group": "^2.5.0", + "sass": "^1.35.1", "semver": "^5.5.0", "underscore": "^1.9.1", "valid-url": "^1.0.9", diff --git a/src/common/communication.ts b/src/common/communication.ts index eccf333c..1beabb3f 100644 --- a/src/common/communication.ts +++ b/src/common/communication.ts @@ -16,6 +16,7 @@ export const GET_CONFIGURATION = 'get-configuration'; export const UPDATE_CONFIGURATION = 'update-configuration'; export const GET_LOCAL_CONFIGURATION = 'get-local-configuration'; export const RELOAD_CONFIGURATION = 'reload-config'; +export const EMIT_CONFIGURATION = 'emit-configuration'; export const UPDATE_TEAMS = 'update-teams'; export const DARK_MODE_CHANGE = 'dark_mode_change'; @@ -78,3 +79,11 @@ export const ADD_SERVER = 'add-server'; export const FOCUS_THREE_DOT_MENU = 'focus-three-dot-menu'; export const LOADSCREEN_END = 'loadscreen-end'; + +export const OPEN_TEAMS_DROPDOWN = 'open-teams-dropdown'; +export const CLOSE_TEAMS_DROPDOWN = 'close-teams-dropdown'; +export const UPDATE_TEAMS_DROPDOWN = 'update-teams-dropdown'; +export const UPDATE_DROPDOWN_MENTIONS = 'update-dropdown-mentions'; +export const REQUEST_TEAMS_DROPDOWN_INFO = 'request-teams-dropdown-info'; +export const RECEIVE_DROPDOWN_MENU_SIZE = 'receive-dropdown-menu-size'; +export const SEND_DROPDOWN_MENU_SIZE = 'send-dropdown-menu-size'; diff --git a/src/common/utils/constants.ts b/src/common/utils/constants.ts index 145e29d6..0f7ff113 100644 --- a/src/common/utils/constants.ts +++ b/src/common/utils/constants.ts @@ -10,3 +10,9 @@ export const RELOAD_INTERVAL = 5 * SECOND; export const MAX_SERVER_RETRIES = 3; export const MAX_LOADING_SCREEN_SECONDS = 4 * SECOND; + +export const TAB_BAR_HEIGHT = 40; +export const BACK_BAR_HEIGHT = 36; +export const THREE_DOT_MENU_WIDTH = 40; +export const THREE_DOT_MENU_WIDTH_MAC = 80; +export const MENU_SHADOW_WIDTH = 24; diff --git a/src/main/appState.ts b/src/main/appState.ts index 84c2dbb1..6f2712f2 100644 --- a/src/main/appState.ts +++ b/src/main/appState.ts @@ -4,7 +4,7 @@ import events from 'events'; import {ipcMain} from 'electron'; -import {UPDATE_MENTIONS, UPDATE_TRAY, UPDATE_BADGE, SESSION_EXPIRED} from 'common/communication'; +import {UPDATE_MENTIONS, UPDATE_TRAY, UPDATE_BADGE, SESSION_EXPIRED, UPDATE_DROPDOWN_MENTIONS} from 'common/communication'; import * as WindowManager from './windows/windowManager'; @@ -32,12 +32,17 @@ const emitBadge = (expired?: boolean, mentions?: number, unreads?: boolean) => { status.emitter.emit(UPDATE_BADGE, expired, mentions, unreads); }; +const emitDropdown = (expired?: Map, mentions?: Map, unreads?: Map) => { + status.emitter.emit(UPDATE_DROPDOWN_MENTIONS, expired, mentions, unreads); +}; + export const emitStatus = () => { const expired = anyExpired(); const mentions = totalMentions(); const unreads = anyUnreads(); emitTray(expired, mentions, unreads); emitBadge(expired, mentions, unreads); + emitDropdown(status.expired, status.mentions, status.unreads); }; export const updateMentions = (serverName: string, mentions: number, unreads?: boolean) => { diff --git a/src/main/main.ts b/src/main/main.ts index e8c8cde4..9657a480 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -35,6 +35,7 @@ import { SHOW_SETTINGS_WINDOW, RELOAD_CONFIGURATION, USER_ACTIVITY_UPDATE, + EMIT_CONFIGURATION, } from 'common/communication'; import Config from 'common/config'; @@ -268,6 +269,7 @@ function handleConfigUpdate(newConfig: Config) { } ipcMain.emit('update-menu', true, config); + ipcMain.emit(EMIT_CONFIGURATION, true, newConfig.data); } function handleConfigSynchronize() { @@ -284,6 +286,8 @@ function handleConfigSynchronize() { if (app.isReady()) { WindowManager.sendToRenderer(RELOAD_CONFIGURATION); } + + ipcMain.emit(EMIT_CONFIGURATION, true, config.data); } function handleReloadConfig() { @@ -302,6 +306,8 @@ function handleDarkModeChange(darkMode: boolean) { refreshTrayImages(config.trayIconTheme); WindowManager.sendToRenderer(DARK_MODE_CHANGE, darkMode); WindowManager.updateLoadingScreenDarkMode(darkMode); + + ipcMain.emit(EMIT_CONFIGURATION, true, config.data); } // diff --git a/src/main/preload/dropdown.js b/src/main/preload/dropdown.js new file mode 100644 index 00000000..c744321d --- /dev/null +++ b/src/main/preload/dropdown.js @@ -0,0 +1,45 @@ +// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +'use strict'; + +import {ipcRenderer} from 'electron'; + +import { + UPDATE_TEAMS_DROPDOWN, + REQUEST_TEAMS_DROPDOWN_INFO, + RECEIVE_DROPDOWN_MENU_SIZE, + SEND_DROPDOWN_MENU_SIZE, + SWITCH_SERVER, + CLOSE_TEAMS_DROPDOWN, + SHOW_NEW_SERVER_MODAL, +} from 'common/communication'; + +console.log('preloaded for the dropdown!'); + +window.addEventListener('message', async (event) => { + switch (event.data.type) { + case REQUEST_TEAMS_DROPDOWN_INFO: + ipcRenderer.send(REQUEST_TEAMS_DROPDOWN_INFO); + break; + case SEND_DROPDOWN_MENU_SIZE: + ipcRenderer.send(RECEIVE_DROPDOWN_MENU_SIZE, event.data.data.width, event.data.data.height); + break; + case SWITCH_SERVER: + ipcRenderer.send(SWITCH_SERVER, event.data.data); + break; + case SHOW_NEW_SERVER_MODAL: + ipcRenderer.send(SHOW_NEW_SERVER_MODAL); + break; + case CLOSE_TEAMS_DROPDOWN: + ipcRenderer.send(CLOSE_TEAMS_DROPDOWN); + break; + default: + console.log(`got a message: ${event}`); + console.log(event); + } +}); + +ipcRenderer.on(UPDATE_TEAMS_DROPDOWN, (event, teams, activeTeam, darkMode, expired, mentions, unreads) => { + window.postMessage({type: UPDATE_TEAMS_DROPDOWN, data: {teams, activeTeam, darkMode, expired, mentions, unreads}}, window.location.href); +}); diff --git a/src/main/preload/loadingScreenPreload.js b/src/main/preload/loadingScreenPreload.js index b28389bf..6b808b05 100644 --- a/src/main/preload/loadingScreenPreload.js +++ b/src/main/preload/loadingScreenPreload.js @@ -6,7 +6,13 @@ import {ipcRenderer} from 'electron'; -import {RECEIVED_LOADING_SCREEN_DATA, GET_LOADING_SCREEN_DATA, LOADING_SCREEN_ANIMATION_FINISHED, TOGGLE_LOADING_SCREEN_VISIBILITY} from 'common/communication'; +import { + RECEIVED_LOADING_SCREEN_DATA, + GET_LOADING_SCREEN_DATA, + LOADING_SCREEN_ANIMATION_FINISHED, + TOGGLE_LOADING_SCREEN_VISIBILITY, + CLOSE_TEAMS_DROPDOWN, +} from 'common/communication'; console.log('preloaded for the loading screen!'); @@ -31,3 +37,7 @@ ipcRenderer.on(GET_LOADING_SCREEN_DATA, (_, result) => { ipcRenderer.on(TOGGLE_LOADING_SCREEN_VISIBILITY, (_, toggle) => { window.postMessage({type: TOGGLE_LOADING_SCREEN_VISIBILITY, data: toggle}, window.location.href); }); + +window.addEventListener('click', () => { + ipcRenderer.send(CLOSE_TEAMS_DROPDOWN); +}); diff --git a/src/main/preload/mattermost.js b/src/main/preload/mattermost.js index 092bdc5f..07013604 100644 --- a/src/main/preload/mattermost.js +++ b/src/main/preload/mattermost.js @@ -9,7 +9,7 @@ import {ipcRenderer, webFrame} from 'electron'; import log from 'electron-log'; -import {NOTIFY_MENTION, IS_UNREAD, UNREAD_RESULT, SESSION_EXPIRED, SET_SERVER_NAME, REACT_APP_INITIALIZED, USER_ACTIVITY_UPDATE} from 'common/communication'; +import {NOTIFY_MENTION, IS_UNREAD, UNREAD_RESULT, SESSION_EXPIRED, SET_SERVER_NAME, REACT_APP_INITIALIZED, USER_ACTIVITY_UPDATE, CLOSE_TEAMS_DROPDOWN} from 'common/communication'; const UNREAD_COUNT_INTERVAL = 1000; const CLEAR_CACHE_INTERVAL = 6 * 60 * 60 * 1000; // 6 hours @@ -205,4 +205,8 @@ setInterval(() => { webFrame.clearCache(); }, CLEAR_CACHE_INTERVAL); +window.addEventListener('click', () => { + ipcRenderer.send(CLOSE_TEAMS_DROPDOWN); +}); + /* eslint-enable no-magic-numbers */ diff --git a/src/main/utils.ts b/src/main/utils.ts index 6fa8fda7..6b7cdf83 100644 --- a/src/main/utils.ts +++ b/src/main/utils.ts @@ -7,12 +7,9 @@ import path from 'path'; import {Args} from 'types/args'; -import {PRODUCTION} from 'common/utils/constants'; +import {BACK_BAR_HEIGHT, PRODUCTION, TAB_BAR_HEIGHT} from 'common/utils/constants'; import Utils from 'common/utils/util'; -const TAB_BAR_HEIGHT = 40; -const BACK_BAR_HEIGHT = 36; - export function shouldBeHiddenOnStartup(parsedArgv: Args) { if (parsedArgv.hidden) { return true; diff --git a/src/main/views/MattermostView.ts b/src/main/views/MattermostView.ts index fd7830a2..be1e9a81 100644 --- a/src/main/views/MattermostView.ts +++ b/src/main/views/MattermostView.ts @@ -73,19 +73,17 @@ export class MattermostView extends EventEmitter { this.window = win; const preload = getLocalPreload('preload.js'); - this.options = { - webPreferences: { - contextIsolation: process.env.NODE_ENV !== 'test', - preload, - additionalArguments: [ - `version=${app.getVersion()}`, - `appName=${app.name}`, - ], - enableRemoteModule: process.env.NODE_ENV === 'test', - nodeIntegration: process.env.NODE_ENV === 'test', - ...options.webPreferences, - }, - ...options, + this.options = Object.assign({}, options); + this.options.webPreferences = { + contextIsolation: process.env.NODE_ENV !== 'test', + preload, + additionalArguments: [ + `version=${app.getVersion()}`, + `appName=${app.name}`, + ], + enableRemoteModule: process.env.NODE_ENV === 'test', + nodeIntegration: process.env.NODE_ENV === 'test', + ...options.webPreferences, }; this.isVisible = false; this.view = new BrowserView(this.options); diff --git a/src/main/views/teamDropdownView.ts b/src/main/views/teamDropdownView.ts new file mode 100644 index 00000000..39a0f836 --- /dev/null +++ b/src/main/views/teamDropdownView.ts @@ -0,0 +1,114 @@ +// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import {BrowserView, BrowserWindow, ipcMain, IpcMainEvent} from 'electron'; +import {CombinedConfig, Team} from 'types/config'; + +import { + CLOSE_TEAMS_DROPDOWN, + EMIT_CONFIGURATION, + OPEN_TEAMS_DROPDOWN, + UPDATE_TEAMS_DROPDOWN, + UPDATE_DROPDOWN_MENTIONS, + REQUEST_TEAMS_DROPDOWN_INFO, + RECEIVE_DROPDOWN_MENU_SIZE, + SET_SERVER_KEY, +} from 'common/communication'; +import * as AppState from '../appState'; +import {TAB_BAR_HEIGHT, THREE_DOT_MENU_WIDTH, THREE_DOT_MENU_WIDTH_MAC, MENU_SHADOW_WIDTH} from 'common/utils/constants'; +import {getLocalPreload, getLocalURLString} from 'main/utils'; +import * as WindowManager from '../windows/windowManager'; + +export default class TeamDropdownView { + view: BrowserView; + bounds?: Electron.Rectangle; + teams: Team[]; + activeTeam?: string; + darkMode: boolean; + unreads?: Map; + mentions?: Map; + expired?: Map; + window: BrowserWindow; + + constructor(window: BrowserWindow, teams: Team[], darkMode: boolean) { + this.teams = teams; + this.window = window; + this.darkMode = darkMode; + + const preload = getLocalPreload('dropdown.js'); + this.view = new BrowserView({webPreferences: { + contextIsolation: process.env.NODE_ENV !== 'test', + preload, + nodeIntegration: process.env.NODE_ENV === 'test', + enableRemoteModule: process.env.NODE_ENV === 'test', + }}); + + this.view.webContents.loadURL(getLocalURLString('dropdown.html')); + + ipcMain.on(OPEN_TEAMS_DROPDOWN, this.handleOpen); + ipcMain.on(CLOSE_TEAMS_DROPDOWN, this.handleClose); + ipcMain.on(EMIT_CONFIGURATION, this.updateConfig); + ipcMain.on(REQUEST_TEAMS_DROPDOWN_INFO, this.updateDropdown); + ipcMain.on(RECEIVE_DROPDOWN_MENU_SIZE, this.handleReceivedMenuSize); + ipcMain.on(SET_SERVER_KEY, this.updateActiveTeam); + AppState.on(UPDATE_DROPDOWN_MENTIONS, this.updateMentions); + } + + updateConfig = (event: IpcMainEvent, config: CombinedConfig) => { + this.teams = config.teams; + this.darkMode = config.darkMode; + this.updateDropdown(); + } + + updateActiveTeam = (event: IpcMainEvent, name: string) => { + this.activeTeam = name; + this.updateDropdown(); + } + + updateMentions = (expired: Map, mentions: Map, unreads: Map) => { + this.unreads = unreads; + this.mentions = mentions; + this.expired = expired; + this.updateDropdown(); + } + + updateDropdown = () => { + this.view.webContents.send(UPDATE_TEAMS_DROPDOWN, this.teams, this.activeTeam, this.darkMode, this.expired, this.mentions, this.unreads); + } + + handleOpen = () => { + this.window.addBrowserView(this.view); + const bounds = this.view.getBounds(); + this.view.setBounds(this.getBounds(bounds.width, bounds.height)); + this.window.setTopBrowserView(this.view); + this.view.webContents.focus(); + WindowManager.sendToRenderer(OPEN_TEAMS_DROPDOWN); + } + + handleClose = () => { + this.window.removeBrowserView(this.view); + WindowManager.sendToRenderer(CLOSE_TEAMS_DROPDOWN); + } + + handleReceivedMenuSize = (event: IpcMainEvent, width: number, height: number) => { + const bounds = this.getBounds(width, height); + this.view.setBounds(bounds); + } + + getBounds = (width: number, height: number) => { + return { + x: (process.platform === 'darwin' ? THREE_DOT_MENU_WIDTH_MAC : THREE_DOT_MENU_WIDTH) - MENU_SHADOW_WIDTH, + y: TAB_BAR_HEIGHT - MENU_SHADOW_WIDTH, + width, + height, + }; + } + + destroy = () => { + // workaround to eliminate zombie processes + // https://github.com/mattermost/desktop/pull/1519 + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + this.view.webContents.destroy(); + } +} diff --git a/src/main/views/viewManager.ts b/src/main/views/viewManager.ts index 21f9f06a..bf856b45 100644 --- a/src/main/views/viewManager.ts +++ b/src/main/views/viewManager.ts @@ -1,7 +1,7 @@ // Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. import log from 'electron-log'; -import {BrowserView, BrowserWindow, dialog} from 'electron'; +import {BrowserView, BrowserWindow, dialog, ipcMain} from 'electron'; import {BrowserViewConstructorOptions} from 'electron/main'; import {CombinedConfig, Team} from 'types/config'; @@ -131,6 +131,7 @@ export class ViewManager { return; } newView.window.webContents.send(SET_SERVER_KEY, serverInfo.order); + ipcMain.emit(SET_SERVER_KEY, true, name); if (newView.isReady()) { // if view is not ready, the renderer will have something to display instead. newView.show(); diff --git a/src/main/windows/windowManager.ts b/src/main/windows/windowManager.ts index e8c9f8db..923a368c 100644 --- a/src/main/windows/windowManager.ts +++ b/src/main/windows/windowManager.ts @@ -15,6 +15,8 @@ import {getAdjustedWindowBoundaries} from '../utils'; import {ViewManager} from '../views/viewManager'; import CriticalErrorHandler from '../CriticalErrorHandler'; +import TeamDropdownView from '../views/teamDropdownView'; + import {createSettingsWindow} from './settingsWindow'; import createMainWindow from './mainWindow'; @@ -25,6 +27,7 @@ type WindowManagerStatus = { settingsWindow?: BrowserWindow; config?: CombinedConfig; viewManager?: ViewManager; + teamDropdown?: TeamDropdownView; }; const status: WindowManagerStatus = {}; @@ -108,6 +111,8 @@ export function showMainWindow(deeplinkingURL?: string | URL) { if (status.viewManager) { status.viewManager.updateMainWindow(status.mainWindow); } + + status.teamDropdown = new TeamDropdownView(status.mainWindow, status.config.teams, status.config.darkMode); } initializeViewManager(); diff --git a/src/renderer/assets/fonts/compass-icons/compass-icons.eot b/src/renderer/assets/fonts/compass-icons/compass-icons.eot new file mode 100644 index 0000000000000000000000000000000000000000..0c82f98a5bb452d9618aaa4f4e783848f61709d9 GIT binary patch literal 43632 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 + + +Copyright (C) 2021 by original authors @ fontello.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/renderer/assets/fonts/compass-icons/compass-icons.ttf b/src/renderer/assets/fonts/compass-icons/compass-icons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f2a5a90a8900908c2288bc3d54b8df4b550977c3 GIT binary patch literal 43444 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 J9e{A?{eLz8sSW@D literal 0 HcmV?d00001 diff --git a/src/renderer/assets/fonts/compass-icons/compass-icons.woff b/src/renderer/assets/fonts/compass-icons/compass-icons.woff new file mode 100644 index 0000000000000000000000000000000000000000..77cd2544aca7b4bad0055857d016406c3326c34d GIT binary patch literal 23924 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

mYxs1XxGt{w#?yA8-D(N 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 Mto#q8SyMIu0B8fnc>n+a literal 0 HcmV?d00001 diff --git a/src/renderer/assets/fonts/compass-icons/compass-icons.woff2 b/src/renderer/assets/fonts/compass-icons/compass-icons.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c466ff3a128a0be4b5adbbb7452b195f6cbd37b7 GIT binary patch literal 19676 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 jeAd#ZzXrrcIx7S { maximized: false, tabStatus: new Map(this.props.teams.map((server) => [server.name, {status: Status.LOADING}])), darkMode: this.props.darkMode, + isMenuOpen: false, }; } @@ -228,6 +233,14 @@ export default class MainPage extends React.PureComponent { this.setState({unreadCounts: newUnreads, mentionCounts: newMentionCounts, sessionsExpired: expired}); }); + window.ipcRenderer.on(CLOSE_TEAMS_DROPDOWN, () => { + this.setState({isMenuOpen: false}); + }); + + window.ipcRenderer.on(OPEN_TEAMS_DROPDOWN, () => { + this.setState({isMenuOpen: true}); + }); + if (window.process.platform !== 'darwin') { window.ipcRenderer.on(FOCUS_THREE_DOT_MENU, () => { if (this.threeDotMenu.current) { @@ -305,6 +318,7 @@ export default class MainPage extends React.PureComponent { focusOnWebView = () => { window.ipcRenderer.send(FOCUS_BROWSERVIEW); + window.ipcRenderer.send(CLOSE_TEAMS_DROPDOWN); } render() { @@ -385,6 +399,8 @@ export default class MainPage extends React.PureComponent { ); } + const totalMentionCount = Object.values(this.state.mentionCounts).reduce((sum, value) => sum + value, 0); + const totalUnreadCount = Object.values(this.state.unreadCounts).reduce((sum, value) => sum + value, 0); const topRow = ( { > + 0} + isMenuOpen={this.state.isMenuOpen} + darkMode={this.state.darkMode} + /> {tabsRow} {overlayGradient} {titleBarButtons} diff --git a/src/renderer/components/TabBar.tsx b/src/renderer/components/TabBar.tsx index 33520f3e..bc5e2f04 100644 --- a/src/renderer/components/TabBar.tsx +++ b/src/renderer/components/TabBar.tsx @@ -165,6 +165,8 @@ export default class TabBar extends React.PureComponent { // need ); } + // TODO: Replace with products + tabs.length = 0; return ( = (props: Props) => { + const {activeServerName, totalMentionCount, hasUnreads, isMenuOpen, darkMode} = props; + + const handleToggleButton = (event: React.MouseEvent) => { + event.preventDefault(); + event.stopPropagation(); + window.ipcRenderer.send(isMenuOpen ? CLOSE_TEAMS_DROPDOWN : OPEN_TEAMS_DROPDOWN); + }; + + let badgeDiv: React.ReactNode; + if (totalMentionCount > 0) { + badgeDiv = ( +

+ {totalMentionCount > 99 ? '99+' : totalMentionCount} +
+ ); + } else if (hasUnreads) { + badgeDiv = ( +
+ ); + } + + return ( + + ); +}; + +export default TeamDropdownButton; diff --git a/src/renderer/css/compass-icons.css b/src/renderer/css/compass-icons.css new file mode 100755 index 00000000..08fc4d5a --- /dev/null +++ b/src/renderer/css/compass-icons.css @@ -0,0 +1,284 @@ +@charset "UTF-8"; + + @font-face { + font-family: 'compass-icons'; + src: url('../assets/fonts/compass-icons/compass-icons.eot?45182295'); + src: url('../assets/fonts/compass-icons/compass-icons.eot?45182295#iefix') format('embedded-opentype'), + url('../assets/fonts/compass-icons/compass-icons.woff2?45182295') format('woff2'), + url('../assets/fonts/compass-icons/compass-icons.woff?45182295') format('woff'), + url('../assets/fonts/compass-icons/compass-icons.ttf?45182295') format('truetype'), + url('../assets/fonts/compass-icons/compass-icons.svg?45182295#compass-icons') format('svg'); + font-weight: normal; + font-style: normal; +} +/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ +/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ +/* +@media screen and (-webkit-min-device-pixel-ratio:0) { + @font-face { + font-family: 'compass-icons'; + src: url('../fonts/compass-icons/compass-icons.svg?45182295#compass-icons') format('svg'); + } +} +*/ + +[class^="icon-"]:before, [class*=" icon-"]:before { + font-family: "compass-icons"; + font-style: normal; + font-weight: normal; + speak: never; + + display: inline-block; + text-decoration: inherit; + width: 1em; + margin-right: .2em; + text-align: center; + /* opacity: .8; */ + + /* For safety - reset parent styles, that can break glyph codes*/ + font-variant: normal; + text-transform: none; + + /* fix buttons height, for twitter bootstrap */ + line-height: 1em; + + /* Animation center compensation - margins should be symmetric */ + /* remove if not needed */ + margin-left: .2em; + + /* you can be more comfortable with increased icons size */ + /* font-size: 120%; */ + + /* Font smoothing. That was taken from TWBS */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + /* Uncomment for 3D effect */ + /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ +} + +.icon-mattermost:before { content: '\e800'; } /* '' */ +.icon-archive-outline:before { content: '\e801'; } /* '' */ +.icon-beach-umbrella-outline:before { content: '\e802'; } /* '' */ +.icon-exclamation-thick:before { content: '\e803'; } /* '' */ +.icon-gfycat:before { content: '\e804'; } /* '' */ +.icon-globe:before { content: '\e805'; } /* '' */ +.icon-iframe-list-outline:before { content: '\e806'; } /* '' */ +.icon-oauth:before { content: '\e807'; } /* '' */ +.icon-power-plug-outline:before { content: '\e808'; } /* '' */ +.icon-robot-happy:before { content: '\e809'; } /* '' */ +.icon-server-outline:before { content: '\e80a'; } /* '' */ +.icon-slash-forward-box-outline:before { content: '\e80b'; } /* '' */ +.icon-webhook-incoming:before { content: '\e80c'; } /* '' */ +.icon-webhook-outgoing:before { content: '\e80d'; } /* '' */ +.icon-image-area-outline:before { content: '\e80e'; } /* '' */ +.icon-emoticon-plus-outline:before { content: '\e80f'; } /* '' */ +.icon-mark-as-unread:before { content: '\e810'; } /* '' */ +.icon-arrow-back-ios:before { content: '\e811'; } /* '' */ +.icon-arrow-forward-ios:before { content: '\e812'; } /* '' */ +.icon-brand-zoom:before { content: '\e813'; } /* '' */ +.icon-menu-variant:before { content: '\e814'; } /* '' */ +.icon-message-check:before { content: '\e815'; } /* '' */ +.icon-airplane-variant:before { content: '\e816'; } /* '' */ +.icon-food-apple:before { content: '\e817'; } /* '' */ +.icon-leaf-outline:before { content: '\e818'; } /* '' */ +.icon-basketball:before { content: '\e819'; } /* '' */ +.icon-emoticon-custom-outline:before { content: '\e81a'; } /* '' */ +.icon-message-check-outline:before { content: '\e81b'; } /* '' */ +.icon-image-broken-outline:before { content: '\e81c'; } /* '' */ +.icon-format-header:before { content: '\e81d'; } /* '' */ +.icon-circle-multiple-outline-lock:before { content: '\e81e'; } /* '' */ +.icon-server-variant:before { content: '\e81f'; } /* '' */ +.icon-server-variant-plus:before { content: '\e820'; } /* '' */ +.icon-search-list:before { content: '\e821'; } /* '' */ +.icon-brand-gitlab:before { content: '\e822'; } /* '' */ +.icon-brand-google:before { content: '\e823'; } /* '' */ +.icon-brand-office-365:before { content: '\e824'; } /* '' */ +.icon-brand-one-login:before { content: '\e825'; } /* '' */ +.icon-application-cog:before { content: '\e826'; } /* '' */ +.icon-key-variant-circle:before { content: '\e827'; } /* '' */ +.icon-car-outline:before { content: '\e899'; } /* '' */ +.icon-jumbo-attachment-text:before { content: '\e900'; } /* '' */ +.icon-jumbo-attachment-word:before { content: '\e901'; } /* '' */ +.icon-jumbo-attachment-excel:before { content: '\e902'; } /* '' */ +.icon-jumbo-attachment-powerpoint:before { content: '\e903'; } /* '' */ +.icon-jumbo-attachment-pdf:before { content: '\e904'; } /* '' */ +.icon-jumbo-attachment-image:before { content: '\e905'; } /* '' */ +.icon-jumbo-attachment-video:before { content: '\e906'; } /* '' */ +.icon-jumbo-attachment-audio:before { content: '\e907'; } /* '' */ +.icon-jumbo-attachment-generic:before { content: '\e908'; } /* '' */ +.icon-jumbo-attachment-patch:before { content: '\e909'; } /* '' */ +.icon-jumbo-attachment-zip:before { content: '\e90a'; } /* '' */ +.icon-jumbo-attachment-code:before { content: '\e90b'; } /* '' */ +.icon-jumbo-attachment-image-broken:before { content: '\e90c'; } /* '' */ +.icon-account-multiple-outline:before { content: '\f00f'; } /* '' */ +.icon-airplane:before { content: '\f01d'; } /* '' */ +.icon-alert-outline:before { content: '\f02a'; } /* '' */ +.icon-arrow-down:before { content: '\f045'; } /* '' */ +.icon-arrow-left:before { content: '\f04d'; } /* '' */ +.icon-arrow-up:before { content: '\f05d'; } /* '' */ +.icon-at:before { content: '\f065'; } /* '' */ +.icon-flask-outline:before { content: '\f096'; } /* '' */ +.icon-bell-outline:before { content: '\f09c'; } /* '' */ +.icon-cellphone:before { content: '\f11c'; } /* '' */ +.icon-chart-bar:before { content: '\f128'; } /* '' */ +.icon-chart-line:before { content: '\f12a'; } /* '' */ +.icon-check:before { content: '\f12c'; } /* '' */ +.icon-checkbox-blank-outline:before { content: '\f131'; } /* '' */ +.icon-checkbox-marked:before { content: '\f132'; } /* '' */ +.icon-chevron-down:before { content: '\f140'; } /* '' */ +.icon-chevron-left:before { content: '\f141'; } /* '' */ +.icon-chevron-right:before { content: '\f142'; } /* '' */ +.icon-clock-outline:before { content: '\f150'; } /* '' */ +.icon-close:before { content: '\f156'; } /* '' */ +.icon-close-circle-outline:before { content: '\f15a'; } /* '' */ +.icon-code-brackets:before { content: '\f16a'; } /* '' */ +.icon-code-tags:before { content: '\f174'; } /* '' */ +.icon-console:before { content: '\f18d'; } /* '' */ +.icon-dots-horizontal:before { content: '\f1d8'; } /* '' */ +.icon-dots-vertical:before { content: '\f1d9'; } /* '' */ +.icon-email-outline:before { content: '\f1f0'; } /* '' */ +.icon-emoticon-outline:before { content: '\f1f2'; } /* '' */ +.icon-emoticon-happy-outline:before { content: '\f1f5'; } /* '' */ +.icon-filter-variant:before { content: '\f236'; } /* '' */ +.icon-fire:before { content: '\f238'; } /* '' */ +.icon-flag:before { content: '\f23b'; } /* '' */ +.icon-flag-outline:before { content: '\f23d'; } /* '' */ +.icon-format-bold:before { content: '\f264'; } /* '' */ +.icon-format-clear:before { content: '\f265'; } /* '' */ +.icon-format-header-1:before { content: '\f26b'; } /* '' */ +.icon-format-header-2:before { content: '\f26c'; } /* '' */ +.icon-format-header-3:before { content: '\f26d'; } /* '' */ +.icon-format-header-4:before { content: '\f26e'; } /* '' */ +.icon-format-header-5:before { content: '\f26f'; } /* '' */ +.icon-format-header-6:before { content: '\f270'; } /* '' */ +.icon-format-italic:before { content: '\f277'; } /* '' */ +.icon-format-list-bulleted:before { content: '\f279'; } /* '' */ +.icon-format-list-numbered:before { content: '\f27b'; } /* '' */ +.icon-format-strikethrough-variant:before { content: '\f281'; } /* '' */ +.icon-github-circle:before { content: '\f2a4'; } /* '' */ +.icon-heart-outline:before { content: '\f2d5'; } /* '' */ +.icon-help:before { content: '\f2d6'; } /* '' */ +.icon-information-outline:before { content: '\f2fd'; } /* '' */ +.icon-laptop:before { content: '\f322'; } /* '' */ +.icon-leaf:before { content: '\f32a'; } /* '' */ +.icon-lightbulb-outline:before { content: '\f336'; } /* '' */ +.icon-link-variant:before { content: '\f339'; } /* '' */ +.icon-link-variant-off:before { content: '\f33a'; } /* '' */ +.icon-lock:before { content: '\f33e'; } /* '' */ +.icon-lock-outline:before { content: '\f341'; } /* '' */ +.icon-magnify:before { content: '\f349'; } /* '' */ +.icon-menu:before { content: '\f35c'; } /* '' */ +.icon-menu-down:before { content: '\f35d'; } /* '' */ +.icon-minus-box:before { content: '\f375'; } /* '' */ +.icon-minus-circle:before { content: '\f376'; } /* '' */ +.icon-paperclip:before { content: '\f3e2'; } /* '' */ +.icon-pin:before { content: '\f403'; } /* '' */ +.icon-plus:before { content: '\f415'; } /* '' */ +.icon-plus-box:before { content: '\f416'; } /* '' */ +.icon-refresh:before { content: '\f450'; } /* '' */ +.icon-send:before { content: '\f48a'; } /* '' */ +.icon-shield-outline:before { content: '\f499'; } /* '' */ +.icon-sitemap:before { content: '\f4aa'; } /* '' */ +.icon-soccer:before { content: '\f4b8'; } /* '' */ +.icon-source-pull:before { content: '\f4c2'; } /* '' */ +.icon-star:before { content: '\f4ce'; } /* '' */ +.icon-star-outline:before { content: '\f4d2'; } /* '' */ +.icon-sync:before { content: '\f4e6'; } /* '' */ +.icon-alert-circle-outline:before { content: '\f5d6'; } /* '' */ +.icon-check-circle:before { content: '\f5e0'; } /* '' */ +.icon-email-variant:before { content: '\f5f0'; } /* '' */ +.icon-food-fork-drink:before { content: '\f5f2'; } /* '' */ +.icon-arrow-collapse:before { content: '\f615'; } /* '' */ +.icon-arrow-expand:before { content: '\f616'; } /* '' */ +.icon-source-branch:before { content: '\f62c'; } /* '' */ +.icon-tune:before { content: '\f62e'; } /* '' */ +.icon-webhook:before { content: '\f62f'; } /* '' */ +.icon-eye-outline:before { content: '\f6cf'; } /* '' */ +.icon-cancel:before { content: '\f739'; } /* '' */ +.icon-format-quote-open:before { content: '\f756'; } /* '' */ +.icon-square:before { content: '\f763'; } /* '' */ +.icon-circle-outline:before { content: '\f765'; } /* '' */ +.icon-account-plus-outline:before { content: '\f800'; } /* '' */ +.icon-forum-outline:before { content: '\f821'; } /* '' */ +.icon-settings-outline:before { content: '\f8ba'; } /* '' */ +.icon-hammer:before { content: '\f8e9'; } /* '' */ +.icon-pin-outline:before { content: '\f930'; } /* '擄' */ +.icon-clock:before { content: '\f953'; } /* '肋' */ +.icon-image-outline:before { content: '\f975'; } /* '掠' */ +.icon-email-plus-outline:before { content: '\f9eb'; } /* '匿' */ +.icon-file-document-outline:before { content: '\f9ed'; } /* '吝' */ +.icon-layers-outline:before { content: '\f9fd'; } /* '什' */ +.icon-bell-off-outline:before { content: '\fa90'; } /* '敖' */ +.icon-chevron-down-circle-outline:before { content: '\fb0c'; } /* '﬌' */ +.icon-format-letter-case:before { content: '\fb19'; } /* '﬙' */ +.icon-download-outline:before { content: '\fb6b'; } /* 'ﭫ' */ +.icon-video-outline:before { content: '\fbb8'; } /* '﮸' */ +.icon-pencil-outline:before { content: '\fc92'; } /* 'ﲒ' */ +.icon-camera-outline:before { content: '\fd39'; } /* 'ﴹ' */ +.icon-file-video-outline:before { content: '\fe10'; } /* '︐' */ +.icon-palette-outline:before { content: '\fe6c'; } /* '﹬' */ +.icon-file-music-outline:before { content: '\fe7c'; } /* 'ﹼ' */ +.icon-file-pdf-outline:before { content: '\fe7d'; } /* 'ﹽ' */ +.icon-file-image-outline:before { content: '\fecd'; } /* 'ﻍ' */ +.icon-reply-outline:before { content: '\ff3d'; } /* ']' */ +.icon-draw:before { content: '\ff66'; } /* 'ヲ' */ +.icon-account-outline:before { content: '󰀓'; } /* '\f0013' */ +.icon-arrow-expand-all:before { content: '󰁌'; } /* '\f004c' */ +.icon-file-code-outline:before { content: '󰁍'; } /* '\f004d' */ +.icon-file-excel-outline:before { content: '󰁏'; } /* '\f004f' */ +.icon-arrow-right:before { content: '󰁔'; } /* '\f0054' */ +.icon-file-powerpoint-outline:before { content: '󰁗'; } /* '\f0057' */ +.icon-file-word-outline:before { content: '󰁠'; } /* '\f0060' */ +.icon-bookmark:before { content: '󰃀'; } /* '\f00c0' */ +.icon-bookmark-outline:before { content: '󰃃'; } /* '\f00c3' */ +.icon-dock-left:before { content: '󰃕'; } /* '\f00d5' */ +.icon-chevron-up:before { content: '󰅃'; } /* '\f0143' */ +.icon-close-circle:before { content: '󰅙'; } /* '\f0159' */ +.icon-content-copy:before { content: '󰆏'; } /* '\f018f' */ +.icon-send-outline:before { content: '󰆐'; } /* '\f0190' */ +.icon-credit-card-outline:before { content: '󰆛'; } /* '\f019b' */ +.icon-view-grid-outline:before { content: '󰈄'; } /* '\f0204' */ +.icon-exit-to-app:before { content: '󰈆'; } /* '\f0206' */ +.icon-file-outline:before { content: '󰈤'; } /* '\f0224' */ +.icon-folder-outline:before { content: '󰉖'; } /* '\f0256' */ +.icon-archive-arrow-up-outline:before { content: '󰊇'; } /* '\f0287' */ +.icon-glasses:before { content: '󰊪'; } /* '\f02aa' */ +.icon-key-variant:before { content: '󰌋'; } /* '\f030b' */ +.icon-magnify-minus:before { content: '󰍊'; } /* '\f034a' */ +.icon-magnify-plus:before { content: '󰍋'; } /* '\f034b' */ +.icon-menu-left:before { content: '󰍞'; } /* '\f035e' */ +.icon-menu-right:before { content: '󰍟'; } /* '\f035f' */ +.icon-menu-up:before { content: '󰍠'; } /* '\f0360' */ +.icon-message-text-outline:before { content: '󰍪'; } /* '\f036a' */ +.icon-minus:before { content: '󰍴'; } /* '\f0374' */ +.icon-minus-circle-outline:before { content: '󰍷'; } /* '\f0377' */ +.icon-pause:before { content: '󰏤'; } /* '\f03e4' */ +.icon-play:before { content: '󰐊'; } /* '\f040a' */ +.icon-radiobox-blank:before { content: '󰐽'; } /* '\f043d' */ +.icon-radiobox-marked:before { content: '󰐾'; } /* '\f043e' */ +.icon-sort-alphabetical-ascending:before { content: '󰖽'; } /* '\f05bd' */ +.icon-playlist-check:before { content: '󰗇'; } /* '\f05c7' */ +.icon-check-circle-outline:before { content: '󰗡'; } /* '\f05e1' */ +.icon-help-circle-outline:before { content: '󰘥'; } /* '\f0625' */ +.icon-circle-multiple-outline:before { content: '󰚕'; } /* '\f0695' */ +.icon-update:before { content: '󰚰'; } /* '\f06b0' */ +.icon-eye-off-outline:before { content: '󰛑'; } /* '\f06d1' */ +.icon-infinity:before { content: '󰛤'; } /* '\f06e4' */ +.icon-arrow-right-bold-outline:before { content: '󰧂'; } /* '\f09c2' */ +.icon-trash-can-outline:before { content: '󰩺'; } /* '\f0a7a' */ +.icon-account-minus-outline:before { content: '󰫬'; } /* '\f0aec' */ +.icon-calendar-outline:before { content: '󰭧'; } /* '\f0b67' */ +.icon-export-variant:before { content: '󰮓'; } /* '\f0b93' */ +.icon-folder-plus-outline:before { content: '󰮝'; } /* '\f0b9d' */ +.icon-home-variant-outline:before { content: '󰮧'; } /* '\f0ba7' */ +.icon-calendar-check-outline:before { content: '󰱄'; } /* '\f0c44' */ +.icon-hand-right:before { content: '󰹇'; } /* '\f0e47' */ +.icon-notebook-outline:before { content: '󰺿'; } /* '\f0ebf' */ +.icon-shield-alert-outline:before { content: '󰻍'; } /* '\f0ecd' */ +.icon-slash-forward:before { content: '󰿟'; } /* '\f0fdf' */ +.icon-file-multiple-outline:before { content: '󱀲'; } /* '\f1032' */ +.icon-message-plus-outline:before { content: '󱂻'; } /* '\f10bb' */ +.icon-message-minus-outline:before { content: '󱅯'; } /* '\f116f' */ +.icon-crown-outline:before { content: '󱇐'; } /* '\f11d0' */ +.icon-folder-move-outline:before { content: '󱉆'; } /* '\f1246' */ diff --git a/src/renderer/css/components/TabBar.css b/src/renderer/css/components/TabBar.css index 46b4f364..131655a2 100644 --- a/src/renderer/css/components/TabBar.css +++ b/src/renderer/css/components/TabBar.css @@ -9,10 +9,6 @@ margin-top: 4px; } -.TabBar.darkMode { - background-color: #202124; -} - .TabBar .teamTabItem span { flex: 0 1 auto; overflow: hidden; diff --git a/src/renderer/css/components/TeamDropdownButton.scss b/src/renderer/css/components/TeamDropdownButton.scss new file mode 100644 index 00000000..d365650d --- /dev/null +++ b/src/renderer/css/components/TeamDropdownButton.scss @@ -0,0 +1,116 @@ +.TeamDropdownButton { + background-color: transparent; + border-width: 0 1px; + border-color: rgba(61, 60, 64, 0.08); + border-style: solid; + display: flex; + align-items: center; + font-family: Open Sans; + + &:hover { + background-color: #f4f4f4; + + .TeamDropdownButton__badge-count, .TeamDropdownButton__badge-unreads { + border-color: #f4f4f4; + } + } + + &:focus, &.isMenuOpen { + background-color: #fff; + + .TeamDropdownButton__badge-count, .TeamDropdownButton__badge-unreads { + border-color: #fff; + } + } + + > span { + color: rgba(61, 60, 64, 0.64); + font-weight: 600; + font-size: 12px; + line-height: 16px; + margin-left: 8px; + } + + i { + color: rgba(61, 60, 64, 0.56); + font-size: 18px; + line-height: 21px; + } +} + +.TeamDropdownButton__badge { + position: relative; +} + +.TeamDropdownButton__badge-count { + background: #F74343; + border-radius: 8px; + display: flex; + align-items: center; + flex: 0 0 auto; + position: absolute; + top: -4px; + right: -2px; + border: 2px solid #efefef; + + > span { + color: white; + font-size: 10px; + line-height: 11px; + padding: 1px 5px; + display: flex; + justify-content: center; + align-items: center; + font-family: "Open Sans", sans-serif; + font-weight: bold; + letter-spacing: normal; + -webkit-font-smoothing: antialiased; + } +} + +.TeamDropdownButton__badge-unreads { + background: #579eff; + border-radius: 100px; + width: 12px; + height: 12px; + position: absolute; + top: -4px; + right: -2px; + border: 2px solid #efefef; +} + +.TeamDropdownButton.darkMode { + border-color: rgba(221, 221, 221, 0.08); + + &:hover { + background-color: #292929; + + .TeamDropdownButton__badge-count, .TeamDropdownButton__badge-unreads { + border-color: #292929; + } + } + + &:focus, &.isMenuOpen { + background-color: #1f1f1f; + + .TeamDropdownButton__badge-count, .TeamDropdownButton__badge-unreads { + border-color: #1f1f1f; + } + } + + > span { + color: rgba(221, 221, 221, 0.64); + } + + i { + color: rgba(221, 221, 221, 0.56); + } + + .TeamDropdownButton__badge-count { + border-color: #2e2e2e; + } + + .TeamDropdownButton__badge-unreads { + border-color: #2e2e2e; + } +} diff --git a/src/renderer/css/dropdown.scss b/src/renderer/css/dropdown.scss new file mode 100644 index 00000000..d4a4904c --- /dev/null +++ b/src/renderer/css/dropdown.scss @@ -0,0 +1,198 @@ +@import url("fonts.css"); + +body { + margin: 0; + background-color: transparent; + font-family: Open Sans; + overflow: hidden; +} + +#app { + padding: 24px; + display: inline-block; +} + +.TeamDropdown { + display: flex; + flex-direction: column; + align-items: flex-start; + padding: 8px 0px; + background: #FFFFFF; + border: 1px solid rgba(61, 60, 64, 0.16); + box-shadow: 0px 8px 24px rgba(0, 0, 0, 0.12); + border-radius: 4px; + min-width: 354px; +} + +.TeamDropdown__header { + padding: 6px 20px; + + > span { + font-weight: 600; + font-size: 14px; + line-height: 20px; + color: #3D3C40; + } +} + +.TeamDropdown__divider { + border-top: 1px solid rgba(61, 60, 64, 0.08); + border-bottom: 0; + width: 100%; + margin: 8px 0; +} + +.TeamDropdown__button { + background-color: transparent; + border: none; + padding: 8px 18px; + display: flex; + width: 100%; + align-items: center; + font-family: Open Sans; + + &:hover { + background-color: rgba(61, 60, 64, 0.08); + + .TeamDropdown__button-edit, .TeamDropdown__button-remove { + opacity: 1; + pointer-events: all; + } + } + + &:focus, &:focus-within { + background-color: rgba(22, 109, 224, 0.08); + outline: none; + + .TeamDropdown__button-edit, .TeamDropdown__button-remove { + opacity: 1; + pointer-events: all; + } + } + + i { + font-size: 18px; + line-height: 20px; + color: rgba(61, 60, 64, 0.56); + } + + > i.icon-check { + color: #166de0; + } + + > span { + font-size: 14px; + line-height: 20px; + color: #3D3C40; + margin-left: 12px; + white-space: nowrap; + } +} + +.TeamDropdown__badge { + display: flex; + justify-content: center; + align-items: center; + margin-left: 18px; + min-width: 32px; +} + +.TeamDropdown__badge-dot { + background: #579EFF; + height: 8px; + width: 8px; + border-radius: 8px; + flex: 0 0 8px; +} + +.TeamDropdown__badge-count { + background: #F74343; + text-align: center; + border-radius: 8px; + padding: 0 4px; + display: flex; + align-items: center; + justify-content: center; + + > span { + letter-spacing: 0.02em; + -webkit-font-smoothing: antialiased; + font-family: "Open Sans", sans-serif; + line-height: 16px; + padding: 0 2.5px; + color: white; + font-size: 11px; + font-weight: bold; + } +} + +.TeamDropdown__indicators { + margin-left: auto; + display: flex; + + > button { + margin-left: 18px; + background-color: transparent; + border: none; + padding: 0; + + > i::before { + margin: 0; + } + } +} + +.TeamDropdown__button-edit, .TeamDropdown__button-remove { + opacity: 0; + pointer-events: none; +} + +.TeamDropdown__button-remove { + margin-right: 7px; + + + .TeamDropdown__badge { + margin-left: 7px; + } + + i { + color: #f74343; + } +} + +.TeamDropdown.darkMode { + background: #1f1f1f; + + .TeamDropdown__header > span { + color: #DDD; + } + + .TeamDropdown__divider { + border-color: rgba(221, 221, 221, 0.08); + } + + .TeamDropdown__button { + &:hover { + background-color: rgba(221, 221, 221, 0.08); + } + + &:focus { + background-color: rgba(1, 119, 231, 0.08); + } + + > i.icon-server-variant, i.icon-plus { + color: rgba(221, 221, 221, 0.56); + } + + > span { + color: #DDD; + } + } + + .TeamDropdown__badge-expired i { + color: rgba(221, 221, 221, 0.56); + } + + .TeamDropdown__button-edit > i { + color: rgba(221, 221, 221, 0.56); + } +} diff --git a/src/renderer/css/fonts.css b/src/renderer/css/fonts.css new file mode 100644 index 00000000..1feac8dc --- /dev/null +++ b/src/renderer/css/fonts.css @@ -0,0 +1,41 @@ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 300; + src: url('../../assets/fonts/open-sans-v13-latin-ext_latin_cyrillic-ext_greek-ext_greek_cyrillic_vietnamese-300.woff2') format('woff2'); + } + + @font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 300; + src: url('../../assets/fonts/open-sans-v13-latin-ext_latin_cyrillic-ext_greek-ext_greek_cyrillic_vietnamese-300italic.woff2') format('woff2'); + } + + @font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 400; + src: url('../../assets/fonts/open-sans-v13-latin-ext_latin_cyrillic-ext_greek-ext_greek_cyrillic_vietnamese-regular.woff2') format('woff2'); + } + + @font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 400; + src: url('../../assets/fonts/open-sans-v13-latin-ext_latin_cyrillic-ext_greek-ext_greek_cyrillic_vietnamese-italic.woff2') format('woff2'); + } + + @font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 600; + src: url('../../assets/fonts/open-sans-v13-latin-ext_latin_cyrillic-ext_greek-ext_greek_cyrillic_vietnamese-600.woff2') format('woff2'); + } + + @font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 600; + src: url('../../assets/fonts/open-sans-v13-latin-ext_latin_cyrillic-ext_greek-ext_greek_cyrillic_vietnamese-600italic.woff2') format('woff2'); + } diff --git a/src/renderer/css/index.css b/src/renderer/css/index.css index 08a2d9ea..5515aa67 100644 --- a/src/renderer/css/index.css +++ b/src/renderer/css/index.css @@ -1,47 +1,7 @@ @import url("components/index.css"); +@import url("fonts.css"); @import '~font-awesome/css/font-awesome.css'; -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 300; - src: url('../../assets/fonts/open-sans-v13-latin-ext_latin_cyrillic-ext_greek-ext_greek_cyrillic_vietnamese-300.woff2') format('woff2'); -} - -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 300; - src: url('../../assets/fonts/open-sans-v13-latin-ext_latin_cyrillic-ext_greek-ext_greek_cyrillic_vietnamese-300italic.woff2') format('woff2'); -} - -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 400; - src: url('../../assets/fonts/open-sans-v13-latin-ext_latin_cyrillic-ext_greek-ext_greek_cyrillic_vietnamese-regular.woff2') format('woff2'); -} - -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 400; - src: url('../../assets/fonts/open-sans-v13-latin-ext_latin_cyrillic-ext_greek-ext_greek_cyrillic_vietnamese-italic.woff2') format('woff2'); -} - -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 600; - src: url('../../assets/fonts/open-sans-v13-latin-ext_latin_cyrillic-ext_greek-ext_greek_cyrillic_vietnamese-600.woff2') format('woff2'); -} - -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 600; - src: url('../../assets/fonts/open-sans-v13-latin-ext_latin_cyrillic-ext_greek-ext_greek_cyrillic_vietnamese-600italic.woff2') format('woff2'); -} html { height: 100%; @@ -85,8 +45,8 @@ body { .topBar>.topBar-bg { display: flex; overflow: hidden; - height: 36px; - background-color: rgba(0,0,0,0.1); + height: 40px; + background-color: #efefef; width: 100%; } @@ -94,13 +54,8 @@ body { opacity: 0.4; } -.topBar.darkMode { - background-color: #323639; - color: #fff; -} - .topBar.darkMode>.topBar-bg { - background-color: #202124; + background-color: #2e2e2e; } .topBar .three-dot-menu { @@ -114,7 +69,7 @@ body { z-index: 9; color: rgba(61,60,64,0.7); -webkit-app-region: no-drag; - background-color: rgba(229, 229, 229, 1); + background-color: transparent; } .topBar .three-dot-menu svg { @@ -155,13 +110,11 @@ body { } .topBar.darkMode .three-dot-menu { - background-color: #202124; color: rgba(243,243,243,0.7); } .topBar.darkMode .title-bar-btns { color: rgba(243,243,243,0.7); - background-color: #202124; } .topBar .title-bar-btns { @@ -173,7 +126,6 @@ body { -webkit-app-region: no-drag; display: grid; grid-template-columns: repeat(3, 46px); - background-color: #e5e5e5; } .topBar .title-bar-btns>.button { @@ -244,11 +196,11 @@ body { .topBar .overlay-gradient { flex: 0 0 40px; z-index: 9; - background: linear-gradient(90deg, rgba(0, 0, 0, 0) 0%, #e5e5e5 100%); + /* background: linear-gradient(90deg, rgba(0, 0, 0, 0) 0%, #e5e5e5 100%); */ -webkit-app-region: drag; margin-top: 4px; } .topBar.darkMode .overlay-gradient { - background: linear-gradient(90deg, rgba(0, 0, 0, 0) 0%, #202124 100%); + /* background: linear-gradient(90deg, rgba(0, 0, 0, 0) 0%, #202124 100%); */ } diff --git a/src/renderer/dropdown.tsx b/src/renderer/dropdown.tsx new file mode 100644 index 00000000..4ac39068 --- /dev/null +++ b/src/renderer/dropdown.tsx @@ -0,0 +1,166 @@ +// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import React from 'react'; +import ReactDOM from 'react-dom'; +import classNames from 'classnames'; + +import {Team} from 'types/config'; + +import {CLOSE_TEAMS_DROPDOWN, REQUEST_TEAMS_DROPDOWN_INFO, SEND_DROPDOWN_MENU_SIZE, SHOW_NEW_SERVER_MODAL, SWITCH_SERVER, UPDATE_TEAMS_DROPDOWN} from 'common/communication'; + +import './css/dropdown.scss'; +import './css/compass-icons.css'; + +type State = { + teams?: Team[]; + orderedTeams?: Team[]; + activeTeam?: string; + darkMode?: boolean; + unreads?: Map; + mentions?: Map; + expired?: Map; +} + +class TeamDropdown extends React.PureComponent, State> { + constructor(props: Record) { + super(props); + this.state = {}; + + window.addEventListener('message', this.handleMessageEvent); + } + + handleMessageEvent = (event: MessageEvent) => { + if (event.data.type === UPDATE_TEAMS_DROPDOWN) { + const {teams, activeTeam, darkMode, unreads, mentions, expired} = event.data.data; + this.setState({ + teams, + orderedTeams: teams.concat().sort((a: Team, b: Team) => a.order - b.order), + activeTeam, + darkMode, + unreads, + mentions, + expired, + }); + } + } + + selectServer = (team: Team) => { + return () => { + window.postMessage({type: SWITCH_SERVER, data: team.name}, window.location.href); + this.closeMenu(); + }; + } + + closeMenu = () => { + (document.activeElement as HTMLElement).blur(); + window.postMessage({type: CLOSE_TEAMS_DROPDOWN}, window.location.href); + } + + preventPropogation = (event: React.MouseEvent) => { + event.stopPropagation(); + } + + addServer = () => { + window.postMessage({type: SHOW_NEW_SERVER_MODAL}, window.location.href); + this.closeMenu(); + } + + isActiveTeam = (team: Team) => { + return team.name === this.state.activeTeam; + } + + componentDidMount() { + window.postMessage({type: REQUEST_TEAMS_DROPDOWN_INFO}, window.location.href); + window.addEventListener('click', this.closeMenu); + } + + componentDidUpdate() { + window.postMessage({type: SEND_DROPDOWN_MENU_SIZE, data: {width: document.body.scrollWidth, height: document.body.scrollHeight}}, window.location.href); + } + + componentWillUnmount() { + window.removeEventListener('click', this.closeMenu); + } + + render() { + return ( +
+
+ {'Servers'} +
+
+ {this.state.orderedTeams?.map((team, index) => { + const sessionExpired = this.state.expired?.get(team.name); + const hasUnreads = this.state.unreads?.get(team.name); + const mentionCount = this.state.mentions?.get(team.name); + + let badgeDiv: React.ReactNode; + if (sessionExpired) { + badgeDiv = ( +
+ +
+ ); + } else if (mentionCount && mentionCount > 0) { + badgeDiv = ( +
+ {mentionCount > 99 ? '99+' : mentionCount} +
+ ); + } else if (hasUnreads) { + badgeDiv = ( +
+ ); + } + + return ( + + + {badgeDiv &&
+ {badgeDiv} +
} +
+ + ); + })} +
+ +
+ ); + } +} + +ReactDOM.render( + , + document.getElementById('app'), +); diff --git a/webpack.config.main.js b/webpack.config.main.js index 7803cd0c..efd2f53f 100644 --- a/webpack.config.main.js +++ b/webpack.config.main.js @@ -18,6 +18,7 @@ module.exports = merge(base, { entry: { index: './src/main/main.ts', mainWindow: './src/main/preload/mainWindow.js', + dropdown: './src/main/preload/dropdown.js', preload: './src/main/preload/mattermost.js', modalPreload: './src/main/preload/modalPreload.js', loadingScreenPreload: './src/main/preload/loadingScreenPreload.js', diff --git a/webpack.config.renderer.js b/webpack.config.renderer.js index 9e0a592d..83b8863d 100644 --- a/webpack.config.renderer.js +++ b/webpack.config.renderer.js @@ -19,6 +19,7 @@ module.exports = merge(base, { entry: { index: './src/renderer/index.tsx', settings: './src/renderer/settings.tsx', + dropdown: './src/renderer/dropdown.tsx', urlView: './src/renderer/modals/urlView/urlView.tsx', newServer: './src/renderer/modals/newServer/newServer.tsx', loginModal: './src/renderer/modals/login/login.tsx', @@ -43,6 +44,12 @@ module.exports = merge(base, { chunks: ['settings'], filename: 'settings.html', }), + new HtmlWebpackPlugin({ + title: 'Mattermost Desktop Settings', + template: 'src/renderer/index.html', + chunks: ['dropdown'], + filename: 'dropdown.html', + }), new HtmlWebpackPlugin({ title: 'Mattermost Desktop Settings', template: 'src/renderer/index.html', @@ -97,6 +104,13 @@ module.exports = merge(base, { MiniCssExtractPlugin.loader, 'css-loader', ], + }, { + test: /\.scss$/, + use: [ + MiniCssExtractPlugin.loader, + 'css-loader', + 'sass-loader', + ], }, { test: /\.mp3$/, use: {