diff --git a/lib/reducers/draft-reducer.js b/lib/reducers/draft-reducer.js new file mode 100644 --- /dev/null +++ b/lib/reducers/draft-reducer.js @@ -0,0 +1,89 @@ +// @flow + +import { + moveDraftActionType, + setDraftStoreDrafts, + updateDraftActionType, +} from '../actions/draft-actions'; +import { + deleteAccountActionTypes, + logOutActionTypes, +} from '../actions/user-actions'; +import type { DraftStore, DraftStoreOperation } from '../types/draft-types'; +import type { BaseAction } from '../types/redux-types'; +import { setNewSessionActionType } from '../utils/action-utils'; +type ReduceDraftStoreResult = { + +draftStoreOperations: $ReadOnlyArray, + +draftStore: DraftStore, +}; +function reduceDraftStore( + draftStore: DraftStore, + action: BaseAction, +): ReduceDraftStoreResult { + if ( + action.type === logOutActionTypes.success || + action.type === deleteAccountActionTypes.success || + (action.type === setNewSessionActionType && + action.payload.sessionChange.cookieInvalidated) + ) { + return { + draftStoreOperations: [], + draftStore: { drafts: {} }, + }; + } else if (action.type === updateDraftActionType) { + const { key, text } = action.payload; + + const draftStoreOperations = [ + { + type: 'update', + payload: { key, text }, + }, + ]; + return { + draftStoreOperations, + draftStore: { + ...draftStore, + drafts: { + ...draftStore.drafts, + [key]: text, + }, + }, + }; + } else if (action.type === moveDraftActionType) { + const { oldKey, newKey } = action.payload; + + const draftStoreOperations = [ + { + type: 'move', + payload: { oldKey, newKey }, + }, + ]; + + const { [oldKey]: text, ...draftsWithoutOldKey } = draftStore.drafts; + return { + draftStoreOperations, + draftStore: { + ...draftStore, + drafts: { + ...draftsWithoutOldKey, + [newKey]: text, + }, + }, + }; + } else if (action.type === setDraftStoreDrafts) { + const drafts = {}; + for (const dbDraftInfo of action.payload) { + drafts[dbDraftInfo.key] = dbDraftInfo.text; + } + return { + draftStoreOperations: [], + draftStore: { + ...draftStore, + drafts: drafts, + }, + }; + } + return { draftStore, draftStoreOperations: [] }; +} + +export { reduceDraftStore }; diff --git a/lib/reducers/master-reducer.js b/lib/reducers/master-reducer.js --- a/lib/reducers/master-reducer.js +++ b/lib/reducers/master-reducer.js @@ -11,6 +11,7 @@ import reduceCalendarFilters from './calendar-filters-reducer'; import reduceConnectionInfo from './connection-reducer'; import reduceDataLoaded from './data-loaded-reducer'; +import { reduceDraftStore } from './draft-reducer'; import reduceEnabledApps from './enabled-apps-reducer'; import { reduceEntryInfos } from './entry-reducer'; import reduceLifecycleState from './lifecycle-state-reducer'; @@ -75,10 +76,16 @@ } } + const { draftStore, draftStoreOperations } = reduceDraftStore( + state.draftStore, + action, + ); + return { state: { ...state, navInfo: reduceBaseNavInfo(state.navInfo, action), + draftStore, entryStore, loadingStatuses: reduceLoadingStatuses(state.loadingStatuses, action), currentUserInfo: reduceCurrentUserInfo(state.currentUserInfo, action), @@ -100,6 +107,7 @@ dataLoaded: reduceDataLoaded(state.dataLoaded, action), }, storeOperations: { + draftStoreOperations, threadStoreOperations, messageStoreOperations, }, diff --git a/lib/types/store-ops-types.js b/lib/types/store-ops-types.js --- a/lib/types/store-ops-types.js +++ b/lib/types/store-ops-types.js @@ -1,8 +1,11 @@ // @flow + +import type { DraftStoreOperation } from './draft-types'; import type { MessageStoreOperation } from './message-types'; import type { ThreadStoreOperation } from './thread-types'; export type StoreOperations = { + +draftStoreOperations: $ReadOnlyArray, +threadStoreOperations: $ReadOnlyArray, +messageStoreOperations: $ReadOnlyArray, };