From 805a911c080a748da57fa6d42f8fd3338a099521 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Wed, 18 Mar 2020 06:44:45 -0700 Subject: [PATCH] Show recent changes automatically at startup Summary: This shows a changelog as popup at startup, but only if it wasn't shown before, and only if there are new items in the changelog. The full changelog can still be accessed through the menu Changelog: From this release onward we will show important update messages through this dialog. Reviewed By: passy Differential Revision: D20492594 fbshipit-source-id: 4663979c8781b468430b9f8b628c4f506578b461 --- desktop/src/App.tsx | 21 +++- desktop/src/chrome/ChangelogSheet.tsx | 112 ++++++++++++++++-- .../chrome/__tests__/ChangelogSheet.node.tsx | 93 +++++++++++++++ desktop/src/reducers/application.tsx | 3 + 4 files changed, 219 insertions(+), 10 deletions(-) create mode 100644 desktop/src/chrome/__tests__/ChangelogSheet.node.tsx diff --git a/desktop/src/App.tsx b/desktop/src/App.tsx index 2da03f74b..972210453 100644 --- a/desktop/src/App.tsx +++ b/desktop/src/App.tsx @@ -37,6 +37,8 @@ import { ACTIVE_SHEET_PLUGIN_SHEET, ACTIVE_SHEET_JS_EMULATOR_LAUNCHER, ACTIVE_SHEET_CHANGELOG, + setActiveSheet, + ACTIVE_SHEET_CHANGELOG_RECENT_ONLY, } from './reducers/application'; import {Logger} from './fb-interfaces/Logger'; import BugReporter from './fb-stubs/BugReporter'; @@ -46,7 +48,7 @@ import PluginManager from './chrome/plugin-manager/PluginManager'; import StatusBar from './chrome/StatusBar'; import SettingsSheet from './chrome/SettingsSheet'; import DoctorSheet from './chrome/DoctorSheet'; -import ChangelogSheet from './chrome/ChangelogSheet'; +import ChangelogSheet, {hasNewChangesToShow} from './chrome/ChangelogSheet'; const version = remote.app.getVersion(); @@ -63,7 +65,11 @@ type StateFromProps = { staticView: StaticView; }; -type Props = StateFromProps & OwnProps; +type DispatchProps = { + setActiveSheet: typeof setActiveSheet; +}; + +type Props = StateFromProps & OwnProps & DispatchProps; export class App extends React.Component { componentDidMount() { @@ -79,6 +85,10 @@ export class App extends React.Component { }); ipcRenderer.send('getLaunchTime'); ipcRenderer.send('componentDidMount'); + + if (hasNewChangesToShow(window.localStorage)) { + this.props.setActiveSheet(ACTIVE_SHEET_CHANGELOG_RECENT_ONLY); + } } getSheet = (onHide: () => any) => { @@ -101,6 +111,8 @@ export class App extends React.Component { return ; case ACTIVE_SHEET_CHANGELOG: return ; + case ACTIVE_SHEET_CHANGELOG_RECENT_ONLY: + return ; case ACTIVE_SHEET_SELECT_PLUGINS_TO_EXPORT: return ; case ACTIVE_SHEET_SHARE_DATA: @@ -163,7 +175,7 @@ export class App extends React.Component { } } -export default connect( +export default connect( ({ application: {leftSidebarVisible, activeSheet, share}, connections: {errors, staticView}, @@ -174,4 +186,7 @@ export default connect( errors, staticView, }), + { + setActiveSheet, + }, )(App); diff --git a/desktop/src/chrome/ChangelogSheet.tsx b/desktop/src/chrome/ChangelogSheet.tsx index 2d1a7ed1e..32032041f 100644 --- a/desktop/src/chrome/ChangelogSheet.tsx +++ b/desktop/src/chrome/ChangelogSheet.tsx @@ -14,10 +14,21 @@ import path from 'path'; import {reportUsage} from '../utils/metrics'; import {getStaticPath} from '../utils/pathUtils'; -const changelog: string = readFileSync( - path.join(getStaticPath(), 'CHANGELOG.md'), - 'utf8', -); +const changelogKey = 'FlipperChangelogStatus'; + +type ChangelogStatus = { + lastHeader: string; +}; + +let getChangelogFromDisk = (): string => { + const changelogFromDisk: string = readFileSync( + path.join(getStaticPath(), 'CHANGELOG.md'), + 'utf8', + ).trim(); + + getChangelogFromDisk = () => changelogFromDisk; + return changelogFromDisk; +}; const Container = styled(FlexColumn)({ padding: 20, @@ -43,15 +54,24 @@ const changelogSectionStyle = { type Props = { onHide: () => void; + recent?: boolean; }; export default class ChangelogSheet extends Component { componentDidMount() { - reportUsage('changelog:opened'); + if (!this.props.recent) { + // opened through the menu + reportUsage('changelog:opened'); + } } componentWillUnmount(): void { - reportUsage('changelog:closed'); + if (this.props.recent) { + markChangelogRead(window.localStorage, getChangelogFromDisk()); + } + if (!this.props.recent) { + reportUsage('changelog:closed'); + } } render() { @@ -59,7 +79,17 @@ export default class ChangelogSheet extends Component { Changelog - +