From 6fb07bcb716af76ec2e96345f37624d12d0d1af0 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Tue, 12 Mar 2019 21:36:10 +0100 Subject: implements basic release announcement feature --- src/features/announcements/index.js | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/features/announcements/index.js (limited to 'src/features/announcements/index.js') diff --git a/src/features/announcements/index.js b/src/features/announcements/index.js new file mode 100644 index 000000000..5ea74e0af --- /dev/null +++ b/src/features/announcements/index.js @@ -0,0 +1,37 @@ +import { reaction, runInAction } from 'mobx'; +import { AnnouncementsStore } from './store'; +import api from './api'; +import state, { resetState } from './state'; + +const debug = require('debug')('Franz:feature:announcements'); + +let store = null; + +export default function initAnnouncements(stores, actions) { + // const { features } = stores; + + // Toggle workspace feature + reaction( + () => ( + true + // features.features.isAnnouncementsEnabled + ), + (isEnabled) => { + if (isEnabled) { + debug('Initializing `announcements` feature'); + store = new AnnouncementsStore(stores, api, actions, state); + store.initialize(); + runInAction(() => { state.isFeatureActive = true; }); + } else if (store) { + debug('Disabling `announcements` feature'); + runInAction(() => { state.isFeatureActive = false; }); + store.teardown(); + store = null; + resetState(); // Reset state to default + } + }, + { + fireImmediately: true, + }, + ); +} -- cgit v1.2.3-70-g09d2 From ca9d5863f9067f2a32498da763cd536e0bcc5c77 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Thu, 11 Apr 2019 12:53:16 +0200 Subject: refactor announcements to newest feature pattern --- src/components/layout/AppLayout.js | 2 +- src/containers/layout/AppLayoutContainer.js | 5 +- src/features/announcements/Component.js | 77 --------------------- src/features/announcements/api.js | 6 +- .../announcements/components/AnnouncementScreen.js | 79 ++++++++++++++++++++++ src/features/announcements/index.js | 17 ++--- src/features/announcements/state.js | 17 ----- src/features/announcements/store.js | 49 ++++++++------ src/i18n/locales/defaultMessages.json | 18 +++++ .../components/AnnouncementScreen.json | 15 ++++ 10 files changed, 156 insertions(+), 129 deletions(-) delete mode 100644 src/features/announcements/Component.js create mode 100644 src/features/announcements/components/AnnouncementScreen.js delete mode 100644 src/features/announcements/state.js create mode 100644 src/i18n/messages/src/features/announcements/components/AnnouncementScreen.json (limited to 'src/features/announcements/index.js') diff --git a/src/components/layout/AppLayout.js b/src/components/layout/AppLayout.js index 985475c8d..eb3f03f12 100644 --- a/src/components/layout/AppLayout.js +++ b/src/components/layout/AppLayout.js @@ -14,7 +14,7 @@ import ErrorBoundary from '../util/ErrorBoundary'; // import globalMessages from '../../i18n/globalMessages'; import { isWindows } from '../../environment'; -import AnnouncementScreen from '../../features/announcements/Component'; +import AnnouncementScreen from '../../features/announcements/components/AnnouncementScreen'; import WorkspaceSwitchingIndicator from '../../features/workspaces/components/WorkspaceSwitchingIndicator'; import { workspaceStore } from '../../features/workspaces'; diff --git a/src/containers/layout/AppLayoutContainer.js b/src/containers/layout/AppLayoutContainer.js index 0357f63bd..8a0e105e7 100644 --- a/src/containers/layout/AppLayoutContainer.js +++ b/src/containers/layout/AppLayoutContainer.js @@ -20,10 +20,11 @@ import Services from '../../components/services/content/Services'; import AppLoader from '../../components/ui/AppLoader'; import { state as delayAppState } from '../../features/delayApp'; -import { announcementsState } from '../../features/announcements/state'; +import { } from '../../features/announcements/store'; import { workspaceActions } from '../../features/workspaces/actions'; import WorkspaceDrawer from '../../features/workspaces/components/WorkspaceDrawer'; import { workspaceStore } from '../../features/workspaces'; +import { announcementsStore } from '../../features/announcements'; export default @inject('stores', 'actions') @observer class AppLayoutContainer extends Component { static defaultProps = { @@ -150,7 +151,7 @@ export default @inject('stores', 'actions') @observer class AppLayoutContainer e areRequiredRequestsLoading={requests.areRequiredRequestsLoading} darkMode={settings.all.app.darkMode} isDelayAppScreenVisible={delayAppState.isDelayAppScreenVisible} - isAnnouncementVisible={announcementsState.isAnnouncementVisible} + isAnnouncementVisible={announcementsStore.isAnnouncementVisible} > {React.Children.count(children) > 0 ? children : null} diff --git a/src/features/announcements/Component.js b/src/features/announcements/Component.js deleted file mode 100644 index 5d95f5d84..000000000 --- a/src/features/announcements/Component.js +++ /dev/null @@ -1,77 +0,0 @@ -import React, { Component } from 'react'; -import marked from 'marked'; -import PropTypes from 'prop-types'; -import { inject, observer } from 'mobx-react'; -import { defineMessages, intlShape } from 'react-intl'; -import injectSheet from 'react-jss'; -import { themeSidebarWidth } from '@meetfranz/theme/lib/themes/legacy'; -import state from './state'; - -const messages = defineMessages({ - headline: { - id: 'feature.announcements.headline', - defaultMessage: '!!!What\'s new in Franz {version}?', - }, -}); - -const styles = theme => ({ - container: { - background: theme.colorBackground, - position: 'absolute', - top: 0, - zIndex: 140, - width: `calc(100% - ${themeSidebarWidth})`, - display: 'flex', - 'flex-direction': 'column', - 'align-items': 'center', - 'justify-content': 'center', - }, - headline: { - color: theme.colorHeadline, - margin: [25, 0, 40], - 'max-width': 500, - 'text-align': 'center', - 'line-height': '1.3em', - }, - body: { - '& h3': { - fontSize: '24px', - margin: '1.5em 0 1em 0', - }, - '& li': { - marginBottom: '1em', - }, - }, -}); - - -@inject('actions') @injectSheet(styles) @observer -class AnnouncementScreen extends Component { - static propTypes = { - classes: PropTypes.object.isRequired, - }; - - static contextTypes = { - intl: intlShape, - }; - - render() { - const { classes } = this.props; - const { intl } = this.context; - return ( -
-

- {intl.formatMessage(messages.headline, { version: state.currentVersion })} -

-
-
- ); - } -} - -export default AnnouncementScreen; diff --git a/src/features/announcements/api.js b/src/features/announcements/api.js index ec16066a6..09fcb8235 100644 --- a/src/features/announcements/api.js +++ b/src/features/announcements/api.js @@ -1,8 +1,9 @@ import { remote } from 'electron'; +import Request from '../../stores/lib/Request'; const debug = require('debug')('Franz:feature:announcements:api'); -export default { +export const announcementsApi = { async getCurrentVersion() { debug('getting current version of electron app'); return Promise.resolve(remote.app.getVersion()); @@ -17,3 +18,6 @@ export default { return data.body; }, }; + +export const getCurrentVersionRequest = new Request(announcementsApi, 'getCurrentVersion'); +export const getAnnouncementRequest = new Request(announcementsApi, 'getAnnouncementForVersion'); diff --git a/src/features/announcements/components/AnnouncementScreen.js b/src/features/announcements/components/AnnouncementScreen.js new file mode 100644 index 000000000..5b3e7aeaa --- /dev/null +++ b/src/features/announcements/components/AnnouncementScreen.js @@ -0,0 +1,79 @@ +import React, { Component } from 'react'; +import marked from 'marked'; +import PropTypes from 'prop-types'; +import { inject, observer } from 'mobx-react'; +import { defineMessages, intlShape } from 'react-intl'; +import injectSheet from 'react-jss'; +import { themeSidebarWidth } from '../../../../packages/theme/lib/themes/legacy'; +import { announcementsStore } from '../index'; + +const messages = defineMessages({ + headline: { + id: 'feature.announcements.headline', + defaultMessage: '!!!What\'s new in Franz {version}?', + }, +}); + +const styles = theme => ({ + container: { + background: theme.colorBackground, + position: 'absolute', + top: 0, + zIndex: 140, + width: `calc(100% - ${themeSidebarWidth})`, + display: 'flex', + 'flex-direction': 'column', + 'align-items': 'center', + 'justify-content': 'center', + }, + headline: { + color: theme.colorHeadline, + margin: [25, 0, 40], + 'max-width': 500, + 'text-align': 'center', + 'line-height': '1.3em', + }, + body: { + '& h3': { + fontSize: '24px', + margin: '1.5em 0 1em 0', + }, + '& li': { + marginBottom: '1em', + }, + }, +}); + + +@inject('actions') @injectSheet(styles) @observer +class AnnouncementScreen extends Component { + static propTypes = { + classes: PropTypes.object.isRequired, + }; + + static contextTypes = { + intl: intlShape, + }; + + render() { + const { classes } = this.props; + const { intl } = this.context; + return ( +
+

+ {intl.formatMessage(messages.headline, { + version: announcementsStore.currentVersion, + })} +

+
+
+ ); + } +} + +export default AnnouncementScreen; diff --git a/src/features/announcements/index.js b/src/features/announcements/index.js index 5ea74e0af..c087689a7 100644 --- a/src/features/announcements/index.js +++ b/src/features/announcements/index.js @@ -1,11 +1,9 @@ -import { reaction, runInAction } from 'mobx'; +import { reaction } from 'mobx'; import { AnnouncementsStore } from './store'; -import api from './api'; -import state, { resetState } from './state'; const debug = require('debug')('Franz:feature:announcements'); -let store = null; +export const announcementsStore = new AnnouncementsStore(); export default function initAnnouncements(stores, actions) { // const { features } = stores; @@ -19,15 +17,10 @@ export default function initAnnouncements(stores, actions) { (isEnabled) => { if (isEnabled) { debug('Initializing `announcements` feature'); - store = new AnnouncementsStore(stores, api, actions, state); - store.initialize(); - runInAction(() => { state.isFeatureActive = true; }); - } else if (store) { + announcementsStore.start(stores, actions); + } else if (announcementsStore.isFeatureActive) { debug('Disabling `announcements` feature'); - runInAction(() => { state.isFeatureActive = false; }); - store.teardown(); - store = null; - resetState(); // Reset state to default + announcementsStore.stop(); } }, { diff --git a/src/features/announcements/state.js b/src/features/announcements/state.js deleted file mode 100644 index 81b632253..000000000 --- a/src/features/announcements/state.js +++ /dev/null @@ -1,17 +0,0 @@ -import { observable } from 'mobx'; - -const defaultState = { - announcement: null, - currentVersion: null, - lastUsedVersion: null, - isAnnouncementVisible: false, - isFeatureActive: false, -}; - -export const announcementsState = observable(defaultState); - -export function resetState() { - Object.assign(announcementsState, defaultState); -} - -export default announcementsState; diff --git a/src/features/announcements/store.js b/src/features/announcements/store.js index 004a44062..c59700926 100644 --- a/src/features/announcements/store.js +++ b/src/features/announcements/store.js @@ -1,28 +1,39 @@ import { action, observable, reaction } from 'mobx'; import semver from 'semver'; - -import Request from '../../stores/lib/Request'; -import Store from '../../stores/lib/Store'; +import { FeatureStore } from '../utils/FeatureStore'; +import { getAnnouncementRequest, getCurrentVersionRequest } from './api'; const debug = require('debug')('Franz:feature:announcements:store'); -export class AnnouncementsStore extends Store { - @observable getCurrentVersion = new Request(this.api, 'getCurrentVersion'); +export class AnnouncementsStore extends FeatureStore { - @observable getAnnouncement = new Request(this.api, 'getAnnouncementForVersion'); + @observable announcement = null; - constructor(stores, api, actions, state) { - super(stores, api, actions); - this.state = state; - } + @observable currentVersion = null; + + @observable lastUsedVersion = null; + + @observable isAnnouncementVisible = false; - async setup() { + @observable isFeatureActive = false; + + async start(stores, actions) { + debug('AnnouncementsStore::start'); + this.stores = stores; + this.actions = actions; await this.fetchLastUsedVersion(); await this.fetchCurrentVersion(); await this.fetchReleaseAnnouncement(); this.showAnnouncementIfNotSeenYet(); this.actions.announcements.show.listen(this._showAnnouncement.bind(this)); + this.isFeatureActive = true; + } + + stop() { + debug('AnnouncementsStore::stop'); + this.isFeatureActive = false; + this.isAnnouncementVisible = false; } // ====== PUBLIC ====== @@ -35,14 +46,14 @@ export class AnnouncementsStore extends Store { async fetchCurrentVersion() { debug('getting current version from api'); - const version = await this.getCurrentVersion.execute(); + const version = await getCurrentVersionRequest.execute(); this._setCurrentVersion(version); } async fetchReleaseAnnouncement() { debug('getting release announcement from api'); try { - const announcement = await this.getAnnouncement.execute(this.state.currentVersion); + const announcement = await getAnnouncementRequest.execute(this.currentVersion); this._setAnnouncement(announcement); } catch (error) { this._setAnnouncement(null); @@ -50,7 +61,7 @@ export class AnnouncementsStore extends Store { } showAnnouncementIfNotSeenYet() { - const { announcement, currentVersion, lastUsedVersion } = this.state; + const { announcement, currentVersion, lastUsedVersion } = this; if (announcement && semver.gt(currentVersion, lastUsedVersion)) { debug(`${currentVersion} < ${lastUsedVersion}: announcement is shown`); this._showAnnouncement(); @@ -64,21 +75,21 @@ export class AnnouncementsStore extends Store { @action _setCurrentVersion(version) { debug(`setting current version to ${version}`); - this.state.currentVersion = version; + this.currentVersion = version; } @action _setLastUsedVersion(version) { debug(`setting last used version to ${version}`); - this.state.lastUsedVersion = version; + this.lastUsedVersion = version; } @action _setAnnouncement(announcement) { debug(`setting announcement to ${announcement}`); - this.state.announcement = announcement; + this.announcement = announcement; } @action _showAnnouncement() { - this.state.isAnnouncementVisible = true; + this.isAnnouncementVisible = true; this.actions.service.blurActive(); const dispose = reaction( () => this.stores.services.active, @@ -90,6 +101,6 @@ export class AnnouncementsStore extends Store { } @action _hideAnnouncement() { - this.state.isAnnouncementVisible = false; + this.isAnnouncementVisible = false; } } diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index 698698515..1dd31324e 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json @@ -3097,6 +3097,24 @@ ], "path": "src/features/announcements/Component.json" }, + { + "descriptors": [ + { + "defaultMessage": "!!!What's new in Franz {version}?", + "end": { + "column": 3, + "line": 14 + }, + "file": "src/features/announcements/components/AnnouncementScreen.js", + "id": "feature.announcements.headline", + "start": { + "column": 12, + "line": 11 + } + } + ], + "path": "src/features/announcements/components/AnnouncementScreen.json" + }, { "descriptors": [ { diff --git a/src/i18n/messages/src/features/announcements/components/AnnouncementScreen.json b/src/i18n/messages/src/features/announcements/components/AnnouncementScreen.json new file mode 100644 index 000000000..225670ee2 --- /dev/null +++ b/src/i18n/messages/src/features/announcements/components/AnnouncementScreen.json @@ -0,0 +1,15 @@ +[ + { + "id": "feature.announcements.headline", + "defaultMessage": "!!!What's new in Franz {version}?", + "file": "src/features/announcements/components/AnnouncementScreen.js", + "start": { + "line": 11, + "column": 12 + }, + "end": { + "line": 14, + "column": 3 + } + } +] \ No newline at end of file -- cgit v1.2.3-70-g09d2 From 7c8aca45bd649b372ea623fc980769f5e9142405 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Tue, 16 Apr 2019 09:44:45 +0200 Subject: Add analytics events --- src/features/announcements/index.js | 2 ++ src/features/announcements/store.js | 4 ++++ 2 files changed, 6 insertions(+) (limited to 'src/features/announcements/index.js') diff --git a/src/features/announcements/index.js b/src/features/announcements/index.js index c087689a7..4658b976f 100644 --- a/src/features/announcements/index.js +++ b/src/features/announcements/index.js @@ -3,6 +3,8 @@ import { AnnouncementsStore } from './store'; const debug = require('debug')('Franz:feature:announcements'); +export const GA_CATEGORY_ANNOUNCEMENTS = 'Announcements'; + export const announcementsStore = new AnnouncementsStore(); export default function initAnnouncements(stores, actions) { diff --git a/src/features/announcements/store.js b/src/features/announcements/store.js index bb54abc46..1abc305fd 100644 --- a/src/features/announcements/store.js +++ b/src/features/announcements/store.js @@ -8,10 +8,12 @@ import semver from 'semver'; import localStorage from 'mobx-localstorage'; import { FeatureStore } from '../utils/FeatureStore'; +import { GA_CATEGORY_ANNOUNCEMENTS } from '.'; import { getAnnouncementRequest, getChangelogRequest, getCurrentVersionRequest } from './api'; import { announcementActions } from './actions'; import { createActionBindings } from '../utils/ActionBinding'; import { createReactions } from '../../stores/lib/Reaction'; +import { gaEvent } from '../../lib/analytics'; const LOCAL_STORAGE_KEY = 'announcements'; @@ -98,6 +100,8 @@ export class AnnouncementsStore extends FeatureStore { dispose(); }, ); + + gaEvent(GA_CATEGORY_ANNOUNCEMENTS, 'show'); }; @action _hideAnnouncement() { -- cgit v1.2.3-70-g09d2 From 1e38ec5e524c71ae89cd7d4956736494b8c13886 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Wed, 8 May 2019 17:02:09 +0200 Subject: fix(Announcements): Fixes issue with rendering announcments in workspaces --- packages/theme/src/themes/dark/index.ts | 2 +- src/actions/service.js | 1 + src/app.js | 3 ++ src/components/layout/AppLayout.js | 5 +-- src/containers/layout/AppLayoutContainer.js | 1 - .../announcements/components/AnnouncementScreen.js | 2 +- src/features/announcements/index.js | 4 +++ src/features/announcements/store.js | 41 +++++++++++----------- src/features/workspaces/store.js | 8 +++-- src/stores/ServicesStore.js | 3 +- 10 files changed, 38 insertions(+), 32 deletions(-) (limited to 'src/features/announcements/index.js') diff --git a/packages/theme/src/themes/dark/index.ts b/packages/theme/src/themes/dark/index.ts index d48dbf916..bd9f001e8 100644 --- a/packages/theme/src/themes/dark/index.ts +++ b/packages/theme/src/themes/dark/index.ts @@ -113,7 +113,7 @@ export const workspaces = merge({}, defaultStyles.workspaces, { }); // Announcements -export const announcements = merge({}, defaultStyles.workspaces, { +export const announcements = merge({}, defaultStyles.announcements, { spotlight: { background: legacyStyles.darkThemeGrayDark, }, diff --git a/src/actions/service.js b/src/actions/service.js index ce62560a9..68c62d594 100644 --- a/src/actions/service.js +++ b/src/actions/service.js @@ -4,6 +4,7 @@ import ServiceModel from '../models/Service'; export default { setActive: { serviceId: PropTypes.string.isRequired, + keepActiveRoute: PropTypes.bool, }, blurActive: {}, setActiveNext: {}, diff --git a/src/app.js b/src/app.js index f6092bf60..cb3e37c64 100644 --- a/src/app.js +++ b/src/app.js @@ -43,6 +43,8 @@ import SubscriptionPopupScreen from './containers/subscription/SubscriptionPopup import WorkspacesScreen from './features/workspaces/containers/WorkspacesScreen'; import EditWorkspaceScreen from './features/workspaces/containers/EditWorkspaceScreen'; import { WORKSPACES_ROUTES } from './features/workspaces'; +import AnnouncementScreen from './features/announcements/components/AnnouncementScreen'; +import { ANNOUNCEMENTS_ROUTES } from './features/announcements'; // Add Polyfills smoothScroll.polyfill(); @@ -73,6 +75,7 @@ window.addEventListener('load', () => { + diff --git a/src/components/layout/AppLayout.js b/src/components/layout/AppLayout.js index d5febfaf4..fa83842a4 100644 --- a/src/components/layout/AppLayout.js +++ b/src/components/layout/AppLayout.js @@ -83,7 +83,6 @@ class AppLayout extends Component { areRequiredRequestsLoading: PropTypes.bool.isRequired, darkMode: PropTypes.bool.isRequired, isDelayAppScreenVisible: PropTypes.bool.isRequired, - isAnnouncementVisible: PropTypes.bool.isRequired, }; static defaultProps = { @@ -117,7 +116,6 @@ class AppLayout extends Component { areRequiredRequestsLoading, darkMode, isDelayAppScreenVisible, - isAnnouncementVisible, } = this.props; const { intl } = this.context; @@ -197,12 +195,11 @@ class AppLayout extends Component { {isDelayAppScreenVisible && ()} - {isAnnouncementVisible && ()} {services} + {children}
- {children} ); diff --git a/src/containers/layout/AppLayoutContainer.js b/src/containers/layout/AppLayoutContainer.js index d2891a6a4..83b3c27da 100644 --- a/src/containers/layout/AppLayoutContainer.js +++ b/src/containers/layout/AppLayoutContainer.js @@ -151,7 +151,6 @@ export default @inject('stores', 'actions') @observer class AppLayoutContainer e areRequiredRequestsLoading={requests.areRequiredRequestsLoading} darkMode={settings.all.app.darkMode} isDelayAppScreenVisible={delayAppState.isDelayAppScreenVisible} - isAnnouncementVisible={announcementsStore.isAnnouncementVisible} > {React.Children.count(children) > 0 ? children : null} diff --git a/src/features/announcements/components/AnnouncementScreen.js b/src/features/announcements/components/AnnouncementScreen.js index dfce6cdd5..e7c5fe395 100644 --- a/src/features/announcements/components/AnnouncementScreen.js +++ b/src/features/announcements/components/AnnouncementScreen.js @@ -268,7 +268,7 @@ class AnnouncementScreen extends Component {

{intl.formatMessage(messages.headline, { - version: announcementsStore.currentVersion, + version: announcementsStore.targetVersion, })}

{ - if (!this.areNewsAvailable) return; + const { router } = this.stores; this.targetVersion = targetVersion || this.currentVersion; - this.isAnnouncementVisible = true; - this.actions.service.blurActive(); this._updateSettings({ lastSeenAnnouncementVersion: this.currentVersion, }); - const dispose = reaction( - () => this.stores.services.active, - () => { - this._hideAnnouncement(); - dispose(); - }, - ); - + const targetRoute = `/announcements/${this.targetVersion}`; + if (router.location.pathname !== targetRoute) { + this.stores.router.push(targetRoute); + } gaEvent(GA_CATEGORY_ANNOUNCEMENTS, 'show'); }; - @action _hideAnnouncement() { - this.isAnnouncementVisible = false; - } - // ======= REACTIONS ======== _showAnnouncementToUsersWhoUpdatedApp = () => { const { announcement, isNewUser } = this; - // Check if there is an announcement and on't show announcements to new users + // Check if there is an announcement and don't show announcements to new users if (!announcement || isNewUser) return; // Check if the user has already used current version (= has seen the announcement) @@ -140,5 +130,14 @@ export class AnnouncementsStore extends FeatureStore { } else { getAnnouncementRequest.reset(); } + }; + + _showAnnouncementOnRouteMatch = () => { + const { router } = this.stores; + const match = matchRoute(ANNOUNCEMENTS_ROUTES.TARGET, router.location.pathname); + if (match) { + const targetVersion = match.id; + this._showAnnouncement({ targetVersion }); + } } } diff --git a/src/features/workspaces/store.js b/src/features/workspaces/store.js index e11513d1f..3d7043413 100644 --- a/src/features/workspaces/store.js +++ b/src/features/workspaces/store.js @@ -255,13 +255,15 @@ export default class WorkspacesStore extends FeatureStore { _setActiveServiceOnWorkspaceSwitchReaction = () => { if (!this.isFeatureActive) return; if (this.activeWorkspace) { - const services = this.stores.services.allDisplayed; - const activeService = services.find(s => s.isActive); + const activeService = this.stores.services.active; const workspaceServices = this.getWorkspaceServices(this.activeWorkspace); if (workspaceServices.length <= 0) return; const isActiveServiceInWorkspace = workspaceServices.includes(activeService); if (!isActiveServiceInWorkspace) { - this.actions.service.setActive({ serviceId: workspaceServices[0].id }); + this.actions.service.setActive({ + serviceId: workspaceServices[0].id, + keepActiveRoute: true, + }); } } }; diff --git a/src/stores/ServicesStore.js b/src/stores/ServicesStore.js index 13f929c2f..17150a023 100644 --- a/src/stores/ServicesStore.js +++ b/src/stores/ServicesStore.js @@ -291,7 +291,8 @@ export default class ServicesStore extends Store { gaEvent('Service', 'clear cache'); } - @action _setActive({ serviceId }) { + @action _setActive({ serviceId, keepActiveRoute }) { + if (!keepActiveRoute) this.stores.router.push('/'); const service = this.one(serviceId); this.all.forEach((s, index) => { -- cgit v1.2.3-70-g09d2