Proyectos de Subversion Moodle

Rev

Autoría | Ultima modificación | Ver Log |

{"version":3,"file":"message_drawer_view_conversation_state_manager.min.js","sources":["../src/message_drawer_view_conversation_state_manager.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * This module operates on the view states from the message_drawer_view_conversation module.\n * It exposes functions that can be used to generate new version of the state.\n *\n * Important notes for this module:\n * 1.) The existing state is always immutable. It should never be modified.\n * 2.) All functions that operate on the state should always clone the state and\n *     modify the cloned state before returning it.\n *\n * It's important that the states remain immutable because they are diff'd in\n * the message_drawer_view_conversation_patcher module in order to work out what\n * has changed.\n *\n * @module     core_message/message_drawer_view_conversation_state_manager\n * @copyright  2018 Ryan Wyllie <ryan@moodle.com>\n * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery'], function($) {\n\n    /**\n     * Clone a state, a state is a collection of information about the variables required to build\n     * the conversation user interface.\n     *\n     * @param  {Object} state State to clone\n     * @return {Object} newstate A copy of the state to clone.\n     */\n    var cloneState = function(state) {\n        // Do a deep extend to make sure we recursively copy objects and\n        // arrays so that the new state doesn't contain any references to\n        // the old state, e.g. adding a value to an array in the new state\n        // shouldn't also add it to the old state.\n        return $.extend(true, {}, state);\n    };\n\n    /**\n     * Format messages to be used in a state.\n     *\n     * @param  {Array} messages The messages to format.\n     * @param  {Number} loggedInUserId The logged in user id.\n     * @param  {Array} members The converstation members.\n     * @return {Array} Formatted messages.\n     */\n    var formatMessages = function(messages, loggedInUserId, members) {\n        return messages.map(function(message) {\n            var fromLoggedInUser = message.useridfrom == loggedInUserId;\n            return {\n                // Stringify the id.\n                id: \"\" + message.id,\n                fromLoggedInUser: fromLoggedInUser,\n                userFrom: members[message.useridfrom],\n                text: message.text,\n                timeCreated: message.timecreated ? parseInt(message.timecreated, 10) : null\n            };\n        });\n    };\n\n    /**\n     * Format members to be used in a state.\n     *\n     * @param  {Array} members The messages to format.\n     * @return {Array} Formatted members.\n     */\n    var formatMembers = function(members) {\n        return members.map(function(member) {\n            return {\n                id: member.id,\n                fullname: member.fullname,\n                profileurl: member.profileurl,\n                profileimageurl: member.profileimageurl,\n                profileimageurlsmall: member.profileimageurlsmall,\n                isonline:  member.isonline,\n                showonlinestatus: member.showonlinestatus,\n                isblocked: member.isblocked,\n                iscontact: member.iscontact,\n                isdeleted: member.isdeleted,\n                canmessage: member.canmessage,\n                canmessageevenifblocked: member.canmessageevenifblocked,\n                requirescontact: member.requirescontact,\n                contactrequests: member.contactrequests || []\n            };\n        });\n    };\n\n    /**\n     * Create an initial (blank) state.\n     *\n     * @param  {Number} midnight Midnight time.\n     * @param  {Number} loggedInUserId The logged in user id.\n     * @param  {Number} id The conversation id.\n     * @param  {Number} messagePollMin The message poll start timeout in seconds.\n     * @param  {Number} messagePollMax The message poll max timeout limit in seconds.\n     * @param  {Number} messagePollAfterMax The message poll frequency in seconds to reset to after max limit is reached.\n     * @return {Object} Initial state.\n     */\n    var buildInitialState = function(\n        midnight,\n        loggedInUserId,\n        id,\n        messagePollMin,\n        messagePollMax,\n        messagePollAfterMax\n    ) {\n        return {\n            midnight: midnight,\n            loggedInUserId: loggedInUserId,\n            id: id,\n            messagePollMin: messagePollMin,\n            messagePollMax: messagePollMax,\n            messagePollAfterMax: messagePollAfterMax,\n            name: null,\n            subname: null,\n            type: null,\n            totalMemberCount: null,\n            imageUrl: null,\n            isFavourite: null,\n            isMuted: null,\n            canDeleteMessagesForAllUsers: false,\n            deleteMessagesForAllUsers: false,\n            members: {},\n            messages: [],\n            hasTriedToLoadMessages: false,\n            loadingMessages: true,\n            loadingMembers: true,\n            loadingConfirmAction: false,\n            pendingBlockUserIds: [],\n            pendingUnblockUserIds: [],\n            pendingRemoveContactIds: [],\n            pendingAddContactIds: [],\n            pendingDeleteMessageIds: [],\n            pendingSendMessageIds: [],\n            pendingDeleteConversation: false,\n            selectedMessageIds: [],\n            showEmojiAutoComplete: false,\n            showEmojiPicker: false\n        };\n    };\n\n    /**\n     * Add messages to a state and sort them by timecreated.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Array} messages Messages to add to state.\n     * @return {Object} state New state with added messages.\n     */\n    var addMessages = function(state, messages) {\n        var newState = cloneState(state);\n        var formattedMessages = formatMessages(messages, state.loggedInUserId, state.members);\n        formattedMessages = formattedMessages.map(function(message) {\n            message.sendState = null;\n            message.timeAdded = Date.now();\n            message.errorMessage = null;\n            return message;\n        });\n        var allMessages = state.messages.concat(formattedMessages);\n        // Sort the messages. Oldest to newest.\n        allMessages.sort(function(a, b) {\n            if (a.timeCreated === null && b.timeCreated === null) {\n                if (a.timeAdded < b.timeAdded) {\n                    return -1;\n                } else if (a.timeAdded > b.timeAdded) {\n                    return 1;\n                }\n            }\n\n            if (a.timeCreated === null && b.timeCreated !== null) {\n                // A comes after b.\n                return 1;\n            } else if (a.timeCreated !== null && b.timeCreated === null) {\n                // A comes before b.\n                return -1;\n            } else if (a.timeCreated < b.timeCreated) {\n                // A comes before b.\n                return -1;\n            } else if (a.timeCreated > b.timeCreated) {\n                // A comes after b.\n                return 1;\n            } else if (a.id < b.id) {\n                return -1;\n            } else if (a.id > b.id) {\n                return 1;\n            } else {\n                return 0;\n            }\n        });\n\n        // Filter out any duplicate messages.\n        newState.messages = allMessages.filter(function(message, index, sortedMessages) {\n            return !index || message.id != sortedMessages[index - 1].id;\n        });\n\n        return newState;\n    };\n\n    /**\n     * Update existing messages.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Array} data 2D array of old and new messages\n     * @return {Object} state.\n     */\n    var updateMessages = function(state, data) {\n        var newState = cloneState(state);\n        var updatesById = data.reduce(function(carry, messageData) {\n            var oldMessage = messageData[0];\n            var newMessage = messageData[1];\n            var formattedMessages = formatMessages([newMessage], state.loggedInUserId, state.members);\n            var formattedMessage = formattedMessages[0];\n\n            carry[oldMessage.id] = formattedMessage;\n            return carry;\n        }, {});\n\n        newState.messages = newState.messages.map(function(message) {\n            if (message.id in updatesById) {\n                return $.extend(message, updatesById[message.id]);\n            } else {\n                return message;\n            }\n        });\n\n        return newState;\n    };\n\n    /**\n     * Remove messages from state.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Array} messages Messages to remove from state.\n     * @return {Object} state New state with removed messages.\n     */\n    var removeMessages = function(state, messages) {\n        var newState = cloneState(state);\n        var removeMessageIds = messages.map(function(message) {\n            return \"\" + message.id;\n        });\n        newState.messages = newState.messages.filter(function(message) {\n            return removeMessageIds.indexOf(message.id) < 0;\n        });\n\n        return newState;\n    };\n\n    /**\n     * Remove messages from state by message id.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Array} messageIds Message ids to remove from state.\n     * @return {Object} state New state with removed messages.\n     */\n    var removeMessagesById = function(state, messageIds) {\n        var newState = cloneState(state);\n        messageIds = messageIds.map(function(id) {\n            return \"\" + id;\n        });\n        newState.messages = newState.messages.filter(function(message) {\n            return messageIds.indexOf(message.id) < 0;\n        });\n\n        return newState;\n    };\n\n    /**\n     * Add conversation member to state.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Array} members Conversation members to be added to state.\n     * @return {Object} New state with added members.\n     */\n    var addMembers = function(state, members) {\n        var newState = cloneState(state);\n        var formattedMembers = formatMembers(members);\n        formattedMembers.forEach(function(member) {\n            newState.members[member.id] = member;\n        });\n        return newState;\n    };\n\n    /**\n     * Remove members from state.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Array} members Members to be removed from state.\n     * @return {Object} New state with removed members.\n     */\n    var removeMembers = function(state, members) {\n        var newState = cloneState(state);\n        members.forEach(function(member) {\n            delete newState.members[member.id];\n        });\n        return newState;\n    };\n\n    /**\n     * Set the state loading messages attribute.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Bool} value New loading messages value.\n     * @return {Object} New state with loading messages attribute.\n     */\n    var setLoadingMessages = function(state, value) {\n        var newState = cloneState(state);\n        newState.loadingMessages = value;\n        if (state.loadingMessages && !value) {\n            // If we're going from loading to not loading then\n            // it means we've tried to load.\n            newState.hasTriedToLoadMessages = true;\n        }\n        return newState;\n    };\n\n    /**\n     * Set the state loading members attribute.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Bool} value New loading members value.\n     * @return {Object} New state with loading members attribute.\n     */\n    var setLoadingMembers = function(state, value) {\n        var newState = cloneState(state);\n        newState.loadingMembers = value;\n        return newState;\n    };\n\n    /**\n     * Set the conversation id.\n     *\n     * @param  {Object} state Current state.\n     * @param  {String} value The ID.\n     * @return {Object} New state.\n     */\n    var setId = function(state, value) {\n        var newState = cloneState(state);\n        newState.id = value;\n        return newState;\n    };\n\n    /**\n     * Set the state name attribute.\n     *\n     * @param  {Object} state Current state.\n     * @param  {String} value New name value.\n     * @return {Object} New state with name attribute.\n     */\n    var setName = function(state, value) {\n        var newState = cloneState(state);\n        newState.name = value;\n        return newState;\n    };\n\n    /**\n     * Set the state subname attribute.\n     *\n     * @param  {Object} state Current state.\n     * @param  {String} value New subname value.\n     * @return {Object} New state.\n     */\n    var setSubname = function(state, value) {\n        var newState = cloneState(state);\n        newState.subname = value;\n        return newState;\n    };\n\n    /**\n     * Set the conversation type.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Int} type Conversation type.\n     * @return {Object} New state.\n     */\n    var setType = function(state, type) {\n        var newState = cloneState(state);\n        newState.type = type;\n        return newState;\n    };\n\n    /**\n     * Set whether the conversation is a favourite conversation.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Bool} isFavourite If it's a favourite.\n     * @return {Object} New state.\n     */\n    var setIsFavourite = function(state, isFavourite) {\n        var newState = cloneState(state);\n        newState.isFavourite = isFavourite;\n        return newState;\n    };\n\n    /**\n     * Set whether the conversation is a muted conversation.\n     *\n     * @param  {Object} state Current state.\n     * @param  {bool} isMuted If it's muted.\n     * @return {Object} New state.\n     */\n    var setIsMuted = function(state, isMuted) {\n        var newState = cloneState(state);\n        newState.isMuted = isMuted;\n        return newState;\n    };\n\n    /**\n     * Set the total member count.\n     *\n     * @param  {Object} state Current state.\n     * @param  {String} count The count.\n     * @return {Object} New state.\n     */\n    var setTotalMemberCount = function(state, count) {\n        var newState = cloneState(state);\n        newState.totalMemberCount = count;\n        return newState;\n    };\n\n    /**\n     * Set the conversation image url.\n     *\n     * @param  {Object} state Current state.\n     * @param  {String} url The url to the image.\n     * @return {Object} New state.\n     */\n    var setImageUrl = function(state, url) {\n        var newState = cloneState(state);\n        newState.imageUrl = url;\n        return newState;\n    };\n\n    /**\n     * Set the state loading confirm action attribute.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Bool} value New loading confirm action value.\n     * @return {Object} New state with loading confirm action attribute.\n     */\n    var setLoadingConfirmAction = function(state, value) {\n        var newState = cloneState(state);\n        newState.loadingConfirmAction = value;\n        return newState;\n    };\n\n    /**\n     * Set the state pending delete conversation attribute.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Bool} value New pending delete conversation value.\n     * @return {Object} New state with pending delete conversation attribute.\n     */\n    var setPendingDeleteConversation = function(state, value) {\n        var newState = cloneState(state);\n        newState.pendingDeleteConversation = value;\n        return newState;\n    };\n\n    /**\n     * Set the state of message to pending.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Array} messageIds Messages to delete.\n     * @return {Object} New state with array of pending delete message ids.\n     */\n    var setMessagesSendPendingById = function(state, messageIds) {\n        var newState = cloneState(state);\n        messageIds = messageIds.map(function(id) {\n            return \"\" + id;\n        });\n        newState.messages.forEach(function(message) {\n            if (messageIds.indexOf(message.id) >= 0) {\n                message.sendState = 'pending';\n                message.errorMessage = null;\n            }\n        });\n        return newState;\n    };\n\n    /**\n     * Set the state of message to sent.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Array} messageIds Messages to delete.\n     * @return {Object} New state with array of pending delete message ids.\n     */\n    var setMessagesSendSuccessById = function(state, messageIds) {\n        var newState = cloneState(state);\n        messageIds = messageIds.map(function(id) {\n            return \"\" + id;\n        });\n        newState.messages.forEach(function(message) {\n            if (messageIds.indexOf(message.id) >= 0) {\n                message.sendState = 'sent';\n                message.errorMessage = null;\n            }\n        });\n        return newState;\n    };\n\n    /**\n     * Set the state of messages to error.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Array} messageIds Messages to delete.\n     * @param  {string} errorMessage\n     * @return {Object} New state with array of pending delete message ids.\n     */\n    var setMessagesSendFailById = function(state, messageIds, errorMessage) {\n        var newState = cloneState(state);\n        messageIds = messageIds.map(function(id) {\n            return \"\" + id;\n        });\n        newState.messages.forEach(function(message) {\n            if (messageIds.indexOf(message.id) >= 0) {\n                message.sendState = 'error';\n                message.errorMessage = errorMessage;\n            }\n        });\n        return newState;\n    };\n\n    /**\n     * Set the visibility of the emoji picker.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Bool} show Should the emoji picker be shown.\n     * @return {Object} New state with array of pending delete message ids.\n     */\n    var setShowEmojiPicker = function(state, show) {\n        var newState = cloneState(state);\n        newState.showEmojiPicker = show;\n        return newState;\n    };\n\n    /**\n     * Set whether emojis auto complete suggestions should be shown.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Bool} show Show the autocomplete\n     * @return {Object} New state with array of pending delete message ids.\n     */\n    var setShowEmojiAutoComplete = function(state, show) {\n        var newState = cloneState(state);\n        newState.showEmojiAutoComplete = show;\n        return newState;\n    };\n\n    /**\n     * Set the state pending block userids.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Array} userIds User ids to block.\n     * @return {Object} New state with array of pending block userids.\n     */\n    var addPendingBlockUsersById = function(state, userIds) {\n        var newState = cloneState(state);\n        userIds.forEach(function(id) {\n            newState.pendingBlockUserIds.push(id);\n        });\n        return newState;\n    };\n\n    /**\n     * Set the state pending remove userids.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Array} userIds User ids to remove.\n     * @return {Object} New state with array of pending remove userids.\n     */\n    var addPendingRemoveContactsById = function(state, userIds) {\n        var newState = cloneState(state);\n        userIds.forEach(function(id) {\n            newState.pendingRemoveContactIds.push(id);\n        });\n        return newState;\n    };\n\n    /**\n     * Set the state pending unblock userids.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Array} userIds User ids to unblock.\n     * @return {Object} New state with array of pending unblock userids.\n     */\n    var addPendingUnblockUsersById = function(state, userIds) {\n        var newState = cloneState(state);\n        userIds.forEach(function(id) {\n            newState.pendingUnblockUserIds.push(id);\n        });\n        return newState;\n    };\n\n    /**\n     * Set the state pending add users to contacts userids.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Array} userIds User ids to add users to contacts.\n     * @return {Object} New state with array of pending add users to contacts userids.\n     */\n    var addPendingAddContactsById = function(state, userIds) {\n        var newState = cloneState(state);\n        userIds.forEach(function(id) {\n            newState.pendingAddContactIds.push(id);\n        });\n        return newState;\n    };\n\n    /**\n     * Set the state pending delete messages.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Array} messageIds Messages to delete.\n     * @return {Object} New state with array of pending delete message ids.\n     */\n    var addPendingDeleteMessagesById = function(state, messageIds) {\n        var newState = cloneState(state);\n        messageIds.forEach(function(id) {\n            newState.pendingDeleteMessageIds.push(id);\n        });\n        return newState;\n    };\n\n    /**\n     * Update the state pending block userids.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Array} userIds User ids to remove from the list of user ids to block.\n     * @return {Object} New state with array of pending block userids.\n     */\n    var removePendingBlockUsersById = function(state, userIds) {\n        var newState = cloneState(state);\n        newState.pendingBlockUserIds = newState.pendingBlockUserIds.filter(function(id) {\n            return userIds.indexOf(id) < 0;\n        });\n        return newState;\n    };\n\n    /**\n     * Update the state pending remove userids.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Array} userIds User ids to remove from the list of user ids to remove.\n     * @return {Object} New state with array of pending remove userids.\n     */\n    var removePendingRemoveContactsById = function(state, userIds) {\n        var newState = cloneState(state);\n        newState.pendingRemoveContactIds = newState.pendingRemoveContactIds.filter(function(id) {\n            return userIds.indexOf(id) < 0;\n        });\n        return newState;\n    };\n\n    /**\n     * Update the state pending unblock userids.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Array} userIds User ids to remove from the list of user ids to unblock.\n     * @return {Object} New state with array of pending unblock userids.\n     */\n    var removePendingUnblockUsersById = function(state, userIds) {\n        var newState = cloneState(state);\n        newState.pendingUnblockUserIds = newState.pendingUnblockUserIds.filter(function(id) {\n            return userIds.indexOf(id) < 0;\n        });\n        return newState;\n    };\n\n    /**\n     * Update the state pending add to contacts userids.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Array} userIds User ids to remove from the list of user ids to add to contacts.\n     * @return {Object} New state with array of pending add to contacts userids.\n     */\n    var removePendingAddContactsById = function(state, userIds) {\n        var newState = cloneState(state);\n        newState.pendingAddContactIds = newState.pendingAddContactIds.filter(function(id) {\n            return userIds.indexOf(id) < 0;\n        });\n        return newState;\n    };\n\n    /**\n     * Update the state pending delete messages userids.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Array} messageIds Message ids to remove from the list of messages to delete.\n     * @return {Object} New state with array of messages to delete.\n     */\n    var removePendingDeleteMessagesById = function(state, messageIds) {\n        var newState = cloneState(state);\n        messageIds = messageIds.map(function(id) {\n            return \"\" + id;\n        });\n        newState.pendingDeleteMessageIds = newState.pendingDeleteMessageIds.filter(function(id) {\n            return messageIds.indexOf(id) < 0;\n        });\n        return newState;\n    };\n\n    /**\n     * Add messages to state selected messages.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Array} messageIds Messages that are selected.\n     * @return {Object} New state with array of not blocked members.\n     */\n    var addSelectedMessagesById = function(state, messageIds) {\n        var newState = cloneState(state);\n        messageIds = messageIds.map(function(id) {\n            return \"\" + id;\n        });\n        newState.selectedMessageIds = newState.selectedMessageIds.concat(messageIds);\n        return newState;\n    };\n\n    /**\n     * Remove messages from the state selected messages.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Array} messageIds Messages to remove from selected messages.\n     * @return {Object} New state with array of selected messages.\n     */\n    var removeSelectedMessagesById = function(state, messageIds) {\n        var newState = cloneState(state);\n        messageIds = messageIds.map(function(id) {\n            return \"\" + id;\n        });\n        newState.selectedMessageIds = newState.selectedMessageIds.filter(function(id) {\n            return messageIds.indexOf(id) < 0;\n        });\n        return newState;\n    };\n\n    /**\n     * Mark messages as read.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Array} readMessages Messages that are read.\n     * @return {Object} New state with array of messages that have the isread attribute set.\n     */\n    var markMessagesAsRead = function(state, readMessages) {\n        var newState = cloneState(state);\n        var readMessageIds = readMessages.map(function(message) {\n            return message.id;\n        });\n        newState.messages = newState.messages.map(function(message) {\n            if (readMessageIds.indexOf(message.id) >= 0) {\n                message.isRead = true;\n            }\n\n            return message;\n        });\n        return newState;\n    };\n\n    /**\n     * Add a contact request to each of the members that the request is for.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Array} requests The contact requests\n     * @return {Object} New state\n     */\n    var addContactRequests = function(state, requests) {\n        var newState = cloneState(state);\n\n        requests.forEach(function(request) {\n            var fromUserId = request.userid;\n            var toUserId = request.requesteduserid;\n            newState.members[fromUserId].contactrequests.push(request);\n            newState.members[toUserId].contactrequests.push(request);\n        });\n\n        return newState;\n    };\n\n    /**\n     * Remove a contact request from the members of that request.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Array} requests The contact requests\n     * @return {Object} New state\n     */\n    var removeContactRequests = function(state, requests) {\n        var newState = cloneState(state);\n        requests.forEach(function(request) {\n            var fromUserId = request.userid;\n            var toUserId = request.requesteduserid;\n\n            newState.members[fromUserId].contactrequests = newState.members[fromUserId].contactrequests.filter(function(existing) {\n                return existing.userid != fromUserId;\n            });\n            newState.members[toUserId].contactrequests = newState.members[toUserId].contactrequests.filter(function(existing) {\n                return existing.requesteduserid != toUserId;\n            });\n        });\n\n        return newState;\n    };\n\n    /**\n     * Set wheter the message of the conversation can delete for all users.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Bool} value If it can delete for all users.\n     * @return {Object} New state.\n     */\n    var setCanDeleteMessagesForAllUsers = function(state, value) {\n        var newState = cloneState(state);\n        newState.canDeleteMessagesForAllUsers = value;\n        return newState;\n    };\n\n    /**\n     * Set wheter the messages of the conversation delete for all users.\n     *\n     * @param  {Object} state Current state.\n     * @param  {Bool} value Delete messages for all users.\n     * @return {Object} New state.\n     */\n    var setDeleteMessagesForAllUsers = function(state, value) {\n        var newState = cloneState(state);\n        newState.deleteMessagesForAllUsers = value;\n        return newState;\n    };\n\n    return {\n        buildInitialState: buildInitialState,\n        addMessages: addMessages,\n        updateMessages: updateMessages,\n        removeMessages: removeMessages,\n        removeMessagesById: removeMessagesById,\n        addMembers: addMembers,\n        removeMembers: removeMembers,\n        setLoadingMessages: setLoadingMessages,\n        setLoadingMembers: setLoadingMembers,\n        setId: setId,\n        setName: setName,\n        setSubname: setSubname,\n        setType: setType,\n        setIsFavourite: setIsFavourite,\n        setIsMuted: setIsMuted,\n        setCanDeleteMessagesForAllUsers: setCanDeleteMessagesForAllUsers,\n        setDeleteMessagesForAllUsers: setDeleteMessagesForAllUsers,\n        setTotalMemberCount: setTotalMemberCount,\n        setImageUrl: setImageUrl,\n        setLoadingConfirmAction: setLoadingConfirmAction,\n        setPendingDeleteConversation: setPendingDeleteConversation,\n        setMessagesSendPendingById: setMessagesSendPendingById,\n        setMessagesSendSuccessById: setMessagesSendSuccessById,\n        setMessagesSendFailById: setMessagesSendFailById,\n        setShowEmojiAutoComplete: setShowEmojiAutoComplete,\n        setShowEmojiPicker: setShowEmojiPicker,\n        addPendingBlockUsersById: addPendingBlockUsersById,\n        addPendingRemoveContactsById: addPendingRemoveContactsById,\n        addPendingUnblockUsersById: addPendingUnblockUsersById,\n        addPendingAddContactsById: addPendingAddContactsById,\n        addPendingDeleteMessagesById: addPendingDeleteMessagesById,\n        removePendingBlockUsersById: removePendingBlockUsersById,\n        removePendingRemoveContactsById: removePendingRemoveContactsById,\n        removePendingUnblockUsersById: removePendingUnblockUsersById,\n        removePendingAddContactsById: removePendingAddContactsById,\n        removePendingDeleteMessagesById: removePendingDeleteMessagesById,\n        addSelectedMessagesById: addSelectedMessagesById,\n        removeSelectedMessagesById: removeSelectedMessagesById,\n        markMessagesAsRead: markMessagesAsRead,\n        addContactRequests: addContactRequests,\n        removeContactRequests: removeContactRequests\n    };\n});\n"],"names":["define","$","cloneState","state","extend","formatMessages","messages","loggedInUserId","members","map","message","fromLoggedInUser","useridfrom","id","userFrom","text","timeCreated","timecreated","parseInt","buildInitialState","midnight","messagePollMin","messagePollMax","messagePollAfterMax","name","subname","type","totalMemberCount","imageUrl","isFavourite","isMuted","canDeleteMessagesForAllUsers","deleteMessagesForAllUsers","hasTriedToLoadMessages","loadingMessages","loadingMembers","loadingConfirmAction","pendingBlockUserIds","pendingUnblockUserIds","pendingRemoveContactIds","pendingAddContactIds","pendingDeleteMessageIds","pendingSendMessageIds","pendingDeleteConversation","selectedMessageIds","showEmojiAutoComplete","showEmojiPicker","addMessages","newState","formattedMessages","sendState","timeAdded","Date","now","errorMessage","allMessages","concat","sort","a","b","filter","index","sortedMessages","updateMessages","data","updatesById","reduce","carry","messageData","oldMessage","newMessage","formattedMessage","removeMessages","removeMessageIds","indexOf","removeMessagesById","messageIds","addMembers","formattedMembers","member","fullname","profileurl","profileimageurl","profileimageurlsmall","isonline","showonlinestatus","isblocked","iscontact","isdeleted","canmessage","canmessageevenifblocked","requirescontact","contactrequests","formatMembers","forEach","removeMembers","setLoadingMessages","value","setLoadingMembers","setId","setName","setSubname","setType","setIsFavourite","setIsMuted","setCanDeleteMessagesForAllUsers","setDeleteMessagesForAllUsers","setTotalMemberCount","count","setImageUrl","url","setLoadingConfirmAction","setPendingDeleteConversation","setMessagesSendPendingById","setMessagesSendSuccessById","setMessagesSendFailById","setShowEmojiAutoComplete","show","setShowEmojiPicker","addPendingBlockUsersById","userIds","push","addPendingRemoveContactsById","addPendingUnblockUsersById","addPendingAddContactsById","addPendingDeleteMessagesById","removePendingBlockUsersById","removePendingRemoveContactsById","removePendingUnblockUsersById","removePendingAddContactsById","removePendingDeleteMessagesById","addSelectedMessagesById","removeSelectedMessagesById","markMessagesAsRead","readMessages","readMessageIds","isRead","addContactRequests","requests","request","fromUserId","userid","toUserId","requesteduserid","removeContactRequests","existing"],"mappings":"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"}