Skip to content
This repository has been archived by the owner on Dec 11, 2019. It is now read-only.

Commit

Permalink
Merge pull request #9516 from NejcZdovc/redux/updateBar
Browse files Browse the repository at this point in the history
Converts UpdateBar into redux component
  • Loading branch information
NejcZdovc authored Jun 21, 2017
2 parents 6ade125 + 5ed19e4 commit f1c5efb
Show file tree
Hide file tree
Showing 4 changed files with 197 additions and 34 deletions.
44 changes: 44 additions & 0 deletions app/common/state/updateState.js
Original file line number Diff line number Diff line change
@@ -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
}
9 changes: 7 additions & 2 deletions app/renderer/components/main/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ const shieldState = require('../../../common/state/shieldState')
const siteSettingsState = require('../../../common/state/siteSettingsState')
const menuBarState = require('../../../common/state/menuBarState')
const windowState = require('../../../common/state/windowState')
const updateState = require('../../../common/state/updateState')

// Util
const _ = require('underscore')
Expand Down Expand Up @@ -633,6 +634,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 = updateState.isUpdateVisible(this.props.appState)

const appStateSites = this.props.appState.get('sites')

Expand Down Expand Up @@ -722,8 +724,11 @@ class Main extends ImmutableComponent {
? <CheckDefaultBrowserDialog />
: null
}

<UpdateBar updates={this.props.appState.get('updates')} />
{
updateIsVisible
? <UpdateBar />
: null
}
{
showBookmarksToolbar
? <BookmarksToolbar
Expand Down
70 changes: 38 additions & 32 deletions app/renderer/components/main/updateBar.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ const {StyleSheet, css} = require('aphrodite/no-important')

// Components
const ImmutableComponent = require('../immutableComponent')
const ReduxComponent = require('../reduxComponent')
const BrowserButton = require('../common/browserButton')

// Actions
Expand All @@ -16,6 +17,9 @@ const windowActions = require('../../../../js/actions/windowActions')
// Constants
const UpdateStatus = require('../../../../js/constants/updateStatus')

// State
const updateState = require('../../../common/state/updateState')

// Utils
const cx = require('../../../../js/lib/classSet')

Expand Down Expand Up @@ -79,6 +83,7 @@ class UpdateLog extends ImmutableComponent {
onViewLog () {
appActions.updateLogOpened()
}

render () {
return <BrowserButton groupedItem notificationItem secondaryColor
testId='updateViewLogButton'
Expand All @@ -97,7 +102,7 @@ class UpdateAvailable extends ImmutableComponent {
</div>
<span className={css(styles.flexAlignCenter)} data-test-id='notificationOptions'>
{
this.props.metadata && this.props.metadata.get('notes')
this.props.notes
? <BrowserButton groupedItem notificationItem secondaryColor
testId='updateDetails'
l10nId='updateDetails'
Expand Down Expand Up @@ -176,55 +181,58 @@ class UpdateNotAvailable extends ImmutableComponent {
}
}

class UpdateBar extends ImmutableComponent {
render () {
if (!this.props.updates) {
return null
}

// 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.
const verbose = this.props.updates.get('verbose')
let updateStatus = this.props.updates.get('status')
if (!updateStatus ||
(!verbose && updateStatus !== UpdateStatus.UPDATE_AVAILABLE) ||
updateStatus === UpdateStatus.UPDATE_NONE ||
updateStatus === UpdateStatus.UPDATE_APPLYING_RESTART ||
updateStatus === UpdateStatus.UPDATE_APPLYING_NO_RESTART) {
return null
}

// The only difference between the deferred and non deferred variant is that
// the deferred allows hiding. Otherwise you couldn't hide available prompts.
if (updateStatus === UpdateStatus.UPDATE_AVAILABLE_DEFERRED) {
updateStatus = UpdateStatus.UPDATE_AVAILABLE
}
class UpdateBar extends React.Component {
mergeProps (state, ownProps) {
const props = {}
props.updateStatus = updateState.getUpdateStatus(state)
props.notes = state.getIn(['updates', 'metadata', 'notes'])
props.isAvailable = props.updateStatus === UpdateStatus.UPDATE_AVAILABLE
props.isChecking = props.updateStatus === UpdateStatus.UPDATE_CHECKING
props.isDownloading = props.updateStatus === UpdateStatus.UPDATE_DOWNLOADING
props.isNotAvailable = props.updateStatus === UpdateStatus.UPDATE_NOT_AVAILABLE
props.isError = props.updateStatus === UpdateStatus.UPDATE_ERROR

return props
}

render () {
// 'notificationItem' for styling with notificationBar.less
return <div className={cx({
[updateBarStyle]: true,
notificationItem: true
})} data-test-id='updateBar'>
{
updateStatus === UpdateStatus.UPDATE_AVAILABLE ? <UpdateAvailable metadata={this.props.updates.get('metadata')} updateStatus={updateStatus} /> : null
this.props.isAvailable
? <UpdateAvailable notes={this.props.notes} updateStatus={this.props.updateStatus} />
: null
}
{
updateStatus === UpdateStatus.UPDATE_CHECKING ? <UpdateChecking updateStatus={updateStatus} /> : null
this.props.isChecking
? <UpdateChecking updateStatus={this.props.updateStatus} />
: null
}
{
updateStatus === UpdateStatus.UPDATE_DOWNLOADING ? <UpdateDownloading updateStatus={updateStatus} /> : null
this.props.isDownloading
? <UpdateDownloading updateStatus={this.props.updateStatus} />
: null
}
{
updateStatus === UpdateStatus.UPDATE_NOT_AVAILABLE ? <UpdateNotAvailable updateStatus={updateStatus} /> : null

this.props.isNotAvailable
? <UpdateNotAvailable updateStatus={this.props.updateStatus} />
: null
}
{
updateStatus === UpdateStatus.UPDATE_ERROR ? <UpdateError updateStatus={updateStatus} /> : null
this.props.isError
? <UpdateError updateStatus={this.props.updateStatus} />
: null
}
</div>
}
}

module.exports = ReduxComponent.connect(UpdateBar)

const styles = StyleSheet.create({
flexJustifyBetween: {
display: 'flex',
Expand All @@ -242,5 +250,3 @@ const updateBarStyle = css(
commonStyles.notificationBar__notificationItem,
commonStyles.notificationBar__greetingStyle
)

module.exports = UpdateBar
108 changes: 108 additions & 0 deletions test/unit/app/common/state/updateStateTest.js
Original file line number Diff line number Diff line change
@@ -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/state/updateState')
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)
})
})
})

0 comments on commit f1c5efb

Please sign in to comment.