aboutsummaryrefslogtreecommitdiffstats
path: root/src/features/announcements/store.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/features/announcements/store.js')
-rw-r--r--src/features/announcements/store.js151
1 files changed, 88 insertions, 63 deletions
diff --git a/src/features/announcements/store.js b/src/features/announcements/store.js
index c59700926..d4fb0a52c 100644
--- a/src/features/announcements/store.js
+++ b/src/features/announcements/store.js
@@ -1,96 +1,93 @@
1import { action, observable, reaction } from 'mobx'; 1import {
2 action,
3 computed,
4 observable,
5 reaction,
6} from 'mobx';
2import semver from 'semver'; 7import semver from 'semver';
8import localStorage from 'mobx-localstorage';
9
3import { FeatureStore } from '../utils/FeatureStore'; 10import { FeatureStore } from '../utils/FeatureStore';
4import { getAnnouncementRequest, getCurrentVersionRequest } from './api'; 11import { getAnnouncementRequest, getChangelogRequest, getCurrentVersionRequest } from './api';
12import { announcementActions } from './actions';
13
14const LOCAL_STORAGE_KEY = 'announcements';
5 15
6const debug = require('debug')('Franz:feature:announcements:store'); 16const debug = require('debug')('Franz:feature:announcements:store');
7 17
8export class AnnouncementsStore extends FeatureStore { 18export class AnnouncementsStore extends FeatureStore {
9 19 @observable targetVersion = null;
10 @observable announcement = null;
11
12 @observable currentVersion = null;
13
14 @observable lastUsedVersion = null;
15 20
16 @observable isAnnouncementVisible = false; 21 @observable isAnnouncementVisible = false;
17 22
18 @observable isFeatureActive = false; 23 @observable isFeatureActive = false;
19 24
20 async start(stores, actions) { 25 @computed get changelog() {
21 debug('AnnouncementsStore::start'); 26 return getChangelogRequest.result;
22 this.stores = stores;
23 this.actions = actions;
24 await this.fetchLastUsedVersion();
25 await this.fetchCurrentVersion();
26 await this.fetchReleaseAnnouncement();
27 this.showAnnouncementIfNotSeenYet();
28
29 this.actions.announcements.show.listen(this._showAnnouncement.bind(this));
30 this.isFeatureActive = true;
31 } 27 }
32 28
33 stop() { 29 @computed get announcement() {
34 debug('AnnouncementsStore::stop'); 30 return getAnnouncementRequest.result;
35 this.isFeatureActive = false;
36 this.isAnnouncementVisible = false;
37 } 31 }
38 32
39 // ====== PUBLIC ====== 33 @computed get settings() {
40 34 return localStorage.getItem(LOCAL_STORAGE_KEY) || {};
41 async fetchLastUsedVersion() {
42 debug('getting last used version from local storage');
43 const lastUsedVersion = window.localStorage.getItem('lastUsedVersion');
44 this._setLastUsedVersion(lastUsedVersion == null ? '0.0.0' : lastUsedVersion);
45 } 35 }
46 36
47 async fetchCurrentVersion() { 37 @computed get lastSeenAnnouncementVersion() {
48 debug('getting current version from api'); 38 return this.settings.lastSeenAnnouncementVersion || null;
49 const version = await getCurrentVersionRequest.execute();
50 this._setCurrentVersion(version);
51 } 39 }
52 40
53 async fetchReleaseAnnouncement() { 41 @computed get currentVersion() {
54 debug('getting release announcement from api'); 42 return getCurrentVersionRequest.result;
55 try {
56 const announcement = await getAnnouncementRequest.execute(this.currentVersion);
57 this._setAnnouncement(announcement);
58 } catch (error) {
59 this._setAnnouncement(null);
60 }
61 } 43 }
62 44
63 showAnnouncementIfNotSeenYet() { 45 @computed get isNewUser() {
64 const { announcement, currentVersion, lastUsedVersion } = this; 46 return this.stores.settings.stats.appStarts <= 1;
65 if (announcement && semver.gt(currentVersion, lastUsedVersion)) {
66 debug(`${currentVersion} < ${lastUsedVersion}: announcement is shown`);
67 this._showAnnouncement();
68 } else {
69 debug(`${currentVersion} >= ${lastUsedVersion}: announcement is hidden`);
70 this._hideAnnouncement();
71 }
72 } 47 }
73 48
74 // ====== PRIVATE ====== 49 async start(stores, actions) {
50 debug('AnnouncementsStore::start');
51 this.stores = stores;
52 this.actions = actions;
53 getCurrentVersionRequest.execute();
75 54
76 @action _setCurrentVersion(version) { 55 this._registerActions([
77 debug(`setting current version to ${version}`); 56 [announcementActions.show, this._showAnnouncement],
78 this.currentVersion = version; 57 ]);
79 }
80 58
81 @action _setLastUsedVersion(version) { 59 this._registerReactions([
82 debug(`setting last used version to ${version}`); 60 this._fetchAnnouncements,
83 this.lastUsedVersion = version; 61 this._showAnnouncementToUsersWhoUpdatedApp,
62 ]);
63 this.isFeatureActive = true;
84 } 64 }
85 65
86 @action _setAnnouncement(announcement) { 66 stop() {
87 debug(`setting announcement to ${announcement}`); 67 super.stop();
88 this.announcement = announcement; 68 debug('AnnouncementsStore::stop');
69 this.isFeatureActive = false;
70 this.isAnnouncementVisible = false;
89 } 71 }
90 72
91 @action _showAnnouncement() { 73 // ======= HELPERS ======= //
74
75 _updateSettings = (changes) => {
76 localStorage.setItem(LOCAL_STORAGE_KEY, {
77 ...this.settings,
78 ...changes,
79 });
80 };
81
82 // ======= ACTIONS ======= //
83
84 @action _showAnnouncement = ({ targetVersion } = {}) => {
85 this.targetVersion = targetVersion || this.currentVersion;
92 this.isAnnouncementVisible = true; 86 this.isAnnouncementVisible = true;
93 this.actions.service.blurActive(); 87 this.actions.service.blurActive();
88 this._updateSettings({
89 lastSeenAnnouncementVersion: this.currentVersion,
90 });
94 const dispose = reaction( 91 const dispose = reaction(
95 () => this.stores.services.active, 92 () => this.stores.services.active,
96 () => { 93 () => {
@@ -98,9 +95,37 @@ export class AnnouncementsStore extends FeatureStore {
98 dispose(); 95 dispose();
99 }, 96 },
100 ); 97 );
101 } 98 };
102 99
103 @action _hideAnnouncement() { 100 @action _hideAnnouncement() {
104 this.isAnnouncementVisible = false; 101 this.isAnnouncementVisible = false;
105 } 102 }
103
104 // ======= REACTIONS ========
105
106 _showAnnouncementToUsersWhoUpdatedApp = () => {
107 const { announcement, isNewUser } = this;
108 console.log(announcement, isNewUser);
109 // Check if there is an announcement and on't show announcements to new users
110 if (!announcement || isNewUser) return;
111
112 this._showAnnouncement();
113
114 // Check if the user has already used current version (= has seen the announcement)
115 // const { currentVersion, lastSeenAnnouncementVersion } = this;
116 // if (semver.gt(currentVersion, lastSeenAnnouncementVersion)) {
117 // debug(`${currentVersion} < ${lastSeenAnnouncementVersion}: announcement is shown`);
118 // this._showAnnouncement();
119 // } else {
120 // debug(`${currentVersion} >= ${lastSeenAnnouncementVersion}: announcement is hidden`);
121 // this._hideAnnouncement();
122 // }
123 };
124
125 _fetchAnnouncements = () => {
126 const targetVersion = this.targetVersion || this.currentVersion;
127 if (!targetVersion) return;
128 getChangelogRequest.execute('5.0.1');
129 getAnnouncementRequest.execute('5.1.0');
130 }
106} 131}