Skip to content
This repository has been archived by the owner on Sep 22, 2021. It is now read-only.

Commit

Permalink
Added WMail news
Browse files Browse the repository at this point in the history
  • Loading branch information
Thomas101 committed Feb 24, 2017
1 parent 693b958 commit 5d0d916
Show file tree
Hide file tree
Showing 17 changed files with 425 additions and 20 deletions.
8 changes: 8 additions & 0 deletions src/app/src/app/stores/settingStore.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ const {
Settings: {
AppSettings,
LanguageSettings,
NewsSettings,
OSSettings,
ProxySettings,
TraySettings,
Expand All @@ -18,6 +19,7 @@ class SettingStore {
// Build the current data
this.app = new AppSettings(persistence.getJSONItem('app', {}))
this.language = new LanguageSettings(persistence.getJSONItem('language', {}))
this.news = new NewsSettings(persistence.getJSONItem('news', {}))
this.os = new OSSettings(persistence.getJSONItem('os', {}))
this.proxy = new ProxySettings(persistence.getJSONItem('proxy', {}))
this.tray = new TraySettings(persistence.getJSONItem('tray', {}))
Expand All @@ -36,6 +38,12 @@ class SettingStore {
this.emit('changed', { })
this.emit('changed:language', { prev: prev, next: this.language })
})
persistence.on('changed:news', () => {
const prev = this.news
this.news = new NewsSettings(persistence.getJSONItem('news', {}))
this.emit('changed', { })
this.emit('changed:news', { prev: prev, next: this.news })
})
persistence.on('changed:os', () => {
const prev = this.os
this.os = new OSSettings(persistence.getJSONItem('os', {}))
Expand Down
7 changes: 7 additions & 0 deletions src/scenes/mailboxes/src/Dispatch/navigationDispatch.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,13 @@ class NavigationDispatch {
}
})
}

/**
* Opens the news
*/
openNews () {
this.emit('opennews', {})
}
}

module.exports = new NavigationDispatch()
31 changes: 31 additions & 0 deletions src/scenes/mailboxes/src/stores/settings/settingsActions.js
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,37 @@ class SettingsActions {
setDpiMultiplier (val) {
return this.update(SEGMENTS.TRAY, 'dpiMultiplier', parseInt(val))
}

/* **************************************************************************/
// News
/* **************************************************************************/

/**
* @param serverResponse: the response received from the update server
*/
updateLatestNews (serverResponse) {
return this.update(SEGMENTS.NEWS, {
newsId: serverResponse.id,
newsLevel: serverResponse.level,
newsFeed: serverResponse.feed
})
}

/**
* Marks a news item as opened
* @param newsId: the id of the news item
*/
openNewsItem (newsId) {
return this.update(SEGMENTS.NEWS, 'openedNewsId', newsId)
}

/**
* Sets whether to show news in the sidebar
* @param show: true to show, false otherwise
*/
setShowNewsInSidebar (show) {
return this.update(SEGMENTS.NEWS, 'showNewsInSidebar', show)
}
}

const actions = alt.createActions(SettingsActions)
Expand Down
6 changes: 6 additions & 0 deletions src/scenes/mailboxes/src/stores/settings/settingsStore.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ const {
Settings: {
AppSettings,
LanguageSettings,
NewsSettings,
OSSettings,
ProxySettings,
TraySettings,
Expand Down Expand Up @@ -77,6 +78,7 @@ class SettingsStore {
constructor () {
this.app = null
this.language = null
this.news = null
this.os = null
this.proxy = null
this.tray = null
Expand Down Expand Up @@ -104,6 +106,7 @@ class SettingsStore {
// Load everything
this.app = new AppSettings(persistence.getJSONItemSync('app', {}))
this.language = new LanguageSettings(persistence.getJSONItemSync('language', {}))
this.news = new NewsSettings(persistence.getJSONItemSync('news', {}))
this.os = new OSSettings(persistence.getJSONItemSync('os', {}))
this.proxy = new ProxySettings(persistence.getJSONItemSync('proxy', {}))
this.tray = new TraySettings(persistence.getJSONItemSync('tray', {}), this.trayDefaults)
Expand All @@ -122,6 +125,7 @@ class SettingsStore {
switch (segment) {
case SettingsIdent.SEGMENTS.APP: return 'app'
case SettingsIdent.SEGMENTS.LANGUAGE: return 'language'
case SettingsIdent.SEGMENTS.NEWS: return 'news'
case SettingsIdent.SEGMENTS.OS: return 'os'
case SettingsIdent.SEGMENTS.PROXY: return 'proxy'
case SettingsIdent.SEGMENTS.TRAY: return 'tray'
Expand All @@ -137,6 +141,7 @@ class SettingsStore {
switch (segment) {
case SettingsIdent.SEGMENTS.APP: return AppSettings
case SettingsIdent.SEGMENTS.LANGUAGE: return LanguageSettings
case SettingsIdent.SEGMENTS.NEWS: return NewsSettings
case SettingsIdent.SEGMENTS.OS: return OSSettings
case SettingsIdent.SEGMENTS.PROXY: return ProxySettings
case SettingsIdent.SEGMENTS.TRAY: return TraySettings
Expand All @@ -152,6 +157,7 @@ class SettingsStore {
switch (segment) {
case SettingsIdent.SEGMENTS.APP: return 'app'
case SettingsIdent.SEGMENTS.LANGUAGE: return 'language'
case SettingsIdent.SEGMENTS.NEWS: return 'news'
case SettingsIdent.SEGMENTS.OS: return 'os'
case SettingsIdent.SEGMENTS.PROXY: return 'proxy'
case SettingsIdent.SEGMENTS.TRAY: return 'tray'
Expand Down
2 changes: 2 additions & 0 deletions src/scenes/mailboxes/src/ui/AppContent.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ const UpdateCheckDialog = require('./UpdateCheckDialog')
const { settingsStore } = require('../stores/settings')
const MailboxWizard = require('./MailboxWizard')
const AppWizard = require('./AppWizard')
const NewsDialog = require('./NewsDialog')

module.exports = React.createClass({
displayName: 'AppContent',
Expand Down Expand Up @@ -96,6 +97,7 @@ module.exports = React.createClass({
<DictionaryInstallHandler />
<AppWizard />
<MailboxWizard />
<NewsDialog />
<UpdateCheckDialog />
<MailboxComposePicker />
</div>
Expand Down
145 changes: 145 additions & 0 deletions src/scenes/mailboxes/src/ui/NewsDialog.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
import './NewsDialog.less'

const React = require('react')
const shallowCompare = require('react-addons-shallow-compare')
const { RaisedButton, Dialog, Toggle } = require('material-ui')
const { settingsActions, settingsStore } = require('../stores/settings')
const navigationDispatch = require('../Dispatch/navigationDispatch')
const WebView = require('../Components/WebView')
const {
remote: {shell}
} = window.nativeRequire('electron')

module.exports = React.createClass({
/* **************************************************************************/
// Class
/* **************************************************************************/

displayName: 'NewsDialog',

/* **************************************************************************/
// Component Lifecycle
/* **************************************************************************/

componentDidMount () {
settingsStore.listen(this.settingsUpdated)
navigationDispatch.on('opennews', this.handleOpen)
},

componentWillUnmount () {
settingsStore.unlisten(this.settingsUpdated)
navigationDispatch.off('opennews', this.handleOpen)
},

/* **************************************************************************/
// Data lifecycle
/* **************************************************************************/

getInitialState () {
const settingsState = settingsStore.getState()
return {
feedUrl: settingsState.news.newsFeed,
newsId: settingsState.news.newsId,
newsLevel: settingsState.news.newsLevel,
hasUnopenedNewsId: settingsState.news.hasUnopenedNewsId,
hasUpdateInfo: settingsState.news.hasUpdateInfo,
showNewsInSidebar: settingsState.news.showNewsInSidebar,
open: this.shouldAutoOpen(settingsState.news)
}
},

settingsUpdated (settingsState) {
this.setState((prevState) => {
const update = {
feedUrl: settingsState.news.newsFeed,
newsId: settingsState.news.newsId,
newsLevel: settingsState.news.newsLevel,
hasUnopenedNewsId: settingsState.news.hasUnopenedNewsId,
hasUpdateInfo: settingsState.news.hasUpdateInfo,
showNewsInSidebar: settingsState.news.showNewsInSidebar
}

const autoOpen = this.shouldAutoOpen(settingsState.news)
if (autoOpen && prevState.open !== autoOpen) {
update.open = true
}

return update
})
},

shouldAutoOpen (news) {
if (news.hasUnopenedNewsId && news.hasUpdateInfo && news.newsLevel === 'dialog') {
return true
} else {
return false
}
},

/* **************************************************************************/
// UI Events
/* **************************************************************************/

handleDone (evt) {
settingsActions.openNewsItem(this.state.newsId)
this.setState({ open: false })
},

handleOpen () {
settingsActions.openNewsItem(this.state.newsId)
this.setState({ open: true })
},

handleOpenNewWindow (evt) {
shell.openExternal(evt.url)
},

/* **************************************************************************/
// Rendering
/* **************************************************************************/

shouldComponentUpdate (nextProps, nextState) {
return shallowCompare(this, nextProps, nextState)
},

render () {
const { open, feedUrl, showNewsInSidebar } = this.state

const buttons = (
<div style={{ display: 'flex', justifyContent: 'space-between' }}>
<div style={{ width: '50%', textAlign: 'left', paddingTop: 8 }}>
<Toggle
toggled={showNewsInSidebar}
label='Always show in sidebar'
labelPosition='right'
labelStyle={{ color: 'rgb(189,189,189)' }}
onToggle={(evt, toggled) => {
settingsActions.setShowNewsInSidebar(toggled)
}} />
</div>
<div>
<RaisedButton
primary
label='Done'
onClick={this.handleDone} />
</div>
</div>
)

return (
<Dialog
modal={false}
actions={buttons}
open={open}
onRequestClose={this.handleDone}
bodyClassName='ReactComponent-NewsDialog-Body'>
{open ? (
<WebView
src={feedUrl}
newWindow={this.handleOpenNewWindow}
/>
) : undefined}
</Dialog>
)
}
})
22 changes: 22 additions & 0 deletions src/scenes/mailboxes/src/ui/NewsDialog.less
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
.ReactComponent-NewsDialog-Body {
padding: 0;
overflow: hidden;
position: relative;

&:before {
content: "";
margin-bottom: 100%;
display: inline-block;
}

>iframe, >webview {
border: none;
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ module.exports = React.createClass({
propTypes: {
ui: React.PropTypes.object.isRequired,
os: React.PropTypes.object.isRequired,
news: React.PropTypes.object.isRequired,
showRestart: React.PropTypes.func.isRequired
},

Expand All @@ -28,6 +29,7 @@ module.exports = React.createClass({
const {
ui,
os,
news,
showRestart,
...passProps
} = this.props
Expand Down Expand Up @@ -80,6 +82,11 @@ module.exports = React.createClass({
label='Always Start minimized'
labelPosition='right'
onToggle={(evt, toggled) => settingsActions.setOpenHidden(toggled)} />
<Toggle
toggled={news.showNewsInSidebar}
label='Always show news in sidebar'
labelPosition='right'
onToggle={(evt, toggled) => { settingsActions.setShowNewsInSidebar(toggled) }} />
</Paper>
</div>
)
Expand Down
3 changes: 3 additions & 0 deletions src/scenes/mailboxes/src/ui/Settings/GeneralSettings.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ module.exports = React.createClass({
return {
ui: store.ui,
os: store.os,
news: store.news,
language: store.language,
tray: store.tray
}
Expand Down Expand Up @@ -94,6 +95,7 @@ module.exports = React.createClass({
os,
language,
tray,
news,
openAtLoginSupported,
openAtLogin,
openAsHiddenAtLogin,
Expand All @@ -110,6 +112,7 @@ module.exports = React.createClass({
<UISettingsSection
ui={ui}
os={os}
news={news}
showRestart={showRestart} />
<NotificationSettingsSection os={os} />
<DownloadSettingsSection os={os} />
Expand Down
Loading

0 comments on commit 5d0d916

Please sign in to comment.