diff --git a/src/app/Coriolis.jsx b/src/app/Coriolis.jsx index 5e2f7afd..43444850 100644 --- a/src/app/Coriolis.jsx +++ b/src/app/Coriolis.jsx @@ -22,6 +22,7 @@ import ShipyardPage from './pages/ShipyardPage'; import ErrorDetails from './pages/ErrorDetails'; const zlib = require('pako'); +const request = require('superagent'); /** * Coriolis App @@ -65,11 +66,12 @@ export default class Coriolis extends React.Component { this.state = { noTouch: !('ontouchstart' in window || navigator.msMaxTouchPoints || navigator.maxTouchPoints), page: null, + announcements: [], language: getLanguage(Persist.getLangCode()), route: {}, sizeRatio: Persist.getSizeRatio() }; - + this._getAnnouncements() Router('', (r) => this._setPage(ShipyardPage, r)); Router('/import?', (r) => this._importBuild(r)); Router('/import/:data', (r) => this._importBuild(r)); @@ -108,6 +110,14 @@ export default class Coriolis extends React.Component { } } + _getAnnouncements() { + return request.get('https://orbis.zone/api/announcement') + .query({showInCoriolis: true}) + .then(announces => { + this.setState({ announcements: announces.body }) + }) + } + /** * Updates / Sets the page and route context * @param {[type]} page The page to be shown @@ -394,7 +404,7 @@ export default class Coriolis extends React.Component { return
-
+
{this.state.error ? this.state.error : this.state.page ? React.createElement(this.state.page, { currentMenu }) : } {this.state.modal} diff --git a/src/app/components/Announcement.jsx b/src/app/components/Announcement.jsx new file mode 100644 index 00000000..76a3bdb5 --- /dev/null +++ b/src/app/components/Announcement.jsx @@ -0,0 +1,31 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { autoBind } from 'react-extras'; + +/** + * Announcement component + */ +export default class Announcement extends React.Component { + + static propTypes = { + text: PropTypes.string + }; + + /** + * Constructor + * @param {Object} props React Component properties + */ + constructor(props) { + super(props); + autoBind(this); + } + + /** + * Renders the announcement + * @return {React.Component} A href element + */ + render() { + return

{this.props.text}

; + } + +} diff --git a/src/app/components/Header.jsx b/src/app/components/Header.jsx index 900da5e7..4df4199b 100644 --- a/src/app/components/Header.jsx +++ b/src/app/components/Header.jsx @@ -16,6 +16,7 @@ import ModalExport from './ModalExport'; import ModalHelp from './ModalHelp'; import ModalImport from './ModalImport'; import Slider from './Slider'; +import Announcement from './Announcement'; import { outfitURL } from '../utils/UrlGenerators'; const SIZE_MIN = 0.65; @@ -76,6 +77,8 @@ export default class Header extends TranslatedComponent { this._openShips = this._openMenu.bind(this, 's'); this._openBuilds = this._openMenu.bind(this, 'b'); this._openComp = this._openMenu.bind(this, 'comp'); + this._openAnnounce = this._openMenu.bind(this, 'announce'); + this._getAnnouncementsMenu = this._getAnnouncementsMenu.bind(this); this._openSettings = this._openMenu.bind(this, 'settings'); this._showHelp = this._showHelp.bind(this); this.languageOptions = []; @@ -411,6 +414,29 @@ export default class Header extends TranslatedComponent { ); } + /** + * Generate the announcement menu + * @return {React.Component} Menu + */ + _getAnnouncementsMenu() { + let announcements; + let translate = this.context.language.translate; + + if (this.props.announcements) { + announcements = []; + for (let announce of this.props.announcements) { + announcements.push(); + announcements.push(
); + } + } + return ( +
e.stopPropagation() } style={{ whiteSpace: 'nowrap' }}> + {announcements} +
+
+ ); + } + /** * Generate the settings menu * @return {React.Component} Menu @@ -571,6 +597,13 @@ export default class Header extends TranslatedComponent { {openedMenu == 'comp' ? this._getComparisonsMenu() : null}
+
+
+ {translate('announcements')} +
+ {openedMenu == 'announce' ? this._getAnnouncementsMenu() : null} +
+ {window.location.origin.search('.edcd.io') >= 0 ?