11import React from 'react' ;
22import { AppInfoStateType , MessageTemplatesInfo , ProcessedMessageTemplate } from '../dux/appInfo/initialState' ;
33import { SendbirdMessageTemplate } from '../../ui/TemplateMessageItemBody/types' ;
4- import { getProcessedTemplate , getProcessedTemplates } from '../dux/appInfo/utils' ;
4+ import { getProcessedTemplate , getProcessedTemplatesMap } from '../dux/appInfo/utils' ;
55import SendbirdChat from '@sendbird/chat' ;
66import { APP_INFO_ACTIONS , AppInfoActionTypes } from '../dux/appInfo/actionTypes' ;
77import { CACHED_MESSAGE_TEMPLATES_KEY , CACHED_MESSAGE_TEMPLATES_TOKEN_KEY } from '../../utils/consts' ;
@@ -18,15 +18,15 @@ interface UseMessageTemplateUtilsProps {
1818
1919export interface UseMessageTemplateUtilsWrapper {
2020 getCachedTemplate : ( key : string ) => ProcessedMessageTemplate | null ;
21- updateMessageTemplatesInfo : ( templateKey : string , requestedAt : number ) => Promise < void > ;
21+ updateMessageTemplatesInfo : ( templateKeys : string [ ] , messageId : number , requestedAt : number ) => Promise < void > ;
2222 initializeMessageTemplatesInfo : ( readySdk : SendbirdChat ) => Promise < void > ;
2323}
2424
2525const {
2626 INITIALIZE_MESSAGE_TEMPLATES_INFO ,
27- UPSERT_MESSAGE_TEMPLATE ,
28- UPSERT_WAITING_TEMPLATE_KEY ,
29- MARK_ERROR_WAITING_TEMPLATE_KEY ,
27+ UPSERT_MESSAGE_TEMPLATES ,
28+ UPSERT_WAITING_TEMPLATE_KEYS ,
29+ MARK_ERROR_WAITING_TEMPLATE_KEYS ,
3030} = APP_INFO_ACTIONS ;
3131
3232export default function useMessageTemplateUtils ( {
@@ -105,7 +105,7 @@ export default function useMessageTemplateUtils({
105105 const parsedTemplates = await fetchAllMessageTemplates ( readySdk ) ;
106106 const newMessageTemplatesInfo : MessageTemplatesInfo = {
107107 token : sdkMessageTemplateToken ,
108- templatesMap : getProcessedTemplates ( parsedTemplates ) ,
108+ templatesMap : getProcessedTemplatesMap ( parsedTemplates ) ,
109109 } ;
110110 appInfoDispatcher ( { type : INITIALIZE_MESSAGE_TEMPLATES_INFO , payload : newMessageTemplatesInfo } ) ;
111111 localStorage . setItem ( CACHED_MESSAGE_TEMPLATES_TOKEN_KEY , sdkMessageTemplateToken ) ;
@@ -118,7 +118,7 @@ export default function useMessageTemplateUtils({
118118 const parsedTemplates : SendbirdMessageTemplate [ ] = JSON . parse ( cachedMessageTemplates ) ;
119119 const newMessageTemplatesInfo : MessageTemplatesInfo = {
120120 token : sdkMessageTemplateToken ,
121- templatesMap : getProcessedTemplates ( parsedTemplates ) ,
121+ templatesMap : getProcessedTemplatesMap ( parsedTemplates ) ,
122122 } ;
123123 appInfoDispatcher ( { type : INITIALIZE_MESSAGE_TEMPLATES_INFO , payload : newMessageTemplatesInfo } ) ;
124124 }
@@ -128,54 +128,72 @@ export default function useMessageTemplateUtils({
128128 * If given message is a template message with template key and if the key does not exist in the cache,
129129 * update the cache by fetching the template.
130130 */
131- const updateMessageTemplatesInfo = async ( templateKey : string , requestedAt : number ) : Promise < void > => {
131+ const updateMessageTemplatesInfo = async (
132+ templateKeys : string [ ] ,
133+ messageId : number ,
134+ requestedAt : number ,
135+ ) : Promise < void > => {
132136 if ( appInfoDispatcher ) {
133137 appInfoDispatcher ( {
134- type : UPSERT_WAITING_TEMPLATE_KEY ,
138+ type : UPSERT_WAITING_TEMPLATE_KEYS ,
135139 payload : {
136- key : templateKey ,
140+ keys : templateKeys ,
137141 requestedAt,
138142 } ,
139143 } ) ;
140-
141- let parsedTemplate : SendbirdMessageTemplate | null = null ;
144+ const newParsedTemplates : SendbirdMessageTemplate [ ] | null = [ ] ;
142145 try {
143- const newTemplate = await sdk . message . getMessageTemplate ( templateKey ) ;
144- parsedTemplate = JSON . parse ( newTemplate . template ) ;
146+ let hasMore = true ;
147+ let token = null ;
148+ while ( hasMore ) {
149+ const result = await sdk . message . getMessageTemplatesByToken ( token , {
150+ keys : templateKeys ,
151+ } ) ;
152+ result . templates . forEach ( ( newTemplate ) => {
153+ newParsedTemplates . push ( JSON . parse ( newTemplate . template ) ) ;
154+ } ) ;
155+ hasMore = result . hasMore ;
156+ token = result . token ;
157+ }
145158 } catch ( e ) {
146- logger ?. error ?.( 'Sendbird | fetchProcessedMessageTemplate failed' , e ) ;
159+ logger ?. error ?.( 'Sendbird | fetchProcessedMessageTemplates failed' , e , templateKeys ) ;
147160 }
148-
149- if ( parsedTemplate ) {
161+ if ( newParsedTemplates . length > 0 ) {
150162 // Update cache
151163 const cachedMessageTemplates : string | null = localStorage . getItem ( CACHED_MESSAGE_TEMPLATES_KEY ) ;
152164 if ( cachedMessageTemplates ) {
153165 const parsedTemplates : SendbirdMessageTemplate [ ] = JSON . parse ( cachedMessageTemplates ) ;
154- parsedTemplates . push ( parsedTemplate ) ;
166+ const existingKeys = parsedTemplates . map ( ( parsedTemplate ) => parsedTemplate . key ) ;
167+ newParsedTemplates . forEach ( ( newParsedTemplate ) => {
168+ if ( ! existingKeys . includes ( newParsedTemplate . key ) ) {
169+ parsedTemplates . push ( newParsedTemplate ) ;
170+ }
171+ } ) ;
155172 localStorage . setItem ( CACHED_MESSAGE_TEMPLATES_KEY , JSON . stringify ( parsedTemplates ) ) ;
156173 } else {
157- localStorage . setItem ( CACHED_MESSAGE_TEMPLATES_KEY , JSON . stringify ( [ parsedTemplate ] ) ) ;
174+ localStorage . setItem ( CACHED_MESSAGE_TEMPLATES_KEY , JSON . stringify ( [ newParsedTemplates ] ) ) ;
158175 }
159176 // Update memory
160- const processedTemplate : ProcessedMessageTemplate = getProcessedTemplate ( parsedTemplate ) ;
161177 appInfoDispatcher ( {
162- type : UPSERT_MESSAGE_TEMPLATE ,
163- payload : {
164- key : templateKey ,
165- template : processedTemplate ,
166- } ,
178+ type : UPSERT_MESSAGE_TEMPLATES ,
179+ payload : newParsedTemplates . map ( ( newParsedTemplate ) => {
180+ return {
181+ key : newParsedTemplate . key ,
182+ template : getProcessedTemplate ( newParsedTemplate ) ,
183+ } ;
184+ } ) ,
167185 } ) ;
168186 } else {
169187 appInfoDispatcher ( {
170- type : MARK_ERROR_WAITING_TEMPLATE_KEY ,
188+ type : MARK_ERROR_WAITING_TEMPLATE_KEYS ,
171189 payload : {
172- key : templateKey ,
190+ keys : templateKeys ,
191+ messageId,
173192 } ,
174193 } ) ;
175194 }
176195 }
177196 } ;
178-
179197 return {
180198 getCachedTemplate,
181199 updateMessageTemplatesInfo,
0 commit comments