diff --git a/e2e/modules/environment.js b/e2e/modules/environment.js index 26d8c41b..933c915c 100644 --- a/e2e/modules/environment.js +++ b/e2e/modules/environment.js @@ -5,10 +5,10 @@ const fs = require('fs'); -const ps = require('ps-node'); - const path = require('path'); +const ps = require('ps-node'); + const {_electron: electron} = require('playwright'); const chai = require('chai'); const {ipcRenderer} = require('electron'); diff --git a/src/common/utils/util.ts b/src/common/utils/util.ts index b7fdb8ea..3aa4fdff 100644 --- a/src/common/utils/util.ts +++ b/src/common/utils/util.ts @@ -2,25 +2,8 @@ // See LICENSE.txt for license information. // Copyright (c) 2015-2016 Yuya Ochiai -import {screen} from 'electron'; - import {DEVELOPMENT, PRODUCTION} from './constants'; -function getDisplayBoundaries() { - const displays = screen.getAllDisplays(); - - return displays.map((display) => { - return { - maxX: display.workArea.x + display.workArea.width, - maxY: display.workArea.y + display.workArea.height, - minX: display.workArea.x, - minY: display.workArea.y, - maxWidth: display.workArea.width, - maxHeight: display.workArea.height, - }; - }); -} - function runMode() { return process.env.NODE_ENV === PRODUCTION ? PRODUCTION : DEVELOPMENT; } @@ -65,7 +48,6 @@ export function t(s: string) { } export default { - getDisplayBoundaries, runMode, shorten, isVersionGreaterThanOrEqualTo, diff --git a/src/main/app/utils.test.js b/src/main/app/utils.test.js index f7569955..c258d308 100644 --- a/src/main/app/utils.test.js +++ b/src/main/app/utils.test.js @@ -3,7 +3,7 @@ import fs from 'fs-extra'; -import {dialog} from 'electron'; +import {dialog, screen} from 'electron'; import Config from 'common/config'; import JsonFileManager from 'common/JsonFileManager'; @@ -34,6 +34,9 @@ jest.mock('electron', () => ({ showOpenDialogSync: jest.fn(), showMessageBoxSync: jest.fn(), }, + screen: { + getAllDisplays: jest.fn(), + }, })); jest.mock('common/config', () => ({ @@ -42,7 +45,6 @@ jest.mock('common/config', () => ({ jest.mock('common/JsonFileManager'); jest.mock('common/utils/util', () => ({ isVersionGreaterThanOrEqualTo: jest.fn(), - getDisplayBoundaries: jest.fn(), })); jest.mock('main/autoUpdater', () => ({})); @@ -182,13 +184,13 @@ describe('main/app/utils', () => { describe('resizeScreen', () => { beforeEach(() => { - Utils.getDisplayBoundaries.mockReturnValue([{ - minX: 400, - minY: 300, - maxX: 2320, - maxY: 1380, - width: 1920, - height: 1080, + screen.getAllDisplays.mockReturnValue([{ + workArea: { + x: 400, + y: 300, + width: 1920, + height: 1080, + }, }]); }); it('should keep the same position if it is within a display', () => { diff --git a/src/main/app/utils.ts b/src/main/app/utils.ts index 8ec1954e..b6ba675d 100644 --- a/src/main/app/utils.ts +++ b/src/main/app/utils.ts @@ -5,7 +5,7 @@ import path from 'path'; import fs from 'fs-extra'; -import {app, BrowserWindow, Menu, Rectangle, Session, session, dialog, nativeImage} from 'electron'; +import {app, BrowserWindow, Menu, Rectangle, Session, session, dialog, nativeImage, screen} from 'electron'; import log, {LevelOption} from 'electron-log'; import {MigrationInfo, TeamWithTabs} from 'types/config'; @@ -147,10 +147,25 @@ function isWithinDisplay(state: Rectangle, display: Boundaries) { return !(midX > display.maxX || midY > display.maxY); } +function getDisplayBoundaries() { + const displays = screen.getAllDisplays(); + + return displays.map((display) => { + return { + maxX: display.workArea.x + display.workArea.width, + maxY: display.workArea.y + display.workArea.height, + minX: display.workArea.x, + minY: display.workArea.y, + maxWidth: display.workArea.width, + maxHeight: display.workArea.height, + }; + }); +} + function getValidWindowPosition(state: Rectangle) { // Check if the previous position is out of the viewable area // (e.g. because the screen has been plugged off) - const boundaries = Utils.getDisplayBoundaries(); + const boundaries = getDisplayBoundaries(); const display = boundaries.find((boundary) => { return isWithinDisplay(state, boundary); }); diff --git a/src/renderer/modals/login/login.tsx b/src/renderer/modals/login/login.tsx index 1d119149..d19b5d80 100644 --- a/src/renderer/modals/login/login.tsx +++ b/src/renderer/modals/login/login.tsx @@ -7,6 +7,8 @@ import {AuthenticationResponseDetails} from 'electron/renderer'; import {MODAL_CANCEL, MODAL_RESULT, RETRIEVE_MODAL_INFO} from 'common/communication'; +import IntlProvider from 'renderer/intl_provider'; + import 'bootstrap/dist/css/bootstrap.min.css'; import 'renderer/css/modals.css'; @@ -30,11 +32,13 @@ const getAuthInfo = () => { const start = async () => { ReactDOM.render( - , + + + , document.getElementById('app'), ); }; diff --git a/src/renderer/modals/login/loginModal.tsx b/src/renderer/modals/login/loginModal.tsx index e46c1cbc..f8ae93e8 100644 --- a/src/renderer/modals/login/loginModal.tsx +++ b/src/renderer/modals/login/loginModal.tsx @@ -13,8 +13,6 @@ import {AuthenticationResponseDetails, AuthInfo} from 'electron/renderer'; import urlUtils from 'common/utils/url'; import {MODAL_INFO} from 'common/communication'; -import IntlProvider from 'renderer/intl_provider'; - type Props = { onCancel: (request: AuthenticationResponseDetails) => void; onLogin: (request: AuthenticationResponseDetails, username: string, password: string) => void; @@ -116,98 +114,96 @@ class LoginModal extends React.PureComponent { const {intl} = this.props; return ( - - - - - - - - -

- {this.renderLoginModalMessage()} -

-
- - - - - - ) => { - e.stopPropagation(); - }} - /> - - - - - - - - ) => { - e.stopPropagation(); - }} - /> - - - - -
- - { ' ' } - -
- -
-
-
-
-
+ + + + + + + +

+ {this.renderLoginModalMessage()} +

+
+ + + + + + ) => { + e.stopPropagation(); + }} + /> + + + + + + + + ) => { + e.stopPropagation(); + }} + /> + + + + +
+ + { ' ' } + +
+ +
+
+
+
); } } diff --git a/src/renderer/modals/permission/permission.tsx b/src/renderer/modals/permission/permission.tsx index c7685081..bc82cb26 100644 --- a/src/renderer/modals/permission/permission.tsx +++ b/src/renderer/modals/permission/permission.tsx @@ -6,6 +6,8 @@ import ReactDOM from 'react-dom'; import {MODAL_CANCEL, MODAL_RESULT, RETRIEVE_MODAL_INFO, MODAL_SEND_IPC_MESSAGE} from 'common/communication'; +import IntlProvider from 'renderer/intl_provider'; + import 'bootstrap/dist/css/bootstrap.min.css'; import 'renderer/css/modals.css'; @@ -33,12 +35,14 @@ const openExternalLink = (protocol: string, url: string) => { const start = async () => { ReactDOM.render( - , + + + , document.getElementById('app'), ); }; diff --git a/src/renderer/modals/permission/permissionModal.tsx b/src/renderer/modals/permission/permissionModal.tsx index 68543e22..e8eebf91 100644 --- a/src/renderer/modals/permission/permissionModal.tsx +++ b/src/renderer/modals/permission/permissionModal.tsx @@ -13,7 +13,6 @@ import urlUtil from 'common/utils/url'; import {t} from 'common/utils/util'; import {MODAL_INFO} from 'common/communication'; import {PERMISSION_DESCRIPTION} from 'common/permissions'; -import IntlProvider from 'renderer/intl_provider'; type Props = { handleDeny: React.MouseEventHandler; @@ -57,11 +56,19 @@ class PermissionModal extends React.PureComponent { } getModalTitle() { - const permission = this.props.intl.formatMessage({id: `common.permissions.${PERMISSION_DESCRIPTION[this.state.permission!]}`}); + if (!this.state.permission) { + return null; + } + + const permission = this.props.intl.formatMessage({id: PERMISSION_DESCRIPTION[this.state.permission!]}); return this.props.intl.formatMessage({id: 'renderer.modals.permission.permissionModal.title', defaultMessage: '{permission} Required'}, {permission}); } getModalBody() { + if (!this.state.permission) { + return null; + } + const {url, permission} = this.state; const originDisplay = url ? urlUtil.getHost(url) : this.props.intl.formatMessage({id: 'renderer.modals.permission.permissionModal.unknownOrigin', defaultMessage: 'unknown origin'}); const originLink = url ? originDisplay : ''; @@ -84,7 +91,7 @@ class PermissionModal extends React.PureComponent { id='renderer.modals.permission.permissionModal.body' defaultMessage={'A site that\'s not included in your Mattermost server configuration requires access for {permission}.'} values={{ - permission: this.props.intl.formatMessage({id: `common.permissions.${PERMISSION_DESCRIPTION[permission!]}`}), + permission: this.props.intl.formatMessage({id: PERMISSION_DESCRIPTION[permission!]}), }} /> {} @@ -113,42 +120,40 @@ class PermissionModal extends React.PureComponent { render() { return ( - - {}} - > - - {this.getModalTitle()} - - - {this.getModalBody()} - - -
- - -
-
-
-
+ {}} + > + + {this.getModalTitle()} + + + {this.getModalBody()} + + +
+ + +
+
+
); } }