@satek-team-intern/chatbot-widget 0.8.10 → 0.10.1

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 (72) hide show
  1. package/README.md +927 -65
  2. package/dist/chatbot-widget.es.js +4842 -2898
  3. package/dist/chatbot-widget.umd.js +16 -12
  4. package/dist/locales/en.json.d.ts +130 -5
  5. package/dist/locales/vi.json.d.ts +131 -5
  6. package/dist/src/assets/Icons.d.ts +45 -0
  7. package/dist/src/assets/createIcon.d.ts +19 -0
  8. package/dist/src/assets/index.d.ts +1 -0
  9. package/dist/src/components/ChatWidget.d.ts +3 -3
  10. package/dist/src/components/ChatWindow.d.ts +19 -3
  11. package/dist/src/components/FloatingButton.d.ts +3 -3
  12. package/dist/src/components/index.d.ts +4 -0
  13. package/dist/src/components/modals/AddChat.d.ts +3 -3
  14. package/dist/src/components/modals/AddGroup.d.ts +6 -0
  15. package/dist/src/components/modals/AddMember.d.ts +3 -3
  16. package/dist/src/components/modals/FileViewer.d.ts +3 -3
  17. package/dist/src/components/modals/ThemeModal.d.ts +2 -2
  18. package/dist/src/components/modals/UpdateGroup.d.ts +4 -4
  19. package/dist/src/components/modals/UserProfileModal.d.ts +10 -0
  20. package/dist/src/components/modals/index.d.ts +2 -1
  21. package/dist/src/components/shared/ChatAvatar.d.ts +1 -1
  22. package/dist/src/components/shared/MemberAvatarFallBack.d.ts +5 -0
  23. package/dist/src/components/shared/ToastContainer.d.ts +2 -0
  24. package/dist/src/components/shared/index.d.ts +3 -0
  25. package/dist/src/components/sidebar/AppSideBar.d.ts +7 -0
  26. package/dist/src/components/sidebar/ChatInfoPanel.d.ts +11 -0
  27. package/dist/src/components/sidebar/ChatList.d.ts +4 -5
  28. package/dist/src/components/sidebar/ChatSearchBar.d.ts +3 -2
  29. package/dist/src/components/sidebar/SideBarInfoChat.d.ts +11 -0
  30. package/dist/src/components/sidebar/index.d.ts +2 -0
  31. package/dist/src/components/view/ChatHeader.d.ts +4 -3
  32. package/dist/src/components/view/ChatInput.d.ts +1 -2
  33. package/dist/src/components/view/ContactList.d.ts +8 -0
  34. package/dist/src/components/view/GroupList.d.ts +9 -0
  35. package/dist/src/components/view/MessageFiles.d.ts +3 -3
  36. package/dist/src/components/view/MessageItem.d.ts +3 -3
  37. package/dist/src/components/view/MessageList.d.ts +2 -2
  38. package/dist/src/components/view/index.d.ts +4 -1
  39. package/dist/src/constants/common.d.ts +1 -0
  40. package/dist/src/constants/file.d.ts +2 -0
  41. package/dist/src/constants/index.d.ts +2 -0
  42. package/dist/src/contexts/FileViewerContext.d.ts +5 -5
  43. package/dist/src/contexts/ToastContext.d.ts +4 -0
  44. package/dist/src/contexts/index.d.ts +2 -1
  45. package/dist/src/contexts/toast-context.d.ts +16 -0
  46. package/dist/src/hooks/index.d.ts +3 -0
  47. package/dist/src/hooks/useChat.d.ts +2 -2
  48. package/dist/src/hooks/useDragDropFiles.d.ts +5 -4
  49. package/dist/src/hooks/useFileViewer.d.ts +1 -1
  50. package/dist/src/hooks/useSetting.d.ts +2 -2
  51. package/dist/src/hooks/useToast.d.ts +1 -0
  52. package/dist/src/hooks/useTranslation.d.ts +4 -0
  53. package/dist/src/locales/index.d.ts +3 -0
  54. package/dist/src/services/chat.service.d.ts +5 -5
  55. package/dist/src/services/index.d.ts +2 -0
  56. package/dist/src/services/language.service.d.ts +2 -2
  57. package/dist/src/store/index.d.ts +2 -0
  58. package/dist/src/store/selectors/index.d.ts +1 -0
  59. package/dist/src/store/selectors/setting.d.ts +17 -47
  60. package/dist/src/store/slices/chatSlice.d.ts +7 -5
  61. package/dist/src/store/slices/index.d.ts +2 -0
  62. package/dist/src/store/slices/settingSlice.d.ts +5 -6
  63. package/dist/src/store/store.d.ts +2 -2
  64. package/dist/src/styles/index.d.ts +1 -0
  65. package/dist/src/types/chat.type.d.ts +35 -6
  66. package/dist/src/types/types.d.ts +34 -14
  67. package/dist/src/utils/chat.utils.d.ts +13 -7
  68. package/dist/src/utils/file.utils.d.ts +16 -0
  69. package/dist/src/utils/format.utils.d.ts +2 -0
  70. package/dist/src/utils/formatDateLabel.d.ts +1 -0
  71. package/dist/src/utils/index.d.ts +4 -0
  72. package/package.json +2 -2
@@ -1,13 +1,14 @@
1
- import { default as React } from 'react';
2
- import { WidgetMode } from '../../types';
1
+ import { FC } from 'react';
2
+ import { WidgetMode } from '../../../types';
3
3
  interface ChatHeaderProps {
4
4
  mode: WidgetMode;
5
5
  title?: string;
6
+ logoUrl?: string;
6
7
  onBack: () => void;
7
8
  onToggleMode: () => void;
8
9
  onClose: () => void;
9
10
  onAddMemberClick?: () => void;
10
11
  onOpenSettings?: () => void;
11
12
  }
12
- export declare const ChatHeader: React.FC<ChatHeaderProps>;
13
+ export declare const ChatHeader: FC<ChatHeaderProps>;
13
14
  export {};
@@ -1,9 +1,8 @@
1
- import { default as React } from 'react';
2
1
  interface ChatInputProps {
3
2
  primaryColor?: string;
4
3
  }
5
4
  export interface ChatInputHandle {
6
5
  processPastedFiles: (files: FileList) => void;
7
6
  }
8
- export declare const ChatInput: React.ForwardRefExoticComponent<ChatInputProps & React.RefAttributes<ChatInputHandle>>;
7
+ export declare const ChatInput: import('react').ForwardRefExoticComponent<ChatInputProps & import('react').RefAttributes<ChatInputHandle>>;
9
8
  export {};
@@ -0,0 +1,8 @@
1
+ import { FC } from 'react';
2
+ import { ChatUser } from '../../../types';
3
+ interface ContactListProps {
4
+ members: ChatUser[];
5
+ onMessageClick: (memberId: string) => void;
6
+ }
7
+ export declare const ContactList: FC<ContactListProps>;
8
+ export {};
@@ -0,0 +1,9 @@
1
+ import { FC } from 'react';
2
+ import { ChatConversation } from '../../../types';
3
+ interface GroupListProps {
4
+ groups: ChatConversation[];
5
+ onGroupClick: (group: ChatConversation) => void;
6
+ currentUserId?: number;
7
+ }
8
+ export declare const GroupList: FC<GroupListProps>;
9
+ export {};
@@ -1,7 +1,7 @@
1
- import { default as React } from 'react';
2
- import { ChatFile } from '../../types';
1
+ import { FC } from 'react';
2
+ import { ChatFile } from '../../../types';
3
3
  interface MessageFilesProps {
4
4
  files?: ChatFile[];
5
5
  }
6
- export declare const MessageFiles: React.FC<MessageFilesProps>;
6
+ export declare const MessageFiles: FC<MessageFilesProps>;
7
7
  export {};
@@ -1,7 +1,7 @@
1
- import { default as React } from 'react';
2
- import { ChatMessage } from '../../types';
1
+ import { FC } from 'react';
2
+ import { ChatMessage } from '../../../types';
3
3
  interface MessageItemProps {
4
4
  message: ChatMessage;
5
5
  }
6
- export declare const MessageItem: React.FC<MessageItemProps>;
6
+ export declare const MessageItem: FC<MessageItemProps>;
7
7
  export {};
@@ -1,2 +1,2 @@
1
- import { default as React } from 'react';
2
- export declare const MessageList: React.FC<object>;
1
+ import { FC } from 'react';
2
+ export declare const MessageList: FC<object>;
@@ -1,4 +1,7 @@
1
1
  export * from './ChatHeader';
2
2
  export * from './ChatInput';
3
- export * from './MessageList';
3
+ export * from './ContactList';
4
+ export * from './GroupList';
5
+ export * from './MessageFiles';
4
6
  export * from './MessageItem';
7
+ export * from './MessageList';
@@ -0,0 +1 @@
1
+ export declare const COMMON_EMOJIS: string[];
@@ -0,0 +1,2 @@
1
+ export declare const MAX_FILE_SIZE: number;
2
+ export declare const MAX_FILES_COUNT = 20;
@@ -0,0 +1,2 @@
1
+ export * from './file';
2
+ export * from './common';
@@ -1,5 +1,5 @@
1
- import { default as React } from 'react';
2
- import { ChatFile } from '../types';
1
+ import { FC, ReactNode } from 'react';
2
+ import { ChatFile } from '../../types';
3
3
  export interface FileViewerContextType {
4
4
  isOpen: boolean;
5
5
  files: ChatFile[];
@@ -7,8 +7,8 @@ export interface FileViewerContextType {
7
7
  openViewer: (files: ChatFile[], initialIndex?: number) => void;
8
8
  closeViewer: () => void;
9
9
  }
10
- declare const FileViewerContext: React.Context<FileViewerContextType | undefined>;
10
+ declare const FileViewerContext: import('react').Context<FileViewerContextType | undefined>;
11
11
  export { FileViewerContext };
12
- export declare const FileViewerProvider: React.FC<{
13
- children: React.ReactNode;
12
+ export declare const FileViewerProvider: FC<{
13
+ children: ReactNode;
14
14
  }>;
@@ -0,0 +1,4 @@
1
+ import { FC, ReactNode } from 'react';
2
+ export declare const ToastProvider: FC<{
3
+ children: ReactNode;
4
+ }>;
@@ -1,2 +1,3 @@
1
1
  export * from './FileViewerContext';
2
- export * from '../hooks/useFileViewer';
2
+ export * from './ToastContext';
3
+ export * from './toast-context';
@@ -0,0 +1,16 @@
1
+ export type ToastType = 'success' | 'error' | 'info' | 'warning';
2
+ export interface Toast {
3
+ id: string;
4
+ message: string;
5
+ type: ToastType;
6
+ isConfirm?: boolean;
7
+ onConfirm?: () => void;
8
+ onCancel?: () => void;
9
+ }
10
+ export interface ToastContextType {
11
+ showToast: (message: string, type?: ToastType) => void;
12
+ confirm: (message: string) => Promise<boolean>;
13
+ removeToast: (id: string) => void;
14
+ toasts: Toast[];
15
+ }
16
+ export declare const ToastContext: import('react').Context<ToastContextType | undefined>;
@@ -2,3 +2,6 @@ export { useChat } from './useChat';
2
2
  export { useFileViewer } from './useFileViewer';
3
3
  export { useDragDropFiles } from './useDragDropFiles';
4
4
  export { useVoiceRecorder } from './useVoiceRecorder';
5
+ export { useTranslation } from './useTranslation';
6
+ export { useToast } from './useToast';
7
+ export { useSetting } from './useSetting';
@@ -1,2 +1,2 @@
1
- import { AuthInfo } from '../types';
2
- export declare const useChat: (chatKey: string, authInfo: AuthInfo) => void;
1
+ import { AuthInfo } from '../../types';
2
+ export declare const useChat: (chatKey: string, authInfo: AuthInfo, workspace?: string) => void;
@@ -1,11 +1,12 @@
1
+ import { DragEvent } from 'react';
1
2
  interface DragDropFilesProps {
2
3
  onFilesAdded: (files: FileList) => void;
3
4
  }
4
5
  export declare const useDragDropFiles: ({ onFilesAdded }: DragDropFilesProps) => {
5
6
  isDragOver: boolean;
6
- handleDragEnter: (e: React.DragEvent<HTMLDivElement>) => void;
7
- handleDragOver: (e: React.DragEvent<HTMLDivElement>) => void;
8
- handleDragLeave: (e: React.DragEvent<HTMLDivElement>) => void;
9
- handleDrop: (e: React.DragEvent<HTMLDivElement>) => void;
7
+ handleDragEnter: (e: DragEvent<HTMLDivElement>) => void;
8
+ handleDragOver: (e: DragEvent<HTMLDivElement>) => void;
9
+ handleDragLeave: (e: DragEvent<HTMLDivElement>) => void;
10
+ handleDrop: (e: DragEvent<HTMLDivElement>) => void;
10
11
  };
11
12
  export {};
@@ -1,2 +1,2 @@
1
- import { FileViewerContextType } from '../contexts/FileViewerContext';
1
+ import { FileViewerContextType } from '../../contexts';
2
2
  export declare const useFileViewer: () => FileViewerContextType;
@@ -1,2 +1,2 @@
1
- import { WidgetFeature } from '../types';
2
- export declare const useSetting: (config?: WidgetFeature[]) => void;
1
+ import { WidgetFeature } from '../../types';
2
+ export declare const useSetting: (config?: WidgetFeature) => void;
@@ -0,0 +1 @@
1
+ export declare const useToast: () => import('../../contexts').ToastContextType;
@@ -0,0 +1,4 @@
1
+ export declare const useTranslation: () => {
2
+ t: (path: "addChat" | "common" | "chatWindow" | "chatHeader" | "chatInput" | "chatMessage" | "chatList" | "chatSearchBar" | "addMember" | "fileViewer" | "themeModal" | "updateGroup" | "addChat.title" | "addChat.groupNamePlaceholder" | "addChat.memberSearchPlaceholder" | "addChat.membersSection" | "addChat.createGroup" | "addChat.selectMoreMembers" | "addChat.selectMembers" | "addChat.title." | "addChat.groupNamePlaceholder." | "addChat.memberSearchPlaceholder." | "addChat.membersSection." | "addChat.createGroup." | "addChat.selectMoreMembers." | "addChat.selectMembers." | "common.buttons" | "common.errors" | "common.buttons.save" | "common.buttons.cancel" | "common.buttons.confirm" | "common.buttons.close" | "common.buttons.save." | "common.buttons.cancel." | "common.buttons.confirm." | "common.buttons.close." | "common.errors.updateGroup" | "common.errors.createChat" | "common.errors.updateGroup." | "common.errors.createChat." | "chatWindow.memberSystem" | "chatWindow.dragFile" | "chatWindow.selectChat" | "chatWindow.startConversation" | "chatWindow.searchPlaceholder" | "chatWindow.filterAll" | "chatWindow.filterGroup" | "chatWindow.filterSingle" | "chatWindow.memberSystem." | "chatWindow.dragFile." | "chatWindow.selectChat." | "chatWindow.startConversation." | "chatWindow.searchPlaceholder." | "chatWindow.filterAll." | "chatWindow.filterGroup." | "chatWindow.filterSingle." | "chatHeader.addMember" | "chatHeader.close" | "chatHeader.close." | "chatHeader.defaultTitle" | "chatHeader.darkMode" | "chatHeader.lightMode" | "chatHeader.settings" | "chatHeader.minimize" | "chatHeader.maximize" | "chatHeader.language" | "chatHeader.addMember." | "chatHeader.defaultTitle." | "chatHeader.darkMode." | "chatHeader.lightMode." | "chatHeader.settings." | "chatHeader.minimize." | "chatHeader.maximize." | "chatHeader.language." | "chatInput.placeholder" | "chatInput.selectFiles" | "chatInput.recordVoice" | "chatInput.selectFilesOrOptions" | "chatInput.removeFile" | "chatInput.recording" | "chatInput.cancelRecording" | "chatInput.stopRecording" | "chatInput.playRecording" | "chatInput.discardRecording" | "chatInput.addToMessage" | "chatInput.voiceMessage" | "chatInput.replyingTo" | "chatInput.attachmentIndicator" | "chatInput.placeholder." | "chatInput.selectFiles." | "chatInput.recordVoice." | "chatInput.selectFilesOrOptions." | "chatInput.removeFile." | "chatInput.recording." | "chatInput.cancelRecording." | "chatInput.stopRecording." | "chatInput.playRecording." | "chatInput.discardRecording." | "chatInput.addToMessage." | "chatInput.voiceMessage." | "chatInput.replyingTo." | "chatInput.attachmentIndicator." | "chatMessage.status" | "chatMessage.actions" | "chatMessage.states" | "chatMessage.status.seen" | "chatMessage.status.sent" | "chatMessage.status.seen." | "chatMessage.status.sent." | "chatMessage.actions.reply" | "chatMessage.actions.like" | "chatMessage.actions.love" | "chatMessage.actions.revoke" | "chatMessage.actions.delete" | "chatMessage.actions.seeMore" | "chatMessage.actions.seeLess" | "chatMessage.actions.reply." | "chatMessage.actions.like." | "chatMessage.actions.love." | "chatMessage.actions.revoke." | "chatMessage.actions.delete." | "chatMessage.actions.seeMore." | "chatMessage.actions.seeLess." | "chatMessage.states.revoked" | "chatMessage.states.attachment" | "chatMessage.states.revoked." | "chatMessage.states.attachment." | "chatList.delete" | "chatList.addMember" | "chatList.addMember." | "chatList.delete." | "chatList.options" | "chatList.editGroup" | "chatList.deleteGroup" | "chatList.yourMessage" | "chatList.options." | "chatList.editGroup." | "chatList.deleteGroup." | "chatList.yourMessage." | "chatSearchBar.createGroup" | "chatSearchBar.createGroup." | "chatSearchBar.searchPlaceholder" | "chatSearchBar.searchPlaceholder." | "addMember.title" | "addMember.memberSearchPlaceholder" | "addMember.membersSection" | "addMember.title." | "addMember.memberSearchPlaceholder." | "addMember.membersSection." | "addMember.noMembersFound" | "addMember.addButton" | "addMember.noMembersFound." | "addMember.addButton." | "fileViewer.closeButtonTitle" | "fileViewer.previousButtonTitle" | "fileViewer.nextButtonTitle" | "fileViewer.scrollLeftTitle" | "fileViewer.scrollRightTitle" | "fileViewer.openDownloadButton" | "fileViewer.closeAriaLabel" | "fileViewer.previousAriaLabel" | "fileViewer.nextAriaLabel" | "fileViewer.scrollLeftAriaLabel" | "fileViewer.scrollRightAriaLabel" | "fileViewer.closeButtonTitle." | "fileViewer.previousButtonTitle." | "fileViewer.nextButtonTitle." | "fileViewer.scrollLeftTitle." | "fileViewer.scrollRightTitle." | "fileViewer.openDownloadButton." | "fileViewer.closeAriaLabel." | "fileViewer.previousAriaLabel." | "fileViewer.nextAriaLabel." | "fileViewer.scrollLeftAriaLabel." | "fileViewer.scrollRightAriaLabel." | "themeModal.title" | "themeModal.title." | "themeModal.themeSectionTitle" | "themeModal.themeSectionDesc" | "themeModal.customColorTitle" | "themeModal.doneButton" | "themeModal.resetButton" | "themeModal.themeSectionTitle." | "themeModal.themeSectionDesc." | "themeModal.customColorTitle." | "themeModal.doneButton." | "themeModal.resetButton." | "updateGroup.title" | "updateGroup.groupNamePlaceholder" | "updateGroup.membersSection" | "updateGroup.title." | "updateGroup.groupNamePlaceholder." | "updateGroup.membersSection." | "updateGroup.groupNameLabel" | "updateGroup.avatarUrlLabel" | "updateGroup.avatarUrlPlaceholder" | "updateGroup.uploadAvatarButton" | "updateGroup.removeMemberButtonTitle" | "updateGroup.removeConfirmationStart" | "updateGroup.removeConfirmationEnd" | "updateGroup.cancelButton" | "updateGroup.updateButton" | "updateGroup.updatingButton" | "updateGroup.groupNameLabel." | "updateGroup.avatarUrlLabel." | "updateGroup.avatarUrlPlaceholder." | "updateGroup.uploadAvatarButton." | "updateGroup.removeMemberButtonTitle." | "updateGroup.removeConfirmationStart." | "updateGroup.removeConfirmationEnd." | "updateGroup.cancelButton." | "updateGroup.updateButton." | "updateGroup.updatingButton.", params?: Record<string, string>) => string;
3
+ toggleChangeLanguage: () => void;
4
+ };
@@ -0,0 +1,3 @@
1
+ import { default as en } from './en.json';
2
+ import { default as vi } from './vi.json';
3
+ export { en, vi };
@@ -1,12 +1,12 @@
1
- import { AuthInfo } from '../types';
2
- import { ChatEventPayloads, ChatResponse, ChatConversation, ChatMessage, ChatConfig, PaginationInfo, MessageAction, ChatUser } from '../types/chat.type';
1
+ import { AuthInfo, ChatEventPayloads, ChatResponse, ChatConversation, ChatMessage, ChatConfig, PaginationInfo, MessageAction, ChatUser, ChatSetting } from '../../types';
3
2
  declare class ChatService {
4
3
  private static instance;
5
4
  private chatSDK;
6
5
  constructor();
7
6
  static getInstance(): ChatService;
8
- init(chatKey: string): Promise<void>;
7
+ init(chatKey: string, workspace?: string): Promise<void>;
9
8
  private setupSDK;
9
+ get setting(): ChatSetting;
10
10
  setAuth(data: AuthInfo): Promise<ChatUser>;
11
11
  getAuth(): ChatUser | null;
12
12
  clearAuth(): void;
@@ -21,8 +21,8 @@ declare class ChatService {
21
21
  }>;
22
22
  findChatByReceiver(receiverId: number): Promise<ChatResponse<ChatConversation>>;
23
23
  addChat(receiverId: number, content?: string): Promise<ChatResponse<ChatConversation>>;
24
- addGroup(memberIds: number[], name: string, avatar?: string, userId?: number): Promise<ChatResponse<ChatConversation>>;
25
- updateGroup(chatId: number, name: string, avatar?: string): Promise<ChatResponse<ChatConversation>>;
24
+ addGroup(memberIds: number[], name: string, avatar?: string | File, userId?: number): Promise<ChatResponse<ChatConversation>>;
25
+ updateGroup(chatId: number, name: string, avatar?: string | File): Promise<ChatResponse<ChatConversation>>;
26
26
  removeChat(chatId: number): Promise<ChatResponse>;
27
27
  readChat(chatId: number): Promise<ChatResponse>;
28
28
  unreadChat(chatId: number): Promise<ChatResponse>;
@@ -0,0 +1,2 @@
1
+ export * from './chat.service';
2
+ export * from './language.service';
@@ -1,5 +1,5 @@
1
- import { default as en } from '../locales/en.json';
2
- import { LanguageOption } from '../types';
1
+ import { en } from '../../locales';
2
+ import { LanguageOption } from '../../types';
3
3
  export type TranslationSchema = typeof en;
4
4
  type NestedKeys<T> = T extends object ? {
5
5
  [K in keyof T]: `${Exclude<K, symbol>}${'' | `.${NestedKeys<T[K]>}`}`;
@@ -1 +1,3 @@
1
1
  export * from './store';
2
+ export * from './slices';
3
+ export * from './selectors';
@@ -0,0 +1 @@
1
+ export * from './setting';
@@ -1,60 +1,29 @@
1
- import { RootState } from '../store';
2
- export declare const selectWidgetFeatures: ((state: {
3
- chat: import('../slices/chatSlice').ChatState;
4
- setting: import('../slices/settingSlice').SettingState;
5
- }) => {
1
+ import { RootState } from '../../../store';
2
+ import { FeatureAnalysis } from '../../../utils';
3
+ import { WidgetFeature } from '../../../types';
4
+ interface WidgetSettings extends FeatureAnalysis {
6
5
  acceptFilter: string;
7
6
  isFileTypeAllowed: (file: File) => boolean;
8
- featureSet: Set<import('../../types').WidgetFeature>;
9
- hasVoice: boolean;
10
- hasAttachment: boolean;
11
- hasMultipleAttachments: boolean;
12
- hasGroupChat: boolean;
13
- hasChangeColor: boolean;
14
- hasMultipleLanguages: boolean;
15
- }) & {
7
+ allowDeleteChat: boolean;
8
+ allowDeleteMessage: (messageCreatedTime: string) => boolean;
9
+ allowRevokeMessage: (messageCreatedTime: string) => boolean;
10
+ }
11
+ export declare const selectWidgetFeatures: ((state: {
12
+ chat: import('../../../store').ChatState;
13
+ setting: import('../../../store').SettingState;
14
+ }) => WidgetSettings) & {
16
15
  clearCache: () => void;
17
16
  resultsCount: () => number;
18
17
  resetResultsCount: () => void;
19
18
  } & {
20
- resultFunc: (resultFuncArgs_0: import('../../types').WidgetFeature[]) => {
21
- acceptFilter: string;
22
- isFileTypeAllowed: (file: File) => boolean;
23
- featureSet: Set<import('../../types').WidgetFeature>;
24
- hasVoice: boolean;
25
- hasAttachment: boolean;
26
- hasMultipleAttachments: boolean;
27
- hasGroupChat: boolean;
28
- hasChangeColor: boolean;
29
- hasMultipleLanguages: boolean;
30
- };
31
- memoizedResultFunc: ((resultFuncArgs_0: import('../../types').WidgetFeature[]) => {
32
- acceptFilter: string;
33
- isFileTypeAllowed: (file: File) => boolean;
34
- featureSet: Set<import('../../types').WidgetFeature>;
35
- hasVoice: boolean;
36
- hasAttachment: boolean;
37
- hasMultipleAttachments: boolean;
38
- hasGroupChat: boolean;
39
- hasChangeColor: boolean;
40
- hasMultipleLanguages: boolean;
41
- }) & {
19
+ resultFunc: (resultFuncArgs_0: WidgetFeature) => WidgetSettings;
20
+ memoizedResultFunc: ((resultFuncArgs_0: WidgetFeature) => WidgetSettings) & {
42
21
  clearCache: () => void;
43
22
  resultsCount: () => number;
44
23
  resetResultsCount: () => void;
45
24
  };
46
- lastResult: () => {
47
- acceptFilter: string;
48
- isFileTypeAllowed: (file: File) => boolean;
49
- featureSet: Set<import('../../types').WidgetFeature>;
50
- hasVoice: boolean;
51
- hasAttachment: boolean;
52
- hasMultipleAttachments: boolean;
53
- hasGroupChat: boolean;
54
- hasChangeColor: boolean;
55
- hasMultipleLanguages: boolean;
56
- };
57
- dependencies: [(state: RootState) => import('../../types').WidgetFeature[]];
25
+ lastResult: () => WidgetSettings;
26
+ dependencies: [(state: RootState) => WidgetFeature];
58
27
  recomputations: () => number;
59
28
  resetRecomputations: () => void;
60
29
  dependencyRecomputations: () => number;
@@ -63,3 +32,4 @@ export declare const selectWidgetFeatures: ((state: {
63
32
  memoize: typeof import('reselect').weakMapMemoize;
64
33
  argsMemoize: typeof import('reselect').weakMapMemoize;
65
34
  };
35
+ export {};
@@ -1,4 +1,4 @@
1
- import { ChatUser, ChatConversation, ChatMessage, PaginationInfo } from '../../types';
1
+ import { ChatUser, ChatConversation, ChatMessage, PaginationInfo } from '../../../types';
2
2
  export interface ChatState {
3
3
  currentUser: ChatUser | null;
4
4
  chats: ChatConversation[];
@@ -11,10 +11,12 @@ export interface ChatState {
11
11
  messagesPagination: PaginationInfo | null;
12
12
  replyingMessage: ChatMessage | null;
13
13
  }
14
- export declare const setCurrentUser: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setCurrentUser">, setChats: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setChats">, setCurrentChat: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setCurrentChat">, setCurrentChatMessages: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setCurrentChatMessages">, setCurrentChatMembers: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setCurrentChatMembers">, setMembers: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setMembers">, setMessagesPagination: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setMessagesPagination">, prependMessages: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/prependMessages">, addNewMessage: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/addNewMessage">, removeChat: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/removeChat">, addChat: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/addChat">, updateChat: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/updateChat">, updateChatAvatar: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/updateChatAvatar">, removeMessage: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/removeMessage">, updateMessage: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/updateMessage">, setReplyingMessage: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setReplyingMessage">, setTotalMessagesUnread: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setTotalMessagesUnread">, updateMemberReadStatus: import('@reduxjs/toolkit').ActionCreatorWithPayload<{
14
+ export declare const setCurrentUser: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setCurrentUser">, setChats: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setChats">, setCurrentChat: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setCurrentChat">, setCurrentChatMessages: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setCurrentChatMessages">, setCurrentChatMembers: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setCurrentChatMembers">, setMembers: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setMembers">, setMember: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setMember">, setMemberDisconnect: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setMemberDisconnect">, setMessagesPagination: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setMessagesPagination">, prependMessages: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/prependMessages">, addNewMessage: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/addNewMessage">, removeChat: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/removeChat">, addChat: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/addChat">, updateChat: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/updateChat">, updateChatAvatar: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/updateChatAvatar">, removeMessage: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/removeMessage">, updateMessage: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/updateMessage">, setReplyingMessage: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setReplyingMessage">, setTotalMessagesUnread: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-chatslice/setTotalMessagesUnread">, updateMemberReadStatus: import('@reduxjs/toolkit').ActionCreatorWithPayload<{
15
15
  chatId: number;
16
16
  memberId: number;
17
17
  lastReadId: number;
18
- }, "widget-chatslice/updateMemberReadStatus">;
19
- declare const _default: import('redux').Reducer<ChatState>;
20
- export default _default;
18
+ }, "widget-chatslice/updateMemberReadStatus">, toggleChatSetting: import('@reduxjs/toolkit').ActionCreatorWithPayload<{
19
+ chatId: number;
20
+ setting: "is_muted" | "is_pined";
21
+ }, "widget-chatslice/toggleChatSetting">;
22
+ export declare const chatReducer: import('redux').Reducer<ChatState>;
@@ -0,0 +1,2 @@
1
+ export * from './chatSlice';
2
+ export * from './settingSlice';
@@ -1,10 +1,9 @@
1
- import { LanguageOption, WidgetFeature } from '../../types';
1
+ import { LanguageOption, WidgetFeature } from '../../../types';
2
2
  export interface SettingState {
3
3
  theme: 'light' | 'dark';
4
4
  primaryColor: string;
5
- features: WidgetFeature[];
6
- language: LanguageOption;
5
+ features: WidgetFeature;
6
+ currentLanguage: LanguageOption;
7
7
  }
8
- export declare const setConfig: import('@reduxjs/toolkit').ActionCreatorWithPayload<WidgetFeature[], "widget-settingslice/setConfig">, toggleTheme: import('@reduxjs/toolkit').ActionCreatorWithoutPayload<"widget-settingslice/toggleTheme">, setFeatures: import('@reduxjs/toolkit').ActionCreatorWithPayload<WidgetFeature[], "widget-settingslice/setFeatures">, setPrimaryColor: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-settingslice/setPrimaryColor">, setLanguage: import('@reduxjs/toolkit').ActionCreatorWithPayload<LanguageOption, "widget-settingslice/setLanguage">;
9
- declare const _default: import('redux').Reducer<SettingState>;
10
- export default _default;
8
+ export declare const setConfig: import('@reduxjs/toolkit').ActionCreatorWithPayload<WidgetFeature, "widget-settingslice/setConfig">, toggleTheme: import('@reduxjs/toolkit').ActionCreatorWithoutPayload<"widget-settingslice/toggleTheme">, setFeatures: import('@reduxjs/toolkit').ActionCreatorWithPayload<WidgetFeature, "widget-settingslice/setFeatures">, setPrimaryColor: import('@reduxjs/toolkit').ActionCreatorWithPayload<any, "widget-settingslice/setPrimaryColor">, setLanguage: import('@reduxjs/toolkit').ActionCreatorWithPayload<LanguageOption, "widget-settingslice/setLanguage">;
9
+ export declare const settingReducer: import('redux').Reducer<SettingState>;
@@ -1,6 +1,5 @@
1
1
  import { Tuple, AnyAction, ThunkDispatch, UnknownAction, EnhancedStore, StoreEnhancer } from '@reduxjs/toolkit';
2
- import { ChatState } from './slices/chatSlice';
3
- import { SettingState } from './slices/settingSlice';
2
+ import { ChatState, SettingState } from '../../store/slices';
4
3
  export declare const store: EnhancedStore<{
5
4
  chat: ChatState;
6
5
  setting: SettingState;
@@ -8,6 +7,7 @@ export declare const store: EnhancedStore<{
8
7
  StoreEnhancer<{
9
8
  dispatch: ThunkDispatch<{
10
9
  chat: ChatState;
10
+ setting: SettingState;
11
11
  }, undefined, UnknownAction>;
12
12
  }>,
13
13
  StoreEnhancer
@@ -0,0 +1 @@
1
+ export declare const stylesTagContent: string;
@@ -6,6 +6,10 @@ export interface ChatUser {
6
6
  avatar?: string;
7
7
  phone?: string;
8
8
  email?: string;
9
+ socket_at?: string;
10
+ socket_id?: string;
11
+ socket_ids?: string[];
12
+ last_active?: number;
9
13
  status?: string;
10
14
  last_read_id?: number;
11
15
  }
@@ -38,10 +42,14 @@ export interface ChatConversation {
38
42
  type: 'single' | 'group';
39
43
  avatar?: string | null;
40
44
  message: ChatMessage | null;
41
- members: ChatUser[];
45
+ members?: ChatUser[];
42
46
  new: Record<number, number>;
47
+ owner_id?: number;
43
48
  updated_at: string;
44
49
  create_at: string;
50
+ is_muted?: boolean;
51
+ is_pined?: boolean;
52
+ member?: number;
45
53
  [key: string]: unknown;
46
54
  }
47
55
  export interface ChatEvent {
@@ -51,7 +59,8 @@ export interface ChatEvent {
51
59
  chats_member: 'chats.member';
52
60
  chats_action: 'chats.action';
53
61
  chats_message: 'chats.message';
54
- projects_member: 'projects.member';
62
+ members_connect: 'members.connect';
63
+ members_disconnect: 'members.disconnect';
55
64
  new_message: 'new_message';
56
65
  }
57
66
  export interface ChatFile {
@@ -66,6 +75,15 @@ export interface ChatConfig {
66
75
  maxRetries?: number;
67
76
  [key: string]: unknown;
68
77
  }
78
+ export interface ChatSetting {
79
+ allow_delete_chat: boolean;
80
+ allow_delete_message: boolean;
81
+ allow_revoke_message: boolean;
82
+ delete_duration: number;
83
+ delete_duration_unit: 'minutes' | 'hours' | 'days';
84
+ revoke_duration: number;
85
+ revoke_duration_unit: 'minutes' | 'hours' | 'days';
86
+ }
69
87
  export type MessageAction = 'like' | 'love' | 'revoke' | 'remove';
70
88
  export interface PaginationInfo {
71
89
  count: number;
@@ -106,12 +124,23 @@ export interface ChatEventPayloads {
106
124
  chat_id: number;
107
125
  message_id: number;
108
126
  };
109
- 'projects.member': unknown;
127
+ 'members.connect': {
128
+ member: ChatUser;
129
+ socketId: string;
130
+ timestamp: number;
131
+ };
132
+ 'members.disconnect': {
133
+ socketId: string;
134
+ };
110
135
  new_message: {
111
136
  new: number;
112
137
  };
113
138
  }
114
139
  export interface ChatInstance {
140
+ /**
141
+ * Thuộc tính setting trả về cấu hình hiện tại của SDK, bao gồm các quyền hạn và giới hạn như allow_delete_chat, delete_duration...
142
+ */
143
+ setting: ChatSetting;
115
144
  /**
116
145
  * Thiết lập cấu hình tùy chỉnh cho SDK.
117
146
  * @param config (Object): Các tùy chọn cấu hình như debugMode, maxRetries...
@@ -192,7 +221,7 @@ export interface ChatInstance {
192
221
  * @param userId ID người dùng tạo nhóm (tùy chọn)
193
222
  * @returns Promise trả về object nhóm (ChatConversation)
194
223
  */
195
- addGroup(memberIds: number[], name: string, avatar?: string, userId?: number): Promise<ChatResponse<ChatConversation>>;
224
+ addGroup(memberIds: number[], name: string, avatar?: string | File, userId?: number): Promise<ChatResponse<ChatConversation>>;
196
225
  /**
197
226
  * Cập nhật thông tin nhóm (Tên và Ảnh đại diện).
198
227
  * @param chatId ID nhóm (Number, bắt buộc)
@@ -200,7 +229,7 @@ export interface ChatInstance {
200
229
  * @param avatar URL ảnh đại diện mới (String, tùy chọn)
201
230
  * @returns Promise trả về object nhóm đã được cập nhật
202
231
  */
203
- updateGroup(chatId: number, name: string, avatar?: string): Promise<ChatResponse<ChatConversation>>;
232
+ updateGroup(chatId: number, name: string, avatar?: string | File): Promise<ChatResponse<ChatConversation>>;
204
233
  /**
205
234
  * Xóa một cuộc trò chuyện (chat 1-1 hoặc nhóm).
206
235
  * @param chatId ID cuộc trò chuyện (Number, bắt buộc)
@@ -267,4 +296,4 @@ export interface ChatInstance {
267
296
  */
268
297
  runEvent<K extends keyof ChatEventPayloads>(name: K | string, data?: ChatEventPayloads[K]): void;
269
298
  }
270
- export type ChatConstructor = new () => ChatInstance;
299
+ export type ChatConstructor = new (workspace?: string) => ChatInstance;
@@ -7,25 +7,45 @@ export interface AuthInfo {
7
7
  email: string;
8
8
  }
9
9
  /** Các loại định dạng tập tin được phép đính kèm từ thiết bị */
10
- export type AttachmentType = 'image' | 'video' | 'audio' | 'file';
10
+ export type AttachmentType = 'image' | 'video' | 'audio' | 'file' | 'multiple';
11
+ /** Các tùy chọn ngôn ngữ hiển thị trên giao diện */
11
12
  export type LanguageOption = 'english' | 'vietnamese';
12
- /** * Danh sách các tính năng được kích hoạt trên Widget.
13
- * - 'group-chat': Bật chế độ chat nhóm.
14
- * - 'voice': Bật tính năng ghi âm trực tiếp và gửi đi dưới dạng file tin nhắn thoại (audio file).
15
- * - 'attachment:[type]': Bật tính năng chọn và tải lên loại file tương ứng từ thiết bị.
16
- * - 'attachment:multiple': Cho phép chọn và tải lên nhiều file cùng lúc.
17
- * - 'change-color': Cho phép người dùng thay đổi màu sắc chủ đạo của widget.
18
- * - 'language:[option]': Cho phép người dùng chọn ngôn ngữ cho widget. Nếu có nhiều hơn một tùy chọn ngôn ngữ được kích hoạt, widget sẽ hiển thị giao diện cho phép người dùng chuyển đổi giữa các ngôn ngữ đó.
13
+ /**
14
+ * Các phương thức truyền thông ghi hình.
15
+ * - 'voice': Ghi âm và gửi tin nhắn thoại.
19
16
  */
20
- export type WidgetFeature = 'group-chat' | 'voice' | `attachment:${AttachmentType}` | 'attachment:multiple' | 'change-color' | `language:${LanguageOption}`;
17
+ export type CommunicationFeature = 'voice';
18
+ /**
19
+ * Chế độ vận hành của cửa sổ chat.
20
+ * - 'single': Chat 1-1.
21
+ * - 'group': Chế độ chat nhóm nhiều người tham gia.
22
+ */
23
+ export type WidgetChatMode = 'single' | 'group';
24
+ /**
25
+ * Các tùy chọn can thiệp và mở rộng giao diện Widget.
26
+ * - 'change-color': Người dùng cuối có thể tự chọn màu chủ đạo (Primary Color).
27
+ * - 'change-theme': Người dùng cuối có thể chuyển đổi giữa các chủ đề (ví dụ: Sáng/Tối).
28
+ */
29
+ export type WidgetCustomizationOptions = 'change-color' | 'change-theme' | 'multi-language';
30
+ export interface WidgetFeature {
31
+ /** Danh sách các loại tập tin cho phép tải lên. Nếu có 'multiple', cho phép chọn nhiều file. */
32
+ attachments?: AttachmentType[];
33
+ /** Các tính năng tương tác trực tiếp bằng âm thanh và hình ảnh. */
34
+ communication?: CommunicationFeature[];
35
+ /**
36
+ * Xác định các hình thức hội thoại mà widget hỗ trợ.
37
+ * Nếu không truyền, mặc định là ['single']
38
+ */
39
+ chatModes?: WidgetChatMode[];
40
+ /** Các quyền tùy biến giao diện cho phép người dùng thực hiện. */
41
+ customizations?: WidgetCustomizationOptions[];
42
+ }
21
43
  export interface ChatWidgetProps {
22
44
  chatKey: string;
23
45
  title?: string;
46
+ workspace?: string;
47
+ logoUrl?: string;
24
48
  primaryColor?: string;
25
49
  auth: AuthInfo;
26
- /**
27
- * Mảng chứa các tính năng muốn kích hoạt.
28
- * @example features: ['group-chat', 'voice', 'attachment:image']
29
- */
30
- features?: WidgetFeature[];
50
+ features?: WidgetFeature;
31
51
  }
@@ -1,7 +1,13 @@
1
- import { ChatConversation, WidgetFeature } from '../types';
1
+ import { AttachmentType, ChatConversation, CommunicationFeature, WidgetChatMode, WidgetCustomizationOptions, WidgetFeature } from '../../types';
2
2
  export declare const getChatName: (chat?: ChatConversation | null, currentUserId?: number, fallback?: string) => string;
3
- interface FeatureAnalysis {
4
- featureSet: Set<WidgetFeature>;
3
+ export interface FeatureSet {
4
+ attachments: Set<AttachmentType>;
5
+ communication: Set<CommunicationFeature>;
6
+ chatModes: Set<WidgetChatMode>;
7
+ customizations: Set<WidgetCustomizationOptions>;
8
+ }
9
+ export interface FeatureAnalysis {
10
+ featureSet: FeatureSet;
5
11
  hasVoice: boolean;
6
12
  hasAttachment: boolean;
7
13
  hasMultipleAttachments: boolean;
@@ -9,7 +15,7 @@ interface FeatureAnalysis {
9
15
  hasChangeColor: boolean;
10
16
  hasMultipleLanguages: boolean;
11
17
  }
12
- export declare const analyzeFeatures: (features: WidgetFeature[]) => FeatureAnalysis;
13
- export declare const getAcceptFilter: (featureSet: Set<WidgetFeature>) => string;
14
- export declare const createFileTypeChecker: (featureSet: Set<WidgetFeature>) => (file: File) => boolean;
15
- export {};
18
+ export declare const analyzeFeatures: (features: WidgetFeature) => FeatureAnalysis;
19
+ export declare const getAcceptFilter: (featureSet: FeatureSet) => string;
20
+ export declare const createFileTypeChecker: (featureSet: FeatureSet) => (file: File) => boolean;
21
+ export declare const isConnected: (socketAt: string | undefined) => boolean;