From 58cda9cc7fb79ca9df6746de7f9662bc08dc156a Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Fri, 13 Oct 2017 12:29:40 +0200 Subject: initial commit --- src/components/layout/AppLayout.js | 148 +++++++++++++++++++++++++++++++++++++ src/components/layout/Sidebar.js | 75 +++++++++++++++++++ 2 files changed, 223 insertions(+) create mode 100644 src/components/layout/AppLayout.js create mode 100644 src/components/layout/Sidebar.js (limited to 'src/components/layout') diff --git a/src/components/layout/AppLayout.js b/src/components/layout/AppLayout.js new file mode 100644 index 000000000..f60c170a8 --- /dev/null +++ b/src/components/layout/AppLayout.js @@ -0,0 +1,148 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { observer, PropTypes as MobxPropTypes } from 'mobx-react'; +import { defineMessages, intlShape } from 'react-intl'; + +import InfoBar from '../ui/InfoBar'; +import globalMessages from '../../i18n/globalMessages'; + +function createMarkup(HTMLString) { + return { __html: HTMLString }; +} + +const messages = defineMessages({ + servicesUpdated: { + id: 'infobar.servicesUpdated', + defaultMessage: '!!!Your services have been updated.', + }, + updateAvailable: { + id: 'infobar.updateAvailable', + defaultMessage: '!!!A new update for Franz is available.', + }, + buttonReloadServices: { + id: 'infobar.buttonReloadServices', + defaultMessage: '!!!Reload services', + }, + buttonInstallUpdate: { + id: 'infobar.buttonInstallUpdate', + defaultMessage: '!!!Restart & install update', + }, + requiredRequestsFailed: { + id: 'infobar.requiredRequestsFailed', + defaultMessage: '!!!Could not load services and user information', + }, +}); + +@observer +export default class AppLayout extends Component { + static propTypes = { + sidebar: PropTypes.element.isRequired, + services: PropTypes.element.isRequired, + children: PropTypes.element, + news: MobxPropTypes.arrayOrObservableArray.isRequired, + isOnline: PropTypes.bool.isRequired, + showServicesUpdatedInfoBar: PropTypes.bool.isRequired, + appUpdateIsDownloaded: PropTypes.bool.isRequired, + removeNewsItem: PropTypes.func.isRequired, + reloadServicesAfterUpdate: PropTypes.func.isRequired, + installAppUpdate: PropTypes.func.isRequired, + showRequiredRequestsError: PropTypes.bool.isRequired, + areRequiredRequestsSuccessful: PropTypes.bool.isRequired, + retryRequiredRequests: PropTypes.func.isRequired, + areRequiredRequestsLoading: PropTypes.bool.isRequired, + }; + + static defaultProps = { + children: [], + }; + + static contextTypes = { + intl: intlShape, + }; + + render() { + const { + sidebar, + services, + children, + isOnline, + news, + showServicesUpdatedInfoBar, + appUpdateIsDownloaded, + removeNewsItem, + reloadServicesAfterUpdate, + installAppUpdate, + showRequiredRequestsError, + areRequiredRequestsSuccessful, + retryRequiredRequests, + areRequiredRequestsLoading, + } = this.props; + + const { intl } = this.context; + + return ( +
+
+ {sidebar} +
+ {news.length > 0 && news.map(item => ( + removeNewsItem({ newsId: item.id })} + > + + + ))} + {!isOnline && ( + + + {intl.formatMessage(globalMessages.notConnectedToTheInternet)} + + )} + {!areRequiredRequestsSuccessful && showRequiredRequestsError && ( + + + {intl.formatMessage(messages.requiredRequestsFailed)} + + )} + {showServicesUpdatedInfoBar && ( + + + {intl.formatMessage(messages.servicesUpdated)} + + )} + {appUpdateIsDownloaded && ( + + + {intl.formatMessage(messages.updateAvailable)} + + )} + {services} +
+
+ {children} +
+ ); + } +} diff --git a/src/components/layout/Sidebar.js b/src/components/layout/Sidebar.js new file mode 100644 index 000000000..4aee1ec60 --- /dev/null +++ b/src/components/layout/Sidebar.js @@ -0,0 +1,75 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import ReactTooltip from 'react-tooltip'; +import { defineMessages, intlShape } from 'react-intl'; + +import Tabbar from '../services/tabs/Tabbar'; +import { ctrlKey } from '../../environment'; + +const messages = defineMessages({ + settings: { + id: 'sidebar.settings', + defaultMessage: '!!!Settings', + }, +}); + +export default class Sidebar extends Component { + static propTypes = { + openSettings: PropTypes.func.isRequired, + isPremiumUser: PropTypes.bool, + } + + static defaultProps = { + isPremiumUser: false, + } + + static contextTypes = { + intl: intlShape, + }; + + state = { + tooltipEnabled: true, + }; + + enableToolTip() { + this.setState({ tooltipEnabled: true }); + } + + disableToolTip() { + this.setState({ tooltipEnabled: false }); + } + + render() { + const { openSettings, isPremiumUser } = this.props; + const { intl } = this.context; + return ( +
+ this.enableToolTip()} + disableToolTip={() => this.disableToolTip()} + /> + + {this.state.tooltipEnabled && ( + + )} +
+ ); + } +} -- cgit v1.2.3-54-g00ecf