@sendbird/ai-agent-messenger-react 1.17.0 → 1.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/cjs/9pP8_kBW.cjs +1 -0
  2. package/dist/cjs/B9Q2LOZZ.cjs +1 -0
  3. package/dist/cjs/{CbkA2p0b.cjs → Bu3zzr6j.cjs} +1 -1
  4. package/dist/cjs/BuBoF2qI.cjs +1 -0
  5. package/dist/cjs/CZIjo9nb.cjs +1 -0
  6. package/dist/cjs/D11KPdOs.cjs +1 -0
  7. package/dist/cjs/DAF2JUxO.cjs +1 -0
  8. package/dist/cjs/DAP4nAvQ.cjs +1 -0
  9. package/dist/cjs/DBHlAmeA.cjs +1 -0
  10. package/dist/cjs/DEGDJBmd.cjs +1 -0
  11. package/dist/cjs/DXUsaL2W.cjs +330 -0
  12. package/dist/cjs/DqdBRt6e.cjs +1 -0
  13. package/dist/cjs/GQlGFYP2.cjs +1 -0
  14. package/dist/cjs/gbzRqe1a.cjs +1 -0
  15. package/dist/cjs/oKi8u6wj.cjs +1 -0
  16. package/dist/es/{CNexWEM3.js → 3LbHdnQ8.js} +20 -14
  17. package/dist/es/{CAEiRRZ2.js → BFTnuMEy.js} +19 -13
  18. package/dist/es/{DIXZOSKS.js → BSu_ZpXq.js} +17 -11
  19. package/dist/es/{DUaBaiMV.js → BatMiKXs.js} +18 -12
  20. package/dist/es/{BgPmlRRI.js → Bo9TA_Z-.js} +21 -15
  21. package/dist/es/{B3kItOVy.js → C60MlOyZ.js} +1 -1
  22. package/dist/es/{BTU2lQ0s.js → CeWycJIw.js} +24 -18
  23. package/dist/es/{BCQjlPPt.js → CjvNmTwL.js} +19 -13
  24. package/dist/es/Cv8qOSU6.js +5 -0
  25. package/dist/es/{81y7Pu9p.js → DJzTBusb.js} +17 -11
  26. package/dist/es/Dp48Y7fJ.js +5 -0
  27. package/dist/es/{BAb_pPqd.js → Dzr6sXdx.js} +2861 -2598
  28. package/dist/es/ewYUFKEK.js +5 -0
  29. package/dist/es/{lYZg4xku.js → hblOq7Ks.js} +18 -12
  30. package/dist/es/hu7PS5ZI.js +5 -0
  31. package/dist/index.cjs +1 -1
  32. package/dist/index.d.ts +487 -27
  33. package/dist/index.js +1 -1
  34. package/package.json +2 -2
  35. package/dist/cjs/C5lX5LQR.cjs +0 -1
  36. package/dist/cjs/CNa0-eAY.cjs +0 -1
  37. package/dist/cjs/CUee2Pmu.cjs +0 -1
  38. package/dist/cjs/D5vtBiPX.cjs +0 -1
  39. package/dist/cjs/DA_vneB6.cjs +0 -1
  40. package/dist/cjs/DKm5JuUx.cjs +0 -306
  41. package/dist/cjs/DPnOw54X.cjs +0 -1
  42. package/dist/cjs/YHH1eQbl.cjs +0 -1
  43. package/dist/cjs/e2wnpTfT.cjs +0 -1
  44. package/dist/cjs/mi34snx7.cjs +0 -1
package/dist/index.d.ts CHANGED
@@ -19,6 +19,8 @@ import { JSX } from 'react/jsx-runtime';
19
19
  import { LazyExoticComponent } from 'react';
20
20
  import type { Locale } from 'date-fns';
21
21
  import { LogLevel as LogLevel_2 } from '@sendbird/chat';
22
+ import { MultipleFilesMessage } from '@sendbird/chat/message';
23
+ import { MultipleFilesMessageCreateParams } from '@sendbird/chat/message';
22
24
  import { PropsWithChildren } from 'react';
23
25
  import { ReactNode } from 'react';
24
26
  import { RefAttributes } from 'react';
@@ -269,10 +271,6 @@ origin?: string;
269
271
  messageTemplate?: {
270
272
  __internalVariables?: InternalMessageTemplateVariables;
271
273
  };
272
- /**
273
- * @internal DO NOT USE THIS - Used for conversation initial render stat tracking.
274
- */
275
- presentMethod?: PresentMethod;
276
274
  } & {
277
275
  children?: ReactNode | undefined;
278
276
  } & RefAttributes<MessengerSessionRef>>;
@@ -411,13 +409,13 @@ declare interface AIAgentConfig {
411
409
  photoEnabled?: boolean;
412
410
  };
413
411
  /**
414
- * (React-Native only) Whether to enable the gallery option in the attachment menu.
412
+ * Whether to enable the gallery/photo option in the attachment menu.
415
413
  * */
416
414
  gallery?: {
417
415
  photoEnabled?: boolean;
418
416
  };
419
417
  /**
420
- * (React-Native only) Whether to enable the file option in the attachment menu.
418
+ * Whether to enable the file option in the attachment menu.
421
419
  * */
422
420
  fileEnabled?: boolean;
423
421
  };
@@ -476,8 +474,11 @@ declare interface AIAgentConversationContextValue {
476
474
  loadNext: () => Promise<void>;
477
475
  sendUserMessage: (params: UserMessageCreateParams) => Promise<UserMessage>;
478
476
  sendFileMessage: (params: FileMessageCreateParams) => Promise<FileMessage>;
479
- deleteMessage: (message: UserMessage | FileMessage) => Promise<void>;
480
- resendMessage: (message: UserMessage | FileMessage) => Promise<UserMessage | FileMessage>;
477
+ sendMultipleFilesMessage: (params: MultipleFilesMessageCreateParams) => Promise<MultipleFilesMessage>;
478
+ deleteMessage: (message: UserMessage | FileMessage | MultipleFilesMessage) => Promise<void>;
479
+ resendMessage: (
480
+ message: UserMessage | FileMessage | MultipleFilesMessage,
481
+ ) => Promise<UserMessage | FileMessage | MultipleFilesMessage>;
481
482
  resetNewMessages: () => void;
482
483
  };
483
484
 
@@ -568,7 +569,6 @@ declare interface AIAgentMessengerSessionContextValue {
568
569
  userSession: null | UserSession;
569
570
  aiAgentInfo: null | AIAgentInfo;
570
571
  launcherInfo: null | LauncherInfo;
571
- presentMethod: PresentMethod;
572
572
 
573
573
  connectionError?: Error;
574
574
 
@@ -755,10 +755,6 @@ export declare type AIAgentProps = PropsWithChildren<{
755
755
  messageTemplate?: {
756
756
  __internalVariables?: InternalMessageTemplateVariables;
757
757
  };
758
- /**
759
- * @internal DO NOT USE THIS - Used for conversation initial render stat tracking.
760
- */
761
- presentMethod?: PresentMethod;
762
758
  }>;
763
759
 
764
760
  declare interface AIAgentQueryParams {
@@ -816,6 +812,7 @@ declare interface AIAgentStringSet {
816
812
  header_title: string;
817
813
  ended: string;
818
814
  footer_title: string;
815
+ multiple_files_count: (count: number) => string;
819
816
  };
820
817
 
821
818
  date_format: {
@@ -910,7 +907,9 @@ declare type BaseMessageProps<T> = T & {
910
907
  maxBodyWidth?: number;
911
908
 
912
909
  // handlers
910
+ /** @deprecated Use onClickMediaFiles instead */
913
911
  onClickMedia?: (params: { url: string; type: string }) => void;
912
+ onClickMediaFiles?: (params: { files: Array<{ url: string; type: string; name?: string }>; index: number }) => void;
914
913
  onClickFile?: (params: { url: string; type: string }) => void;
915
914
 
916
915
  children?: ReactNode;
@@ -1055,11 +1054,11 @@ declare interface ConversationHeaderTemplateProps {
1055
1054
  }
1056
1055
 
1057
1056
  declare class ConversationInitialRenderStats extends AIAgentBaseStats {
1058
- private presentMethod: PresentMethod;
1057
+ private presentMethod: PresentMethod = 'direct_present';
1059
1058
 
1060
- constructor(presentMethod: PresentMethod) {
1061
- super();
1062
- this.presentMethod = presentMethod;
1059
+ setPresentMethod(method: PresentMethod): this {
1060
+ this.presentMethod = method;
1061
+ return this;
1063
1062
  }
1064
1063
 
1065
1064
  protected getMetricKey(): string {
@@ -1102,18 +1101,18 @@ declare class ConversationInitialRenderStats extends AIAgentBaseStats {
1102
1101
  */
1103
1102
  declare class ConversationInitialRenderStatsTracker {
1104
1103
  private readonly commitCallback: StatsAppendCallback;
1105
- private readonly presentMethod: PresentMethod;
1104
+ private presentMethod: PresentMethod = 'direct_present';
1106
1105
  private stats: ConversationInitialRenderStats | null = null;
1107
1106
 
1108
- constructor(commitCallback: StatsAppendCallback, presentMethod: PresentMethod) {
1107
+ constructor(commitCallback: StatsAppendCallback) {
1109
1108
  this.commitCallback = commitCallback;
1110
- this.presentMethod = presentMethod;
1111
1109
  }
1112
1110
 
1113
1111
  private getOrCreateStats(): ConversationInitialRenderStats {
1114
1112
  if (!this.stats || this.stats.isCommitted()) {
1115
- this.stats = new ConversationInitialRenderStats(this.presentMethod);
1116
- this.stats.setCommitCallback(this.commitCallback);
1113
+ this.stats = new ConversationInitialRenderStats()
1114
+ .setCommitCallback(this.commitCallback)
1115
+ .setPresentMethod(this.presentMethod);
1117
1116
  }
1118
1117
  return this.stats;
1119
1118
  }
@@ -1189,6 +1188,11 @@ declare class ConversationInitialRenderStatsTracker {
1189
1188
  this.stats?.commit();
1190
1189
  }
1191
1190
 
1191
+ setPresentMethod(method: PresentMethod): void {
1192
+ this.presentMethod = method;
1193
+ this.stats?.setPresentMethod(method);
1194
+ }
1195
+
1192
1196
  clear(): void {
1193
1197
  this.stats = null;
1194
1198
  }
@@ -1693,6 +1697,10 @@ declare const icons: {
1693
1697
  readonly 'good-filled': LazyExoticComponent<FC<SVGProps<SVGElement>>>;
1694
1698
  readonly 'bad-filled': LazyExoticComponent<FC<SVGProps<SVGElement>>>;
1695
1699
  readonly delight: LazyExoticComponent<FC<SVGProps<SVGElement>>>;
1700
+ readonly photo: LazyExoticComponent<FC<SVGProps<SVGElement>>>;
1701
+ readonly 'arrow-left': LazyExoticComponent<FC<SVGProps<SVGElement>>>;
1702
+ readonly add: LazyExoticComponent<FC<SVGProps<SVGElement>>>;
1703
+ readonly document: LazyExoticComponent<FC<SVGProps<SVGElement>>>;
1696
1704
  };
1697
1705
 
1698
1706
  declare type IconType = keyof typeof icons;
@@ -1735,6 +1743,10 @@ BaseMessageProps<{
1735
1743
  messageTemplateLoadingFallback?: ReactNode;
1736
1744
  }>;
1737
1745
 
1746
+ declare function IncomingFileBody({ file, children, onClickFile }: IncomingMessageProps<'file'>): JSX.Element;
1747
+
1748
+ declare function IncomingMediaBody({ file, onClickMedia, onClickMediaFiles, children, }: IncomingMessageBodyProps<'file'>): JSX.Element | null;
1749
+
1738
1750
  declare type IncomingMessageBodyProps<T extends MessageType = MessageType> = IncomingMessageProps<T> & {
1739
1751
  customStyle?: {
1740
1752
  bubbleContentColor?: string;
@@ -1751,6 +1763,10 @@ export declare const IncomingMessageLayout: {
1751
1763
  SenderAvatar: ({ sender, isBotMessage, }: Pick<IncomingMessageProps, "sender" | "isBotMessage">) => ReactNode;
1752
1764
  SentTime: ({ createdAt }: Pick<IncomingMessageProps, "createdAt">) => ReactNode;
1753
1765
  MessageBody: (props: IncomingMessageBodyProps) => ReactNode;
1766
+ TextMessageBody: typeof IncomingTextBody;
1767
+ MediaMessageBody: typeof IncomingMediaBody;
1768
+ FileMessageBody: typeof IncomingFileBody;
1769
+ MultipleFilesMessageBody: ({ files, children, onClickMedia, onClickMediaFiles, }: IncomingMessageBodyProps<"multipleFiles">) => JSX.Element;
1754
1770
  TypingIndicator: ({ customStyle }: IncomingMessageProps & {
1755
1771
  customStyle?: {
1756
1772
  bubbleContentColor?: string;
@@ -1820,6 +1836,14 @@ export declare const IncomingMessageLayout: {
1820
1836
  url: string;
1821
1837
  type: string;
1822
1838
  }) => void;
1839
+ onClickMediaFiles?: (params: {
1840
+ files: Array<{
1841
+ url: string;
1842
+ type: string;
1843
+ name?: string;
1844
+ }>;
1845
+ index: number;
1846
+ }) => void;
1823
1847
  onClickFile?: (params: {
1824
1848
  url: string;
1825
1849
  type: string;
@@ -1884,6 +1908,86 @@ export declare const IncomingMessageLayout: {
1884
1908
  url: string;
1885
1909
  type: string;
1886
1910
  }) => void;
1911
+ onClickMediaFiles?: (params: {
1912
+ files: Array<{
1913
+ url: string;
1914
+ type: string;
1915
+ name?: string;
1916
+ }>;
1917
+ index: number;
1918
+ }) => void;
1919
+ onClickFile?: (params: {
1920
+ url: string;
1921
+ type: string;
1922
+ }) => void;
1923
+ children?: ReactNode;
1924
+ }) | ({
1925
+ messageType: "multipleFiles";
1926
+ message: string;
1927
+ files: {
1928
+ type: string;
1929
+ url: string;
1930
+ name: string;
1931
+ }[];
1932
+ } & {
1933
+ sender: {
1934
+ nickname: string;
1935
+ profileUrl?: string;
1936
+ };
1937
+ suggestedRepliesVisible?: boolean;
1938
+ suggestedRepliesDirection?: "vertical" | "horizontal";
1939
+ isBotMessage?: boolean;
1940
+ isTyping?: boolean;
1941
+ isStreaming?: boolean;
1942
+ isHandedOff?: boolean;
1943
+ isConversationClosed?: boolean;
1944
+ isFeedbackEnabled?: boolean;
1945
+ isFeedbackCommentEnabled?: boolean;
1946
+ isSenderAvatarVisible?: boolean;
1947
+ onGetCachedMessageTemplate?: (templateKey: string) => string | null;
1948
+ onRequestMessageTemplate?: (templateKey: string) => Promise<string>;
1949
+ onHandleTemplateInternalAction?: (action: Action) => void;
1950
+ onClickSuggestedReply?: (params: {
1951
+ reply: string;
1952
+ }) => void;
1953
+ onClickCTA?: (params: {
1954
+ url: string;
1955
+ }) => void;
1956
+ onClickCitation?: (citation: CitationInfo) => void;
1957
+ onFeedbackUpdate?: (params: {
1958
+ rating: "good" | "bad";
1959
+ comment?: string;
1960
+ } | null) => void;
1961
+ onSubmitForm?: (params: {
1962
+ key: string;
1963
+ data: Record<string, FormFieldValue>;
1964
+ }) => Promise<void>;
1965
+ onCancelForm?: (params: {
1966
+ key: string;
1967
+ }) => Promise<void>;
1968
+ onStreamAnimationStart?: () => void;
1969
+ onStreamAnimationProgress?: () => void;
1970
+ onStreamAnimationComplete?: () => void;
1971
+ messageTemplateErrorFallback?: ReactNode;
1972
+ messageTemplateLoadingFallback?: ReactNode;
1973
+ } & {
1974
+ data?: string;
1975
+ createdAt?: number;
1976
+ extendedMessagePayload?: Partial<ExtendedMessagePayload>;
1977
+ groupType?: MessageGroupType;
1978
+ maxBodyWidth?: number;
1979
+ onClickMedia?: (params: {
1980
+ url: string;
1981
+ type: string;
1982
+ }) => void;
1983
+ onClickMediaFiles?: (params: {
1984
+ files: Array<{
1985
+ url: string;
1986
+ type: string;
1987
+ name?: string;
1988
+ }>;
1989
+ index: number;
1990
+ }) => void;
1887
1991
  onClickFile?: (params: {
1888
1992
  url: string;
1889
1993
  type: string;
@@ -1906,6 +2010,10 @@ export declare const IncomingMessageLayout: {
1906
2010
  SenderAvatar: ({ sender, isBotMessage, }: Pick<IncomingMessageProps, "sender" | "isBotMessage">) => ReactNode;
1907
2011
  SentTime: ({ createdAt }: Pick<IncomingMessageProps, "createdAt">) => ReactNode;
1908
2012
  MessageBody: (props: IncomingMessageBodyProps) => ReactNode;
2013
+ TextMessageBody: typeof IncomingTextBody;
2014
+ MediaMessageBody: typeof IncomingMediaBody;
2015
+ FileMessageBody: typeof IncomingFileBody;
2016
+ MultipleFilesMessageBody: ({ files, children, onClickMedia, onClickMediaFiles, }: IncomingMessageBodyProps<"multipleFiles">) => JSX.Element;
1909
2017
  TypingIndicator: ({ customStyle }: IncomingMessageProps & {
1910
2018
  customStyle?: {
1911
2019
  bubbleContentColor?: string;
@@ -1975,6 +2083,14 @@ export declare const IncomingMessageLayout: {
1975
2083
  url: string;
1976
2084
  type: string;
1977
2085
  }) => void;
2086
+ onClickMediaFiles?: (params: {
2087
+ files: Array<{
2088
+ url: string;
2089
+ type: string;
2090
+ name?: string;
2091
+ }>;
2092
+ index: number;
2093
+ }) => void;
1978
2094
  onClickFile?: (params: {
1979
2095
  url: string;
1980
2096
  type: string;
@@ -2039,6 +2155,86 @@ export declare const IncomingMessageLayout: {
2039
2155
  url: string;
2040
2156
  type: string;
2041
2157
  }) => void;
2158
+ onClickMediaFiles?: (params: {
2159
+ files: Array<{
2160
+ url: string;
2161
+ type: string;
2162
+ name?: string;
2163
+ }>;
2164
+ index: number;
2165
+ }) => void;
2166
+ onClickFile?: (params: {
2167
+ url: string;
2168
+ type: string;
2169
+ }) => void;
2170
+ children?: ReactNode;
2171
+ }) | ({
2172
+ messageType: "multipleFiles";
2173
+ message: string;
2174
+ files: {
2175
+ type: string;
2176
+ url: string;
2177
+ name: string;
2178
+ }[];
2179
+ } & {
2180
+ sender: {
2181
+ nickname: string;
2182
+ profileUrl?: string;
2183
+ };
2184
+ suggestedRepliesVisible?: boolean;
2185
+ suggestedRepliesDirection?: "vertical" | "horizontal";
2186
+ isBotMessage?: boolean;
2187
+ isTyping?: boolean;
2188
+ isStreaming?: boolean;
2189
+ isHandedOff?: boolean;
2190
+ isConversationClosed?: boolean;
2191
+ isFeedbackEnabled?: boolean;
2192
+ isFeedbackCommentEnabled?: boolean;
2193
+ isSenderAvatarVisible?: boolean;
2194
+ onGetCachedMessageTemplate?: (templateKey: string) => string | null;
2195
+ onRequestMessageTemplate?: (templateKey: string) => Promise<string>;
2196
+ onHandleTemplateInternalAction?: (action: Action) => void;
2197
+ onClickSuggestedReply?: (params: {
2198
+ reply: string;
2199
+ }) => void;
2200
+ onClickCTA?: (params: {
2201
+ url: string;
2202
+ }) => void;
2203
+ onClickCitation?: (citation: CitationInfo) => void;
2204
+ onFeedbackUpdate?: (params: {
2205
+ rating: "good" | "bad";
2206
+ comment?: string;
2207
+ } | null) => void;
2208
+ onSubmitForm?: (params: {
2209
+ key: string;
2210
+ data: Record<string, FormFieldValue>;
2211
+ }) => Promise<void>;
2212
+ onCancelForm?: (params: {
2213
+ key: string;
2214
+ }) => Promise<void>;
2215
+ onStreamAnimationStart?: () => void;
2216
+ onStreamAnimationProgress?: () => void;
2217
+ onStreamAnimationComplete?: () => void;
2218
+ messageTemplateErrorFallback?: ReactNode;
2219
+ messageTemplateLoadingFallback?: ReactNode;
2220
+ } & {
2221
+ data?: string;
2222
+ createdAt?: number;
2223
+ extendedMessagePayload?: Partial<ExtendedMessagePayload>;
2224
+ groupType?: MessageGroupType;
2225
+ maxBodyWidth?: number;
2226
+ onClickMedia?: (params: {
2227
+ url: string;
2228
+ type: string;
2229
+ }) => void;
2230
+ onClickMediaFiles?: (params: {
2231
+ files: Array<{
2232
+ url: string;
2233
+ type: string;
2234
+ name?: string;
2235
+ }>;
2236
+ index: number;
2237
+ }) => void;
2042
2238
  onClickFile?: (params: {
2043
2239
  url: string;
2044
2240
  type: string;
@@ -2056,6 +2252,10 @@ export declare const IncomingMessageLayout: {
2056
2252
  SenderAvatar: ({ sender, isBotMessage, }: Pick<IncomingMessageProps, "sender" | "isBotMessage">) => ReactNode;
2057
2253
  SentTime: ({ createdAt }: Pick<IncomingMessageProps, "createdAt">) => ReactNode;
2058
2254
  MessageBody: (props: IncomingMessageBodyProps) => ReactNode;
2255
+ TextMessageBody: typeof IncomingTextBody;
2256
+ MediaMessageBody: typeof IncomingMediaBody;
2257
+ FileMessageBody: typeof IncomingFileBody;
2258
+ MultipleFilesMessageBody: ({ files, children, onClickMedia, onClickMediaFiles, }: IncomingMessageBodyProps<"multipleFiles">) => JSX.Element;
2059
2259
  TypingIndicator: ({ customStyle }: IncomingMessageProps & {
2060
2260
  customStyle?: {
2061
2261
  bubbleContentColor?: string;
@@ -2125,6 +2325,14 @@ export declare const IncomingMessageLayout: {
2125
2325
  url: string;
2126
2326
  type: string;
2127
2327
  }) => void;
2328
+ onClickMediaFiles?: (params: {
2329
+ files: Array<{
2330
+ url: string;
2331
+ type: string;
2332
+ name?: string;
2333
+ }>;
2334
+ index: number;
2335
+ }) => void;
2128
2336
  onClickFile?: (params: {
2129
2337
  url: string;
2130
2338
  type: string;
@@ -2189,6 +2397,86 @@ export declare const IncomingMessageLayout: {
2189
2397
  url: string;
2190
2398
  type: string;
2191
2399
  }) => void;
2400
+ onClickMediaFiles?: (params: {
2401
+ files: Array<{
2402
+ url: string;
2403
+ type: string;
2404
+ name?: string;
2405
+ }>;
2406
+ index: number;
2407
+ }) => void;
2408
+ onClickFile?: (params: {
2409
+ url: string;
2410
+ type: string;
2411
+ }) => void;
2412
+ children?: ReactNode;
2413
+ }) | ({
2414
+ messageType: "multipleFiles";
2415
+ message: string;
2416
+ files: {
2417
+ type: string;
2418
+ url: string;
2419
+ name: string;
2420
+ }[];
2421
+ } & {
2422
+ sender: {
2423
+ nickname: string;
2424
+ profileUrl?: string;
2425
+ };
2426
+ suggestedRepliesVisible?: boolean;
2427
+ suggestedRepliesDirection?: "vertical" | "horizontal";
2428
+ isBotMessage?: boolean;
2429
+ isTyping?: boolean;
2430
+ isStreaming?: boolean;
2431
+ isHandedOff?: boolean;
2432
+ isConversationClosed?: boolean;
2433
+ isFeedbackEnabled?: boolean;
2434
+ isFeedbackCommentEnabled?: boolean;
2435
+ isSenderAvatarVisible?: boolean;
2436
+ onGetCachedMessageTemplate?: (templateKey: string) => string | null;
2437
+ onRequestMessageTemplate?: (templateKey: string) => Promise<string>;
2438
+ onHandleTemplateInternalAction?: (action: Action) => void;
2439
+ onClickSuggestedReply?: (params: {
2440
+ reply: string;
2441
+ }) => void;
2442
+ onClickCTA?: (params: {
2443
+ url: string;
2444
+ }) => void;
2445
+ onClickCitation?: (citation: CitationInfo) => void;
2446
+ onFeedbackUpdate?: (params: {
2447
+ rating: "good" | "bad";
2448
+ comment?: string;
2449
+ } | null) => void;
2450
+ onSubmitForm?: (params: {
2451
+ key: string;
2452
+ data: Record<string, FormFieldValue>;
2453
+ }) => Promise<void>;
2454
+ onCancelForm?: (params: {
2455
+ key: string;
2456
+ }) => Promise<void>;
2457
+ onStreamAnimationStart?: () => void;
2458
+ onStreamAnimationProgress?: () => void;
2459
+ onStreamAnimationComplete?: () => void;
2460
+ messageTemplateErrorFallback?: ReactNode;
2461
+ messageTemplateLoadingFallback?: ReactNode;
2462
+ } & {
2463
+ data?: string;
2464
+ createdAt?: number;
2465
+ extendedMessagePayload?: Partial<ExtendedMessagePayload>;
2466
+ groupType?: MessageGroupType;
2467
+ maxBodyWidth?: number;
2468
+ onClickMedia?: (params: {
2469
+ url: string;
2470
+ type: string;
2471
+ }) => void;
2472
+ onClickMediaFiles?: (params: {
2473
+ files: Array<{
2474
+ url: string;
2475
+ type: string;
2476
+ name?: string;
2477
+ }>;
2478
+ index: number;
2479
+ }) => void;
2192
2480
  onClickFile?: (params: {
2193
2481
  url: string;
2194
2482
  type: string;
@@ -2224,6 +2512,18 @@ export declare const IncomingMessageLayout: {
2224
2512
  MessageBody: (props: {
2225
2513
  component: (props: IncomingMessageBodyProps) => ReactNode;
2226
2514
  }) => null;
2515
+ TextMessageBody: (props: {
2516
+ component: typeof IncomingTextBody;
2517
+ }) => null;
2518
+ MediaMessageBody: (props: {
2519
+ component: typeof IncomingMediaBody;
2520
+ }) => null;
2521
+ FileMessageBody: (props: {
2522
+ component: typeof IncomingFileBody;
2523
+ }) => null;
2524
+ MultipleFilesMessageBody: (props: {
2525
+ component: ({ files, children, onClickMedia, onClickMediaFiles, }: IncomingMessageBodyProps<"multipleFiles">) => JSX.Element;
2526
+ }) => null;
2227
2527
  TypingIndicator: (props: {
2228
2528
  component: ({ customStyle }: IncomingMessageProps & {
2229
2529
  customStyle?: {
@@ -2290,6 +2590,14 @@ export declare const IncomingMessageLayout: {
2290
2590
  url: string;
2291
2591
  type: string;
2292
2592
  }) => void;
2593
+ onClickMediaFiles?: (params: {
2594
+ files: Array<{
2595
+ url: string;
2596
+ type: string;
2597
+ name?: string;
2598
+ }>;
2599
+ index: number;
2600
+ }) => void;
2293
2601
  onClickFile?: (params: {
2294
2602
  url: string;
2295
2603
  type: string;
@@ -2354,6 +2662,86 @@ export declare const IncomingMessageLayout: {
2354
2662
  url: string;
2355
2663
  type: string;
2356
2664
  }) => void;
2665
+ onClickMediaFiles?: (params: {
2666
+ files: Array<{
2667
+ url: string;
2668
+ type: string;
2669
+ name?: string;
2670
+ }>;
2671
+ index: number;
2672
+ }) => void;
2673
+ onClickFile?: (params: {
2674
+ url: string;
2675
+ type: string;
2676
+ }) => void;
2677
+ children?: ReactNode;
2678
+ }) | ({
2679
+ messageType: "multipleFiles";
2680
+ message: string;
2681
+ files: {
2682
+ type: string;
2683
+ url: string;
2684
+ name: string;
2685
+ }[];
2686
+ } & {
2687
+ sender: {
2688
+ nickname: string;
2689
+ profileUrl?: string;
2690
+ };
2691
+ suggestedRepliesVisible?: boolean;
2692
+ suggestedRepliesDirection?: "vertical" | "horizontal";
2693
+ isBotMessage?: boolean;
2694
+ isTyping?: boolean;
2695
+ isStreaming?: boolean;
2696
+ isHandedOff?: boolean;
2697
+ isConversationClosed?: boolean;
2698
+ isFeedbackEnabled?: boolean;
2699
+ isFeedbackCommentEnabled?: boolean;
2700
+ isSenderAvatarVisible?: boolean;
2701
+ onGetCachedMessageTemplate?: (templateKey: string) => string | null;
2702
+ onRequestMessageTemplate?: (templateKey: string) => Promise<string>;
2703
+ onHandleTemplateInternalAction?: (action: Action) => void;
2704
+ onClickSuggestedReply?: (params: {
2705
+ reply: string;
2706
+ }) => void;
2707
+ onClickCTA?: (params: {
2708
+ url: string;
2709
+ }) => void;
2710
+ onClickCitation?: (citation: CitationInfo) => void;
2711
+ onFeedbackUpdate?: (params: {
2712
+ rating: "good" | "bad";
2713
+ comment?: string;
2714
+ } | null) => void;
2715
+ onSubmitForm?: (params: {
2716
+ key: string;
2717
+ data: Record<string, FormFieldValue>;
2718
+ }) => Promise<void>;
2719
+ onCancelForm?: (params: {
2720
+ key: string;
2721
+ }) => Promise<void>;
2722
+ onStreamAnimationStart?: () => void;
2723
+ onStreamAnimationProgress?: () => void;
2724
+ onStreamAnimationComplete?: () => void;
2725
+ messageTemplateErrorFallback?: ReactNode;
2726
+ messageTemplateLoadingFallback?: ReactNode;
2727
+ } & {
2728
+ data?: string;
2729
+ createdAt?: number;
2730
+ extendedMessagePayload?: Partial<ExtendedMessagePayload>;
2731
+ groupType?: MessageGroupType;
2732
+ maxBodyWidth?: number;
2733
+ onClickMedia?: (params: {
2734
+ url: string;
2735
+ type: string;
2736
+ }) => void;
2737
+ onClickMediaFiles?: (params: {
2738
+ files: Array<{
2739
+ url: string;
2740
+ type: string;
2741
+ name?: string;
2742
+ }>;
2743
+ index: number;
2744
+ }) => void;
2357
2745
  onClickFile?: (params: {
2358
2746
  url: string;
2359
2747
  type: string;
@@ -2394,8 +2782,19 @@ declare type IncomingMessageUnion =
2394
2782
  url: string;
2395
2783
  name: string;
2396
2784
  };
2785
+ }>
2786
+ | IncomingBaseMessageProps<{
2787
+ messageType: 'multipleFiles';
2788
+ message: string;
2789
+ files: {
2790
+ type: string;
2791
+ url: string;
2792
+ name: string;
2793
+ }[];
2397
2794
  }>;
2398
2795
 
2796
+ declare function IncomingTextBody(props: IncomingMessageBodyProps): JSX.Element | null;
2797
+
2399
2798
  declare type InputState = {
2400
2799
  disabled: boolean;
2401
2800
  disabledBy:
@@ -2698,6 +3097,7 @@ declare interface MessengerSettingsResponse {
2698
3097
  upload_size_limit_per_type: Record<string, number>;
2699
3098
  supported_image_mime_types: string[];
2700
3099
  supported_file_mime_types: string[];
3100
+ max_attachment_count?: number;
2701
3101
  };
2702
3102
  }
2703
3103
 
@@ -2758,6 +3158,10 @@ BaseMessageProps<{
2758
3158
  onClickFailedMessage?: () => void;
2759
3159
  }>;
2760
3160
 
3161
+ declare function OutgoingFileBody({ file, children, onClickFile, sendingStatus }: OutgoingMessageBodyProps<'file'>): JSX.Element;
3162
+
3163
+ declare function OutgoingImageBody({ sendingStatus, file, metadata, onClickMedia, onClickMediaFiles, children, }: OutgoingMessageBodyProps<'file'>): JSX.Element;
3164
+
2761
3165
  declare type OutgoingMessageBodyProps<T extends MessageType_2 = MessageType_2> = OutgoingMessageProps<T> & {
2762
3166
  customStyle?: {
2763
3167
  bubbleContentColor?: string;
@@ -2773,6 +3177,10 @@ export declare const OutgoingMessageLayout: {
2773
3177
  SendingStatus: ({ sendingStatus }: OutgoingMessageProps) => ReactNode;
2774
3178
  SentTime: ({ createdAt }: OutgoingMessageProps) => ReactNode;
2775
3179
  MessageBody: (props: OutgoingMessageBodyProps) => ReactNode;
3180
+ TextMessageBody: typeof OutgoingTextBody;
3181
+ MediaMessageBody: typeof OutgoingImageBody;
3182
+ FileMessageBody: typeof OutgoingFileBody;
3183
+ MultipleFilesMessageBody: ({ sendingStatus, files, metadata, onClickMedia, onClickMediaFiles, children, }: OutgoingMessageBodyProps<"multipleFiles">) => JSX.Element;
2776
3184
  };
2777
3185
  };
2778
3186
  Template: ({ template, children }: {
@@ -2783,11 +3191,19 @@ export declare const OutgoingMessageLayout: {
2783
3191
  SendingStatus: ({ sendingStatus }: OutgoingMessageProps) => ReactNode;
2784
3192
  SentTime: ({ createdAt }: OutgoingMessageProps) => ReactNode;
2785
3193
  MessageBody: (props: OutgoingMessageBodyProps) => ReactNode;
3194
+ TextMessageBody: typeof OutgoingTextBody;
3195
+ MediaMessageBody: typeof OutgoingImageBody;
3196
+ FileMessageBody: typeof OutgoingFileBody;
3197
+ MultipleFilesMessageBody: ({ sendingStatus, files, metadata, onClickMedia, onClickMediaFiles, children, }: OutgoingMessageBodyProps<"multipleFiles">) => JSX.Element;
2786
3198
  }>>;
2787
3199
  useContext: () => LayoutContextValue<OutgoingMessageProps, {
2788
3200
  SendingStatus: ({ sendingStatus }: OutgoingMessageProps) => ReactNode;
2789
3201
  SentTime: ({ createdAt }: OutgoingMessageProps) => ReactNode;
2790
3202
  MessageBody: (props: OutgoingMessageBodyProps) => ReactNode;
3203
+ TextMessageBody: typeof OutgoingTextBody;
3204
+ MediaMessageBody: typeof OutgoingImageBody;
3205
+ FileMessageBody: typeof OutgoingFileBody;
3206
+ MultipleFilesMessageBody: ({ sendingStatus, files, metadata, onClickMedia, onClickMediaFiles, children, }: OutgoingMessageBodyProps<"multipleFiles">) => JSX.Element;
2791
3207
  }>;
2792
3208
  } & {
2793
3209
  SentTime: (props: {
@@ -2796,6 +3212,18 @@ export declare const OutgoingMessageLayout: {
2796
3212
  MessageBody: (props: {
2797
3213
  component: (props: OutgoingMessageBodyProps) => ReactNode;
2798
3214
  }) => null;
3215
+ TextMessageBody: (props: {
3216
+ component: typeof OutgoingTextBody;
3217
+ }) => null;
3218
+ MediaMessageBody: (props: {
3219
+ component: typeof OutgoingImageBody;
3220
+ }) => null;
3221
+ FileMessageBody: (props: {
3222
+ component: typeof OutgoingFileBody;
3223
+ }) => null;
3224
+ MultipleFilesMessageBody: (props: {
3225
+ component: ({ sendingStatus, files, metadata, onClickMedia, onClickMediaFiles, children, }: OutgoingMessageBodyProps<"multipleFiles">) => JSX.Element;
3226
+ }) => null;
2799
3227
  SendingStatus: (props: {
2800
3228
  component: ({ sendingStatus }: OutgoingMessageProps) => ReactNode;
2801
3229
  }) => null;
@@ -2821,8 +3249,22 @@ declare type OutgoingMessageUnion =
2821
3249
  aspectRatio: string;
2822
3250
  localFile?: unknown;
2823
3251
  };
3252
+ }>
3253
+ | OutgoingBaseMessageProps<{
3254
+ messageType: 'multipleFiles';
3255
+ message: string;
3256
+ files: {
3257
+ type: string;
3258
+ url: string;
3259
+ name: string;
3260
+ }[];
3261
+ metadata: {
3262
+ localFiles?: unknown[];
3263
+ };
2824
3264
  }>;
2825
3265
 
3266
+ declare function OutgoingTextBody(props: OutgoingMessageBodyProps): JSX.Element;
3267
+
2826
3268
  declare interface PaletteColor {
2827
3269
  extraDark: string;
2828
3270
  dark: string;
@@ -3065,8 +3507,12 @@ declare type StringSet = {
3065
3507
  DATE_FORMAT__DATE_SHORT: string;
3066
3508
  FILE_UPLOAD_NOTIFICATION__COUNT_LIMIT: string;
3067
3509
  FILE_UPLOAD_NOTIFICATION__SIZE_LIMIT: string;
3510
+ FILE_UPLOAD_NOTIFICATION__FILES_EXCLUDED_BY_VALIDATION: string;
3068
3511
  FILE_UPLOAD_NO_SUPPORTED_FILES: string;
3512
+ FILE_UPLOAD_PHOTOS: string;
3513
+ FILE_UPLOAD_FILES: string;
3069
3514
  FILE_VIEWER__UNSUPPORT: string;
3515
+ IMAGE_VIEWER__DEFAULT_TITLE: string;
3070
3516
  CSAT_TITLE_UNSUBMITTED: string;
3071
3517
  CSAT_TITLE_SUBMITTED: string;
3072
3518
  CSAT_CRE_TITLE: string;
@@ -3074,17 +3520,26 @@ declare type StringSet = {
3074
3520
  CSAT_CRE_NOT_SOLVED: string;
3075
3521
  CSAT_REASON_PLACEHOLDER: string;
3076
3522
  CSAT_RATING_TITLE: string;
3077
- CSAT5_RATING_SCORE_1: string;
3078
- CSAT5_RATING_SCORE_2: string;
3079
- CSAT5_RATING_SCORE_3: string;
3080
- CSAT5_RATING_SCORE_4: string;
3081
- CSAT5_RATING_SCORE_5: string;
3523
+ /**
3524
+ * @deprecated Use dynamic values from server payload instead.
3525
+ * The CSAT component now uses labels provided by the server (csatPayload.csat_scores[n].label).
3526
+ */
3527
+ CSAT5_RATING_SCORE_1?: string;
3528
+ /** @deprecated Use dynamic values from server payload instead. **/
3529
+ CSAT5_RATING_SCORE_2?: string;
3530
+ /** @deprecated Use dynamic values from server payload instead. **/
3531
+ CSAT5_RATING_SCORE_3?: string;
3532
+ /** @deprecated Use dynamic values from server payload instead. **/
3533
+ CSAT5_RATING_SCORE_4?: string;
3534
+ /** @deprecated Use dynamic values from server payload instead. **/
3535
+ CSAT5_RATING_SCORE_5?: string;
3082
3536
  CSAT_SUBMIT_LABEL: string;
3083
3537
  CSAT_SUBMISSION_EXPIRED: string;
3084
3538
  TALK_TO_AGENT: string;
3085
3539
  CONVERSATION_LIST__HEADER_TITLE: string;
3086
3540
  CONVERSATION_LIST__NO_CONVERSATIONS: string;
3087
3541
  CONVERSATION_LIST__ENDED: string;
3542
+ CONVERSATION_LIST__MULTIPLE_FILES_COUNT: (count: number) => string;
3088
3543
  CITATION_SOURCE_TITLE: string;
3089
3544
  FORM_PLACEHOLDER: string;
3090
3545
  FORM_UNAVAILABLE: string;
@@ -3113,6 +3568,11 @@ declare type StringSet = {
3113
3568
  A11Y_SCROLL_TO_BOTTOM: string;
3114
3569
  A11Y_SCROLL_TO_NEW_MESSAGES: string;
3115
3570
  A11Y_OPEN_CONVERSATION_LIST: string;
3571
+ A11Y_IMAGE_VIEWER_CLOSE: string;
3572
+ A11Y_IMAGE_VIEWER_PREVIOUS: string;
3573
+ A11Y_IMAGE_VIEWER_NEXT: string;
3574
+ A11Y_IMAGE_VIEWER_DOWNLOAD: string;
3575
+ A11Y_ATTACH_FILE: string;
3116
3576
  SCROLL_TO_NEW_MESSAGES_LABEL: (messages: BaseMessage[]) => string;
3117
3577
  /** @deprecated Please use DATE_FORMAT__DATE_SHORT instead. **/
3118
3578
  DATE_FORMAT__CONVERSATION_LIST__LIST_ITEM_TITLE: string;