@webinex/chatify 2.0.0-alpha13 → 2.0.0-alpha14

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 (143) hide show
  1. package/dist/{Chatify-CwAfN1wu.js → Chatify-CP2jgo8d.js} +191 -118
  2. package/dist/Chatify-CP2jgo8d.js.map +1 -0
  3. package/dist/Chatify.css +28 -0
  4. package/dist/audit.js +3 -2
  5. package/dist/audit.js.map +1 -1
  6. package/dist/index.js +1 -1
  7. package/dist/types/audit/index.d.ts +17 -15
  8. package/dist/types/ui/Chat/ChatContext.d.ts +2 -0
  9. package/dist/types/ui/Chat/ChatPanel.d.ts +7 -0
  10. package/dist/types/ui/Chat/ChatView.d.ts +4 -2
  11. package/dist/types/ui/ChatGroup/ChatGroupContext.d.ts +4 -1
  12. package/dist/types/ui/ChatGroup/ChatGroupPanel.d.ts +21 -2
  13. package/dist/types/ui/Conversation/Conversation.d.ts +1 -0
  14. package/dist/types/ui/Conversation/ConversationContext.d.ts +1 -0
  15. package/dist/types/ui/Conversation/ConversationHeader.d.ts +4 -1
  16. package/dist/types/ui/localizer.d.ts +4 -1
  17. package/dist/types/ui/useCompact.d.ts +4 -0
  18. package/package.json +81 -81
  19. package/src/audit/AuditChatList.tsx +25 -25
  20. package/src/audit/AuditConversationPanel.tsx +49 -48
  21. package/src/audit/AuditPanel.tsx +76 -76
  22. package/src/audit/AuditPanelCustomizeValue.ts +11 -11
  23. package/src/audit/AuditSearch.tsx +89 -89
  24. package/src/audit/AuditSearchValue.tsx +42 -42
  25. package/src/audit/auditApi.tsx +113 -113
  26. package/src/audit/index.d.ts +18 -18
  27. package/src/audit/index.tsx +28 -28
  28. package/src/audit/styles.scss +72 -72
  29. package/src/core/api/api.ts +675 -675
  30. package/src/core/api/baseApi.ts +38 -38
  31. package/src/core/api/index.ts +1 -1
  32. package/src/core/client.ts +298 -298
  33. package/src/core/constants.ts +1 -1
  34. package/src/core/debounce.ts +90 -90
  35. package/src/core/index.ts +4 -4
  36. package/src/core/types.tsx +182 -182
  37. package/src/index.ts +2 -2
  38. package/src/styles/aside.scss +34 -26
  39. package/src/styles/chat-list.scss +138 -138
  40. package/src/styles/chat.scss +11 -11
  41. package/src/styles/conversation.scss +199 -200
  42. package/src/styles/index.scss +227 -220
  43. package/src/styles/input.scss +148 -148
  44. package/src/styles/keyframes.scss +14 -14
  45. package/src/styles/members.scss +30 -13
  46. package/src/styles/mixins.scss +38 -25
  47. package/src/styles/variables.scss +13 -13
  48. package/src/ui/Chat/ChatContext.tsx +32 -30
  49. package/src/ui/Chat/ChatEditableHeaderName.tsx +63 -63
  50. package/src/ui/Chat/ChatHeaderActions.tsx +19 -19
  51. package/src/ui/Chat/ChatPanel.tsx +46 -30
  52. package/src/ui/Chat/ChatView.tsx +122 -115
  53. package/src/ui/Chat/Members/ChatMembersButton.tsx +9 -9
  54. package/src/ui/Chat/Members/ChatMembersPanel.tsx +128 -112
  55. package/src/ui/Chat/Members/ChatMembersPreview.tsx +25 -25
  56. package/src/ui/Chat/Members/index.ts +13 -13
  57. package/src/ui/Chat/index.ts +6 -6
  58. package/src/ui/ChatGroup/AutoReply/AutoReplyButton.tsx +21 -21
  59. package/src/ui/ChatGroup/AutoReply/AutoReplyForm.tsx +50 -50
  60. package/src/ui/ChatGroup/AutoReply/AutoReplyPanel.tsx +94 -94
  61. package/src/ui/ChatGroup/AutoReply/AutoReplyPeriodInput.tsx +22 -22
  62. package/src/ui/ChatGroup/AutoReply/AutoReplyTextInput.tsx +22 -22
  63. package/src/ui/ChatGroup/AutoReply/index.ts +19 -19
  64. package/src/ui/ChatGroup/ChatGroupContext.tsx +63 -61
  65. package/src/ui/ChatGroup/ChatGroupPanel.tsx +110 -75
  66. package/src/ui/ChatGroup/Create/CreateChatButton.tsx +15 -15
  67. package/src/ui/ChatGroup/Create/CreateChatForm.tsx +36 -36
  68. package/src/ui/ChatGroup/Create/CreateChatMemberInput.tsx +65 -65
  69. package/src/ui/ChatGroup/Create/CreateChatNameInput.tsx +25 -25
  70. package/src/ui/ChatGroup/Create/CreateChatPanel.tsx +45 -45
  71. package/src/ui/ChatGroup/Create/index.ts +19 -19
  72. package/src/ui/ChatGroup/Layout/ChatGroupActions.tsx +15 -15
  73. package/src/ui/ChatGroup/Layout/ChatGroupAside.tsx +12 -12
  74. package/src/ui/ChatGroup/Layout/ChatGroupBody.tsx +17 -10
  75. package/src/ui/ChatGroup/Layout/ChatGroupFooter.tsx +3 -3
  76. package/src/ui/ChatGroup/Layout/ChatGroupHeader.tsx +5 -5
  77. package/src/ui/ChatGroup/Layout/ChatGroupMain.tsx +21 -19
  78. package/src/ui/ChatGroup/Layout/index.ts +22 -22
  79. package/src/ui/ChatGroup/List/ChatListPanel.tsx +28 -28
  80. package/src/ui/ChatGroup/List/index.ts +8 -8
  81. package/src/ui/ChatGroup/index.ts +6 -6
  82. package/src/ui/Chatify.tsx +15 -15
  83. package/src/ui/Conversation/Conversation.tsx +96 -92
  84. package/src/ui/Conversation/ConversationActions.tsx +12 -12
  85. package/src/ui/Conversation/ConversationBody.tsx +28 -28
  86. package/src/ui/Conversation/ConversationContext.ts +31 -30
  87. package/src/ui/Conversation/ConversationHeader.tsx +35 -19
  88. package/src/ui/Conversation/ConversationName.tsx +7 -7
  89. package/src/ui/Conversation/InputBox/InputBox.tsx +126 -126
  90. package/src/ui/Conversation/InputBox/InputBoxFile.tsx +38 -38
  91. package/src/ui/Conversation/InputBox/InputBoxFileList.tsx +21 -21
  92. package/src/ui/Conversation/InputBox/InputFilesBox.tsx +78 -78
  93. package/src/ui/Conversation/InputBox/InputSubmitButtonBox.tsx +26 -26
  94. package/src/ui/Conversation/InputBox/InputTextBox.tsx +63 -61
  95. package/src/ui/Conversation/InputBox/index.ts +23 -23
  96. package/src/ui/Conversation/Message/MessageAuthor.tsx +13 -13
  97. package/src/ui/Conversation/Message/MessageBox.tsx +20 -20
  98. package/src/ui/Conversation/Message/MessageContent.tsx +15 -15
  99. package/src/ui/Conversation/Message/MessageFile.tsx +54 -54
  100. package/src/ui/Conversation/Message/MessageFileList.tsx +14 -14
  101. package/src/ui/Conversation/Message/MessageInfoBox.tsx +28 -28
  102. package/src/ui/Conversation/Message/MessageRow.tsx +28 -28
  103. package/src/ui/Conversation/Message/MessageText.tsx +7 -7
  104. package/src/ui/Conversation/Message/index.ts +28 -28
  105. package/src/ui/Conversation/NextObserver/NextMessagesObserver.tsx +47 -47
  106. package/src/ui/Conversation/NextObserver/index.ts +1 -1
  107. package/src/ui/Conversation/ReadObserver/MessageReadObserver.tsx +49 -49
  108. package/src/ui/Conversation/ReadObserver/index.ts +1 -1
  109. package/src/ui/Conversation/SendingMessage/SendingMessageBox.tsx +16 -16
  110. package/src/ui/Conversation/SendingMessage/SendingMessageContent.tsx +13 -13
  111. package/src/ui/Conversation/SendingMessage/SendingMessageInfoBox.tsx +13 -13
  112. package/src/ui/Conversation/SendingMessage/SendingMessageText.tsx +7 -7
  113. package/src/ui/Conversation/SendingMessage/index.ts +16 -16
  114. package/src/ui/Conversation/SystemMessage/SystemMessageBox.tsx +20 -20
  115. package/src/ui/Conversation/SystemMessage/SystemMessageRow.tsx +28 -28
  116. package/src/ui/Conversation/SystemMessage/index.ts +10 -10
  117. package/src/ui/Conversation/index.ts +13 -13
  118. package/src/ui/Thread/ThreadActions.tsx +22 -22
  119. package/src/ui/Thread/ThreadContext.ts +13 -13
  120. package/src/ui/Thread/ThreadPanel.tsx +128 -127
  121. package/src/ui/Thread/index.tsx +3 -3
  122. package/src/ui/color.ts +20 -20
  123. package/src/ui/common/Avatar.tsx +20 -20
  124. package/src/ui/common/ChatList/ChatList.tsx +83 -84
  125. package/src/ui/common/ChatList/ChatListItemAvatar.tsx +22 -22
  126. package/src/ui/common/ChatList/ChatListItemBox.tsx +32 -32
  127. package/src/ui/common/ChatList/ChatListItemLastMessage.tsx +15 -15
  128. package/src/ui/common/ChatList/ChatListItemLastMessageAuthor.tsx +15 -15
  129. package/src/ui/common/ChatList/ChatListItemLastMessageContent.tsx +21 -21
  130. package/src/ui/common/ChatList/ChatListItemLastMessageSentAt.tsx +22 -22
  131. package/src/ui/common/ChatList/ChatListItemName.tsx +8 -8
  132. package/src/ui/common/ChatList/ChatListItemUnreadCount.tsx +12 -12
  133. package/src/ui/common/ChatList/ChatListValue.ts +9 -9
  134. package/src/ui/common/ChatList/index.ts +32 -32
  135. package/src/ui/common/Icon.tsx +48 -48
  136. package/src/ui/common/MessageSkeleton.tsx +20 -20
  137. package/src/ui/common/index.ts +14 -14
  138. package/src/ui/customize.tsx +51 -51
  139. package/src/ui/index.ts +11 -11
  140. package/src/ui/localizer.tsx +148 -137
  141. package/src/ui/useCompact.tsx +32 -0
  142. package/src/ui/useFormatter.tsx +17 -17
  143. package/dist/Chatify-CwAfN1wu.js.map +0 -1
package/dist/audit.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"audit.js","sources":["../src/audit/AuditSearchValue.tsx","../src/audit/AuditSearch.tsx","../src/audit/auditApi.tsx","../src/audit/AuditChatList.tsx","../src/audit/AuditConversationPanel.tsx","../src/audit/AuditPanel.tsx","../src/audit/index.tsx"],"sourcesContent":["import { GetAuditChatListQueryArgs } from './auditApi';\n\nexport interface AuditSearchOption {\n label: JSX.Element;\n value: string;\n}\n\nconst MEMBER_PREFIX = 'member://';\nconst TEXT_PREFIX = 'text://';\n\nfunction queryOf(\n values: string[],\n): Pick<GetAuditChatListQueryArgs, 'containsOneOfMembers' | 'searchString'> | null {\n let containsOneOfMembers: string[] | null = values\n .filter(AuditSearchUtil.isSearchByMember)\n .map((v) => v.slice(MEMBER_PREFIX.length));\n\n containsOneOfMembers = containsOneOfMembers.length > 0 ? containsOneOfMembers : null;\n\n const searchStringValues = values\n .filter(AuditSearchUtil.isSearchByText)\n .map((v) => v.slice(TEXT_PREFIX.length));\n\n const searchString = searchStringValues.length > 0 ? searchStringValues.join(' ') : null;\n\n if (!containsOneOfMembers && !searchString) {\n return null;\n }\n\n return {\n containsOneOfMembers,\n searchString,\n };\n}\n\nexport const AuditSearchUtil = Object.freeze({\n MEMBER_PREFIX,\n TEXT_PREFIX,\n isSearchByMember: (value: string) => value.startsWith(MEMBER_PREFIX),\n isSearchByText: (value: string) => value.startsWith(TEXT_PREFIX),\n queryOf,\n});\n","import { Account, chatifyApi, customize, Localizer, useLocalizer } from '@webinex/chatify';\nimport { Select } from 'antd';\nimport classNames from 'classnames';\nimport { useEffect, useMemo, useState } from 'react';\nimport { AuditSearchUtil } from './AuditSearchValue';\n\nexport interface AuditSearchProps {\n className?: string;\n onSearch?: (values: string[]) => void;\n}\n\ntype Value = { label: JSX.Element; value: string };\n\nfunction* mapOptions(localizer: Localizer, accounts: Account[] | undefined, searchValue: string) {\n if (searchValue.length === 0) return;\n\n if (searchValue.length > 0)\n yield {\n label: localizer.audit.textSearchOption(searchValue),\n value: AuditSearchUtil.TEXT_PREFIX + searchValue,\n };\n\n for (const account of accounts?.filter((x) =>\n x.name.toLocaleLowerCase().includes(searchValue.toLocaleLowerCase()),\n ) ?? []) {\n yield {\n label: localizer.audit.memberSearchOption(account),\n value: AuditSearchUtil.MEMBER_PREFIX + account.id,\n };\n }\n}\n\nfunction useOptions(accounts: Account[] | undefined, searchValue: string) {\n const localizer = useLocalizer();\n return useMemo(\n () => Array.from(mapOptions(localizer, accounts, searchValue)),\n [localizer, accounts, searchValue],\n );\n}\n\nexport const AuditSearch = customize('AuditSearch', (props: AuditSearchProps) => {\n const { className, onSearch } = props;\n const [searchValue, setSearchValue] = useState('');\n const [values, setValues] = useState<Value[]>([]);\n const { data: accounts, isLoading } = chatifyApi.useGetAccountListQuery({});\n const options = useOptions(accounts, searchValue);\n const localizer = useLocalizer();\n\n useEffect(() => {\n onSearch?.(values.map((x) => x.value));\n }, [onSearch, values]);\n\n return (\n <div className={classNames('wxchtf-search', className)}>\n <Select<string[], Value>\n allowClear\n className=\"wxchtf-search-select\"\n mode=\"multiple\"\n value={values.map((x) => x.value)}\n options={options.length > 0 ? options : values}\n searchValue={searchValue}\n onSearch={setSearchValue}\n onSelect={(_, option) => {\n setValues((prev) => {\n if (AuditSearchUtil.isSearchByText(option.value)) {\n prev = prev.filter((x) => !AuditSearchUtil.isSearchByText(x.value));\n }\n\n return [...prev, option];\n });\n setSearchValue('');\n }}\n onDeselect={(_, option) => {\n setValues((prev) => prev.filter((x) => x.value !== option.value));\n setSearchValue('');\n }}\n filterOption={false}\n onDropdownVisibleChange={() => setSearchValue('')}\n disabled={isLoading}\n loading={isLoading}\n placeholder={localizer.audit.searchPlaceholder}\n notFoundContent={\n searchValue.length === 0 ? localizer.audit.noInputBlurb : localizer.audit.noChatFound\n }\n size=\"large\"\n />\n </div>\n );\n});\n","import { PagingRule } from '@webinex/asky';\nimport { Account, chatifyApi, File, ListSegment, Optional } from '@webinex/chatify';\n\nexport interface GetAuditChatListQueryArgs {\n containsOneOfMembers: string[] | null;\n searchString: string | null;\n pagingRule: PagingRule | null;\n includeTotal: boolean | null;\n}\n\nexport interface AuditChatResponse {\n id: string;\n workspaceId: string;\n name: string;\n createdAt: string;\n createdById: string;\n lastMessage: Optional<AuditChatMessage>;\n}\n\nexport interface AuditChatMessage {\n id: string;\n authorId: string;\n sentAt: string;\n text: string | null;\n files: File[];\n sentBy: Account;\n}\n\nexport interface AuditChatListItem {\n id: string;\n workspaceId: string;\n name: string;\n createdAt: string;\n createdById: string;\n lastMessage: AuditChatMessage;\n}\n\nexport interface AuditChat {\n id: string;\n workspaceId: string;\n name: string;\n createdAt: string;\n createdById: string;\n}\n\nfunction qs(params: Record<string, any>): string {\n const query = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== null && value !== undefined) {\n query.append(key, typeof value === 'string' ? value : JSON.stringify(value));\n }\n });\n\n return query.toString();\n}\n\nexport const auditApi = chatifyApi.injectEndpoints({\n endpoints: (build) => ({\n getAuditChatList: build.query<ListSegment<AuditChatListItem>, GetAuditChatListQueryArgs>({\n queryFn: async (args) =>\n chatifyApi.settings.client.axios\n .get<ListSegment<AuditChatResponse>>(`audit/chats?${qs({ query: args })}`)\n .then(({ data }) => ({\n data: {\n total: data.total,\n items: data.items.map(\n ({ lastMessage, ...x }): AuditChatListItem => ({ ...x, lastMessage: lastMessage.value! }),\n ),\n },\n }))\n .catch((error) => ({ error })),\n providesTags: ['chat', 'message'],\n }),\n\n getAuditChat: build.query<AuditChat, { id: string }>({\n queryFn: async (args) =>\n chatifyApi.settings.client.axios\n .get(`audit/chats/${encodeURIComponent(args.id)}`)\n .then(({ data }) => ({ data }))\n .catch((error) => ({ error })),\n providesTags: ['chat'],\n }),\n\n getAuditChatMessagesInfinite: build.infiniteQuery<\n ListSegment<AuditChatMessage>,\n { id: string },\n { skip: number; take: number }\n >({\n queryFn: async (args) => {\n const {\n pageParam,\n queryArg: { id },\n } = args;\n\n return chatifyApi.settings.client.axios\n .get(`audit/messages?${qs({ query: { chatId: id, pagingRule: pageParam, includeTotal: true } })}`)\n .then(({ data }) => ({ data }))\n .catch((error) => ({ error }));\n },\n infiniteQueryOptions: {\n initialPageParam: { skip: 0, take: 20 },\n getNextPageParam: (lastPage, _, lastPageParam) =>\n lastPage.total > lastPageParam.skip + lastPageParam.take\n ? {\n skip: lastPageParam.skip + lastPageParam.take,\n take: lastPageParam.take,\n }\n : undefined,\n },\n providesTags: ['message', 'chat'],\n }),\n }),\n});\n","import { ChatList, customize } from '@webinex/chatify';\nimport { Empty, Skeleton } from 'antd';\nimport { AuditChatListItem } from './auditApi';\n\nexport interface AuditChatListProps {\n items: AuditChatListItem[];\n loading: boolean;\n selected: string | null;\n onSelect: (id: string) => void;\n top?: number;\n}\n\nexport const AuditChatList = customize('AuditChatList', (props: AuditChatListProps) => {\n const { items, selected, onSelect, loading, top } = props;\n\n if (loading) {\n return <Skeleton />;\n }\n\n if (items.length === 0) {\n return <Empty />;\n }\n\n return <ChatList items={items} selected={selected} onSelect={onSelect} noRead top={top} />;\n});\n","import { Conversation, customize } from '@webinex/chatify';\nimport { auditApi } from './auditApi';\nimport { useMemo } from 'react';\n\nexport interface AuditConversationPanelProps {\n id: string;\n onClose?: () => void;\n\n /**\n * Number of messages to load per page.\n * @default 20\n */\n pageSize?: number;\n}\n\nexport const AuditConversationPanel = customize(\n 'AuditConversationPanel',\n (props: AuditConversationPanelProps) => {\n const { id, onClose, pageSize = 20 } = props;\n const { data: chat } = auditApi.useGetAuditChatQuery({ id });\n\n const {\n data: messageSegments,\n isFetchingNextPage,\n fetchNextPage,\n hasNextPage,\n } = auditApi.useGetAuditChatMessagesInfiniteInfiniteQuery(\n { id },\n { initialPageParam: { skip: 0, take: pageSize } },\n );\n\n const messages = useMemo(() => messageSegments?.pages.flatMap((x) => x.items) ?? [], [messageSegments]);\n\n if (!chat) return null;\n\n return (\n <Conversation\n value={{ active: false, id, lastReadMessageId: null, name: chat.name }}\n nextLoading={isFetchingNextPage}\n onNext={fetchNextPage}\n hasMore={!isFetchingNextPage && hasNextPage}\n messages={messages}\n noReadTracking\n onClose={onClose}\n />\n );\n },\n);\n","import classNames from 'classnames';\nimport { AuditSearch } from './AuditSearch';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { AuditSearchUtil } from './AuditSearchValue';\nimport { auditApi } from './auditApi';\nimport { AuditChatList } from './AuditChatList';\nimport { CustomizeContext, defaultLocalizer, Localizer, LocalizerContext } from '@webinex/chatify';\nimport { AuditConversationPanel } from './AuditConversationPanel';\nimport { AuditPanelCustomizeValue } from './AuditPanelCustomizeValue';\n\nexport interface AuditPanelProps {\n className?: string;\n style?: React.CSSProperties;\n localizer?: Localizer;\n customize?: AuditPanelCustomizeValue;\n\n /**\n * Maximum number of chats to load.\n * @default 100\n */\n max?: number;\n}\n\nfunction useData(props: AuditPanelProps, values: string[]) {\n const { max } = props;\n const query = useMemo(() => AuditSearchUtil.queryOf(values), [values]);\n\n const { currentData: chats, isLoading } = auditApi.useGetAuditChatListQuery(\n {\n ...query!,\n pagingRule: { skip: 0, take: max! },\n includeTotal: true,\n },\n { skip: !query },\n );\n\n return useMemo(() => ({ chats: chats?.items ?? [], isLoading }), [chats, isLoading]);\n}\n\nconst EMPTY = Object.freeze({} as AuditPanelCustomizeValue);\n\nexport function AuditPanel(props: AuditPanelProps) {\n props = { max: 100, customize: EMPTY, ...props };\n const { className, style, localizer = defaultLocalizer, customize = EMPTY, max } = props;\n const [values, setValues] = useState<string[]>([]);\n const { chats, isLoading } = useData(props, values);\n\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const resetSelected = useCallback(() => setSelectedId(null), []);\n\n useEffect(() => {\n if (chats.every((x) => x.id !== selectedId)) {\n setSelectedId(null);\n }\n }, [chats, selectedId]);\n\n return (\n <CustomizeContext.Provider value={customize}>\n <LocalizerContext.Provider value={localizer}>\n <div className={classNames(className, 'wxchtf-audit-panel')} style={style}>\n <AuditSearch onSearch={setValues} />\n <div className={classNames('wxchtf-audit-body', { '--conversation-opened': !!selectedId })}>\n <AuditChatList\n items={chats}\n loading={isLoading}\n selected={selectedId}\n onSelect={setSelectedId}\n top={Math.min(chats.length, max!)}\n />\n {selectedId && <AuditConversationPanel id={selectedId} onClose={resetSelected} />}\n </div>\n </div>\n </LocalizerContext.Provider>\n </CustomizeContext.Provider>\n );\n}\n","import { Space } from 'antd';\nimport { AuditPanel } from './AuditPanel';\nimport './index.d';\nimport './styles.scss';\nimport { Avatar, Chatify, defaultLocalizer } from '@webinex/chatify';\n\nexport * from './AuditPanel';\nexport * from './AuditPanelCustomizeValue';\nexport * from './AuditChatList';\nexport * from './AuditSearchValue';\nexport * from './AuditSearch';\nexport * from './auditApi';\nexport * from './AuditConversationPanel';\n\nChatify.Audit = AuditPanel;\n\ndefaultLocalizer.audit = {\n searchPlaceholder: 'Search chats by chat name or member name',\n noChatFound: 'No chats found',\n noInputBlurb: 'Start typing to search',\n textSearchOption: (text) => <span>{`Chat name includes \"${text}\"`}</span>,\n memberSearchOption: (account) => (\n <Space>\n <Avatar account={account} />\n {`Chat includes \"${account.name}\"`}\n </Space>\n ),\n};\n"],"names":["customize"],"mappings":"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"}
1
+ {"version":3,"file":"audit.js","sources":["../src/audit/AuditSearchValue.tsx","../src/audit/AuditSearch.tsx","../src/audit/auditApi.tsx","../src/audit/AuditChatList.tsx","../src/audit/AuditConversationPanel.tsx","../src/audit/AuditPanel.tsx","../src/audit/index.tsx"],"sourcesContent":["import { GetAuditChatListQueryArgs } from './auditApi';\r\n\r\nexport interface AuditSearchOption {\r\n label: JSX.Element;\r\n value: string;\r\n}\r\n\r\nconst MEMBER_PREFIX = 'member://';\r\nconst TEXT_PREFIX = 'text://';\r\n\r\nfunction queryOf(\r\n values: string[],\r\n): Pick<GetAuditChatListQueryArgs, 'containsOneOfMembers' | 'searchString'> | null {\r\n let containsOneOfMembers: string[] | null = values\r\n .filter(AuditSearchUtil.isSearchByMember)\r\n .map((v) => v.slice(MEMBER_PREFIX.length));\r\n\r\n containsOneOfMembers = containsOneOfMembers.length > 0 ? containsOneOfMembers : null;\r\n\r\n const searchStringValues = values\r\n .filter(AuditSearchUtil.isSearchByText)\r\n .map((v) => v.slice(TEXT_PREFIX.length));\r\n\r\n const searchString = searchStringValues.length > 0 ? searchStringValues.join(' ') : null;\r\n\r\n if (!containsOneOfMembers && !searchString) {\r\n return null;\r\n }\r\n\r\n return {\r\n containsOneOfMembers,\r\n searchString,\r\n };\r\n}\r\n\r\nexport const AuditSearchUtil = Object.freeze({\r\n MEMBER_PREFIX,\r\n TEXT_PREFIX,\r\n isSearchByMember: (value: string) => value.startsWith(MEMBER_PREFIX),\r\n isSearchByText: (value: string) => value.startsWith(TEXT_PREFIX),\r\n queryOf,\r\n});\r\n","import { Account, chatifyApi, customize, Localizer, useLocalizer } from '@webinex/chatify';\r\nimport { Select } from 'antd';\r\nimport classNames from 'classnames';\r\nimport { useEffect, useMemo, useState } from 'react';\r\nimport { AuditSearchUtil } from './AuditSearchValue';\r\n\r\nexport interface AuditSearchProps {\r\n className?: string;\r\n onSearch?: (values: string[]) => void;\r\n}\r\n\r\ntype Value = { label: JSX.Element; value: string };\r\n\r\nfunction* mapOptions(localizer: Localizer, accounts: Account[] | undefined, searchValue: string) {\r\n if (searchValue.length === 0) return;\r\n\r\n if (searchValue.length > 0)\r\n yield {\r\n label: localizer.audit.textSearchOption(searchValue),\r\n value: AuditSearchUtil.TEXT_PREFIX + searchValue,\r\n };\r\n\r\n for (const account of accounts?.filter((x) =>\r\n x.name.toLocaleLowerCase().includes(searchValue.toLocaleLowerCase()),\r\n ) ?? []) {\r\n yield {\r\n label: localizer.audit.memberSearchOption(account),\r\n value: AuditSearchUtil.MEMBER_PREFIX + account.id,\r\n };\r\n }\r\n}\r\n\r\nfunction useOptions(accounts: Account[] | undefined, searchValue: string) {\r\n const localizer = useLocalizer();\r\n return useMemo(\r\n () => Array.from(mapOptions(localizer, accounts, searchValue)),\r\n [localizer, accounts, searchValue],\r\n );\r\n}\r\n\r\nexport const AuditSearch = customize('AuditSearch', (props: AuditSearchProps) => {\r\n const { className, onSearch } = props;\r\n const [searchValue, setSearchValue] = useState('');\r\n const [values, setValues] = useState<Value[]>([]);\r\n const { data: accounts, isLoading } = chatifyApi.useGetAccountListQuery({});\r\n const options = useOptions(accounts, searchValue);\r\n const localizer = useLocalizer();\r\n\r\n useEffect(() => {\r\n onSearch?.(values.map((x) => x.value));\r\n }, [onSearch, values]);\r\n\r\n return (\r\n <div className={classNames('wxchtf-search', className)}>\r\n <Select<string[], Value>\r\n allowClear\r\n className=\"wxchtf-search-select\"\r\n mode=\"multiple\"\r\n value={values.map((x) => x.value)}\r\n options={options.length > 0 ? options : values}\r\n searchValue={searchValue}\r\n onSearch={setSearchValue}\r\n onSelect={(_, option) => {\r\n setValues((prev) => {\r\n if (AuditSearchUtil.isSearchByText(option.value)) {\r\n prev = prev.filter((x) => !AuditSearchUtil.isSearchByText(x.value));\r\n }\r\n\r\n return [...prev, option];\r\n });\r\n setSearchValue('');\r\n }}\r\n onDeselect={(_, option) => {\r\n setValues((prev) => prev.filter((x) => x.value !== option.value));\r\n setSearchValue('');\r\n }}\r\n filterOption={false}\r\n onDropdownVisibleChange={() => setSearchValue('')}\r\n disabled={isLoading}\r\n loading={isLoading}\r\n placeholder={localizer.audit.searchPlaceholder}\r\n notFoundContent={\r\n searchValue.length === 0 ? localizer.audit.noInputBlurb : localizer.audit.noChatFound\r\n }\r\n size=\"large\"\r\n />\r\n </div>\r\n );\r\n});\r\n","import { PagingRule } from '@webinex/asky';\r\nimport { Account, chatifyApi, File, ListSegment, Optional } from '@webinex/chatify';\r\n\r\nexport interface GetAuditChatListQueryArgs {\r\n containsOneOfMembers: string[] | null;\r\n searchString: string | null;\r\n pagingRule: PagingRule | null;\r\n includeTotal: boolean | null;\r\n}\r\n\r\nexport interface AuditChatResponse {\r\n id: string;\r\n workspaceId: string;\r\n name: string;\r\n createdAt: string;\r\n createdById: string;\r\n lastMessage: Optional<AuditChatMessage>;\r\n}\r\n\r\nexport interface AuditChatMessage {\r\n id: string;\r\n authorId: string;\r\n sentAt: string;\r\n text: string | null;\r\n files: File[];\r\n sentBy: Account;\r\n}\r\n\r\nexport interface AuditChatListItem {\r\n id: string;\r\n workspaceId: string;\r\n name: string;\r\n createdAt: string;\r\n createdById: string;\r\n lastMessage: AuditChatMessage;\r\n}\r\n\r\nexport interface AuditChat {\r\n id: string;\r\n workspaceId: string;\r\n name: string;\r\n createdAt: string;\r\n createdById: string;\r\n}\r\n\r\nfunction qs(params: Record<string, any>): string {\r\n const query = new URLSearchParams();\r\n Object.entries(params).forEach(([key, value]) => {\r\n if (value !== null && value !== undefined) {\r\n query.append(key, typeof value === 'string' ? value : JSON.stringify(value));\r\n }\r\n });\r\n\r\n return query.toString();\r\n}\r\n\r\nexport const auditApi = chatifyApi.injectEndpoints({\r\n endpoints: (build) => ({\r\n getAuditChatList: build.query<ListSegment<AuditChatListItem>, GetAuditChatListQueryArgs>({\r\n queryFn: async (args) =>\r\n chatifyApi.settings.client.axios\r\n .get<ListSegment<AuditChatResponse>>(`audit/chats?${qs({ query: args })}`)\r\n .then(({ data }) => ({\r\n data: {\r\n total: data.total,\r\n items: data.items.map(\r\n ({ lastMessage, ...x }): AuditChatListItem => ({ ...x, lastMessage: lastMessage.value! }),\r\n ),\r\n },\r\n }))\r\n .catch((error) => ({ error })),\r\n providesTags: ['chat', 'message'],\r\n }),\r\n\r\n getAuditChat: build.query<AuditChat, { id: string }>({\r\n queryFn: async (args) =>\r\n chatifyApi.settings.client.axios\r\n .get(`audit/chats/${encodeURIComponent(args.id)}`)\r\n .then(({ data }) => ({ data }))\r\n .catch((error) => ({ error })),\r\n providesTags: ['chat'],\r\n }),\r\n\r\n getAuditChatMessagesInfinite: build.infiniteQuery<\r\n ListSegment<AuditChatMessage>,\r\n { id: string },\r\n { skip: number; take: number }\r\n >({\r\n queryFn: async (args) => {\r\n const {\r\n pageParam,\r\n queryArg: { id },\r\n } = args;\r\n\r\n return chatifyApi.settings.client.axios\r\n .get(`audit/messages?${qs({ query: { chatId: id, pagingRule: pageParam, includeTotal: true } })}`)\r\n .then(({ data }) => ({ data }))\r\n .catch((error) => ({ error }));\r\n },\r\n infiniteQueryOptions: {\r\n initialPageParam: { skip: 0, take: 20 },\r\n getNextPageParam: (lastPage, _, lastPageParam) =>\r\n lastPage.total > lastPageParam.skip + lastPageParam.take\r\n ? {\r\n skip: lastPageParam.skip + lastPageParam.take,\r\n take: lastPageParam.take,\r\n }\r\n : undefined,\r\n },\r\n providesTags: ['message', 'chat'],\r\n }),\r\n }),\r\n});\r\n","import { ChatList, customize } from '@webinex/chatify';\r\nimport { Empty, Skeleton } from 'antd';\r\nimport { AuditChatListItem } from './auditApi';\r\n\r\nexport interface AuditChatListProps {\r\n items: AuditChatListItem[];\r\n loading: boolean;\r\n selected: string | null;\r\n onSelect: (id: string) => void;\r\n top?: number;\r\n}\r\n\r\nexport const AuditChatList = customize('AuditChatList', (props: AuditChatListProps) => {\r\n const { items, selected, onSelect, loading, top } = props;\r\n\r\n if (loading) {\r\n return <Skeleton />;\r\n }\r\n\r\n if (items.length === 0) {\r\n return <Empty />;\r\n }\r\n\r\n return <ChatList items={items} selected={selected} onSelect={onSelect} noRead top={top} />;\r\n});\r\n","import { Conversation, customize } from '@webinex/chatify';\r\nimport { auditApi } from './auditApi';\r\nimport { useMemo } from 'react';\r\n\r\nexport interface AuditConversationPanelProps {\r\n id: string;\r\n onClose?: () => void;\r\n\r\n /**\r\n * Number of messages to load per page.\r\n * @default 20\r\n */\r\n pageSize?: number;\r\n}\r\n\r\nexport const AuditConversationPanel = customize(\r\n 'AuditConversationPanel',\r\n (props: AuditConversationPanelProps) => {\r\n const { id, onClose, pageSize = 20 } = props;\r\n const { data: chat } = auditApi.useGetAuditChatQuery({ id });\r\n\r\n const {\r\n data: messageSegments,\r\n isFetchingNextPage,\r\n fetchNextPage,\r\n hasNextPage,\r\n } = auditApi.useGetAuditChatMessagesInfiniteInfiniteQuery(\r\n { id },\r\n { initialPageParam: { skip: 0, take: pageSize } },\r\n );\r\n\r\n const messages = useMemo(() => messageSegments?.pages.flatMap((x) => x.items) ?? [], [messageSegments]);\r\n\r\n if (!chat) return null;\r\n\r\n return (\r\n <Conversation\r\n value={{ active: false, id, lastReadMessageId: null, name: chat.name }}\r\n nextLoading={isFetchingNextPage}\r\n onNext={fetchNextPage}\r\n hasMore={!isFetchingNextPage && hasNextPage}\r\n messages={messages}\r\n noReadTracking\r\n onClose={onClose}\r\n compact={false}\r\n />\r\n );\r\n },\r\n);\r\n","import classNames from 'classnames';\r\nimport { AuditSearch } from './AuditSearch';\r\nimport { useCallback, useEffect, useMemo, useState } from 'react';\r\nimport { AuditSearchUtil } from './AuditSearchValue';\r\nimport { auditApi } from './auditApi';\r\nimport { AuditChatList } from './AuditChatList';\r\nimport { CustomizeContext, defaultLocalizer, Localizer, LocalizerContext } from '@webinex/chatify';\r\nimport { AuditConversationPanel } from './AuditConversationPanel';\r\nimport { AuditPanelCustomizeValue } from './AuditPanelCustomizeValue';\r\n\r\nexport interface AuditPanelProps {\r\n className?: string;\r\n style?: React.CSSProperties;\r\n localizer?: Localizer;\r\n customize?: AuditPanelCustomizeValue;\r\n\r\n /**\r\n * Maximum number of chats to load.\r\n * @default 100\r\n */\r\n max?: number;\r\n}\r\n\r\nfunction useData(props: AuditPanelProps, values: string[]) {\r\n const { max } = props;\r\n const query = useMemo(() => AuditSearchUtil.queryOf(values), [values]);\r\n\r\n const { currentData: chats, isLoading } = auditApi.useGetAuditChatListQuery(\r\n {\r\n ...query!,\r\n pagingRule: { skip: 0, take: max! },\r\n includeTotal: true,\r\n },\r\n { skip: !query },\r\n );\r\n\r\n return useMemo(() => ({ chats: chats?.items ?? [], isLoading }), [chats, isLoading]);\r\n}\r\n\r\nconst EMPTY = Object.freeze({} as AuditPanelCustomizeValue);\r\n\r\nexport function AuditPanel(props: AuditPanelProps) {\r\n props = { max: 100, customize: EMPTY, ...props };\r\n const { className, style, localizer = defaultLocalizer, customize = EMPTY, max } = props;\r\n const [values, setValues] = useState<string[]>([]);\r\n const { chats, isLoading } = useData(props, values);\r\n\r\n const [selectedId, setSelectedId] = useState<string | null>(null);\r\n const resetSelected = useCallback(() => setSelectedId(null), []);\r\n\r\n useEffect(() => {\r\n if (chats.every((x) => x.id !== selectedId)) {\r\n setSelectedId(null);\r\n }\r\n }, [chats, selectedId]);\r\n\r\n return (\r\n <CustomizeContext.Provider value={customize}>\r\n <LocalizerContext.Provider value={localizer}>\r\n <div className={classNames(className, 'wxchtf-audit-panel')} style={style}>\r\n <AuditSearch onSearch={setValues} />\r\n <div className={classNames('wxchtf-audit-body', { '--conversation-opened': !!selectedId })}>\r\n <AuditChatList\r\n items={chats}\r\n loading={isLoading}\r\n selected={selectedId}\r\n onSelect={setSelectedId}\r\n top={Math.min(chats.length, max!)}\r\n />\r\n {selectedId && <AuditConversationPanel id={selectedId} onClose={resetSelected} />}\r\n </div>\r\n </div>\r\n </LocalizerContext.Provider>\r\n </CustomizeContext.Provider>\r\n );\r\n}\r\n","import { Space } from 'antd';\r\nimport { AuditPanel } from './AuditPanel';\r\nimport './index.d';\r\nimport './styles.scss';\r\nimport { Avatar, Chatify, defaultLocalizer } from '@webinex/chatify';\r\n\r\nexport * from './AuditPanel';\r\nexport * from './AuditPanelCustomizeValue';\r\nexport * from './AuditChatList';\r\nexport * from './AuditSearchValue';\r\nexport * from './AuditSearch';\r\nexport * from './auditApi';\r\nexport * from './AuditConversationPanel';\r\n\r\nChatify.Audit = AuditPanel;\r\n\r\ndefaultLocalizer.audit = {\r\n searchPlaceholder: 'Search chats by chat name or member name',\r\n noChatFound: 'No chats found',\r\n noInputBlurb: 'Start typing to search',\r\n textSearchOption: (text) => <span>{`Chat name includes \"${text}\"`}</span>,\r\n memberSearchOption: (account) => (\r\n <Space>\r\n <Avatar account={account} />\r\n {`Chat includes \"${account.name}\"`}\r\n </Space>\r\n ),\r\n};\r\n"],"names":["customize"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { p, A, q, r, s, t, al, aH, l, m, B, E, I, M, G, F, H, N, n, ap, aq, ar, as, at, au, av, aw, ax, J, g, h, i, o, j, d, aI, ag, aa, ab, ae, ac, ad, z, v, w, x, y, C, D, am, an, O, U, T, P, Q, R, S, L, V, W, X, a0, $, Y, a2, Z, ao, _, a1, ay, a3, a4, a5, a6, a7, a9, ah, aj, ai, aD, aC, az, aG, c, b, f, a8, aA, aB, aJ, k, K, aE, af, a, u, e, ak, aF } from "./Chatify-CwAfN1wu.js";
1
+ import { p, A, q, r, s, t, al, aH, l, m, B, E, I, M, G, F, H, N, n, ap, aq, ar, as, at, au, av, aw, ax, J, g, h, i, o, j, d, aI, ag, aa, ab, ae, ac, ad, z, v, w, x, y, C, D, am, an, O, U, T, P, Q, R, S, L, V, W, X, a0, $, Y, a2, Z, ao, _, a1, ay, a3, a4, a5, a6, a7, a9, ah, aj, ai, aD, aC, az, aG, c, b, f, a8, aA, aB, aJ, k, K, aE, af, a, u, e, ak, aF } from "./Chatify-CP2jgo8d.js";
2
2
  export {
3
3
  p as AUTO_REPLY_FORM_INITIAL_VALUE,
4
4
  A as AutoReplyButton,
@@ -1,17 +1,19 @@
1
1
  import { Account } from '../core';
2
2
  import { AuditPanel } from './AuditPanel';
3
- declare module '../index.ts' {
4
- interface ChatifyType {
5
- Audit: typeof AuditPanel;
6
- }
7
-
8
- interface Localizer {
9
- audit: {
10
- searchPlaceholder: string;
11
- noChatFound: string;
12
- noInputBlurb: string;
13
- textSearchOption: (searchValue: string) => JSX.Element;
14
- memberSearchOption: (account: Account) => JSX.Element;
15
- };
16
- }
17
- }
3
+
4
+
5
+ declare module '../index.ts' {
6
+ interface ChatifyType {
7
+ Audit: typeof AuditPanel;
8
+ }
9
+
10
+ interface Localizer {
11
+ audit: {
12
+ searchPlaceholder: string;
13
+ noChatFound: string;
14
+ noInputBlurb: string;
15
+ textSearchOption: (searchValue: string) => JSX.Element;
16
+ memberSearchOption: (account: Account) => JSX.Element;
17
+ };
18
+ }
19
+ }
@@ -1,10 +1,12 @@
1
1
  import { PropsWithChildren } from 'react';
2
2
  export interface ChatContext {
3
3
  id: string;
4
+ compact: boolean;
4
5
  showMembers: boolean;
5
6
  onShowMembers: (value: boolean) => void;
6
7
  }
7
8
  export declare function useChatContext(): ChatContext;
8
9
  export declare function ChatContext(props: PropsWithChildren<{
9
10
  id: string;
11
+ compact: boolean;
10
12
  }>): import("react/jsx-runtime").JSX.Element;
@@ -9,5 +9,12 @@ export interface ChatPanelProps {
9
9
  style?: CSSProperties;
10
10
  localizer?: Localizer;
11
11
  customize?: ChatPanelCustomizeValue;
12
+ /**
13
+ * If true, the chat panel will be displayed in compact mode.
14
+ * If a number is provided, the chat panel will be displayed in compact mode if its width is less than the provided number of pixels.
15
+ *
16
+ * @default 768
17
+ */
18
+ compact?: boolean | number;
12
19
  }
13
20
  export declare function ChatPanel(props: ChatPanelProps): import("react/jsx-runtime").JSX.Element;
@@ -2,8 +2,10 @@ import { ConversationCustomizeValue, ConversationValue } from '../Conversation';
2
2
  import { ChatEditableHeaderName } from './ChatEditableHeaderName';
3
3
  import { ChatHeaderActions } from './ChatHeaderActions';
4
4
  import { ChatMembersCustomizeValue } from './Members';
5
- export interface ChatProps {
5
+ export interface ChatViewProps {
6
6
  value: ChatValue;
7
+ compact?: boolean;
8
+ onBackClick?: () => void;
7
9
  }
8
10
  export interface ChatValue extends ConversationValue {
9
11
  }
@@ -13,4 +15,4 @@ export interface ChatViewCustomizeValue extends ConversationCustomizeValue, Chat
13
15
  ChatView?: typeof ChatView.Component | null;
14
16
  }
15
17
  export declare const DEFAULT_CHAT_VIEW_CUSTOMIZE_VALUE: ConversationCustomizeValue;
16
- export declare const ChatView: import('../../index.ts').Customizable<import('react').ComponentType<ChatProps>>;
18
+ export declare const ChatView: import('../../index.ts').Customizable<import('react').ComponentType<ChatViewProps>>;
@@ -3,6 +3,7 @@ export interface ChatGroupContext {
3
3
  view: 'chat' | 'new-chat' | 'auto-reply' | null;
4
4
  chatId: string | null;
5
5
  showMembers: boolean;
6
+ compact: boolean;
6
7
  none(): void;
7
8
  openChat(chatId: string): void;
8
9
  toggleNewChat(): void;
@@ -10,4 +11,6 @@ export interface ChatGroupContext {
10
11
  toggleAutoReply(): void;
11
12
  }
12
13
  export declare function useChatGroupContext(): ChatGroupContext;
13
- export declare function ChatGroupContext(props: PropsWithChildren<{}>): import("react/jsx-runtime").JSX.Element;
14
+ export declare function ChatGroupContext(props: PropsWithChildren<{
15
+ compact: boolean;
16
+ }>): import("react/jsx-runtime").JSX.Element;
@@ -7,10 +7,29 @@ import { ChatViewCustomizeValue } from '../Chat';
7
7
  import { AutoReplyCustomizeValue } from './AutoReply';
8
8
  export interface ChatGroupCustomizeValue extends ChatViewCustomizeValue, AutoReplyCustomizeValue, CreateChatPanelCustomizeValue, ChatListPanelCustomizeValue, ChatGroupLayoutCustomizeValue {
9
9
  }
10
- export interface ChatifyProps {
10
+ export interface ChatGroupPanelProps {
11
+ /**
12
+ * Class name to be applied to the chat group panel container.
13
+ */
11
14
  className?: string;
15
+ /**
16
+ * Style to be applied to the chat group panel container.
17
+ */
12
18
  style?: CSSProperties;
19
+ /**
20
+ * Localizer to be used for the chat group panel. If not provided, the default localizer will be used.
21
+ */
13
22
  localizer?: Localizer;
23
+ /**
24
+ * Chat group panel components customization. If not provided, the default customization will be used.
25
+ */
14
26
  customize?: ChatGroupCustomizeValue;
27
+ /**
28
+ * If true, the chat group panel will be displayed in compact mode.
29
+ * If a number is provided, the chat group panel will be displayed in compact mode if its width is less than the provided number of pixels.
30
+ *
31
+ * @default 768
32
+ */
33
+ compact?: boolean | number;
15
34
  }
16
- export declare const ChatGroupPanel: FC<ChatifyProps>;
35
+ export declare const ChatGroupPanel: FC<ChatGroupPanelProps>;
@@ -11,6 +11,7 @@ import { CommonCustomizeValue } from '../common';
11
11
  import { Flippo } from '@webinex/flippo';
12
12
  export interface ConversationProps extends Omit<ConversationContextValue, keyof ConversationValue> {
13
13
  value: ConversationValue;
14
+ onBackClick?: () => void;
14
15
  }
15
16
  export interface ConversationCustomizeValue extends InputBoxCustomizeValue, MessageCustomizeValue, SendingMessageCustomizeValue, SystemMessageCustomizeValue, CommonCustomizeValue {
16
17
  ConversationActions?: typeof ConversationActions.Component | null;
@@ -12,6 +12,7 @@ export interface ConversationContextValue extends ConversationValue {
12
12
  hasMore?: boolean;
13
13
  nextLoading: boolean;
14
14
  noReadTracking?: boolean;
15
+ compact: boolean;
15
16
  isReading?: (id: string) => boolean;
16
17
  onNext: () => void;
17
18
  onSend?: (message: MessageBody) => void;
@@ -1 +1,4 @@
1
- export declare const ConversationHeader: import('../../index.ts').Customizable<import('react').ComponentType<unknown>>;
1
+ export interface ConversationHeaderProps {
2
+ onBackClick?: () => void;
3
+ }
4
+ export declare const ConversationHeader: import('../../index.ts').Customizable<import('react').ComponentType<ConversationHeaderProps>>;
@@ -24,7 +24,7 @@ export interface LocalizerBase {
24
24
  submitBtn: () => React.ReactNode;
25
25
  };
26
26
  input: {
27
- placeholder: () => string;
27
+ placeholder: (type: 'compact' | 'default') => string;
28
28
  };
29
29
  settings: {
30
30
  members: () => string;
@@ -52,6 +52,9 @@ export interface LocalizerBase {
52
52
  submitBtn: () => React.ReactNode;
53
53
  clearBtn: () => React.ReactNode;
54
54
  };
55
+ members: {
56
+ title: (chatName: string) => React.ReactNode;
57
+ };
55
58
  }
56
59
  export interface Localizer extends LocalizerBase {
57
60
  }
@@ -0,0 +1,4 @@
1
+ export declare function useCompact(thresholdOrCompact?: number | boolean): readonly [import('react').RefObject<HTMLDivElement>, boolean | undefined, {
2
+ width: number;
3
+ height: number;
4
+ } | undefined];
package/package.json CHANGED
@@ -1,81 +1,81 @@
1
- {
2
- "name": "@webinex/chatify",
3
- "description": "Webinex Chatify",
4
- "private": false,
5
- "version": "2.0.0-alpha13",
6
- "author": "Webinex Dev",
7
- "license": "Apache-2.0",
8
- "type": "module",
9
- "main": "dist/index.js",
10
- "module": "dist/index.js",
11
- "types": "dist/types/index.d.ts",
12
- "exports": {
13
- ".": {
14
- "import": "./dist/index.js",
15
- "types": "./dist/types/index.d.ts"
16
- },
17
- "./audit": {
18
- "import": "./dist/audit.js",
19
- "types": "./dist/types/audit/index.d.ts"
20
- }
21
- },
22
- "files": [
23
- "dist",
24
- "src"
25
- ],
26
- "scripts": {
27
- "dev": "vite",
28
- "watch": "vite build --watch",
29
- "build": "tsc -b && vite build"
30
- },
31
- "devDependencies": {
32
- "@microsoft/signalr": "^8.0.0",
33
- "@reduxjs/toolkit": "^2.6.0",
34
- "@types/is-hotkey": "^0.1.10",
35
- "@types/node": "^24.10.1",
36
- "@types/react": "^18.0.33",
37
- "@types/react-dom": "^18.0.11",
38
- "@vitejs/plugin-react": "^4.3.3",
39
- "@webinex/asky": "^1.1.0",
40
- "@webinex/flippo": "^1.0.0",
41
- "antd": "^5.19.0",
42
- "axios": "^1.6.2",
43
- "buffer": "^5.5.0||^6.0.0",
44
- "classnames": "^2.3.2",
45
- "cross-env": "^7.0.3",
46
- "dayjs": "^1.11.7",
47
- "eslint": "^8.38.0",
48
- "is-hotkey": "^0.2.0",
49
- "postcss": "^8.4.21",
50
- "prettier": "^2.8.7",
51
- "react": "^18.2.0",
52
- "react-dom": "^18.2.0",
53
- "react-redux": "^9.1.2",
54
- "react-router-dom": "^6.23.1",
55
- "rimraf": "^5.0.5",
56
- "rollup-plugin-peer-deps-external": "^2.2.4",
57
- "sass-embedded": "^1.82.0",
58
- "shallow-equal": "^3.1.0",
59
- "tslib": "^2.6.2",
60
- "typescript": "~5.6.2",
61
- "typescript-eslint": "^8.10.0",
62
- "vite": "^5.4.9",
63
- "vite-plugin-dts": "^4.3.0",
64
- "vite-plugin-lib-inject-css": "^2.1.1"
65
- },
66
- "peerDependencies": {
67
- "@ant-design/icons": "^5",
68
- "@microsoft/signalr": "^8",
69
- "@reduxjs/toolkit": "^2.6.0",
70
- "@webinex/asky": "^1.1.0",
71
- "@webinex/flippo": "^1",
72
- "antd": "^5",
73
- "axios": "^1",
74
- "classnames": "^2",
75
- "dayjs": "^1.8",
76
- "is-hotkey": ">=0 <1",
77
- "react": ">=16 <=19",
78
- "react-dom": ">=16 <=19",
79
- "shallow-equal": "^3"
80
- }
81
- }
1
+ {
2
+ "name": "@webinex/chatify",
3
+ "description": "Webinex Chatify",
4
+ "private": false,
5
+ "version": "2.0.0-alpha14",
6
+ "author": "Webinex Dev",
7
+ "license": "Apache-2.0",
8
+ "type": "module",
9
+ "main": "dist/index.js",
10
+ "module": "dist/index.js",
11
+ "types": "dist/types/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "import": "./dist/index.js",
15
+ "types": "./dist/types/index.d.ts"
16
+ },
17
+ "./audit": {
18
+ "import": "./dist/audit.js",
19
+ "types": "./dist/types/audit/index.d.ts"
20
+ }
21
+ },
22
+ "files": [
23
+ "dist",
24
+ "src"
25
+ ],
26
+ "scripts": {
27
+ "dev": "vite",
28
+ "watch": "vite build --watch",
29
+ "build": "tsc -b && vite build"
30
+ },
31
+ "devDependencies": {
32
+ "@microsoft/signalr": "^8.0.0",
33
+ "@reduxjs/toolkit": "^2.6.0",
34
+ "@types/is-hotkey": "^0.1.10",
35
+ "@types/node": "^24.10.1",
36
+ "@types/react": "^18.0.33",
37
+ "@types/react-dom": "^18.0.11",
38
+ "@vitejs/plugin-react": "^4.3.3",
39
+ "@webinex/asky": "^1.1.0",
40
+ "@webinex/flippo": "^1.0.0",
41
+ "antd": "^5.19.0",
42
+ "axios": "^1.6.2",
43
+ "buffer": "^5.5.0||^6.0.0",
44
+ "classnames": "^2.3.2",
45
+ "cross-env": "^7.0.3",
46
+ "dayjs": "^1.11.7",
47
+ "eslint": "^8.38.0",
48
+ "is-hotkey": "^0.2.0",
49
+ "postcss": "^8.4.21",
50
+ "prettier": "^2.8.7",
51
+ "react": "^18.2.0",
52
+ "react-dom": "^18.2.0",
53
+ "react-redux": "^9.1.2",
54
+ "react-router-dom": "^6.23.1",
55
+ "rimraf": "^5.0.5",
56
+ "rollup-plugin-peer-deps-external": "^2.2.4",
57
+ "sass-embedded": "^1.82.0",
58
+ "shallow-equal": "^3.1.0",
59
+ "tslib": "^2.6.2",
60
+ "typescript": "~5.6.2",
61
+ "typescript-eslint": "^8.10.0",
62
+ "vite": "^5.4.9",
63
+ "vite-plugin-dts": "^4.3.0",
64
+ "vite-plugin-lib-inject-css": "^2.1.1"
65
+ },
66
+ "peerDependencies": {
67
+ "@ant-design/icons": "^5",
68
+ "@microsoft/signalr": "^8",
69
+ "@reduxjs/toolkit": "^2.6.0",
70
+ "@webinex/asky": "^1.1.0",
71
+ "@webinex/flippo": "^1",
72
+ "antd": "^5",
73
+ "axios": "^1",
74
+ "classnames": "^2",
75
+ "dayjs": "^1.8",
76
+ "is-hotkey": ">=0 <1",
77
+ "react": ">=16 <=19",
78
+ "react-dom": ">=16 <=19",
79
+ "shallow-equal": "^3"
80
+ }
81
+ }
@@ -1,25 +1,25 @@
1
- import { ChatList, customize } from '@webinex/chatify';
2
- import { Empty, Skeleton } from 'antd';
3
- import { AuditChatListItem } from './auditApi';
4
-
5
- export interface AuditChatListProps {
6
- items: AuditChatListItem[];
7
- loading: boolean;
8
- selected: string | null;
9
- onSelect: (id: string) => void;
10
- top?: number;
11
- }
12
-
13
- export const AuditChatList = customize('AuditChatList', (props: AuditChatListProps) => {
14
- const { items, selected, onSelect, loading, top } = props;
15
-
16
- if (loading) {
17
- return <Skeleton />;
18
- }
19
-
20
- if (items.length === 0) {
21
- return <Empty />;
22
- }
23
-
24
- return <ChatList items={items} selected={selected} onSelect={onSelect} noRead top={top} />;
25
- });
1
+ import { ChatList, customize } from '@webinex/chatify';
2
+ import { Empty, Skeleton } from 'antd';
3
+ import { AuditChatListItem } from './auditApi';
4
+
5
+ export interface AuditChatListProps {
6
+ items: AuditChatListItem[];
7
+ loading: boolean;
8
+ selected: string | null;
9
+ onSelect: (id: string) => void;
10
+ top?: number;
11
+ }
12
+
13
+ export const AuditChatList = customize('AuditChatList', (props: AuditChatListProps) => {
14
+ const { items, selected, onSelect, loading, top } = props;
15
+
16
+ if (loading) {
17
+ return <Skeleton />;
18
+ }
19
+
20
+ if (items.length === 0) {
21
+ return <Empty />;
22
+ }
23
+
24
+ return <ChatList items={items} selected={selected} onSelect={onSelect} noRead top={top} />;
25
+ });
@@ -1,48 +1,49 @@
1
- import { Conversation, customize } from '@webinex/chatify';
2
- import { auditApi } from './auditApi';
3
- import { useMemo } from 'react';
4
-
5
- export interface AuditConversationPanelProps {
6
- id: string;
7
- onClose?: () => void;
8
-
9
- /**
10
- * Number of messages to load per page.
11
- * @default 20
12
- */
13
- pageSize?: number;
14
- }
15
-
16
- export const AuditConversationPanel = customize(
17
- 'AuditConversationPanel',
18
- (props: AuditConversationPanelProps) => {
19
- const { id, onClose, pageSize = 20 } = props;
20
- const { data: chat } = auditApi.useGetAuditChatQuery({ id });
21
-
22
- const {
23
- data: messageSegments,
24
- isFetchingNextPage,
25
- fetchNextPage,
26
- hasNextPage,
27
- } = auditApi.useGetAuditChatMessagesInfiniteInfiniteQuery(
28
- { id },
29
- { initialPageParam: { skip: 0, take: pageSize } },
30
- );
31
-
32
- const messages = useMemo(() => messageSegments?.pages.flatMap((x) => x.items) ?? [], [messageSegments]);
33
-
34
- if (!chat) return null;
35
-
36
- return (
37
- <Conversation
38
- value={{ active: false, id, lastReadMessageId: null, name: chat.name }}
39
- nextLoading={isFetchingNextPage}
40
- onNext={fetchNextPage}
41
- hasMore={!isFetchingNextPage && hasNextPage}
42
- messages={messages}
43
- noReadTracking
44
- onClose={onClose}
45
- />
46
- );
47
- },
48
- );
1
+ import { Conversation, customize } from '@webinex/chatify';
2
+ import { auditApi } from './auditApi';
3
+ import { useMemo } from 'react';
4
+
5
+ export interface AuditConversationPanelProps {
6
+ id: string;
7
+ onClose?: () => void;
8
+
9
+ /**
10
+ * Number of messages to load per page.
11
+ * @default 20
12
+ */
13
+ pageSize?: number;
14
+ }
15
+
16
+ export const AuditConversationPanel = customize(
17
+ 'AuditConversationPanel',
18
+ (props: AuditConversationPanelProps) => {
19
+ const { id, onClose, pageSize = 20 } = props;
20
+ const { data: chat } = auditApi.useGetAuditChatQuery({ id });
21
+
22
+ const {
23
+ data: messageSegments,
24
+ isFetchingNextPage,
25
+ fetchNextPage,
26
+ hasNextPage,
27
+ } = auditApi.useGetAuditChatMessagesInfiniteInfiniteQuery(
28
+ { id },
29
+ { initialPageParam: { skip: 0, take: pageSize } },
30
+ );
31
+
32
+ const messages = useMemo(() => messageSegments?.pages.flatMap((x) => x.items) ?? [], [messageSegments]);
33
+
34
+ if (!chat) return null;
35
+
36
+ return (
37
+ <Conversation
38
+ value={{ active: false, id, lastReadMessageId: null, name: chat.name }}
39
+ nextLoading={isFetchingNextPage}
40
+ onNext={fetchNextPage}
41
+ hasMore={!isFetchingNextPage && hasNextPage}
42
+ messages={messages}
43
+ noReadTracking
44
+ onClose={onClose}
45
+ compact={false}
46
+ />
47
+ );
48
+ },
49
+ );