From ea3bcf66f45f0a5a01ce4e8dfa9c4cf3f0e2249c Mon Sep 17 00:00:00 2001 From: Elias Nahum Date: Sun, 12 Nov 2017 12:14:45 -0300 Subject: [PATCH] Add validations in cleanup middleware (#1122) --- app/actions/views/root.js | 37 +++++++++++++++++ app/initial_state.js | 10 +++-- app/mattermost.js | 3 +- app/store/middleware.js | 86 +++++++++++++++++++++++++++++++-------- assets/base/config.json | 2 - 5 files changed, 114 insertions(+), 24 deletions(-) diff --git a/app/actions/views/root.js b/app/actions/views/root.js index c165159e5d..f767a667b1 100644 --- a/app/actions/views/root.js +++ b/app/actions/views/root.js @@ -1,6 +1,8 @@ // Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. // See License.txt for license information. +import {PostTypes} from 'mattermost-redux/action_types'; +import {Client4} from 'mattermost-redux/client'; import {General} from 'mattermost-redux/constants'; import {getClientConfig, getLicenseConfig} from 'mattermost-redux/actions/general'; import {getPosts} from 'mattermost-redux/actions/posts'; @@ -63,6 +65,41 @@ export function purgeOfflineStore() { return {type: General.OFFLINE_STORE_PURGE}; } +export function createPost(post) { + return async (dispatch, getState) => { + const state = getState(); + const currentUserId = state.entities.users.currentUserId; + + const timestamp = Date.now(); + const pendingPostId = post.pending_post_id || `${currentUserId}:${timestamp}`; + + const newPost = { + ...post, + pending_post_id: pendingPostId, + create_at: timestamp, + update_at: timestamp + }; + + try { + const payload = Client4.createPost({...newPost, create_at: 0}); + dispatch({ + type: PostTypes.RECEIVED_POSTS, + data: { + order: [], + posts: { + [payload.id]: payload + } + }, + channelId: payload.channel_id + }); + } catch (error) { + return {error}; + } + + return {data: true}; + }; +} + export default { loadConfigAndLicense, loadFromPushNotification, diff --git a/app/initial_state.js b/app/initial_state.js index 454e1c4788..af20c21728 100644 --- a/app/initial_state.js +++ b/app/initial_state.js @@ -45,6 +45,9 @@ const state = { preferences: { myPreferences: {} }, + search: { + recent: [] + }, typing: {} }, errors: [], @@ -252,8 +255,7 @@ const state = { navigation: '', views: { channel: { - drafts: {}, - loading: false + drafts: {} }, fetchCache: {}, i18n: { @@ -270,7 +272,9 @@ const state = { selectServer: { serverUrl: Config.DefaultServerUrl }, - team: {}, + team: { + lastTeamId: '' + }, thread: { drafts: {} } diff --git a/app/mattermost.js b/app/mattermost.js index d992d2a4bc..31c80eb3c5 100644 --- a/app/mattermost.js +++ b/app/mattermost.js @@ -23,7 +23,6 @@ import {General} from 'mattermost-redux/constants'; import {setAppState, setDeviceToken, setServerVersion} from 'mattermost-redux/actions/general'; import {markChannelAsRead} from 'mattermost-redux/actions/channels'; import {logError} from 'mattermost-redux/actions/errors'; -import {createPost} from 'mattermost-redux/actions/posts'; import {logout} from 'mattermost-redux/actions/users'; import {close as closeWebSocket} from 'mattermost-redux/actions/websocket'; import {Client, Client4} from 'mattermost-redux/client'; @@ -36,7 +35,7 @@ import { setStatusBarHeight } from 'app/actions/device'; import { - + createPost, loadConfigAndLicense, loadFromPushNotification, purgeOfflineStore diff --git a/app/store/middleware.js b/app/store/middleware.js index e176d7c987..20974b41e3 100644 --- a/app/store/middleware.js +++ b/app/store/middleware.js @@ -4,6 +4,7 @@ import DeviceInfo from 'react-native-device-info'; import {ViewTypes} from 'app/constants'; +import initialState from 'app/initial_state'; import Config from 'assets/config'; export function messageRetention() { @@ -23,6 +24,7 @@ export function messageRetention() { // Keep only the last 60 messages for the last 5 viewed channels in each team // and apply data retention on those posts if applies + return next(cleanupState(action)); } else if (action.type === ViewTypes.DATA_CLEANUP) { const nextAction = cleanupState(action, true); @@ -36,8 +38,22 @@ export function messageRetention() { function resetStateForNewVersion(action) { const {payload} = action; const lastChannelForTeam = getLastChannelForTeam(payload); - let users = {}; + let general = initialState.entities.general; + if (payload.entities.general) { + general = payload.entities.general; + } + + let teams = initialState.entities.teams; + if (payload.entities.teams) { + teams = { + currentTeamId: payload.entities.teams.currentTeamId, + teams: payload.entities.teams.teams, + myMembers: payload.entities.teams.myMembers + }; + } + + let users = initialState.entities.users; if (payload.entities.users) { const currentUserId = payload.entities.users.currentUserId; if (currentUserId) { @@ -50,38 +66,74 @@ function resetStateForNewVersion(action) { } } + let preferences = initialState.entities.preferences; + if (payload.entities.preferences) { + preferences = payload.entities.preferences; + } + + let search = initialState.entities.search; + if (payload.entities.search && payload.entities.search.recent) { + search = { + recent: payload.entities.search.recent + }; + } + + let channelDrafts = initialState.views.channel.drafts; + if (payload.views.channel && payload.views.channel.drafts) { + channelDrafts = payload.views.channel.drafts; + } + + let i18n = initialState.views.i18n; + if (payload.views.i18n) { + i18n = payload.views.i18n; + } + + let fetchCache = initialState.views.fetchCache; + if (payload.views.fetchCache) { + fetchCache = payload.views.fetchCache; + } + + let lastTeamId = initialState.views.team.lastTeamId; + if (payload.views.team && payload.views.team.lastTeamId) { + lastTeamId = payload.views.team.lastTeamId; + } + + let threadDrafts = initialState.views.thread.drafts; + if (payload.views.thread && payload.views.thread.drafts) { + threadDrafts = payload.views.thread.drafts; + } + + let selectServer = initialState.views.selectServer; + if (payload.views.selectServer) { + selectServer = payload.views.selectServer; + } + const nextState = { app: { build: DeviceInfo.getBuildNumber(), version: DeviceInfo.getVersion() }, entities: { - general: payload.entities.general, - teams: { - currentTeamId: payload.entities.teams.currentTeamId, - teams: payload.entities.teams.teams, - myMembers: payload.entities.teams.myMembers - }, + general, + teams, users, - preferences: payload.entities.preferences, - search: { - recent: payload.entities.search ? payload.entities.search.recent : {} - } + preferences, + search }, views: { channel: { - drafts: payload.views.channel.drafts + drafts: channelDrafts }, - i18n: payload.views.i18n, - fetchCache: payload.views.fetchCache, + i18n, + fetchCache, team: { - lastTeamId: payload.views.team.lastTeamId, + lastTeamId, lastChannelForTeam }, thread: { - drafts: payload.views.thread.drafts + drafts: threadDrafts }, - selectServer: payload.views.selectServer + selectServer } }; diff --git a/assets/base/config.json b/assets/base/config.json index a07e7ffa1b..6bc89e57d0 100644 --- a/assets/base/config.json +++ b/assets/base/config.json @@ -1,7 +1,5 @@ { "DefaultServerUrl": "", - "EnableMessageRetention": false, - "MessageRetentionPeriod": 30, "TestServerUrl": "http://localhost:8065", "DefaultTheme": "default", "ShowErrorsList": false,