From c27972c12b2d0dba2aee9e3dcffadcf7806a9afd Mon Sep 17 00:00:00 2001 From: Markus Hatvan Date: Thu, 14 Oct 2021 18:20:26 +0200 Subject: chore: remove all code related to news (#2069) --- src/actions/index.ts | 2 - src/actions/news.ts | 7 ---- src/api/NewsApi.ts | 18 --------- src/api/index.ts | 2 - src/api/server/ServerApi.js | 36 +----------------- src/components/layout/AppLayout.js | 59 +++++++++-------------------- src/containers/layout/AppLayoutContainer.js | 13 ++----- src/environment.ts | 3 +- src/internal-server/start/routes.js | 1 - src/models/News.ts | 33 ---------------- src/stores.types.ts | 16 -------- src/stores/AppStore.js | 3 -- src/stores/NewsStore.js | 55 --------------------------- src/stores/index.ts | 2 - 14 files changed, 22 insertions(+), 228 deletions(-) delete mode 100644 src/actions/news.ts delete mode 100644 src/api/NewsApi.ts delete mode 100644 src/models/News.ts delete mode 100644 src/stores/NewsStore.js (limited to 'src') diff --git a/src/actions/index.ts b/src/actions/index.ts index aecdac675..983afa64b 100644 --- a/src/actions/index.ts +++ b/src/actions/index.ts @@ -7,7 +7,6 @@ import recipePreview from './recipePreview'; import ui from './ui'; import app from './app'; import user from './user'; -import news from './news'; import settings from './settings'; import requests from './requests'; import workspaces from '../features/workspaces/actions'; @@ -20,7 +19,6 @@ const actions = { ui, app, user, - news, settings, requests, }; diff --git a/src/actions/news.ts b/src/actions/news.ts deleted file mode 100644 index db106e84f..000000000 --- a/src/actions/news.ts +++ /dev/null @@ -1,7 +0,0 @@ -import PropTypes from 'prop-types'; - -export default { - hide: { - newsId: PropTypes.string.isRequired, - }, -}; diff --git a/src/api/NewsApi.ts b/src/api/NewsApi.ts deleted file mode 100644 index 31d3d903b..000000000 --- a/src/api/NewsApi.ts +++ /dev/null @@ -1,18 +0,0 @@ -export default class NewsApi { - server: any; - - local: any; - - constructor(server: any, local: any) { - this.server = server; - this.local = local; - } - - latest() { - return this.server.getLatestNews(); - } - - hide(id: any) { - return this.server.hideNews(id); - } -} diff --git a/src/api/index.ts b/src/api/index.ts index 73f613da1..59fad194a 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -4,7 +4,6 @@ import RecipePreviewsApi from './RecipePreviewsApi'; import RecipesApi from './RecipesApi'; import UserApi from './UserApi'; import LocalApi from './LocalApi'; -import NewsApi from './NewsApi'; import FeaturesApi from './FeaturesApi'; export default (server: any, local: any) => ({ @@ -15,5 +14,4 @@ export default (server: any, local: any) => ({ features: new FeaturesApi(server), user: new UserApi(server, local), local: new LocalApi(server, local), - news: new NewsApi(server, local), }); diff --git a/src/api/server/ServerApi.js b/src/api/server/ServerApi.js index e321f9372..6bbf572fa 100644 --- a/src/api/server/ServerApi.js +++ b/src/api/server/ServerApi.js @@ -16,14 +16,12 @@ import fetch from 'electron-fetch'; import ServiceModel from '../../models/Service'; import RecipePreviewModel from '../../models/RecipePreview'; import RecipeModel from '../../models/Recipe'; -import NewsModel from '../../models/News'; import UserModel from '../../models/User'; import { sleep } from '../../helpers/async-helpers'; import { SERVER_NOT_LOADED } from '../../config'; -import { osArch, osPlatform } from '../../environment'; -import { userDataRecipesPath, userDataPath, ferdiVersion } from '../../environment-remote'; +import { userDataRecipesPath, userDataPath } from '../../environment-remote'; import { asarRecipesPath } from '../../helpers/asar-helpers'; import apiBase from '../apiBase'; import { prepareAuthRequest, sendAuthRequest } from '../utils/auth'; @@ -442,25 +440,6 @@ export default class ServerApi { } } - // News - async getLatestNews() { - const url = `${apiBase( - true, - )}/news?platform=${osPlatform}&arch=${osArch}&version=${ferdiVersion}`; - const request = await sendAuthRequest(url); - if (!request.ok) throw request; - const data = await request.json(); - const news = this._mapNewsModels(data); - debug('ServerApi::getLatestNews resolves', news); - return news; - } - - async hideNews(id) { - const request = await sendAuthRequest(`${apiBase()}/news/${id}/read`); - if (!request.ok) throw request; - debug('ServerApi::hideNews resolves', id); - } - // Health Check async healthCheck() { if (apiBase() === SERVER_NOT_LOADED) { @@ -587,19 +566,6 @@ export default class ServerApi { .filter(recipe => recipe !== null); } - _mapNewsModels(news) { - return news - .map(newsItem => { - try { - return new NewsModel(newsItem); - } catch (error) { - console.error(error); - return null; - } - }) - .filter(newsItem => newsItem !== null); - } - _getDevRecipes() { const recipesDirectory = getDevRecipeDirectory(); try { diff --git a/src/components/layout/AppLayout.js b/src/components/layout/AppLayout.js index 9c1dbf139..4bacc547b 100644 --- a/src/components/layout/AppLayout.js +++ b/src/components/layout/AppLayout.js @@ -1,6 +1,6 @@ import { Component } from 'react'; import PropTypes from 'prop-types'; -import { observer, PropTypes as MobxPropTypes } from 'mobx-react'; +import { observer } from 'mobx-react'; import { defineMessages, injectIntl } from 'react-intl'; import { TitleBar } from 'electron-react-titlebar/renderer'; import injectSheet from 'react-jss'; @@ -20,10 +20,6 @@ import { workspaceStore } from '../../features/workspaces'; import AppUpdateInfoBar from '../AppUpdateInfoBar'; import Todos from '../../features/todos/containers/TodosScreen'; -function createMarkup(HTMLString) { - return { __html: HTMLString }; -} - const messages = defineMessages({ servicesUpdated: { id: 'infobar.servicesUpdated', @@ -73,11 +69,9 @@ class AppLayout extends Component { workspacesDrawer: PropTypes.element.isRequired, services: PropTypes.element.isRequired, children: PropTypes.element, - news: MobxPropTypes.arrayOrObservableArray.isRequired, showServicesUpdatedInfoBar: PropTypes.bool.isRequired, appUpdateIsDownloaded: PropTypes.bool.isRequired, authRequestFailed: PropTypes.bool.isRequired, - removeNewsItem: PropTypes.func.isRequired, reloadServicesAfterUpdate: PropTypes.func.isRequired, installAppUpdate: PropTypes.func.isRequired, showRequiredRequestsError: PropTypes.bool.isRequired, @@ -103,11 +97,9 @@ class AppLayout extends Component { sidebar, services, children, - news, showServicesUpdatedInfoBar, appUpdateIsDownloaded, authRequestFailed, - removeNewsItem, reloadServicesAfterUpdate, installAppUpdate, showRequiredRequestsError, @@ -132,26 +124,6 @@ class AppLayout extends Component { {sidebar}
- {news.length > 0 && - news.map(item => ( - removeNewsItem({ newsId: item.id })} - > - { - const { target } = event; - if (target && target.hasAttribute('data-is-news-cta')) { - removeNewsItem({ newsId: item.id }); - } - }} - /> - - ))} {!areRequiredRequestsSuccessful && showRequiredRequestsError && ( )} - {showServicesUpdatedInfoBar && this.state.shouldShowServicesUpdatedInfoBar && ( - { - this.setState({ shouldShowServicesUpdatedInfoBar: false }); - }} - > - - {intl.formatMessage(messages.servicesUpdated)} - - )} + {showServicesUpdatedInfoBar && + this.state.shouldShowServicesUpdatedInfoBar && ( + { + this.setState({ + shouldShowServicesUpdatedInfoBar: false, + }); + }} + > + + {intl.formatMessage(messages.servicesUpdated)} + + )} {appUpdateIsDownloaded && this.state.shouldShowAppUpdateInfoBar && ( - (workspace + workspace ? workspaceStore.getWorkspaceServices(workspace).map(s => s.name) - : services.all.map(s => s.name)) + : services.all.map(s => s.name) } /> ); @@ -158,8 +155,6 @@ class AppLayoutContainer extends Component { sidebar={sidebar} workspacesDrawer={workspacesDrawer} services={servicesContainer} - news={news.latest} - removeNewsItem={hide} reloadServicesAfterUpdate={() => window.location.reload()} installAppUpdate={installUpdate} globalError={globalError.error} @@ -182,7 +177,6 @@ AppLayoutContainer.wrappedComponent.propTypes = { recipes: PropTypes.instanceOf(RecipesStore).isRequired, app: PropTypes.instanceOf(AppStore).isRequired, ui: PropTypes.instanceOf(UIStore).isRequired, - news: PropTypes.instanceOf(NewsStore).isRequired, settings: PropTypes.instanceOf(SettingsStore).isRequired, user: PropTypes.instanceOf(UserStore).isRequired, requests: PropTypes.instanceOf(RequestStore).isRequired, @@ -191,7 +185,6 @@ AppLayoutContainer.wrappedComponent.propTypes = { }).isRequired, actions: PropTypes.shape({ service: PropTypes.instanceOf(ServicesStore).isRequired, - news: PropTypes.instanceOf(NewsStore).isRequired, ui: PropTypes.instanceOf(UIStore).isRequired, app: PropTypes.instanceOf(AppStore).isRequired, requests: PropTypes.instanceOf(RequestStore).isRequired, diff --git a/src/environment.ts b/src/environment.ts index 6b68ef432..9b727a607 100644 --- a/src/environment.ts +++ b/src/environment.ts @@ -1,6 +1,6 @@ // Note: This file has now become devoid of all references to values deduced from the remote process - all those now live in the `environment-remote.js` file -import { platform, arch, release } from 'os'; +import { arch, release } from 'os'; export const isMac = process.platform === 'darwin'; export const isWindows = process.platform === 'win32'; @@ -10,7 +10,6 @@ export const electronVersion = process.versions.electron; export const chromeVersion = process.versions.chrome; export const nodeVersion = process.versions.node; -export const osPlatform = platform(); export const osArch = arch(); export const osRelease = release(); export const is64Bit = osArch.match(/64/); diff --git a/src/internal-server/start/routes.js b/src/internal-server/start/routes.js index db74479c9..50b9448cf 100644 --- a/src/internal-server/start/routes.js +++ b/src/internal-server/start/routes.js @@ -66,7 +66,6 @@ Route.group(() => { // Static responses Route.get('features/:mode?', 'StaticController.features'); Route.get('services', 'StaticController.emptyArray'); - Route.get('news', 'StaticController.emptyArray'); }) .prefix(API_VERSION) .middleware(OnlyAllowFerdi); diff --git a/src/models/News.ts b/src/models/News.ts deleted file mode 100644 index 4fc21f590..000000000 --- a/src/models/News.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { ifUndefinedString, ifUndefinedBoolean } from '../jsUtils'; - -interface INews { - id: string; - message: string; - type: string; - sticky: boolean | undefined; -} - -export default class News { - id: string = ''; - - message: string = ''; - - type: string = 'primary'; - - sticky: boolean = false; - - constructor(data: INews) { - if (!data) { - throw new Error('News config not valid'); - } - - if (!data.id) { - throw new Error('News requires Id'); - } - - this.id = data.id; - this.message = ifUndefinedString(data.message, this.message); - this.type = ifUndefinedString(data.type, this.type); - this.sticky = ifUndefinedBoolean(data.sticky, this.sticky); - } -} diff --git a/src/stores.types.ts b/src/stores.types.ts index 66c8e9b85..dd879179d 100644 --- a/src/stores.types.ts +++ b/src/stores.types.ts @@ -3,7 +3,6 @@ export interface FerdiStores { communityRecipes: CommunityRecipesStore; features: FeaturesStore; globalError: GlobalErrorStore; - news: NewsStore; recipePreviews: RecipePreviewsStore; recipes: RecipeStore; requests: RequestsStore; @@ -21,7 +20,6 @@ interface Stores { communityRecipes: CommunityRecipesStore; features: FeaturesStore; globalError: GlobalErrorStore; - news: NewsStore; recipePreviews: RecipePreviewsStore; recipes: RecipeStore; requests: RequestsStore; @@ -36,7 +34,6 @@ interface Stores { interface Actions { app: AppStore; - news: NewsStore; recipePreviews: RecipePreviewsStore; recipes: RecipeStore; requests: RequestsStore; @@ -52,7 +49,6 @@ interface Api { app: AppStore; features: FeaturesStore; local: {}; - news: NewsStore; recipePreviews: RecipePreviewsStore; recipes: RecipeStore; services: ServicesStore; @@ -130,18 +126,6 @@ interface GlobalErrorStore { actionStatus: () => void; } -interface NewsStore { - actions: Actions; - api: Api; - hideNewsRequest: () => void; - latestNewsRequest: () => void; - stores: Stores; - _reactions: []; - _status: () => void; - actionStatus: () => void; - latest: () => void; -} - interface RecipePreviewsStore { actions: Actions; allRecipePreviewsRequest: () => void; diff --git a/src/stores/AppStore.js b/src/stores/AppStore.js index a86a54c6d..81cef3775 100644 --- a/src/stores/AppStore.js +++ b/src/stores/AppStore.js @@ -153,9 +153,6 @@ export default class AppStore extends Store { this.stores.features.featuresRequest.invalidate({ immediately: true, }); - this.stores.news.latestNewsRequest.invalidate({ - immediately: true, - }); }, ms('60m')); // Check for updates once every 4 hours diff --git a/src/stores/NewsStore.js b/src/stores/NewsStore.js deleted file mode 100644 index 66a17cb29..000000000 --- a/src/stores/NewsStore.js +++ /dev/null @@ -1,55 +0,0 @@ -import { computed, observable } from 'mobx'; -import { remove } from 'lodash'; - -import Store from './lib/Store'; -import CachedRequest from './lib/CachedRequest'; -import Request from './lib/Request'; -import { CHECK_INTERVAL } from '../config'; - -export default class NewsStore extends Store { - @observable latestNewsRequest = new CachedRequest(this.api.news, 'latest'); - - @observable hideNewsRequest = new Request(this.api.news, 'hide'); - - constructor(...args) { - super(...args); - - // Register action handlers - this.actions.news.hide.listen(this._hide.bind(this)); - this.actions.user.logout.listen(this._resetNewsRequest.bind(this)); - } - - setup() { - // Check for news updates every couple of hours - setInterval(() => { - if (this.latestNewsRequest.wasExecuted && this.stores.user.isLoggedIn) { - this.latestNewsRequest.invalidate({ immediately: true }); - } - }, CHECK_INTERVAL); - } - - @computed get latest() { - return this.latestNewsRequest.execute().result || []; - } - - // Actions - _hide({ newsId }) { - this.hideNewsRequest.execute(newsId); - - this.latestNewsRequest.invalidate().patch((result) => { - // TODO: check if we can use mobx.array remove - remove(result, (n) => n.id === newsId); - }); - } - - /** - * Reset the news request when current user logs out so that when another user - * logs in again without an app restart, the request will be fetched again and - * the news will be shown to the user. - * - * @private - */ - _resetNewsRequest() { - this.latestNewsRequest.reset(); - } -} diff --git a/src/stores/index.ts b/src/stores/index.ts index 1760ddfa2..6ad898d85 100644 --- a/src/stores/index.ts +++ b/src/stores/index.ts @@ -6,7 +6,6 @@ import ServicesStore from './ServicesStore'; import RecipesStore from './RecipesStore'; import RecipePreviewsStore from './RecipePreviewsStore'; import UIStore from './UIStore'; -import NewsStore from './NewsStore'; import RequestStore from './RequestStore'; import GlobalErrorStore from './GlobalErrorStore'; import { workspaceStore } from '../features/workspaces'; @@ -25,7 +24,6 @@ export default (api, actions, router) => { recipes: new RecipesStore(stores, api, actions), recipePreviews: new RecipePreviewsStore(stores, api, actions), ui: new UIStore(stores, api, actions), - news: new NewsStore(stores, api, actions), requests: new RequestStore(stores, api, actions), globalError: new GlobalErrorStore(stores, api, actions), workspaces: workspaceStore, -- cgit v1.2.3-54-g00ecf