From 3bb1ca7825a0381ddd8dbe7f44f7dcf4a788b165 Mon Sep 17 00:00:00 2001 From: André Oliveira <37463445+SpecialAro@users.noreply.github.com> Date: Tue, 19 Jul 2022 12:52:31 +0100 Subject: Feature: Add Release Notes (#491) Co-authored-by: Vijay A Co-authored-by: Ricardo Cino --- .../releaseNotes/ReleaseNotesDashboard.tsx | 99 ++++++++++++++++++++++ .../settings/releaseNotes/ReleaseNotesLayout.tsx | 79 +++++++++++++++++ 2 files changed, 178 insertions(+) create mode 100644 src/components/settings/releaseNotes/ReleaseNotesDashboard.tsx create mode 100644 src/components/settings/releaseNotes/ReleaseNotesLayout.tsx (limited to 'src/components/settings/releaseNotes') diff --git a/src/components/settings/releaseNotes/ReleaseNotesDashboard.tsx b/src/components/settings/releaseNotes/ReleaseNotesDashboard.tsx new file mode 100644 index 000000000..d0be82312 --- /dev/null +++ b/src/components/settings/releaseNotes/ReleaseNotesDashboard.tsx @@ -0,0 +1,99 @@ +import { Component } from 'react'; +import { observer } from 'mobx-react'; +import { defineMessages, injectIntl } from 'react-intl'; +import Markdown from 'markdown-to-jsx'; +import { openExternalUrl } from '../../../helpers/url-helpers'; +import { ferdiumVersion } from '../../../environment-remote'; +import { + getFerdiumVersion, + getUpdateInfoFromGH, +} from '../../../helpers/update-helpers'; + +const messages = defineMessages({ + headline: { + id: 'settings.releasenotes.headline', + defaultMessage: 'Release Notes', + }, + connectionError: { + id: 'settings.releasenotes.connectionError', + defaultMessage: + 'An error occured when connecting to Github, please try again later.', + }, + connectionErrorPageMissing: { + id: 'settings.releasenotes.connectionErrorPageMissing', + defaultMessage: + 'An error occured when connecting to Github, the page you are looking for is missing.', + }, +}); + +interface IProps { + intl: any; +} + +class ReleaseNotesDashboard extends Component { + state = { + data: '', + }; + + constructor(props) { + super(props); + + this.state = { data: '' }; + } + + async componentDidMount() { + const { intl } = this.props; + + const data = await getUpdateInfoFromGH( + window.location.href, + ferdiumVersion, + intl, + ); + + this.setState({ + data, + }); + + for (const link of document.querySelectorAll('.releasenotes__body a')) { + link.addEventListener('click', this.handleClick.bind(this), false); + } + } + + handleClick(e) { + e.preventDefault(); + openExternalUrl(e.target.href); + } + + componentWillUnmount() { + document.removeEventListener( + 'click', + // eslint-disable-next-line unicorn/no-invalid-remove-event-listener + this.handleClick.bind(this), + false, + ); + } + + render() { + const { intl } = this.props; + + const { data } = this.state; + return ( +
+
+ + Ferdium {getFerdiumVersion(window.location.href, ferdiumVersion)}{' '} + {' | '} + + + {intl.formatMessage(messages.headline)} + +
+
+ {data} +
+
+ ); + } +} + +export default injectIntl(observer(ReleaseNotesDashboard)); diff --git a/src/components/settings/releaseNotes/ReleaseNotesLayout.tsx b/src/components/settings/releaseNotes/ReleaseNotesLayout.tsx new file mode 100644 index 000000000..ee0ba75a8 --- /dev/null +++ b/src/components/settings/releaseNotes/ReleaseNotesLayout.tsx @@ -0,0 +1,79 @@ +import { Component } from 'react'; +import { inject, observer } from 'mobx-react'; +import { defineMessages, injectIntl } from 'react-intl'; + +import { mdiClose } from '@mdi/js'; +import { Outlet } from 'react-router-dom'; +import { StoresProps } from '../../../@types/ferdium-components.types'; +import ErrorBoundary from '../../util/ErrorBoundary'; +import Appear from '../../ui/effects/Appear'; +import Icon from '../../ui/icon'; +import { isEscKeyPress } from '../../../jsUtils'; + +const messages = defineMessages({ + closeSettings: { + id: 'settings.app.closeSettings', + defaultMessage: 'Close settings', + }, +}); + +interface IProps extends StoresProps { + intl: any; +} + +class ReleaseNotesLayout extends Component { + componentDidMount() { + document.addEventListener('keydown', this.handleKeyDown.bind(this), false); + } + + componentWillUnmount() { + document.removeEventListener( + 'keydown', + // eslint-disable-next-line unicorn/no-invalid-remove-event-listener + this.handleKeyDown.bind(this), + false, + ); + } + + handleKeyDown(e) { + if (isEscKeyPress(e.keyCode)) { + this.props.actions.ui.closeSettings(); + } + } + + render() { + const { closeSettings } = this.props.actions.ui; + + const { intl } = this.props; + + return ( + +
+ + +
+ + +
+ ); + } +} + +export default injectIntl<'intl', IProps>( + inject('stores', 'actions')(observer(ReleaseNotesLayout)), +); -- cgit v1.2.3-54-g00ecf