Skip to content

Commit 3b8ad2d

Browse files
Merge pull request #7149 from nextcloud/bugfix/7148/add-item-shares-from-chat-messages-directly-to-the-store
Add item shares from chat messages directly to the store
2 parents 1361a98 + 5a6f435 commit 3b8ad2d

File tree

5 files changed

+114
-42
lines changed

5 files changed

+114
-42
lines changed

src/components/RightSidebar/SharedItems/SharedItems.vue

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<div class="shared-items">
2424
<AppNavigationCaption :title="title" />
2525
<div class="files" :class="{'files__list' : isList}">
26-
<template v-for="file in filesToDisplay">
26+
<template v-for="file in itemsToDisplay">
2727
<FilePreview :key="file.id"
2828
:small-preview="isList"
2929
:row-layout="isList"
@@ -52,6 +52,7 @@ import FilePreview from '../../MessagesList/MessagesGroup/Message/MessagePart/Fi
5252
import DotsHorizontal from 'vue-material-design-icons/DotsHorizontal.vue'
5353
import AppNavigationCaption from '@nextcloud/vue/dist/Components/AppNavigationCaption'
5454
import { showMessage } from '@nextcloud/dialogs'
55+
import { SHARED_ITEM } from '../../../constants'
5556
5657
export default {
5758
name: 'SharedItems',
@@ -76,57 +77,55 @@ export default {
7677
},
7778
7879
computed: {
79-
filesToDisplay() {
80+
itemsToDisplay() {
8081
return Object.values(this.items).reverse().slice(0, 6)
8182
},
8283
8384
title() {
8485
switch (this.type) {
85-
case 'media':
86+
case SHARED_ITEM.TYPES.MEDIA:
8687
return t('spreed', 'Media')
87-
case 'file':
88+
case SHARED_ITEM.TYPES.FILE:
8889
return t('spreed', 'Files')
89-
case 'deck-card':
90+
case SHARED_ITEM.TYPES.DECK_CARD:
9091
return t('spreed', 'Deck cards')
91-
case 'voice':
92+
case SHARED_ITEM.TYPES.VOICE:
9293
return t('spreed', 'Voice messages')
93-
case 'location':
94+
case SHARED_ITEM.TYPES.LOCATION:
9495
return t('spreed', 'Locations')
95-
case 'audio':
96+
case SHARED_ITEM.TYPES.AUDIO:
9697
return t('spreed', 'Audio')
97-
case 'other':
98-
return t('spreed', 'Other')
98+
case SHARED_ITEM.TYPES.OTHER:
9999
default:
100-
return ''
100+
return t('spreed', 'Other')
101101
}
102102
},
103103
104104
buttonTitle() {
105105
switch (this.type) {
106-
case 'media':
106+
case SHARED_ITEM.TYPES.MEDIA:
107107
return t('spreed', 'Show all media')
108-
case 'file':
108+
case SHARED_ITEM.TYPES.FILE:
109109
return t('spreed', 'Show all files')
110-
case 'deck-card':
110+
case SHARED_ITEM.TYPES.DECK_CARD:
111111
return t('spreed', 'Show all deck cards')
112-
case 'voice':
112+
case SHARED_ITEM.TYPES.VOICE:
113113
return t('spreed', 'Show all voice messages')
114-
case 'location':
114+
case SHARED_ITEM.TYPES.LOCATION:
115115
return t('spreed', 'Show all locations')
116-
case 'audio':
116+
case SHARED_ITEM.TYPES.AUDIO:
117117
return t('spreed', 'Show all audio')
118-
case 'other':
119-
return t('spreed', 'Show all other')
118+
case SHARED_ITEM.TYPES.OTHER:
120119
default:
121-
return ''
120+
return t('spreed', 'Show all other')
122121
}
123122
},
124123
125124
isList() {
126125
switch (this.type) {
127-
case 'media':
126+
case SHARED_ITEM.TYPES.MEDIA:
128127
return false
129-
case 'locations':
128+
case SHARED_ITEM.TYPES.LOCATION:
130129
return false
131130
default:
132131
return true

src/components/RightSidebar/SharedItems/SharedItemsTab.vue

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
<script>
3939
import { CollectionList } from 'nextcloud-vue-collections'
4040
import SharedItems from './SharedItems'
41+
import { SHARED_ITEM } from '../../../constants'
4142
import AppNavigationCaption from '@nextcloud/vue/dist/Components/AppNavigationCaption'
4243
4344
export default {
@@ -81,8 +82,8 @@ export default {
8182
8283
// Defines the order of the sections
8384
sharedItemsOrder() {
84-
// FIXME restore when non files work return ['media', 'file', 'voice', 'audio', 'location', 'deckcard', 'other']
85-
return ['media', 'file', 'voice', 'audio']
85+
// FIXME restore when non files work return [SHARED_ITEM.TYPES.MEDIA, SHARED_ITEM.TYPES.FILE, SHARED_ITEM.TYPES.VOICE, SHARED_ITEM.TYPES.AUDIO, SHARED_ITEM.TYPES.LOCATION, SHARED_ITEM.TYPES.DECK_CARD, SHARED_ITEM.TYPES.OTHER]
86+
return [SHARED_ITEM.TYPES.MEDIA, SHARED_ITEM.TYPES.FILE, SHARED_ITEM.TYPES.VOICE, SHARED_ITEM.TYPES.AUDIO]
8687
},
8788
},
8889

src/constants.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,17 @@ export const PARTICIPANT = {
104104
MAX_CUSTOM: 127,
105105
},
106106
}
107+
export const SHARED_ITEM = {
108+
TYPES: {
109+
AUDIO: 'audio',
110+
DECK_CARD: 'deckcard',
111+
FILE: 'file',
112+
LOCATION: 'location',
113+
MEDIA: 'media',
114+
OTHER: 'other',
115+
VOICE: 'voice',
116+
},
117+
}
107118
export const WEBINAR = {
108119
LOBBY: {
109120
NONE: 0,

src/store/conversationSharedItemsStore.js

Lines changed: 72 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,34 @@
2222

2323
import Vue from 'vue'
2424
import { getSharedItemsOverview, getSharedItems } from '../services/conversationSharedItemsService'
25+
import { SHARED_ITEM } from '../constants'
2526

26-
// Store structure
27+
const getItemTypeFromMessage = function(message) {
28+
if (message.message === '{object}') {
29+
if (message.messageParameters.object.type === 'geo-location') {
30+
return SHARED_ITEM.TYPES.LOCATION
31+
} else if (message.messageParameters.object.type === 'deck-card') {
32+
return SHARED_ITEM.TYPES.DECK_CARD
33+
} else {
34+
return SHARED_ITEM.TYPES.OTHER
35+
}
36+
} else {
37+
const messageType = message.messageType || ''
38+
const mimetype = message.messageParameters.file?.mimetype || ''
39+
40+
if (messageType === 'voice-message') {
41+
return SHARED_ITEM.TYPES.VOICE
42+
} else if (mimetype.startsWith('audio/')) {
43+
return SHARED_ITEM.TYPES.AUDIO
44+
} else if (mimetype.startsWith('image/') || mimetype.startsWith('video/')) {
45+
return SHARED_ITEM.TYPES.MEDIA
46+
} else {
47+
return SHARED_ITEM.TYPES.FILE
48+
}
49+
}
50+
}
51+
52+
// sharedItemsByConversationAndType structure
2753
// token: {
2854
// media: {},
2955
// file: {},
@@ -32,20 +58,22 @@ import { getSharedItemsOverview, getSharedItems } from '../services/conversation
3258
// location: {}
3359
// deckcard: {},
3460
// other: {},
61+
// },
3562

36-
const state = () => ({
37-
state: {},
38-
})
63+
const state = {
64+
sharedItemsByConversationAndType: {},
65+
overviewLoaded: {},
66+
}
3967

4068
const getters = {
4169
sharedItems: state => token => {
4270
const sharedItems = {}
43-
if (!state[token]) {
71+
if (!state.sharedItemsByConversationAndType[token]) {
4472
return {}
4573
}
46-
for (const type of Object.keys(state[token])) {
47-
if (Object.keys(state[token][type]).length !== 0) {
48-
sharedItems[type] = state[token][type]
74+
for (const type of Object.keys(state.sharedItemsByConversationAndType[token])) {
75+
if (Object.keys(state.sharedItemsByConversationAndType[token][type]).length !== 0) {
76+
sharedItems[type] = state.sharedItemsByConversationAndType[token][type]
4977
}
5078
}
5179
return sharedItems
@@ -54,20 +82,34 @@ const getters = {
5482

5583
export const mutations = {
5684
addSharedItemsOverview: (state, { token, data }) => {
57-
if (!state[token]) {
58-
Vue.set(state, token, {})
85+
Vue.set(state.overviewLoaded, token, true)
86+
87+
if (!state.sharedItemsByConversationAndType[token]) {
88+
Vue.set(state.sharedItemsByConversationAndType, token, {})
5989
}
90+
6091
for (const type of Object.keys(data)) {
61-
if (!state[token][type]) {
62-
Vue.set(state[token], type, {})
63-
for (const message of data[type]) {
64-
if (!state[token][type]?.[message.id]) {
65-
Vue.set(state[token][type], message.id, message)
66-
}
67-
}
92+
if (!state.sharedItemsByConversationAndType[token][type]) {
93+
Vue.set(state.sharedItemsByConversationAndType[token], type, {})
94+
}
95+
96+
for (const message of data[type]) {
97+
Vue.set(state.sharedItemsByConversationAndType[token][type], message.id, message)
6898
}
6999
}
70100
},
101+
102+
addSharedItemMessage: (state, { token, type, message }) => {
103+
if (!state.sharedItemsByConversationAndType[token]) {
104+
Vue.set(state.sharedItemsByConversationAndType, token, {})
105+
}
106+
if (!state.sharedItemsByConversationAndType[token][type]) {
107+
Vue.set(state.sharedItemsByConversationAndType[token], type, {})
108+
}
109+
if (!state.sharedItemsByConversationAndType[token][type]?.[message.id]) {
110+
Vue.set(state.sharedItemsByConversationAndType[token][type], message.id, message)
111+
}
112+
},
71113
}
72114

73115
const actions = {
@@ -84,7 +126,11 @@ const actions = {
84126
}
85127
},
86128

87-
async getSharedItemsOverview({ commit }, { token }) {
129+
async getSharedItemsOverview({ commit, state }, { token }) {
130+
if (state.overviewLoaded[token]) {
131+
return
132+
}
133+
88134
try {
89135
const response = await getSharedItemsOverview(token, 10)
90136
commit('addSharedItemsOverview', {
@@ -95,6 +141,14 @@ const actions = {
95141
console.debug(error)
96142
}
97143
},
144+
145+
async addSharedItemMessage({ commit }, { message }) {
146+
commit('addSharedItemMessage', {
147+
token: message.token,
148+
type: getItemTypeFromMessage(message),
149+
message,
150+
})
151+
},
98152
}
99153

100154
export default { state, mutations, getters, actions }

src/store/messagesStore.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,13 @@ const actions = {
412412
}
413413

414414
context.commit('addMessage', message)
415+
416+
if ((message.messageType === 'comment' && message.message === '{file}' && message.messageParameters?.file)
417+
|| (message.messageType === 'comment' && message.message === '{object}' && message.messageParameters?.object)) {
418+
context.dispatch('addSharedItemMessage', {
419+
message,
420+
})
421+
}
415422
},
416423

417424
/**

0 commit comments

Comments
 (0)