From faf2dae74b4248e7be6bccdd151f47e3e72d56c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Mondrag=C3=B3n?= <79058848+julmondragon@users.noreply.github.com> Date: Tue, 16 Aug 2022 12:33:03 -0500 Subject: [PATCH] MM-25003_Improve Onboarding screens for the desktop app - Intro Screen (#2220) --- e2e/specs/startup/app.test.js | 28 ++- .../startup/welcome_screen_modal.test.js | 142 ++++++++++++ e2e/utils/artifacts.js | 1 - e2e/utils/test_cases.js | 1 - i18n/en.json | 10 + src/assets/fonts/Metropolis-Light.woff | Bin 0 -> 17576 bytes src/assets/fonts/Metropolis-LightItalic.woff | Bin 0 -> 18416 bytes src/assets/fonts/Metropolis-Regular.woff | Bin 0 -> 17396 bytes .../fonts/Metropolis-RegularItalic.woff | Bin 0 -> 18352 bytes src/assets/fonts/Metropolis-SemiBold.woff | Bin 0 -> 17664 bytes .../fonts/Metropolis-SemiBoldItalic.woff | Bin 0 -> 18452 bytes src/common/communication.ts | 1 + src/main/ParseArgs.ts | 2 +- src/main/app/config.test.js | 6 +- src/main/app/config.ts | 4 +- src/main/app/initialize.test.js | 2 +- src/main/app/initialize.ts | 6 +- src/main/app/intercom.test.js | 21 ++ src/main/app/intercom.ts | 45 +++- src/main/views/viewManager.test.js | 4 +- src/main/views/viewManager.ts | 4 +- src/main/windows/windowManager.test.js | 80 +++++++ src/main/windows/windowManager.ts | 36 ++- src/renderer/assets/svg/bullseye.svg | 20 ++ src/renderer/assets/svg/channels.svg | 24 ++ src/renderer/assets/svg/chat2.svg | 210 ++++++++++++++++++ src/renderer/assets/svg/clipboard.svg | 22 ++ src/renderer/components/Carousel/Carousel.tsx | 137 ++++++++++++ .../components/Carousel/CarouselButton.tsx | 51 +++++ .../Carousel/CarouselPaginationIndicator.tsx | 74 ++++++ src/renderer/components/Carousel/index.ts | 4 + src/renderer/components/Header/Header.tsx | 35 +++ src/renderer/components/Header/index.ts | 4 + src/renderer/components/Logo.tsx | 35 +++ src/renderer/components/MainPage.tsx | 23 +- .../WelcomeScreen/WelcomeScreen.tsx | 149 +++++++++++++ .../WelcomeScreen/WelcomeScreenSlide.tsx | 45 ++++ .../components/WelcomeScreen/index.ts | 4 + src/renderer/css/_css_variables.scss | 14 ++ src/renderer/css/components/Button.scss | 177 +++++++++++++++ src/renderer/css/components/Carousel.scss | 94 ++++++++ .../css/components/CarouselButton.scss | 10 + .../CarouselPaginationIndicator.scss | 70 ++++++ src/renderer/css/components/Header.scss | 36 +++ .../css/components/WelcomeScreen.scss | 35 +++ .../css/components/WelcomeScreenSlide.scss | 60 +++++ src/renderer/css/fonts.css | 42 ++++ src/renderer/css/index.css | 22 ++ .../modals/welcomeScreen/welcomeScreen.tsx | 60 +++++ webpack.config.renderer.js | 7 + 50 files changed, 1815 insertions(+), 42 deletions(-) create mode 100644 e2e/specs/startup/welcome_screen_modal.test.js create mode 100644 src/assets/fonts/Metropolis-Light.woff create mode 100644 src/assets/fonts/Metropolis-LightItalic.woff create mode 100644 src/assets/fonts/Metropolis-Regular.woff create mode 100644 src/assets/fonts/Metropolis-RegularItalic.woff create mode 100644 src/assets/fonts/Metropolis-SemiBold.woff create mode 100644 src/assets/fonts/Metropolis-SemiBoldItalic.woff create mode 100644 src/renderer/assets/svg/bullseye.svg create mode 100644 src/renderer/assets/svg/channels.svg create mode 100644 src/renderer/assets/svg/chat2.svg create mode 100644 src/renderer/assets/svg/clipboard.svg create mode 100644 src/renderer/components/Carousel/Carousel.tsx create mode 100644 src/renderer/components/Carousel/CarouselButton.tsx create mode 100644 src/renderer/components/Carousel/CarouselPaginationIndicator.tsx create mode 100644 src/renderer/components/Carousel/index.ts create mode 100644 src/renderer/components/Header/Header.tsx create mode 100644 src/renderer/components/Header/index.ts create mode 100644 src/renderer/components/Logo.tsx create mode 100644 src/renderer/components/WelcomeScreen/WelcomeScreen.tsx create mode 100644 src/renderer/components/WelcomeScreen/WelcomeScreenSlide.tsx create mode 100644 src/renderer/components/WelcomeScreen/index.ts create mode 100644 src/renderer/css/_css_variables.scss create mode 100644 src/renderer/css/components/Button.scss create mode 100644 src/renderer/css/components/Carousel.scss create mode 100644 src/renderer/css/components/CarouselButton.scss create mode 100644 src/renderer/css/components/CarouselPaginationIndicator.scss create mode 100644 src/renderer/css/components/Header.scss create mode 100644 src/renderer/css/components/WelcomeScreen.scss create mode 100644 src/renderer/css/components/WelcomeScreenSlide.scss create mode 100644 src/renderer/modals/welcomeScreen/welcomeScreen.tsx diff --git a/e2e/specs/startup/app.test.js b/e2e/specs/startup/app.test.js index d530fd80..21ea049e 100644 --- a/e2e/specs/startup/app.test.js +++ b/e2e/specs/startup/app.test.js @@ -7,6 +7,7 @@ const robot = require('robotjs'); const env = require('../../modules/environment'); +const {asyncSleep} = require('../../modules/utils'); describe('startup/app', function desc() { this.timeout(30000); @@ -15,6 +16,11 @@ describe('startup/app', function desc() { env.createTestUserDataDir(); env.cleanTestConfig(); this.app = await env.getApp(); + + // Skip welcome screen modal + const welcomeScreenModal = this.app.windows().find((window) => window.url().includes('welcomeScreen')); + welcomeScreenModal.click('.WelcomeScreen .WelcomeScreen__button'); + await asyncSleep(500); }); afterEach(async () => { @@ -41,10 +47,10 @@ describe('startup/app', function desc() { existingModal.should.not.be.null; }); - it('MM-T4399_2 should show no servers configured in dropdown when no servers exist', async () => { + it('MM-T4985 should show app name in title bar when no servers exist', async () => { const mainWindow = this.app.windows().find((window) => window.url().includes('index')); - const dropdownButtonText = await mainWindow.innerText('.TeamDropdownButton'); - dropdownButtonText.should.equal('No servers configured'); + const titleBarText = await mainWindow.innerText('.app-title'); + titleBarText.should.equal('Mattermost'); }); it('MM-T4400 should be stopped when the app instance already exists', (done) => { @@ -62,4 +68,20 @@ describe('startup/app', function desc() { done(new Error('Second app instance exists')); }); }); + + it('MM-T4975 should show the welcome screen modal when no servers exist', async () => { + if (this.app) { + await this.app.close(); + } + await env.clearElectronInstances(); + env.createTestUserDataDir(); + env.cleanTestConfig(); + this.app = await env.getApp(); + + await asyncSleep(500); + + const welcomeScreenModal = this.app.windows().find((window) => window.url().includes('welcomeScreen')); + const modalButton = await welcomeScreenModal.innerText('.WelcomeScreen .WelcomeScreen__button'); + modalButton.should.equal('Get Started'); + }); }); diff --git a/e2e/specs/startup/welcome_screen_modal.test.js b/e2e/specs/startup/welcome_screen_modal.test.js new file mode 100644 index 00000000..892012b0 --- /dev/null +++ b/e2e/specs/startup/welcome_screen_modal.test.js @@ -0,0 +1,142 @@ +// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +'use strict'; + +const env = require('../../modules/environment'); +const {asyncSleep} = require('../../modules/utils'); + +describe('Welcome Screen Modal', function desc() { + this.timeout(30000); + + beforeEach(async () => { + env.createTestUserDataDir(); + env.cleanTestConfig(); + await asyncSleep(1000); + + this.app = await env.getApp(); + + welcomeScreenModal = this.app.windows().find((window) => window.url().includes('welcomeScreen')); + }); + + afterEach(async () => { + if (this.app) { + await this.app.close(); + } + await env.clearElectronInstances(); + }); + + let welcomeScreenModal; + + it('MM-T4976 should show the slides in the expected order', async () => { + const welcomeSlideClass = await welcomeScreenModal.getAttribute('#welcome', 'class'); + welcomeSlideClass.should.contain('Carousel__slide-current'); + + await welcomeScreenModal.click('#nextCarouselButton'); + + const channelSlideClass = await welcomeScreenModal.getAttribute('#channels', 'class'); + channelSlideClass.should.contain('Carousel__slide-current'); + + await welcomeScreenModal.click('#nextCarouselButton'); + + const playbooksSlideClass = await welcomeScreenModal.getAttribute('#playbooks', 'class'); + playbooksSlideClass.should.contain('Carousel__slide-current'); + + await welcomeScreenModal.click('#nextCarouselButton'); + + const boardsSlideClass = await welcomeScreenModal.getAttribute('#boards', 'class'); + boardsSlideClass.should.contain('Carousel__slide-current'); + }); + + it('MM-T4977 should be able to move through slides clicking the navigation buttons', async () => { + let welcomeSlideClass = await welcomeScreenModal.getAttribute('#welcome', 'class'); + welcomeSlideClass.should.contain('Carousel__slide-current'); + + await welcomeScreenModal.click('#nextCarouselButton'); + + const channelSlideClass = await welcomeScreenModal.getAttribute('#channels', 'class'); + channelSlideClass.should.contain('Carousel__slide-current'); + + await welcomeScreenModal.click('#prevCarouselButton'); + + welcomeSlideClass = await welcomeScreenModal.getAttribute('#welcome', 'class'); + welcomeSlideClass.should.contain('Carousel__slide-current'); + }); + + it('MM-T4978 should be able to move through slides clicking the pagination indicator', async () => { + const welcomeSlideClass = await welcomeScreenModal.getAttribute('#welcome', 'class'); + welcomeSlideClass.should.contain('Carousel__slide-current'); + + await welcomeScreenModal.click('#PaginationIndicator3'); + + const boardsSlideClass = await welcomeScreenModal.getAttribute('#boards', 'class'); + boardsSlideClass.should.contain('Carousel__slide-current'); + + await welcomeScreenModal.click('#PaginationIndicator2'); + + const playbooksSlideClass = await welcomeScreenModal.getAttribute('#playbooks', 'class'); + playbooksSlideClass.should.contain('Carousel__slide-current'); + }); + + it('MM-T4979 should be able to move forward through slides automatically every 5 seconds', async () => { + const welcomeSlideClass = await welcomeScreenModal.getAttribute('#welcome', 'class'); + welcomeSlideClass.should.contain('Carousel__slide-current'); + + await asyncSleep(5500); + + const channelSlideClass = await welcomeScreenModal.getAttribute('#channels', 'class'); + channelSlideClass.should.contain('Carousel__slide-current'); + }); + + it('MM-T4980 should show the slides in the expected order', async () => { + const welcomeSlideClass = await welcomeScreenModal.getAttribute('#welcome', 'class'); + welcomeSlideClass.should.contain('Carousel__slide-current'); + + await welcomeScreenModal.click('#nextCarouselButton'); + + const channelSlideClass = await welcomeScreenModal.getAttribute('#channels', 'class'); + channelSlideClass.should.contain('Carousel__slide-current'); + + await welcomeScreenModal.click('#nextCarouselButton'); + + const playbooksSlideClass = await welcomeScreenModal.getAttribute('#playbooks', 'class'); + playbooksSlideClass.should.contain('Carousel__slide-current'); + + await welcomeScreenModal.click('#nextCarouselButton'); + + const boardsSlideClass = await welcomeScreenModal.getAttribute('#boards', 'class'); + boardsSlideClass.should.contain('Carousel__slide-current'); + }); + + it('MM-T4981 should be able to move from last to first slide', async () => { + await welcomeScreenModal.click('#PaginationIndicator3'); + + const boardsSlideClass = await welcomeScreenModal.getAttribute('#boards', 'class'); + boardsSlideClass.should.contain('Carousel__slide-current'); + + await welcomeScreenModal.click('#nextCarouselButton'); + + const welcomeSlideClass = await welcomeScreenModal.getAttribute('#welcome', 'class'); + welcomeSlideClass.should.contain('Carousel__slide-current'); + }); + + it('MM-T4982 should be able to move from first to last slide', async () => { + const welcomeSlideClass = await welcomeScreenModal.getAttribute('#welcome', 'class'); + welcomeSlideClass.should.contain('Carousel__slide-current'); + + await welcomeScreenModal.click('#prevCarouselButton'); + + const boardsSlideClass = await welcomeScreenModal.getAttribute('#boards', 'class'); + boardsSlideClass.should.contain('Carousel__slide-current'); + }); + + it('MM-T4983 should be able to click the get started button and be redirected to new server modal', async () => { + await welcomeScreenModal.click('#getStartedWelcomeScreen'); + + const newServerModal = await this.app.waitForEvent('window', { + predicate: (window) => window.url().includes('newServer'), + }); + const modalTitle = await newServerModal.innerText('#newServerModal .modal-title'); + modalTitle.should.equal('Add Server'); + }); +}); diff --git a/e2e/utils/artifacts.js b/e2e/utils/artifacts.js index 67fd476a..467f758c 100644 --- a/e2e/utils/artifacts.js +++ b/e2e/utils/artifacts.js @@ -1,7 +1,6 @@ // Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. - /* eslint-disable no-console,consistent-return */ const fs = require('fs'); diff --git a/e2e/utils/test_cases.js b/e2e/utils/test_cases.js index f9a953a7..cb329487 100644 --- a/e2e/utils/test_cases.js +++ b/e2e/utils/test_cases.js @@ -1,7 +1,6 @@ // Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. - /* eslint-disable no-console */ // See reference: https://support.smartbear.com/tm4j-cloud/api-docs/ diff --git a/i18n/en.json b/i18n/en.json index 4bd4b40a..fd3be2c2 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -131,6 +131,7 @@ "renderer.components.extraBar.back": "Back", "renderer.components.mainPage.contextMenu.ariaLabel": "Context menu", "renderer.components.mainPage.downloadingUpdate": "Downloading update. {percentDone}% of {total} @ {speed}/s", + "renderer.components.mainPage.titleBar": "Mattermost", "renderer.components.mainPage.updateAvailable": "Update available", "renderer.components.mainPage.updateReady": "Update ready to install", "renderer.components.newTeamModal.error.nameRequired": "Name is required.", @@ -213,6 +214,15 @@ "renderer.components.showCertificateModal.serialNumber": "Serial Number", "renderer.components.showCertificateModal.subjectName": "Subject Name", "renderer.components.teamDropdownButton.noServersConfigured": "No servers configured", + "renderer.components.welcomeScreen.button.getStarted": "Get Started", + "renderer.components.welcomeScreen.slides.boards.subtitle": "Ship on time, every time, with a project and task management solution built for digital operations.", + "renderer.components.welcomeScreen.slides.boards.title": "Boards", + "renderer.components.welcomeScreen.slides.channels.subtitle": "All of your team’s communication in one place.

Secure collaboration, built for developers.", + "renderer.components.welcomeScreen.slides.channels.title": "Channels", + "renderer.components.welcomeScreen.slides.palybooks.subtitle": "Move faster and make fewer mistakes with checklists, automations, and tool integrations that power your team’s workflows.", + "renderer.components.welcomeScreen.slides.playbooks.title": "Playbooks", + "renderer.components.welcomeScreen.slides.welcome.subtitle": "Mattermost is an open source platform for developer collaboration. Secure, flexible, and integrated with the tools you love.", + "renderer.components.welcomeScreen.slides.welcome.title": "Welcome", "renderer.dropdown.addAServer": "Add a server", "renderer.dropdown.servers": "Servers", "renderer.modals.certificate.certificateModal.certInfoButton": "Certificate Information", diff --git a/src/assets/fonts/Metropolis-Light.woff b/src/assets/fonts/Metropolis-Light.woff new file mode 100644 index 0000000000000000000000000000000000000000..6a6bde7479fb1aed2a350d765f927f1e056a28e5 GIT binary patch literal 17576 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 C78Iob literal 0 HcmV?d00001 diff --git a/src/assets/fonts/Metropolis-LightItalic.woff b/src/assets/fonts/Metropolis-LightItalic.woff new file mode 100644 index 0000000000000000000000000000000000000000..6f67b9a059563fe103b98b9f9fd891fc39eb8184 GIT binary patch literal 18416 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 CZQn2e literal 0 HcmV?d00001 diff --git a/src/assets/fonts/Metropolis-Regular.woff b/src/assets/fonts/Metropolis-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..258ae60f15069c7f90ee6d294d5460a1555acc62 GIT binary patch literal 17396 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 Sde45f_yq|50+%%CU;qH`OY!6Y literal 0 HcmV?d00001 diff --git a/src/assets/fonts/Metropolis-RegularItalic.woff b/src/assets/fonts/Metropolis-RegularItalic.woff new file mode 100644 index 0000000000000000000000000000000000000000..861bfdebf059f6dc52a7b14fc7da17cc412a2bdc GIT binary patch literal 18352 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 literal 0 HcmV?d00001 diff --git a/src/assets/fonts/Metropolis-SemiBoldItalic.woff b/src/assets/fonts/Metropolis-SemiBoldItalic.woff new file mode 100644 index 0000000000000000000000000000000000000000..dca153bb008477e86d8c081ce2b699bdabd10d02 GIT binary patch literal 18452 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 literal 0 HcmV?d00001 diff --git a/src/common/communication.ts b/src/common/communication.ts index 3465b76f..c3b7dd6b 100644 --- a/src/common/communication.ts +++ b/src/common/communication.ts @@ -35,6 +35,7 @@ export const DOUBLE_CLICK_ON_WINDOW = 'double_click'; export const SHOW_NEW_SERVER_MODAL = 'show_new_server_modal'; export const SHOW_EDIT_SERVER_MODAL = 'show-edit-server-modal'; export const SHOW_REMOVE_SERVER_MODAL = 'show-remove-server-modal'; +export const MAIN_WINDOW_SHOWN = 'main-window-shown'; export const RETRIEVE_MODAL_INFO = 'retrieve-modal-info'; export const MODAL_INFO = 'modal-info'; diff --git a/src/main/ParseArgs.ts b/src/main/ParseArgs.ts index b1b6300e..c68aa7bb 100644 --- a/src/main/ParseArgs.ts +++ b/src/main/ParseArgs.ts @@ -55,7 +55,7 @@ function parseArgs(args: string[]) { // build. As such, we provide the version manually. version(app.getVersion()). help('help'). - parse(args); + parse(args) as Args; } function validateArgs(args: Args) { diff --git a/src/main/app/config.test.js b/src/main/app/config.test.js index d49c51d7..945041b0 100644 --- a/src/main/app/config.test.js +++ b/src/main/app/config.test.js @@ -7,7 +7,7 @@ import {RELOAD_CONFIGURATION} from 'common/communication'; import Config from 'common/config'; import {handleConfigUpdate} from 'main/app/config'; -import {addNewServerModalWhenMainWindowIsShown} from 'main/app/intercom'; +import {handleMainWindowIsShown} from 'main/app/intercom'; import {setLoggingLevel} from 'main/app/utils'; import WindowManager from 'main/windows/windowManager'; @@ -32,7 +32,7 @@ jest.mock('main/app/utils', () => ({ setLoggingLevel: jest.fn(), })); jest.mock('main/app/intercom', () => ({ - addNewServerModalWhenMainWindowIsShown: jest.fn(), + handleMainWindowIsShown: jest.fn(), })); jest.mock('main/AutoLauncher', () => ({ enable: jest.fn(), @@ -98,7 +98,7 @@ describe('main/app/config', () => { Config.registryConfigData = {}; handleConfigUpdate({teams: []}); - expect(addNewServerModalWhenMainWindowIsShown).toHaveBeenCalled(); + expect(handleMainWindowIsShown).toHaveBeenCalled(); Object.defineProperty(process, 'platform', { value: originalPlatform, diff --git a/src/main/app/config.ts b/src/main/app/config.ts index 20997536..1b74f974 100644 --- a/src/main/app/config.ts +++ b/src/main/app/config.ts @@ -14,7 +14,7 @@ import {setUnreadBadgeSetting} from 'main/badge'; import {refreshTrayImages} from 'main/tray/tray'; import WindowManager from 'main/windows/windowManager'; -import {addNewServerModalWhenMainWindowIsShown} from './intercom'; +import {handleMainWindowIsShown} from './intercom'; import {handleUpdateMenuEvent, setLoggingLevel, updateServerInfos, updateSpellCheckerLocales} from './utils'; let didCheckForAddServerModal = false; @@ -61,7 +61,7 @@ export function handleConfigUpdate(newConfig: CombinedConfig) { updateServerInfos(newConfig.teams); WindowManager.initializeCurrentServerName(); if (newConfig.teams.length === 0) { - addNewServerModalWhenMainWindowIsShown(); + handleMainWindowIsShown(); } } diff --git a/src/main/app/initialize.test.js b/src/main/app/initialize.test.js index 00c64fdb..4009e2a5 100644 --- a/src/main/app/initialize.test.js +++ b/src/main/app/initialize.test.js @@ -98,7 +98,7 @@ jest.mock('main/app/config', () => ({ handleConfigUpdate: jest.fn(), })); jest.mock('main/app/intercom', () => ({ - addNewServerModalWhenMainWindowIsShown: jest.fn(), + handleMainWindowIsShown: jest.fn(), })); jest.mock('main/app/utils', () => ({ clearAppCache: jest.fn(), diff --git a/src/main/app/initialize.ts b/src/main/app/initialize.ts index 1a697266..34be5451 100644 --- a/src/main/app/initialize.ts +++ b/src/main/app/initialize.ts @@ -34,6 +34,7 @@ import { START_UPGRADE, START_DOWNLOAD, PING_DOMAIN, + MAIN_WINDOW_SHOWN, } from 'common/communication'; import Config from 'common/config'; import urlUtils from 'common/utils/url'; @@ -68,7 +69,7 @@ import { } from './app'; import {handleConfigUpdate, handleDarkModeChange} from './config'; import { - addNewServerModalWhenMainWindowIsShown, + handleMainWindowIsShown, handleAppVersion, handleCloseTab, handleEditServerModal, @@ -247,6 +248,7 @@ function initializeInterCommunicationEventListeners() { ipcMain.on(SHOW_NEW_SERVER_MODAL, handleNewServerModal); ipcMain.on(SHOW_EDIT_SERVER_MODAL, handleEditServerModal); ipcMain.on(SHOW_REMOVE_SERVER_MODAL, handleRemoveServerModal); + ipcMain.on(MAIN_WINDOW_SHOWN, handleMainWindowIsShown); ipcMain.on(WINDOW_CLOSE, WindowManager.close); ipcMain.on(WINDOW_MAXIMIZE, WindowManager.maximize); ipcMain.on(WINDOW_MINIMIZE, WindowManager.minimize); @@ -423,7 +425,7 @@ function initializeAfterAppReady() { // only check for non-Windows, as with Windows we have to wait for GPO teams if (process.platform !== 'win32' || typeof Config.registryConfigData !== 'undefined') { if (Config.teams.length === 0) { - addNewServerModalWhenMainWindowIsShown(); + handleMainWindowIsShown(); } } } diff --git a/src/main/app/intercom.test.js b/src/main/app/intercom.test.js index 41fe847a..a78066eb 100644 --- a/src/main/app/intercom.test.js +++ b/src/main/app/intercom.test.js @@ -14,6 +14,7 @@ import { handleNewServerModal, handleEditServerModal, handleRemoveServerModal, + handleWelcomeScreenModal, } from './intercom'; jest.mock('common/config', () => ({ @@ -235,4 +236,24 @@ describe('main/app/intercom', () => { })); }); }); + + describe('handleWelcomeScreenModal', () => { + beforeEach(() => { + getLocalURLString.mockReturnValue('/some/index.html'); + getLocalPreload.mockReturnValue('/some/preload.js'); + WindowManager.getMainWindow.mockReturnValue({}); + + Config.set.mockImplementation((name, value) => { + Config[name] = value; + }); + }); + + it('should show welcomeScreen modal', async () => { + const promise = Promise.resolve({}); + ModalManager.addModal.mockReturnValue(promise); + + handleWelcomeScreenModal(); + expect(ModalManager.addModal).toHaveBeenCalledWith('welcomeScreen', '/some/index.html', '/some/preload.js', {}, {}, true); + }); + }); }); diff --git a/src/main/app/intercom.ts b/src/main/app/intercom.ts index 9c856a9d..3648f996 100644 --- a/src/main/app/intercom.ts +++ b/src/main/app/intercom.ts @@ -85,15 +85,26 @@ export function handleOpenTab(event: IpcMainEvent, serverName: string, tabName: Config.set('teams', teams); } -export function addNewServerModalWhenMainWindowIsShown() { +export function handleMainWindowIsShown() { + const showWelcomeScreen = !Config.teams.length; const mainWindow = WindowManager.getMainWindow(); + if (mainWindow) { if (mainWindow.isVisible()) { - handleNewServerModal(); + if (showWelcomeScreen) { + handleWelcomeScreenModal(); + } else { + handleNewServerModal(); + } } else { mainWindow.once('show', () => { - log.debug('Intercom.addNewServerModalWhenMainWindowIsShown.show'); - handleNewServerModal(); + if (showWelcomeScreen) { + log.debug('Intercom.handleMainWindowIsShown.show.welcomeScreenModal'); + handleWelcomeScreenModal(); + } else { + log.debug('Intercom.handleMainWindowIsShown.show.newServerModal'); + handleNewServerModal(); + } }); } } @@ -213,6 +224,32 @@ export function handleRemoveServerModal(e: IpcMainEvent, name: string) { } } +export function handleWelcomeScreenModal() { + log.debug('Intercom.handleWelcomeScreenModal'); + + const html = getLocalURLString('welcomeScreen.html'); + + const modalPreload = getLocalPreload('modalPreload.js'); + + const mainWindow = WindowManager.getMainWindow(); + if (!mainWindow) { + return; + } + const modalPromise = ModalManager.addModal('welcomeScreen', html, modalPreload, {}, mainWindow, true); + if (modalPromise) { + modalPromise.then(() => { + handleNewServerModal(); + }).catch((e) => { + // e is undefined for user cancellation + if (e) { + log.error(`there was an error in the welcome screen modal: ${e}`); + } + }); + } else { + log.warn('There is already a welcome screen modal'); + } +} + export function handleMentionNotification(event: IpcMainEvent, title: string, body: string, channel: {id: string}, teamId: string, url: string, silent: boolean, data: MentionData) { log.debug('Intercom.handleMentionNotification', {title, body, channel, teamId, url, silent, data}); displayMention(title, body, channel, teamId, url, silent, event.sender, data); diff --git a/src/main/views/viewManager.test.js b/src/main/views/viewManager.test.js index 4bd60c78..13e89c7c 100644 --- a/src/main/views/viewManager.test.js +++ b/src/main/views/viewManager.test.js @@ -7,7 +7,7 @@ import {dialog, ipcMain} from 'electron'; import {Tuple as tuple} from '@bloomberg/record-tuple-polyfill'; -import {BROWSER_HISTORY_PUSH, LOAD_SUCCESS, SHOW_NEW_SERVER_MODAL} from 'common/communication'; +import {BROWSER_HISTORY_PUSH, LOAD_SUCCESS, MAIN_WINDOW_SHOWN} from 'common/communication'; import {MattermostServer} from 'common/servers/MattermostServer'; import {getServerView, getTabViewName} from 'common/tabs/TabView'; import urlUtils from 'common/utils/url'; @@ -547,7 +547,7 @@ describe('main/views/viewManager', () => { }; viewManager.getServers = () => []; viewManager.showInitial(); - expect(ipcMain.emit).toHaveBeenCalledWith(SHOW_NEW_SERVER_MODAL); + expect(ipcMain.emit).toHaveBeenCalledWith(MAIN_WINDOW_SHOWN); }); }); diff --git a/src/main/views/viewManager.ts b/src/main/views/viewManager.ts index a09647a6..83b50c29 100644 --- a/src/main/views/viewManager.ts +++ b/src/main/views/viewManager.ts @@ -20,7 +20,7 @@ import { BROWSER_HISTORY_PUSH, UPDATE_LAST_ACTIVE, UPDATE_URL_VIEW_WIDTH, - SHOW_NEW_SERVER_MODAL, + MAIN_WINDOW_SHOWN, } from 'common/communication'; import Config from 'common/config'; import urlUtils from 'common/utils/url'; @@ -215,7 +215,7 @@ export class ViewManager { } } else { this.mainWindow.webContents.send(SET_ACTIVE_VIEW, null, null); - ipcMain.emit(SHOW_NEW_SERVER_MODAL); + ipcMain.emit(MAIN_WINDOW_SHOWN); } } diff --git a/src/main/windows/windowManager.test.js b/src/main/windows/windowManager.test.js index 075136e7..368ee6ef 100644 --- a/src/main/windows/windowManager.test.js +++ b/src/main/windows/windowManager.test.js @@ -217,7 +217,17 @@ describe('main/windows/windowManager', () => { }); it('should use getSize when the platform is linux', () => { + const originalPlatform = process.platform; + Object.defineProperty(process, 'platform', { + value: 'linux', + }); + windowManager.handleResizeMainWindow(); + + Object.defineProperty(process, 'platform', { + value: originalPlatform, + }); + expect(view.setBounds).not.toHaveBeenCalled(); jest.runAllTimers(); expect(view.setBounds).toHaveBeenCalledWith({width: 1000, height: 900}); @@ -281,6 +291,76 @@ describe('main/windows/windowManager', () => { }); }); + describe('handleResizedMainWindow', () => { + const windowManager = new WindowManager(); + const view = { + setBounds: jest.fn(), + tab: { + url: 'http://server-1.com', + }, + view: { + webContents: { + getURL: jest.fn(), + }, + }, + }; + windowManager.mainWindow = { + getContentBounds: () => ({width: 800, height: 600}), + getSize: () => [1000, 900], + }; + + beforeEach(() => { + getAdjustedWindowBoundaries.mockImplementation((width, height) => ({width, height})); + }); + + afterEach(() => { + windowManager.isResizing = true; + jest.resetAllMocks(); + }); + + it('should not handle bounds if no window available', () => { + windowManager.handleResizedMainWindow(); + expect(windowManager.isResizing).toBe(false); + expect(view.setBounds).not.toHaveBeenCalled(); + }); + + it('should use getContentBounds when the platform is different to linux', () => { + windowManager.viewManager = { + getCurrentView: () => view, + }; + + const originalPlatform = process.platform; + Object.defineProperty(process, 'platform', { + value: 'windows', + }); + + windowManager.handleResizedMainWindow(); + + Object.defineProperty(process, 'platform', { + value: originalPlatform, + }); + + expect(windowManager.isResizing).toBe(false); + expect(view.setBounds).toHaveBeenCalledWith({width: 800, height: 600}); + }); + + it('should use getSize when the platform is linux', () => { + const originalPlatform = process.platform; + Object.defineProperty(process, 'platform', { + value: 'linux', + }); + + windowManager.handleResizedMainWindow(); + + Object.defineProperty(process, 'platform', { + value: originalPlatform, + }); + + expect(windowManager.isResizing).toBe(false); + expect(view.setBounds).toHaveBeenCalledWith({width: 1000, height: 900}); + }); + }); + describe('restoreMain', () => { const windowManager = new WindowManager(); windowManager.mainWindow = { diff --git a/src/main/windows/windowManager.ts b/src/main/windows/windowManager.ts index 68cf3b7e..b3440ae4 100644 --- a/src/main/windows/windowManager.ts +++ b/src/main/windows/windowManager.ts @@ -203,8 +203,12 @@ export class WindowManager { } handleResizedMainWindow = () => { + log.silly('WindowManager.handleResizedMainWindow'); + if (this.mainWindow) { - this.throttledWillResize(this.mainWindow?.getContentBounds()); + const bounds = this.getBounds(); + this.throttledWillResize(bounds); + ipcMain.emit(RESIZE_MODAL, null, bounds); } this.isResizing = false; } @@ -228,17 +232,7 @@ export class WindowManager { return; } - let bounds; - - // Workaround for linux maximizing/minimizing, which doesn't work properly because of these bugs: - // https://github.com/electron/electron/issues/28699 - // https://github.com/electron/electron/issues/28106 - if (process.platform === 'linux') { - const size = this.mainWindow.getSize(); - bounds = {width: size[0], height: size[1]}; - } else { - bounds = this.mainWindow.getContentBounds(); - } + const bounds = this.getBounds(); // Another workaround since the window doesn't update p roperly under Linux for some reason // See above comment @@ -261,6 +255,24 @@ export class WindowManager { currentView.setBounds(bounds); }; + private getBounds = () => { + let bounds; + + if (this.mainWindow) { + // Workaround for linux maximizing/minimizing, which doesn't work properly because of these bugs: + // https://github.com/electron/electron/issues/28699 + // https://github.com/electron/electron/issues/28106 + if (process.platform === 'linux') { + const size = this.mainWindow.getSize(); + bounds = {width: size[0], height: size[1]}; + } else { + bounds = this.mainWindow.getContentBounds(); + } + } + + return bounds as Electron.Rectangle; + } + // max retries allows the message to get to the renderer even if it is sent while the app is starting up. sendToRendererWithRetry = (maxRetries: number, channel: string, ...args: any[]) => { if (!this.mainWindow || !this.mainWindowReady) { diff --git a/src/renderer/assets/svg/bullseye.svg b/src/renderer/assets/svg/bullseye.svg new file mode 100644 index 00000000..89ebe33e --- /dev/null +++ b/src/renderer/assets/svg/bullseye.svg @@ -0,0 +1,20 @@ + + + + + + + + \ No newline at end of file diff --git a/src/renderer/assets/svg/channels.svg b/src/renderer/assets/svg/channels.svg new file mode 100644 index 00000000..b8c95232 --- /dev/null +++ b/src/renderer/assets/svg/channels.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/renderer/assets/svg/chat2.svg b/src/renderer/assets/svg/chat2.svg new file mode 100644 index 00000000..8441ba90 --- /dev/null +++ b/src/renderer/assets/svg/chat2.svg @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/renderer/assets/svg/clipboard.svg b/src/renderer/assets/svg/clipboard.svg new file mode 100644 index 00000000..c7c395d1 --- /dev/null +++ b/src/renderer/assets/svg/clipboard.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/renderer/components/Carousel/Carousel.tsx b/src/renderer/components/Carousel/Carousel.tsx new file mode 100644 index 00000000..7c5bd465 --- /dev/null +++ b/src/renderer/components/Carousel/Carousel.tsx @@ -0,0 +1,137 @@ +// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import React, {useState, useEffect, useRef} from 'react'; +import classNames from 'classnames'; + +import CarouselButton, {ButtonDirection} from './CarouselButton'; +import CarouselPaginationIndicator from './CarouselPaginationIndicator'; + +import 'renderer/css/components/Carousel.scss'; + +const AUTO_CHANGE_TIME = 5000; + +type CarouselProps = { + slides: Array<{key: string; content: React.ReactNode}>; + startIndex?: number; + darkMode?: boolean; +}; + +function Carousel({ + slides, + startIndex = 0, + darkMode = false, +}: CarouselProps) { + const [slideIn, setSlideIn] = useState(startIndex); + const [slideOut, setSlideOut] = useState(NaN); + const [direction, setDirection] = useState(ButtonDirection.NEXT); + const [autoChange, setAutoChange] = useState(true); + const timerRef = useRef(null); + + const disableNavigation = slides.length <= 1; + + useEffect(() => { + timerRef.current = autoChange ? ( + setTimeout(() => { + handleOnNextButtonClick(true); + }, AUTO_CHANGE_TIME) + ) : null; + + return () => { + if (timerRef.current) { + clearTimeout(timerRef.current); + } + }; + }, [slideIn, autoChange]); + + const handleOnPrevButtonClick = () => { + moveSlide(slideIn - 1); + setDirection(ButtonDirection.PREV); + setAutoChange(false); + }; + + const handleOnNextButtonClick = (fromAuto?: boolean) => { + moveSlide(slideIn + 1); + setDirection(ButtonDirection.NEXT); + + if (!fromAuto) { + setAutoChange(false); + } + }; + + const handleOnPaginationIndicatorClick = (indicatorIndex: number) => { + moveSlide(indicatorIndex); + setDirection(indicatorIndex > slideIn ? ButtonDirection.NEXT : ButtonDirection.PREV); + setAutoChange(false); + }; + + const moveSlide = (toIndex: number) => { + if (toIndex === slideIn) { + return; + } + + let current = toIndex; + + if (toIndex < 0) { + current = slides.length - 1; + } else if (toIndex >= slides.length) { + current = 0; + } + + setSlideOut(slideIn); + setSlideIn(current); + }; + + return ( +

+ ); +} + +export default Carousel; diff --git a/src/renderer/components/Carousel/CarouselButton.tsx b/src/renderer/components/Carousel/CarouselButton.tsx new file mode 100644 index 00000000..399f45b2 --- /dev/null +++ b/src/renderer/components/Carousel/CarouselButton.tsx @@ -0,0 +1,51 @@ +// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import React from 'react'; +import classNames from 'classnames'; + +import 'renderer/css/components/Button.scss'; +import 'renderer/css/components/CarouselButton.scss'; + +export enum ButtonDirection { + NEXT = 'next', + PREV = 'prev', +} + +type CarouselButtonProps = { + direction: ButtonDirection; + disabled?: boolean; + darkMode?: boolean; + onClick?: () => void; +}; + +function CarouselButton({ + direction = ButtonDirection.NEXT, + disabled = false, + darkMode = false, + onClick = () => null, +}: CarouselButtonProps) { + const handleOnClick = () => { + onClick(); + }; + + return ( + + ); +} + +export default CarouselButton; diff --git a/src/renderer/components/Carousel/CarouselPaginationIndicator.tsx b/src/renderer/components/Carousel/CarouselPaginationIndicator.tsx new file mode 100644 index 00000000..5f36f733 --- /dev/null +++ b/src/renderer/components/Carousel/CarouselPaginationIndicator.tsx @@ -0,0 +1,74 @@ +// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import React, {useCallback} from 'react'; +import classNames from 'classnames'; + +import 'renderer/css/components/Button.scss'; +import 'renderer/css/components/CarouselPaginationIndicator.scss'; + +type CarouselPaginationIndicatorProps = { + pages: number; + activePage: number; + disabled?: boolean; + darkMode?: boolean; + onClick?: (pageIndex: number) => void; +}; + +function CarouselPaginationIndicator({ + pages, + activePage, + disabled, + darkMode, + onClick = () => null, +}: CarouselPaginationIndicatorProps) { + const handleOnClick = useCallback((pageIndex: number) => () => { + onClick(pageIndex); + }, [onClick]); + + const handleOnKeyDown = useCallback((pageIndex: number) => (event: React.KeyboardEvent) => { + if (event.key === 'Enter') { + onClick(pageIndex); + } + }, [onClick]); + + const getIndicators = useCallback(() => { + const indicators = []; + + for (let pageIndex = 0; pageIndex < pages; pageIndex++) { + indicators.push( +
+
+
, + ); + } + + return indicators; + }, [pages, activePage, darkMode, handleOnClick]); + + return ( +
+ {getIndicators()} +
+ ); +} + +export default CarouselPaginationIndicator; diff --git a/src/renderer/components/Carousel/index.ts b/src/renderer/components/Carousel/index.ts new file mode 100644 index 00000000..9c17be45 --- /dev/null +++ b/src/renderer/components/Carousel/index.ts @@ -0,0 +1,4 @@ +// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +export {default} from './Carousel'; diff --git a/src/renderer/components/Header/Header.tsx b/src/renderer/components/Header/Header.tsx new file mode 100644 index 00000000..bdadbb11 --- /dev/null +++ b/src/renderer/components/Header/Header.tsx @@ -0,0 +1,35 @@ +// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import React from 'react'; +import classNames from 'classnames'; + +import Logo from 'renderer/components/Logo'; + +import 'renderer/css/components/Header.scss'; + +type HeaderProps = { + alternateLink?: React.ReactElement; + darkMode?: boolean; +} + +const Header = ({ + alternateLink, + darkMode, +}: HeaderProps) => ( +
+
+
+ +
+ {alternateLink} +
+
+); + +export default Header; diff --git a/src/renderer/components/Header/index.ts b/src/renderer/components/Header/index.ts new file mode 100644 index 00000000..202bf86e --- /dev/null +++ b/src/renderer/components/Header/index.ts @@ -0,0 +1,4 @@ +// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +export {default} from './Header'; diff --git a/src/renderer/components/Logo.tsx b/src/renderer/components/Logo.tsx new file mode 100644 index 00000000..4272d8e6 --- /dev/null +++ b/src/renderer/components/Logo.tsx @@ -0,0 +1,35 @@ +// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import React from 'react'; + +type Props = { + width?: number; + height?: number; +} + +export default ({ + width = 170, + height = 28, +}: Props) => ( + + + + +); diff --git a/src/renderer/components/MainPage.tsx b/src/renderer/components/MainPage.tsx index dc32c379..3ef725e6 100644 --- a/src/renderer/components/MainPage.tsx +++ b/src/renderer/components/MainPage.tsx @@ -521,6 +521,11 @@ class MainPage extends React.PureComponent { ref={this.topBar} className={'topBar-bg'} > + {window.process.platform !== 'linux' && this.props.teams.length === 0 && ( +
+ {intl.formatMessage({id: 'renderer.components.mainPage.titleBar', defaultMessage: 'Mattermost'})} +
+ )} - 0} - isMenuOpen={this.state.isMenuOpen} - darkMode={this.state.darkMode} - /> + {this.props.teams.length !== 0 && ( + 0} + isMenuOpen={this.state.isMenuOpen} + darkMode={this.state.darkMode} + /> + )} {tabsRow} {upgradeIcon} {titleBarButtons} diff --git a/src/renderer/components/WelcomeScreen/WelcomeScreen.tsx b/src/renderer/components/WelcomeScreen/WelcomeScreen.tsx new file mode 100644 index 00000000..dc031d3c --- /dev/null +++ b/src/renderer/components/WelcomeScreen/WelcomeScreen.tsx @@ -0,0 +1,149 @@ +// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import React, {useMemo} from 'react'; +import {useIntl, FormattedMessage} from 'react-intl'; +import classNames from 'classnames'; + +import bullseye from 'renderer/assets/svg/bullseye.svg'; +import channels from 'renderer/assets/svg/channels.svg'; +import chat2 from 'renderer/assets/svg/chat2.svg'; +import clipboard from 'renderer/assets/svg/clipboard.svg'; + +import Carousel from 'renderer/components/Carousel'; +import Header from 'renderer/components/Header'; +import LoadingBackground from 'renderer/components/LoadingScreen/LoadingBackground'; + +import WelcomeScreenSlide from './WelcomeScreenSlide'; + +import 'renderer/css/components/Button.scss'; +import 'renderer/css/components/WelcomeScreen.scss'; +import 'renderer/css/components/LoadingScreen.css'; + +type WelcomeScreenProps = { + darkMode?: boolean; + onGetStarted?: () => void; +}; + +function WelcomeScreen({ + darkMode = false, + onGetStarted = () => null, +}: WelcomeScreenProps) { + const {formatMessage} = useIntl(); + + const slides = useMemo(() => [ + { + key: 'welcome', + title: formatMessage({id: 'renderer.components.welcomeScreen.slides.welcome.title', defaultMessage: 'Welcome'}), + subtitle: formatMessage({ + id: 'renderer.components.welcomeScreen.slides.welcome.subtitle', + defaultMessage: 'Mattermost is an open source platform for developer collaboration. Secure, flexible, and integrated with the tools you love.', + }), + image: ( + + ), + main: true, + }, + { + key: 'channels', + title: formatMessage({id: 'renderer.components.welcomeScreen.slides.channels.title', defaultMessage: 'Channels'}), + subtitle: ( + (<>
{x}), + }} + /> + ), + image: ( + + ), + }, + { + key: 'playbooks', + title: formatMessage({id: 'renderer.components.welcomeScreen.slides.playbooks.title', defaultMessage: 'Playbooks'}), + subtitle: formatMessage({ + id: 'renderer.components.welcomeScreen.slides.palybooks.subtitle', + defaultMessage: 'Move faster and make fewer mistakes with checklists, automations, and tool integrations that power your team’s workflows.', + }), + image: ( + + ), + }, + { + key: 'boards', + title: formatMessage({id: 'renderer.components.welcomeScreen.slides.boards.title', defaultMessage: 'Boards'}), + subtitle: formatMessage({ + id: 'renderer.components.welcomeScreen.slides.boards.subtitle', + defaultMessage: 'Ship on time, every time, with a project and task management solution built for digital operations.', + }), + image: ( + + ), + }, + ], []); + + const handleOnGetStartedClick = () => { + onGetStarted(); + }; + + return ( +
+ +
+
+
+ ({ + key, + content: ( + + ), + }))} + darkMode={darkMode} + /> + +
+
+
+
+ ); +} + +export default WelcomeScreen; diff --git a/src/renderer/components/WelcomeScreen/WelcomeScreenSlide.tsx b/src/renderer/components/WelcomeScreen/WelcomeScreenSlide.tsx new file mode 100644 index 00000000..97946b7f --- /dev/null +++ b/src/renderer/components/WelcomeScreen/WelcomeScreenSlide.tsx @@ -0,0 +1,45 @@ +// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import React from 'react'; +import classNames from 'classnames'; + +import 'renderer/css/components/WelcomeScreenSlide.scss'; + +type WelcomeScreenSlideProps = { + title: string; + subtitle: string | React.ReactElement; + image: React.ReactNode; + isMain?: boolean; + darkMode?: boolean; +}; + +const WelcomeScreenSlide = ({ + title, + subtitle, + image, + isMain, + darkMode, +}: WelcomeScreenSlideProps) => ( +
+
+ {image} +
+
+ {title} +
+
+ {subtitle} +
+
+); + +export default WelcomeScreenSlide; diff --git a/src/renderer/components/WelcomeScreen/index.ts b/src/renderer/components/WelcomeScreen/index.ts new file mode 100644 index 00000000..a16024ff --- /dev/null +++ b/src/renderer/components/WelcomeScreen/index.ts @@ -0,0 +1,4 @@ +// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +export {default} from './WelcomeScreen'; diff --git a/src/renderer/css/_css_variables.scss b/src/renderer/css/_css_variables.scss new file mode 100644 index 00000000..af5a55a1 --- /dev/null +++ b/src/renderer/css/_css_variables.scss @@ -0,0 +1,14 @@ +:root { + --button-bg: #166de0; + --button-color: #fff; + --center-channel-text: #3f4350; + --sidebar-text-active-border: #579eff; + --denim-button-bg: #1c58d9; + --denim-sidebar-active-border: #5d89ea; + --title-color-indigo-500: #1e325c; + + --button-color-rgb: 255, 255, 255; + --center-channel-color-rgb: 61, 60, 64; + --center-channel-text-rgb: 63, 67, 80; + --denim-button-bg-rgb: 28, 88, 217; +} diff --git a/src/renderer/css/components/Button.scss b/src/renderer/css/components/Button.scss new file mode 100644 index 00000000..5a626043 --- /dev/null +++ b/src/renderer/css/components/Button.scss @@ -0,0 +1,177 @@ +@import url("../_css_variables.scss"); + +.primary-button { + position: relative; + display: inline-flex; + align-items: center; + justify-content: center; + border: 0; + background: var(--button-bg); + border-radius: 4px; + color: var(--button-color); + font-weight: 600; + font-family: 'Open Sans'; + + &:hover { + background: linear-gradient(0deg, rgba(0, 0, 0, 0.08), rgba(0, 0, 0, 0.08)), var(--button-bg); + } + + &:active { + background: linear-gradient(0deg, rgba(0, 0, 0, 0.16), rgba(0, 0, 0, 0.16)), var(--button-bg); + } + + &:focus { + box-sizing: border-box; + border: 2px solid var(--sidebar-text-active-border); + outline: none; + } + + &:disabled { + background: rgba(var(--center-channel-color-rgb), 0.08); + color: rgba(var(--center-channel-color-rgb), 0.32); + cursor: not-allowed; + } + + i { + display: flex; + font-size: 18px; + } +} + +.primary-button-inverted { + background: var(--button-color); + color: var(--denim-button-bg); + + &:hover { + background: linear-gradient(0deg, rgba(var(--denim-button-bg-rgb), 0.08), rgba(var(--denim-button-bg-rgb), 0.08)), var(--button-color); + color: var(--denim-button-bg); + } + + &:active { + background: linear-gradient(0deg, rgba(var(--denim-button-bg-rgb), 0.16), rgba(var(--denim-button-bg-rgb), 0.16)), var(--button-color); + color: var(--denim-button-bg); + } + + &:focus { + border: 2px solid var(--denim-sidebar-active-border); + color: var(--denim-button-bg); + } + + &:disabled { + background: rgba(var(--center-channel-text-rgb), 0.08); + color: rgba(var(--center-channel-text-rgb), 0.32); + } +} + +.primary-large-button { + height: 48px; + padding: 0 24px; + font-size: 16px; + line-height: 18px; + + &:focus { + padding: 0 22px; + } +} + +.primary-medium-button { + height: 40px; + padding: 0 20px; + font-size: 14px; + line-height: 14px; + + &:focus { + padding: 0 20px; + } +} + +.icon-button { + position: relative; + display: inline-flex; + align-items: center; + justify-content: center; + border: 0; + background: none; + border-radius: 4px; + color: rgba(var(--center-channel-text-rgb), 0.56); + font-weight: 400; + + &:hover { + background: rgba(var(--center-channel-text-rgb), 0.08); + color: rgba(var(--center-channel-text-rgb), 0.72); + } + + &:active { + background: rgba(var(--denim-button-bg-rgb), 0.08); + color: var(--denim-button-bg); + } + + &:focus-visible { + box-sizing: border-box; + border-color: linear-gradient(0deg, rgba(var(--button-color-rgb), 0.32), rgba(var(--button-color-rgb), 0.32)), var(--denim-button-bg); + outline: none; + } + + &:disabled { + background: none; + color: rgba(var(--center-channel-text-rgb), 0.32); + cursor: not-allowed; + } + + i { + display: flex; + font-style: normal; + justify-content: center; + } +} + +.icon-button-inverted { + background: none; + color: rgba(var(--button-color-rgb), 0.64); + + &:hover { + background: rgba(var(--button-color-rgb), 0.08); + color: var(--button-color); + } + + &:active { + background: rgba(var(--button-color-rgb), 0.16); + color: var(--button-color); + } + + &:focus-visible { + box-sizing: border-box; + border-color: linear-gradient(0deg, rgba(var(--button-color-rgb), 0.32), rgba(var(--button-color-rgb), 0.32)), var(--denim-button-bg); + } + + &:disabled { + background: none; + color: rgba(var(--button-color-rgb), 0.32); + } +} + +.icon-button-small { + height: 28px; + padding: 6px; + font-size: 18px; + line-height: 18px; + + &:focus:not(:focus-visible) { + padding: 6px 8px; + border: 0; + } + + &:focus-visible { + padding: 4px; + border: 2px solid; + } + + i { + width: 16px; + height: 16px; + + &::before { + line-height: 16px; + } + } +} diff --git a/src/renderer/css/components/Carousel.scss b/src/renderer/css/components/Carousel.scss new file mode 100644 index 00000000..a23714e8 --- /dev/null +++ b/src/renderer/css/components/Carousel.scss @@ -0,0 +1,94 @@ +.Carousel { + display: flex; + flex: 1; + flex-flow: column; + align-items: center; + justify-content: center; + width: 100%; + + .Carousel__slides { + min-height: 380px; + width: 100%; + position: relative; + display: flex; + justify-content: center; + + .Carousel__slide { + position: absolute; + bottom: 0; + opacity: 0; + } + + .Carousel__slide-current { + opacity: 1; + } + } + + .Carousel__pagination { + display: flex; + flex: 1; + align-items: center; + justify-content: center; + margin-top: 22px; + } +} + +.inFromRight { + animation: inFromRight 0.4s ease-in-out; +} + +.inFromLeft { + animation: inFromLeft 0.4s ease-in-out; +} + +.outToRight { + animation: outToRight 0.4s ease-in-out; +} + +.outToLeft { + animation: outToLeft 0.4s ease-in-out; +} + +@keyframes inFromRight { + 0% { + transform: translateX(30%); + opacity: 0; + } + 100% { + transform: translateX(0%); + opacity: 1; + } +} + +@keyframes inFromLeft { + 0% { + transform: translateX(-30%); + opacity: 0; + } + 100% { + transform: translateX(0%); + opacity: 1; + } +} + +@keyframes outToRight { + 0% { + transform: translateX(0%); + opacity: 1; + } + 100% { + transform: translateX(30%); + opacity: 0; + } +} + +@keyframes outToLeft { + 0% { + transform: translateX(0%); + opacity: 1; + } + 100% { + transform: translateX(-30%); + opacity: 0; + } +} \ No newline at end of file diff --git a/src/renderer/css/components/CarouselButton.scss b/src/renderer/css/components/CarouselButton.scss new file mode 100644 index 00000000..49dcc336 --- /dev/null +++ b/src/renderer/css/components/CarouselButton.scss @@ -0,0 +1,10 @@ +@import '~@mattermost/compass-icons/css/compass-icons.css'; + +.CarouselButton { + height: 32px; + padding: 8px; + + &:focus { + padding: 6px; + } +} diff --git a/src/renderer/css/components/CarouselPaginationIndicator.scss b/src/renderer/css/components/CarouselPaginationIndicator.scss new file mode 100644 index 00000000..57dcaae5 --- /dev/null +++ b/src/renderer/css/components/CarouselPaginationIndicator.scss @@ -0,0 +1,70 @@ +@import url("../_css_variables.scss"); + +.CarouselPaginationIndicator { + display: flex; + align-items: center; + justify-content: center; + margin: 0 23px; + + .indicatorDot { + display: flex; + align-items: center; + justify-content: center; + width: 12px; + height: 12px; + border-radius: 50%; + background: none; + box-shadow: 0 0 0 3px transparent; + cursor: pointer; + + &:not(:first-child) { + margin-left: 4px; + } + + .dot { + width: 6px; + height: 6px; + border-radius: 50%; + background: rgba(var(--denim-button-bg-rgb), 0.32); + } + + &.active, + &.disabled { + cursor: default; + pointer-events: none; + } + + &.active { + background: rgba(var(--denim-button-bg-rgb), 0.16); + + .dot { + background: var(--denim-button-bg); + } + } + + &:focus-visible { + box-sizing: border-box; + border: 2px solid var(--sidebar-text-active-border); + outline: none; + } + } + + .indicatorDot-inverted { + .dot { + background: rgba(var(--button-color-rgb), 0.32); + } + + &.active { + background: rgba(var(--button-color-rgb), 0.16); + + .dot { + background: var(--button-color); + } + } + + &:focus-visible { + border: 2px solid var(--denim-sidebar-active-border); + color: var(--denim-button-bg); + } + } +} diff --git a/src/renderer/css/components/Header.scss b/src/renderer/css/components/Header.scss new file mode 100644 index 00000000..15bede62 --- /dev/null +++ b/src/renderer/css/components/Header.scss @@ -0,0 +1,36 @@ +@import url("../_css_variables.scss"); + +.Header { + position: relative; + display: flex; + width: 100%; + min-height: 100px; + padding: 0 40px; + + .Header__main { + display: flex; + width: 100%; + height: 100%; + flex-flow: wrap; + align-items: center; + justify-content: space-between; + + .Header__logo { + width: 170px; + + path { + fill: var(--center-channel-text); + } + } + } + + &.Header--darkMode { + .Header__main { + .Header__logo { + path { + fill: var(--button-color); + } + } + } + } +} diff --git a/src/renderer/css/components/WelcomeScreen.scss b/src/renderer/css/components/WelcomeScreen.scss new file mode 100644 index 00000000..c97eed32 --- /dev/null +++ b/src/renderer/css/components/WelcomeScreen.scss @@ -0,0 +1,35 @@ +.WelcomeScreen { + flex-direction: column; + z-index: 20; + + * { + z-index: 21; + } + + .WelcomeScreen__body { + display: flex; + flex: 1; + width: 100%; + align-items: center; + justify-content: center; + -webkit-font-smoothing: antialiased; + + .WelcomeScreen__content { + display: flex; + flex-direction: column; + width: 100%; + align-items: center; + justify-content: center; + + .WelcomeScreen__button { + margin-top: 22px; + } + } + } + + .WelcomeScreen__footer { + display: block; + width: 100%; + height: 100px; + } +} diff --git a/src/renderer/css/components/WelcomeScreenSlide.scss b/src/renderer/css/components/WelcomeScreenSlide.scss new file mode 100644 index 00000000..f34a0d98 --- /dev/null +++ b/src/renderer/css/components/WelcomeScreenSlide.scss @@ -0,0 +1,60 @@ +@import url("../_css_variables.scss"); +@import url("../fonts.css"); + +.WelcomeScreenSlide { + display: flex; + flex: 1; + max-width: 540px; + flex-flow: column; + justify-content: flex-end; + + .WelcomeScreenSlide__image { + align-self: center; + } + + .WelcomeScreenSlide__title { + color: var(--title-color-indigo-500); + font-family: 'Metropolis'; + font-size: 80px; + font-weight: 600; + letter-spacing: -0.05em; + line-height: 88px; + text-align: center; + } + + .WelcomeScreenSlide__subtitle { + color: rgba(var(--center-channel-text-rgb), 0.72); + font-family: Open Sans; + font-size: 16px; + font-weight: 400; + line-height: 24px; + text-align: center; + margin-top: 16px; + } + + &.WelcomeScreenSlide--main { + position: relative; + height: 100%; + + .WelcomeScreenSlide__title { + font-size: 128px; + line-height: 128px; + } + + .WelcomeScreenSlide__image { + position: absolute; + display: block; + bottom: 115px; + } + } + + &.WelcomeScreenSlide--darkMode { + .WelcomeScreenSlide__title { + color: var(--button-color); + } + + .WelcomeScreenSlide__subtitle { + color: rgba(var(--button-color-rgb), 0.72); + } + } +} diff --git a/src/renderer/css/fonts.css b/src/renderer/css/fonts.css index 1feac8dc..3a709ec0 100644 --- a/src/renderer/css/fonts.css +++ b/src/renderer/css/fonts.css @@ -39,3 +39,45 @@ font-weight: 600; src: url('../../assets/fonts/open-sans-v13-latin-ext_latin_cyrillic-ext_greek-ext_greek_cyrillic_vietnamese-600italic.woff2') format('woff2'); } + +@font-face { + font-family: 'Metropolis'; + font-style: normal; + font-weight: 600; + src: url('../../assets/fonts/Metropolis-SemiBold.woff') format('woff'); +} + +@font-face { + font-family: 'Metropolis'; + font-style: italic; + font-weight: 600; + src: url('../../assets/fonts/Metropolis-SemiBoldItalic.woff') format('woff'); +} + +@font-face { + font-family: 'Metropolis'; + font-style: normal; + font-weight: 400; + src: url('../../assets/fonts/Metropolis-Regular.woff') format('woff'); +} + +@font-face { + font-family: 'Metropolis'; + font-style: italic; + font-weight: 400; + src: url('../../assets/fonts/Metropolis-RegularItalic.woff') format('woff'); +} + +@font-face { + font-family: 'Metropolis'; + font-style: normal; + font-weight: 300; + src: url('../../assets/fonts/Metropolis-Light.woff') format('woff'); +} + +@font-face { + font-family: 'Metropolis'; + font-style: italic; + font-weight: 300; + src: url('../../assets/fonts/Metropolis-LightItalic.woff') format('woff'); +} diff --git a/src/renderer/css/index.css b/src/renderer/css/index.css index 12961281..7ba43e4d 100644 --- a/src/renderer/css/index.css +++ b/src/renderer/css/index.css @@ -117,6 +117,28 @@ body { color: rgba(243,243,243,0.7); } +.topBar .app-title { + position: absolute; + top: 0; + left: 0; + display: flex; + width: 100%; + height: 40px; + justify-content: center; + align-items: center; + color: rgba(61,60,64,0.7); + font-family: "Open Sans", sans-serif; + font-weight: 600; + font-size: 14px; + letter-spacing: -0.2px; + z-index: 0; + -webkit-app-region: drag; +} + +.topBar.darkMode .app-title { + color: rgba(221,221,221,0.64); +} + .topBar .title-bar-btns { position: relative; line-height: 40px; diff --git a/src/renderer/modals/welcomeScreen/welcomeScreen.tsx b/src/renderer/modals/welcomeScreen/welcomeScreen.tsx new file mode 100644 index 00000000..ef4354fc --- /dev/null +++ b/src/renderer/modals/welcomeScreen/welcomeScreen.tsx @@ -0,0 +1,60 @@ +// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import React, {useEffect, useState} from 'react'; +import ReactDOM from 'react-dom'; + +import {ModalMessage} from 'types/modals'; + +import { + MODAL_RESULT, + GET_MODAL_UNCLOSEABLE, + GET_DARK_MODE, + DARK_MODE_CHANGE, +} from 'common/communication'; +import IntlProvider from 'renderer/intl_provider'; +import WelcomeScreen from '../../components/WelcomeScreen'; + +import 'bootstrap/dist/css/bootstrap.min.css'; + +const onGetStarted = () => { + window.postMessage({type: MODAL_RESULT}, window.location.href); +}; + +const WelcomeScreenModalWrapper = () => { + const [darkMode, setDarkMode] = useState(false); + + useEffect(() => { + window.postMessage({type: GET_MODAL_UNCLOSEABLE}, window.location.href); + window.postMessage({type: GET_DARK_MODE}, window.location.href); + window.addEventListener('message', handleMessageEvent); + + return () => { + window.removeEventListener('message', handleMessageEvent); + }; + }, []); + + const handleMessageEvent = (event: {data: ModalMessage}) => { + if (event.data.type === DARK_MODE_CHANGE) { + setDarkMode(event.data.data); + } + }; + + return ( + + + + ); +}; + +const start = async () => { + ReactDOM.render( + , + document.getElementById('app'), + ); +}; + +start(); diff --git a/webpack.config.renderer.js b/webpack.config.renderer.js index a18fcb83..a20a02fa 100644 --- a/webpack.config.renderer.js +++ b/webpack.config.renderer.js @@ -29,6 +29,7 @@ module.exports = merge(base, { permissionModal: './src/renderer/modals/permission/permission.tsx', certificateModal: './src/renderer/modals/certificate/certificate.tsx', loadingScreen: './src/renderer/modals/loadingScreen/index.tsx', + welcomeScreen: './src/renderer/modals/welcomeScreen/welcomeScreen.tsx', }, output: { path: path.resolve(__dirname, 'dist/renderer'), @@ -102,6 +103,12 @@ module.exports = merge(base, { chunks: ['loadingScreen'], filename: 'loadingScreen.html', }), + new HtmlWebpackPlugin({ + title: 'Mattermost Desktop Settings', + template: 'src/renderer/index.html', + chunks: ['welcomeScreen'], + filename: 'welcomeScreen.html', + }), new MiniCssExtractPlugin({ filename: 'styles.[contenthash].css', ignoreOrder: true,