diff options
author | Maksim Sukharev <antreesy.web@gmail.com> | 2023-07-24 10:51:57 +0200 |
---|---|---|
committer | backportbot-nextcloud[bot] <backportbot-nextcloud[bot]@users.noreply.github.com> | 2023-08-08 07:46:18 +0000 |
commit | 8f5715a109431270f74f45cfadec21a706d80de5 (patch) | |
tree | 5f834c44e04dc952b81859f61b14ae148df697b3 | |
parent | 42b5fe031e41503d4e0157acfe09c24e5d9b27f0 (diff) |
move createCombinedSystemMessage method to composable
Signed-off-by: Maksim Sukharev <antreesy.web@gmail.com>
-rw-r--r-- | src/components/MessagesList/MessagesGroup/MessagesSystemGroup.vue | 288 | ||||
-rw-r--r-- | src/composables/useCombinedSystemMessage.js | 319 |
2 files changed, 329 insertions, 278 deletions
diff --git a/src/components/MessagesList/MessagesGroup/MessagesSystemGroup.vue b/src/components/MessagesList/MessagesGroup/MessagesSystemGroup.vue index 2d468a91f..c2fbd660c 100644 --- a/src/components/MessagesList/MessagesGroup/MessagesSystemGroup.vue +++ b/src/components/MessagesList/MessagesGroup/MessagesSystemGroup.vue @@ -61,8 +61,6 @@ </template> <script> -import cloneDeep from 'lodash/cloneDeep.js' - import UnfoldLess from 'vue-material-design-icons/UnfoldLessHorizontal.vue' import UnfoldMore from 'vue-material-design-icons/UnfoldMoreHorizontal.vue' @@ -70,6 +68,8 @@ import NcButton from '@nextcloud/vue/dist/Components/NcButton.js' import Message from './Message/Message.vue' +import { useCombinedSystemMessage } from '../../../composables/useCombinedSystemMessage.js' + // List only sortable messages with order, in which they should be sorted const MESSAGES = { user_added: 1, @@ -133,6 +133,14 @@ export default { expose: ['highlightMessage'], + setup() { + const { createCombinedSystemMessage } = useCombinedSystemMessage() + + return { + createCombinedSystemMessage, + } + }, + data() { return { groupIsCollapsed: {}, @@ -257,282 +265,6 @@ export default { return groups }, - checkIfSelfIsActor(message) { - return message.messageParameters.actor.id === this.$store.getters.getActorId() - && message.messageParameters.actor.type + 's' === this.$store.getters.getActorType() - }, - - checkIfSelfIsUser(message) { - return message.messageParameters.user.id === this.$store.getters.getActorId() - && message.messageParameters.user.type + 's' === this.$store.getters.getActorType() - }, - - createCombinedSystemMessage({ messages, type }) { - const combinedMessage = cloneDeep(messages[0]) - - // Handle cases when users reconnected to the call - if (type === 'call_reconnected') { - if (this.checkIfSelfIsActor(combinedMessage)) { - combinedMessage.message = t('spreed', 'You reconnected to the call') - } else { - combinedMessage.message = t('spreed', '{actor} reconnected to the call') - } - - return combinedMessage - } - - // clear messageParameters to be filled later - const actor = messages[0].messageParameters.actor - combinedMessage.messageParameters = { actor } - const actorIsAdministrator = actor.id === 'guest/cli' && actor.type === 'guest' - - // usersCounter should be equal at least 2, as we're using this method only for groups - let usersCounter = 0 - let selfIsUser = false - let referenceIndex = 0 - - // Handle cases when actor added users to conversation (when populate on creation, for example) - if (type === 'user_added') { - const selfIsActor = combinedMessage.actorId === this.$store.getters.getActorId() - && combinedMessage.actorType === this.$store.getters.getActorType() - messages.forEach(message => { - if (this.checkIfSelfIsUser(message)) { - selfIsUser = true - } else { - combinedMessage.messageParameters[`user${referenceIndex}`] = message.messageParameters.user - referenceIndex++ - } - usersCounter++ - }) - - if (selfIsActor) { - if (usersCounter === 2) { - combinedMessage.message = t('spreed', 'You added {user0} and {user1}') - } else { - combinedMessage.message = n('spreed', - 'You added {user0}, {user1} and %n more participant', - 'You added {user0}, {user1} and %n more participants', usersCounter - 2) - } - } else if (selfIsUser) { - if (usersCounter === 2) { - combinedMessage.message = actorIsAdministrator - ? t('spreed', 'An administrator added you and {user0}') - : t('spreed', '{actor} added you and {user0}') - } else { - combinedMessage.message = actorIsAdministrator - ? n('spreed', - 'An administrator added you, {user0} and %n more participant', - 'An administrator added you, {user0} and %n more participants', usersCounter - 2) - : n('spreed', - '{actor} added you, {user0} and %n more participant', - '{actor} added you, {user0} and %n more participants', usersCounter - 2) - } - } else { - if (usersCounter === 2) { - combinedMessage.message = actorIsAdministrator - ? t('spreed', 'An administrator added {user0} and {user1}') - : t('spreed', '{actor} added {user0} and {user1}') - } else { - combinedMessage.message = actorIsAdministrator - ? n('spreed', - 'An administrator added {user0}, {user1} and %n more participant', - 'An administrator added {user0}, {user1} and %n more participants', usersCounter - 2) - : n('spreed', - '{actor} added {user0}, {user1} and %n more participant', - '{actor} added {user0}, {user1} and %n more participants', usersCounter - 2) - } - } - } - - // Used to hide duplicates from system message headers, - // when the same user joins or leaves call several times - const storedUniqueUsers = [] - - // Handle cases when users joined the call - if (type === 'call_joined') { - messages.forEach(message => { - const actorReference = `${message.messageParameters.actor.id}_${message.messageParameters.actor.type}` - if (storedUniqueUsers.includes(actorReference)) { - return - } - if (this.checkIfSelfIsActor(message)) { - selfIsUser = true - } else { - combinedMessage.messageParameters[`user${referenceIndex}`] = message.messageParameters.actor - storedUniqueUsers.push(actorReference) - referenceIndex++ - } - usersCounter++ - }) - - if (usersCounter === 1) { - combinedMessage.message = messages[0].message - } else if (selfIsUser) { - if (usersCounter === 2) { - combinedMessage.message = t('spreed', 'You and {user0} joined the call') - } else { - combinedMessage.message = n('spreed', - 'You, {user0} and %n more participant joined the call', - 'You, {user0} and %n more participants joined the call', usersCounter - 2) - } - } else { - if (usersCounter === 2) { - combinedMessage.message = t('spreed', '{user0} and {user1} joined the call') - } else { - combinedMessage.message = n('spreed', - '{user0}, {user1} and %n more participant joined the call', - '{user0}, {user1} and %n more participants joined the call', usersCounter - 2) - } - } - } - - // Handle cases when users left the call - if (type === 'call_left') { - messages.forEach(message => { - const actorReference = `${message.messageParameters.actor.id}_${message.messageParameters.actor.type}` - if (storedUniqueUsers.includes(actorReference)) { - return - } - if (this.checkIfSelfIsActor(message)) { - selfIsUser = true - } else { - combinedMessage.messageParameters[`user${referenceIndex}`] = message.messageParameters.actor - storedUniqueUsers.push(actorReference) - referenceIndex++ - } - usersCounter++ - }) - - if (usersCounter === 1) { - combinedMessage.message = messages[0].message - } else if (selfIsUser) { - if (usersCounter === 2) { - combinedMessage.message = t('spreed', 'You and {user0} left the call') - } else { - combinedMessage.message = n('spreed', - 'You, {user0} and %n more participant left the call', - 'You, {user0} and %n more participants left the call', usersCounter - 2) - } - } else { - if (usersCounter === 2) { - combinedMessage.message = t('spreed', '{user0} and {user1} left the call') - } else { - combinedMessage.message = n('spreed', - '{user0}, {user1} and %n more participant left the call', - '{user0}, {user1} and %n more participants left the call', usersCounter - 2) - } - } - } - - // Handle cases when actor promoted several users to moderators - if (type === 'moderator_promoted') { - const selfIsActor = combinedMessage.actorId === this.$store.getters.getActorId() - && combinedMessage.actorType === this.$store.getters.getActorType() - messages.forEach(message => { - if (this.checkIfSelfIsUser(message)) { - selfIsUser = true - } else { - combinedMessage.messageParameters[`user${referenceIndex}`] = message.messageParameters.user - referenceIndex++ - } - usersCounter++ - }) - - if (selfIsActor) { - if (usersCounter === 2) { - combinedMessage.message = t('spreed', 'You promoted {user0} and {user1} to moderators') - } else { - combinedMessage.message = n('spreed', - 'You promoted {user0}, {user1} and %n more participant to moderators', - 'You promoted {user0}, {user1} and %n more participants to moderators', usersCounter - 2) - } - } else if (selfIsUser) { - if (usersCounter === 2) { - combinedMessage.message = actorIsAdministrator - ? t('spreed', 'An administrator promoted you and {user0} to moderators') - : t('spreed', '{actor} promoted you and {user0} to moderators') - } else { - combinedMessage.message = actorIsAdministrator - ? n('spreed', - 'An administrator promoted you, {user0} and %n more participant to moderators', - 'An administrator promoted you, {user0} and %n more participants to moderators', usersCounter - 2) - : n('spreed', - '{actor} promoted you, {user0} and %n more participant to moderators', - '{actor} promoted you, {user0} and %n more participants to moderators', usersCounter - 2) - } - } else { - if (usersCounter === 2) { - combinedMessage.message = actorIsAdministrator - ? t('spreed', 'An administrator promoted {user0} and {user1} to moderators') - : t('spreed', '{actor} promoted {user0} and {user1} to moderators') - } else { - combinedMessage.message = actorIsAdministrator - ? n('spreed', - 'An administrator promoted {user0}, {user1} and %n more participant to moderators', - 'An administrator promoted {user0}, {user1} and %n more participants to moderators', usersCounter - 2) - : n('spreed', - '{actor} promoted {user0}, {user1} and %n more participant to moderators', - '{actor} promoted {user0}, {user1} and %n more participants to moderators', usersCounter - 2) - } - } - } - - // Handle cases when actor demoted several users from moderators - if (type === 'moderator_demoted') { - const selfIsActor = combinedMessage.actorId === this.$store.getters.getActorId() - && combinedMessage.actorType === this.$store.getters.getActorType() - messages.forEach(message => { - if (this.checkIfSelfIsUser(message)) { - selfIsUser = true - } else { - combinedMessage.messageParameters[`user${referenceIndex}`] = message.messageParameters.user - referenceIndex++ - } - usersCounter++ - }) - - if (selfIsActor) { - if (usersCounter === 2) { - combinedMessage.message = t('spreed', 'You demoted {user0} and {user1} from moderators') - } else { - combinedMessage.message = n('spreed', - 'You demoted {user0}, {user1} and %n more participant from moderators', - 'You demoted {user0}, {user1} and %n more participants from moderators', usersCounter - 2) - } - } else if (selfIsUser) { - if (usersCounter === 2) { - combinedMessage.message = actorIsAdministrator - ? t('spreed', 'An administrator demoted you and {user0} from moderators') - : t('spreed', '{actor} demoted you and {user0} from moderators') - } else { - combinedMessage.message = actorIsAdministrator - ? n('spreed', - 'An administrator demoted you, {user0} and %n more participant from moderators', - 'An administrator demoted you, {user0} and %n more participants from moderators', usersCounter - 2) - : n('spreed', - '{actor} demoted you, {user0} and %n more participant from moderators', - '{actor} demoted you, {user0} and %n more participants from moderators', usersCounter - 2) - } - } else { - if (usersCounter === 2) { - combinedMessage.message = actorIsAdministrator - ? t('spreed', 'An administrator demoted {user0} and {user1} from moderators') - : t('spreed', '{actor} demoted {user0} and {user1} from moderators') - } else { - combinedMessage.message = actorIsAdministrator - ? n('spreed', - 'An administrator demoted {user0}, {user1} and %n more participant from moderators', - 'An administrator demoted {user0}, {user1} and %n more participants from moderators', usersCounter - 2) - : n('spreed', - '{actor} demoted {user0}, {user1} and %n more participant from moderators', - '{actor} demoted {user0}, {user1} and %n more participants from moderators', usersCounter - 2) - } - } - } - - return combinedMessage - }, - toggleCollapsed(messages) { this.$set(messages, 'collapsed', !messages.collapsed) this.groupIsCollapsed[messages.id] = !this.groupIsCollapsed[messages.id] diff --git a/src/composables/useCombinedSystemMessage.js b/src/composables/useCombinedSystemMessage.js new file mode 100644 index 000000000..4baafc8de --- /dev/null +++ b/src/composables/useCombinedSystemMessage.js @@ -0,0 +1,319 @@ +/* + * @copyright Copyright (c) 2023 Maksim Sukharev <antreesy.web@gmail.com> + * + * @author Maksim Sukharev <antreesy.web@gmail.com> + * + * @license AGPL-3.0-or-later + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +import cloneDeep from 'lodash/cloneDeep.js' + +import { useStore } from './useStore.js' + +/** + * Create combined system message from the passed object + * + */ +export function useCombinedSystemMessage() { + const store = useStore() + + /** + * + * @param {object} message message to check for + * @return {boolean} + */ + function checkIfSelfIsActor(message) { + return message.actorId === store.getters.getActorId() + && message.actorType === store.getters.getActorType() + } + + /** + * + * @param {object} message message to check for + * @return {boolean} + */ + function checkIfSelfIsOneOfActors(message) { + return message.messageParameters.actor.id === store.getters.getActorId() + && message.messageParameters.actor.type + 's' === store.getters.getActorType() + } + + /** + * + * @param {object} message message to check for + * @return {boolean} + */ + function checkIfSelfIsOneOfUsers(message) { + return message.messageParameters.user.id === store.getters.getActorId() + && message.messageParameters.user.type + 's' === store.getters.getActorType() + } + + /** + * + * @param {object} group object representing the group of system messages + * @param {number} group.id id of the group + * @param {Array} group.messages array of grouped messages + * @param {string} group.type combination type + * @param {boolean} group.collapsed collapsed state + * @return {object} + */ + function createCombinedSystemMessage({ id, messages, type, collapsed }) { + const combinedMessage = cloneDeep(messages[0]) + + // Handle cases when users reconnected to the call + if (type === 'call_reconnected') { + if (checkIfSelfIsOneOfActors(combinedMessage)) { + combinedMessage.message = t('spreed', 'You reconnected to the call') + } else { + combinedMessage.message = t('spreed', '{actor} reconnected to the call') + } + + return combinedMessage + } + + // clear messageParameters to be filled later + const actor = messages[0].messageParameters.actor + combinedMessage.messageParameters = { actor } + const actorIsAdministrator = actor.id === 'guest/cli' && actor.type === 'guest' + + // usersCounter should be equal at least 2, as we're using method only for groups + let usersCounter = 0 + let selfIsUser = false + let referenceIndex = 0 + + // Handle cases when actor added users to conversation (when populate on creation, for example) + if (type === 'user_added') { + messages.forEach(message => { + if (checkIfSelfIsOneOfUsers(message)) { + selfIsUser = true + } else { + combinedMessage.messageParameters[`user${referenceIndex}`] = message.messageParameters.user + referenceIndex++ + } + usersCounter++ + }) + + if (checkIfSelfIsActor(combinedMessage)) { + if (usersCounter === 2) { + combinedMessage.message = t('spreed', 'You added {user0} and {user1}') + } else { + combinedMessage.message = n('spreed', + 'You added {user0}, {user1} and %n more participant', + 'You added {user0}, {user1} and %n more participants', usersCounter - 2) + } + } else if (selfIsUser) { + if (usersCounter === 2) { + combinedMessage.message = actorIsAdministrator + ? t('spreed', 'An administrator added you and {user0}') + : t('spreed', '{actor} added you and {user0}') + } else { + combinedMessage.message = actorIsAdministrator + ? n('spreed', + 'An administrator added you, {user0} and %n more participant', + 'An administrator added you, {user0} and %n more participants', usersCounter - 2) + : n('spreed', + '{actor} added you, {user0} and %n more participant', + '{actor} added you, {user0} and %n more participants', usersCounter - 2) + } + } else { + if (usersCounter === 2) { + combinedMessage.message = actorIsAdministrator + ? t('spreed', 'An administrator added {user0} and {user1}') + : t('spreed', '{actor} added {user0} and {user1}') + } else { + combinedMessage.message = actorIsAdministrator + ? n('spreed', + 'An administrator added {user0}, {user1} and %n more participant', + 'An administrator added {user0}, {user1} and %n more participants', usersCounter - 2) + : n('spreed', + '{actor} added {user0}, {user1} and %n more participant', + '{actor} added {user0}, {user1} and %n more participants', usersCounter - 2) + } + } + } + + // Handle cases when users joined or left the call + if (type === 'call_joined' || type === 'call_left') { + const storedUniqueUsers = [] + + messages.forEach(message => { + const actorReference = `${message.messageParameters.actor.id}_${message.messageParameters.actor.type}` + if (storedUniqueUsers.includes(actorReference)) { + return + } + if (checkIfSelfIsOneOfActors(message)) { + selfIsUser = true + } else { + combinedMessage.messageParameters[`user${referenceIndex}`] = message.messageParameters.actor + storedUniqueUsers.push(actorReference) + referenceIndex++ + } + usersCounter++ + }) + + if (usersCounter === 1) { + combinedMessage.message = messages[0].message + return combinedMessage + } + + if (type === 'call_joined') { + if (selfIsUser) { + if (usersCounter === 2) { + combinedMessage.message = t('spreed', 'You and {user0} joined the call') + } else { + combinedMessage.message = n('spreed', + 'You, {user0} and %n more participant joined the call', + 'You, {user0} and %n more participants joined the call', usersCounter - 2) + } + } else { + if (usersCounter === 2) { + combinedMessage.message = t('spreed', '{user0} and {user1} joined the call') + } else { + combinedMessage.message = n('spreed', + '{user0}, {user1} and %n more participant joined the call', + '{user0}, {user1} and %n more participants joined the call', usersCounter - 2) + } + } + } else if (type === 'call_left') { + if (selfIsUser) { + if (usersCounter === 2) { + combinedMessage.message = t('spreed', 'You and {user0} left the call') + } else { + combinedMessage.message = n('spreed', + 'You, {user0} and %n more participant left the call', + 'You, {user0} and %n more participants left the call', usersCounter - 2) + } + } else { + if (usersCounter === 2) { + combinedMessage.message = t('spreed', '{user0} and {user1} left the call') + } else { + combinedMessage.message = n('spreed', + '{user0}, {user1} and %n more participant left the call', + '{user0}, {user1} and %n more participants left the call', usersCounter - 2) + } + } + } + + } + + // Handle cases when actor promoted several users to moderators + if (type === 'moderator_promoted') { + messages.forEach(message => { + if (checkIfSelfIsOneOfUsers(message)) { + selfIsUser = true + } else { + combinedMessage.messageParameters[`user${referenceIndex}`] = message.messageParameters.user + referenceIndex++ + } + usersCounter++ + }) + + if (checkIfSelfIsActor(combinedMessage)) { + if (usersCounter === 2) { + combinedMessage.message = t('spreed', 'You promoted {user0} and {user1} to moderators') + } else { + combinedMessage.message = n('spreed', + 'You promoted {user0}, {user1} and %n more participant to moderators', + 'You promoted {user0}, {user1} and %n more participants to moderators', usersCounter - 2) + } + } else if (selfIsUser) { + if (usersCounter === 2) { + combinedMessage.message = actorIsAdministrator + ? t('spreed', 'An administrator promoted you and {user0} to moderators') + : t('spreed', '{actor} promoted you and {user0} to moderators') + } else { + combinedMessage.message = actorIsAdministrator + ? n('spreed', + 'An administrator promoted you, {user0} and %n more participant to moderators', + 'An administrator promoted you, {user0} and %n more participants to moderators', usersCounter - 2) + : n('spreed', + '{actor} promoted you, {user0} and %n more participant to moderators', + '{actor} promoted you, {user0} and %n more participants to moderators', usersCounter - 2) + } + } else { + if (usersCounter === 2) { + combinedMessage.message = actorIsAdministrator + ? t('spreed', 'An administrator promoted {user0} and {user1} to moderators') + : t('spreed', '{actor} promoted {user0} and {user1} to moderators') + } else { + combinedMessage.message = actorIsAdministrator + ? n('spreed', + 'An administrator promoted {user0}, {user1} and %n more participant to moderators', + 'An administrator promoted {user0}, {user1} and %n more participants to moderators', usersCounter - 2) + : n('spreed', + '{actor} promoted {user0}, {user1} and %n more participant to moderators', + '{actor} promoted {user0}, {user1} and %n more participants to moderators', usersCounter - 2) + } + } + } + + // Handle cases when actor demoted several users from moderators + if (type === 'moderator_demoted') { + messages.forEach(message => { + if (checkIfSelfIsOneOfUsers(message)) { + selfIsUser = true + } else { + combinedMessage.messageParameters[`user${referenceIndex}`] = message.messageParameters.user + referenceIndex++ + } + usersCounter++ + }) + + if (checkIfSelfIsActor(combinedMessage)) { + if (usersCounter === 2) { + combinedMessage.message = t('spreed', 'You demoted {user0} and {user1} from moderators') + } else { + combinedMessage.message = n('spreed', + 'You demoted {user0}, {user1} and %n more participant from moderators', + 'You demoted {user0}, {user1} and %n more participants from moderators', usersCounter - 2) + } + } else if (selfIsUser) { + if (usersCounter === 2) { + combinedMessage.message = actorIsAdministrator + ? t('spreed', 'An administrator demoted you and {user0} from moderators') + : t('spreed', '{actor} demoted you and {user0} from moderators') + } else { + combinedMessage.message = actorIsAdministrator + ? n('spreed', + 'An administrator demoted you, {user0} and %n more participant from moderators', + 'An administrator demoted you, {user0} and %n more participants from moderators', usersCounter - 2) + : n('spreed', + '{actor} demoted you, {user0} and %n more participant from moderators', + '{actor} demoted you, {user0} and %n more participants from moderators', usersCounter - 2) + } + } else { + if (usersCounter === 2) { + combinedMessage.message = actorIsAdministrator + ? t('spreed', 'An administrator demoted {user0} and {user1} from moderators') + : t('spreed', '{actor} demoted {user0} and {user1} from moderators') + } else { + combinedMessage.message = actorIsAdministrator + ? n('spreed', + 'An administrator demoted {user0}, {user1} and %n more participant from moderators', + 'An administrator demoted {user0}, {user1} and %n more participants from moderators', usersCounter - 2) + : n('spreed', + '{actor} demoted {user0}, {user1} and %n more participant from moderators', + '{actor} demoted {user0}, {user1} and %n more participants from moderators', usersCounter - 2) + } + } + } + + return combinedMessage + } + + return { + createCombinedSystemMessage, + } +} |