mattermost-redux
Version:
Common code (API client, Redux stores, logic, utility functions) for building a Mattermost client
213 lines (212 loc) • 9.13 kB
JavaScript
;
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
Object.defineProperty(exports, "__esModule", { value: true });
const redux_1 = require("redux");
const action_types_1 = require("mattermost-redux/action_types");
function byId(state = {}, action) {
switch (action.type) {
case action_types_1.ScheduledPostTypes.SCHEDULED_POSTS_RECEIVED: {
const { scheduledPostsByTeamId } = action.data;
const newState = { ...state };
Object.keys(scheduledPostsByTeamId).forEach((teamId) => {
if (Object.hasOwn(scheduledPostsByTeamId, teamId)) {
scheduledPostsByTeamId[teamId].forEach((scheduledPost) => {
newState[scheduledPost.id] = scheduledPost;
});
}
});
return newState;
}
case action_types_1.ScheduledPostTypes.SINGLE_SCHEDULED_POST_RECEIVED: {
const scheduledPost = action.data.scheduledPost;
return {
...state,
[scheduledPost.id]: scheduledPost,
};
}
case action_types_1.ScheduledPostTypes.SCHEDULED_POST_UPDATED: {
const scheduledPost = action.data.scheduledPost;
return {
...state,
[scheduledPost.id]: scheduledPost,
};
}
case action_types_1.ScheduledPostTypes.SCHEDULED_POST_DELETED: {
const scheduledPost = action.data.scheduledPost;
const newState = { ...state };
delete newState[scheduledPost.id];
return newState;
}
case action_types_1.UserTypes.LOGOUT_SUCCESS:
return {};
default:
return state;
}
}
function byTeamId(state = {}, action) {
switch (action.type) {
case action_types_1.ScheduledPostTypes.SCHEDULED_POSTS_RECEIVED: {
const { scheduledPostsByTeamId } = action.data;
const newState = { ...state };
Object.keys(scheduledPostsByTeamId).forEach((teamId) => {
if (Object.hasOwn(scheduledPostsByTeamId, teamId)) {
newState[teamId] = scheduledPostsByTeamId[teamId].map((scheduledPost) => scheduledPost.id);
}
});
return newState;
}
case action_types_1.ScheduledPostTypes.SINGLE_SCHEDULED_POST_RECEIVED: {
const scheduledPost = action.data.scheduledPost;
const teamId = action.data.teamId || 'directChannels';
const newState = { ...state };
const existingIndex = newState[teamId].findIndex((existingScheduledPostId) => existingScheduledPostId === scheduledPost.id);
if (existingIndex >= 0) {
newState[teamId].splice(existingIndex, 1);
}
if (newState[teamId]) {
newState[teamId] = [...newState[teamId], scheduledPost.id];
}
else {
newState[teamId] = [scheduledPost.id];
}
return newState;
}
case action_types_1.ScheduledPostTypes.SCHEDULED_POST_DELETED: {
const scheduledPost = action.data.scheduledPost;
const newState = { ...state };
let modified = false;
for (const teamId of Object.keys(state)) {
const index = newState[teamId].findIndex((existingScheduledPostId) => existingScheduledPostId === scheduledPost.id);
if (index >= 0) {
newState[teamId] = [...newState[teamId]];
newState[teamId].splice(index, 1);
modified = true;
break;
}
}
return modified ? newState : state;
}
case action_types_1.UserTypes.LOGOUT_SUCCESS:
return {};
default:
return state;
}
}
function errorsByTeamId(state = {}, action) {
switch (action.type) {
case action_types_1.ScheduledPostTypes.SCHEDULED_POSTS_RECEIVED: {
const { scheduledPostsByTeamId } = action.data;
const newState = { ...state };
Object.keys(scheduledPostsByTeamId).forEach((teamId) => {
if (Object.hasOwn(scheduledPostsByTeamId, teamId)) {
const teamScheduledPosts = scheduledPostsByTeamId[teamId];
newState[teamId] = teamScheduledPosts.filter((scheduledPost) => scheduledPost.error_code).map((scheduledPost) => scheduledPost.id);
}
});
return newState;
}
case action_types_1.ScheduledPostTypes.SINGLE_SCHEDULED_POST_RECEIVED: {
let changed = false;
const teamId = action.data.teamId || 'directChannels';
const newState = { ...state };
if (!newState[teamId]) {
newState[teamId] = [];
}
const scheduledPost = action.data.scheduledPost;
if (scheduledPost.error_code) {
const alreadyExists = newState[teamId].find((scheduledPostId) => scheduledPostId === scheduledPost.id);
if (!alreadyExists) {
newState[teamId] = [...newState[teamId], scheduledPost.id];
changed = true;
}
}
return changed ? newState : state;
}
case action_types_1.ScheduledPostTypes.SCHEDULED_POST_DELETED: {
let changed = false;
const scheduledPost = action.data.scheduledPost;
const newState = { ...state };
for (const teamId of Object.keys(state)) {
const index = newState[teamId].findIndex((scheduledPostId) => scheduledPostId === scheduledPost.id);
if (index >= 0) {
changed = true;
newState[teamId] = [...newState[teamId]];
newState[teamId].splice(index, 1);
break;
}
}
return changed ? newState : state;
}
case action_types_1.UserTypes.LOGOUT_SUCCESS: {
return {};
}
default:
return state;
}
}
function byChannelOrThreadId(state = {}, action) {
switch (action.type) {
case action_types_1.ScheduledPostTypes.SCHEDULED_POSTS_RECEIVED: {
const { scheduledPostsByTeamId, prune } = action.data;
const newState = prune ? {} : { ...state };
Object.keys(scheduledPostsByTeamId).forEach((teamId) => {
if (Object.hasOwn(scheduledPostsByTeamId, teamId)) {
scheduledPostsByTeamId[teamId].forEach((scheduledPost) => {
const id = scheduledPost.root_id || scheduledPost.channel_id;
// Check if the entry for that channel/thread ID exists
if (newState[id]) {
// Only add if its not already there
if (!newState[id].includes(scheduledPost.id)) {
newState[id] = [...newState[id], scheduledPost.id];
}
}
else {
// If the entry does not exist at this moment, create it
newState[id] = [scheduledPost.id];
}
});
}
});
return newState;
}
case action_types_1.ScheduledPostTypes.SINGLE_SCHEDULED_POST_RECEIVED: {
const scheduledPost = action.data.scheduledPost;
const newState = { ...state };
const id = scheduledPost.root_id || scheduledPost.channel_id;
if (!newState[id]) {
newState[id] = [scheduledPost.id];
return newState;
}
let changed = false;
const existingIndex = newState[id].findIndex((scheduledPostId) => scheduledPostId === scheduledPost.id);
if (existingIndex) {
newState[id] = [...newState[id], scheduledPost.id];
changed = true;
}
return changed ? newState : state;
}
case action_types_1.ScheduledPostTypes.SCHEDULED_POST_DELETED: {
const scheduledPost = action.data.scheduledPost;
const id = scheduledPost.root_id || scheduledPost.channel_id;
if (!state[id]) {
return state;
}
const newState = { ...state };
const index = newState[id].findIndex((scheduledPostId) => scheduledPostId === scheduledPost.id);
newState[id] = [...newState[id]];
newState[id].splice(index, 1);
return newState;
}
case action_types_1.UserTypes.LOGOUT_SUCCESS:
return {};
default:
return state;
}
}
exports.default = (0, redux_1.combineReducers)({
byId,
byTeamId,
byChannelOrThreadId,
errorsByTeamId,
});