2222
2323import Vue from 'vue'
2424import { 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
4068const 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
5583export 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
73115const 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
100154export default { state, mutations, getters, actions }
0 commit comments