diff --git a/app/common/lib/updateUtil.js b/app/common/lib/updateUtil.js new file mode 100644 index 00000000000..f4f86d18cb0 --- /dev/null +++ b/app/common/lib/updateUtil.js @@ -0,0 +1,44 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +const Immutable = require('immutable') +const updateStatus = require('../../../js/constants/updateStatus') + +const isUpdateVisible = (state) => { + const updates = state.get('updates', Immutable.Map()) + + const isVerbose = updates.get('verbose', false) + const status = updates.get('status') + + // When verbose is not set we only want to show update available + // prompts, because otherwise the check is a background check and + // the user shouldn't be bothered. + return !( + !status || + ( + !isVerbose && + status !== updateStatus.UPDATE_AVAILABLE + ) || + status === updateStatus.UPDATE_NONE || + status === updateStatus.UPDATE_APPLYING_RESTART || + status === updateStatus.UPDATE_APPLYING_NO_RESTART + ) +} + +const getUpdateStatus = (state) => { + let status = state.getIn(['updates', 'status']) + + // The only difference between the deferred and non deferred variant is that + // the deferred allows hiding. Otherwise you couldn't hide available prompts. + if (status === updateStatus.UPDATE_AVAILABLE_DEFERRED) { + status = updateStatus.UPDATE_AVAILABLE + } + + return status +} + +module.exports = { + isUpdateVisible, + getUpdateStatus +} diff --git a/app/renderer/components/main/main.js b/app/renderer/components/main/main.js index 91e2f31079d..9461ba16569 100644 --- a/app/renderer/components/main/main.js +++ b/app/renderer/components/main/main.js @@ -66,6 +66,7 @@ const cx = require('../../../../js/lib/classSet') const eventUtil = require('../../../../js/lib/eventUtil') const siteSettings = require('../../../../js/state/siteSettings') const debounce = require('../../../../js/lib/debounce') +const updateUtil = require('../../../common/lib/updateUtil') const {isSourceAboutUrl} = require('../../../../js/lib/appUrlUtil') const {getCurrentWindowId, isMaximized, isFocused, isFullScreen} = require('../../currentWindow') const {isDarwin, isWindows, isLinux} = require('../../../common/lib/platformUtil') @@ -648,6 +649,7 @@ class Main extends ImmutableComponent { const activeOrigin = activeFrame ? siteUtil.getOrigin(activeFrame.get('location')) : null const notificationBarIsVisible = activeOrigin && this.props.appState.get('notifications').filter((item) => item.get('frameOrigin') ? activeOrigin === item.get('frameOrigin') : true).size > 0 + const updateIsVisible = updateUtil.isUpdateVisible(this.props.appState) const appStateSites = this.props.appState.get('sites') @@ -747,8 +749,11 @@ class Main extends ImmutableComponent { ? : null } - - + { + updateIsVisible + ? + : null + } { showBookmarksToolbar ? { - this.props.metadata && this.props.metadata.get('notes') + this.props.notes ? { - updateStatus === UpdateStatus.UPDATE_AVAILABLE ? : null + this.props.isAvailable + ? + : null } { - updateStatus === UpdateStatus.UPDATE_CHECKING ? : null + this.props.isChecking + ? + : null } { - updateStatus === UpdateStatus.UPDATE_DOWNLOADING ? : null + this.props.isDownloading + ? + : null } { - updateStatus === UpdateStatus.UPDATE_NOT_AVAILABLE ? : null + + this.props.isNotAvailable + ? + : null } { - updateStatus === UpdateStatus.UPDATE_ERROR ? : null + this.props.isError + ? + : null } } } +module.exports = ReduxComponent.connect(UpdateBar) + const styles = StyleSheet.create({ flexJustifyBetween: { display: 'flex', @@ -242,5 +248,3 @@ const updateBarStyle = css( commonStyles.notificationBar__notificationItem, commonStyles.notificationBar__greetingStyle ) - -module.exports = UpdateBar diff --git a/test/unit/app/common/lib/updateUtilTest.js b/test/unit/app/common/lib/updateUtilTest.js new file mode 100644 index 00000000000..b43a200d5d1 --- /dev/null +++ b/test/unit/app/common/lib/updateUtilTest.js @@ -0,0 +1,108 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* global describe, it */ +const assert = require('assert') +const Immutable = require('immutable') + +const updateUtil = require('../../../../../app/common/lib/updateUtil') +const updateStatus = require('../../../../../js/constants/updateStatus') +require('../../../braveUnit') + +describe('updateUtil test', function () { + describe('getUpdateStatus', function () { + it('update is not available', function () { + const result = updateUtil.getUpdateStatus(Immutable.Map()) + assert.equal(result, null) + }) + + it('update status is UPDATE_AVAILABLE_DEFERRED', function () { + const result = updateUtil.getUpdateStatus(Immutable.fromJS({ + updates: { + status: updateStatus.UPDATE_AVAILABLE_DEFERRED + } + })) + assert.equal(result, updateStatus.UPDATE_AVAILABLE) + }) + + it('update status is returned normally', function () { + const result = updateUtil.getUpdateStatus(Immutable.fromJS({ + updates: { + status: updateStatus.UPDATE_CHECKING + } + })) + assert.equal(result, updateStatus.UPDATE_CHECKING) + }) + }) + + describe('isUpdateVisible', function () { + it('update is not available', function () { + const result = updateUtil.isUpdateVisible(Immutable.Map()) + assert.equal(result, false) + }) + + it('status is not available', function () { + const result = updateUtil.isUpdateVisible(Immutable.fromJS({ + updates: {} + })) + assert.equal(result, false) + }) + + it('update is not verbose and status is different then UPDATE_AVAILABLE', function () { + const result = updateUtil.isUpdateVisible(Immutable.fromJS({ + updates: { + verbose: false, + status: updateStatus.UPDATE_CHECKING + } + })) + assert.equal(result, false) + }) + + it('update is verbose and status is UPDATE_AVAILABLE', function () { + const result = updateUtil.isUpdateVisible(Immutable.fromJS({ + updates: { + verbose: true, + status: updateStatus.UPDATE_AVAILABLE + } + })) + assert.equal(result, true) + }) + + it('update status is UPDATE_AVAILABLE', function () { + const result = updateUtil.isUpdateVisible(Immutable.fromJS({ + updates: { + status: updateStatus.UPDATE_AVAILABLE + } + })) + assert.equal(result, true) + }) + + it('update status is UPDATE_NONE', function () { + const result = updateUtil.isUpdateVisible(Immutable.fromJS({ + updates: { + status: updateStatus.UPDATE_NONE + } + })) + assert.equal(result, false) + }) + + it('update status is UPDATE_APPLYING_RESTART', function () { + const result = updateUtil.isUpdateVisible(Immutable.fromJS({ + updates: { + status: updateStatus.UPDATE_APPLYING_RESTART + } + })) + assert.equal(result, false) + }) + + it('update status is UPDATE_APPLYING_NO_RESTART', function () { + const result = updateUtil.isUpdateVisible(Immutable.fromJS({ + updates: { + status: updateStatus.UPDATE_APPLYING_NO_RESTART + } + })) + assert.equal(result, false) + }) + }) +})