@webinex/chatify 2.0.0-alpha12 → 2.0.0-alpha13
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Chatify-CwAfN1wu.js","sources":["../src/ui/color.ts","../src/ui/customize.tsx","../src/ui/common/Icon.tsx","../src/ui/Chat/ChatContext.tsx","../src/ui/Chat/Members/ChatMembersButton.tsx","../src/core/constants.ts","../src/core/types.tsx","../src/core/debounce.ts","../src/core/api/baseApi.ts","../src/core/client.ts","../src/core/api/api.ts","../src/ui/common/Avatar.tsx","../src/ui/Chat/Members/ChatMembersPanel.tsx","../src/ui/Chat/Members/ChatMembersPreview.tsx","../src/ui/Conversation/InputBox/InputFilesBox.tsx","../src/ui/localizer.tsx","../src/ui/Conversation/InputBox/InputTextBox.tsx","../src/ui/Conversation/InputBox/InputSubmitButtonBox.tsx","../src/ui/Conversation/ConversationContext.ts","../src/ui/common/MessageSkeleton.tsx","../src/ui/common/ChatList/ChatListItemName.tsx","../src/ui/common/ChatList/ChatListItemUnreadCount.tsx","../src/ui/Conversation/SystemMessage/SystemMessageRow.tsx","../src/ui/Conversation/ReadObserver/MessageReadObserver.tsx","../src/ui/Conversation/SystemMessage/SystemMessageBox.tsx","../src/ui/common/ChatList/ChatListItemLastMessageContent.tsx","../src/ui/common/ChatList/ChatListItemLastMessageAuthor.tsx","../src/ui/common/ChatList/ChatListItemLastMessageSentAt.tsx","../src/ui/common/ChatList/ChatListItemLastMessage.tsx","../src/ui/common/ChatList/ChatListItemAvatar.tsx","../src/ui/common/ChatList/ChatListItemBox.tsx","../src/ui/common/ChatList/ChatList.tsx","../src/ui/useFormatter.tsx","../src/ui/Conversation/InputBox/InputBoxFile.tsx","../src/ui/Conversation/InputBox/InputBoxFileList.tsx","../src/ui/Conversation/InputBox/InputBox.tsx","../src/ui/Conversation/Message/MessageAuthor.tsx","../src/ui/Conversation/Message/MessageText.tsx","../src/ui/Conversation/Message/MessageFile.tsx","../src/ui/Conversation/Message/MessageFileList.tsx","../src/ui/Conversation/Message/MessageContent.tsx","../src/ui/Conversation/Message/MessageInfoBox.tsx","../src/ui/Conversation/Message/MessageRow.tsx","../src/ui/Conversation/Message/MessageBox.tsx","../src/ui/Conversation/NextObserver/NextMessagesObserver.tsx","../src/ui/Conversation/SendingMessage/SendingMessageText.tsx","../src/ui/Conversation/SendingMessage/SendingMessageInfoBox.tsx","../src/ui/Conversation/SendingMessage/SendingMessageContent.tsx","../src/ui/Conversation/SendingMessage/SendingMessageBox.tsx","../src/ui/Conversation/ConversationActions.tsx","../src/ui/Conversation/ConversationBody.tsx","../src/ui/Conversation/ConversationName.tsx","../src/ui/Conversation/ConversationHeader.tsx","../src/ui/Conversation/Conversation.tsx","../src/ui/Chat/ChatEditableHeaderName.tsx","../src/ui/Chat/ChatHeaderActions.tsx","../src/ui/Chat/ChatView.tsx","../src/ui/Chat/ChatPanel.tsx","../src/ui/ChatGroup/ChatGroupContext.tsx","../src/ui/ChatGroup/AutoReply/AutoReplyButton.tsx","../src/ui/ChatGroup/AutoReply/AutoReplyPeriodInput.tsx","../src/ui/ChatGroup/AutoReply/AutoReplyTextInput.tsx","../src/ui/ChatGroup/AutoReply/AutoReplyForm.tsx","../src/ui/ChatGroup/AutoReply/AutoReplyPanel.tsx","../src/ui/ChatGroup/Create/CreateChatNameInput.tsx","../src/ui/ChatGroup/Create/CreateChatMemberInput.tsx","../src/ui/ChatGroup/Create/CreateChatForm.tsx","../src/ui/ChatGroup/Create/CreateChatPanel.tsx","../src/ui/ChatGroup/Create/CreateChatButton.tsx","../src/ui/ChatGroup/Layout/ChatGroupActions.tsx","../src/ui/ChatGroup/List/ChatListPanel.tsx","../src/ui/ChatGroup/Layout/ChatGroupAside.tsx","../src/ui/ChatGroup/Layout/ChatGroupHeader.tsx","../src/ui/ChatGroup/Layout/ChatGroupFooter.tsx","../src/ui/ChatGroup/Layout/ChatGroupMain.tsx","../src/ui/ChatGroup/Layout/ChatGroupBody.tsx","../src/ui/ChatGroup/ChatGroupPanel.tsx","../src/ui/Thread/ThreadContext.ts","../src/ui/Thread/ThreadActions.tsx","../src/ui/Thread/ThreadPanel.tsx","../src/ui/Chatify.tsx"],"sourcesContent":["interface ColorOptions {\n saturation?: number;\n lightness?: number;\n}\n\nconst DEFAULT_COLOR_OPTIONS: ColorOptions = {\n saturation: 100,\n lightness: 75,\n};\n\nexport function color(value: string, options: ColorOptions = {}) {\n options = Object.assign({}, DEFAULT_COLOR_OPTIONS, options);\n\n let hash = 0;\n for (let i = 0; i < value.length; i++) {\n hash = value.charCodeAt(i) + ((hash << 5) - hash);\n hash = hash & hash;\n }\n return `hsl(${hash % 360}, ${options.saturation}%, ${options.lightness}%)`;\n}\n","import React, { FC, useContext } from 'react';\n\nexport type Customizable<TComponent extends React.ComponentType<any>> = TComponent & {\n Component: TComponent;\n key: string;\n};\n\nexport const CustomizeContext = React.createContext<Record<string, any>>(null!);\n\nexport function useCustomizeContext<TValue>() {\n return useContext(CustomizeContext) as TValue;\n}\n\nfunction useCustom<TComponent extends React.ComponentType>(key: string): TComponent | undefined | null {\n const value = useContext(CustomizeContext);\n return value ? (value[key] as TComponent | null | undefined) : undefined;\n}\n\nexport function useCustomize<TCustom extends Customizable<React.ComponentType<any>>>(custom: TCustom) {\n const Custom = useCustom<TCustom['Component']>(custom.key);\n\n if (Custom == null) {\n return null;\n }\n\n return Custom ?? custom.Component;\n}\n\nexport function customize<TComponent extends React.ComponentType<any>>(\n key: string,\n Component: TComponent,\n): TComponent extends React.ComponentType<infer X> ? Customizable<React.ComponentType<X>> : never {\n const Result: FC<any> = React.forwardRef<TComponent, any>((props: any, forwardRef) => {\n const Custom = useCustom(key);\n\n if (Custom === null) {\n return null;\n }\n\n if (Custom) {\n return <Custom {...props} ref={forwardRef} />;\n }\n\n return <Component {...props} ref={forwardRef} />;\n });\n\n Component.displayName = Component.displayName || key;\n Result.displayName = 'Customizable.' + Component.displayName;\n\n return Object.assign(Result, { key, Component }) as any;\n}\n","import { FC } from 'react';\nimport { customize } from '../customize';\nimport {\n SendOutlined,\n PaperClipOutlined,\n UserAddOutlined,\n UsergroupAddOutlined,\n UserDeleteOutlined,\n UsergroupDeleteOutlined,\n TeamOutlined,\n EditOutlined,\n CloseOutlined,\n EyeInvisibleOutlined,\n EyeOutlined,\n DeleteOutlined,\n DownloadOutlined,\n SettingOutlined,\n} from '@ant-design/icons';\n\nexport type IconType = keyof typeof ICONS;\n\nexport interface IconProps {\n type: IconType;\n}\n\nexport const ICONS = {\n attach: PaperClipOutlined,\n send: SendOutlined,\n 'remove-member': UserDeleteOutlined,\n 'remove-member-delete-history': UsergroupDeleteOutlined,\n 'add-member': UserAddOutlined,\n 'add-member-with-history': UsergroupAddOutlined,\n members: TeamOutlined,\n edit: EditOutlined,\n close: CloseOutlined,\n chat: TeamOutlined,\n watch: EyeOutlined,\n unwatch: EyeInvisibleOutlined,\n 'delete-file': DeleteOutlined,\n 'open-file': DownloadOutlined,\n settings: SettingOutlined,\n};\n\nexport const Icon = customize<FC<IconProps>>('Icon', (props) => {\n const { type } = props;\n const IconComponent = ICONS[type];\n return IconComponent ? <IconComponent /> : null;\n});\n","import React, { PropsWithChildren, useContext, useMemo, useState } from 'react';\n\nexport interface ChatContext {\n id: string;\n showMembers: boolean;\n onShowMembers: (value: boolean) => void;\n}\n\nconst ChatReactContext = React.createContext<ChatContext>(null!);\n\nexport function useChatContext() {\n return useContext(ChatReactContext);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport function ChatContext(props: PropsWithChildren<{ id: string }>) {\n const { id, children } = props;\n const [showMembers, onShowMembers] = useState(false);\n\n const value = useMemo<ChatContext>(\n () => ({\n id,\n showMembers,\n onShowMembers,\n }),\n [id, showMembers],\n );\n\n return <ChatReactContext.Provider value={value}>{children}</ChatReactContext.Provider>;\n}\n","import { Button } from 'antd';\nimport { customize } from '../../customize';\nimport { Icon } from '../../common/Icon';\nimport { useChatContext } from '../ChatContext';\n\nexport const ChatMembersButton = customize('ChatMembersButton', () => {\n const { showMembers, onShowMembers } = useChatContext();\n return <Button onClick={() => onShowMembers(!showMembers)} type=\"link\" icon={<Icon type=\"members\" />} />;\n});\n","export const SYSTEM_ID = 'chatify::system';\n","export interface Optional<TValue> {\n hasValue: boolean;\n value?: TValue | null;\n}\n\nexport interface File {\n name: string;\n bytes: number;\n ref: string;\n}\n\nexport interface Period {\n start: string;\n end: string;\n}\n\nexport interface AutoReply {\n text: string;\n period: Period;\n}\n\nexport interface Account {\n id: string;\n name: string;\n avatar: string;\n autoReply: AutoReply | null;\n}\n\nexport interface UpdateAccountRequest {\n id: string;\n autoReply?: Optional<AutoReply> | null;\n name?: Optional<string> | null;\n avatar?: Optional<string> | null;\n active?: Optional<boolean> | null;\n}\n\nexport interface MessageBase {\n id: string;\n text: string | null;\n files: File[];\n sentAt: string;\n sentBy: Account;\n}\n\nexport interface ChatMessage extends MessageBase {\n chatId: string;\n}\n\nexport interface Chat {\n id: string;\n name: string;\n members: Account[];\n active: boolean;\n lastReadMessageId: string | null;\n}\n\nexport interface ChatListItem {\n id: string;\n name: string;\n message: ChatMessage;\n totalUnreadCount: number;\n active: boolean;\n lastReadMessageId: string | null;\n}\n\nexport interface SendChatMessageRequest {\n chatId: string;\n text: string | null;\n files: File[];\n}\n\nexport interface MessageBody {\n text: string | null;\n files: File[];\n}\n\nexport interface AddChatRequest {\n name: string;\n message?: MessageBody;\n members: string[];\n}\n\nexport interface ReadChatMessageRequest {\n id: string;\n}\n\nexport interface ReadChatMessageEvent {\n chatId: string;\n newLastReadMessageId: string;\n readCount: number;\n}\n\nexport interface RemoveChatMemberRequest {\n chatId: string;\n accountId: string;\n deleteHistory: boolean;\n}\n\nexport interface AddChatMemberRequest {\n chatId: string;\n accountId: string;\n withHistory: boolean;\n}\n\nexport interface UpdateChatNameRequest {\n id: string;\n name: string;\n}\n\nexport function chatId(messageId: string) {\n return messageId.slice(0, 36);\n}\n\nexport function messageSequencePart(id: string) {\n return id.slice(37);\n}\n\nexport interface ThreadWatchListItem {\n id: string;\n name: string;\n createdById: string;\n createdAt: string;\n archive: boolean;\n lastMessage: ThreadMessage | null;\n lastReadMessageId: string | null;\n}\n\nexport interface Thread {\n id: string;\n name: string;\n createdBy: Account;\n createdAt: string;\n archive: boolean;\n lastMessageId: string | null;\n lastReadMessageId: string | null;\n watch: boolean;\n}\n\nexport interface ThreadMessage extends MessageBase {\n threadId: string;\n}\n\nexport interface SendThreadMessageRequest {\n threadId: string;\n body: MessageBody;\n}\n\nexport interface ListSegment<T> {\n items: T[];\n total: number;\n}\n\nexport type SystemMessageText =\n | 'chatify://chat-created'\n | 'chatify://member-added'\n | 'chatify://member-removed'\n | `chatify://chat-name-changed`;\n\nexport function parseThreadMessageId(messageId: string) {\n const [threadId, index] = messageId.split('::', 2);\n return [threadId, parseInt(index, 10)] as const;\n}\n\nexport function calcThreadUnreadCount(\n thread: Pick<ThreadWatchListItem, 'lastMessage' | 'lastReadMessageId'>,\n) {\n const lastReadMessageIndex =\n thread.lastReadMessageId != null ? parseThreadMessageId(thread.lastReadMessageId)[1] : -1;\n\n const lastThreadMessageIndex =\n thread.lastMessage?.id != null ? parseThreadMessageId(thread.lastMessage?.id)[1] : -1;\n\n return lastThreadMessageIndex - lastReadMessageIndex;\n}\n\nexport function calcThreadListUnreadCount(\n threads: Pick<ThreadWatchListItem, 'lastMessage' | 'lastReadMessageId'>[],\n) {\n return threads.reduce((prev, thread) => {\n return prev + calcThreadUnreadCount(thread);\n }, 0);\n}\n","interface DebounceInternalValue<T> {\n value: T;\n enqueueTime: number;\n}\n\nexport interface DebounceValue<T> extends DebounceInternalValue<T> {\n state: 'enqueued' | 'processing';\n}\n\nexport interface DebounceConfig<T> {\n timeout: number;\n callback: (value: T) => Promise<any>;\n groupBy: (value: T) => string;\n compare: (a: T, b: T) => number;\n}\n\nexport class Debounce<T> {\n private _enqueued: DebounceInternalValue<T>[] = [];\n private _processing: DebounceInternalValue<T>[] = [];\n private _timeoutByGroup: Record<string, number> = {};\n private _subscribers: ((value: Debounce<T>) => any)[] = [];\n\n constructor(public config: DebounceConfig<T>) {}\n\n public get units(): DebounceValue<T>[] {\n return [\n ...this._enqueued.map((x) => ({ ...x, state: 'enqueued' as const })),\n ...this._processing.map((x) => ({ ...x, state: 'processing' as const })),\n ];\n }\n\n public subscribe = (callback: (value: Debounce<T>) => any) => {\n this._subscribers.push(callback);\n return () => {\n this._subscribers = this._subscribers.filter((x) => x !== callback);\n };\n };\n\n public notify = () => {\n this._subscribers.forEach((subscriber) => subscriber(this));\n };\n\n public push(value: T) {\n const group = this.config.groupBy(value);\n const unit = this._enqueued.find((unit) => this.config.groupBy(unit.value) === group);\n\n if (!unit) {\n this._enqueued.push({ value, enqueueTime: Date.now() });\n } else if (this.config.compare(unit.value, value) >= 0) {\n unit.value = value;\n unit.enqueueTime = Date.now();\n }\n\n this._process(group);\n }\n\n private _process(group: string) {\n if (!this._enqueued.some((unit) => this.config.groupBy(unit.value) === group)) {\n return;\n }\n\n let timeout = this._timeoutByGroup[group];\n timeout && clearTimeout(timeout);\n\n if (this._processing.some((unit) => this.config.groupBy(unit.value) === group)) {\n return;\n }\n\n timeout = setTimeout(() => {\n const processing = this._enqueued.find((unit) => this.config.groupBy(unit.value) === group)!;\n this._processing.push(processing);\n this._enqueued.splice(this._enqueued.indexOf(processing), 1);\n this.notify();\n\n this.config\n .callback(processing.value)\n .then(() => {\n this._processing.splice(this._processing.indexOf(processing), 1);\n this.notify();\n this._process(group);\n })\n .catch(() => {\n this._processing.splice(this._processing.indexOf(processing), 1);\n this.push(processing.value);\n });\n }, this.config.timeout);\n\n this._timeoutByGroup[group] = timeout;\n }\n}\n","import { BaseQueryFn, EndpointBuilder, createApi, fakeBaseQuery } from '@reduxjs/toolkit/query/react';\nimport { ChatifyClient } from '../client';\nimport { Debounce } from '../debounce';\nimport { chatId } from '../types';\n\nexport const DEFAULT_MESSAGE_LIST_TAKE = 20;\n\nexport const CHAT_MESSAGE_READ_QUEUE = new Debounce<string>({\n callback: (id) => __settings.client.readChatMessage({ id }),\n compare: (a, b) => -a.localeCompare(b),\n groupBy: (id) => chatId(id),\n timeout: 500,\n});\n\nexport interface ChatifyApiSettings {\n me: () => string;\n client: ChatifyClient;\n}\n\nexport const __settings: ChatifyApiSettings = {\n me: null!,\n client: null!,\n};\n\nconst TAG_TYPES = ['chat', 'account', 'message', 'thread', 'thread-message'] as const;\n\nexport interface BaseApiEndpointBuilder\n extends EndpointBuilder<BaseQueryFn, (typeof TAG_TYPES)[number], 'chatify'> {}\n\nconst baseApi: ReturnType<typeof createApi<BaseQueryFn, {}, 'chatify', (typeof TAG_TYPES)[number]>> =\n createApi({\n baseQuery: fakeBaseQuery(),\n reducerPath: 'chatify',\n tagTypes: TAG_TYPES,\n endpoints: (_) => ({}),\n });\n\nexport const __baseApi = baseApi;\n","import { AxiosInstance } from 'axios';\nimport * as SignalR from '@microsoft/signalr';\nimport {\n Account,\n AddChatRequest,\n AddChatMemberRequest,\n Chat,\n ChatListItem,\n ChatMessage,\n ReadChatMessageEvent,\n ReadChatMessageRequest,\n RemoveChatMemberRequest,\n SendChatMessageRequest,\n UpdateChatNameRequest,\n SendThreadMessageRequest,\n Thread,\n ThreadMessage,\n ThreadWatchListItem as ThreadListItem,\n UpdateAccountRequest,\n} from './types';\n\nexport interface ChatifySignalRConfig {\n hubUri?: string;\n accessTokenFactory?: () => Promise<string>;\n headersFactory?: () => Promise<Record<string, string>>;\n}\n\nconst DEFAULT_SIGNALR_CONFIG: ChatifySignalRConfig = {\n hubUri: '/api/chatify/hub',\n headersFactory: () => Promise.resolve({}),\n};\n\nexport interface ChatifyClientConfig {\n axios: AxiosInstance;\n signalR: ChatifySignalRConfig;\n}\n\nexport const CHATIFY_SIGNALR_METHODS = [\n 'chatify://chat-new-message',\n 'chatify://chat-created',\n 'chatify://chat-message-read',\n 'chatify://chat-member-added',\n 'chatify://chat-member-removed',\n 'chatify://chat-name-changed',\n\n 'chatify://thread-created',\n 'chatify://thread-message-new',\n 'chatify://thread-message-read',\n 'chatify://thread-watch-added',\n 'chatify://thread-watch-removed',\n 'chatify://thread-updated',\n] as const;\n\nexport type ChatifySignalRMethod = (typeof CHATIFY_SIGNALR_METHODS)[number];\n\nexport type ChatifySignalRArgsByMethod = {\n 'chatify://chat-new-message': [message: ChatMessage];\n 'chatify://chat-created': [chat: ChatListItem];\n 'chatify://chat-message-read': [events: ReadChatMessageEvent[]];\n 'chatify://chat-member-added': [\n chatId: string,\n chatName: string,\n account: Account,\n message: ChatMessage,\n withHistory: boolean,\n read: boolean,\n ];\n 'chatify://chat-member-removed': [\n chatId: string,\n accountId: string,\n deleteHistory: boolean,\n message: ChatMessage,\n read: boolean,\n ];\n 'chatify://chat-name-changed': [chatId: string, newName: string, message: ChatMessage, read: boolean];\n\n 'chatify://thread-message-new': [threadId: string, message: ThreadMessage, readForId: string | null];\n 'chatify://thread-message-read': [threadId: string, messageId: string];\n 'chatify://thread-watch-added': [thread: ThreadListItem];\n 'chatify://thread-watch-removed': [id: string];\n 'chatify://thread-created': [thread: ThreadListItem, watch: boolean];\n 'chatify://thread-updated': [threadId: string, threadName: string];\n};\n\nexport class ChatifyClient {\n private _config: ChatifyClientConfig;\n private _connection: SignalR.HubConnection = null!;\n private _connectionPromise: Promise<SignalR.HubConnection> | null = null!;\n private _subscribers: Record<string, ((args: any[]) => void)[]> = {};\n private _reconnectSubscribers: Array<() => void> = [];\n private _threadConnectionByThreadId = new Map<string, number>();\n\n constructor(config: ChatifyClientConfig) {\n this._config = {\n ...config,\n signalR: {\n ...DEFAULT_SIGNALR_CONFIG,\n ...config.signalR,\n },\n };\n }\n\n public connect = async () => {\n if (this._connection) {\n return;\n }\n\n if (this._connectionPromise) {\n return await this._connectionPromise;\n }\n\n this._connectionPromise = this.createAndStartConnection();\n this._connection = await this._connectionPromise;\n };\n\n private createAndStartConnection = async () => {\n const headers = await this._config.signalR!.headersFactory!();\n\n const connection = new SignalR.HubConnectionBuilder()\n .withUrl(this._config.signalR!.hubUri!, {\n accessTokenFactory: this._config.signalR!.accessTokenFactory\n ? this._config.signalR!.accessTokenFactory\n : undefined,\n headers,\n })\n .withAutomaticReconnect()\n .build();\n\n CHATIFY_SIGNALR_METHODS.forEach((x) => {\n connection.on(x, (...args) => {\n this._subscribers[x]?.forEach((s) => {\n try {\n s(args);\n } catch (ex) {\n console.error(`Failed to notify subscriber`, ex);\n }\n });\n });\n });\n\n connection.onreconnected(() => this._reconnectSubscribers.forEach((subscriber) => subscriber()));\n\n await connection.start();\n return connection;\n };\n\n public subscribe = <TMethod extends ChatifySignalRMethod>(\n method: TMethod,\n subscriber: (args: ChatifySignalRArgsByMethod[TMethod]) => void,\n ) => {\n this.connect().then(() => {\n this._subscribers[method] = this._subscribers[method] ?? [];\n this._subscribers[method].push(subscriber as any);\n });\n return () => this._subscribers[method].filter((x) => x !== subscriber);\n };\n\n public subscribeReconnect = (subscriber: () => any) => {\n this._reconnectSubscribers.push(subscriber);\n return () => this._reconnectSubscribers.filter((x) => x !== subscriber);\n };\n\n public get axios() {\n return this._config.axios;\n }\n\n public accounts = async (args: { ids?: string[] }) => {\n const searchParams = new URLSearchParams();\n\n args?.ids?.forEach((id) => {\n searchParams.append('ids', encodeURIComponent(id));\n });\n\n const { data } = await this.axios.get<Account[]>(`account?${searchParams.toString()}`);\n return data;\n };\n\n public currentUserAccount = async () => {\n const { data } = await this.axios.get<Account>('account/me');\n return data;\n };\n\n public updateAccount = async (request: UpdateAccountRequest) => {\n await this.axios.put(`account/${encodeURIComponent(request.id)}`, request);\n };\n\n public chats = async () => {\n const { data } = await this.axios.get<ChatListItem[]>('chat');\n return data;\n };\n\n public chat = async (id: string) => {\n const { data } = await this.axios.get<Chat>(`chat/${encodeURIComponent(id)}`);\n return data;\n };\n\n public addChat = async (args: AddChatRequest) => {\n const { data } = await this.axios.post<string>(`chat`, args);\n return data;\n };\n\n public chatMessages = async (args: { chatId: string; skip?: number; take?: number }) => {\n const { chatId, skip = 0, take = 20 } = args;\n const pagingRule = encodeURIComponent(JSON.stringify({ skip, take }));\n const { data } = await this.axios.get<ChatMessage[]>(\n `chat/${encodeURIComponent(chatId)}/message?pagingRule=${pagingRule}`,\n );\n return data;\n };\n\n public sendChatMessage = async (request: SendChatMessageRequest) => {\n const { chatId, ...rest } = request;\n await this.axios.post(`chat/${encodeURIComponent(chatId)}/message`, rest);\n };\n\n public readChatMessage = async (request: ReadChatMessageRequest) => {\n await this.axios.put(`chat/message/read`, request);\n };\n\n public removeChatMember = async (request: RemoveChatMemberRequest) => {\n await this.axios.delete(`chat/${encodeURIComponent(request.chatId)}/member`, { data: request });\n };\n\n public updateChatName = async (request: UpdateChatNameRequest) => {\n await this.axios.put(`chat/${encodeURIComponent(request.id)}/name`, request);\n };\n\n public addChatMember = async (request: AddChatMemberRequest) => {\n await this.axios.post(`chat/${encodeURIComponent(request.chatId)}/member`, request);\n };\n\n public sendThreadMessage = async ({ body, threadId }: SendThreadMessageRequest) => {\n const { data: id } = await this.axios.post<string>(`thread/${encodeURIComponent(threadId)}/message`, {\n body,\n });\n return id;\n };\n\n public readThreadMessage = async (id: string) => {\n await this.axios.put(`thread/message/${encodeURIComponent(id)}/read`);\n };\n\n public watchThreads = async () => {\n const { data } = await this.axios.get<ThreadListItem[]>(`thread/watch`);\n return data;\n };\n\n public thread = async (id: string) => {\n const { data } = await this.axios.get<Thread>(`thread/${encodeURIComponent(id)}`);\n return data;\n };\n\n public threadMessages = async ({\n threadId,\n skip,\n take,\n }: {\n threadId: string;\n skip: number;\n take: number;\n }) => {\n const searchParams = new URLSearchParams();\n searchParams.append('skip', skip.toString());\n searchParams.append('take', take.toString());\n const { data } = await this.axios.get<ThreadMessage[]>(\n `thread/${encodeURIComponent(threadId)}/message?${searchParams.toString()}`,\n );\n return data;\n };\n\n public watchThread = async (id: string, watch: boolean) => {\n await this.axios.put(`thread/${encodeURIComponent(id)}/watch`, { watch });\n };\n\n public connectToThread = async (id: string) => {\n const connectionCount = this._threadConnectionByThreadId.get(id) ?? 0;\n this._threadConnectionByThreadId.set(id, connectionCount + 1);\n\n if (connectionCount === 0) {\n this.connect().then(() => this._connection.invoke('ConnectToThread', id));\n }\n };\n\n public disconnectFromThread = async (id: string) => {\n const connectionCount = this._threadConnectionByThreadId.get(id) ?? 0;\n this._threadConnectionByThreadId.set(id, Math.max(0, connectionCount - 1));\n\n if (connectionCount === 1) {\n this.connect().then(() => this._connection.invoke('DisconnectFromThread', id));\n }\n };\n}\n\nexport function unsubscribe(...subscribers: Array<() => void>) {\n const result = () => subscribers.forEach((x) => x());\n result.when = (promise: Promise<any>) => promise.then(result);\n return result;\n}\n","import { DEFAULT_MESSAGE_LIST_TAKE, __baseApi, __settings } from './baseApi';\nimport { useSelector } from 'react-redux';\nimport {\n Account,\n AddChatMemberRequest,\n Chat,\n ChatListItem,\n ChatMessage,\n RemoveChatMemberRequest,\n SendChatMessageRequest,\n SendThreadMessageRequest,\n Thread,\n ThreadMessage,\n ThreadWatchListItem,\n UpdateAccountRequest,\n calcThreadListUnreadCount,\n chatId,\n parseThreadMessageId,\n} from '../types';\nimport { unsubscribe } from '../client';\nimport { Debounce, DebounceValue } from '../debounce';\nimport { useMemo } from 'react';\n\nexport interface ChatMessageListResult {\n messages: ChatMessage[];\n hasMore: boolean;\n}\n\nexport interface ThreadMessageList {\n messages: ThreadMessage[];\n hasMore: boolean;\n}\n\nconst THREAD_MESSAGE_READ_QUEUE = new Debounce<string>({\n callback: (id) => __settings.client.readThreadMessage(id),\n compare: (a, b) => -a.localeCompare(b),\n groupBy: (id) => parseThreadMessageId(id)[0],\n timeout: 500,\n});\n\nconst CHAT_MESSAGE_READ_QUEUE = new Debounce<string>({\n callback: (id) => __settings.client.readChatMessage({ id }),\n compare: (a, b) => -a.localeCompare(b),\n groupBy: (id) => chatId(id),\n timeout: 500,\n});\n\nconst __chatifyApi = __baseApi.injectEndpoints({\n endpoints: (builder) => ({\n // ====================================================\n // ============== ACCOUNT ======================\n // ====================================================\n\n getAccountList: builder.query<Account[], { ids?: string[] }>({\n queryFn: async (args) => ({ data: await __settings.client.accounts(args) }),\n providesTags: ['account'],\n }),\n\n geCurrentUserAccount: builder.query<Account | null, void>({\n queryFn: async () => ({ data: await __settings.client.currentUserAccount() }),\n providesTags: ['account'],\n }),\n\n updateAccount: builder.mutation<void, UpdateAccountRequest>({\n queryFn: async (request) => {\n await __settings.client.updateAccount(request);\n return { data: null! };\n },\n invalidatesTags: ['account'],\n }),\n\n // ====================================================\n // ================ CHAT =======================\n // ====================================================\n\n getChat: builder.query<Chat, { id: string }>({\n queryFn: async ({ id }) => ({ data: await __settings.client.chat(id) }),\n providesTags: ['chat', 'account'],\n onCacheEntryAdded: async ({ id }, { cacheEntryRemoved, cacheDataLoaded, updateCachedData }) => {\n await cacheDataLoaded;\n\n unsubscribe(\n __settings.client.subscribe(\n 'chatify://chat-member-added',\n ([chatId, _, account, message, , read]) =>\n chatId === id &&\n updateCachedData((chat) => {\n chat.members.push(account);\n chat.lastReadMessageId = read ? message.id : chat.lastReadMessageId;\n }),\n ),\n __settings.client.subscribe(\n 'chatify://chat-member-removed',\n ([chatId, accountId, , message, read]) =>\n id === chatId &&\n updateCachedData((chat) => {\n chat.members = chat.members.filter((x) => x.id !== accountId);\n chat.lastReadMessageId = read ? message.id : chat.lastReadMessageId;\n }),\n ),\n __settings.client.subscribe(\n 'chatify://chat-name-changed',\n ([chatId, newName, message, read]) =>\n id === chatId &&\n updateCachedData((chat) => {\n chat.name = newName;\n chat.lastReadMessageId = read ? message.id : chat.lastReadMessageId;\n }),\n ),\n __settings.client.subscribe(\n 'chatify://chat-new-message',\n ([message]) =>\n id === message.chatId &&\n updateCachedData((chat) => {\n chat.lastReadMessageId =\n message.sentBy.id === __settings.me() ? message.id : chat.lastReadMessageId;\n }),\n ),\n __settings.client.subscribe(\n 'chatify://chat-message-read',\n ([events]) =>\n events.find((x) => x.chatId === id) &&\n updateCachedData((chat) => {\n const event = events.find((x) => x.chatId === id)!;\n chat.lastReadMessageId = event.newLastReadMessageId;\n }),\n ),\n ).when(cacheEntryRemoved);\n },\n }),\n\n addChat: builder.mutation<string, { name: string; members: string[] }>({\n queryFn: async ({ name, members }) => {\n const chatId = await __settings.client.addChat({\n name,\n members,\n });\n return { data: chatId };\n },\n }),\n\n updateChatName: builder.mutation<void, { id: string; name: string }>({\n queryFn: async ({ id, name }) => {\n await __settings.client.updateChatName({ id, name });\n return { data: null! };\n },\n }),\n\n // ====================================================\n // ============= CHAT LIST =====================\n // ====================================================\n\n getChatList: builder.query<ChatListItem[], void>({\n queryFn: async () => ({ data: await __settings.client.chats() }),\n providesTags: ['chat', 'account'],\n onCacheEntryAdded: async (_, { cacheEntryRemoved, cacheDataLoaded, updateCachedData }) => {\n await cacheDataLoaded;\n\n unsubscribe(\n __settings.client.subscribe('chatify://chat-created', ([chat]) =>\n updateCachedData((chatList) => {\n chatList.push(chat);\n }),\n ),\n\n __settings.client.subscribe('chatify://chat-new-message', ([message]) =>\n updateCachedData((chatList) => {\n const chat = chatList.find((x) => x.id === message.chatId);\n\n if (!chat) {\n return;\n }\n\n chat.message = message;\n\n if (message.sentBy.id === __settings.me()) {\n chat.lastReadMessageId = message.id;\n chat.totalUnreadCount = 0;\n }\n\n if (message.sentBy.id !== __settings.me()) {\n chat.totalUnreadCount++;\n }\n }),\n ),\n __settings.client.subscribe('chatify://chat-message-read', ([events]) =>\n updateCachedData((chatList) => {\n for (const event of events) {\n const chat = chatList.find((x) => x.id === event.chatId);\n\n if (!chat) {\n return;\n }\n\n chat.lastReadMessageId = event.newLastReadMessageId;\n chat.totalUnreadCount = chat.totalUnreadCount - event.readCount;\n }\n }),\n ),\n __settings.client.subscribe(\n 'chatify://chat-member-added',\n ([chatId, chatName, account, message, , read]) =>\n updateCachedData((chatList) => {\n const chat = chatList.find((x) => x.id === chatId);\n\n if (account.id === __settings.me() && !chat) {\n chatList.push({\n id: chatId,\n name: chatName,\n message,\n totalUnreadCount: read ? 0 : 1,\n active: true,\n lastReadMessageId: read ? message.id : null,\n });\n }\n\n if (!chat) {\n return;\n }\n\n chat.message = message;\n chat.active = true;\n\n if (read) {\n chat.totalUnreadCount = 0;\n chat.lastReadMessageId = message.id;\n } else {\n chat.totalUnreadCount++;\n }\n }),\n ),\n __settings.client.subscribe(\n 'chatify://chat-member-removed',\n ([chatId, accountId, deleteHistory, message, read]) =>\n updateCachedData((chatList) => {\n if (accountId === __settings.me() && deleteHistory) {\n return chatList.filter((x) => x.id !== chatId);\n }\n\n const chat = chatList.find((x) => x.id === chatId);\n\n if (!chat) {\n return;\n }\n\n chat.message = message;\n\n if (accountId === __settings.me()) {\n chat.active = false;\n }\n\n if (!read) {\n chat.totalUnreadCount++;\n } else {\n chat.totalUnreadCount = 0;\n chat.lastReadMessageId = message.id;\n }\n }),\n ),\n __settings.client.subscribe('chatify://chat-name-changed', ([chatId, newName, message, read]) =>\n updateCachedData((chatList) => {\n const chat = chatList.find((x) => x.id === chatId);\n if (!chat) return;\n\n chat.name = newName;\n chat.message = message;\n\n if (!read) {\n chat.totalUnreadCount++;\n } else {\n chat.totalUnreadCount = 0;\n chat.lastReadMessageId = message.id;\n }\n }),\n ),\n ).when(cacheEntryRemoved);\n },\n }),\n\n // ====================================================\n // ============ CHAT MEMBER ====================\n // ====================================================\n\n removeChatMember: builder.mutation<void, RemoveChatMemberRequest>({\n queryFn: async (args) => {\n await __settings.client.removeChatMember(args);\n return { data: null! };\n },\n }),\n\n addChatMember: builder.mutation<void, AddChatMemberRequest>({\n queryFn: async (args) => {\n await __settings.client.addChatMember(args);\n return { data: null! };\n },\n }),\n\n // ====================================================\n // ============ CHAT MESSAGE ===================\n // ====================================================\n\n getChatMessageList: builder.query<ChatMessageListResult, { chatId: string }>({\n queryFn: async ({ chatId }) => {\n const messages = await __settings.client.chatMessages({\n chatId,\n skip: 0,\n take: DEFAULT_MESSAGE_LIST_TAKE + 1,\n });\n return {\n data: {\n messages: messages.slice(0, DEFAULT_MESSAGE_LIST_TAKE),\n hasMore: messages.length === DEFAULT_MESSAGE_LIST_TAKE + 1,\n },\n };\n },\n providesTags: ['message', 'chat', 'account'],\n onCacheEntryAdded: async ({ chatId }, { dispatch, cacheEntryRemoved, cacheDataLoaded }) => {\n await cacheDataLoaded;\n\n unsubscribe(\n __settings.client.subscribe('chatify://chat-new-message', ([message]) => {\n message.chatId === chatId &&\n dispatch(\n chatifyApi.util.updateQueryData('getChatMessageList', { chatId }, (draft) => {\n draft.messages.unshift(message);\n }),\n );\n }),\n\n __settings.client.subscribe('chatify://chat-member-added', ([eventChatId, , , message]) => {\n eventChatId === chatId &&\n dispatch(\n chatifyApi.util.updateQueryData('getChatMessageList', { chatId }, (draft) => {\n draft.messages.unshift(message);\n }),\n );\n }),\n\n __settings.client.subscribe('chatify://chat-member-removed', ([eventChatId, , , message]) => {\n eventChatId === chatId &&\n dispatch(\n chatifyApi.util.updateQueryData('getChatMessageList', { chatId }, (draft) => {\n draft.messages.unshift(message);\n }),\n );\n }),\n\n __settings.client.subscribe('chatify://chat-name-changed', ([eventChatId, , message]) => {\n eventChatId === chatId &&\n dispatch(\n chatifyApi.util.updateQueryData('getChatMessageList', { chatId }, (draft) => {\n draft.messages.unshift(message);\n }),\n );\n }),\n ).when(cacheEntryRemoved);\n },\n }),\n\n fetchNextChatMessageList: builder.mutation<void, { chatId: string }>({\n queryFn: async ({ chatId }, { getState }) => {\n const current = chatifyApi.endpoints.getChatMessageList.select({ chatId })(getState() as any);\n const messages = await __settings.client.chatMessages({\n chatId,\n skip: current.data!.messages.length,\n take: DEFAULT_MESSAGE_LIST_TAKE + 1,\n });\n return {\n data: null!,\n meta: {\n messages: messages.slice(0, DEFAULT_MESSAGE_LIST_TAKE),\n hasMore: messages.length === DEFAULT_MESSAGE_LIST_TAKE + 1,\n },\n };\n },\n onQueryStarted: async ({ chatId }, { dispatch, queryFulfilled }) => {\n const result = await queryFulfilled;\n const meta: ChatMessageListResult = result.meta! as any;\n\n dispatch(\n chatifyApi.util.updateQueryData('getChatMessageList', { chatId }, (draft) => {\n draft.hasMore = meta.hasMore;\n draft.messages.push(...meta!.messages);\n }),\n );\n },\n }),\n\n sendChatMessage: builder.mutation<void, SendChatMessageRequest>({\n queryFn: async ({ chatId, text, files }) => {\n await __settings.client.sendChatMessage({\n chatId,\n text,\n files,\n });\n\n return { data: null! };\n },\n }),\n\n readChatMessage: builder.mutation<void, { id: string }>({\n queryFn: async () => {\n return { data: null! };\n },\n onQueryStarted: async ({ id }, { dispatch }) => {\n CHAT_MESSAGE_READ_QUEUE.push(id);\n dispatch(chatifyApi.endpoints.getChatMessageReadQueue.initiate(undefined, { forceRefetch: true }));\n },\n }),\n\n getChatMessageReadQueue: builder.query<DebounceValue<string>[], void>({\n queryFn: async () => ({ data: CHAT_MESSAGE_READ_QUEUE.units }),\n onCacheEntryAdded: async (_, { dispatch, cacheEntryRemoved }) => {\n unsubscribe(\n CHAT_MESSAGE_READ_QUEUE.subscribe((value) => {\n dispatch(\n chatifyApi.util.updateQueryData('getChatMessageReadQueue', undefined, () => value.units),\n );\n }),\n ).when(cacheEntryRemoved);\n },\n }),\n\n // ====================================================\n // =============== THREAD ======================s\n // ====================================================\n getWatchThreadList: builder.query<ThreadWatchListItem[], void>({\n queryFn: async () => {\n const threads = await __settings.client.watchThreads();\n return { data: threads };\n },\n providesTags: ['account', 'thread'],\n onCacheEntryAdded: async (_, { cacheEntryRemoved, cacheDataLoaded, updateCachedData }) => {\n await cacheDataLoaded;\n\n unsubscribe(\n __settings.client.subscribe(\n 'chatify://thread-created',\n ([thread, watch]) =>\n watch &&\n updateCachedData((threads) => {\n threads.push(thread);\n }),\n ),\n __settings.client.subscribe('chatify://thread-message-new', ([threadId, message, readForId]) =>\n updateCachedData((threads) => {\n const thread = threads.find((x) => x.id === threadId);\n if (!thread) return;\n\n thread.lastMessage = message;\n\n if (readForId === __settings.me()) {\n thread.lastReadMessageId = message.id;\n }\n }),\n ),\n __settings.client.subscribe('chatify://thread-message-read', ([threadId, messageId]) =>\n updateCachedData((threads) => {\n const thread = threads.find((x) => x.id === threadId);\n if (!thread) return;\n\n thread.lastReadMessageId = messageId;\n }),\n ),\n __settings.client.subscribe('chatify://thread-watch-added', ([thread]) =>\n updateCachedData((threads) => {\n threads.push(thread);\n }),\n ),\n __settings.client.subscribe('chatify://thread-watch-removed', ([id]) =>\n updateCachedData((threads) => {\n const index = threads.findIndex((x) => x.id === id);\n if (index !== -1) threads.splice(index, 1);\n }),\n ),\n __settings.client.subscribe('chatify://thread-updated', ([threadId, threadName]) =>\n updateCachedData((threads) => {\n const thread = threads.find((x) => x.id === threadId);\n if (!thread) return;\n\n thread.name = threadName;\n }),\n ),\n ).when(cacheEntryRemoved);\n },\n }),\n\n getThread: builder.query<Thread, { id: string }>({\n queryFn: async ({ id }) => {\n const threads = await __settings.client.thread(id);\n return { data: threads };\n },\n providesTags: ['account', 'thread'],\n onCacheEntryAdded: async ({ id }, { cacheEntryRemoved, cacheDataLoaded, updateCachedData }) => {\n await cacheDataLoaded;\n\n unsubscribe(\n __settings.client.subscribe(\n 'chatify://thread-message-read',\n ([threadId, messageId]) =>\n id === threadId &&\n updateCachedData((t) => {\n t.lastReadMessageId = messageId;\n }),\n ),\n __settings.client.subscribe(\n 'chatify://thread-message-new',\n ([threadId, message, readForId]) =>\n id === threadId &&\n updateCachedData((thread) => {\n thread.lastMessageId = message.id;\n thread.lastReadMessageId =\n readForId === __settings.me() ? message.id : thread.lastReadMessageId;\n }),\n ),\n __settings.client.subscribe(\n 'chatify://thread-watch-added',\n ([threadListItem]) =>\n id === threadListItem.id &&\n updateCachedData((thread) => {\n thread.watch = true;\n thread.lastMessageId = threadListItem.lastMessage?.id ?? null;\n thread.lastReadMessageId = threadListItem.lastReadMessageId ?? null;\n }),\n ),\n __settings.client.subscribe(\n 'chatify://thread-watch-removed',\n ([threadId]) =>\n id === threadId &&\n updateCachedData((thread) => {\n thread.watch = false;\n }),\n ),\n __settings.client.subscribe(\n 'chatify://thread-updated',\n ([threadId, threadName]) =>\n id === threadId &&\n updateCachedData((thread) => {\n thread.name = threadName;\n }),\n ),\n ).when(cacheEntryRemoved);\n },\n }),\n\n watchThread: builder.mutation<void, { id: string; watch: boolean }>({\n queryFn: async ({ id, watch }) => {\n await __settings.client.watchThread(id, watch);\n return { data: null! };\n },\n }),\n\n // ====================================================\n // ============ THREAD MESSAGE =================\n // ====================================================\n\n getThreadMessageList: builder.query<ThreadMessageList, { threadId: string }>({\n queryFn: async (args) => {\n const requestArgs = {\n skip: 0,\n take: DEFAULT_MESSAGE_LIST_TAKE + 1,\n ...args,\n };\n const messages = await __settings.client.threadMessages(requestArgs);\n return {\n data: {\n messages: messages.slice(0, DEFAULT_MESSAGE_LIST_TAKE),\n hasMore: messages.length === DEFAULT_MESSAGE_LIST_TAKE + 1,\n },\n };\n },\n providesTags: ['account', 'thread', 'thread-message'],\n onCacheEntryAdded: async ({ threadId }, { cacheEntryRemoved, cacheDataLoaded, updateCachedData }) => {\n await cacheDataLoaded;\n\n unsubscribe(\n __settings.client.subscribe('chatify://thread-message-new', ([_threadId, message]) => {\n threadId === _threadId &&\n updateCachedData((messageList) => {\n !messageList.messages.some((x) => x.id === message.id) &&\n messageList.messages.unshift(message);\n });\n }),\n ).when(cacheEntryRemoved);\n },\n }),\n\n fetchNextThreadMessageList: builder.mutation<void, { threadId: string }>({\n queryFn: async ({ threadId }, { getState }) => {\n const current = chatifyApi.endpoints.getThreadMessageList.select({ threadId })(getState() as any);\n const messages = await __settings.client.threadMessages({\n threadId,\n skip: current.data!.messages.length,\n take: DEFAULT_MESSAGE_LIST_TAKE + 1,\n });\n return {\n data: null!,\n meta: {\n messages: messages.slice(0, DEFAULT_MESSAGE_LIST_TAKE),\n hasMore: messages.length === DEFAULT_MESSAGE_LIST_TAKE + 1,\n },\n };\n },\n onQueryStarted: async ({ threadId }, { dispatch, queryFulfilled }) => {\n const result = await queryFulfilled;\n const meta: ThreadMessageList = result.meta! as any;\n\n dispatch(\n chatifyApi.util.updateQueryData('getThreadMessageList', { threadId }, (draft) => {\n draft.hasMore = meta.hasMore;\n draft.messages.push(...meta!.messages);\n }),\n );\n },\n }),\n\n sendThreadMessage: builder.mutation<string, SendThreadMessageRequest>({\n queryFn: async (args) => {\n const id = await __settings.client.sendThreadMessage(args);\n return { data: id };\n },\n }),\n\n readThreadMessage: builder.mutation<void, { id: string }>({\n queryFn: async () => {\n return { data: null! };\n },\n onQueryStarted: async ({ id }, { dispatch }) => {\n THREAD_MESSAGE_READ_QUEUE.push(id);\n dispatch(chatifyApi.endpoints.getThreadMessageReadQueue.initiate(undefined, { forceRefetch: true }));\n },\n }),\n\n getThreadMessageReadQueue: builder.query<DebounceValue<string>[], void>({\n queryFn: async () => ({ data: THREAD_MESSAGE_READ_QUEUE.units }),\n onCacheEntryAdded: async (_, { dispatch, cacheEntryRemoved }) => {\n unsubscribe(\n THREAD_MESSAGE_READ_QUEUE.subscribe((value) => {\n dispatch(\n chatifyApi.util.updateQueryData('getThreadMessageReadQueue', undefined, () => value.units),\n );\n }),\n ).when(cacheEntryRemoved);\n },\n }),\n }),\n});\n\nexport function useChatListItem(id: string | null) {\n return useSelector((state: any) =>\n id != null\n ? __chatifyApi.endpoints.getChatList\n .select()(state)\n .data?.find((x) => x.id === id)\n : null,\n );\n}\n\nexport function useUnreadThreadMessageCount() {\n const { data: threads, ...state } = chatifyApi.useGetWatchThreadListQuery();\n const count = useMemo(() => (threads != null ? calcThreadListUnreadCount(threads) : null), [threads]);\n return [count, state] as const;\n}\n\nexport const chatifyApi = Object.assign(__chatifyApi, {\n settings: __settings,\n useChatListItem,\n useUnreadThreadMessageCount,\n});\n","import { FC, ForwardedRef, forwardRef } from 'react';\nimport { Account } from '../../core';\nimport { Avatar as AntdAvatar } from 'antd';\nimport { customize } from '../customize';\n\nexport interface AvatarProps {\n account: Account;\n}\n\nconst _Avatar: FC<AvatarProps> = forwardRef(\n (props: AvatarProps, forwardRef: ForwardedRef<HTMLSpanElement>) => {\n const { account } = props;\n\n return <AntdAvatar ref={forwardRef} src={account.avatar} />;\n },\n);\n\n_Avatar.displayName = 'Avatar';\n\nexport const Avatar = customize('Avatar', _Avatar);\n","import { Button, List, Space, Tooltip } from 'antd';\nimport { chatifyApi } from '../../../core';\nimport { customize } from '../../customize';\nimport { useCallback, useMemo } from 'react';\nimport { Icon } from '../../common/Icon';\nimport { Avatar } from '../../common/Avatar';\nimport { useChatContext } from '../ChatContext';\n\ninterface ChatMemberListItemProps {\n id: string;\n chatId: string;\n}\n\nfunction useAdd(chatId: string, accountId: string, withHistory: boolean) {\n const [add, state] = chatifyApi.useAddChatMemberMutation();\n const onAdd = useCallback(\n () => add({ chatId, accountId, withHistory }),\n [add, chatId, accountId, withHistory],\n );\n return [onAdd, state] as const;\n}\n\nfunction useRemove(chatId: string, accountId: string, deleteHistory: boolean) {\n const [remove, state] = chatifyApi.useRemoveChatMemberMutation();\n const onRemove = useCallback(\n () => remove({ chatId, accountId, deleteHistory }),\n [remove, chatId, accountId, deleteHistory],\n );\n return [onRemove, state] as const;\n}\n\nconst ChatMemberListItem = customize('ChatMemberListItem', (props: ChatMemberListItemProps) => {\n const { chatId } = props;\n const { data: chat } = chatifyApi.useGetChatQuery({ id: chatId });\n const { data: accounts } = chatifyApi.useGetAccountListQuery({});\n const account = accounts!.find((x) => x.id === props.id)!;\n const isMember = chat!.members.some((x) => x.id === account.id);\n const [onAddWithoutHistory] = useAdd(chatId, account.id, false);\n const [onAddWithHistory] = useAdd(chatId, account.id, true);\n const [onRemoveKeepHistory] = useRemove(chatId, account.id, false);\n const [onRemoveDeleteHistory] = useRemove(chatId, account.id, true);\n\n return (\n <List.Item\n className=\"wxchtf-chat-members-list-item\"\n actions={\n isMember\n ? [\n <Tooltip key=\"remove\" title=\"Remove (keep history)\">\n <Button onClick={onRemoveKeepHistory} type=\"link\" icon={<Icon type=\"remove-member\" />} />\n </Tooltip>,\n <Tooltip key=\"remove_delete_history\" title=\"Remove (delete history)\">\n <Button\n onClick={onRemoveDeleteHistory}\n type=\"link\"\n icon={<Icon type=\"remove-member-delete-history\" />}\n />\n </Tooltip>,\n ]\n : [\n <Tooltip key=\"add_no_history\" title=\"Add (no history)\">\n <Button onClick={onAddWithoutHistory} type=\"link\" icon={<Icon type=\"add-member\" />} />\n </Tooltip>,\n <Tooltip key=\"add\" title=\"Add (share history)\">\n <Button\n onClick={onAddWithHistory}\n type=\"link\"\n icon={<Icon type=\"add-member-with-history\" />}\n />\n </Tooltip>,\n ]\n }\n >\n <Space>\n <Avatar account={account} />\n <span>{account.name}</span>\n </Space>\n </List.Item>\n );\n});\n\nexport const ChatMembersPanel = customize('ChatMembersPanel', () => {\n const { id } = useChatContext();\n const { data: chat } = chatifyApi.useGetChatQuery({ id });\n const { data: accounts } = chatifyApi.useGetAccountListQuery({});\n const ordered = useMemo(\n () =>\n accounts\n ?.slice()\n .sort(\n (a, b) =>\n (chat?.members.some((m) => m.id === a.id) ? -100 : 0) -\n (chat?.members.some((m) => m.id === b.id) ? -100 : 0) +\n a.name.localeCompare(b.name),\n ),\n [accounts, chat],\n );\n\n if (!chat?.members || !accounts) {\n return null;\n }\n\n return (\n <div className=\"wxchtf-chat-members-panel\">\n <List\n className=\"wxchtf-chat-members-list\"\n dataSource={ordered}\n renderItem={(item) => <ChatMemberListItem id={item.id} chatId={id} />}\n />\n </div>\n );\n});\n","import { chatifyApi } from '../../../core';\nimport { Tooltip } from 'antd';\nimport { customize } from '../../customize';\nimport { Avatar as AntdAvatar } from 'antd';\nimport { Avatar } from '../../common/Avatar';\nimport { useChatContext } from '../ChatContext';\n\nexport const ChatMembersPreview = customize('ChatMembersPreview', () => {\n const { id } = useChatContext();\n const { data: chat } = chatifyApi.useGetChatQuery({ id });\n\n if (!chat?.members) {\n return null;\n }\n\n return (\n <AntdAvatar.Group max={{ count: 5 }}>\n {chat.members.map((x) => (\n <Tooltip key={x.id} title={x.name}>\n <Avatar account={x} />\n </Tooltip>\n ))}\n </AntdAvatar.Group>\n );\n});\n","import { Button } from 'antd';\nimport { customize } from '../../customize';\nimport { Icon } from '../../common/Icon';\nimport { File } from '../../../core';\nimport { useCallback, useEffect, useRef } from 'react';\n\nexport interface InputFilesBoxProps {\n value: File[];\n accept?: string;\n loading?: boolean;\n disabled?: boolean;\n onAddedClick?: () => void;\n onUpload: (value: globalThis.File[]) => void;\n}\n\nexport const InputFileButton = customize('InputFileButton', (props: InputFilesBoxProps) => {\n const { onUpload, onAddedClick, accept, loading, value, disabled } = props;\n const inputRef = useRef<HTMLInputElement | null>(null);\n const onClick = useCallback(() => inputRef.current?.click(), []);\n const countButtonRef = useRef<HTMLButtonElement | null>(null);\n\n useEffect(() => {\n countButtonRef.current?.classList.add('active');\n }, [value]);\n\n const onCountButtonAnimationEnd = useCallback(() => {\n countButtonRef.current?.classList.remove('active');\n }, []);\n\n const onInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n files && files.length > 0 && onUpload(Array.from(files));\n },\n [onUpload],\n );\n\n return (\n <>\n <Button\n loading={loading}\n onClick={onClick}\n type=\"link\"\n disabled={disabled}\n icon={<Icon type=\"attach\" />}\n className=\"wxchtf-add-files-btn\"\n />\n {value.length > 0 && (\n <Button\n ref={countButtonRef}\n className=\"wxchtf-add-files-added-btn\"\n onAnimationIteration={onCountButtonAnimationEnd}\n onClick={onAddedClick}\n type=\"link\"\n disabled={disabled}\n icon={<>+{value.length}</>}\n />\n )}\n <input\n value=\"\"\n accept={accept}\n onChange={onInputChange}\n ref={inputRef}\n type=\"file\"\n multiple\n style={{ display: 'none' }}\n />\n </>\n );\n});\n\nexport const InputFilesBox = customize('InputFilesBox', (props: InputFilesBoxProps) => {\n return (\n <div className=\"wxchtf-add-files-box\">\n <InputFileButton {...props} />\n </div>\n );\n});\n","import dayjs from 'dayjs';\nimport React, { useContext } from 'react';\nimport { SystemMessageText } from '../core';\n\nexport interface LocalizerBase {\n isToday: (value: string) => boolean;\n timestamp: (value: string) => string;\n dateTime: (value: string) => string;\n system: Record<SystemMessageText, (key: SystemMessageText, payload: any | null) => string>;\n message: {\n read: () => React.ReactNode;\n reading: () => React.ReactNode;\n sending: () => React.ReactNode;\n };\n addChat: {\n title: () => React.ReactNode;\n name: {\n label: () => React.ReactNode;\n required: () => string;\n max250: () => string;\n };\n members: {\n label: () => React.ReactNode;\n required: () => string;\n };\n submitBtn: () => React.ReactNode;\n };\n\n input: {\n placeholder: () => string;\n };\n\n settings: {\n members: () => string;\n };\n\n size: {\n bytes: (value: number) => string;\n kb: (value: number) => string;\n mb: (value: number) => string;\n };\n\n chatList: {\n topShown: (count: number) => string;\n };\n\n autoReply: {\n buttonTitle: () => string;\n title: () => React.ReactNode;\n period: {\n label: () => React.ReactNode;\n required: () => string;\n format: () => string;\n };\n text: {\n label: () => React.ReactNode;\n required: () => string;\n };\n submitBtn: () => React.ReactNode;\n clearBtn: () => React.ReactNode;\n };\n}\n\nexport interface Localizer extends LocalizerBase {}\n\nexport const LocalizerContext = React.createContext<Localizer>(null!);\n\nexport function useLocalizer() {\n return useContext(LocalizerContext);\n}\n\nconst base: LocalizerBase = {\n isToday: (value: string) => dayjs(value).isSame(dayjs(), 'day'),\n timestamp: (value: string) => dayjs(value).format('HH:mm'),\n dateTime: (value: string) => dayjs(value).format('DD/MM/YYYY HH:mm'),\n message: {\n read: () => 'Read',\n reading: () => 'Reading...',\n sending: () => 'Sending...',\n },\n addChat: {\n title: () => 'Add chat',\n name: {\n label: () => 'Name',\n required: () => `Name is required`,\n max250: () => 'Max 250 characters allowed',\n },\n members: {\n label: () => 'Members',\n required: () => 'Members is required',\n },\n submitBtn: () => 'Submit',\n },\n system: {\n 'chatify://chat-created': () => 'Chat created',\n 'chatify://member-added': () => 'New member added',\n 'chatify://member-removed': () => 'Member removed',\n 'chatify://chat-name-changed': (_, { newName }: { newName: string }) =>\n `Chat name changed to '${newName}'`,\n },\n\n input: {\n placeholder: () => 'Start typing... (Press Enter to send, and Shift+Enter to start a new line)',\n },\n\n settings: {\n members: () => 'Members',\n },\n\n size: {\n bytes: (value: number) =>\n `${value.toLocaleString(undefined, { minimumFractionDigits: 0, maximumFractionDigits: 2 })} bytes`,\n kb: (value: number) =>\n `${value.toLocaleString(undefined, { minimumFractionDigits: 0, maximumFractionDigits: 2 })} KB`,\n mb: (value: number) =>\n `${value.toLocaleString(undefined, { minimumFractionDigits: 0, maximumFractionDigits: 2 })} MB`,\n },\n\n chatList: {\n topShown: (count: number) => `Latest active ${count} chat${count !== 1 ? 's' : ''} shown`,\n },\n\n autoReply: {\n buttonTitle: () => 'Auto-reply',\n title: () => 'Auto-reply',\n period: {\n label: () => 'Period',\n required: () => 'Please select start and end date',\n format: () => 'DD/MM/YYYY',\n },\n text: { label: () => 'Message', required: () => 'Please enter message' },\n submitBtn: () => 'Submit',\n clearBtn: () => 'Clear',\n },\n};\n\nexport const defaultLocalizer: Localizer = base as unknown as Localizer;\n","import { Input } from 'antd';\nimport { customize } from '../../customize';\nimport { isHotkey } from 'is-hotkey';\nimport { RefObject, memo, useCallback } from 'react';\nimport { useLocalizer } from '../../localizer';\nimport { TextAreaProps } from 'antd/es/input';\n\nexport interface TextInputBoxProps {\n value: string;\n onChange: (value: string) => void;\n onSend: (value: string) => void;\n disabled?: boolean;\n inputRef?: RefObject<HTMLTextAreaElement>;\n}\n\nconst isEnter = isHotkey('enter');\nconst isCtrlEnter = isHotkey('ctrl+enter');\n\nconst AUTO_SIZE: TextAreaProps['autoSize'] = { maxRows: 5, minRows: 1 };\n\nexport const InputTextBox = customize(\n 'InputTextBox',\n memo((props: TextInputBoxProps) => {\n const { value, onChange, onSend, disabled, inputRef } = props;\n const localizer = useLocalizer();\n\n const onInputChange = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => onChange(e.target.value),\n [onChange],\n );\n\n const onKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (disabled) {\n e.preventDefault();\n return;\n }\n\n if (isEnter(e) || isCtrlEnter(e)) {\n e.preventDefault();\n onSend(value);\n }\n },\n [onSend, value, disabled],\n );\n\n return (\n <div className=\"wxchtf-text-input-box\">\n <Input.TextArea\n ref={inputRef}\n value={value}\n onChange={onInputChange}\n autoSize={AUTO_SIZE}\n className=\"wxchtf-text-input-textarea\"\n placeholder={localizer.input.placeholder()}\n onKeyDown={onKeyDown}\n />\n </div>\n );\n }),\n);\n","import { Button } from 'antd';\nimport { customize } from '../../customize';\nimport { Icon } from '../../common/Icon';\n\nexport interface InputSubmitButtonBoxProps {\n onSubmit: () => void;\n disabled?: boolean;\n loading?: boolean;\n}\n\nexport const InputSubmitButtonBox = customize('InputSubmitButtonBox', (props: InputSubmitButtonBoxProps) => {\n const { onSubmit, disabled, loading } = props;\n\n return (\n <div className=\"wxchtf-submit-btn-box\">\n <Button\n onClick={onSubmit}\n type=\"link\"\n icon={<Icon type=\"send\" />}\n className=\"wxchtf-submit-btn\"\n disabled={disabled}\n loading={loading}\n />\n </div>\n );\n});\n","import React from 'react';\nimport { MessageBase, MessageBody } from '../../core';\nimport type { Flippo } from '@webinex/flippo';\n\nexport interface ConversationValue {\n id: string;\n name: string;\n active: boolean;\n lastReadMessageId: string | null;\n}\n\nexport interface ConversationContextValue extends ConversationValue {\n messages?: MessageBase[];\n hasMore?: boolean;\n nextLoading: boolean;\n noReadTracking?: boolean;\n\n isReading?: (id: string) => boolean;\n onNext: () => void;\n onSend?: (message: MessageBody) => void;\n onRead?: (id: string) => void;\n flippo?: Flippo;\n onClose?: () => void;\n}\n\nexport const ConversationContext = React.createContext<ConversationContextValue>(undefined!);\n\nexport function useConversation() {\n return React.useContext(ConversationContext);\n}\n","import { Skeleton } from 'antd';\nimport { customize } from '../customize';\n\nexport interface MessageSkeletonProps {\n count?: number;\n}\n\nexport const MessageSkeleton = customize('MessageSkeleton', (props: MessageSkeletonProps) => {\n const { count = 1 } = props;\n return (\n <>\n {Array.from(Array(count)).map((_, index) => (\n <div className=\"wxchtf-message-skeleton\" key={index}>\n <Skeleton.Avatar className=\"wxchtf-avatar\" active />\n <Skeleton.Button active className=\"wxchtf-content\" />\n </div>\n ))}\n </>\n );\n});\n","import { customize } from '../../customize';\nimport type { ChatListItemBoxProps } from './ChatListItemBox';\n\nexport const ChatListItemName = customize('ChatListItemName', (props: ChatListItemBoxProps) => {\n const { chat } = props;\n\n return <div className=\"wxchtf-chat-name\">{chat.name}</div>;\n});\n","import { customize } from '../../customize';\nimport { ChatListItemBoxProps } from './ChatListItemBox';\n\nexport const ChatListItemUnreadCount = customize('ChatListItemUnreadCount', (props: ChatListItemBoxProps) => {\n const { totalUnreadCount: unreadCount } = props.chat;\n\n if (unreadCount == null || unreadCount <= 0) {\n return null;\n }\n\n return <div className=\"wxchtf-unread-count\">{unreadCount}</div>;\n});\n","import { Ref } from 'react';\nimport { customize } from '../../customize';\nimport { Localizer, useLocalizer } from '../../localizer';\nimport { MessageBase } from '../../../core';\n\nexport interface SystemMessageRowProps {\n message: MessageBase;\n containerRef?: Ref<HTMLDivElement>;\n}\n\nexport function formatSystemMessage(localizer: Localizer, text: string): React.ReactNode {\n const [key, payload] = text.split('::', 2);\n const data = payload ? JSON.parse(payload) : null;\n return localizer.system[key as keyof Localizer['system']](key as any, data);\n}\n\nexport const SystemMessageRow = customize('SystemMessageRow', (props: SystemMessageRowProps) => {\n const { message, containerRef } = props;\n const { text, sentAt } = message;\n const localizer = useLocalizer();\n\n return (\n <div ref={containerRef} className=\"wxchtf-system-message\">\n <div className=\"wxchtf-text\">{text && formatSystemMessage(localizer, text)}</div>\n <div className=\"wxchtf-timestamp\">{localizer.timestamp(sentAt)}</div>\n </div>\n );\n});\n","import { FC, RefObject, useEffect, useMemo, useRef } from 'react';\nimport { MessageBoxProps } from '../Message';\nimport { useConversation } from '../ConversationContext';\n\nexport interface MessageReadObserverProps extends MessageBoxProps {\n messageRef: RefObject<HTMLDivElement | null>;\n}\nconst Observer: FC<MessageReadObserverProps> = (props) => {\n const { message, messageRef } = props;\n const { onRead, lastReadMessageId } = useConversation();\n const isRead = lastReadMessageId != null && message.id.localeCompare(lastReadMessageId) <= 0;\n const readRef = useRef(isRead);\n\n useEffect(() => {\n readRef.current = readRef.current || isRead;\n }, [isRead]);\n\n const observer = useMemo(\n () =>\n new IntersectionObserver(([entry]) => {\n if (entry.isIntersecting && !readRef.current) {\n readRef.current = true;\n onRead?.(message.id);\n }\n }),\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n\n useEffect(() => {\n observer.observe(messageRef.current!);\n return () => observer.disconnect();\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [observer]);\n\n return <></>;\n};\n\nexport function MessageReadObserver(props: MessageReadObserverProps) {\n const { noReadTracking } = useConversation();\n\n if (noReadTracking === true) {\n return null;\n }\n\n return <Observer {...props} />;\n}\n","import { useRef } from 'react';\nimport { customize } from '../../customize';\nimport { MessageBase } from '../../../core';\nimport { SystemMessageRow } from './SystemMessageRow';\nimport { MessageReadObserver } from '../ReadObserver';\n\nexport interface SystemMessageBoxProps {\n message: MessageBase;\n}\n\nexport const SystemMessageBox = customize('SystemMessageBox', (props: SystemMessageBoxProps) => {\n const ref = useRef<HTMLDivElement | null>(null);\n\n return (\n <>\n <MessageReadObserver messageRef={ref} {...props} />\n <SystemMessageRow containerRef={ref} {...props} />\n </>\n );\n});\n","import { useLocalizer } from '../../localizer';\nimport { formatSystemMessage } from '../../Conversation/SystemMessage';\nimport { FC } from 'react';\nimport { customize } from '../../customize';\nimport type { ChatListItemBoxProps } from './ChatListItemBox';\n\nexport const ChatListItemLastMessageContent = customize<FC<ChatListItemBoxProps>>(\n 'ChatListItemLastMessageContent',\n (props) => {\n const { lastMessage } = props.chat;\n const localizer = useLocalizer();\n\n return (\n <div className=\"wxchtf-chat-last-message\">\n {lastMessage.sentBy.id === 'chatify::system'\n ? lastMessage.text && formatSystemMessage(localizer, lastMessage.text)\n : lastMessage.text}\n </div>\n );\n },\n);\n","import { customize } from '../../customize';\nimport type { ChatListItemBoxProps } from './ChatListItemBox';\n\nexport const ChatListItemLastMessageAuthor = customize(\n 'ChatListItemLastMessageAuthor',\n (props: ChatListItemBoxProps) => {\n const { lastMessage } = props.chat;\n\n if (lastMessage.sentBy.id === 'chatify::system') {\n return null;\n }\n\n return <div className=\"wxchtf-chat-last-author\">{lastMessage.sentBy.name}</div>;\n },\n);\n","import { customize } from '../../customize';\nimport { useLocalizer } from '../../localizer';\nimport { ChatListItemBoxProps } from './ChatListItemBox';\n\nexport const ChatListItemLastMessageSentAt = customize(\n 'ChatListItemLastMessageSentAt',\n (props: ChatListItemBoxProps) => {\n const {\n chat: {\n lastMessage: { sentAt },\n },\n } = props;\n\n const localizer = useLocalizer();\n\n return (\n <div className=\"wxchtf-chat-last-sent-at\">\n {localizer.isToday(sentAt) ? localizer.timestamp(sentAt) : localizer.dateTime(sentAt)}\n </div>\n );\n },\n);\n","import { customize } from '../../customize';\nimport type { ChatListItemBoxProps } from './ChatListItemBox';\nimport { ChatListItemLastMessageContent } from './ChatListItemLastMessageContent';\nimport { ChatListItemLastMessageAuthor } from './ChatListItemLastMessageAuthor';\nimport { ChatListItemLastMessageSentAt } from './ChatListItemLastMessageSentAt';\n\nexport const ChatListItemLastMessage = customize('ChatListItemLastMessage', (props: ChatListItemBoxProps) => {\n return (\n <div className=\"wxchtf-chat-last\">\n <ChatListItemLastMessageAuthor {...props} />\n <ChatListItemLastMessageContent {...props} />\n <ChatListItemLastMessageSentAt {...props} />\n </div>\n );\n});\n","import { color } from '../../color';\nimport { Icon } from '../../common/Icon';\nimport { customize } from '../../customize';\nimport type { ChatListItemBoxProps } from './ChatListItemBox';\n\nexport const ChatListItemAvatar = customize('ChatListItemAvatar', (props: ChatListItemBoxProps) => {\n const { id } = props.chat;\n\n return (\n <div\n className=\"wxchtf-chat-avatar\"\n style={\n {\n '--background-color': color(id, { lightness: 90 }),\n '--color': color(id, { saturation: 60, lightness: 65 }),\n } as any\n }\n >\n <Icon type=\"chat\" />\n </div>\n );\n});\n","import { customize } from '../../customize';\nimport { ChatListItemName } from './ChatListItemName';\nimport { ChatListItemUnreadCount } from './ChatListItemUnreadCount';\nimport { ChatListItemLastMessage } from './ChatListItemLastMessage';\nimport { ChatListItemAvatar } from './ChatListItemAvatar';\nimport { ChatListValue } from './ChatListValue';\n\nexport interface ChatListItemBoxProps {\n chat: ChatListValue;\n\n /**\n * If true, do not show read status.\n */\n noRead?: boolean;\n}\n\nexport const ChatListItemBox = customize('ChatListItemBox', (props: ChatListItemBoxProps) => {\n const { noRead = false } = props;\n const { lastMessage, lastReadMessageId } = props.chat;\n const read = lastReadMessageId != null && lastReadMessageId.localeCompare(lastMessage.id) >= 0;\n\n return (\n <div className={'wxchtf-chat' + (!read && !noRead ? ' --unread' : '')}>\n <ChatListItemAvatar {...props} />\n <span className=\"wxchtf-chat-info\">\n <ChatListItemName {...props} />\n <ChatListItemUnreadCount {...props} />\n <ChatListItemLastMessage {...props} />\n </span>\n </div>\n );\n});\n","import { Menu, MenuProps } from 'antd';\nimport { useMemo } from 'react';\nimport { ChatListItemBox } from './ChatListItemBox';\nimport { customize } from '../../customize';\nimport { ChatListValue } from './ChatListValue';\nimport { useLocalizer } from '../../localizer';\nimport { messageSequencePart } from '../../../core';\n\nexport interface ChatListProps {\n className?: string;\n items: ChatListValue[];\n selected: string | null;\n onSelect?: (id: string) => void;\n\n /**\n * If true, do not show read status.\n */\n noRead?: boolean;\n\n /**\n * If set, shows a message at the bottom indicating that only the top N chats are shown.\n */\n top?: number;\n}\n\nfunction useOnSelect(props: ChatListProps) {\n const { onSelect } = props;\n\n return useMemo(\n () =>\n onSelect\n ? (info: Parameters<NonNullable<MenuProps['onSelect']>>[0]) => onSelect(info.key as string)\n : undefined,\n [onSelect],\n );\n}\n\nfunction useMenuItems(props: ChatListProps) {\n //28b2a1a6-c052-4761-ad2d-95ce36d59f06-000000001\n const { items, noRead, top } = props;\n const localizer = useLocalizer();\n\n return useMemo<MenuProps['items']>(() => {\n const result = items\n ?.slice()\n .sort(\n (a, b) => -messageSequencePart(a.lastMessage.id).localeCompare(messageSequencePart(b.lastMessage.id)),\n )\n .map((x) => ({ key: x.id, label: <ChatListItemBox chat={x} noRead={noRead} /> }));\n\n if (top != null) {\n return [\n ...result,\n {\n type: 'item',\n key: 'top',\n disabled: true,\n label: (\n <div style={{ textAlign: 'center', cursor: 'text', fontStyle: 'italic' }}>\n {localizer.chatList.topShown(top)}\n </div>\n ),\n },\n ];\n }\n\n return result;\n }, [items, noRead, top, localizer]);\n}\n\nexport const ChatList = customize('ChatList', (props: ChatListProps) => {\n const { selected: selectedChatId } = props;\n const selected = useMemo(() => (selectedChatId ? [selectedChatId] : []), [selectedChatId]);\n const onSelect = useOnSelect(props);\n const items = useMenuItems(props);\n\n return (\n <>\n {items && (\n <Menu className=\"wxchtf-chat-list\" selectedKeys={selected} onSelect={onSelect} items={items} />\n )}\n </>\n );\n});\n","import { useLocalizer } from './localizer';\n\nexport function useFormatter() {\n const localizer = useLocalizer();\n\n return {\n size: (value: number) => {\n if (value < 1024) {\n return localizer.size.bytes(value);\n } else if (value < 1024 * 1024) {\n return localizer.size.kb(value / 1024);\n } else {\n return localizer.size.mb(value / 1024 / 1024);\n }\n },\n };\n}\n","import { Button } from 'antd';\nimport { File } from '../../../core';\nimport { Icon } from '../../common';\nimport { useCallback } from 'react';\nimport { useFormatter } from '../../useFormatter';\nimport { customize } from '../../customize';\n\nexport interface InputBoxFileProps {\n file: File;\n disabled?: boolean;\n onDelete: (file: File) => void;\n}\n\nexport const InputBoxFile = customize('InputBoxFile', (props: InputBoxFileProps) => {\n const { file, disabled, onDelete } = props;\n const formatter = useFormatter();\n const onDeleteClick = useCallback(() => onDelete(file), [file, onDelete]);\n\n return (\n <div className=\"wxchtf-file\">\n <div className=\"wxchtf-file-info\">\n <div className=\"wxchtf-file-name\" title={file.name}>\n {file.name}\n </div>\n <div className=\"wxchtf-file-size\">{formatter.size(file.bytes)}</div>\n </div>\n <div className=\"wxchtf-file-actions\">\n <Button\n disabled={disabled}\n className=\"wxchtf-delete\"\n type=\"link\"\n icon={<Icon type=\"delete-file\" />}\n onClick={onDeleteClick}\n />\n </div>\n </div>\n );\n});\n","import { File } from '../../../core';\nimport { customize } from '../../customize';\nimport { InputBoxFile } from './InputBoxFile';\n\nexport interface InputBoxFileListProps {\n files: File[];\n disabled?: boolean;\n onDelete: (file: File) => void;\n}\n\nexport const InputBoxFileList = customize('InputBoxFileList', (props: InputBoxFileListProps) => {\n const { files, onDelete, disabled } = props;\n\n return (\n <div className=\"wxchtf-file-list\">\n {files.map((file) => (\n <InputBoxFile key={file.ref} file={file} onDelete={onDelete} disabled={disabled} />\n ))}\n </div>\n );\n});\n","import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { InputFilesBox } from './InputFilesBox';\nimport { File } from '../../../core';\nimport { InputTextBox } from './InputTextBox';\nimport { customize, useCustomizeContext } from '../../customize';\nimport { InputSubmitButtonBox } from './InputSubmitButtonBox';\nimport { useConversation } from '../ConversationContext';\nimport { ConversationCustomizeValue } from '../Conversation';\nimport { InputBoxFileList } from './InputBoxFileList';\n\nfunction useFormState() {\n const { onSend } = useConversation();\n const [text, setText] = useState('');\n const [sending, setSending] = useState(false);\n const { onUpload, files, loading, setFiles, showFileBox, onDeleteFile } = useFlippoInputFileBox();\n\n const onSubmit = useCallback(() => {\n if (!onSend) {\n return;\n }\n\n const textValue = text.trim().length === 0 ? null : text.trim();\n\n if ((!textValue && files.length === 0) || loading) {\n return;\n }\n\n setSending(true);\n Promise.resolve(onSend({ text: textValue, files }))\n .finally(() => setSending(false))\n .then(() => {\n setFiles([]);\n setText('');\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [text, onSend, files, setFiles, loading]);\n\n return [onSubmit, { text, setText, files, onUpload, loading, showFileBox, onDeleteFile, sending }] as const;\n}\n\nfunction useFlippoInputFileBox() {\n const [loading, setLoading] = useState(false);\n const [files, setFiles] = useState<File[]>([]);\n const { flippo } = useCustomizeContext<ConversationCustomizeValue>();\n\n const onUpload = useCallback(\n (files: globalThis.File[]) => {\n if (!flippo) return;\n\n setLoading(true);\n Promise.all(files.map((file) => flippo.store(file)))\n .then((references) =>\n setFiles((prev) => [\n ...prev,\n ...references.map((reference, index) => ({\n name: files[index].name,\n ref: reference,\n bytes: files[index].size,\n })),\n ]),\n )\n .finally(() => setLoading(false));\n },\n [flippo],\n );\n\n const onDeleteFile = useCallback((file: File) => {\n setFiles((prev) => prev.filter((f) => f !== file));\n }, []);\n\n return { onUpload, files, loading, setFiles, showFileBox: !!flippo, onDeleteFile };\n}\n\nexport const InputBox = customize('InputBox', () => {\n const [onSend, { text, setText, files, loading, onUpload, showFileBox, onDeleteFile, sending }] =\n useFormState();\n const inputRef = useRef<HTMLTextAreaElement>(null);\n const [showFileList, setShowFileList] = useState(false);\n const toggleShowFileList = useCallback(() => setShowFileList((prev) => !prev), []);\n const prevFilesLength = useRef(files.length);\n\n useLayoutEffect(() => inputRef.current?.focus(), []);\n\n useEffect(() => {\n if (prevFilesLength.current === 0 && files.length > 0 && !showFileList) {\n setShowFileList(true);\n }\n\n prevFilesLength.current = files.length;\n\n if (files.length === 0 && showFileList) {\n setShowFileList(false);\n }\n }, [files, showFileList]);\n\n return (\n <div className=\"wxchtf-input-form\">\n <div className=\"wxchtf-input-box\">\n {showFileList && (\n <div className=\"wxchtf-file-list-box\">\n <InputBoxFileList files={files} onDelete={onDeleteFile} disabled={sending} />\n </div>\n )}\n <div className=\"wxchtf-input-box-row\">\n {showFileBox && (\n <InputFilesBox\n onAddedClick={toggleShowFileList}\n onUpload={onUpload}\n value={files}\n loading={loading}\n disabled={sending}\n />\n )}\n <InputTextBox\n value={text}\n onSend={onSend}\n onChange={setText}\n disabled={sending}\n inputRef={inputRef}\n />\n <InputSubmitButtonBox onSubmit={onSend} disabled={loading} loading={sending} />\n </div>\n </div>\n </div>\n );\n});\n","import { customize } from '../../customize';\nimport { Avatar } from '../../common/Avatar';\nimport type { MessageBoxProps } from './MessageBox';\n\nexport const MessageAuthor = customize('MessageAuthor', (props: MessageBoxProps) => {\n const { sentBy } = props.message;\n\n return (\n <div className=\"wxchtf-message-author\">\n <Avatar account={sentBy} />\n </div>\n );\n});\n","import { customize } from '../../customize';\nimport { MessageBoxProps } from './MessageBox';\n\nexport const MessageText = customize('MessageText', (props: MessageBoxProps) => {\n const { text } = props.message;\n return <div className=\"wxchtf-message-text\">{text}</div>;\n});\n","import { Button } from 'antd';\nimport { File } from '../../../core';\nimport { customize, useCustomizeContext } from '../../customize';\nimport { useFormatter } from '../../useFormatter';\nimport { Icon } from '../../common';\nimport { ConversationCustomizeValue } from '../Conversation';\nimport { useCallback, useState } from 'react';\n\nfunction open(url: string) {\n const w = window.open(url, '_blank');\n w?.focus();\n}\n\nexport interface MessageFileProps {\n file: File;\n}\n\nfunction useOpen(props: MessageFileProps) {\n const { file } = props;\n const { flippo } = useCustomizeContext<ConversationCustomizeValue>();\n const [isOpenFetching, setIsOpenFetching] = useState(false);\n\n const onOpen = useCallback(\n () =>\n flippo &&\n Promise.resolve(setIsOpenFetching(true))\n .then(() => flippo!.getSasUrl(file.ref))\n .then(open)\n .finally(() => setIsOpenFetching(false)),\n [flippo, file.ref],\n );\n\n return [onOpen, { isOpenFetching }] as const;\n}\n\nexport const MessageFile = customize('MessageFile', (props: MessageFileProps) => {\n const { file } = props;\n const formatter = useFormatter();\n const [onOpen, { isOpenFetching }] = useOpen(props);\n\n return (\n <div className=\"wxchtf-file\">\n <div className=\"wxchtf-icon\">\n <Button loading={isOpenFetching} onClick={onOpen} type=\"link\" icon={<Icon type=\"open-file\" />} />\n </div>\n <div className=\"wxchtf-file-info\">\n <div className=\"wxchtf-name\" title={file.name}>\n {file.name}\n </div>\n <div className=\"wxchtf-size\">{formatter.size(file.bytes)}</div>\n </div>\n </div>\n );\n});\n","import { customize } from '../../customize';\nimport { MessageBoxProps } from './MessageBox';\nimport { MessageFile } from './MessageFile';\n\nexport const MessageFileList = customize('MessageFileList', (props: MessageBoxProps) => {\n const { files } = props.message;\n return (\n <div className=\"wxchtf-file-list\">\n {files.map((file) => (\n <MessageFile key={file.ref} file={file} />\n ))}\n </div>\n );\n});\n","import { customize } from '../../customize';\nimport { MessageText } from './MessageText';\nimport type { MessageBoxProps } from './MessageBox';\nimport { MessageFileList } from './MessageFileList';\n\nexport const MessageContent = customize('MessageContent', (props: MessageBoxProps) => {\n const { files, text } = props.message;\n\n return (\n <div className=\"wxchtf-message-content\">\n {text && <MessageText {...props} />}\n {files.length > 0 && <MessageFileList {...props} />}\n </div>\n );\n});\n","import { chatifyApi } from '../../../core';\nimport { customize } from '../../customize';\nimport { useLocalizer } from '../../localizer';\nimport { useConversation } from '../ConversationContext';\nimport type { MessageBoxProps } from './MessageBox';\n\nexport const MessageInfoBox = customize('MessageInfoBox', (props: MessageBoxProps) => {\n const { message } = props;\n const { id, sentBy, sentAt } = message;\n const { lastReadMessageId, isReading, noReadTracking } = useConversation();\n const me = chatifyApi.settings.me();\n const my = sentBy.id === me;\n const localizer = useLocalizer();\n const isRead = lastReadMessageId != null && id.localeCompare(lastReadMessageId) <= 0;\n const reading = !isRead && isReading?.(id);\n\n return (\n <div className=\"wxchtf-message-info-box\">\n {!my && <div className=\"wxchtf-message-author-name\">{sentBy.name},</div>}\n <div className=\"wxchtf-message-sent-at\">{localizer.timestamp(sentAt)}</div>\n {!my && !noReadTracking && (\n <div className=\"wxchtf-message-read-box\">\n {reading ? localizer.message.reading() : localizer.message.read()}\n </div>\n )}\n </div>\n );\n});\n","import { Ref } from 'react';\nimport { customize } from '../../customize';\nimport { MessageAuthor } from './MessageAuthor';\nimport { MessageContent } from './MessageContent';\nimport { MessageBoxProps } from './MessageBox';\nimport { MessageInfoBox } from './MessageInfoBox';\nimport { chatifyApi } from '../../../core';\n\nexport interface MessageRowProps extends MessageBoxProps {\n containerRef?: Ref<HTMLDivElement>;\n}\n\nexport const MessageRow = customize('MessageRow', (props: MessageRowProps) => {\n const { message, containerRef } = props;\n const { sentBy } = message;\n const me = chatifyApi.settings.me();\n const my = sentBy.id === me;\n\n return (\n <div ref={containerRef} className={'wxchtf-message' + (my ? ' --my' : '')}>\n <MessageAuthor {...props} />\n <div>\n <MessageInfoBox {...props} />\n <MessageContent {...props} />\n </div>\n </div>\n );\n});\n","import { useRef } from 'react';\nimport { customize } from '../../customize';\nimport { MessageReadObserver } from '../ReadObserver';\nimport { MessageRow } from './MessageRow';\nimport { MessageBase } from '../../../core';\n\nexport interface MessageBoxProps {\n message: MessageBase;\n}\n\nexport const MessageBox = customize('MessageBox', (props: MessageBoxProps) => {\n const ref = useRef<HTMLDivElement | null>(null);\n\n return (\n <>\n <MessageReadObserver messageRef={ref} {...props} />\n <MessageRow containerRef={ref} {...props} />\n </>\n );\n});\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport { MessageSkeleton } from '../../common/MessageSkeleton';\n\nexport interface NextMessagesObserverProps {\n onLoad: () => void;\n loading: boolean;\n}\n\nexport function NextMessagesObserver(props: NextMessagesObserverProps) {\n const { onLoad, loading } = props;\n const [intersecting, setIntersecting] = useState(false);\n const ref = useRef<HTMLDivElement | null>(null);\n const timerRef = useRef<number>();\n\n const observer = useMemo(\n () =>\n new IntersectionObserver(([entry]) => {\n if (entry.isIntersecting) {\n timerRef.current = window.setTimeout(() => setIntersecting(true), 200);\n } else {\n clearTimeout(timerRef.current!);\n }\n }),\n [],\n );\n\n useEffect(() => {\n observer.observe(ref.current!);\n return () => observer.disconnect();\n }, [observer]);\n\n useEffect(() => {\n if (!intersecting) {\n return;\n }\n\n onLoad();\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [intersecting]);\n\n if (loading || intersecting) {\n return <MessageSkeleton count={4} />;\n }\n\n return <div className=\"wxchtf-next\" ref={ref} />;\n}\n","import { customize } from '../../customize';\nimport type { SendingMessageBoxProps } from './SendingMessageBox';\n\nexport const SendingMessageText = customize('SendingMessageText', (props: SendingMessageBoxProps) => {\n const { text } = props;\n return <div className=\"wxchtf-sending-message-text\">{text}</div>;\n});\n","import { customize } from '../../customize';\nimport { useLocalizer } from '../../localizer';\nimport type { SendingMessageBoxProps } from './SendingMessageBox';\n\nexport const SendingMessageInfoBox = customize('SendingMessageInfoBox', (_: SendingMessageBoxProps) => {\n const localizer = useLocalizer();\n\n return (\n <div className=\"wxchtf-sending-message-info-box\">\n <div className=\"wxchtf-sending-message-sending-box\">{localizer.message.sending()}</div>\n </div>\n );\n});\n","import { customize } from '../../customize';\nimport { SendingMessageText } from './SendingMessageText';\nimport { SendingMessageInfoBox } from './SendingMessageInfoBox';\nimport type { SendingMessageBoxProps } from './SendingMessageBox';\n\nexport const SendingMessageContent = customize('SendingMessageContent', (props: SendingMessageBoxProps) => {\n return (\n <div className=\"wxchtf-sending-message-content\">\n <SendingMessageText {...props} />\n <SendingMessageInfoBox {...props} />\n </div>\n );\n});\n","import { File } from '../../../core';\nimport { customize } from '../../customize';\nimport { SendingMessageContent } from './SendingMessageContent';\n\nexport interface SendingMessageBoxProps {\n text: string;\n files: File[];\n}\n\nexport const SendingMessageBox = customize('SendingMessageBox', (props: SendingMessageBoxProps) => {\n return (\n <div className=\"wxchtf-sending-message\">\n <SendingMessageContent {...props} />\n </div>\n );\n});\n","import { Button } from 'antd';\nimport { customize } from '../customize';\nimport { useConversation } from './ConversationContext';\nimport { Icon } from '../common';\n\nexport const ConversationActions = customize('ConversationActions', () => {\n const { onClose } = useConversation();\n\n if (!onClose) return null;\n\n return <Button onClick={onClose} type=\"link\" icon={<Icon type=\"close\" />} />;\n});\n","import { MessageBox } from './Message';\nimport { NextMessagesObserver } from './NextObserver';\nimport { SystemMessageBox } from './SystemMessage';\nimport { MessageSkeleton } from '../common/MessageSkeleton';\nimport { customize } from '../customize';\nimport { SYSTEM_ID } from '../../core';\nimport { useConversation } from './ConversationContext';\n\n// TODO: Add sending message box\nexport const ConversationBody = customize('ConversationBody', () => {\n const { id, messages = [], hasMore, onNext, nextLoading } = useConversation();\n\n return (\n <div className=\"wxchtf-conversation-body\">\n {!messages && <MessageSkeleton count={5} />}\n\n {messages?.map((x) => {\n if (x.sentBy.id === SYSTEM_ID) {\n return <SystemMessageBox key={x.id} message={x} />;\n }\n\n return <MessageBox message={x} key={x.id} />;\n })}\n\n {hasMore && <NextMessagesObserver key={messages.length + id} onLoad={onNext} loading={nextLoading} />}\n </div>\n );\n});\n","import { customize } from '../customize';\nimport { useConversation } from './ConversationContext';\n\nexport const ConversationName = customize('ConversationName', () => {\n const { name } = useConversation();\n return <span className=\"wxchtf-conversation-name\">{name}</span>;\n});\n","import { Col, Row } from 'antd';\nimport { customize } from '../customize';\nimport { ConversationName } from './ConversationName';\nimport { ConversationActions } from './ConversationActions';\n\nexport const ConversationHeader = customize('ConversationHeader', () => {\n return (\n <div className=\"wxchtf-conversation-header\">\n <Row justify=\"space-between\" align=\"middle\">\n <Col>\n <ConversationName />\n </Col>\n <Col className=\"wxchtf-conversation-actions\">\n <ConversationActions />\n </Col>\n </Row>\n </div>\n );\n});\n","import { ConversationHeader } from './ConversationHeader';\nimport { ConversationBody } from './ConversationBody';\nimport { customize } from '../customize';\nimport { ConversationName } from './ConversationName';\nimport { ConversationContext, ConversationContextValue, ConversationValue } from './ConversationContext';\nimport { useMemo } from 'react';\nimport { InputBox, InputBoxCustomizeValue } from './InputBox';\nimport { ConversationActions } from './ConversationActions';\nimport { MessageCustomizeValue } from './Message';\nimport { SendingMessageCustomizeValue } from './SendingMessage';\nimport { SystemMessageCustomizeValue } from './SystemMessage';\nimport { CommonCustomizeValue } from '../common';\nimport type { Flippo } from '@webinex/flippo';\n\nexport interface ConversationProps extends Omit<ConversationContextValue, keyof ConversationValue> {\n value: ConversationValue;\n}\n\nexport interface ConversationCustomizeValue\n extends InputBoxCustomizeValue,\n MessageCustomizeValue,\n SendingMessageCustomizeValue,\n SystemMessageCustomizeValue,\n CommonCustomizeValue {\n ConversationActions?: typeof ConversationActions.Component | null;\n ConversationBody?: typeof ConversationBody.Component | null;\n ConversationHeader?: typeof ConversationHeader.Component | null;\n ConversationName?: typeof ConversationName.Component | null;\n flippo?: Flippo;\n}\n\nexport const Conversation = customize('Conversation', (props: ConversationProps) => {\n const {\n value,\n hasMore,\n messages,\n nextLoading,\n onNext,\n onRead,\n onSend,\n isReading,\n noReadTracking,\n onClose,\n } = props;\n\n const { id, active, name, lastReadMessageId } = value;\n\n const context = useMemo<ConversationContextValue>(\n () => ({\n id,\n name,\n active,\n lastReadMessageId,\n hasMore,\n messages,\n nextLoading,\n onNext,\n onRead,\n onSend,\n isReading,\n noReadTracking,\n onClose,\n }),\n [\n id,\n name,\n active,\n onNext,\n onRead,\n onSend,\n hasMore,\n messages,\n nextLoading,\n lastReadMessageId,\n isReading,\n noReadTracking,\n onClose,\n ],\n );\n\n return (\n <ConversationContext.Provider value={context}>\n <div className=\"wxchtf-conversation\">\n <div className=\"wxchtf-conversation-main\">\n <ConversationHeader />\n <ConversationBody />\n {active && <InputBox />}\n </div>\n </div>\n </ConversationContext.Provider>\n );\n});\n","import { Input, Tooltip } from 'antd';\nimport { chatifyApi } from '../../core';\nimport { customize } from '../customize';\nimport { useEffect, useState } from 'react';\nimport { isHotkey } from 'is-hotkey';\nimport { useConversation } from '../Conversation';\n\nconst isEscape = isHotkey('escape');\nconst isEnter = isHotkey('enter');\n\nfunction useUpdateChatName(id: string, value: string) {\n const [updateChatName] = chatifyApi.useUpdateChatNameMutation();\n return () => updateChatName({ id, name: value });\n}\n\nexport const ChatEditableHeaderName = customize('ChatEditableHeaderName', () => {\n const { id, name, active } = useConversation();\n const [editNameValue, setEditNameValue] = useState('');\n const [edit, setEdit] = useState(false);\n const updateChatName = useUpdateChatName(id, editNameValue);\n\n useEffect(() => {\n if (edit) {\n setEditNameValue(name ?? '');\n }\n }, [edit, name]);\n\n if (!active) {\n return <span className=\"wxchtf-conversation-name\">{name}</span>;\n }\n\n if (edit) {\n return (\n <Tooltip defaultOpen title=\"Press Enter to save new chat name or Escape to cancel editing\">\n <Input\n value={editNameValue}\n onChange={(e) => setEditNameValue(e.target.value)}\n onBlur={() => setEdit(false)}\n onKeyDown={(e) => {\n if (isEscape(e)) {\n setEdit(false);\n } else if (isEnter(e)) {\n setEdit(false);\n\n if (editNameValue !== name && editNameValue.trim() !== '') {\n updateChatName();\n }\n }\n }}\n autoFocus\n />\n </Tooltip>\n );\n }\n\n return (\n <Tooltip title=\"Click to edit name...\">\n <span className=\"wxchtf-conversation-name --editable\" onClick={() => setEdit(true)}>\n {name}\n </span>\n </Tooltip>\n );\n});\n","import { ChatMembersPreview } from './Members';\nimport { ChatMembersButton } from './Members';\nimport { customize } from '../customize';\nimport { useConversation } from '../Conversation';\n\nexport const ChatHeaderActions = customize('ChatHeaderActions', () => {\n const { active } = useConversation();\n\n if (!active) {\n return null;\n }\n\n return (\n <div className=\"wxchtf-chat-members\">\n <ChatMembersPreview />\n <ChatMembersButton />\n </div>\n );\n});\n","import { CustomizeContext, customize, useCustomizeContext } from '../customize';\nimport { MessageBody, chatId, chatifyApi } from '../../core';\nimport {\n Conversation,\n ConversationCustomizeValue,\n ConversationProps,\n ConversationValue,\n} from '../Conversation';\nimport { useCallback, useMemo } from 'react';\nimport { ChatEditableHeaderName } from './ChatEditableHeaderName';\nimport { ChatHeaderActions } from './ChatHeaderActions';\nimport { ChatMembersCustomizeValue, ChatMembersPanel } from './Members';\nimport { ChatContext, useChatContext } from './ChatContext';\n\nexport interface ChatProps {\n value: ChatValue;\n}\n\nexport interface ChatValue extends ConversationValue {}\n\nexport interface ChatViewCustomizeValue extends ConversationCustomizeValue, ChatMembersCustomizeValue {\n ChatEditableHeaderName?: typeof ChatEditableHeaderName.Component | null;\n ChatHeaderActions?: typeof ChatHeaderActions.Component | null;\n ChatView?: typeof ChatView.Component | null;\n}\n\nexport const DEFAULT_CHAT_VIEW_CUSTOMIZE_VALUE: ConversationCustomizeValue = {\n ConversationName: () => <ChatEditableHeaderName />,\n ConversationActions: () => <ChatHeaderActions />,\n};\n\nfunction useConversation(props: ChatProps) {\n const { value: chat } = props;\n const { id, name, active, lastReadMessageId } = chat;\n\n const { data: messageList } = chatifyApi.useGetChatMessageListQuery({ chatId: id });\n const { messages, hasMore } = messageList ?? {};\n\n const [fetchNext, { isLoading: isFetchNextLoading }] = chatifyApi.useFetchNextChatMessageListMutation();\n const onNext = useCallback(() => fetchNext({ chatId: id }), [fetchNext, id]);\n\n const [read] = chatifyApi.useReadChatMessageMutation();\n const onRead = useCallback((id: string) => read({ id }), [read]);\n\n const [send] = chatifyApi.useSendChatMessageMutation();\n const onSend = useCallback((message: MessageBody) => send({ ...message, chatId: id }).unwrap(), [id, send]);\n\n const { data: readQueue } = chatifyApi.useGetChatMessageReadQueueQuery();\n\n const conversation = useMemo(() => {\n if (!id) {\n return null;\n }\n\n const result: ConversationProps = {\n value: { id: id!, name: name!, active: active!, lastReadMessageId: lastReadMessageId! },\n messages,\n hasMore,\n onNext,\n nextLoading: isFetchNextLoading,\n onRead,\n onSend,\n isReading: (id: string) => readQueue!.some((x) => chatId(x.value) === chatId(id) && id <= x.value),\n };\n\n return result;\n }, [\n onNext,\n onRead,\n onSend,\n isFetchNextLoading,\n id,\n name,\n active,\n messages,\n hasMore,\n lastReadMessageId,\n readQueue,\n ]);\n\n return conversation;\n}\n\nfunction Content(props: ChatProps) {\n const conversation = useConversation(props);\n const { showMembers } = useChatContext();\n\n if (!conversation) {\n return null;\n }\n\n return (\n <div className=\"wxchtf-chat\">\n <Conversation {...conversation} />\n {showMembers && <ChatMembersPanel />}\n </div>\n );\n}\n\nexport const ChatView = customize('ChatView', (props: ChatProps) => {\n const { value } = props;\n const customized = useCustomizeContext();\n const customize: ChatViewCustomizeValue = useMemo(\n () => ({ ...(customized ?? {}), ...DEFAULT_CHAT_VIEW_CUSTOMIZE_VALUE }),\n [customized],\n );\n\n return (\n <CustomizeContext.Provider value={customize}>\n <ChatContext id={value.id}>\n <Content value={value} />\n </ChatContext>\n </CustomizeContext.Provider>\n );\n});\n","import { CSSProperties } from 'react';\nimport { Localizer, LocalizerContext, defaultLocalizer } from '../localizer';\nimport { CustomizeContext } from '../customize';\nimport { ChatView, ChatViewCustomizeValue } from './ChatView';\nimport { chatifyApi } from '../../core';\n\nexport interface ChatPanelCustomizeValue extends ChatViewCustomizeValue {}\n\nexport interface ChatPanelProps {\n id: string;\n className?: string;\n style?: CSSProperties;\n localizer?: Localizer;\n customize?: ChatPanelCustomizeValue;\n}\n\nexport function ChatPanel(props: ChatPanelProps) {\n const { id, className = '', customize, localizer = defaultLocalizer, style } = props;\n const { data: chat } = chatifyApi.useGetChatQuery({ id });\n\n return (\n <div className={`wxchtf-chatify wxchtf-chat-panel ${className}`} style={style}>\n <LocalizerContext.Provider value={localizer}>\n <CustomizeContext.Provider value={customize as any}>\n {chat && <ChatView value={chat} key={id} />}\n </CustomizeContext.Provider>\n </LocalizerContext.Provider>\n </div>\n );\n}\n","import React, { PropsWithChildren, useContext, useMemo, useState } from 'react';\n\nexport interface ChatGroupContext {\n view: 'chat' | 'new-chat' | 'auto-reply' | null;\n chatId: string | null;\n showMembers: boolean;\n\n none(): void;\n openChat(chatId: string): void;\n toggleNewChat(): void;\n toggleMembers(): void;\n toggleAutoReply(): void;\n}\n\nconst ChatGroupReactContext = React.createContext<ChatGroupContext>(null!);\n\nexport function useChatGroupContext() {\n return useContext(ChatGroupReactContext);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport function ChatGroupContext(props: PropsWithChildren<{}>) {\n const { children } = props;\n const [state, setState] = useState<Pick<ChatGroupContext, 'view' | 'chatId' | 'showMembers'>>({\n chatId: null,\n view: null,\n showMembers: false,\n });\n\n const value = useMemo<ChatGroupContext>(\n () => ({\n ...state,\n openChat: (chatId: string) => setState((prev) => ({ ...prev, view: 'chat', chatId })),\n none: () => setState((prev) => ({ ...prev, view: null, chatId: null })),\n toggleMembers: () => setState((prev) => ({ ...prev, showMembers: !prev.showMembers })),\n toggleNewChat: () =>\n setState((prev) => {\n if (prev.view === 'new-chat' && !prev.chatId) {\n return { ...prev, view: null };\n } else if (prev.view === 'new-chat' && prev.chatId) {\n return { ...prev, view: 'chat' };\n } else {\n return { ...prev, view: 'new-chat' };\n }\n }),\n toggleAutoReply: () =>\n setState((prev) => {\n if (prev.view === 'auto-reply' && prev.chatId) {\n return { ...prev, view: 'chat' };\n } else if (prev.view === 'auto-reply' && !prev.chatId) {\n return { ...prev, view: null };\n } else {\n return { ...prev, view: 'auto-reply' };\n }\n }),\n }),\n [state],\n );\n\n return <ChatGroupReactContext.Provider value={value}>{children}</ChatGroupReactContext.Provider>;\n}\n","import { Button } from 'antd';\nimport { customize } from '../../customize';\nimport { useChatGroupContext } from '../ChatGroupContext';\nimport { useLocalizer } from '../../localizer';\nimport { Icon } from '../../common/Icon';\n\nexport const AutoReplyButton = customize('AutoReplyButton', () => {\n const { toggleAutoReply } = useChatGroupContext();\n const localizer = useLocalizer();\n const titleText = localizer.autoReply.buttonTitle();\n\n return (\n <Button\n className=\"wxchtf-add-btn-settings\"\n onClick={toggleAutoReply}\n icon={<Icon type=\"settings\" />}\n title={titleText}\n aria-label={titleText}\n />\n );\n});\n","import { DatePicker, Form } from 'antd';\nimport { customize } from '../../customize';\nimport { useLocalizer } from '../../localizer';\n\nexport interface AutoReplyPeriodInputProps {\n name: string;\n}\n\nexport const AutoReplyPeriodInput = customize('AutoReplyPeriodInput', (props: AutoReplyPeriodInputProps) => {\n const { name } = props;\n const localizer = useLocalizer();\n\n return (\n <Form.Item\n label={localizer.autoReply.period.label()}\n name={name}\n rules={[{ required: true, message: localizer.autoReply.period.required() }]}\n >\n <DatePicker.RangePicker format={localizer.autoReply.period.format()} />\n </Form.Item>\n );\n});\n","import { Form, Input } from 'antd';\nimport { customize } from '../../customize';\nimport { useLocalizer } from '../../localizer';\n\nexport interface AutoReplyTextInputProps {\n name: string;\n}\n\nexport const AutoReplyTextInput = customize('AutoReplyTextInput', (props: AutoReplyTextInputProps) => {\n const { name } = props;\n const localizer = useLocalizer();\n\n return (\n <Form.Item\n label={localizer.autoReply.text.label()}\n name={name}\n rules={[{ required: true, message: localizer.autoReply.text.required() }]}\n >\n <Input.TextArea rows={4} />\n </Form.Item>\n );\n});\n","import { Button, Form } from 'antd';\nimport { Dayjs } from 'dayjs';\nimport { customize } from '../../customize';\nimport { useLocalizer } from '../../localizer';\nimport { AutoReplyPeriodInput } from './AutoReplyPeriodInput';\nimport { AutoReplyTextInput } from './AutoReplyTextInput';\nimport { useEffect } from 'react';\n\nexport interface AutoReplyFormValue {\n period: [Dayjs, Dayjs];\n text: string;\n}\n\nexport interface AutoReplyFormProps {\n value: AutoReplyFormValue;\n onSubmit: (value: AutoReplyFormValue) => void;\n busy?: boolean;\n}\n\nexport const AUTO_REPLY_FORM_INITIAL_VALUE: AutoReplyFormValue = {\n period: [] as unknown as [Dayjs, Dayjs],\n text: '',\n};\n\nexport const AutoReplyForm = customize('AutoReplyForm', (props: AutoReplyFormProps) => {\n const { value, busy = false, onSubmit } = props;\n const localizer = useLocalizer();\n\n const [form] = Form.useForm<AutoReplyFormValue>();\n\n useEffect(() => {\n form.setFieldsValue(value);\n }, [value, form]);\n\n return (\n <Form<AutoReplyFormValue>\n form={form}\n layout=\"vertical\"\n onFinish={onSubmit}\n disabled={busy}\n initialValues={value}\n >\n <AutoReplyPeriodInput name=\"period\" />\n <AutoReplyTextInput name=\"text\" />\n <Button loading={busy} type=\"primary\" block htmlType=\"submit\">\n {localizer.autoReply.submitBtn()}\n </Button>\n </Form>\n );\n});\n","import dayjs from 'dayjs';\nimport { useCallback, useMemo } from 'react';\nimport { Button } from 'antd';\nimport { customize } from '../../customize';\nimport { useLocalizer } from '../../localizer';\nimport { useChatGroupContext } from '../ChatGroupContext';\nimport { Icon } from '../../common/Icon';\nimport { AutoReply } from '../../../core';\nimport { chatifyApi } from '../../../core';\nimport { AUTO_REPLY_FORM_INITIAL_VALUE, AutoReplyForm, AutoReplyFormValue } from './AutoReplyForm';\n\nfunction mapToFormValue(autoReply?: AutoReply | null): AutoReplyFormValue {\n if (!autoReply) {\n return AUTO_REPLY_FORM_INITIAL_VALUE;\n }\n\n return {\n period: [dayjs(autoReply.period.start), dayjs(autoReply.period.end)],\n text: autoReply.text,\n };\n}\n\nfunction useValue() {\n const { data: me } = chatifyApi.useGeCurrentUserAccountQuery();\n\n const value = useMemo<AutoReplyFormValue>(() => {\n return mapToFormValue(me?.autoReply);\n }, [me]);\n\n return value;\n}\n\nfunction useAutoReplyActions() {\n const meId = chatifyApi.settings.me();\n const [updateAccount, { isLoading }] = chatifyApi.useUpdateAccountMutation();\n\n const onSubmit = useCallback(\n (value: AutoReplyFormValue) =>\n updateAccount({\n id: meId,\n autoReply: {\n hasValue: true,\n value: {\n text: value.text,\n period: {\n start: value.period[0].toISOString(),\n end: value.period[1].toISOString(),\n },\n },\n },\n }).unwrap(),\n [updateAccount, meId],\n );\n\n const onClear = useCallback(\n () =>\n updateAccount({\n id: meId,\n autoReply: {\n hasValue: true,\n value: null,\n },\n }).unwrap(),\n [updateAccount, meId],\n );\n\n return [onSubmit, isLoading, onClear] as const;\n}\n\nexport const AutoReplyPanel = customize('AutoReplyPanel', () => {\n const localizer = useLocalizer();\n const { toggleAutoReply } = useChatGroupContext();\n const value = useValue();\n const [onSubmit, submitting, onClear] = useAutoReplyActions();\n\n return (\n <div className=\"wxchtf-auto-reply-panel\">\n <Button\n onClick={toggleAutoReply}\n className=\"wxchtf-auto-reply-panel-close\"\n type=\"link\"\n icon={<Icon type=\"close\" />}\n />\n <div className=\"wxchtf-auto-reply-panel-header\">\n <h3>{localizer.autoReply.title()}</h3>\n <Button type=\"link\" onClick={onClear} disabled={submitting} className=\"wxchtf-auto-reply-panel-clear\">\n {localizer.autoReply.clearBtn()}\n </Button>\n </div>\n\n <AutoReplyForm value={value} busy={submitting ?? false} onSubmit={onSubmit} />\n </div>\n );\n});\n","import { Form, Input } from 'antd';\nimport { customize } from '../../customize';\nimport { useLocalizer } from '../../localizer';\n\nexport interface CreateChatNameInputProps {\n name: string;\n}\n\nexport const CreateChatNameInput = customize('CreateChatNameInput', (props: CreateChatNameInputProps) => {\n const { name } = props;\n const localizer = useLocalizer();\n\n return (\n <Form.Item\n name={name}\n label={localizer.addChat.name.label()}\n rules={[\n { required: true, message: localizer.addChat.name.required() },\n { max: 250, message: localizer.addChat.name.max250() },\n ]}\n >\n <Input />\n </Form.Item>\n );\n});\n","import { useMemo } from 'react';\nimport { chatifyApi } from '../../../core';\nimport { customize } from '../../customize';\nimport { Checkbox, Form, List } from 'antd';\nimport { useLocalizer } from '../../localizer';\nimport { Avatar } from '../../common/Avatar';\n\nexport interface CreateChatMemberInputProps {\n name: string;\n}\n\ninterface CheckboxListProps {\n value?: string[];\n onChange?: (value: string[]) => void;\n}\n\nfunction CheckboxList(props: CheckboxListProps) {\n const { value, onChange } = props;\n const { data: accounts, isFetching } = chatifyApi.useGetAccountListQuery({});\n const me = chatifyApi.settings.me();\n const dataSource = useMemo(() => accounts?.filter((x) => x.id !== me) ?? [], [accounts, me]);\n\n return (\n <List\n rowKey=\"id\"\n className=\"wxchtf-create-chat-member-input-list\"\n loading={isFetching}\n dataSource={dataSource}\n renderItem={(x) => {\n const checked = value!.includes(x.id);\n\n return (\n <List.Item className={checked ? '--selected' : ''}>\n <Checkbox\n checked={checked}\n onChange={() =>\n onChange!(value!.includes(x.id) ? value!.filter((y) => y !== x.id) : [...value!, x.id])\n }\n >\n <List.Item.Meta avatar={<Avatar account={x} />} title={x.name} />\n </Checkbox>\n </List.Item>\n );\n }}\n />\n );\n}\n\nexport const CreateChatMemberInput = customize(\n 'CreateChatMemberInput',\n (props: CreateChatMemberInputProps) => {\n const { name } = props;\n const localizer = useLocalizer();\n\n return (\n <Form.Item\n label={localizer.addChat.members.label()}\n rules={[{ required: true, message: localizer.addChat.members.required() }]}\n name={name}\n >\n <CheckboxList />\n </Form.Item>\n );\n },\n);\n","import { Button, Form } from 'antd';\nimport { customize } from '../../customize';\nimport { CreateChatNameInput } from './CreateChatNameInput';\nimport { CreateChatMemberInput } from './CreateChatMemberInput';\nimport { useLocalizer } from '../../localizer';\n\nexport interface CreateChatFormValue {\n name: string;\n members: string[];\n}\n\nexport interface CreateChatFormProps {\n value?: CreateChatFormValue;\n onSubmit: (value: CreateChatFormValue) => void;\n busy?: boolean;\n}\n\nconst INITIAL_VALUE: CreateChatFormValue = {\n name: '',\n members: [],\n};\n\nexport const CreateChatForm = customize('CreateChatForm', (props: CreateChatFormProps) => {\n const { value = INITIAL_VALUE, onSubmit, busy = false } = props;\n const localizer = useLocalizer();\n\n return (\n <Form onFinish={onSubmit} layout=\"vertical\" disabled={busy} initialValues={value}>\n <CreateChatNameInput name=\"name\" />\n <CreateChatMemberInput name=\"members\" />\n <Button loading={busy} type=\"primary\" block htmlType=\"submit\">\n {localizer.addChat.submitBtn()}\n </Button>\n </Form>\n );\n});\n","import { chatifyApi } from '../../../core';\nimport { useCallback } from 'react';\nimport { useLocalizer } from '../../localizer';\nimport { CreateChatForm, CreateChatFormValue } from './CreateChatForm';\nimport { customize } from '../../customize';\nimport { Button } from 'antd';\nimport { Icon } from '../../common/Icon';\nimport { useChatGroupContext } from '../ChatGroupContext';\n\nfunction useSubmit() {\n const [add, { isLoading }] = chatifyApi.useAddChatMutation();\n const { openChat } = useChatGroupContext();\n\n const onSubmit = useCallback(\n (value: CreateChatFormValue) =>\n add({\n name: value.name,\n members: value.members,\n })\n .unwrap()\n .then((id) => openChat(id)),\n [add, openChat],\n );\n\n return [onSubmit, isLoading] as const;\n}\n\nexport const CreateChatPanel = customize('CreateChatPanel', () => {\n const localizer = useLocalizer();\n const [onSubmit, submitting] = useSubmit();\n const { toggleNewChat } = useChatGroupContext();\n\n return (\n <div className=\"wxchtf-create-chat-panel\">\n <Button\n onClick={() => toggleNewChat()}\n className=\"wxchtf-create-chat-panel-close\"\n type=\"link\"\n icon={<Icon type=\"close\" />}\n />\n <h3>{localizer.addChat.title()}</h3>\n <CreateChatForm busy={submitting ?? false} onSubmit={onSubmit} />\n </div>\n );\n});\n","import { Button } from 'antd';\nimport { customize } from '../../customize';\nimport { useChatGroupContext } from '../ChatGroupContext';\n\nexport const CreateChatButton = customize('CreateChatButton', () => {\n const { toggleNewChat } = useChatGroupContext();\n\n return (\n <span className=\"wxchtf-add-btn-wrapper\">\n <Button className=\"wxchtf-add-btn\" onClick={toggleNewChat} icon=\"+\">\n Add chat\n </Button>\n </span>\n );\n});\n","import { Space } from 'antd';\nimport { CreateChatButton } from '../Create';\nimport { AutoReplyButton } from '../AutoReply/AutoReplyButton';\nimport { customize } from '../../customize';\n\nexport const ChatGroupActions = customize('ChatGroupActions', () => {\n return (\n <span className=\"wxchtf-add-btn-wrapper\">\n <Space.Compact className=\"wxchtf-add-btn-group\">\n <CreateChatButton />\n <AutoReplyButton />\n </Space.Compact>\n </span>\n );\n});\n","import { useMemo } from 'react';\nimport { chatifyApi } from '../../../core';\nimport { customize } from '../../customize';\nimport { useChatGroupContext } from '../ChatGroupContext';\nimport { ChatListValue, ChatList } from '../../common';\n\nfunction useData() {\n const { data: chats } = chatifyApi.useGetChatListQuery();\n return useMemo(\n () =>\n chats?.map(\n (x): ChatListValue => ({\n id: x.id,\n name: x.name,\n lastMessage: x.message,\n lastReadMessageId: x.lastReadMessageId,\n }),\n ) ?? [],\n [chats],\n );\n}\n\nexport const ChatListPanel = customize('ChatListPanel', () => {\n const { chatId, openChat } = useChatGroupContext();\n const data = useData();\n\n return <ChatList items={data} selected={chatId} onSelect={openChat} />;\n});\n","import { customize } from '../../customize';\nimport { ChatListPanel } from '../List';\nimport { ChatGroupActions } from './ChatGroupActions';\n\nexport const ChatGroupAside = customize('ChatGroupAside', () => {\n return (\n <div className=\"wxchtf-aside\">\n <ChatGroupActions />\n <ChatListPanel />\n </div>\n );\n});\n","import { customize } from '../../customize';\n\nexport const ChatGroupHeader = customize('ChatGroupHeader', () => {\n return <div className=\"wxchtf-header\"></div>;\n});\n","import { customize } from '../../customize';\n\nexport const ChatGroupFooter = customize('ChatGroupFooter', () => <div className=\"wxchtf-footer\"></div>);\n","import { customize } from '../../customize';\nimport { CreateChatPanel } from '../Create';\nimport { ChatView } from '../../Chat';\nimport { useChatGroupContext } from '../ChatGroupContext';\nimport { chatifyApi } from '../../../core';\nimport { AutoReplyPanel } from '../AutoReply';\n\nexport const ChatGroupMain = customize('ChatGroupMain', () => {\n const { chatId, view } = useChatGroupContext();\n const chat = chatifyApi.useChatListItem(chatId);\n\n return (\n <div className=\"wxchtf-main\">\n {view === 'chat' && chat && <ChatView value={chat} key={chatId} />}\n {view === 'new-chat' && <CreateChatPanel />}\n {view === 'auto-reply' && <AutoReplyPanel />}\n </div>\n );\n});\n","import { customize } from '../../customize';\nimport { ChatGroupAside } from './ChatGroupAside';\nimport { ChatGroupMain } from './ChatGroupMain';\n\nexport const ChatGroupBody = customize('ChatGroupBody', () => (\n <div className=\"wxchtf-body\">\n <ChatGroupAside />\n <ChatGroupMain />\n </div>\n));\n","import { CSSProperties, FC, useEffect, useMemo, useRef } from 'react';\nimport { Localizer, LocalizerContext, defaultLocalizer } from '../localizer';\nimport { CreateChatPanelCustomizeValue } from './Create';\nimport { ChatGroupBody, ChatGroupFooter, ChatGroupHeader, ChatGroupLayoutCustomizeValue } from './Layout';\nimport { ChatListPanelCustomizeValue } from './List';\nimport { ChatGroupContext, useChatGroupContext } from './ChatGroupContext';\nimport { chatifyApi } from '../../core';\nimport { CustomizeContext } from '../customize';\nimport { ChatViewCustomizeValue } from '../Chat';\nimport { AutoReplyCustomizeValue } from './AutoReply';\n\nexport interface ChatGroupCustomizeValue\n extends ChatViewCustomizeValue,\n AutoReplyCustomizeValue,\n CreateChatPanelCustomizeValue,\n ChatListPanelCustomizeValue,\n ChatGroupLayoutCustomizeValue {}\n\nexport interface ChatifyProps {\n className?: string;\n style?: CSSProperties;\n localizer?: Localizer;\n customize?: ChatGroupCustomizeValue;\n}\n\nfunction Content(props: Pick<ChatifyProps, 'className' | 'style'>) {\n const { className = '', style } = props;\n const { data: chats } = chatifyApi.useGetChatListQuery();\n const { openChat, none, chatId } = useChatGroupContext();\n const openFirstChatRef = useRef(false);\n\n useEffect(() => {\n if (chats && !chats.some((x) => x.id === chatId)) {\n chats.length ? openChat(chats[0].id) : none();\n }\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [chats, chatId]);\n\n useEffect(() => {\n if (chats && !openFirstChatRef.current) {\n openFirstChatRef.current = true;\n chats.length && openChat(chats[0].id);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [chats]);\n\n return (\n <div className={className + ' wxchtf-chatify wxchtf-chat-group'} style={style}>\n <ChatGroupHeader />\n <ChatGroupBody />\n <ChatGroupFooter />\n </div>\n );\n}\n\nconst DEFAULT_CUSTOMIZE: ChatGroupCustomizeValue = {\n ChatGroupHeader: null,\n ChatGroupFooter: null,\n};\n\nexport const ChatGroupPanel: FC<ChatifyProps> = (props) => {\n const { localizer = defaultLocalizer, customize = DEFAULT_CUSTOMIZE } = props;\n const customizeValue = useMemo(() => Object.assign({}, DEFAULT_CUSTOMIZE, customize), [customize]);\n\n return (\n <LocalizerContext.Provider value={localizer}>\n <CustomizeContext.Provider value={customizeValue as any}>\n <ChatGroupContext>\n <Content {...props} />\n </ChatGroupContext>\n </CustomizeContext.Provider>\n </LocalizerContext.Provider>\n );\n};\n","import React from 'react';\n\nexport interface ThreadContextValue {\n id: string;\n watch: boolean;\n onWatch: (value: boolean) => void;\n}\n\nexport const ThreadContext = React.createContext<ThreadContextValue>(null!);\n\nexport function useThreadContext() {\n return React.useContext(ThreadContext);\n}\n","import { Button, Tooltip } from 'antd';\nimport { customize } from '../customize';\nimport { useThreadContext } from './ThreadContext';\nimport { Icon } from '../common/Icon';\n\nexport const ThreadActions = customize('ThreadActions', () => {\n const { watch, onWatch } = useThreadContext();\n\n if (!watch) {\n return (\n <Tooltip title=\"Watch thread\">\n <Button type=\"link\" icon={<Icon type=\"watch\" />} onClick={() => onWatch(true)} />\n </Tooltip>\n );\n }\n\n return (\n <Tooltip title=\"Unwatch thread\">\n <Button type=\"link\" icon={<Icon type=\"unwatch\" />} onClick={() => onWatch(false)} />\n </Tooltip>\n );\n});\n","import { useCallback, useEffect, useMemo } from 'react';\nimport { MessageBody, chatifyApi, parseThreadMessageId } from '../../core';\nimport { Conversation, ConversationCustomizeValue, ConversationProps } from '../Conversation';\nimport { ThreadContext, ThreadContextValue } from './ThreadContext';\nimport { Localizer, LocalizerContext, defaultLocalizer } from '../localizer';\nimport { CustomizeContext } from '../customize';\nimport { ThreadActions } from './ThreadActions';\nimport { CommonCustomizeValue } from '../common';\n\nexport interface ThreadCustomizeValue extends ConversationCustomizeValue, CommonCustomizeValue {\n ThreadActions?: typeof ThreadActions.Component | null;\n}\n\nexport interface ThreadPanelProps {\n threadId: string;\n className?: string;\n customize?: ThreadCustomizeValue;\n localizer?: Localizer;\n}\n\nfunction usePanelState(props: ThreadPanelProps) {\n const { threadId } = props;\n const { data: thread } = chatifyApi.useGetThreadQuery({ id: threadId });\n const { data: messageList } = chatifyApi.useGetThreadMessageListQuery({ threadId });\n const { id, name, archive, lastReadMessageId, watch } = thread ?? {};\n const { messages, hasMore } = messageList ?? {};\n\n const [read] = chatifyApi.useReadThreadMessageMutation();\n const onRead = useCallback((id: string) => read({ id }), [read]);\n\n const [fetchNext, { isLoading: isFetchNextLoading }] = chatifyApi.useFetchNextThreadMessageListMutation();\n const onNext = useCallback(() => fetchNext({ threadId }), [fetchNext, threadId]);\n\n const [send] = chatifyApi.useSendThreadMessageMutation();\n const onSend = useCallback(\n (message: MessageBody) => send({ body: message, threadId }).unwrap(),\n [threadId, send],\n );\n\n const { data: readQueue } = chatifyApi.useGetThreadMessageReadQueueQuery();\n\n const conversation = useMemo(() => {\n if (!id) {\n return null;\n }\n\n const result: ConversationProps = {\n value: { id: id!, name: name!, active: !archive, lastReadMessageId: lastReadMessageId ?? null },\n messages,\n hasMore,\n onNext,\n nextLoading: isFetchNextLoading,\n onRead,\n onSend,\n noReadTracking: !watch,\n isReading: (id: string) =>\n readQueue!.some(\n (unit) => parseThreadMessageId(unit.value)[0] === parseThreadMessageId(id)[0] && id <= unit.value,\n ),\n };\n\n return result;\n }, [\n onNext,\n onRead,\n onSend,\n isFetchNextLoading,\n id,\n name,\n archive,\n messages,\n hasMore,\n lastReadMessageId,\n readQueue,\n watch,\n ]);\n\n const [watchThread] = chatifyApi.useWatchThreadMutation();\n\n const threadContext = useMemo<ThreadContextValue | null>(\n () =>\n thread\n ? {\n id: thread.id,\n watch: thread.watch,\n onWatch: (value) => watchThread({ id: thread.id, watch: value }).unwrap(),\n }\n : null,\n [thread, watchThread],\n );\n\n return [conversation, threadContext] as const;\n}\n\nconst DEFAULT_CUSTOMIZE: ThreadCustomizeValue = {\n ConversationActions: () => <ThreadActions />,\n};\n\nexport function ThreadPanel(props: ThreadPanelProps) {\n const { threadId, customize, localizer = defaultLocalizer, className = '' } = props;\n const [conversation, threadContext] = usePanelState(props);\n const customizeMergeValue = useMemo(() => ({ ...DEFAULT_CUSTOMIZE, ...customize }), [customize]);\n\n useEffect(() => {\n chatifyApi.settings.client.connectToThread(threadId);\n\n return () => {\n chatifyApi.settings.client.disconnectFromThread(threadId);\n };\n }, [threadId]);\n\n if (!conversation || !threadContext) {\n return null;\n }\n\n return (\n <LocalizerContext.Provider value={localizer}>\n <ThreadContext.Provider value={threadContext}>\n <CustomizeContext.Provider value={customizeMergeValue as any}>\n <div className={`wxchtf-chatify wxchtf-thread ${className}`}>\n {conversation && <Conversation {...conversation} />}\n </div>\n </CustomizeContext.Provider>\n </ThreadContext.Provider>\n </LocalizerContext.Provider>\n );\n}\n","import { ChatPanel } from './Chat';\nimport { ChatGroupPanel } from './ChatGroup';\nimport { ThreadPanel } from './Thread';\n\nexport interface ChatifyType {\n Thread: typeof ThreadPanel;\n ChatGroup: typeof ChatGroupPanel;\n Chat: typeof ChatPanel;\n}\n\nexport const Chatify = {\n Thread: ThreadPanel,\n ChatGroup: ChatGroupPanel,\n Chat: ChatPanel,\n} as unknown as ChatifyType;\n"],"names":["forwardRef","unit","chatId","AntdAvatar","isEnter","useConversation","files","id","Content","customize","DEFAULT_CUSTOMIZE"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Chatify-CwAfN1wu.js","sources":["../src/ui/color.ts","../src/ui/customize.tsx","../src/ui/common/Icon.tsx","../src/ui/Chat/ChatContext.tsx","../src/ui/Chat/Members/ChatMembersButton.tsx","../src/core/constants.ts","../src/core/types.tsx","../src/core/debounce.ts","../src/core/api/baseApi.ts","../src/core/client.ts","../src/core/api/api.ts","../src/ui/common/Avatar.tsx","../src/ui/Chat/Members/ChatMembersPanel.tsx","../src/ui/Chat/Members/ChatMembersPreview.tsx","../src/ui/Conversation/InputBox/InputFilesBox.tsx","../src/ui/localizer.tsx","../src/ui/Conversation/InputBox/InputTextBox.tsx","../src/ui/Conversation/InputBox/InputSubmitButtonBox.tsx","../src/ui/Conversation/ConversationContext.ts","../src/ui/common/MessageSkeleton.tsx","../src/ui/common/ChatList/ChatListItemName.tsx","../src/ui/common/ChatList/ChatListItemUnreadCount.tsx","../src/ui/Conversation/SystemMessage/SystemMessageRow.tsx","../src/ui/Conversation/ReadObserver/MessageReadObserver.tsx","../src/ui/Conversation/SystemMessage/SystemMessageBox.tsx","../src/ui/common/ChatList/ChatListItemLastMessageContent.tsx","../src/ui/common/ChatList/ChatListItemLastMessageAuthor.tsx","../src/ui/common/ChatList/ChatListItemLastMessageSentAt.tsx","../src/ui/common/ChatList/ChatListItemLastMessage.tsx","../src/ui/common/ChatList/ChatListItemAvatar.tsx","../src/ui/common/ChatList/ChatListItemBox.tsx","../src/ui/common/ChatList/ChatList.tsx","../src/ui/useFormatter.tsx","../src/ui/Conversation/InputBox/InputBoxFile.tsx","../src/ui/Conversation/InputBox/InputBoxFileList.tsx","../src/ui/Conversation/InputBox/InputBox.tsx","../src/ui/Conversation/Message/MessageAuthor.tsx","../src/ui/Conversation/Message/MessageText.tsx","../src/ui/Conversation/Message/MessageFile.tsx","../src/ui/Conversation/Message/MessageFileList.tsx","../src/ui/Conversation/Message/MessageContent.tsx","../src/ui/Conversation/Message/MessageInfoBox.tsx","../src/ui/Conversation/Message/MessageRow.tsx","../src/ui/Conversation/Message/MessageBox.tsx","../src/ui/Conversation/NextObserver/NextMessagesObserver.tsx","../src/ui/Conversation/SendingMessage/SendingMessageText.tsx","../src/ui/Conversation/SendingMessage/SendingMessageInfoBox.tsx","../src/ui/Conversation/SendingMessage/SendingMessageContent.tsx","../src/ui/Conversation/SendingMessage/SendingMessageBox.tsx","../src/ui/Conversation/ConversationActions.tsx","../src/ui/Conversation/ConversationBody.tsx","../src/ui/Conversation/ConversationName.tsx","../src/ui/Conversation/ConversationHeader.tsx","../src/ui/Conversation/Conversation.tsx","../src/ui/Chat/ChatEditableHeaderName.tsx","../src/ui/Chat/ChatHeaderActions.tsx","../src/ui/Chat/ChatView.tsx","../src/ui/Chat/ChatPanel.tsx","../src/ui/ChatGroup/ChatGroupContext.tsx","../src/ui/ChatGroup/AutoReply/AutoReplyButton.tsx","../src/ui/ChatGroup/AutoReply/AutoReplyPeriodInput.tsx","../src/ui/ChatGroup/AutoReply/AutoReplyTextInput.tsx","../src/ui/ChatGroup/AutoReply/AutoReplyForm.tsx","../src/ui/ChatGroup/AutoReply/AutoReplyPanel.tsx","../src/ui/ChatGroup/Create/CreateChatNameInput.tsx","../src/ui/ChatGroup/Create/CreateChatMemberInput.tsx","../src/ui/ChatGroup/Create/CreateChatForm.tsx","../src/ui/ChatGroup/Create/CreateChatPanel.tsx","../src/ui/ChatGroup/Create/CreateChatButton.tsx","../src/ui/ChatGroup/Layout/ChatGroupActions.tsx","../src/ui/ChatGroup/List/ChatListPanel.tsx","../src/ui/ChatGroup/Layout/ChatGroupAside.tsx","../src/ui/ChatGroup/Layout/ChatGroupHeader.tsx","../src/ui/ChatGroup/Layout/ChatGroupFooter.tsx","../src/ui/ChatGroup/Layout/ChatGroupMain.tsx","../src/ui/ChatGroup/Layout/ChatGroupBody.tsx","../src/ui/ChatGroup/ChatGroupPanel.tsx","../src/ui/Thread/ThreadContext.ts","../src/ui/Thread/ThreadActions.tsx","../src/ui/Thread/ThreadPanel.tsx","../src/ui/Chatify.tsx"],"sourcesContent":["interface ColorOptions {\n saturation?: number;\n lightness?: number;\n}\n\nconst DEFAULT_COLOR_OPTIONS: ColorOptions = {\n saturation: 100,\n lightness: 75,\n};\n\nexport function color(value: string, options: ColorOptions = {}) {\n options = Object.assign({}, DEFAULT_COLOR_OPTIONS, options);\n\n let hash = 0;\n for (let i = 0; i < value.length; i++) {\n hash = value.charCodeAt(i) + ((hash << 5) - hash);\n hash = hash & hash;\n }\n return `hsl(${hash % 360}, ${options.saturation}%, ${options.lightness}%)`;\n}\n","import React, { FC, useContext } from 'react';\n\nexport type Customizable<TComponent extends React.ComponentType<any>> = TComponent & {\n Component: TComponent;\n key: string;\n};\n\nexport const CustomizeContext = React.createContext<Record<string, any>>(null!);\n\nexport function useCustomizeContext<TValue>() {\n return useContext(CustomizeContext) as TValue;\n}\n\nfunction useCustom<TComponent extends React.ComponentType>(key: string): TComponent | undefined | null {\n const value = useContext(CustomizeContext);\n return value ? (value[key] as TComponent | null | undefined) : undefined;\n}\n\nexport function useCustomize<TCustom extends Customizable<React.ComponentType<any>>>(custom: TCustom) {\n const Custom = useCustom<TCustom['Component']>(custom.key);\n\n if (Custom == null) {\n return null;\n }\n\n return Custom ?? custom.Component;\n}\n\nexport function customize<TComponent extends React.ComponentType<any>>(\n key: string,\n Component: TComponent,\n): TComponent extends React.ComponentType<infer X> ? Customizable<React.ComponentType<X>> : never {\n const Result: FC<any> = React.forwardRef<TComponent, any>((props: any, forwardRef) => {\n const Custom = useCustom(key);\n\n if (Custom === null) {\n return null;\n }\n\n if (Custom) {\n return <Custom {...props} ref={forwardRef} />;\n }\n\n return <Component {...props} ref={forwardRef} />;\n });\n\n Component.displayName = Component.displayName || key;\n Result.displayName = 'Customizable.' + Component.displayName;\n\n return Object.assign(Result, { key, Component }) as any;\n}\n","import { FC } from 'react';\nimport { customize } from '../customize';\nimport {\n SendOutlined,\n PaperClipOutlined,\n UserAddOutlined,\n UsergroupAddOutlined,\n UserDeleteOutlined,\n UsergroupDeleteOutlined,\n TeamOutlined,\n EditOutlined,\n CloseOutlined,\n EyeInvisibleOutlined,\n EyeOutlined,\n DeleteOutlined,\n DownloadOutlined,\n SettingOutlined,\n} from '@ant-design/icons';\n\nexport type IconType = keyof typeof ICONS;\n\nexport interface IconProps {\n type: IconType;\n}\n\nexport const ICONS = {\n attach: PaperClipOutlined,\n send: SendOutlined,\n 'remove-member': UserDeleteOutlined,\n 'remove-member-delete-history': UsergroupDeleteOutlined,\n 'add-member': UserAddOutlined,\n 'add-member-with-history': UsergroupAddOutlined,\n members: TeamOutlined,\n edit: EditOutlined,\n close: CloseOutlined,\n chat: TeamOutlined,\n watch: EyeOutlined,\n unwatch: EyeInvisibleOutlined,\n 'delete-file': DeleteOutlined,\n 'open-file': DownloadOutlined,\n settings: SettingOutlined,\n};\n\nexport const Icon = customize<FC<IconProps>>('Icon', (props) => {\n const { type } = props;\n const IconComponent = ICONS[type];\n return IconComponent ? <IconComponent /> : null;\n});\n","import React, { PropsWithChildren, useContext, useMemo, useState } from 'react';\n\nexport interface ChatContext {\n id: string;\n showMembers: boolean;\n onShowMembers: (value: boolean) => void;\n}\n\nconst ChatReactContext = React.createContext<ChatContext>(null!);\n\nexport function useChatContext() {\n return useContext(ChatReactContext);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport function ChatContext(props: PropsWithChildren<{ id: string }>) {\n const { id, children } = props;\n const [showMembers, onShowMembers] = useState(false);\n\n const value = useMemo<ChatContext>(\n () => ({\n id,\n showMembers,\n onShowMembers,\n }),\n [id, showMembers],\n );\n\n return <ChatReactContext.Provider value={value}>{children}</ChatReactContext.Provider>;\n}\n","import { Button } from 'antd';\nimport { customize } from '../../customize';\nimport { Icon } from '../../common/Icon';\nimport { useChatContext } from '../ChatContext';\n\nexport const ChatMembersButton = customize('ChatMembersButton', () => {\n const { showMembers, onShowMembers } = useChatContext();\n return <Button onClick={() => onShowMembers(!showMembers)} type=\"link\" icon={<Icon type=\"members\" />} />;\n});\n","export const SYSTEM_ID = 'chatify::system';\n","export interface Optional<TValue> {\n hasValue: boolean;\n value?: TValue | null;\n}\n\nexport interface File {\n name: string;\n bytes: number;\n ref: string;\n}\n\nexport interface Period {\n start: string;\n end: string;\n}\n\nexport interface AutoReply {\n text: string;\n period: Period;\n}\n\nexport interface Account {\n id: string;\n name: string;\n avatar: string;\n autoReply: AutoReply | null;\n}\n\nexport interface UpdateAccountRequest {\n id: string;\n autoReply?: Optional<AutoReply> | null;\n name?: Optional<string> | null;\n avatar?: Optional<string> | null;\n active?: Optional<boolean> | null;\n}\n\nexport interface MessageBase {\n id: string;\n text: string | null;\n files: File[];\n sentAt: string;\n sentBy: Account;\n}\n\nexport interface ChatMessage extends MessageBase {\n chatId: string;\n}\n\nexport interface Chat {\n id: string;\n name: string;\n members: Account[];\n active: boolean;\n lastReadMessageId: string | null;\n}\n\nexport interface ChatListItem {\n id: string;\n name: string;\n message: ChatMessage;\n totalUnreadCount: number;\n active: boolean;\n lastReadMessageId: string | null;\n}\n\nexport interface SendChatMessageRequest {\n chatId: string;\n text: string | null;\n files: File[];\n}\n\nexport interface MessageBody {\n text: string | null;\n files: File[];\n}\n\nexport interface AddChatRequest {\n name: string;\n message?: MessageBody;\n members: string[];\n}\n\nexport interface ReadChatMessageRequest {\n id: string;\n}\n\nexport interface ReadChatMessageEvent {\n chatId: string;\n newLastReadMessageId: string;\n readCount: number;\n}\n\nexport interface RemoveChatMemberRequest {\n chatId: string;\n accountId: string;\n deleteHistory: boolean;\n}\n\nexport interface AddChatMemberRequest {\n chatId: string;\n accountId: string;\n withHistory: boolean;\n}\n\nexport interface UpdateChatNameRequest {\n id: string;\n name: string;\n}\n\nexport function chatId(messageId: string) {\n return messageId.slice(0, 36);\n}\n\nexport function messageSequencePart(id: string) {\n return id.slice(37);\n}\n\nexport interface ThreadWatchListItem {\n id: string;\n name: string;\n createdById: string;\n createdAt: string;\n archive: boolean;\n lastMessage: ThreadMessage | null;\n lastReadMessageId: string | null;\n}\n\nexport interface Thread {\n id: string;\n name: string;\n createdBy: Account;\n createdAt: string;\n archive: boolean;\n lastMessageId: string | null;\n lastReadMessageId: string | null;\n watch: boolean;\n}\n\nexport interface ThreadMessage extends MessageBase {\n threadId: string;\n}\n\nexport interface SendThreadMessageRequest {\n threadId: string;\n body: MessageBody;\n}\n\nexport interface ListSegment<T> {\n items: T[];\n total: number;\n}\n\nexport type SystemMessageText =\n | 'chatify://chat-created'\n | 'chatify://member-added'\n | 'chatify://member-removed'\n | `chatify://chat-name-changed`;\n\nexport function parseThreadMessageId(messageId: string) {\n const [threadId, index] = messageId.split('::', 2);\n return [threadId, parseInt(index, 10)] as const;\n}\n\nexport function calcThreadUnreadCount(\n thread: Pick<ThreadWatchListItem, 'lastMessage' | 'lastReadMessageId'>,\n) {\n const lastReadMessageIndex =\n thread.lastReadMessageId != null ? parseThreadMessageId(thread.lastReadMessageId)[1] : -1;\n\n const lastThreadMessageIndex =\n thread.lastMessage?.id != null ? parseThreadMessageId(thread.lastMessage?.id)[1] : -1;\n\n return lastThreadMessageIndex - lastReadMessageIndex;\n}\n\nexport function calcThreadListUnreadCount(\n threads: Pick<ThreadWatchListItem, 'lastMessage' | 'lastReadMessageId'>[],\n) {\n return threads.reduce((prev, thread) => {\n return prev + calcThreadUnreadCount(thread);\n }, 0);\n}\n","interface DebounceInternalValue<T> {\n value: T;\n enqueueTime: number;\n}\n\nexport interface DebounceValue<T> extends DebounceInternalValue<T> {\n state: 'enqueued' | 'processing';\n}\n\nexport interface DebounceConfig<T> {\n timeout: number;\n callback: (value: T) => Promise<any>;\n groupBy: (value: T) => string;\n compare: (a: T, b: T) => number;\n}\n\nexport class Debounce<T> {\n private _enqueued: DebounceInternalValue<T>[] = [];\n private _processing: DebounceInternalValue<T>[] = [];\n private _timeoutByGroup: Record<string, number> = {};\n private _subscribers: ((value: Debounce<T>) => any)[] = [];\n\n constructor(public config: DebounceConfig<T>) {}\n\n public get units(): DebounceValue<T>[] {\n return [\n ...this._enqueued.map((x) => ({ ...x, state: 'enqueued' as const })),\n ...this._processing.map((x) => ({ ...x, state: 'processing' as const })),\n ];\n }\n\n public subscribe = (callback: (value: Debounce<T>) => any) => {\n this._subscribers.push(callback);\n return () => {\n this._subscribers = this._subscribers.filter((x) => x !== callback);\n };\n };\n\n public notify = () => {\n this._subscribers.forEach((subscriber) => subscriber(this));\n };\n\n public push(value: T) {\n const group = this.config.groupBy(value);\n const unit = this._enqueued.find((unit) => this.config.groupBy(unit.value) === group);\n\n if (!unit) {\n this._enqueued.push({ value, enqueueTime: Date.now() });\n } else if (this.config.compare(unit.value, value) >= 0) {\n unit.value = value;\n unit.enqueueTime = Date.now();\n }\n\n this._process(group);\n }\n\n private _process(group: string) {\n if (!this._enqueued.some((unit) => this.config.groupBy(unit.value) === group)) {\n return;\n }\n\n let timeout = this._timeoutByGroup[group];\n timeout && clearTimeout(timeout);\n\n if (this._processing.some((unit) => this.config.groupBy(unit.value) === group)) {\n return;\n }\n\n timeout = setTimeout(() => {\n const processing = this._enqueued.find((unit) => this.config.groupBy(unit.value) === group)!;\n this._processing.push(processing);\n this._enqueued.splice(this._enqueued.indexOf(processing), 1);\n this.notify();\n\n this.config\n .callback(processing.value)\n .then(() => {\n this._processing.splice(this._processing.indexOf(processing), 1);\n this.notify();\n this._process(group);\n })\n .catch(() => {\n this._processing.splice(this._processing.indexOf(processing), 1);\n this.push(processing.value);\n });\n }, this.config.timeout);\n\n this._timeoutByGroup[group] = timeout;\n }\n}\n","import { BaseQueryFn, EndpointBuilder, createApi, fakeBaseQuery } from '@reduxjs/toolkit/query/react';\nimport { ChatifyClient } from '../client';\nimport { Debounce } from '../debounce';\nimport { chatId } from '../types';\n\nexport const DEFAULT_MESSAGE_LIST_TAKE = 20;\n\nexport const CHAT_MESSAGE_READ_QUEUE = new Debounce<string>({\n callback: (id) => __settings.client.readChatMessage({ id }),\n compare: (a, b) => -a.localeCompare(b),\n groupBy: (id) => chatId(id),\n timeout: 500,\n});\n\nexport interface ChatifyApiSettings {\n me: () => string;\n client: ChatifyClient;\n}\n\nexport const __settings: ChatifyApiSettings = {\n me: null!,\n client: null!,\n};\n\nconst TAG_TYPES = ['chat', 'account', 'message', 'thread', 'thread-message'] as const;\n\nexport interface BaseApiEndpointBuilder\n extends EndpointBuilder<BaseQueryFn, (typeof TAG_TYPES)[number], 'chatify'> {}\n\nconst baseApi: ReturnType<typeof createApi<BaseQueryFn, {}, 'chatify', (typeof TAG_TYPES)[number]>> =\n createApi({\n baseQuery: fakeBaseQuery(),\n reducerPath: 'chatify',\n tagTypes: TAG_TYPES,\n endpoints: (_) => ({}),\n });\n\nexport const __baseApi = baseApi;\n","import { AxiosInstance } from 'axios';\nimport * as SignalR from '@microsoft/signalr';\nimport {\n Account,\n AddChatRequest,\n AddChatMemberRequest,\n Chat,\n ChatListItem,\n ChatMessage,\n ReadChatMessageEvent,\n ReadChatMessageRequest,\n RemoveChatMemberRequest,\n SendChatMessageRequest,\n UpdateChatNameRequest,\n SendThreadMessageRequest,\n Thread,\n ThreadMessage,\n ThreadWatchListItem as ThreadListItem,\n UpdateAccountRequest,\n} from './types';\n\nexport interface ChatifySignalRConfig {\n hubUri?: string;\n accessTokenFactory?: () => Promise<string>;\n headersFactory?: () => Promise<Record<string, string>>;\n}\n\nconst DEFAULT_SIGNALR_CONFIG: ChatifySignalRConfig = {\n hubUri: '/api/chatify/hub',\n headersFactory: () => Promise.resolve({}),\n};\n\nexport interface ChatifyClientConfig {\n axios: AxiosInstance;\n signalR: ChatifySignalRConfig;\n}\n\nexport const CHATIFY_SIGNALR_METHODS = [\n 'chatify://chat-new-message',\n 'chatify://chat-created',\n 'chatify://chat-message-read',\n 'chatify://chat-member-added',\n 'chatify://chat-member-removed',\n 'chatify://chat-name-changed',\n\n 'chatify://thread-created',\n 'chatify://thread-message-new',\n 'chatify://thread-message-read',\n 'chatify://thread-watch-added',\n 'chatify://thread-watch-removed',\n 'chatify://thread-updated',\n] as const;\n\nexport type ChatifySignalRMethod = (typeof CHATIFY_SIGNALR_METHODS)[number];\n\nexport type ChatifySignalRArgsByMethod = {\n 'chatify://chat-new-message': [message: ChatMessage];\n 'chatify://chat-created': [chat: ChatListItem];\n 'chatify://chat-message-read': [events: ReadChatMessageEvent[]];\n 'chatify://chat-member-added': [\n chatId: string,\n chatName: string,\n account: Account,\n message: ChatMessage,\n withHistory: boolean,\n read: boolean,\n ];\n 'chatify://chat-member-removed': [\n chatId: string,\n accountId: string,\n deleteHistory: boolean,\n message: ChatMessage,\n read: boolean,\n ];\n 'chatify://chat-name-changed': [chatId: string, newName: string, message: ChatMessage, read: boolean];\n\n 'chatify://thread-message-new': [threadId: string, message: ThreadMessage, readForId: string | null];\n 'chatify://thread-message-read': [threadId: string, messageId: string];\n 'chatify://thread-watch-added': [thread: ThreadListItem];\n 'chatify://thread-watch-removed': [id: string];\n 'chatify://thread-created': [thread: ThreadListItem, watch: boolean];\n 'chatify://thread-updated': [threadId: string, threadName: string];\n};\n\nexport class ChatifyClient {\n private _config: ChatifyClientConfig;\n private _connection: SignalR.HubConnection = null!;\n private _connectionPromise: Promise<SignalR.HubConnection> | null = null!;\n private _subscribers: Record<string, ((args: any[]) => void)[]> = {};\n private _reconnectSubscribers: Array<() => void> = [];\n private _threadConnectionByThreadId = new Map<string, number>();\n\n constructor(config: ChatifyClientConfig) {\n this._config = {\n ...config,\n signalR: {\n ...DEFAULT_SIGNALR_CONFIG,\n ...config.signalR,\n },\n };\n }\n\n public connect = async () => {\n if (this._connection) {\n return;\n }\n\n if (this._connectionPromise) {\n return await this._connectionPromise;\n }\n\n this._connectionPromise = this.createAndStartConnection();\n this._connection = await this._connectionPromise;\n };\n\n private createAndStartConnection = async () => {\n const headers = await this._config.signalR!.headersFactory!();\n\n const connection = new SignalR.HubConnectionBuilder()\n .withUrl(this._config.signalR!.hubUri!, {\n accessTokenFactory: this._config.signalR!.accessTokenFactory\n ? this._config.signalR!.accessTokenFactory\n : undefined,\n headers,\n })\n .withAutomaticReconnect()\n .build();\n\n CHATIFY_SIGNALR_METHODS.forEach((x) => {\n connection.on(x, (...args) => {\n this._subscribers[x]?.forEach((s) => {\n try {\n s(args);\n } catch (ex) {\n console.error(`Failed to notify subscriber`, ex);\n }\n });\n });\n });\n\n connection.onreconnected(() => this._reconnectSubscribers.forEach((subscriber) => subscriber()));\n\n await connection.start();\n return connection;\n };\n\n public subscribe = <TMethod extends ChatifySignalRMethod>(\n method: TMethod,\n subscriber: (args: ChatifySignalRArgsByMethod[TMethod]) => void,\n ) => {\n this.connect().then(() => {\n this._subscribers[method] = this._subscribers[method] ?? [];\n this._subscribers[method].push(subscriber as any);\n });\n return () => this._subscribers[method].filter((x) => x !== subscriber);\n };\n\n public subscribeReconnect = (subscriber: () => any) => {\n this._reconnectSubscribers.push(subscriber);\n return () => this._reconnectSubscribers.filter((x) => x !== subscriber);\n };\n\n public get axios() {\n return this._config.axios;\n }\n\n public accounts = async (args: { ids?: string[] }) => {\n const searchParams = new URLSearchParams();\n\n args?.ids?.forEach((id) => {\n searchParams.append('ids', encodeURIComponent(id));\n });\n\n const { data } = await this.axios.get<Account[]>(`account?${searchParams.toString()}`);\n return data;\n };\n\n public currentUserAccount = async () => {\n const { data } = await this.axios.get<Account>('account/me');\n return data;\n };\n\n public updateAccount = async (request: UpdateAccountRequest) => {\n await this.axios.put(`account/${encodeURIComponent(request.id)}`, request);\n };\n\n public chats = async () => {\n const { data } = await this.axios.get<ChatListItem[]>('chat');\n return data;\n };\n\n public chat = async (id: string) => {\n const { data } = await this.axios.get<Chat>(`chat/${encodeURIComponent(id)}`);\n return data;\n };\n\n public addChat = async (args: AddChatRequest) => {\n const { data } = await this.axios.post<string>(`chat`, args);\n return data;\n };\n\n public chatMessages = async (args: { chatId: string; skip?: number; take?: number }) => {\n const { chatId, skip = 0, take = 20 } = args;\n const pagingRule = encodeURIComponent(JSON.stringify({ skip, take }));\n const { data } = await this.axios.get<ChatMessage[]>(\n `chat/${encodeURIComponent(chatId)}/message?pagingRule=${pagingRule}`,\n );\n return data;\n };\n\n public sendChatMessage = async (request: SendChatMessageRequest) => {\n const { chatId, ...rest } = request;\n await this.axios.post(`chat/${encodeURIComponent(chatId)}/message`, rest);\n };\n\n public readChatMessage = async (request: ReadChatMessageRequest) => {\n await this.axios.put(`chat/message/read`, request);\n };\n\n public removeChatMember = async (request: RemoveChatMemberRequest) => {\n await this.axios.delete(`chat/${encodeURIComponent(request.chatId)}/member`, { data: request });\n };\n\n public updateChatName = async (request: UpdateChatNameRequest) => {\n await this.axios.put(`chat/${encodeURIComponent(request.id)}/name`, request);\n };\n\n public addChatMember = async (request: AddChatMemberRequest) => {\n await this.axios.post(`chat/${encodeURIComponent(request.chatId)}/member`, request);\n };\n\n public sendThreadMessage = async ({ body, threadId }: SendThreadMessageRequest) => {\n const { data: id } = await this.axios.post<string>(`thread/${encodeURIComponent(threadId)}/message`, {\n body,\n });\n return id;\n };\n\n public readThreadMessage = async (id: string) => {\n await this.axios.put(`thread/message/${encodeURIComponent(id)}/read`);\n };\n\n public watchThreads = async () => {\n const { data } = await this.axios.get<ThreadListItem[]>(`thread/watch`);\n return data;\n };\n\n public thread = async (id: string) => {\n const { data } = await this.axios.get<Thread>(`thread/${encodeURIComponent(id)}`);\n return data;\n };\n\n public threadMessages = async ({\n threadId,\n skip,\n take,\n }: {\n threadId: string;\n skip: number;\n take: number;\n }) => {\n const searchParams = new URLSearchParams();\n searchParams.append('skip', skip.toString());\n searchParams.append('take', take.toString());\n const { data } = await this.axios.get<ThreadMessage[]>(\n `thread/${encodeURIComponent(threadId)}/message?${searchParams.toString()}`,\n );\n return data;\n };\n\n public watchThread = async (id: string, watch: boolean) => {\n await this.axios.put(`thread/${encodeURIComponent(id)}/watch`, { watch });\n };\n\n public connectToThread = async (id: string) => {\n const connectionCount = this._threadConnectionByThreadId.get(id) ?? 0;\n this._threadConnectionByThreadId.set(id, connectionCount + 1);\n\n if (connectionCount === 0) {\n this.connect().then(() => this._connection.invoke('ConnectToThread', id));\n }\n };\n\n public disconnectFromThread = async (id: string) => {\n const connectionCount = this._threadConnectionByThreadId.get(id) ?? 0;\n this._threadConnectionByThreadId.set(id, Math.max(0, connectionCount - 1));\n\n if (connectionCount === 1) {\n this.connect().then(() => this._connection.invoke('DisconnectFromThread', id));\n }\n };\n}\n\nexport function unsubscribe(...subscribers: Array<() => void>) {\n const result = () => subscribers.forEach((x) => x());\n result.when = (promise: Promise<any>) => promise.then(result);\n return result;\n}\n","import { ChatifyApiSettings, DEFAULT_MESSAGE_LIST_TAKE, __baseApi, __settings } from './baseApi';\nimport { useSelector } from 'react-redux';\nimport {\n Account,\n AddChatMemberRequest,\n Chat,\n ChatListItem,\n ChatMessage,\n RemoveChatMemberRequest,\n SendChatMessageRequest,\n SendThreadMessageRequest,\n Thread,\n ThreadMessage,\n ThreadWatchListItem,\n UpdateAccountRequest,\n calcThreadListUnreadCount,\n chatId,\n parseThreadMessageId,\n} from '../types';\nimport { unsubscribe } from '../client';\nimport { Debounce, DebounceValue } from '../debounce';\nimport { useMemo } from 'react';\n\nexport interface ChatMessageListResult {\n messages: ChatMessage[];\n hasMore: boolean;\n}\n\nexport interface ThreadMessageList {\n messages: ThreadMessage[];\n hasMore: boolean;\n}\n\nconst THREAD_MESSAGE_READ_QUEUE = new Debounce<string>({\n callback: (id) => __settings.client.readThreadMessage(id),\n compare: (a, b) => -a.localeCompare(b),\n groupBy: (id) => parseThreadMessageId(id)[0],\n timeout: 500,\n});\n\nconst CHAT_MESSAGE_READ_QUEUE = new Debounce<string>({\n callback: (id) => __settings.client.readChatMessage({ id }),\n compare: (a, b) => -a.localeCompare(b),\n groupBy: (id) => chatId(id),\n timeout: 500,\n});\n\nconst __chatifyApi = __baseApi.injectEndpoints({\n endpoints: (builder) => ({\n // ====================================================\n // ============== ACCOUNT ======================\n // ====================================================\n\n getAccountList: builder.query<Account[], { ids?: string[] }>({\n queryFn: async (args) => ({ data: await __settings.client.accounts(args) }),\n providesTags: ['account'],\n }),\n\n geCurrentUserAccount: builder.query<Account | null, void>({\n queryFn: async () => ({ data: await __settings.client.currentUserAccount() }),\n providesTags: ['account'],\n }),\n\n updateAccount: builder.mutation<void, UpdateAccountRequest>({\n queryFn: async (request) => {\n await __settings.client.updateAccount(request);\n return { data: null! };\n },\n invalidatesTags: ['account'],\n }),\n\n // ====================================================\n // ================ CHAT =======================\n // ====================================================\n\n getChat: builder.query<Chat, { id: string }>({\n queryFn: async ({ id }) => ({ data: await __settings.client.chat(id) }),\n providesTags: ['chat', 'account'],\n onCacheEntryAdded: async ({ id }, { cacheEntryRemoved, cacheDataLoaded, updateCachedData }) => {\n await cacheDataLoaded;\n\n unsubscribe(\n __settings.client.subscribe(\n 'chatify://chat-member-added',\n ([chatId, _, account, message, , read]) =>\n chatId === id &&\n updateCachedData((chat) => {\n chat.members.push(account);\n chat.lastReadMessageId = read ? message.id : chat.lastReadMessageId;\n }),\n ),\n __settings.client.subscribe(\n 'chatify://chat-member-removed',\n ([chatId, accountId, , message, read]) =>\n id === chatId &&\n updateCachedData((chat) => {\n chat.members = chat.members.filter((x) => x.id !== accountId);\n chat.lastReadMessageId = read ? message.id : chat.lastReadMessageId;\n }),\n ),\n __settings.client.subscribe(\n 'chatify://chat-name-changed',\n ([chatId, newName, message, read]) =>\n id === chatId &&\n updateCachedData((chat) => {\n chat.name = newName;\n chat.lastReadMessageId = read ? message.id : chat.lastReadMessageId;\n }),\n ),\n __settings.client.subscribe(\n 'chatify://chat-new-message',\n ([message]) =>\n id === message.chatId &&\n updateCachedData((chat) => {\n chat.lastReadMessageId =\n message.sentBy.id === __settings.me() ? message.id : chat.lastReadMessageId;\n }),\n ),\n __settings.client.subscribe(\n 'chatify://chat-message-read',\n ([events]) =>\n events.find((x) => x.chatId === id) &&\n updateCachedData((chat) => {\n const event = events.find((x) => x.chatId === id)!;\n chat.lastReadMessageId = event.newLastReadMessageId;\n }),\n ),\n ).when(cacheEntryRemoved);\n },\n }),\n\n addChat: builder.mutation<string, { name: string; members: string[] }>({\n queryFn: async ({ name, members }) => {\n const chatId = await __settings.client.addChat({\n name,\n members,\n });\n return { data: chatId };\n },\n }),\n\n updateChatName: builder.mutation<void, { id: string; name: string }>({\n queryFn: async ({ id, name }) => {\n await __settings.client.updateChatName({ id, name });\n return { data: null! };\n },\n }),\n\n // ====================================================\n // ============= CHAT LIST =====================\n // ====================================================\n\n getChatList: builder.query<ChatListItem[], void>({\n queryFn: async () => ({ data: await __settings.client.chats() }),\n providesTags: ['chat', 'account'],\n onCacheEntryAdded: async (_, { cacheEntryRemoved, cacheDataLoaded, updateCachedData }) => {\n await cacheDataLoaded;\n\n unsubscribe(\n __settings.client.subscribe('chatify://chat-created', ([chat]) =>\n updateCachedData((chatList) => {\n chatList.push(chat);\n }),\n ),\n\n __settings.client.subscribe('chatify://chat-new-message', ([message]) =>\n updateCachedData((chatList) => {\n const chat = chatList.find((x) => x.id === message.chatId);\n\n if (!chat) {\n return;\n }\n\n chat.message = message;\n\n if (message.sentBy.id === __settings.me()) {\n chat.lastReadMessageId = message.id;\n chat.totalUnreadCount = 0;\n }\n\n if (message.sentBy.id !== __settings.me()) {\n chat.totalUnreadCount++;\n }\n }),\n ),\n __settings.client.subscribe('chatify://chat-message-read', ([events]) =>\n updateCachedData((chatList) => {\n for (const event of events) {\n const chat = chatList.find((x) => x.id === event.chatId);\n\n if (!chat) {\n return;\n }\n\n chat.lastReadMessageId = event.newLastReadMessageId;\n chat.totalUnreadCount = chat.totalUnreadCount - event.readCount;\n }\n }),\n ),\n __settings.client.subscribe(\n 'chatify://chat-member-added',\n ([chatId, chatName, account, message, , read]) =>\n updateCachedData((chatList) => {\n const chat = chatList.find((x) => x.id === chatId);\n\n if (account.id === __settings.me() && !chat) {\n chatList.push({\n id: chatId,\n name: chatName,\n message,\n totalUnreadCount: read ? 0 : 1,\n active: true,\n lastReadMessageId: read ? message.id : null,\n });\n }\n\n if (!chat) {\n return;\n }\n\n chat.message = message;\n chat.active = true;\n\n if (read) {\n chat.totalUnreadCount = 0;\n chat.lastReadMessageId = message.id;\n } else {\n chat.totalUnreadCount++;\n }\n }),\n ),\n __settings.client.subscribe(\n 'chatify://chat-member-removed',\n ([chatId, accountId, deleteHistory, message, read]) =>\n updateCachedData((chatList) => {\n if (accountId === __settings.me() && deleteHistory) {\n return chatList.filter((x) => x.id !== chatId);\n }\n\n const chat = chatList.find((x) => x.id === chatId);\n\n if (!chat) {\n return;\n }\n\n chat.message = message;\n\n if (accountId === __settings.me()) {\n chat.active = false;\n }\n\n if (!read) {\n chat.totalUnreadCount++;\n } else {\n chat.totalUnreadCount = 0;\n chat.lastReadMessageId = message.id;\n }\n }),\n ),\n __settings.client.subscribe('chatify://chat-name-changed', ([chatId, newName, message, read]) =>\n updateCachedData((chatList) => {\n const chat = chatList.find((x) => x.id === chatId);\n if (!chat) return;\n\n chat.name = newName;\n chat.message = message;\n\n if (!read) {\n chat.totalUnreadCount++;\n } else {\n chat.totalUnreadCount = 0;\n chat.lastReadMessageId = message.id;\n }\n }),\n ),\n ).when(cacheEntryRemoved);\n },\n }),\n\n // ====================================================\n // ============ CHAT MEMBER ====================\n // ====================================================\n\n removeChatMember: builder.mutation<void, RemoveChatMemberRequest>({\n queryFn: async (args) => {\n await __settings.client.removeChatMember(args);\n return { data: null! };\n },\n }),\n\n addChatMember: builder.mutation<void, AddChatMemberRequest>({\n queryFn: async (args) => {\n await __settings.client.addChatMember(args);\n return { data: null! };\n },\n }),\n\n // ====================================================\n // ============ CHAT MESSAGE ===================\n // ====================================================\n\n getChatMessageList: builder.query<ChatMessageListResult, { chatId: string }>({\n queryFn: async ({ chatId }) => {\n const messages = await __settings.client.chatMessages({\n chatId,\n skip: 0,\n take: DEFAULT_MESSAGE_LIST_TAKE + 1,\n });\n return {\n data: {\n messages: messages.slice(0, DEFAULT_MESSAGE_LIST_TAKE),\n hasMore: messages.length === DEFAULT_MESSAGE_LIST_TAKE + 1,\n },\n };\n },\n providesTags: ['message', 'chat', 'account'],\n onCacheEntryAdded: async ({ chatId }, { dispatch, cacheEntryRemoved, cacheDataLoaded }) => {\n await cacheDataLoaded;\n\n unsubscribe(\n __settings.client.subscribe('chatify://chat-new-message', ([message]) => {\n message.chatId === chatId &&\n dispatch(\n chatifyApi.util.updateQueryData('getChatMessageList', { chatId }, (draft) => {\n draft.messages.unshift(message);\n }),\n );\n }),\n\n __settings.client.subscribe('chatify://chat-member-added', ([eventChatId, , , message]) => {\n eventChatId === chatId &&\n dispatch(\n chatifyApi.util.updateQueryData('getChatMessageList', { chatId }, (draft) => {\n draft.messages.unshift(message);\n }),\n );\n }),\n\n __settings.client.subscribe('chatify://chat-member-removed', ([eventChatId, , , message]) => {\n eventChatId === chatId &&\n dispatch(\n chatifyApi.util.updateQueryData('getChatMessageList', { chatId }, (draft) => {\n draft.messages.unshift(message);\n }),\n );\n }),\n\n __settings.client.subscribe('chatify://chat-name-changed', ([eventChatId, , message]) => {\n eventChatId === chatId &&\n dispatch(\n chatifyApi.util.updateQueryData('getChatMessageList', { chatId }, (draft) => {\n draft.messages.unshift(message);\n }),\n );\n }),\n ).when(cacheEntryRemoved);\n },\n }),\n\n fetchNextChatMessageList: builder.mutation<void, { chatId: string }>({\n queryFn: async ({ chatId }, { getState }) => {\n const current = chatifyApi.endpoints.getChatMessageList.select({ chatId })(getState() as any);\n const messages = await __settings.client.chatMessages({\n chatId,\n skip: current.data!.messages.length,\n take: DEFAULT_MESSAGE_LIST_TAKE + 1,\n });\n return {\n data: null!,\n meta: {\n messages: messages.slice(0, DEFAULT_MESSAGE_LIST_TAKE),\n hasMore: messages.length === DEFAULT_MESSAGE_LIST_TAKE + 1,\n },\n };\n },\n onQueryStarted: async ({ chatId }, { dispatch, queryFulfilled }) => {\n const result = await queryFulfilled;\n const meta: ChatMessageListResult = result.meta! as any;\n\n dispatch(\n chatifyApi.util.updateQueryData('getChatMessageList', { chatId }, (draft) => {\n draft.hasMore = meta.hasMore;\n draft.messages.push(...meta!.messages);\n }),\n );\n },\n }),\n\n sendChatMessage: builder.mutation<void, SendChatMessageRequest>({\n queryFn: async ({ chatId, text, files }) => {\n await __settings.client.sendChatMessage({\n chatId,\n text,\n files,\n });\n\n return { data: null! };\n },\n }),\n\n readChatMessage: builder.mutation<void, { id: string }>({\n queryFn: async () => {\n return { data: null! };\n },\n onQueryStarted: async ({ id }, { dispatch }) => {\n CHAT_MESSAGE_READ_QUEUE.push(id);\n dispatch(chatifyApi.endpoints.getChatMessageReadQueue.initiate(undefined, { forceRefetch: true }));\n },\n }),\n\n getChatMessageReadQueue: builder.query<DebounceValue<string>[], void>({\n queryFn: async () => ({ data: CHAT_MESSAGE_READ_QUEUE.units }),\n onCacheEntryAdded: async (_, { dispatch, cacheEntryRemoved }) => {\n unsubscribe(\n CHAT_MESSAGE_READ_QUEUE.subscribe((value) => {\n dispatch(\n chatifyApi.util.updateQueryData('getChatMessageReadQueue', undefined, () => value.units),\n );\n }),\n ).when(cacheEntryRemoved);\n },\n }),\n\n // ====================================================\n // =============== THREAD ======================s\n // ====================================================\n getWatchThreadList: builder.query<ThreadWatchListItem[], void>({\n queryFn: async () => {\n const threads = await __settings.client.watchThreads();\n return { data: threads };\n },\n providesTags: ['account', 'thread'],\n onCacheEntryAdded: async (_, { cacheEntryRemoved, cacheDataLoaded, updateCachedData }) => {\n await cacheDataLoaded;\n\n unsubscribe(\n __settings.client.subscribe(\n 'chatify://thread-created',\n ([thread, watch]) =>\n watch &&\n updateCachedData((threads) => {\n threads.push(thread);\n }),\n ),\n __settings.client.subscribe('chatify://thread-message-new', ([threadId, message, readForId]) =>\n updateCachedData((threads) => {\n const thread = threads.find((x) => x.id === threadId);\n if (!thread) return;\n\n thread.lastMessage = message;\n\n if (readForId === __settings.me()) {\n thread.lastReadMessageId = message.id;\n }\n }),\n ),\n __settings.client.subscribe('chatify://thread-message-read', ([threadId, messageId]) =>\n updateCachedData((threads) => {\n const thread = threads.find((x) => x.id === threadId);\n if (!thread) return;\n\n thread.lastReadMessageId = messageId;\n }),\n ),\n __settings.client.subscribe('chatify://thread-watch-added', ([thread]) =>\n updateCachedData((threads) => {\n threads.push(thread);\n }),\n ),\n __settings.client.subscribe('chatify://thread-watch-removed', ([id]) =>\n updateCachedData((threads) => {\n const index = threads.findIndex((x) => x.id === id);\n if (index !== -1) threads.splice(index, 1);\n }),\n ),\n __settings.client.subscribe('chatify://thread-updated', ([threadId, threadName]) =>\n updateCachedData((threads) => {\n const thread = threads.find((x) => x.id === threadId);\n if (!thread) return;\n\n thread.name = threadName;\n }),\n ),\n ).when(cacheEntryRemoved);\n },\n }),\n\n getThread: builder.query<Thread, { id: string }>({\n queryFn: async ({ id }) => {\n const threads = await __settings.client.thread(id);\n return { data: threads };\n },\n providesTags: ['account', 'thread'],\n onCacheEntryAdded: async ({ id }, { cacheEntryRemoved, cacheDataLoaded, updateCachedData }) => {\n await cacheDataLoaded;\n\n unsubscribe(\n __settings.client.subscribe(\n 'chatify://thread-message-read',\n ([threadId, messageId]) =>\n id === threadId &&\n updateCachedData((t) => {\n t.lastReadMessageId = messageId;\n }),\n ),\n __settings.client.subscribe(\n 'chatify://thread-message-new',\n ([threadId, message, readForId]) =>\n id === threadId &&\n updateCachedData((thread) => {\n thread.lastMessageId = message.id;\n thread.lastReadMessageId =\n readForId === __settings.me() ? message.id : thread.lastReadMessageId;\n }),\n ),\n __settings.client.subscribe(\n 'chatify://thread-watch-added',\n ([threadListItem]) =>\n id === threadListItem.id &&\n updateCachedData((thread) => {\n thread.watch = true;\n thread.lastMessageId = threadListItem.lastMessage?.id ?? null;\n thread.lastReadMessageId = threadListItem.lastReadMessageId ?? null;\n }),\n ),\n __settings.client.subscribe(\n 'chatify://thread-watch-removed',\n ([threadId]) =>\n id === threadId &&\n updateCachedData((thread) => {\n thread.watch = false;\n }),\n ),\n __settings.client.subscribe(\n 'chatify://thread-updated',\n ([threadId, threadName]) =>\n id === threadId &&\n updateCachedData((thread) => {\n thread.name = threadName;\n }),\n ),\n ).when(cacheEntryRemoved);\n },\n }),\n\n watchThread: builder.mutation<void, { id: string; watch: boolean }>({\n queryFn: async ({ id, watch }) => {\n await __settings.client.watchThread(id, watch);\n return { data: null! };\n },\n }),\n\n // ====================================================\n // ============ THREAD MESSAGE =================\n // ====================================================\n\n getThreadMessageList: builder.query<ThreadMessageList, { threadId: string }>({\n queryFn: async (args) => {\n const requestArgs = {\n skip: 0,\n take: DEFAULT_MESSAGE_LIST_TAKE + 1,\n ...args,\n };\n const messages = await __settings.client.threadMessages(requestArgs);\n return {\n data: {\n messages: messages.slice(0, DEFAULT_MESSAGE_LIST_TAKE),\n hasMore: messages.length === DEFAULT_MESSAGE_LIST_TAKE + 1,\n },\n };\n },\n providesTags: ['account', 'thread', 'thread-message'],\n onCacheEntryAdded: async ({ threadId }, { cacheEntryRemoved, cacheDataLoaded, updateCachedData }) => {\n await cacheDataLoaded;\n\n unsubscribe(\n __settings.client.subscribe('chatify://thread-message-new', ([_threadId, message]) => {\n threadId === _threadId &&\n updateCachedData((messageList) => {\n !messageList.messages.some((x) => x.id === message.id) &&\n messageList.messages.unshift(message);\n });\n }),\n ).when(cacheEntryRemoved);\n },\n }),\n\n fetchNextThreadMessageList: builder.mutation<void, { threadId: string }>({\n queryFn: async ({ threadId }, { getState }) => {\n const current = chatifyApi.endpoints.getThreadMessageList.select({ threadId })(getState() as any);\n const messages = await __settings.client.threadMessages({\n threadId,\n skip: current.data!.messages.length,\n take: DEFAULT_MESSAGE_LIST_TAKE + 1,\n });\n return {\n data: null!,\n meta: {\n messages: messages.slice(0, DEFAULT_MESSAGE_LIST_TAKE),\n hasMore: messages.length === DEFAULT_MESSAGE_LIST_TAKE + 1,\n },\n };\n },\n onQueryStarted: async ({ threadId }, { dispatch, queryFulfilled }) => {\n const result = await queryFulfilled;\n const meta: ThreadMessageList = result.meta! as any;\n\n dispatch(\n chatifyApi.util.updateQueryData('getThreadMessageList', { threadId }, (draft) => {\n draft.hasMore = meta.hasMore;\n draft.messages.push(...meta!.messages);\n }),\n );\n },\n }),\n\n sendThreadMessage: builder.mutation<string, SendThreadMessageRequest>({\n queryFn: async (args) => {\n const id = await __settings.client.sendThreadMessage(args);\n return { data: id };\n },\n }),\n\n readThreadMessage: builder.mutation<void, { id: string }>({\n queryFn: async () => {\n return { data: null! };\n },\n onQueryStarted: async ({ id }, { dispatch }) => {\n THREAD_MESSAGE_READ_QUEUE.push(id);\n dispatch(chatifyApi.endpoints.getThreadMessageReadQueue.initiate(undefined, { forceRefetch: true }));\n },\n }),\n\n getThreadMessageReadQueue: builder.query<DebounceValue<string>[], void>({\n queryFn: async () => ({ data: THREAD_MESSAGE_READ_QUEUE.units }),\n onCacheEntryAdded: async (_, { dispatch, cacheEntryRemoved }) => {\n unsubscribe(\n THREAD_MESSAGE_READ_QUEUE.subscribe((value) => {\n dispatch(\n chatifyApi.util.updateQueryData('getThreadMessageReadQueue', undefined, () => value.units),\n );\n }),\n ).when(cacheEntryRemoved);\n },\n }),\n }),\n});\n\nexport function useChatListItem(id: string | null) {\n return useSelector((state: any) =>\n id != null\n ? __chatifyApi.endpoints.getChatList\n .select()(state)\n .data?.find((x) => x.id === id)\n : null,\n );\n}\n\nexport function useUnreadThreadMessageCount() {\n const { data: threads, ...state } = chatifyApi.useGetWatchThreadListQuery();\n const count = useMemo(() => (threads != null ? calcThreadListUnreadCount(threads) : null), [threads]);\n return [count, state] as const;\n}\n\ntype ChatifyApi = typeof __chatifyApi & {\n settings: ChatifyApiSettings;\n useChatListItem: typeof useChatListItem;\n useUnreadThreadMessageCount: typeof useUnreadThreadMessageCount;\n};\n\nexport const chatifyApi: ChatifyApi = Object.assign(__chatifyApi, {\n settings: __settings,\n useChatListItem,\n useUnreadThreadMessageCount,\n});\n","import { FC, ForwardedRef, forwardRef } from 'react';\nimport { Account } from '../../core';\nimport { Avatar as AntdAvatar } from 'antd';\nimport { customize } from '../customize';\n\nexport interface AvatarProps {\n account: Account;\n}\n\nconst _Avatar: FC<AvatarProps> = forwardRef(\n (props: AvatarProps, forwardRef: ForwardedRef<HTMLSpanElement>) => {\n const { account } = props;\n\n return <AntdAvatar ref={forwardRef} src={account.avatar} />;\n },\n);\n\n_Avatar.displayName = 'Avatar';\n\nexport const Avatar = customize('Avatar', _Avatar);\n","import { Button, List, Space, Tooltip } from 'antd';\nimport { chatifyApi } from '../../../core';\nimport { customize } from '../../customize';\nimport { useCallback, useMemo } from 'react';\nimport { Icon } from '../../common/Icon';\nimport { Avatar } from '../../common/Avatar';\nimport { useChatContext } from '../ChatContext';\n\ninterface ChatMemberListItemProps {\n id: string;\n chatId: string;\n}\n\nfunction useAdd(chatId: string, accountId: string, withHistory: boolean) {\n const [add, state] = chatifyApi.useAddChatMemberMutation();\n const onAdd = useCallback(\n () => add({ chatId, accountId, withHistory }),\n [add, chatId, accountId, withHistory],\n );\n return [onAdd, state] as const;\n}\n\nfunction useRemove(chatId: string, accountId: string, deleteHistory: boolean) {\n const [remove, state] = chatifyApi.useRemoveChatMemberMutation();\n const onRemove = useCallback(\n () => remove({ chatId, accountId, deleteHistory }),\n [remove, chatId, accountId, deleteHistory],\n );\n return [onRemove, state] as const;\n}\n\nconst ChatMemberListItem = customize('ChatMemberListItem', (props: ChatMemberListItemProps) => {\n const { chatId } = props;\n const { data: chat } = chatifyApi.useGetChatQuery({ id: chatId });\n const { data: accounts } = chatifyApi.useGetAccountListQuery({});\n const account = accounts!.find((x) => x.id === props.id)!;\n const isMember = chat!.members.some((x) => x.id === account.id);\n const [onAddWithoutHistory] = useAdd(chatId, account.id, false);\n const [onAddWithHistory] = useAdd(chatId, account.id, true);\n const [onRemoveKeepHistory] = useRemove(chatId, account.id, false);\n const [onRemoveDeleteHistory] = useRemove(chatId, account.id, true);\n\n return (\n <List.Item\n className=\"wxchtf-chat-members-list-item\"\n actions={\n isMember\n ? [\n <Tooltip key=\"remove\" title=\"Remove (keep history)\">\n <Button onClick={onRemoveKeepHistory} type=\"link\" icon={<Icon type=\"remove-member\" />} />\n </Tooltip>,\n <Tooltip key=\"remove_delete_history\" title=\"Remove (delete history)\">\n <Button\n onClick={onRemoveDeleteHistory}\n type=\"link\"\n icon={<Icon type=\"remove-member-delete-history\" />}\n />\n </Tooltip>,\n ]\n : [\n <Tooltip key=\"add_no_history\" title=\"Add (no history)\">\n <Button onClick={onAddWithoutHistory} type=\"link\" icon={<Icon type=\"add-member\" />} />\n </Tooltip>,\n <Tooltip key=\"add\" title=\"Add (share history)\">\n <Button\n onClick={onAddWithHistory}\n type=\"link\"\n icon={<Icon type=\"add-member-with-history\" />}\n />\n </Tooltip>,\n ]\n }\n >\n <Space>\n <Avatar account={account} />\n <span>{account.name}</span>\n </Space>\n </List.Item>\n );\n});\n\nexport const ChatMembersPanel = customize('ChatMembersPanel', () => {\n const { id } = useChatContext();\n const { data: chat } = chatifyApi.useGetChatQuery({ id });\n const { data: accounts } = chatifyApi.useGetAccountListQuery({});\n const ordered = useMemo(\n () =>\n accounts\n ?.slice()\n .sort(\n (a, b) =>\n (chat?.members.some((m) => m.id === a.id) ? -100 : 0) -\n (chat?.members.some((m) => m.id === b.id) ? -100 : 0) +\n a.name.localeCompare(b.name),\n ),\n [accounts, chat],\n );\n\n if (!chat?.members || !accounts) {\n return null;\n }\n\n return (\n <div className=\"wxchtf-chat-members-panel\">\n <List\n className=\"wxchtf-chat-members-list\"\n dataSource={ordered}\n renderItem={(item) => <ChatMemberListItem id={item.id} chatId={id} />}\n />\n </div>\n );\n});\n","import { chatifyApi } from '../../../core';\nimport { Tooltip } from 'antd';\nimport { customize } from '../../customize';\nimport { Avatar as AntdAvatar } from 'antd';\nimport { Avatar } from '../../common/Avatar';\nimport { useChatContext } from '../ChatContext';\n\nexport const ChatMembersPreview = customize('ChatMembersPreview', () => {\n const { id } = useChatContext();\n const { data: chat } = chatifyApi.useGetChatQuery({ id });\n\n if (!chat?.members) {\n return null;\n }\n\n return (\n <AntdAvatar.Group max={{ count: 5 }}>\n {chat.members.map((x) => (\n <Tooltip key={x.id} title={x.name}>\n <Avatar account={x} />\n </Tooltip>\n ))}\n </AntdAvatar.Group>\n );\n});\n","import { Button } from 'antd';\nimport { customize } from '../../customize';\nimport { Icon } from '../../common/Icon';\nimport { File } from '../../../core';\nimport { useCallback, useEffect, useRef } from 'react';\n\nexport interface InputFilesBoxProps {\n value: File[];\n accept?: string;\n loading?: boolean;\n disabled?: boolean;\n onAddedClick?: () => void;\n onUpload: (value: globalThis.File[]) => void;\n}\n\nexport const InputFileButton = customize('InputFileButton', (props: InputFilesBoxProps) => {\n const { onUpload, onAddedClick, accept, loading, value, disabled } = props;\n const inputRef = useRef<HTMLInputElement | null>(null);\n const onClick = useCallback(() => inputRef.current?.click(), []);\n const countButtonRef = useRef<HTMLButtonElement | null>(null);\n\n useEffect(() => {\n countButtonRef.current?.classList.add('active');\n }, [value]);\n\n const onCountButtonAnimationEnd = useCallback(() => {\n countButtonRef.current?.classList.remove('active');\n }, []);\n\n const onInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n files && files.length > 0 && onUpload(Array.from(files));\n },\n [onUpload],\n );\n\n return (\n <>\n <Button\n loading={loading}\n onClick={onClick}\n type=\"link\"\n disabled={disabled}\n icon={<Icon type=\"attach\" />}\n className=\"wxchtf-add-files-btn\"\n />\n {value.length > 0 && (\n <Button\n ref={countButtonRef}\n className=\"wxchtf-add-files-added-btn\"\n onAnimationIteration={onCountButtonAnimationEnd}\n onClick={onAddedClick}\n type=\"link\"\n disabled={disabled}\n icon={<>+{value.length}</>}\n />\n )}\n <input\n value=\"\"\n accept={accept}\n onChange={onInputChange}\n ref={inputRef}\n type=\"file\"\n multiple\n style={{ display: 'none' }}\n />\n </>\n );\n});\n\nexport const InputFilesBox = customize('InputFilesBox', (props: InputFilesBoxProps) => {\n return (\n <div className=\"wxchtf-add-files-box\">\n <InputFileButton {...props} />\n </div>\n );\n});\n","import dayjs from 'dayjs';\nimport React, { useContext } from 'react';\nimport { SystemMessageText } from '../core';\n\nexport interface LocalizerBase {\n isToday: (value: string) => boolean;\n timestamp: (value: string) => string;\n dateTime: (value: string) => string;\n system: Record<SystemMessageText, (key: SystemMessageText, payload: any | null) => string>;\n message: {\n read: () => React.ReactNode;\n reading: () => React.ReactNode;\n sending: () => React.ReactNode;\n };\n addChat: {\n title: () => React.ReactNode;\n name: {\n label: () => React.ReactNode;\n required: () => string;\n max250: () => string;\n };\n members: {\n label: () => React.ReactNode;\n required: () => string;\n };\n submitBtn: () => React.ReactNode;\n };\n\n input: {\n placeholder: () => string;\n };\n\n settings: {\n members: () => string;\n };\n\n size: {\n bytes: (value: number) => string;\n kb: (value: number) => string;\n mb: (value: number) => string;\n };\n\n chatList: {\n topShown: (count: number) => string;\n };\n\n autoReply: {\n buttonTitle: () => string;\n title: () => React.ReactNode;\n period: {\n label: () => React.ReactNode;\n required: () => string;\n format: () => string;\n };\n text: {\n label: () => React.ReactNode;\n required: () => string;\n };\n submitBtn: () => React.ReactNode;\n clearBtn: () => React.ReactNode;\n };\n}\n\nexport interface Localizer extends LocalizerBase {}\n\nexport const LocalizerContext = React.createContext<Localizer>(null!);\n\nexport function useLocalizer() {\n return useContext(LocalizerContext);\n}\n\nconst base: LocalizerBase = {\n isToday: (value: string) => dayjs(value).isSame(dayjs(), 'day'),\n timestamp: (value: string) => dayjs(value).format('HH:mm'),\n dateTime: (value: string) => dayjs(value).format('DD/MM/YYYY HH:mm'),\n message: {\n read: () => 'Read',\n reading: () => 'Reading...',\n sending: () => 'Sending...',\n },\n addChat: {\n title: () => 'Add chat',\n name: {\n label: () => 'Name',\n required: () => `Name is required`,\n max250: () => 'Max 250 characters allowed',\n },\n members: {\n label: () => 'Members',\n required: () => 'Members is required',\n },\n submitBtn: () => 'Submit',\n },\n system: {\n 'chatify://chat-created': () => 'Chat created',\n 'chatify://member-added': () => 'New member added',\n 'chatify://member-removed': () => 'Member removed',\n 'chatify://chat-name-changed': (_, { newName }: { newName: string }) =>\n `Chat name changed to '${newName}'`,\n },\n\n input: {\n placeholder: () => 'Start typing... (Press Enter to send, and Shift+Enter to start a new line)',\n },\n\n settings: {\n members: () => 'Members',\n },\n\n size: {\n bytes: (value: number) =>\n `${value.toLocaleString(undefined, { minimumFractionDigits: 0, maximumFractionDigits: 2 })} bytes`,\n kb: (value: number) =>\n `${value.toLocaleString(undefined, { minimumFractionDigits: 0, maximumFractionDigits: 2 })} KB`,\n mb: (value: number) =>\n `${value.toLocaleString(undefined, { minimumFractionDigits: 0, maximumFractionDigits: 2 })} MB`,\n },\n\n chatList: {\n topShown: (count: number) => `Latest active ${count} chat${count !== 1 ? 's' : ''} shown`,\n },\n\n autoReply: {\n buttonTitle: () => 'Auto-reply',\n title: () => 'Auto-reply',\n period: {\n label: () => 'Period',\n required: () => 'Please select start and end date',\n format: () => 'DD/MM/YYYY',\n },\n text: { label: () => 'Message', required: () => 'Please enter message' },\n submitBtn: () => 'Submit',\n clearBtn: () => 'Clear',\n },\n};\n\nexport const defaultLocalizer: Localizer = base as unknown as Localizer;\n","import { Input } from 'antd';\nimport { customize } from '../../customize';\nimport { isHotkey } from 'is-hotkey';\nimport { RefObject, memo, useCallback } from 'react';\nimport { useLocalizer } from '../../localizer';\nimport { TextAreaProps } from 'antd/es/input';\n\nexport interface TextInputBoxProps {\n value: string;\n onChange: (value: string) => void;\n onSend: (value: string) => void;\n disabled?: boolean;\n inputRef?: RefObject<HTMLTextAreaElement>;\n}\n\nconst isEnter = isHotkey('enter');\nconst isCtrlEnter = isHotkey('ctrl+enter');\n\nconst AUTO_SIZE: TextAreaProps['autoSize'] = { maxRows: 5, minRows: 1 };\n\nexport const InputTextBox = customize(\n 'InputTextBox',\n memo((props: TextInputBoxProps) => {\n const { value, onChange, onSend, disabled, inputRef } = props;\n const localizer = useLocalizer();\n\n const onInputChange = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => onChange(e.target.value),\n [onChange],\n );\n\n const onKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (disabled) {\n e.preventDefault();\n return;\n }\n\n if (isEnter(e) || isCtrlEnter(e)) {\n e.preventDefault();\n onSend(value);\n }\n },\n [onSend, value, disabled],\n );\n\n return (\n <div className=\"wxchtf-text-input-box\">\n <Input.TextArea\n ref={inputRef}\n value={value}\n onChange={onInputChange}\n autoSize={AUTO_SIZE}\n className=\"wxchtf-text-input-textarea\"\n placeholder={localizer.input.placeholder()}\n onKeyDown={onKeyDown}\n />\n </div>\n );\n }),\n);\n","import { Button } from 'antd';\nimport { customize } from '../../customize';\nimport { Icon } from '../../common/Icon';\n\nexport interface InputSubmitButtonBoxProps {\n onSubmit: () => void;\n disabled?: boolean;\n loading?: boolean;\n}\n\nexport const InputSubmitButtonBox = customize('InputSubmitButtonBox', (props: InputSubmitButtonBoxProps) => {\n const { onSubmit, disabled, loading } = props;\n\n return (\n <div className=\"wxchtf-submit-btn-box\">\n <Button\n onClick={onSubmit}\n type=\"link\"\n icon={<Icon type=\"send\" />}\n className=\"wxchtf-submit-btn\"\n disabled={disabled}\n loading={loading}\n />\n </div>\n );\n});\n","import React from 'react';\nimport { MessageBase, MessageBody } from '../../core';\nimport type { Flippo } from '@webinex/flippo';\n\nexport interface ConversationValue {\n id: string;\n name: string;\n active: boolean;\n lastReadMessageId: string | null;\n}\n\nexport interface ConversationContextValue extends ConversationValue {\n messages?: MessageBase[];\n hasMore?: boolean;\n nextLoading: boolean;\n noReadTracking?: boolean;\n\n isReading?: (id: string) => boolean;\n onNext: () => void;\n onSend?: (message: MessageBody) => void;\n onRead?: (id: string) => void;\n flippo?: Flippo;\n onClose?: () => void;\n}\n\nexport const ConversationContext = React.createContext<ConversationContextValue>(undefined!);\n\nexport function useConversation() {\n return React.useContext(ConversationContext);\n}\n","import { Skeleton } from 'antd';\nimport { customize } from '../customize';\n\nexport interface MessageSkeletonProps {\n count?: number;\n}\n\nexport const MessageSkeleton = customize('MessageSkeleton', (props: MessageSkeletonProps) => {\n const { count = 1 } = props;\n return (\n <>\n {Array.from(Array(count)).map((_, index) => (\n <div className=\"wxchtf-message-skeleton\" key={index}>\n <Skeleton.Avatar className=\"wxchtf-avatar\" active />\n <Skeleton.Button active className=\"wxchtf-content\" />\n </div>\n ))}\n </>\n );\n});\n","import { customize } from '../../customize';\nimport type { ChatListItemBoxProps } from './ChatListItemBox';\n\nexport const ChatListItemName = customize('ChatListItemName', (props: ChatListItemBoxProps) => {\n const { chat } = props;\n\n return <div className=\"wxchtf-chat-name\">{chat.name}</div>;\n});\n","import { customize } from '../../customize';\nimport { ChatListItemBoxProps } from './ChatListItemBox';\n\nexport const ChatListItemUnreadCount = customize('ChatListItemUnreadCount', (props: ChatListItemBoxProps) => {\n const { totalUnreadCount: unreadCount } = props.chat;\n\n if (unreadCount == null || unreadCount <= 0) {\n return null;\n }\n\n return <div className=\"wxchtf-unread-count\">{unreadCount}</div>;\n});\n","import { Ref } from 'react';\nimport { customize } from '../../customize';\nimport { Localizer, useLocalizer } from '../../localizer';\nimport { MessageBase } from '../../../core';\n\nexport interface SystemMessageRowProps {\n message: MessageBase;\n containerRef?: Ref<HTMLDivElement>;\n}\n\nexport function formatSystemMessage(localizer: Localizer, text: string): React.ReactNode {\n const [key, payload] = text.split('::', 2);\n const data = payload ? JSON.parse(payload) : null;\n return localizer.system[key as keyof Localizer['system']](key as any, data);\n}\n\nexport const SystemMessageRow = customize('SystemMessageRow', (props: SystemMessageRowProps) => {\n const { message, containerRef } = props;\n const { text, sentAt } = message;\n const localizer = useLocalizer();\n\n return (\n <div ref={containerRef} className=\"wxchtf-system-message\">\n <div className=\"wxchtf-text\">{text && formatSystemMessage(localizer, text)}</div>\n <div className=\"wxchtf-timestamp\">{localizer.timestamp(sentAt)}</div>\n </div>\n );\n});\n","import { FC, RefObject, useEffect, useMemo, useRef } from 'react';\nimport { MessageBoxProps } from '../Message';\nimport { useConversation } from '../ConversationContext';\n\nexport interface MessageReadObserverProps extends MessageBoxProps {\n messageRef: RefObject<HTMLDivElement | null>;\n}\nconst Observer: FC<MessageReadObserverProps> = (props) => {\n const { message, messageRef } = props;\n const { onRead, lastReadMessageId } = useConversation();\n const isRead = lastReadMessageId != null && message.id.localeCompare(lastReadMessageId) <= 0;\n const readRef = useRef(isRead);\n\n useEffect(() => {\n readRef.current = readRef.current || isRead;\n }, [isRead]);\n\n const observer = useMemo(\n () =>\n new IntersectionObserver(([entry]) => {\n if (entry.isIntersecting && !readRef.current) {\n readRef.current = true;\n onRead?.(message.id);\n }\n }),\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n\n useEffect(() => {\n observer.observe(messageRef.current!);\n return () => observer.disconnect();\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [observer]);\n\n return <></>;\n};\n\nexport function MessageReadObserver(props: MessageReadObserverProps) {\n const { noReadTracking } = useConversation();\n\n if (noReadTracking === true) {\n return null;\n }\n\n return <Observer {...props} />;\n}\n","import { useRef } from 'react';\nimport { customize } from '../../customize';\nimport { MessageBase } from '../../../core';\nimport { SystemMessageRow } from './SystemMessageRow';\nimport { MessageReadObserver } from '../ReadObserver';\n\nexport interface SystemMessageBoxProps {\n message: MessageBase;\n}\n\nexport const SystemMessageBox = customize('SystemMessageBox', (props: SystemMessageBoxProps) => {\n const ref = useRef<HTMLDivElement | null>(null);\n\n return (\n <>\n <MessageReadObserver messageRef={ref} {...props} />\n <SystemMessageRow containerRef={ref} {...props} />\n </>\n );\n});\n","import { useLocalizer } from '../../localizer';\nimport { formatSystemMessage } from '../../Conversation/SystemMessage';\nimport { FC } from 'react';\nimport { customize } from '../../customize';\nimport type { ChatListItemBoxProps } from './ChatListItemBox';\n\nexport const ChatListItemLastMessageContent = customize<FC<ChatListItemBoxProps>>(\n 'ChatListItemLastMessageContent',\n (props) => {\n const { lastMessage } = props.chat;\n const localizer = useLocalizer();\n\n return (\n <div className=\"wxchtf-chat-last-message\">\n {lastMessage.sentBy.id === 'chatify::system'\n ? lastMessage.text && formatSystemMessage(localizer, lastMessage.text)\n : lastMessage.text}\n </div>\n );\n },\n);\n","import { customize } from '../../customize';\nimport type { ChatListItemBoxProps } from './ChatListItemBox';\n\nexport const ChatListItemLastMessageAuthor = customize(\n 'ChatListItemLastMessageAuthor',\n (props: ChatListItemBoxProps) => {\n const { lastMessage } = props.chat;\n\n if (lastMessage.sentBy.id === 'chatify::system') {\n return null;\n }\n\n return <div className=\"wxchtf-chat-last-author\">{lastMessage.sentBy.name}</div>;\n },\n);\n","import { customize } from '../../customize';\nimport { useLocalizer } from '../../localizer';\nimport { ChatListItemBoxProps } from './ChatListItemBox';\n\nexport const ChatListItemLastMessageSentAt = customize(\n 'ChatListItemLastMessageSentAt',\n (props: ChatListItemBoxProps) => {\n const {\n chat: {\n lastMessage: { sentAt },\n },\n } = props;\n\n const localizer = useLocalizer();\n\n return (\n <div className=\"wxchtf-chat-last-sent-at\">\n {localizer.isToday(sentAt) ? localizer.timestamp(sentAt) : localizer.dateTime(sentAt)}\n </div>\n );\n },\n);\n","import { customize } from '../../customize';\nimport type { ChatListItemBoxProps } from './ChatListItemBox';\nimport { ChatListItemLastMessageContent } from './ChatListItemLastMessageContent';\nimport { ChatListItemLastMessageAuthor } from './ChatListItemLastMessageAuthor';\nimport { ChatListItemLastMessageSentAt } from './ChatListItemLastMessageSentAt';\n\nexport const ChatListItemLastMessage = customize('ChatListItemLastMessage', (props: ChatListItemBoxProps) => {\n return (\n <div className=\"wxchtf-chat-last\">\n <ChatListItemLastMessageAuthor {...props} />\n <ChatListItemLastMessageContent {...props} />\n <ChatListItemLastMessageSentAt {...props} />\n </div>\n );\n});\n","import { color } from '../../color';\nimport { Icon } from '../../common/Icon';\nimport { customize } from '../../customize';\nimport type { ChatListItemBoxProps } from './ChatListItemBox';\n\nexport const ChatListItemAvatar = customize('ChatListItemAvatar', (props: ChatListItemBoxProps) => {\n const { id } = props.chat;\n\n return (\n <div\n className=\"wxchtf-chat-avatar\"\n style={\n {\n '--background-color': color(id, { lightness: 90 }),\n '--color': color(id, { saturation: 60, lightness: 65 }),\n } as any\n }\n >\n <Icon type=\"chat\" />\n </div>\n );\n});\n","import { customize } from '../../customize';\nimport { ChatListItemName } from './ChatListItemName';\nimport { ChatListItemUnreadCount } from './ChatListItemUnreadCount';\nimport { ChatListItemLastMessage } from './ChatListItemLastMessage';\nimport { ChatListItemAvatar } from './ChatListItemAvatar';\nimport { ChatListValue } from './ChatListValue';\n\nexport interface ChatListItemBoxProps {\n chat: ChatListValue;\n\n /**\n * If true, do not show read status.\n */\n noRead?: boolean;\n}\n\nexport const ChatListItemBox = customize('ChatListItemBox', (props: ChatListItemBoxProps) => {\n const { noRead = false } = props;\n const { lastMessage, lastReadMessageId } = props.chat;\n const read = lastReadMessageId != null && lastReadMessageId.localeCompare(lastMessage.id) >= 0;\n\n return (\n <div className={'wxchtf-chat' + (!read && !noRead ? ' --unread' : '')}>\n <ChatListItemAvatar {...props} />\n <span className=\"wxchtf-chat-info\">\n <ChatListItemName {...props} />\n <ChatListItemUnreadCount {...props} />\n <ChatListItemLastMessage {...props} />\n </span>\n </div>\n );\n});\n","import { Menu, MenuProps } from 'antd';\nimport { useMemo } from 'react';\nimport { ChatListItemBox } from './ChatListItemBox';\nimport { customize } from '../../customize';\nimport { ChatListValue } from './ChatListValue';\nimport { useLocalizer } from '../../localizer';\nimport { messageSequencePart } from '../../../core';\n\nexport interface ChatListProps {\n className?: string;\n items: ChatListValue[];\n selected: string | null;\n onSelect?: (id: string) => void;\n\n /**\n * If true, do not show read status.\n */\n noRead?: boolean;\n\n /**\n * If set, shows a message at the bottom indicating that only the top N chats are shown.\n */\n top?: number;\n}\n\nfunction useOnSelect(props: ChatListProps) {\n const { onSelect } = props;\n\n return useMemo(\n () =>\n onSelect\n ? (info: Parameters<NonNullable<MenuProps['onSelect']>>[0]) => onSelect(info.key as string)\n : undefined,\n [onSelect],\n );\n}\n\nfunction useMenuItems(props: ChatListProps) {\n //28b2a1a6-c052-4761-ad2d-95ce36d59f06-000000001\n const { items, noRead, top } = props;\n const localizer = useLocalizer();\n\n return useMemo<MenuProps['items']>(() => {\n const result = items\n ?.slice()\n .sort(\n (a, b) => -messageSequencePart(a.lastMessage.id).localeCompare(messageSequencePart(b.lastMessage.id)),\n )\n .map((x) => ({ key: x.id, label: <ChatListItemBox chat={x} noRead={noRead} /> }));\n\n if (top != null) {\n return [\n ...result,\n {\n type: 'item',\n key: 'top',\n disabled: true,\n label: (\n <div style={{ textAlign: 'center', cursor: 'text', fontStyle: 'italic' }}>\n {localizer.chatList.topShown(top)}\n </div>\n ),\n },\n ];\n }\n\n return result;\n }, [items, noRead, top, localizer]);\n}\n\nexport const ChatList = customize('ChatList', (props: ChatListProps) => {\n const { selected: selectedChatId } = props;\n const selected = useMemo(() => (selectedChatId ? [selectedChatId] : []), [selectedChatId]);\n const onSelect = useOnSelect(props);\n const items = useMenuItems(props);\n\n return (\n <>\n {items && (\n <Menu className=\"wxchtf-chat-list\" selectedKeys={selected} onSelect={onSelect} items={items} />\n )}\n </>\n );\n});\n","import { useLocalizer } from './localizer';\n\nexport function useFormatter() {\n const localizer = useLocalizer();\n\n return {\n size: (value: number) => {\n if (value < 1024) {\n return localizer.size.bytes(value);\n } else if (value < 1024 * 1024) {\n return localizer.size.kb(value / 1024);\n } else {\n return localizer.size.mb(value / 1024 / 1024);\n }\n },\n };\n}\n","import { Button } from 'antd';\nimport { File } from '../../../core';\nimport { Icon } from '../../common';\nimport { useCallback } from 'react';\nimport { useFormatter } from '../../useFormatter';\nimport { customize } from '../../customize';\n\nexport interface InputBoxFileProps {\n file: File;\n disabled?: boolean;\n onDelete: (file: File) => void;\n}\n\nexport const InputBoxFile = customize('InputBoxFile', (props: InputBoxFileProps) => {\n const { file, disabled, onDelete } = props;\n const formatter = useFormatter();\n const onDeleteClick = useCallback(() => onDelete(file), [file, onDelete]);\n\n return (\n <div className=\"wxchtf-file\">\n <div className=\"wxchtf-file-info\">\n <div className=\"wxchtf-file-name\" title={file.name}>\n {file.name}\n </div>\n <div className=\"wxchtf-file-size\">{formatter.size(file.bytes)}</div>\n </div>\n <div className=\"wxchtf-file-actions\">\n <Button\n disabled={disabled}\n className=\"wxchtf-delete\"\n type=\"link\"\n icon={<Icon type=\"delete-file\" />}\n onClick={onDeleteClick}\n />\n </div>\n </div>\n );\n});\n","import { File } from '../../../core';\nimport { customize } from '../../customize';\nimport { InputBoxFile } from './InputBoxFile';\n\nexport interface InputBoxFileListProps {\n files: File[];\n disabled?: boolean;\n onDelete: (file: File) => void;\n}\n\nexport const InputBoxFileList = customize('InputBoxFileList', (props: InputBoxFileListProps) => {\n const { files, onDelete, disabled } = props;\n\n return (\n <div className=\"wxchtf-file-list\">\n {files.map((file) => (\n <InputBoxFile key={file.ref} file={file} onDelete={onDelete} disabled={disabled} />\n ))}\n </div>\n );\n});\n","import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { InputFilesBox } from './InputFilesBox';\nimport { File } from '../../../core';\nimport { InputTextBox } from './InputTextBox';\nimport { customize, useCustomizeContext } from '../../customize';\nimport { InputSubmitButtonBox } from './InputSubmitButtonBox';\nimport { useConversation } from '../ConversationContext';\nimport { ConversationCustomizeValue } from '../Conversation';\nimport { InputBoxFileList } from './InputBoxFileList';\n\nfunction useFormState() {\n const { onSend } = useConversation();\n const [text, setText] = useState('');\n const [sending, setSending] = useState(false);\n const { onUpload, files, loading, setFiles, showFileBox, onDeleteFile } = useFlippoInputFileBox();\n\n const onSubmit = useCallback(() => {\n if (!onSend) {\n return;\n }\n\n const textValue = text.trim().length === 0 ? null : text.trim();\n\n if ((!textValue && files.length === 0) || loading) {\n return;\n }\n\n setSending(true);\n Promise.resolve(onSend({ text: textValue, files }))\n .finally(() => setSending(false))\n .then(() => {\n setFiles([]);\n setText('');\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [text, onSend, files, setFiles, loading]);\n\n return [onSubmit, { text, setText, files, onUpload, loading, showFileBox, onDeleteFile, sending }] as const;\n}\n\nfunction useFlippoInputFileBox() {\n const [loading, setLoading] = useState(false);\n const [files, setFiles] = useState<File[]>([]);\n const { flippo } = useCustomizeContext<ConversationCustomizeValue>();\n\n const onUpload = useCallback(\n (files: globalThis.File[]) => {\n if (!flippo) return;\n\n setLoading(true);\n Promise.all(files.map((file) => flippo.store(file)))\n .then((references) =>\n setFiles((prev) => [\n ...prev,\n ...references.map((reference, index) => ({\n name: files[index].name,\n ref: reference,\n bytes: files[index].size,\n })),\n ]),\n )\n .finally(() => setLoading(false));\n },\n [flippo],\n );\n\n const onDeleteFile = useCallback((file: File) => {\n setFiles((prev) => prev.filter((f) => f !== file));\n }, []);\n\n return { onUpload, files, loading, setFiles, showFileBox: !!flippo, onDeleteFile };\n}\n\nexport const InputBox = customize('InputBox', () => {\n const [onSend, { text, setText, files, loading, onUpload, showFileBox, onDeleteFile, sending }] =\n useFormState();\n const inputRef = useRef<HTMLTextAreaElement>(null);\n const [showFileList, setShowFileList] = useState(false);\n const toggleShowFileList = useCallback(() => setShowFileList((prev) => !prev), []);\n const prevFilesLength = useRef(files.length);\n\n useLayoutEffect(() => inputRef.current?.focus(), []);\n\n useEffect(() => {\n if (prevFilesLength.current === 0 && files.length > 0 && !showFileList) {\n setShowFileList(true);\n }\n\n prevFilesLength.current = files.length;\n\n if (files.length === 0 && showFileList) {\n setShowFileList(false);\n }\n }, [files, showFileList]);\n\n return (\n <div className=\"wxchtf-input-form\">\n <div className=\"wxchtf-input-box\">\n {showFileList && (\n <div className=\"wxchtf-file-list-box\">\n <InputBoxFileList files={files} onDelete={onDeleteFile} disabled={sending} />\n </div>\n )}\n <div className=\"wxchtf-input-box-row\">\n {showFileBox && (\n <InputFilesBox\n onAddedClick={toggleShowFileList}\n onUpload={onUpload}\n value={files}\n loading={loading}\n disabled={sending}\n />\n )}\n <InputTextBox\n value={text}\n onSend={onSend}\n onChange={setText}\n disabled={sending}\n inputRef={inputRef}\n />\n <InputSubmitButtonBox onSubmit={onSend} disabled={loading} loading={sending} />\n </div>\n </div>\n </div>\n );\n});\n","import { customize } from '../../customize';\nimport { Avatar } from '../../common/Avatar';\nimport type { MessageBoxProps } from './MessageBox';\n\nexport const MessageAuthor = customize('MessageAuthor', (props: MessageBoxProps) => {\n const { sentBy } = props.message;\n\n return (\n <div className=\"wxchtf-message-author\">\n <Avatar account={sentBy} />\n </div>\n );\n});\n","import { customize } from '../../customize';\nimport { MessageBoxProps } from './MessageBox';\n\nexport const MessageText = customize('MessageText', (props: MessageBoxProps) => {\n const { text } = props.message;\n return <div className=\"wxchtf-message-text\">{text}</div>;\n});\n","import { Button } from 'antd';\nimport { File } from '../../../core';\nimport { customize, useCustomizeContext } from '../../customize';\nimport { useFormatter } from '../../useFormatter';\nimport { Icon } from '../../common';\nimport { ConversationCustomizeValue } from '../Conversation';\nimport { useCallback, useState } from 'react';\n\nfunction open(url: string) {\n const w = window.open(url, '_blank');\n w?.focus();\n}\n\nexport interface MessageFileProps {\n file: File;\n}\n\nfunction useOpen(props: MessageFileProps) {\n const { file } = props;\n const { flippo } = useCustomizeContext<ConversationCustomizeValue>();\n const [isOpenFetching, setIsOpenFetching] = useState(false);\n\n const onOpen = useCallback(\n () =>\n flippo &&\n Promise.resolve(setIsOpenFetching(true))\n .then(() => flippo!.getSasUrl(file.ref))\n .then(open)\n .finally(() => setIsOpenFetching(false)),\n [flippo, file.ref],\n );\n\n return [onOpen, { isOpenFetching }] as const;\n}\n\nexport const MessageFile = customize('MessageFile', (props: MessageFileProps) => {\n const { file } = props;\n const formatter = useFormatter();\n const [onOpen, { isOpenFetching }] = useOpen(props);\n\n return (\n <div className=\"wxchtf-file\">\n <div className=\"wxchtf-icon\">\n <Button loading={isOpenFetching} onClick={onOpen} type=\"link\" icon={<Icon type=\"open-file\" />} />\n </div>\n <div className=\"wxchtf-file-info\">\n <div className=\"wxchtf-name\" title={file.name}>\n {file.name}\n </div>\n <div className=\"wxchtf-size\">{formatter.size(file.bytes)}</div>\n </div>\n </div>\n );\n});\n","import { customize } from '../../customize';\nimport { MessageBoxProps } from './MessageBox';\nimport { MessageFile } from './MessageFile';\n\nexport const MessageFileList = customize('MessageFileList', (props: MessageBoxProps) => {\n const { files } = props.message;\n return (\n <div className=\"wxchtf-file-list\">\n {files.map((file) => (\n <MessageFile key={file.ref} file={file} />\n ))}\n </div>\n );\n});\n","import { customize } from '../../customize';\nimport { MessageText } from './MessageText';\nimport type { MessageBoxProps } from './MessageBox';\nimport { MessageFileList } from './MessageFileList';\n\nexport const MessageContent = customize('MessageContent', (props: MessageBoxProps) => {\n const { files, text } = props.message;\n\n return (\n <div className=\"wxchtf-message-content\">\n {text && <MessageText {...props} />}\n {files.length > 0 && <MessageFileList {...props} />}\n </div>\n );\n});\n","import { chatifyApi } from '../../../core';\nimport { customize } from '../../customize';\nimport { useLocalizer } from '../../localizer';\nimport { useConversation } from '../ConversationContext';\nimport type { MessageBoxProps } from './MessageBox';\n\nexport const MessageInfoBox = customize('MessageInfoBox', (props: MessageBoxProps) => {\n const { message } = props;\n const { id, sentBy, sentAt } = message;\n const { lastReadMessageId, isReading, noReadTracking } = useConversation();\n const me = chatifyApi.settings.me();\n const my = sentBy.id === me;\n const localizer = useLocalizer();\n const isRead = lastReadMessageId != null && id.localeCompare(lastReadMessageId) <= 0;\n const reading = !isRead && isReading?.(id);\n\n return (\n <div className=\"wxchtf-message-info-box\">\n {!my && <div className=\"wxchtf-message-author-name\">{sentBy.name},</div>}\n <div className=\"wxchtf-message-sent-at\">{localizer.timestamp(sentAt)}</div>\n {!my && !noReadTracking && (\n <div className=\"wxchtf-message-read-box\">\n {reading ? localizer.message.reading() : localizer.message.read()}\n </div>\n )}\n </div>\n );\n});\n","import { Ref } from 'react';\nimport { customize } from '../../customize';\nimport { MessageAuthor } from './MessageAuthor';\nimport { MessageContent } from './MessageContent';\nimport { MessageBoxProps } from './MessageBox';\nimport { MessageInfoBox } from './MessageInfoBox';\nimport { chatifyApi } from '../../../core';\n\nexport interface MessageRowProps extends MessageBoxProps {\n containerRef?: Ref<HTMLDivElement>;\n}\n\nexport const MessageRow = customize('MessageRow', (props: MessageRowProps) => {\n const { message, containerRef } = props;\n const { sentBy } = message;\n const me = chatifyApi.settings.me();\n const my = sentBy.id === me;\n\n return (\n <div ref={containerRef} className={'wxchtf-message' + (my ? ' --my' : '')}>\n <MessageAuthor {...props} />\n <div>\n <MessageInfoBox {...props} />\n <MessageContent {...props} />\n </div>\n </div>\n );\n});\n","import { useRef } from 'react';\nimport { customize } from '../../customize';\nimport { MessageReadObserver } from '../ReadObserver';\nimport { MessageRow } from './MessageRow';\nimport { MessageBase } from '../../../core';\n\nexport interface MessageBoxProps {\n message: MessageBase;\n}\n\nexport const MessageBox = customize('MessageBox', (props: MessageBoxProps) => {\n const ref = useRef<HTMLDivElement | null>(null);\n\n return (\n <>\n <MessageReadObserver messageRef={ref} {...props} />\n <MessageRow containerRef={ref} {...props} />\n </>\n );\n});\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport { MessageSkeleton } from '../../common/MessageSkeleton';\n\nexport interface NextMessagesObserverProps {\n onLoad: () => void;\n loading: boolean;\n}\n\nexport function NextMessagesObserver(props: NextMessagesObserverProps) {\n const { onLoad, loading } = props;\n const [intersecting, setIntersecting] = useState(false);\n const ref = useRef<HTMLDivElement | null>(null);\n const timerRef = useRef<number>();\n\n const observer = useMemo(\n () =>\n new IntersectionObserver(([entry]) => {\n if (entry.isIntersecting) {\n timerRef.current = window.setTimeout(() => setIntersecting(true), 200);\n } else {\n clearTimeout(timerRef.current!);\n }\n }),\n [],\n );\n\n useEffect(() => {\n observer.observe(ref.current!);\n return () => observer.disconnect();\n }, [observer]);\n\n useEffect(() => {\n if (!intersecting) {\n return;\n }\n\n onLoad();\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [intersecting]);\n\n if (loading || intersecting) {\n return <MessageSkeleton count={4} />;\n }\n\n return <div className=\"wxchtf-next\" ref={ref} />;\n}\n","import { customize } from '../../customize';\nimport type { SendingMessageBoxProps } from './SendingMessageBox';\n\nexport const SendingMessageText = customize('SendingMessageText', (props: SendingMessageBoxProps) => {\n const { text } = props;\n return <div className=\"wxchtf-sending-message-text\">{text}</div>;\n});\n","import { customize } from '../../customize';\nimport { useLocalizer } from '../../localizer';\nimport type { SendingMessageBoxProps } from './SendingMessageBox';\n\nexport const SendingMessageInfoBox = customize('SendingMessageInfoBox', (_: SendingMessageBoxProps) => {\n const localizer = useLocalizer();\n\n return (\n <div className=\"wxchtf-sending-message-info-box\">\n <div className=\"wxchtf-sending-message-sending-box\">{localizer.message.sending()}</div>\n </div>\n );\n});\n","import { customize } from '../../customize';\nimport { SendingMessageText } from './SendingMessageText';\nimport { SendingMessageInfoBox } from './SendingMessageInfoBox';\nimport type { SendingMessageBoxProps } from './SendingMessageBox';\n\nexport const SendingMessageContent = customize('SendingMessageContent', (props: SendingMessageBoxProps) => {\n return (\n <div className=\"wxchtf-sending-message-content\">\n <SendingMessageText {...props} />\n <SendingMessageInfoBox {...props} />\n </div>\n );\n});\n","import { File } from '../../../core';\nimport { customize } from '../../customize';\nimport { SendingMessageContent } from './SendingMessageContent';\n\nexport interface SendingMessageBoxProps {\n text: string;\n files: File[];\n}\n\nexport const SendingMessageBox = customize('SendingMessageBox', (props: SendingMessageBoxProps) => {\n return (\n <div className=\"wxchtf-sending-message\">\n <SendingMessageContent {...props} />\n </div>\n );\n});\n","import { Button } from 'antd';\nimport { customize } from '../customize';\nimport { useConversation } from './ConversationContext';\nimport { Icon } from '../common';\n\nexport const ConversationActions = customize('ConversationActions', () => {\n const { onClose } = useConversation();\n\n if (!onClose) return null;\n\n return <Button onClick={onClose} type=\"link\" icon={<Icon type=\"close\" />} />;\n});\n","import { MessageBox } from './Message';\nimport { NextMessagesObserver } from './NextObserver';\nimport { SystemMessageBox } from './SystemMessage';\nimport { MessageSkeleton } from '../common/MessageSkeleton';\nimport { customize } from '../customize';\nimport { SYSTEM_ID } from '../../core';\nimport { useConversation } from './ConversationContext';\n\n// TODO: Add sending message box\nexport const ConversationBody = customize('ConversationBody', () => {\n const { id, messages = [], hasMore, onNext, nextLoading } = useConversation();\n\n return (\n <div className=\"wxchtf-conversation-body\">\n {!messages && <MessageSkeleton count={5} />}\n\n {messages?.map((x) => {\n if (x.sentBy.id === SYSTEM_ID) {\n return <SystemMessageBox key={x.id} message={x} />;\n }\n\n return <MessageBox message={x} key={x.id} />;\n })}\n\n {hasMore && <NextMessagesObserver key={messages.length + id} onLoad={onNext} loading={nextLoading} />}\n </div>\n );\n});\n","import { customize } from '../customize';\nimport { useConversation } from './ConversationContext';\n\nexport const ConversationName = customize('ConversationName', () => {\n const { name } = useConversation();\n return <span className=\"wxchtf-conversation-name\">{name}</span>;\n});\n","import { Col, Row } from 'antd';\nimport { customize } from '../customize';\nimport { ConversationName } from './ConversationName';\nimport { ConversationActions } from './ConversationActions';\n\nexport const ConversationHeader = customize('ConversationHeader', () => {\n return (\n <div className=\"wxchtf-conversation-header\">\n <Row justify=\"space-between\" align=\"middle\">\n <Col>\n <ConversationName />\n </Col>\n <Col className=\"wxchtf-conversation-actions\">\n <ConversationActions />\n </Col>\n </Row>\n </div>\n );\n});\n","import { ConversationHeader } from './ConversationHeader';\nimport { ConversationBody } from './ConversationBody';\nimport { customize } from '../customize';\nimport { ConversationName } from './ConversationName';\nimport { ConversationContext, ConversationContextValue, ConversationValue } from './ConversationContext';\nimport { useMemo } from 'react';\nimport { InputBox, InputBoxCustomizeValue } from './InputBox';\nimport { ConversationActions } from './ConversationActions';\nimport { MessageCustomizeValue } from './Message';\nimport { SendingMessageCustomizeValue } from './SendingMessage';\nimport { SystemMessageCustomizeValue } from './SystemMessage';\nimport { CommonCustomizeValue } from '../common';\nimport type { Flippo } from '@webinex/flippo';\n\nexport interface ConversationProps extends Omit<ConversationContextValue, keyof ConversationValue> {\n value: ConversationValue;\n}\n\nexport interface ConversationCustomizeValue\n extends InputBoxCustomizeValue,\n MessageCustomizeValue,\n SendingMessageCustomizeValue,\n SystemMessageCustomizeValue,\n CommonCustomizeValue {\n ConversationActions?: typeof ConversationActions.Component | null;\n ConversationBody?: typeof ConversationBody.Component | null;\n ConversationHeader?: typeof ConversationHeader.Component | null;\n ConversationName?: typeof ConversationName.Component | null;\n flippo?: Flippo;\n}\n\nexport const Conversation = customize('Conversation', (props: ConversationProps) => {\n const {\n value,\n hasMore,\n messages,\n nextLoading,\n onNext,\n onRead,\n onSend,\n isReading,\n noReadTracking,\n onClose,\n } = props;\n\n const { id, active, name, lastReadMessageId } = value;\n\n const context = useMemo<ConversationContextValue>(\n () => ({\n id,\n name,\n active,\n lastReadMessageId,\n hasMore,\n messages,\n nextLoading,\n onNext,\n onRead,\n onSend,\n isReading,\n noReadTracking,\n onClose,\n }),\n [\n id,\n name,\n active,\n onNext,\n onRead,\n onSend,\n hasMore,\n messages,\n nextLoading,\n lastReadMessageId,\n isReading,\n noReadTracking,\n onClose,\n ],\n );\n\n return (\n <ConversationContext.Provider value={context}>\n <div className=\"wxchtf-conversation\">\n <div className=\"wxchtf-conversation-main\">\n <ConversationHeader />\n <ConversationBody />\n {active && <InputBox />}\n </div>\n </div>\n </ConversationContext.Provider>\n );\n});\n","import { Input, Tooltip } from 'antd';\nimport { chatifyApi } from '../../core';\nimport { customize } from '../customize';\nimport { useEffect, useState } from 'react';\nimport { isHotkey } from 'is-hotkey';\nimport { useConversation } from '../Conversation';\n\nconst isEscape = isHotkey('escape');\nconst isEnter = isHotkey('enter');\n\nfunction useUpdateChatName(id: string, value: string) {\n const [updateChatName] = chatifyApi.useUpdateChatNameMutation();\n return () => updateChatName({ id, name: value });\n}\n\nexport const ChatEditableHeaderName = customize('ChatEditableHeaderName', () => {\n const { id, name, active } = useConversation();\n const [editNameValue, setEditNameValue] = useState('');\n const [edit, setEdit] = useState(false);\n const updateChatName = useUpdateChatName(id, editNameValue);\n\n useEffect(() => {\n if (edit) {\n setEditNameValue(name ?? '');\n }\n }, [edit, name]);\n\n if (!active) {\n return <span className=\"wxchtf-conversation-name\">{name}</span>;\n }\n\n if (edit) {\n return (\n <Tooltip defaultOpen title=\"Press Enter to save new chat name or Escape to cancel editing\">\n <Input\n value={editNameValue}\n onChange={(e) => setEditNameValue(e.target.value)}\n onBlur={() => setEdit(false)}\n onKeyDown={(e) => {\n if (isEscape(e)) {\n setEdit(false);\n } else if (isEnter(e)) {\n setEdit(false);\n\n if (editNameValue !== name && editNameValue.trim() !== '') {\n updateChatName();\n }\n }\n }}\n autoFocus\n />\n </Tooltip>\n );\n }\n\n return (\n <Tooltip title=\"Click to edit name...\">\n <span className=\"wxchtf-conversation-name --editable\" onClick={() => setEdit(true)}>\n {name}\n </span>\n </Tooltip>\n );\n});\n","import { ChatMembersPreview } from './Members';\nimport { ChatMembersButton } from './Members';\nimport { customize } from '../customize';\nimport { useConversation } from '../Conversation';\n\nexport const ChatHeaderActions = customize('ChatHeaderActions', () => {\n const { active } = useConversation();\n\n if (!active) {\n return null;\n }\n\n return (\n <div className=\"wxchtf-chat-members\">\n <ChatMembersPreview />\n <ChatMembersButton />\n </div>\n );\n});\n","import { CustomizeContext, customize, useCustomizeContext } from '../customize';\nimport { MessageBody, chatId, chatifyApi } from '../../core';\nimport {\n Conversation,\n ConversationCustomizeValue,\n ConversationProps,\n ConversationValue,\n} from '../Conversation';\nimport { useCallback, useMemo } from 'react';\nimport { ChatEditableHeaderName } from './ChatEditableHeaderName';\nimport { ChatHeaderActions } from './ChatHeaderActions';\nimport { ChatMembersCustomizeValue, ChatMembersPanel } from './Members';\nimport { ChatContext, useChatContext } from './ChatContext';\n\nexport interface ChatProps {\n value: ChatValue;\n}\n\nexport interface ChatValue extends ConversationValue {}\n\nexport interface ChatViewCustomizeValue extends ConversationCustomizeValue, ChatMembersCustomizeValue {\n ChatEditableHeaderName?: typeof ChatEditableHeaderName.Component | null;\n ChatHeaderActions?: typeof ChatHeaderActions.Component | null;\n ChatView?: typeof ChatView.Component | null;\n}\n\nexport const DEFAULT_CHAT_VIEW_CUSTOMIZE_VALUE: ConversationCustomizeValue = {\n ConversationName: () => <ChatEditableHeaderName />,\n ConversationActions: () => <ChatHeaderActions />,\n};\n\nfunction useConversation(props: ChatProps) {\n const { value: chat } = props;\n const { id, name, active, lastReadMessageId } = chat;\n\n const { data: messageList } = chatifyApi.useGetChatMessageListQuery({ chatId: id });\n const { messages, hasMore } = messageList ?? {};\n\n const [fetchNext, { isLoading: isFetchNextLoading }] = chatifyApi.useFetchNextChatMessageListMutation();\n const onNext = useCallback(() => fetchNext({ chatId: id }), [fetchNext, id]);\n\n const [read] = chatifyApi.useReadChatMessageMutation();\n const onRead = useCallback((id: string) => read({ id }), [read]);\n\n const [send] = chatifyApi.useSendChatMessageMutation();\n const onSend = useCallback((message: MessageBody) => send({ ...message, chatId: id }).unwrap(), [id, send]);\n\n const { data: readQueue } = chatifyApi.useGetChatMessageReadQueueQuery();\n\n const conversation = useMemo(() => {\n if (!id) {\n return null;\n }\n\n const result: ConversationProps = {\n value: { id: id!, name: name!, active: active!, lastReadMessageId: lastReadMessageId! },\n messages,\n hasMore,\n onNext,\n nextLoading: isFetchNextLoading,\n onRead,\n onSend,\n isReading: (id: string) => readQueue!.some((x) => chatId(x.value) === chatId(id) && id <= x.value),\n };\n\n return result;\n }, [\n onNext,\n onRead,\n onSend,\n isFetchNextLoading,\n id,\n name,\n active,\n messages,\n hasMore,\n lastReadMessageId,\n readQueue,\n ]);\n\n return conversation;\n}\n\nfunction Content(props: ChatProps) {\n const conversation = useConversation(props);\n const { showMembers } = useChatContext();\n\n if (!conversation) {\n return null;\n }\n\n return (\n <div className=\"wxchtf-chat\">\n <Conversation {...conversation} />\n {showMembers && <ChatMembersPanel />}\n </div>\n );\n}\n\nexport const ChatView = customize('ChatView', (props: ChatProps) => {\n const { value } = props;\n const customized = useCustomizeContext();\n const customize: ChatViewCustomizeValue = useMemo(\n () => ({ ...(customized ?? {}), ...DEFAULT_CHAT_VIEW_CUSTOMIZE_VALUE }),\n [customized],\n );\n\n return (\n <CustomizeContext.Provider value={customize}>\n <ChatContext id={value.id}>\n <Content value={value} />\n </ChatContext>\n </CustomizeContext.Provider>\n );\n});\n","import { CSSProperties } from 'react';\nimport { Localizer, LocalizerContext, defaultLocalizer } from '../localizer';\nimport { CustomizeContext } from '../customize';\nimport { ChatView, ChatViewCustomizeValue } from './ChatView';\nimport { chatifyApi } from '../../core';\n\nexport interface ChatPanelCustomizeValue extends ChatViewCustomizeValue {}\n\nexport interface ChatPanelProps {\n id: string;\n className?: string;\n style?: CSSProperties;\n localizer?: Localizer;\n customize?: ChatPanelCustomizeValue;\n}\n\nexport function ChatPanel(props: ChatPanelProps) {\n const { id, className = '', customize, localizer = defaultLocalizer, style } = props;\n const { data: chat } = chatifyApi.useGetChatQuery({ id });\n\n return (\n <div className={`wxchtf-chatify wxchtf-chat-panel ${className}`} style={style}>\n <LocalizerContext.Provider value={localizer}>\n <CustomizeContext.Provider value={customize as any}>\n {chat && <ChatView value={chat} key={id} />}\n </CustomizeContext.Provider>\n </LocalizerContext.Provider>\n </div>\n );\n}\n","import React, { PropsWithChildren, useContext, useMemo, useState } from 'react';\n\nexport interface ChatGroupContext {\n view: 'chat' | 'new-chat' | 'auto-reply' | null;\n chatId: string | null;\n showMembers: boolean;\n\n none(): void;\n openChat(chatId: string): void;\n toggleNewChat(): void;\n toggleMembers(): void;\n toggleAutoReply(): void;\n}\n\nconst ChatGroupReactContext = React.createContext<ChatGroupContext>(null!);\n\nexport function useChatGroupContext() {\n return useContext(ChatGroupReactContext);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport function ChatGroupContext(props: PropsWithChildren<{}>) {\n const { children } = props;\n const [state, setState] = useState<Pick<ChatGroupContext, 'view' | 'chatId' | 'showMembers'>>({\n chatId: null,\n view: null,\n showMembers: false,\n });\n\n const value = useMemo<ChatGroupContext>(\n () => ({\n ...state,\n openChat: (chatId: string) => setState((prev) => ({ ...prev, view: 'chat', chatId })),\n none: () => setState((prev) => ({ ...prev, view: null, chatId: null })),\n toggleMembers: () => setState((prev) => ({ ...prev, showMembers: !prev.showMembers })),\n toggleNewChat: () =>\n setState((prev) => {\n if (prev.view === 'new-chat' && !prev.chatId) {\n return { ...prev, view: null };\n } else if (prev.view === 'new-chat' && prev.chatId) {\n return { ...prev, view: 'chat' };\n } else {\n return { ...prev, view: 'new-chat' };\n }\n }),\n toggleAutoReply: () =>\n setState((prev) => {\n if (prev.view === 'auto-reply' && prev.chatId) {\n return { ...prev, view: 'chat' };\n } else if (prev.view === 'auto-reply' && !prev.chatId) {\n return { ...prev, view: null };\n } else {\n return { ...prev, view: 'auto-reply' };\n }\n }),\n }),\n [state],\n );\n\n return <ChatGroupReactContext.Provider value={value}>{children}</ChatGroupReactContext.Provider>;\n}\n","import { Button } from 'antd';\nimport { customize } from '../../customize';\nimport { useChatGroupContext } from '../ChatGroupContext';\nimport { useLocalizer } from '../../localizer';\nimport { Icon } from '../../common/Icon';\n\nexport const AutoReplyButton = customize('AutoReplyButton', () => {\n const { toggleAutoReply } = useChatGroupContext();\n const localizer = useLocalizer();\n const titleText = localizer.autoReply.buttonTitle();\n\n return (\n <Button\n className=\"wxchtf-add-btn-settings\"\n onClick={toggleAutoReply}\n icon={<Icon type=\"settings\" />}\n title={titleText}\n aria-label={titleText}\n />\n );\n});\n","import { DatePicker, Form } from 'antd';\nimport { customize } from '../../customize';\nimport { useLocalizer } from '../../localizer';\n\nexport interface AutoReplyPeriodInputProps {\n name: string;\n}\n\nexport const AutoReplyPeriodInput = customize('AutoReplyPeriodInput', (props: AutoReplyPeriodInputProps) => {\n const { name } = props;\n const localizer = useLocalizer();\n\n return (\n <Form.Item\n label={localizer.autoReply.period.label()}\n name={name}\n rules={[{ required: true, message: localizer.autoReply.period.required() }]}\n >\n <DatePicker.RangePicker format={localizer.autoReply.period.format()} />\n </Form.Item>\n );\n});\n","import { Form, Input } from 'antd';\nimport { customize } from '../../customize';\nimport { useLocalizer } from '../../localizer';\n\nexport interface AutoReplyTextInputProps {\n name: string;\n}\n\nexport const AutoReplyTextInput = customize('AutoReplyTextInput', (props: AutoReplyTextInputProps) => {\n const { name } = props;\n const localizer = useLocalizer();\n\n return (\n <Form.Item\n label={localizer.autoReply.text.label()}\n name={name}\n rules={[{ required: true, message: localizer.autoReply.text.required() }]}\n >\n <Input.TextArea rows={4} />\n </Form.Item>\n );\n});\n","import { Button, Form } from 'antd';\nimport { Dayjs } from 'dayjs';\nimport { customize } from '../../customize';\nimport { useLocalizer } from '../../localizer';\nimport { AutoReplyPeriodInput } from './AutoReplyPeriodInput';\nimport { AutoReplyTextInput } from './AutoReplyTextInput';\nimport { useEffect } from 'react';\n\nexport interface AutoReplyFormValue {\n period: [Dayjs, Dayjs];\n text: string;\n}\n\nexport interface AutoReplyFormProps {\n value: AutoReplyFormValue;\n onSubmit: (value: AutoReplyFormValue) => void;\n busy?: boolean;\n}\n\nexport const AUTO_REPLY_FORM_INITIAL_VALUE: AutoReplyFormValue = {\n period: [] as unknown as [Dayjs, Dayjs],\n text: '',\n};\n\nexport const AutoReplyForm = customize('AutoReplyForm', (props: AutoReplyFormProps) => {\n const { value, busy = false, onSubmit } = props;\n const localizer = useLocalizer();\n\n const [form] = Form.useForm<AutoReplyFormValue>();\n\n useEffect(() => {\n form.setFieldsValue(value);\n }, [value, form]);\n\n return (\n <Form<AutoReplyFormValue>\n form={form}\n layout=\"vertical\"\n onFinish={onSubmit}\n disabled={busy}\n initialValues={value}\n >\n <AutoReplyPeriodInput name=\"period\" />\n <AutoReplyTextInput name=\"text\" />\n <Button loading={busy} type=\"primary\" block htmlType=\"submit\">\n {localizer.autoReply.submitBtn()}\n </Button>\n </Form>\n );\n});\n","import dayjs from 'dayjs';\nimport { useCallback, useMemo } from 'react';\nimport { Button } from 'antd';\nimport { customize } from '../../customize';\nimport { useLocalizer } from '../../localizer';\nimport { useChatGroupContext } from '../ChatGroupContext';\nimport { Icon } from '../../common/Icon';\nimport { AutoReply } from '../../../core';\nimport { chatifyApi } from '../../../core';\nimport { AUTO_REPLY_FORM_INITIAL_VALUE, AutoReplyForm, AutoReplyFormValue } from './AutoReplyForm';\n\nfunction mapToFormValue(autoReply?: AutoReply | null): AutoReplyFormValue {\n if (!autoReply) {\n return AUTO_REPLY_FORM_INITIAL_VALUE;\n }\n\n return {\n period: [dayjs(autoReply.period.start), dayjs(autoReply.period.end)],\n text: autoReply.text,\n };\n}\n\nfunction useValue() {\n const { data: me } = chatifyApi.useGeCurrentUserAccountQuery();\n\n const value = useMemo<AutoReplyFormValue>(() => {\n return mapToFormValue(me?.autoReply);\n }, [me]);\n\n return value;\n}\n\nfunction useAutoReplyActions() {\n const meId = chatifyApi.settings.me();\n const [updateAccount, { isLoading }] = chatifyApi.useUpdateAccountMutation();\n\n const onSubmit = useCallback(\n (value: AutoReplyFormValue) =>\n updateAccount({\n id: meId,\n autoReply: {\n hasValue: true,\n value: {\n text: value.text,\n period: {\n start: value.period[0].toISOString(),\n end: value.period[1].toISOString(),\n },\n },\n },\n }).unwrap(),\n [updateAccount, meId],\n );\n\n const onClear = useCallback(\n () =>\n updateAccount({\n id: meId,\n autoReply: {\n hasValue: true,\n value: null,\n },\n }).unwrap(),\n [updateAccount, meId],\n );\n\n return [onSubmit, isLoading, onClear] as const;\n}\n\nexport const AutoReplyPanel = customize('AutoReplyPanel', () => {\n const localizer = useLocalizer();\n const { toggleAutoReply } = useChatGroupContext();\n const value = useValue();\n const [onSubmit, submitting, onClear] = useAutoReplyActions();\n\n return (\n <div className=\"wxchtf-auto-reply-panel\">\n <Button\n onClick={toggleAutoReply}\n className=\"wxchtf-auto-reply-panel-close\"\n type=\"link\"\n icon={<Icon type=\"close\" />}\n />\n <div className=\"wxchtf-auto-reply-panel-header\">\n <h3>{localizer.autoReply.title()}</h3>\n <Button type=\"link\" onClick={onClear} disabled={submitting} className=\"wxchtf-auto-reply-panel-clear\">\n {localizer.autoReply.clearBtn()}\n </Button>\n </div>\n\n <AutoReplyForm value={value} busy={submitting ?? false} onSubmit={onSubmit} />\n </div>\n );\n});\n","import { Form, Input } from 'antd';\nimport { customize } from '../../customize';\nimport { useLocalizer } from '../../localizer';\n\nexport interface CreateChatNameInputProps {\n name: string;\n}\n\nexport const CreateChatNameInput = customize('CreateChatNameInput', (props: CreateChatNameInputProps) => {\n const { name } = props;\n const localizer = useLocalizer();\n\n return (\n <Form.Item\n name={name}\n label={localizer.addChat.name.label()}\n rules={[\n { required: true, message: localizer.addChat.name.required() },\n { max: 250, message: localizer.addChat.name.max250() },\n ]}\n >\n <Input />\n </Form.Item>\n );\n});\n","import { useMemo } from 'react';\nimport { chatifyApi } from '../../../core';\nimport { customize } from '../../customize';\nimport { Checkbox, Form, List } from 'antd';\nimport { useLocalizer } from '../../localizer';\nimport { Avatar } from '../../common/Avatar';\n\nexport interface CreateChatMemberInputProps {\n name: string;\n}\n\ninterface CheckboxListProps {\n value?: string[];\n onChange?: (value: string[]) => void;\n}\n\nfunction CheckboxList(props: CheckboxListProps) {\n const { value, onChange } = props;\n const { data: accounts, isFetching } = chatifyApi.useGetAccountListQuery({});\n const me = chatifyApi.settings.me();\n const dataSource = useMemo(() => accounts?.filter((x) => x.id !== me) ?? [], [accounts, me]);\n\n return (\n <List\n rowKey=\"id\"\n className=\"wxchtf-create-chat-member-input-list\"\n loading={isFetching}\n dataSource={dataSource}\n renderItem={(x) => {\n const checked = value!.includes(x.id);\n\n return (\n <List.Item className={checked ? '--selected' : ''}>\n <Checkbox\n checked={checked}\n onChange={() =>\n onChange!(value!.includes(x.id) ? value!.filter((y) => y !== x.id) : [...value!, x.id])\n }\n >\n <List.Item.Meta avatar={<Avatar account={x} />} title={x.name} />\n </Checkbox>\n </List.Item>\n );\n }}\n />\n );\n}\n\nexport const CreateChatMemberInput = customize(\n 'CreateChatMemberInput',\n (props: CreateChatMemberInputProps) => {\n const { name } = props;\n const localizer = useLocalizer();\n\n return (\n <Form.Item\n label={localizer.addChat.members.label()}\n rules={[{ required: true, message: localizer.addChat.members.required() }]}\n name={name}\n >\n <CheckboxList />\n </Form.Item>\n );\n },\n);\n","import { Button, Form } from 'antd';\nimport { customize } from '../../customize';\nimport { CreateChatNameInput } from './CreateChatNameInput';\nimport { CreateChatMemberInput } from './CreateChatMemberInput';\nimport { useLocalizer } from '../../localizer';\n\nexport interface CreateChatFormValue {\n name: string;\n members: string[];\n}\n\nexport interface CreateChatFormProps {\n value?: CreateChatFormValue;\n onSubmit: (value: CreateChatFormValue) => void;\n busy?: boolean;\n}\n\nconst INITIAL_VALUE: CreateChatFormValue = {\n name: '',\n members: [],\n};\n\nexport const CreateChatForm = customize('CreateChatForm', (props: CreateChatFormProps) => {\n const { value = INITIAL_VALUE, onSubmit, busy = false } = props;\n const localizer = useLocalizer();\n\n return (\n <Form onFinish={onSubmit} layout=\"vertical\" disabled={busy} initialValues={value}>\n <CreateChatNameInput name=\"name\" />\n <CreateChatMemberInput name=\"members\" />\n <Button loading={busy} type=\"primary\" block htmlType=\"submit\">\n {localizer.addChat.submitBtn()}\n </Button>\n </Form>\n );\n});\n","import { chatifyApi } from '../../../core';\nimport { useCallback } from 'react';\nimport { useLocalizer } from '../../localizer';\nimport { CreateChatForm, CreateChatFormValue } from './CreateChatForm';\nimport { customize } from '../../customize';\nimport { Button } from 'antd';\nimport { Icon } from '../../common/Icon';\nimport { useChatGroupContext } from '../ChatGroupContext';\n\nfunction useSubmit() {\n const [add, { isLoading }] = chatifyApi.useAddChatMutation();\n const { openChat } = useChatGroupContext();\n\n const onSubmit = useCallback(\n (value: CreateChatFormValue) =>\n add({\n name: value.name,\n members: value.members,\n })\n .unwrap()\n .then((id) => openChat(id)),\n [add, openChat],\n );\n\n return [onSubmit, isLoading] as const;\n}\n\nexport const CreateChatPanel = customize('CreateChatPanel', () => {\n const localizer = useLocalizer();\n const [onSubmit, submitting] = useSubmit();\n const { toggleNewChat } = useChatGroupContext();\n\n return (\n <div className=\"wxchtf-create-chat-panel\">\n <Button\n onClick={() => toggleNewChat()}\n className=\"wxchtf-create-chat-panel-close\"\n type=\"link\"\n icon={<Icon type=\"close\" />}\n />\n <h3>{localizer.addChat.title()}</h3>\n <CreateChatForm busy={submitting ?? false} onSubmit={onSubmit} />\n </div>\n );\n});\n","import { Button } from 'antd';\nimport { customize } from '../../customize';\nimport { useChatGroupContext } from '../ChatGroupContext';\n\nexport const CreateChatButton = customize('CreateChatButton', () => {\n const { toggleNewChat } = useChatGroupContext();\n\n return (\n <span className=\"wxchtf-add-btn-wrapper\">\n <Button className=\"wxchtf-add-btn\" onClick={toggleNewChat} icon=\"+\">\n Add chat\n </Button>\n </span>\n );\n});\n","import { Space } from 'antd';\nimport { CreateChatButton } from '../Create';\nimport { AutoReplyButton } from '../AutoReply/AutoReplyButton';\nimport { customize } from '../../customize';\n\nexport const ChatGroupActions = customize('ChatGroupActions', () => {\n return (\n <span className=\"wxchtf-add-btn-wrapper\">\n <Space.Compact className=\"wxchtf-add-btn-group\">\n <CreateChatButton />\n <AutoReplyButton />\n </Space.Compact>\n </span>\n );\n});\n","import { useMemo } from 'react';\nimport { chatifyApi } from '../../../core';\nimport { customize } from '../../customize';\nimport { useChatGroupContext } from '../ChatGroupContext';\nimport { ChatListValue, ChatList } from '../../common';\n\nfunction useData() {\n const { data: chats } = chatifyApi.useGetChatListQuery();\n return useMemo(\n () =>\n chats?.map(\n (x): ChatListValue => ({\n id: x.id,\n name: x.name,\n lastMessage: x.message,\n lastReadMessageId: x.lastReadMessageId,\n }),\n ) ?? [],\n [chats],\n );\n}\n\nexport const ChatListPanel = customize('ChatListPanel', () => {\n const { chatId, openChat } = useChatGroupContext();\n const data = useData();\n\n return <ChatList items={data} selected={chatId} onSelect={openChat} />;\n});\n","import { customize } from '../../customize';\nimport { ChatListPanel } from '../List';\nimport { ChatGroupActions } from './ChatGroupActions';\n\nexport const ChatGroupAside = customize('ChatGroupAside', () => {\n return (\n <div className=\"wxchtf-aside\">\n <ChatGroupActions />\n <ChatListPanel />\n </div>\n );\n});\n","import { customize } from '../../customize';\n\nexport const ChatGroupHeader = customize('ChatGroupHeader', () => {\n return <div className=\"wxchtf-header\"></div>;\n});\n","import { customize } from '../../customize';\n\nexport const ChatGroupFooter = customize('ChatGroupFooter', () => <div className=\"wxchtf-footer\"></div>);\n","import { customize } from '../../customize';\nimport { CreateChatPanel } from '../Create';\nimport { ChatView } from '../../Chat';\nimport { useChatGroupContext } from '../ChatGroupContext';\nimport { chatifyApi } from '../../../core';\nimport { AutoReplyPanel } from '../AutoReply';\n\nexport const ChatGroupMain = customize('ChatGroupMain', () => {\n const { chatId, view } = useChatGroupContext();\n const chat = chatifyApi.useChatListItem(chatId);\n\n return (\n <div className=\"wxchtf-main\">\n {view === 'chat' && chat && <ChatView value={chat} key={chatId} />}\n {view === 'new-chat' && <CreateChatPanel />}\n {view === 'auto-reply' && <AutoReplyPanel />}\n </div>\n );\n});\n","import { customize } from '../../customize';\nimport { ChatGroupAside } from './ChatGroupAside';\nimport { ChatGroupMain } from './ChatGroupMain';\n\nexport const ChatGroupBody = customize('ChatGroupBody', () => (\n <div className=\"wxchtf-body\">\n <ChatGroupAside />\n <ChatGroupMain />\n </div>\n));\n","import { CSSProperties, FC, useEffect, useMemo, useRef } from 'react';\nimport { Localizer, LocalizerContext, defaultLocalizer } from '../localizer';\nimport { CreateChatPanelCustomizeValue } from './Create';\nimport { ChatGroupBody, ChatGroupFooter, ChatGroupHeader, ChatGroupLayoutCustomizeValue } from './Layout';\nimport { ChatListPanelCustomizeValue } from './List';\nimport { ChatGroupContext, useChatGroupContext } from './ChatGroupContext';\nimport { chatifyApi } from '../../core';\nimport { CustomizeContext } from '../customize';\nimport { ChatViewCustomizeValue } from '../Chat';\nimport { AutoReplyCustomizeValue } from './AutoReply';\n\nexport interface ChatGroupCustomizeValue\n extends ChatViewCustomizeValue,\n AutoReplyCustomizeValue,\n CreateChatPanelCustomizeValue,\n ChatListPanelCustomizeValue,\n ChatGroupLayoutCustomizeValue {}\n\nexport interface ChatifyProps {\n className?: string;\n style?: CSSProperties;\n localizer?: Localizer;\n customize?: ChatGroupCustomizeValue;\n}\n\nfunction Content(props: Pick<ChatifyProps, 'className' | 'style'>) {\n const { className = '', style } = props;\n const { data: chats } = chatifyApi.useGetChatListQuery();\n const { openChat, none, chatId } = useChatGroupContext();\n const openFirstChatRef = useRef(false);\n\n useEffect(() => {\n if (chats && !chats.some((x) => x.id === chatId)) {\n chats.length ? openChat(chats[0].id) : none();\n }\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [chats, chatId]);\n\n useEffect(() => {\n if (chats && !openFirstChatRef.current) {\n openFirstChatRef.current = true;\n chats.length && openChat(chats[0].id);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [chats]);\n\n return (\n <div className={className + ' wxchtf-chatify wxchtf-chat-group'} style={style}>\n <ChatGroupHeader />\n <ChatGroupBody />\n <ChatGroupFooter />\n </div>\n );\n}\n\nconst DEFAULT_CUSTOMIZE: ChatGroupCustomizeValue = {\n ChatGroupHeader: null,\n ChatGroupFooter: null,\n};\n\nexport const ChatGroupPanel: FC<ChatifyProps> = (props) => {\n const { localizer = defaultLocalizer, customize = DEFAULT_CUSTOMIZE } = props;\n const customizeValue = useMemo(() => Object.assign({}, DEFAULT_CUSTOMIZE, customize), [customize]);\n\n return (\n <LocalizerContext.Provider value={localizer}>\n <CustomizeContext.Provider value={customizeValue as any}>\n <ChatGroupContext>\n <Content {...props} />\n </ChatGroupContext>\n </CustomizeContext.Provider>\n </LocalizerContext.Provider>\n );\n};\n","import React from 'react';\n\nexport interface ThreadContextValue {\n id: string;\n watch: boolean;\n onWatch: (value: boolean) => void;\n}\n\nexport const ThreadContext = React.createContext<ThreadContextValue>(null!);\n\nexport function useThreadContext() {\n return React.useContext(ThreadContext);\n}\n","import { Button, Tooltip } from 'antd';\nimport { customize } from '../customize';\nimport { useThreadContext } from './ThreadContext';\nimport { Icon } from '../common/Icon';\n\nexport const ThreadActions = customize('ThreadActions', () => {\n const { watch, onWatch } = useThreadContext();\n\n if (!watch) {\n return (\n <Tooltip title=\"Watch thread\">\n <Button type=\"link\" icon={<Icon type=\"watch\" />} onClick={() => onWatch(true)} />\n </Tooltip>\n );\n }\n\n return (\n <Tooltip title=\"Unwatch thread\">\n <Button type=\"link\" icon={<Icon type=\"unwatch\" />} onClick={() => onWatch(false)} />\n </Tooltip>\n );\n});\n","import { useCallback, useEffect, useMemo } from 'react';\nimport { MessageBody, chatifyApi, parseThreadMessageId } from '../../core';\nimport { Conversation, ConversationCustomizeValue, ConversationProps } from '../Conversation';\nimport { ThreadContext, ThreadContextValue } from './ThreadContext';\nimport { Localizer, LocalizerContext, defaultLocalizer } from '../localizer';\nimport { CustomizeContext } from '../customize';\nimport { ThreadActions } from './ThreadActions';\nimport { CommonCustomizeValue } from '../common';\n\nexport interface ThreadCustomizeValue extends ConversationCustomizeValue, CommonCustomizeValue {\n ThreadActions?: typeof ThreadActions.Component | null;\n}\n\nexport interface ThreadPanelProps {\n threadId: string;\n className?: string;\n customize?: ThreadCustomizeValue;\n localizer?: Localizer;\n}\n\nfunction usePanelState(props: ThreadPanelProps) {\n const { threadId } = props;\n const { data: thread } = chatifyApi.useGetThreadQuery({ id: threadId });\n const { data: messageList } = chatifyApi.useGetThreadMessageListQuery({ threadId });\n const { id, name, archive, lastReadMessageId, watch } = thread ?? {};\n const { messages, hasMore } = messageList ?? {};\n\n const [read] = chatifyApi.useReadThreadMessageMutation();\n const onRead = useCallback((id: string) => read({ id }), [read]);\n\n const [fetchNext, { isLoading: isFetchNextLoading }] = chatifyApi.useFetchNextThreadMessageListMutation();\n const onNext = useCallback(() => fetchNext({ threadId }), [fetchNext, threadId]);\n\n const [send] = chatifyApi.useSendThreadMessageMutation();\n const onSend = useCallback(\n (message: MessageBody) => send({ body: message, threadId }).unwrap(),\n [threadId, send],\n );\n\n const { data: readQueue } = chatifyApi.useGetThreadMessageReadQueueQuery();\n\n const conversation = useMemo(() => {\n if (!id) {\n return null;\n }\n\n const result: ConversationProps = {\n value: { id: id!, name: name!, active: !archive, lastReadMessageId: lastReadMessageId ?? null },\n messages,\n hasMore,\n onNext,\n nextLoading: isFetchNextLoading,\n onRead,\n onSend,\n noReadTracking: !watch,\n isReading: (id: string) =>\n readQueue!.some(\n (unit) => parseThreadMessageId(unit.value)[0] === parseThreadMessageId(id)[0] && id <= unit.value,\n ),\n };\n\n return result;\n }, [\n onNext,\n onRead,\n onSend,\n isFetchNextLoading,\n id,\n name,\n archive,\n messages,\n hasMore,\n lastReadMessageId,\n readQueue,\n watch,\n ]);\n\n const [watchThread] = chatifyApi.useWatchThreadMutation();\n\n const threadContext = useMemo<ThreadContextValue | null>(\n () =>\n thread\n ? {\n id: thread.id,\n watch: thread.watch,\n onWatch: (value) => watchThread({ id: thread.id, watch: value }).unwrap(),\n }\n : null,\n [thread, watchThread],\n );\n\n return [conversation, threadContext] as const;\n}\n\nconst DEFAULT_CUSTOMIZE: ThreadCustomizeValue = {\n ConversationActions: () => <ThreadActions />,\n};\n\nexport function ThreadPanel(props: ThreadPanelProps) {\n const { threadId, customize, localizer = defaultLocalizer, className = '' } = props;\n const [conversation, threadContext] = usePanelState(props);\n const customizeMergeValue = useMemo(() => ({ ...DEFAULT_CUSTOMIZE, ...customize }), [customize]);\n\n useEffect(() => {\n chatifyApi.settings.client.connectToThread(threadId);\n\n return () => {\n chatifyApi.settings.client.disconnectFromThread(threadId);\n };\n }, [threadId]);\n\n if (!conversation || !threadContext) {\n return null;\n }\n\n return (\n <LocalizerContext.Provider value={localizer}>\n <ThreadContext.Provider value={threadContext}>\n <CustomizeContext.Provider value={customizeMergeValue as any}>\n <div className={`wxchtf-chatify wxchtf-thread ${className}`}>\n {conversation && <Conversation {...conversation} />}\n </div>\n </CustomizeContext.Provider>\n </ThreadContext.Provider>\n </LocalizerContext.Provider>\n );\n}\n","import { ChatPanel } from './Chat';\nimport { ChatGroupPanel } from './ChatGroup';\nimport { ThreadPanel } from './Thread';\n\nexport interface ChatifyType {\n Thread: typeof ThreadPanel;\n ChatGroup: typeof ChatGroupPanel;\n Chat: typeof ChatPanel;\n}\n\nexport const Chatify = {\n Thread: ThreadPanel,\n ChatGroup: ChatGroupPanel,\n Chat: ChatPanel,\n} as unknown as ChatifyType;\n"],"names":["forwardRef","unit","chatId","AntdAvatar","isEnter","useConversation","files","id","Content","customize","DEFAULT_CUSTOMIZE"],"mappings":";;;;;;;;;;;;AAKA,MAAM,wBAAsC;AAAA,EAC1C,YAAY;AAAA,EACZ,WAAW;AACb;AAEO,SAAS,MAAM,OAAe,UAAwB,IAAI;AAC/D,YAAU,OAAO,OAAO,CAAA,GAAI,uBAAuB,OAAO;AAE1D,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,WAAO,MAAM,WAAW,CAAC,MAAM,QAAQ,KAAK;AAC5C,WAAO,OAAO;AAAA,EAChB;AACA,SAAO,OAAO,OAAO,GAAG,KAAK,QAAQ,UAAU,MAAM,QAAQ,SAAS;AACxE;ACZO,MAAM,mBAAmB,MAAM,cAAmC,IAAK;AAEvE,SAAS,sBAA8B;AAC5C,SAAO,WAAW,gBAAgB;AACpC;AAEA,SAAS,UAAkD,KAA4C;AACrG,QAAM,QAAQ,WAAW,gBAAgB;AACzC,SAAO,QAAS,MAAM,GAAG,IAAsC;AACjE;AAEO,SAAS,aAAqE,QAAiB;AACpG,QAAM,SAAS,UAAgC,OAAO,GAAG;AAEzD,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AAEA,SAAO,UAAU,OAAO;AAC1B;AAEO,SAAS,UACd,KACA,WACgG;AAChG,QAAM,SAAkB,MAAM,WAA4B,CAAC,OAAYA,gBAAe;AACpF,UAAM,SAAS,UAAU,GAAG;AAE5B,QAAI,WAAW,MAAM;AACnB,aAAO;AAAA,IACT;AAEA,QAAI,QAAQ;AACV,aAAO,oBAAC,QAAA,EAAQ,GAAG,OAAO,KAAKA,aAAY;AAAA,IAC7C;AAEA,WAAO,oBAAC,WAAA,EAAW,GAAG,OAAO,KAAKA,aAAY;AAAA,EAChD,CAAC;AAED,YAAU,cAAc,UAAU,eAAe;AACjD,SAAO,cAAc,kBAAkB,UAAU;AAEjD,SAAO,OAAO,OAAO,QAAQ,EAAE,KAAK,WAAW;AACjD;ACzBO,MAAM,QAAQ;AAAA,EACnB,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,gCAAgC;AAAA,EAChC,cAAc;AAAA,EACd,2BAA2B;AAAA,EAC3B,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,eAAe;AAAA,EACf,aAAa;AAAA,EACb,UAAU;AACZ;AAEO,MAAM,OAAO,UAAyB,QAAQ,CAAC,UAAU;AAC9D,QAAM,EAAE,SAAS;AACjB,QAAM,gBAAgB,MAAM,IAAI;AAChC,SAAO,gBAAgB,oBAAC,eAAA,CAAA,CAAc,IAAK;AAC7C,CAAC;ACvCD,MAAM,mBAAmB,MAAM,cAA2B,IAAK;AAExD,SAAS,iBAAiB;AAC/B,SAAO,WAAW,gBAAgB;AACpC;AAGO,SAAS,YAAY,OAA0C;AACpE,QAAM,EAAE,IAAI,SAAA,IAAa;AACzB,QAAM,CAAC,aAAa,aAAa,IAAI,SAAS,KAAK;AAEnD,QAAM,QAAQ;AAAA,IACZ,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,CAAC,IAAI,WAAW;AAAA,EAAA;AAGlB,SAAO,oBAAC,iBAAiB,UAAjB,EAA0B,OAAe,SAAA,CAAS;AAC5D;ACxBO,MAAM,oBAAoB,UAAU,qBAAqB,MAAM;AACpE,QAAM,EAAE,aAAa,cAAA,IAAkB,eAAA;AACvC,SAAO,oBAAC,QAAA,EAAO,SAAS,MAAM,cAAc,CAAC,WAAW,GAAG,MAAK,QAAO,MAAM,oBAAC,MAAA,EAAK,MAAK,WAAU,GAAI;AACxG,CAAC;ACRM,MAAM,YAAY;AC6GlB,SAAS,OAAO,WAAmB;AACxC,SAAO,UAAU,MAAM,GAAG,EAAE;AAC9B;AAEO,SAAS,oBAAoB,IAAY;AAC9C,SAAO,GAAG,MAAM,EAAE;AACpB;AA2CO,SAAS,qBAAqB,WAAmB;AACtD,QAAM,CAAC,UAAU,KAAK,IAAI,UAAU,MAAM,MAAM,CAAC;AACjD,SAAO,CAAC,UAAU,SAAS,OAAO,EAAE,CAAC;AACvC;AAEO,SAAS,sBACd,QACA;;AACA,QAAM,uBACJ,OAAO,qBAAqB,OAAO,qBAAqB,OAAO,iBAAiB,EAAE,CAAC,IAAI;AAEzF,QAAM,2BACJ,YAAO,gBAAP,mBAAoB,OAAM,OAAO,sBAAqB,YAAO,gBAAP,mBAAoB,EAAE,EAAE,CAAC,IAAI;AAErF,SAAO,yBAAyB;AAClC;AAEO,SAAS,0BACd,SACA;AACA,SAAO,QAAQ,OAAO,CAAC,MAAM,WAAW;AACtC,WAAO,OAAO,sBAAsB,MAAM;AAAA,EAC5C,GAAG,CAAC;AACN;ACrKO,MAAM,SAAY;AAAA,EAMvB,YAAmB,QAA2B;AALtC,qCAAwC,CAAA;AACxC,uCAA0C,CAAA;AAC1C,2CAA0C,CAAA;AAC1C,wCAAgD,CAAA;AAWjD,qCAAY,CAAC,aAA0C;AAC5D,WAAK,aAAa,KAAK,QAAQ;AAC/B,aAAO,MAAM;AACX,aAAK,eAAe,KAAK,aAAa,OAAO,CAAC,MAAM,MAAM,QAAQ;AAAA,MACpE;AAAA,IACF;AAEO,kCAAS,MAAM;AACpB,WAAK,aAAa,QAAQ,CAAC,eAAe,WAAW,IAAI,CAAC;AAAA,IAC5D;AAlBmB,SAAA,SAAA;AAAA,EAA4B;AAAA,EAE/C,IAAW,QAA4B;AACrC,WAAO;AAAA,MACL,GAAG,KAAK,UAAU,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,WAAA,EAAsB;AAAA,MACnE,GAAG,KAAK,YAAY,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,eAAwB;AAAA,IAAA;AAAA,EAE3E;AAAA,EAaO,KAAK,OAAU;AACpB,UAAM,QAAQ,KAAK,OAAO,QAAQ,KAAK;AACvC,UAAM,OAAO,KAAK,UAAU,KAAK,CAACC,UAAS,KAAK,OAAO,QAAQA,MAAK,KAAK,MAAM,KAAK;AAEpF,QAAI,CAAC,MAAM;AACT,WAAK,UAAU,KAAK,EAAE,OAAO,aAAa,KAAK,IAAA,GAAO;AAAA,IACxD,WAAW,KAAK,OAAO,QAAQ,KAAK,OAAO,KAAK,KAAK,GAAG;AACtD,WAAK,QAAQ;AACb,WAAK,cAAc,KAAK,IAAA;AAAA,IAC1B;AAEA,SAAK,SAAS,KAAK;AAAA,EACrB;AAAA,EAEQ,SAAS,OAAe;AAC9B,QAAI,CAAC,KAAK,UAAU,KAAK,CAAC,SAAS,KAAK,OAAO,QAAQ,KAAK,KAAK,MAAM,KAAK,GAAG;AAC7E;AAAA,IACF;AAEA,QAAI,UAAU,KAAK,gBAAgB,KAAK;AACxC,eAAW,aAAa,OAAO;AAE/B,QAAI,KAAK,YAAY,KAAK,CAAC,SAAS,KAAK,OAAO,QAAQ,KAAK,KAAK,MAAM,KAAK,GAAG;AAC9E;AAAA,IACF;AAEA,cAAU,WAAW,MAAM;AACzB,YAAM,aAAa,KAAK,UAAU,KAAK,CAAC,SAAS,KAAK,OAAO,QAAQ,KAAK,KAAK,MAAM,KAAK;AAC1F,WAAK,YAAY,KAAK,UAAU;AAChC,WAAK,UAAU,OAAO,KAAK,UAAU,QAAQ,UAAU,GAAG,CAAC;AAC3D,WAAK,OAAA;AAEL,WAAK,OACF,SAAS,WAAW,KAAK,EACzB,KAAK,MAAM;AACV,aAAK,YAAY,OAAO,KAAK,YAAY,QAAQ,UAAU,GAAG,CAAC;AAC/D,aAAK,OAAA;AACL,aAAK,SAAS,KAAK;AAAA,MACrB,CAAC,EACA,MAAM,MAAM;AACX,aAAK,YAAY,OAAO,KAAK,YAAY,QAAQ,UAAU,GAAG,CAAC;AAC/D,aAAK,KAAK,WAAW,KAAK;AAAA,MAC5B,CAAC;AAAA,IACL,GAAG,KAAK,OAAO,OAAO;AAEtB,SAAK,gBAAgB,KAAK,IAAI;AAAA,EAChC;AACF;ACpFO,MAAM,4BAA4B;AAclC,MAAM,aAAiC;AAAA,EAC5C,IAAI;AAAA,EACJ,QAAQ;AACV;AAEA,MAAM,YAAY,CAAC,QAAQ,WAAW,WAAW,UAAU,gBAAgB;AAK3E,MAAM,UACJ,UAAU;AAAA,EACR,WAAW,cAAA;AAAA,EACX,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW,CAAC,OAAO,CAAA;AACrB,CAAC;AAEI,MAAM,YAAY;ACVzB,MAAM,yBAA+C;AAAA,EACnD,QAAQ;AAAA,EACR,gBAAgB,MAAM,QAAQ,QAAQ,CAAA,CAAE;AAC1C;AAOO,MAAM,0BAA0B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAiCO,MAAM,cAAc;AAAA,EAQzB,YAAY,QAA6B;AAPjC;AACA,uCAAqC;AACrC,8CAA4D;AAC5D,wCAA0D,CAAA;AAC1D,iDAA2C,CAAA;AAC3C,2EAAkC,IAAA;AAYnC,mCAAU,YAAY;AAC3B,UAAI,KAAK,aAAa;AACpB;AAAA,MACF;AAEA,UAAI,KAAK,oBAAoB;AAC3B,eAAO,MAAM,KAAK;AAAA,MACpB;AAEA,WAAK,qBAAqB,KAAK,yBAAA;AAC/B,WAAK,cAAc,MAAM,KAAK;AAAA,IAChC;AAEQ,oDAA2B,YAAY;AAC7C,YAAM,UAAU,MAAM,KAAK,QAAQ,QAAS,eAAA;AAE5C,YAAM,aAAa,IAAI,QAAQ,qBAAA,EAC5B,QAAQ,KAAK,QAAQ,QAAS,QAAS;AAAA,QACtC,oBAAoB,KAAK,QAAQ,QAAS,qBACtC,KAAK,QAAQ,QAAS,qBACtB;AAAA,QACJ;AAAA,MAAA,CACD,EACA,uBAAA,EACA,MAAA;AAEH,8BAAwB,QAAQ,CAAC,MAAM;AACrC,mBAAW,GAAG,GAAG,IAAI,SAAS;;AAC5B,qBAAK,aAAa,CAAC,MAAnB,mBAAsB,QAAQ,CAAC,MAAM;AACnC,gBAAI;AACF,gBAAE,IAAI;AAAA,YACR,SAAS,IAAI;AACX,sBAAQ,MAAM,+BAA+B,EAAE;AAAA,YACjD;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAED,iBAAW,cAAc,MAAM,KAAK,sBAAsB,QAAQ,CAAC,eAAe,WAAA,CAAY,CAAC;AAE/F,YAAM,WAAW,MAAA;AACjB,aAAO;AAAA,IACT;AAEO,qCAAY,CACjB,QACA,eACG;AACH,WAAK,UAAU,KAAK,MAAM;AACxB,aAAK,aAAa,MAAM,IAAI,KAAK,aAAa,MAAM,KAAK,CAAA;AACzD,aAAK,aAAa,MAAM,EAAE,KAAK,UAAiB;AAAA,MAClD,CAAC;AACD,aAAO,MAAM,KAAK,aAAa,MAAM,EAAE,OAAO,CAAC,MAAM,MAAM,UAAU;AAAA,IACvE;AAEO,8CAAqB,CAAC,eAA0B;AACrD,WAAK,sBAAsB,KAAK,UAAU;AAC1C,aAAO,MAAM,KAAK,sBAAsB,OAAO,CAAC,MAAM,MAAM,UAAU;AAAA,IACxE;AAMO,oCAAW,OAAO,SAA6B;;AACpD,YAAM,eAAe,IAAI,gBAAA;AAEzB,yCAAM,QAAN,mBAAW,QAAQ,CAAC,OAAO;AACzB,qBAAa,OAAO,OAAO,mBAAmB,EAAE,CAAC;AAAA,MACnD;AAEA,YAAM,EAAE,KAAA,IAAS,MAAM,KAAK,MAAM,IAAe,WAAW,aAAa,SAAA,CAAU,EAAE;AACrF,aAAO;AAAA,IACT;AAEO,8CAAqB,YAAY;AACtC,YAAM,EAAE,KAAA,IAAS,MAAM,KAAK,MAAM,IAAa,YAAY;AAC3D,aAAO;AAAA,IACT;AAEO,yCAAgB,OAAO,YAAkC;AAC9D,YAAM,KAAK,MAAM,IAAI,WAAW,mBAAmB,QAAQ,EAAE,CAAC,IAAI,OAAO;AAAA,IAC3E;AAEO,iCAAQ,YAAY;AACzB,YAAM,EAAE,KAAA,IAAS,MAAM,KAAK,MAAM,IAAoB,MAAM;AAC5D,aAAO;AAAA,IACT;AAEO,gCAAO,OAAO,OAAe;AAClC,YAAM,EAAE,KAAA,IAAS,MAAM,KAAK,MAAM,IAAU,QAAQ,mBAAmB,EAAE,CAAC,EAAE;AAC5E,aAAO;AAAA,IACT;AAEO,mCAAU,OAAO,SAAyB;AAC/C,YAAM,EAAE,SAAS,MAAM,KAAK,MAAM,KAAa,QAAQ,IAAI;AAC3D,aAAO;AAAA,IACT;AAEO,wCAAe,OAAO,SAA2D;AACtF,YAAM,EAAE,QAAAC,SAAQ,OAAO,GAAG,OAAO,OAAO;AACxC,YAAM,aAAa,mBAAmB,KAAK,UAAU,EAAE,MAAM,KAAA,CAAM,CAAC;AACpE,YAAM,EAAE,KAAA,IAAS,MAAM,KAAK,MAAM;AAAA,QAChC,QAAQ,mBAAmBA,OAAM,CAAC,uBAAuB,UAAU;AAAA,MAAA;AAErE,aAAO;AAAA,IACT;AAEO,2CAAkB,OAAO,YAAoC;AAClE,YAAM,EAAE,QAAAA,SAAQ,GAAG,KAAA,IAAS;AAC5B,YAAM,KAAK,MAAM,KAAK,QAAQ,mBAAmBA,OAAM,CAAC,YAAY,IAAI;AAAA,IAC1E;AAEO,2CAAkB,OAAO,YAAoC;AAClE,YAAM,KAAK,MAAM,IAAI,qBAAqB,OAAO;AAAA,IACnD;AAEO,4CAAmB,OAAO,YAAqC;AACpE,YAAM,KAAK,MAAM,OAAO,QAAQ,mBAAmB,QAAQ,MAAM,CAAC,WAAW,EAAE,MAAM,QAAA,CAAS;AAAA,IAChG;AAEO,0CAAiB,OAAO,YAAmC;AAChE,YAAM,KAAK,MAAM,IAAI,QAAQ,mBAAmB,QAAQ,EAAE,CAAC,SAAS,OAAO;AAAA,IAC7E;AAEO,yCAAgB,OAAO,YAAkC;AAC9D,YAAM,KAAK,MAAM,KAAK,QAAQ,mBAAmB,QAAQ,MAAM,CAAC,WAAW,OAAO;AAAA,IACpF;AAEO,6CAAoB,OAAO,EAAE,MAAM,eAAyC;AACjF,YAAM,EAAE,MAAM,OAAO,MAAM,KAAK,MAAM,KAAa,UAAU,mBAAmB,QAAQ,CAAC,YAAY;AAAA,QACnG;AAAA,MAAA,CACD;AACD,aAAO;AAAA,IACT;AAEO,6CAAoB,OAAO,OAAe;AAC/C,YAAM,KAAK,MAAM,IAAI,kBAAkB,mBAAmB,EAAE,CAAC,OAAO;AAAA,IACtE;AAEO,wCAAe,YAAY;AAChC,YAAM,EAAE,KAAA,IAAS,MAAM,KAAK,MAAM,IAAsB,cAAc;AACtE,aAAO;AAAA,IACT;AAEO,kCAAS,OAAO,OAAe;AACpC,YAAM,EAAE,KAAA,IAAS,MAAM,KAAK,MAAM,IAAY,UAAU,mBAAmB,EAAE,CAAC,EAAE;AAChF,aAAO;AAAA,IACT;AAEO,0CAAiB,OAAO;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,IAAA,MAKI;AACJ,YAAM,eAAe,IAAI,gBAAA;AACzB,mBAAa,OAAO,QAAQ,KAAK,SAAA,CAAU;AAC3C,mBAAa,OAAO,QAAQ,KAAK,SAAA,CAAU;AAC3C,YAAM,EAAE,KAAA,IAAS,MAAM,KAAK,MAAM;AAAA,QAChC,UAAU,mBAAmB,QAAQ,CAAC,YAAY,aAAa,UAAU;AAAA,MAAA;AAE3E,aAAO;AAAA,IACT;AAEO,uCAAc,OAAO,IAAY,UAAmB;AACzD,YAAM,KAAK,MAAM,IAAI,UAAU,mBAAmB,EAAE,CAAC,UAAU,EAAE,MAAA,CAAO;AAAA,IAC1E;AAEO,2CAAkB,OAAO,OAAe;AAC7C,YAAM,kBAAkB,KAAK,4BAA4B,IAAI,EAAE,KAAK;AACpE,WAAK,4BAA4B,IAAI,IAAI,kBAAkB,CAAC;AAE5D,UAAI,oBAAoB,GAAG;AACzB,aAAK,UAAU,KAAK,MAAM,KAAK,YAAY,OAAO,mBAAmB,EAAE,CAAC;AAAA,MAC1E;AAAA,IACF;AAEO,gDAAuB,OAAO,OAAe;AAClD,YAAM,kBAAkB,KAAK,4BAA4B,IAAI,EAAE,KAAK;AACpE,WAAK,4BAA4B,IAAI,IAAI,KAAK,IAAI,GAAG,kBAAkB,CAAC,CAAC;AAEzE,UAAI,oBAAoB,GAAG;AACzB,aAAK,UAAU,KAAK,MAAM,KAAK,YAAY,OAAO,wBAAwB,EAAE,CAAC;AAAA,MAC/E;AAAA,IACF;AArME,SAAK,UAAU;AAAA,MACb,GAAG;AAAA,MACH,SAAS;AAAA,QACP,GAAG;AAAA,QACH,GAAG,OAAO;AAAA,MAAA;AAAA,IACZ;AAAA,EAEJ;AAAA,EA8DA,IAAW,QAAQ;AACjB,WAAO,KAAK,QAAQ;AAAA,EACtB;AA+HF;AAEO,SAAS,eAAe,aAAgC;AAC7D,QAAM,SAAS,MAAM,YAAY,QAAQ,CAAC,MAAM,GAAG;AACnD,SAAO,OAAO,CAAC,YAA0B,QAAQ,KAAK,MAAM;AAC5D,SAAO;AACT;ACxQA,MAAM,4BAA4B,IAAI,SAAiB;AAAA,EACrD,UAAU,CAAC,OAAO,WAAW,OAAO,kBAAkB,EAAE;AAAA,EACxD,SAAS,CAAC,GAAG,MAAM,CAAC,EAAE,cAAc,CAAC;AAAA,EACrC,SAAS,CAAC,OAAO,qBAAqB,EAAE,EAAE,CAAC;AAAA,EAC3C,SAAS;AACX,CAAC;AAED,MAAM,0BAA0B,IAAI,SAAiB;AAAA,EACnD,UAAU,CAAC,OAAO,WAAW,OAAO,gBAAgB,EAAE,IAAI;AAAA,EAC1D,SAAS,CAAC,GAAG,MAAM,CAAC,EAAE,cAAc,CAAC;AAAA,EACrC,SAAS,CAAC,OAAO,OAAO,EAAE;AAAA,EAC1B,SAAS;AACX,CAAC;AAED,MAAM,eAAe,UAAU,gBAAgB;AAAA,EAC7C,WAAW,CAAC,aAAa;AAAA;AAAA;AAAA;AAAA,IAKvB,gBAAgB,QAAQ,MAAqC;AAAA,MAC3D,SAAS,OAAO,UAAU,EAAE,MAAM,MAAM,WAAW,OAAO,SAAS,IAAI;MACvE,cAAc,CAAC,SAAS;AAAA,IAAA,CACzB;AAAA,IAED,sBAAsB,QAAQ,MAA4B;AAAA,MACxD,SAAS,aAAa,EAAE,MAAM,MAAM,WAAW,OAAO;MACtD,cAAc,CAAC,SAAS;AAAA,IAAA,CACzB;AAAA,IAED,eAAe,QAAQ,SAAqC;AAAA,MAC1D,SAAS,OAAO,YAAY;AAC1B,cAAM,WAAW,OAAO,cAAc,OAAO;AAC7C,eAAO,EAAE,MAAM,KAAA;AAAA,MACjB;AAAA,MACA,iBAAiB,CAAC,SAAS;AAAA,IAAA,CAC5B;AAAA;AAAA;AAAA;AAAA,IAMD,SAAS,QAAQ,MAA4B;AAAA,MAC3C,SAAS,OAAO,EAAE,GAAA,OAAU,EAAE,MAAM,MAAM,WAAW,OAAO,KAAK,EAAE;MACnE,cAAc,CAAC,QAAQ,SAAS;AAAA,MAChC,mBAAmB,OAAO,EAAE,GAAA,GAAM,EAAE,mBAAmB,iBAAiB,uBAAuB;AAC7F,cAAM;AAEN;AAAA,UACE,WAAW,OAAO;AAAA,YAChB;AAAA,YACA,CAAC,CAACA,SAAQ,GAAG,SAAS,SAAA,EAAW,IAAI,MACnCA,YAAW,MACX,iBAAiB,CAAC,SAAS;AACzB,mBAAK,QAAQ,KAAK,OAAO;AACzB,mBAAK,oBAAoB,OAAO,QAAQ,KAAK,KAAK;AAAA,YACpD,CAAC;AAAA,UAAA;AAAA,UAEL,WAAW,OAAO;AAAA,YAChB;AAAA,YACA,CAAC,CAACA,SAAQ,WAAA,EAAa,SAAS,IAAI,MAClC,OAAOA,WACP,iBAAiB,CAAC,SAAS;AACzB,mBAAK,UAAU,KAAK,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,SAAS;AAC5D,mBAAK,oBAAoB,OAAO,QAAQ,KAAK,KAAK;AAAA,YACpD,CAAC;AAAA,UAAA;AAAA,UAEL,WAAW,OAAO;AAAA,YAChB;AAAA,YACA,CAAC,CAACA,SAAQ,SAAS,SAAS,IAAI,MAC9B,OAAOA,WACP,iBAAiB,CAAC,SAAS;AACzB,mBAAK,OAAO;AACZ,mBAAK,oBAAoB,OAAO,QAAQ,KAAK,KAAK;AAAA,YACpD,CAAC;AAAA,UAAA;AAAA,UAEL,WAAW,OAAO;AAAA,YAChB;AAAA,YACA,CAAC,CAAC,OAAO,MACP,OAAO,QAAQ,UACf,iBAAiB,CAAC,SAAS;AACzB,mBAAK,oBACH,QAAQ,OAAO,OAAO,WAAW,OAAO,QAAQ,KAAK,KAAK;AAAA,YAC9D,CAAC;AAAA,UAAA;AAAA,UAEL,WAAW,OAAO;AAAA,YAChB;AAAA,YACA,CAAC,CAAC,MAAM,MACN,OAAO,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,KAClC,iBAAiB,CAAC,SAAS;AACzB,oBAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE;AAChD,mBAAK,oBAAoB,MAAM;AAAA,YACjC,CAAC;AAAA,UAAA;AAAA,QACL,EACA,KAAK,iBAAiB;AAAA,MAC1B;AAAA,IAAA,CACD;AAAA,IAED,SAAS,QAAQ,SAAsD;AAAA,MACrE,SAAS,OAAO,EAAE,MAAM,cAAc;AACpC,cAAMA,UAAS,MAAM,WAAW,OAAO,QAAQ;AAAA,UAC7C;AAAA,UACA;AAAA,QAAA,CACD;AACD,eAAO,EAAE,MAAMA,QAAAA;AAAAA,MACjB;AAAA,IAAA,CACD;AAAA,IAED,gBAAgB,QAAQ,SAA6C;AAAA,MACnE,SAAS,OAAO,EAAE,IAAI,WAAW;AAC/B,cAAM,WAAW,OAAO,eAAe,EAAE,IAAI,MAAM;AACnD,eAAO,EAAE,MAAM,KAAA;AAAA,MACjB;AAAA,IAAA,CACD;AAAA;AAAA;AAAA;AAAA,IAMD,aAAa,QAAQ,MAA4B;AAAA,MAC/C,SAAS,aAAa,EAAE,MAAM,MAAM,WAAW,OAAO;MACtD,cAAc,CAAC,QAAQ,SAAS;AAAA,MAChC,mBAAmB,OAAO,GAAG,EAAE,mBAAmB,iBAAiB,uBAAuB;AACxF,cAAM;AAEN;AAAA,UACE,WAAW,OAAO;AAAA,YAAU;AAAA,YAA0B,CAAC,CAAC,IAAI,MAC1D,iBAAiB,CAAC,aAAa;AAC7B,uBAAS,KAAK,IAAI;AAAA,YACpB,CAAC;AAAA,UAAA;AAAA,UAGH,WAAW,OAAO;AAAA,YAAU;AAAA,YAA8B,CAAC,CAAC,OAAO,MACjE,iBAAiB,CAAC,aAAa;AAC7B,oBAAM,OAAO,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ,MAAM;AAEzD,kBAAI,CAAC,MAAM;AACT;AAAA,cACF;AAEA,mBAAK,UAAU;AAEf,kBAAI,QAAQ,OAAO,OAAO,WAAW,MAAM;AACzC,qBAAK,oBAAoB,QAAQ;AACjC,qBAAK,mBAAmB;AAAA,cAC1B;AAEA,kBAAI,QAAQ,OAAO,OAAO,WAAW,MAAM;AACzC,qBAAK;AAAA,cACP;AAAA,YACF,CAAC;AAAA,UAAA;AAAA,UAEH,WAAW,OAAO;AAAA,YAAU;AAAA,YAA+B,CAAC,CAAC,MAAM,MACjE,iBAAiB,CAAC,aAAa;AAC7B,yBAAW,SAAS,QAAQ;AAC1B,sBAAM,OAAO,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM,MAAM;AAEvD,oBAAI,CAAC,MAAM;AACT;AAAA,gBACF;AAEA,qBAAK,oBAAoB,MAAM;AAC/B,qBAAK,mBAAmB,KAAK,mBAAmB,MAAM;AAAA,cACxD;AAAA,YACF,CAAC;AAAA,UAAA;AAAA,UAEH,WAAW,OAAO;AAAA,YAChB;AAAA,YACA,CAAC,CAACA,SAAQ,UAAU,SAAS,SAAA,EAAW,IAAI,MAC1C,iBAAiB,CAAC,aAAa;AAC7B,oBAAM,OAAO,SAAS,KAAK,CAAC,MAAM,EAAE,OAAOA,OAAM;AAEjD,kBAAI,QAAQ,OAAO,WAAW,GAAA,KAAQ,CAAC,MAAM;AAC3C,yBAAS,KAAK;AAAA,kBACZ,IAAIA;AAAAA,kBACJ,MAAM;AAAA,kBACN;AAAA,kBACA,kBAAkB,OAAO,IAAI;AAAA,kBAC7B,QAAQ;AAAA,kBACR,mBAAmB,OAAO,QAAQ,KAAK;AAAA,gBAAA,CACxC;AAAA,cACH;AAEA,kBAAI,CAAC,MAAM;AACT;AAAA,cACF;AAEA,mBAAK,UAAU;AACf,mBAAK,SAAS;AAEd,kBAAI,MAAM;AACR,qBAAK,mBAAmB;AACxB,qBAAK,oBAAoB,QAAQ;AAAA,cACnC,OAAO;AACL,qBAAK;AAAA,cACP;AAAA,YACF,CAAC;AAAA,UAAA;AAAA,UAEL,WAAW,OAAO;AAAA,YAChB;AAAA,YACA,CAAC,CAACA,SAAQ,WAAW,eAAe,SAAS,IAAI,MAC/C,iBAAiB,CAAC,aAAa;AAC7B,kBAAI,cAAc,WAAW,GAAA,KAAQ,eAAe;AAClD,uBAAO,SAAS,OAAO,CAAC,MAAM,EAAE,OAAOA,OAAM;AAAA,cAC/C;AAEA,oBAAM,OAAO,SAAS,KAAK,CAAC,MAAM,EAAE,OAAOA,OAAM;AAEjD,kBAAI,CAAC,MAAM;AACT;AAAA,cACF;AAEA,mBAAK,UAAU;AAEf,kBAAI,cAAc,WAAW,MAAM;AACjC,qBAAK,SAAS;AAAA,cAChB;AAEA,kBAAI,CAAC,MAAM;AACT,qBAAK;AAAA,cACP,OAAO;AACL,qBAAK,mBAAmB;AACxB,qBAAK,oBAAoB,QAAQ;AAAA,cACnC;AAAA,YACF,CAAC;AAAA,UAAA;AAAA,UAEL,WAAW,OAAO;AAAA,YAAU;AAAA,YAA+B,CAAC,CAACA,SAAQ,SAAS,SAAS,IAAI,MACzF,iBAAiB,CAAC,aAAa;AAC7B,oBAAM,OAAO,SAAS,KAAK,CAAC,MAAM,EAAE,OAAOA,OAAM;AACjD,kBAAI,CAAC,KAAM;AAEX,mBAAK,OAAO;AACZ,mBAAK,UAAU;AAEf,kBAAI,CAAC,MAAM;AACT,qBAAK;AAAA,cACP,OAAO;AACL,qBAAK,mBAAmB;AACxB,qBAAK,oBAAoB,QAAQ;AAAA,cACnC;AAAA,YACF,CAAC;AAAA,UAAA;AAAA,QACH,EACA,KAAK,iBAAiB;AAAA,MAC1B;AAAA,IAAA,CACD;AAAA;AAAA;AAAA;AAAA,IAMD,kBAAkB,QAAQ,SAAwC;AAAA,MAChE,SAAS,OAAO,SAAS;AACvB,cAAM,WAAW,OAAO,iBAAiB,IAAI;AAC7C,eAAO,EAAE,MAAM,KAAA;AAAA,MACjB;AAAA,IAAA,CACD;AAAA,IAED,eAAe,QAAQ,SAAqC;AAAA,MAC1D,SAAS,OAAO,SAAS;AACvB,cAAM,WAAW,OAAO,cAAc,IAAI;AAC1C,eAAO,EAAE,MAAM,KAAA;AAAA,MACjB;AAAA,IAAA,CACD;AAAA;AAAA;AAAA;AAAA,IAMD,oBAAoB,QAAQ,MAAiD;AAAA,MAC3E,SAAS,OAAO,EAAE,QAAAA,cAAa;AAC7B,cAAM,WAAW,MAAM,WAAW,OAAO,aAAa;AAAA,UACpD,QAAAA;AAAAA,UACA,MAAM;AAAA,UACN,MAAM,4BAA4B;AAAA,QAAA,CACnC;AACD,eAAO;AAAA,UACL,MAAM;AAAA,YACJ,UAAU,SAAS,MAAM,GAAG,yBAAyB;AAAA,YACrD,SAAS,SAAS,WAAW,4BAA4B;AAAA,UAAA;AAAA,QAC3D;AAAA,MAEJ;AAAA,MACA,cAAc,CAAC,WAAW,QAAQ,SAAS;AAAA,MAC3C,mBAAmB,OAAO,EAAE,QAAAA,QAAAA,GAAU,EAAE,UAAU,mBAAmB,sBAAsB;AACzF,cAAM;AAEN;AAAA,UACE,WAAW,OAAO,UAAU,8BAA8B,CAAC,CAAC,OAAO,MAAM;AACvE,oBAAQ,WAAWA,WACjB;AAAA,cACE,WAAW,KAAK,gBAAgB,sBAAsB,EAAE,QAAAA,QAAAA,GAAU,CAAC,UAAU;AAC3E,sBAAM,SAAS,QAAQ,OAAO;AAAA,cAChC,CAAC;AAAA,YAAA;AAAA,UAEP,CAAC;AAAA,UAED,WAAW,OAAO,UAAU,+BAA+B,CAAC,CAAC,aAAA,EAAA,EAAiB,OAAO,MAAM;AACzF,4BAAgBA,WACd;AAAA,cACE,WAAW,KAAK,gBAAgB,sBAAsB,EAAE,QAAAA,QAAAA,GAAU,CAAC,UAAU;AAC3E,sBAAM,SAAS,QAAQ,OAAO;AAAA,cAChC,CAAC;AAAA,YAAA;AAAA,UAEP,CAAC;AAAA,UAED,WAAW,OAAO,UAAU,iCAAiC,CAAC,CAAC,aAAA,EAAA,EAAiB,OAAO,MAAM;AAC3F,4BAAgBA,WACd;AAAA,cACE,WAAW,KAAK,gBAAgB,sBAAsB,EAAE,QAAAA,QAAAA,GAAU,CAAC,UAAU;AAC3E,sBAAM,SAAS,QAAQ,OAAO;AAAA,cAChC,CAAC;AAAA,YAAA;AAAA,UAEP,CAAC;AAAA,UAED,WAAW,OAAO,UAAU,+BAA+B,CAAC,CAAC,aAAA,EAAe,OAAO,MAAM;AACvF,4BAAgBA,WACd;AAAA,cACE,WAAW,KAAK,gBAAgB,sBAAsB,EAAE,QAAAA,QAAAA,GAAU,CAAC,UAAU;AAC3E,sBAAM,SAAS,QAAQ,OAAO;AAAA,cAChC,CAAC;AAAA,YAAA;AAAA,UAEP,CAAC;AAAA,QAAA,EACD,KAAK,iBAAiB;AAAA,MAC1B;AAAA,IAAA,CACD;AAAA,IAED,0BAA0B,QAAQ,SAAmC;AAAA,MACnE,SAAS,OAAO,EAAE,QAAAA,WAAU,EAAE,eAAe;AAC3C,cAAM,UAAU,WAAW,UAAU,mBAAmB,OAAO,EAAE,QAAAA,QAAAA,CAAQ,EAAE,UAAiB;AAC5F,cAAM,WAAW,MAAM,WAAW,OAAO,aAAa;AAAA,UACpD,QAAAA;AAAAA,UACA,MAAM,QAAQ,KAAM,SAAS;AAAA,UAC7B,MAAM,4BAA4B;AAAA,QAAA,CACnC;AACD,eAAO;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,YACJ,UAAU,SAAS,MAAM,GAAG,yBAAyB;AAAA,YACrD,SAAS,SAAS,WAAW,4BAA4B;AAAA,UAAA;AAAA,QAC3D;AAAA,MAEJ;AAAA,MACA,gBAAgB,OAAO,EAAE,QAAAA,WAAU,EAAE,UAAU,qBAAqB;AAClE,cAAM,SAAS,MAAM;AACrB,cAAM,OAA8B,OAAO;AAE3C;AAAA,UACE,WAAW,KAAK,gBAAgB,sBAAsB,EAAE,QAAAA,QAAAA,GAAU,CAAC,UAAU;AAC3E,kBAAM,UAAU,KAAK;AACrB,kBAAM,SAAS,KAAK,GAAG,KAAM,QAAQ;AAAA,UACvC,CAAC;AAAA,QAAA;AAAA,MAEL;AAAA,IAAA,CACD;AAAA,IAED,iBAAiB,QAAQ,SAAuC;AAAA,MAC9D,SAAS,OAAO,EAAE,QAAAA,SAAQ,MAAM,YAAY;AAC1C,cAAM,WAAW,OAAO,gBAAgB;AAAA,UACtC,QAAAA;AAAAA,UACA;AAAA,UACA;AAAA,QAAA,CACD;AAED,eAAO,EAAE,MAAM,KAAA;AAAA,MACjB;AAAA,IAAA,CACD;AAAA,IAED,iBAAiB,QAAQ,SAA+B;AAAA,MACtD,SAAS,YAAY;AACnB,eAAO,EAAE,MAAM,KAAA;AAAA,MACjB;AAAA,MACA,gBAAgB,OAAO,EAAE,MAAM,EAAE,eAAe;AAC9C,gCAAwB,KAAK,EAAE;AAC/B,iBAAS,WAAW,UAAU,wBAAwB,SAAS,QAAW,EAAE,cAAc,KAAA,CAAM,CAAC;AAAA,MACnG;AAAA,IAAA,CACD;AAAA,IAED,yBAAyB,QAAQ,MAAqC;AAAA,MACpE,SAAS,aAAa,EAAE,MAAM,wBAAwB,MAAA;AAAA,MACtD,mBAAmB,OAAO,GAAG,EAAE,UAAU,wBAAwB;AAC/D;AAAA,UACE,wBAAwB,UAAU,CAAC,UAAU;AAC3C;AAAA,cACE,WAAW,KAAK,gBAAgB,2BAA2B,QAAW,MAAM,MAAM,KAAK;AAAA,YAAA;AAAA,UAE3F,CAAC;AAAA,QAAA,EACD,KAAK,iBAAiB;AAAA,MAC1B;AAAA,IAAA,CACD;AAAA;AAAA;AAAA;AAAA,IAKD,oBAAoB,QAAQ,MAAmC;AAAA,MAC7D,SAAS,YAAY;AACnB,cAAM,UAAU,MAAM,WAAW,OAAO,aAAA;AACxC,eAAO,EAAE,MAAM,QAAA;AAAA,MACjB;AAAA,MACA,cAAc,CAAC,WAAW,QAAQ;AAAA,MAClC,mBAAmB,OAAO,GAAG,EAAE,mBAAmB,iBAAiB,uBAAuB;AACxF,cAAM;AAEN;AAAA,UACE,WAAW,OAAO;AAAA,YAChB;AAAA,YACA,CAAC,CAAC,QAAQ,KAAK,MACb,SACA,iBAAiB,CAAC,YAAY;AAC5B,sBAAQ,KAAK,MAAM;AAAA,YACrB,CAAC;AAAA,UAAA;AAAA,UAEL,WAAW,OAAO;AAAA,YAAU;AAAA,YAAgC,CAAC,CAAC,UAAU,SAAS,SAAS,MACxF,iBAAiB,CAAC,YAAY;AAC5B,oBAAM,SAAS,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ;AACpD,kBAAI,CAAC,OAAQ;AAEb,qBAAO,cAAc;AAErB,kBAAI,cAAc,WAAW,MAAM;AACjC,uBAAO,oBAAoB,QAAQ;AAAA,cACrC;AAAA,YACF,CAAC;AAAA,UAAA;AAAA,UAEH,WAAW,OAAO;AAAA,YAAU;AAAA,YAAiC,CAAC,CAAC,UAAU,SAAS,MAChF,iBAAiB,CAAC,YAAY;AAC5B,oBAAM,SAAS,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ;AACpD,kBAAI,CAAC,OAAQ;AAEb,qBAAO,oBAAoB;AAAA,YAC7B,CAAC;AAAA,UAAA;AAAA,UAEH,WAAW,OAAO;AAAA,YAAU;AAAA,YAAgC,CAAC,CAAC,MAAM,MAClE,iBAAiB,CAAC,YAAY;AAC5B,sBAAQ,KAAK,MAAM;AAAA,YACrB,CAAC;AAAA,UAAA;AAAA,UAEH,WAAW,OAAO;AAAA,YAAU;AAAA,YAAkC,CAAC,CAAC,EAAE,MAChE,iBAAiB,CAAC,YAAY;AAC5B,oBAAM,QAAQ,QAAQ,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE;AAClD,kBAAI,UAAU,GAAI,SAAQ,OAAO,OAAO,CAAC;AAAA,YAC3C,CAAC;AAAA,UAAA;AAAA,UAEH,WAAW,OAAO;AAAA,YAAU;AAAA,YAA4B,CAAC,CAAC,UAAU,UAAU,MAC5E,iBAAiB,CAAC,YAAY;AAC5B,oBAAM,SAAS,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ;AACpD,kBAAI,CAAC,OAAQ;AAEb,qBAAO,OAAO;AAAA,YAChB,CAAC;AAAA,UAAA;AAAA,QACH,EACA,KAAK,iBAAiB;AAAA,MAC1B;AAAA,IAAA,CACD;AAAA,IAED,WAAW,QAAQ,MAA8B;AAAA,MAC/C,SAAS,OAAO,EAAE,SAAS;AACzB,cAAM,UAAU,MAAM,WAAW,OAAO,OAAO,EAAE;AACjD,eAAO,EAAE,MAAM,QAAA;AAAA,MACjB;AAAA,MACA,cAAc,CAAC,WAAW,QAAQ;AAAA,MAClC,mBAAmB,OAAO,EAAE,GAAA,GAAM,EAAE,mBAAmB,iBAAiB,uBAAuB;AAC7F,cAAM;AAEN;AAAA,UACE,WAAW,OAAO;AAAA,YAChB;AAAA,YACA,CAAC,CAAC,UAAU,SAAS,MACnB,OAAO,YACP,iBAAiB,CAAC,MAAM;AACtB,gBAAE,oBAAoB;AAAA,YACxB,CAAC;AAAA,UAAA;AAAA,UAEL,WAAW,OAAO;AAAA,YAChB;AAAA,YACA,CAAC,CAAC,UAAU,SAAS,SAAS,MAC5B,OAAO,YACP,iBAAiB,CAAC,WAAW;AAC3B,qBAAO,gBAAgB,QAAQ;AAC/B,qBAAO,oBACL,cAAc,WAAW,OAAO,QAAQ,KAAK,OAAO;AAAA,YACxD,CAAC;AAAA,UAAA;AAAA,UAEL,WAAW,OAAO;AAAA,YAChB;AAAA,YACA,CAAC,CAAC,cAAc,MACd,OAAO,eAAe,MACtB,iBAAiB,CAAC,WAAW;;AAC3B,qBAAO,QAAQ;AACf,qBAAO,kBAAgB,oBAAe,gBAAf,mBAA4B,OAAM;AACzD,qBAAO,oBAAoB,eAAe,qBAAqB;AAAA,YACjE,CAAC;AAAA,UAAA;AAAA,UAEL,WAAW,OAAO;AAAA,YAChB;AAAA,YACA,CAAC,CAAC,QAAQ,MACR,OAAO,YACP,iBAAiB,CAAC,WAAW;AAC3B,qBAAO,QAAQ;AAAA,YACjB,CAAC;AAAA,UAAA;AAAA,UAEL,WAAW,OAAO;AAAA,YAChB;AAAA,YACA,CAAC,CAAC,UAAU,UAAU,MACpB,OAAO,YACP,iBAAiB,CAAC,WAAW;AAC3B,qBAAO,OAAO;AAAA,YAChB,CAAC;AAAA,UAAA;AAAA,QACL,EACA,KAAK,iBAAiB;AAAA,MAC1B;AAAA,IAAA,CACD;AAAA,IAED,aAAa,QAAQ,SAA+C;AAAA,MAClE,SAAS,OAAO,EAAE,IAAI,YAAY;AAChC,cAAM,WAAW,OAAO,YAAY,IAAI,KAAK;AAC7C,eAAO,EAAE,MAAM,KAAA;AAAA,MACjB;AAAA,IAAA,CACD;AAAA;AAAA;AAAA;AAAA,IAMD,sBAAsB,QAAQ,MAA+C;AAAA,MAC3E,SAAS,OAAO,SAAS;AACvB,cAAM,cAAc;AAAA,UAClB,MAAM;AAAA,UACN,MAAM,4BAA4B;AAAA,UAClC,GAAG;AAAA,QAAA;AAEL,cAAM,WAAW,MAAM,WAAW,OAAO,eAAe,WAAW;AACnE,eAAO;AAAA,UACL,MAAM;AAAA,YACJ,UAAU,SAAS,MAAM,GAAG,yBAAyB;AAAA,YACrD,SAAS,SAAS,WAAW,4BAA4B;AAAA,UAAA;AAAA,QAC3D;AAAA,MAEJ;AAAA,MACA,cAAc,CAAC,WAAW,UAAU,gBAAgB;AAAA,MACpD,mBAAmB,OAAO,EAAE,SAAA,GAAY,EAAE,mBAAmB,iBAAiB,uBAAuB;AACnG,cAAM;AAEN;AAAA,UACE,WAAW,OAAO,UAAU,gCAAgC,CAAC,CAAC,WAAW,OAAO,MAAM;AACpF,yBAAa,aACX,iBAAiB,CAAC,gBAAgB;AAChC,eAAC,YAAY,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ,EAAE,KACnD,YAAY,SAAS,QAAQ,OAAO;AAAA,YACxC,CAAC;AAAA,UACL,CAAC;AAAA,QAAA,EACD,KAAK,iBAAiB;AAAA,MAC1B;AAAA,IAAA,CACD;AAAA,IAED,4BAA4B,QAAQ,SAAqC;AAAA,MACvE,SAAS,OAAO,EAAE,YAAY,EAAE,eAAe;AAC7C,cAAM,UAAU,WAAW,UAAU,qBAAqB,OAAO,EAAE,SAAA,CAAU,EAAE,UAAiB;AAChG,cAAM,WAAW,MAAM,WAAW,OAAO,eAAe;AAAA,UACtD;AAAA,UACA,MAAM,QAAQ,KAAM,SAAS;AAAA,UAC7B,MAAM,4BAA4B;AAAA,QAAA,CACnC;AACD,eAAO;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,YACJ,UAAU,SAAS,MAAM,GAAG,yBAAyB;AAAA,YACrD,SAAS,SAAS,WAAW,4BAA4B;AAAA,UAAA;AAAA,QAC3D;AAAA,MAEJ;AAAA,MACA,gBAAgB,OAAO,EAAE,SAAA,GAAY,EAAE,UAAU,qBAAqB;AACpE,cAAM,SAAS,MAAM;AACrB,cAAM,OAA0B,OAAO;AAEvC;AAAA,UACE,WAAW,KAAK,gBAAgB,wBAAwB,EAAE,SAAA,GAAY,CAAC,UAAU;AAC/E,kBAAM,UAAU,KAAK;AACrB,kBAAM,SAAS,KAAK,GAAG,KAAM,QAAQ;AAAA,UACvC,CAAC;AAAA,QAAA;AAAA,MAEL;AAAA,IAAA,CACD;AAAA,IAED,mBAAmB,QAAQ,SAA2C;AAAA,MACpE,SAAS,OAAO,SAAS;AACvB,cAAM,KAAK,MAAM,WAAW,OAAO,kBAAkB,IAAI;AACzD,eAAO,EAAE,MAAM,GAAA;AAAA,MACjB;AAAA,IAAA,CACD;AAAA,IAED,mBAAmB,QAAQ,SAA+B;AAAA,MACxD,SAAS,YAAY;AACnB,eAAO,EAAE,MAAM,KAAA;AAAA,MACjB;AAAA,MACA,gBAAgB,OAAO,EAAE,MAAM,EAAE,eAAe;AAC9C,kCAA0B,KAAK,EAAE;AACjC,iBAAS,WAAW,UAAU,0BAA0B,SAAS,QAAW,EAAE,cAAc,KAAA,CAAM,CAAC;AAAA,MACrG;AAAA,IAAA,CACD;AAAA,IAED,2BAA2B,QAAQ,MAAqC;AAAA,MACtE,SAAS,aAAa,EAAE,MAAM,0BAA0B,MAAA;AAAA,MACxD,mBAAmB,OAAO,GAAG,EAAE,UAAU,wBAAwB;AAC/D;AAAA,UACE,0BAA0B,UAAU,CAAC,UAAU;AAC7C;AAAA,cACE,WAAW,KAAK,gBAAgB,6BAA6B,QAAW,MAAM,MAAM,KAAK;AAAA,YAAA;AAAA,UAE7F,CAAC;AAAA,QAAA,EACD,KAAK,iBAAiB;AAAA,MAC1B;AAAA,IAAA,CACD;AAAA,EAAA;AAEL,CAAC;AAEM,SAAS,gBAAgB,IAAmB;AACjD,SAAO;AAAA,IAAY,CAAC,UAAA;;AAClB,mBAAM,QACF,kBAAa,UAAU,YACpB,OAAA,EAAS,KAAK,EACd,SAFH,mBAES,KAAK,CAAC,MAAM,EAAE,OAAO,MAC9B;AAAA;AAAA,EAAA;AAER;AAEO,SAAS,8BAA8B;AAC5C,QAAM,EAAE,MAAM,SAAS,GAAG,MAAA,IAAU,WAAW,2BAAA;AAC/C,QAAM,QAAQ,QAAQ,MAAO,WAAW,OAAO,0BAA0B,OAAO,IAAI,MAAO,CAAC,OAAO,CAAC;AACpG,SAAO,CAAC,OAAO,KAAK;AACtB;AAQO,MAAM,aAAyB,OAAO,OAAO,cAAc;AAAA,EAChE,UAAU;AAAA,EACV;AAAA,EACA;AACF,CAAC;ACzpBD,MAAM,UAA2B;AAAA,EAC/B,CAAC,OAAoBF,gBAA8C;AACjE,UAAM,EAAE,YAAY;AAEpB,+BAAQG,UAAA,EAAW,KAAKH,aAAY,KAAK,QAAQ,QAAQ;AAAA,EAC3D;AACF;AAEA,QAAQ,cAAc;AAEf,MAAM,SAAS,UAAU,UAAU,OAAO;ACNjD,SAAS,OAAOE,SAAgB,WAAmB,aAAsB;AACvE,QAAM,CAAC,KAAK,KAAK,IAAI,WAAW,yBAAA;AAChC,QAAM,QAAQ;AAAA,IACZ,MAAM,IAAI,EAAE,QAAAA,SAAQ,WAAW,aAAa;AAAA,IAC5C,CAAC,KAAKA,SAAQ,WAAW,WAAW;AAAA,EAAA;AAEtC,SAAO,CAAC,OAAO,KAAK;AACtB;AAEA,SAAS,UAAUA,SAAgB,WAAmB,eAAwB;AAC5E,QAAM,CAAC,QAAQ,KAAK,IAAI,WAAW,4BAAA;AACnC,QAAM,WAAW;AAAA,IACf,MAAM,OAAO,EAAE,QAAAA,SAAQ,WAAW,eAAe;AAAA,IACjD,CAAC,QAAQA,SAAQ,WAAW,aAAa;AAAA,EAAA;AAE3C,SAAO,CAAC,UAAU,KAAK;AACzB;AAEA,MAAM,qBAAqB,UAAU,sBAAsB,CAAC,UAAmC;AAC7F,QAAM,EAAE,QAAAA,YAAW;AACnB,QAAM,EAAE,MAAM,SAAS,WAAW,gBAAgB,EAAE,IAAIA,SAAQ;AAChE,QAAM,EAAE,MAAM,SAAA,IAAa,WAAW,uBAAuB,CAAA,CAAE;AAC/D,QAAM,UAAU,SAAU,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM,EAAE;AACvD,QAAM,WAAW,KAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ,EAAE;AAC9D,QAAM,CAAC,mBAAmB,IAAI,OAAOA,SAAQ,QAAQ,IAAI,KAAK;AAC9D,QAAM,CAAC,gBAAgB,IAAI,OAAOA,SAAQ,QAAQ,IAAI,IAAI;AAC1D,QAAM,CAAC,mBAAmB,IAAI,UAAUA,SAAQ,QAAQ,IAAI,KAAK;AACjE,QAAM,CAAC,qBAAqB,IAAI,UAAUA,SAAQ,QAAQ,IAAI,IAAI;AAElE,SACE;AAAA,IAAC,KAAK;AAAA,IAAL;AAAA,MACC,WAAU;AAAA,MACV,SACE,WACI;AAAA,4BACG,SAAA,EAAqB,OAAM,yBAC1B,UAAA,oBAAC,UAAO,SAAS,qBAAqB,MAAK,QAAO,MAAM,oBAAC,MAAA,EAAK,MAAK,iBAAgB,EAAA,CAAI,KAD5E,QAEb;AAAA,QACA,oBAAC,SAAA,EAAoC,OAAM,2BACzC,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS;AAAA,YACT,MAAK;AAAA,YACL,MAAM,oBAAC,MAAA,EAAK,MAAK,+BAAA,CAA+B;AAAA,UAAA;AAAA,QAAA,KAJvC,uBAMb;AAAA,MAAA,IAEF;AAAA,4BACG,SAAA,EAA6B,OAAM,oBAClC,UAAA,oBAAC,UAAO,SAAS,qBAAqB,MAAK,QAAO,MAAM,oBAAC,MAAA,EAAK,MAAK,cAAa,EAAA,CAAI,KADzE,gBAEb;AAAA,QACA,oBAAC,SAAA,EAAkB,OAAM,uBACvB,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS;AAAA,YACT,MAAK;AAAA,YACL,MAAM,oBAAC,MAAA,EAAK,MAAK,0BAAA,CAA0B;AAAA,UAAA;AAAA,QAAA,KAJlC,KAMb;AAAA,MAAA;AAAA,MAIR,+BAAC,OAAA,EACC,UAAA;AAAA,QAAA,oBAAC,UAAO,SAAkB;AAAA,QAC1B,oBAAC,QAAA,EAAM,UAAA,QAAQ,KAAA,CAAK;AAAA,MAAA,EAAA,CACtB;AAAA,IAAA;AAAA,EAAA;AAGN,CAAC;AAEM,MAAM,mBAAmB,UAAU,oBAAoB,MAAM;AAClE,QAAM,EAAE,GAAA,IAAO,eAAA;AACf,QAAM,EAAE,MAAM,KAAA,IAAS,WAAW,gBAAgB,EAAE,IAAI;AACxD,QAAM,EAAE,MAAM,SAAA,IAAa,WAAW,uBAAuB,CAAA,CAAE;AAC/D,QAAM,UAAU;AAAA,IACd,MACE,qCACI,QACD;AAAA,MACC,CAAC,GAAG,QACD,6BAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAM,OAAO,OAClD,6BAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAM,OAAO,KACnD,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA;AAAA,IAEnC,CAAC,UAAU,IAAI;AAAA,EAAA;AAGjB,MAAI,EAAC,6BAAM,YAAW,CAAC,UAAU;AAC/B,WAAO;AAAA,EACT;AAEA,SACE,oBAAC,OAAA,EAAI,WAAU,6BACb,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,YAAY;AAAA,MACZ,YAAY,CAAC,SAAS,oBAAC,sBAAmB,IAAI,KAAK,IAAI,QAAQ,GAAA,CAAI;AAAA,IAAA;AAAA,EAAA,GAEvE;AAEJ,CAAC;ACxGM,MAAM,qBAAqB,UAAU,sBAAsB,MAAM;AACtE,QAAM,EAAE,GAAA,IAAO,eAAA;AACf,QAAM,EAAE,MAAM,KAAA,IAAS,WAAW,gBAAgB,EAAE,IAAI;AAExD,MAAI,EAAC,6BAAM,UAAS;AAClB,WAAO;AAAA,EACT;AAEA,SACE,oBAACC,SAAW,OAAX,EAAiB,KAAK,EAAE,OAAO,EAAA,GAC7B,UAAA,KAAK,QAAQ,IAAI,CAAC,MACjB,oBAAC,SAAA,EAAmB,OAAO,EAAE,MAC3B,UAAA,oBAAC,QAAA,EAAO,SAAS,EAAA,CAAG,EAAA,GADR,EAAE,EAEhB,CACD,EAAA,CACH;AAEJ,CAAC;ACTM,MAAM,kBAAkB,UAAU,mBAAmB,CAAC,UAA8B;AACzF,QAAM,EAAE,UAAU,cAAc,QAAQ,SAAS,OAAO,aAAa;AACrE,QAAM,WAAW,OAAgC,IAAI;AACrD,QAAM,UAAU,YAAY,MAAA;;AAAM,0BAAS,YAAT,mBAAkB;AAAA,KAAS,EAAE;AAC/D,QAAM,iBAAiB,OAAiC,IAAI;AAE5D,YAAU,MAAM;;AACd,yBAAe,YAAf,mBAAwB,UAAU,IAAI;AAAA,EACxC,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,4BAA4B,YAAY,MAAM;;AAClD,yBAAe,YAAf,mBAAwB,UAAU,OAAO;AAAA,EAC3C,GAAG,CAAA,CAAE;AAEL,QAAM,gBAAgB;AAAA,IACpB,CAAC,MAA2C;AAC1C,YAAM,QAAQ,EAAE,OAAO;AACvB,eAAS,MAAM,SAAS,KAAK,SAAS,MAAM,KAAK,KAAK,CAAC;AAAA,IACzD;AAAA,IACA,CAAC,QAAQ;AAAA,EAAA;AAGX,SACE,qBAAA,UAAA,EACE,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,MAAK;AAAA,QACL;AAAA,QACA,MAAM,oBAAC,MAAA,EAAK,MAAK,SAAA,CAAS;AAAA,QAC1B,WAAU;AAAA,MAAA;AAAA,IAAA;AAAA,IAEX,MAAM,SAAS,KACd;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAK;AAAA,QACL,WAAU;AAAA,QACV,sBAAsB;AAAA,QACtB,SAAS;AAAA,QACT,MAAK;AAAA,QACL;AAAA,QACA,MAAM,qBAAA,UAAA,EAAE,UAAA;AAAA,UAAA;AAAA,UAAE,MAAM;AAAA,QAAA,EAAA,CAAO;AAAA,MAAA;AAAA,IAAA;AAAA,IAG3B;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN;AAAA,QACA,UAAU;AAAA,QACV,KAAK;AAAA,QACL,MAAK;AAAA,QACL,UAAQ;AAAA,QACR,OAAO,EAAE,SAAS,OAAA;AAAA,MAAO;AAAA,IAAA;AAAA,EAC3B,GACF;AAEJ,CAAC;AAEM,MAAM,gBAAgB,UAAU,iBAAiB,CAAC,UAA8B;AACrF,SACE,oBAAC,SAAI,WAAU,wBACb,8BAAC,iBAAA,EAAiB,GAAG,OAAO,EAAA,CAC9B;AAEJ,CAAC;ACZM,MAAM,mBAAmB,MAAM,cAAyB,IAAK;AAE7D,SAAS,eAAe;AAC7B,SAAO,WAAW,gBAAgB;AACpC;AAEA,MAAM,OAAsB;AAAA,EAC1B,SAAS,CAAC,UAAkB,MAAM,KAAK,EAAE,OAAO,MAAA,GAAS,KAAK;AAAA,EAC9D,WAAW,CAAC,UAAkB,MAAM,KAAK,EAAE,OAAO,OAAO;AAAA,EACzD,UAAU,CAAC,UAAkB,MAAM,KAAK,EAAE,OAAO,kBAAkB;AAAA,EACnE,SAAS;AAAA,IACP,MAAM,MAAM;AAAA,IACZ,SAAS,MAAM;AAAA,IACf,SAAS,MAAM;AAAA,EAAA;AAAA,EAEjB,SAAS;AAAA,IACP,OAAO,MAAM;AAAA,IACb,MAAM;AAAA,MACJ,OAAO,MAAM;AAAA,MACb,UAAU,MAAM;AAAA,MAChB,QAAQ,MAAM;AAAA,IAAA;AAAA,IAEhB,SAAS;AAAA,MACP,OAAO,MAAM;AAAA,MACb,UAAU,MAAM;AAAA,IAAA;AAAA,IAElB,WAAW,MAAM;AAAA,EAAA;AAAA,EAEnB,QAAQ;AAAA,IACN,0BAA0B,MAAM;AAAA,IAChC,0BAA0B,MAAM;AAAA,IAChC,4BAA4B,MAAM;AAAA,IAClC,+BAA+B,CAAC,GAAG,EAAE,QAAA,MACnC,yBAAyB,OAAO;AAAA,EAAA;AAAA,EAGpC,OAAO;AAAA,IACL,aAAa,MAAM;AAAA,EAAA;AAAA,EAGrB,UAAU;AAAA,IACR,SAAS,MAAM;AAAA,EAAA;AAAA,EAGjB,MAAM;AAAA,IACJ,OAAO,CAAC,UACN,GAAG,MAAM,eAAe,QAAW,EAAE,uBAAuB,GAAG,uBAAuB,EAAA,CAAG,CAAC;AAAA,IAC5F,IAAI,CAAC,UACH,GAAG,MAAM,eAAe,QAAW,EAAE,uBAAuB,GAAG,uBAAuB,EAAA,CAAG,CAAC;AAAA,IAC5F,IAAI,CAAC,UACH,GAAG,MAAM,eAAe,QAAW,EAAE,uBAAuB,GAAG,uBAAuB,EAAA,CAAG,CAAC;AAAA,EAAA;AAAA,EAG9F,UAAU;AAAA,IACR,UAAU,CAAC,UAAkB,iBAAiB,KAAK,QAAQ,UAAU,IAAI,MAAM,EAAE;AAAA,EAAA;AAAA,EAGnF,WAAW;AAAA,IACT,aAAa,MAAM;AAAA,IACnB,OAAO,MAAM;AAAA,IACb,QAAQ;AAAA,MACN,OAAO,MAAM;AAAA,MACb,UAAU,MAAM;AAAA,MAChB,QAAQ,MAAM;AAAA,IAAA;AAAA,IAEhB,MAAM,EAAE,OAAO,MAAM,WAAW,UAAU,MAAM,uBAAA;AAAA,IAChD,WAAW,MAAM;AAAA,IACjB,UAAU,MAAM;AAAA,EAAA;AAEpB;AAEO,MAAM,mBAA8B;ACzH3C,MAAMC,YAAU,SAAS,OAAO;AAChC,MAAM,cAAc,SAAS,YAAY;AAEzC,MAAM,YAAuC,EAAE,SAAS,GAAG,SAAS,EAAA;AAE7D,MAAM,eAAe;AAAA,EAC1B;AAAA,EACA,KAAK,CAAC,UAA6B;AACjC,UAAM,EAAE,OAAO,UAAU,QAAQ,UAAU,aAAa;AACxD,UAAM,YAAY,aAAA;AAElB,UAAM,gBAAgB;AAAA,MACpB,CAAC,MAA8C,SAAS,EAAE,OAAO,KAAK;AAAA,MACtE,CAAC,QAAQ;AAAA,IAAA;AAGX,UAAM,YAAY;AAAA,MAChB,CAAC,MAAgD;AAC/C,YAAI,UAAU;AACZ,YAAE,eAAA;AACF;AAAA,QACF;AAEA,YAAIA,UAAQ,CAAC,KAAK,YAAY,CAAC,GAAG;AAChC,YAAE,eAAA;AACF,iBAAO,KAAK;AAAA,QACd;AAAA,MACF;AAAA,MACA,CAAC,QAAQ,OAAO,QAAQ;AAAA,IAAA;AAG1B,WACE,oBAAC,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,MAAC,MAAM;AAAA,MAAN;AAAA,QACC,KAAK;AAAA,QACL;AAAA,QACA,UAAU;AAAA,QACV,UAAU;AAAA,QACV,WAAU;AAAA,QACV,aAAa,UAAU,MAAM,YAAA;AAAA,QAC7B;AAAA,MAAA;AAAA,IAAA,GAEJ;AAAA,EAEJ,CAAC;AACH;AClDO,MAAM,uBAAuB,UAAU,wBAAwB,CAAC,UAAqC;AAC1G,QAAM,EAAE,UAAU,UAAU,QAAA,IAAY;AAExC,SACE,oBAAC,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,SAAS;AAAA,MACT,MAAK;AAAA,MACL,MAAM,oBAAC,MAAA,EAAK,MAAK,OAAA,CAAO;AAAA,MACxB,WAAU;AAAA,MACV;AAAA,MACA;AAAA,IAAA;AAAA,EAAA,GAEJ;AAEJ,CAAC;ACAM,MAAM,sBAAsB,MAAM,cAAwC,MAAU;AAEpF,SAASC,oBAAkB;AAChC,SAAO,MAAM,WAAW,mBAAmB;AAC7C;ACtBO,MAAM,kBAAkB,UAAU,mBAAmB,CAAC,UAAgC;AAC3F,QAAM,EAAE,QAAQ,EAAA,IAAM;AACtB,SACE,oBAAA,UAAA,EACG,UAAA,MAAM,KAAK,MAAM,KAAK,CAAC,EAAE,IAAI,CAAC,GAAG,UAChC,qBAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,IAAA,oBAAC,SAAS,QAAT,EAAgB,WAAU,iBAAgB,QAAM,MAAC;AAAA,wBACjD,SAAS,QAAT,EAAgB,QAAM,MAAC,WAAU,iBAAA,CAAiB;AAAA,EAAA,KAFP,KAG9C,CACD,GACH;AAEJ,CAAC;AChBM,MAAM,mBAAmB,UAAU,oBAAoB,CAAC,UAAgC;AAC7F,QAAM,EAAE,SAAS;AAEjB,SAAO,oBAAC,OAAA,EAAI,WAAU,oBAAoB,eAAK,MAAK;AACtD,CAAC;ACJM,MAAM,0BAA0B,UAAU,2BAA2B,CAAC,UAAgC;AAC3G,QAAM,EAAE,kBAAkB,YAAA,IAAgB,MAAM;AAEhD,MAAI,eAAe,QAAQ,eAAe,GAAG;AAC3C,WAAO;AAAA,EACT;AAEA,SAAO,oBAAC,OAAA,EAAI,WAAU,uBAAuB,UAAA,aAAY;AAC3D,CAAC;ACDM,SAAS,oBAAoB,WAAsB,MAA+B;AACvF,QAAM,CAAC,KAAK,OAAO,IAAI,KAAK,MAAM,MAAM,CAAC;AACzC,QAAM,OAAO,UAAU,KAAK,MAAM,OAAO,IAAI;AAC7C,SAAO,UAAU,OAAO,GAAgC,EAAE,KAAY,IAAI;AAC5E;AAEO,MAAM,mBAAmB,UAAU,oBAAoB,CAAC,UAAiC;AAC9F,QAAM,EAAE,SAAS,aAAA,IAAiB;AAClC,QAAM,EAAE,MAAM,OAAA,IAAW;AACzB,QAAM,YAAY,aAAA;AAElB,SACE,qBAAC,OAAA,EAAI,KAAK,cAAc,WAAU,yBAChC,UAAA;AAAA,IAAA,oBAAC,SAAI,WAAU,eAAe,kBAAQ,oBAAoB,WAAW,IAAI,GAAE;AAAA,wBAC1E,OAAA,EAAI,WAAU,oBAAoB,UAAA,UAAU,UAAU,MAAM,EAAA,CAAE;AAAA,EAAA,GACjE;AAEJ,CAAC;ACpBD,MAAM,WAAyC,CAAC,UAAU;AACxD,QAAM,EAAE,SAAS,WAAA,IAAe;AAChC,QAAM,EAAE,QAAQ,kBAAA,IAAsBA,kBAAA;AACtC,QAAM,SAAS,qBAAqB,QAAQ,QAAQ,GAAG,cAAc,iBAAiB,KAAK;AAC3F,QAAM,UAAU,OAAO,MAAM;AAE7B,YAAU,MAAM;AACd,YAAQ,UAAU,QAAQ,WAAW;AAAA,EACvC,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,WAAW;AAAA,IACf,MACE,IAAI,qBAAqB,CAAC,CAAC,KAAK,MAAM;AACpC,UAAI,MAAM,kBAAkB,CAAC,QAAQ,SAAS;AAC5C,gBAAQ,UAAU;AAClB,yCAAS,QAAQ;AAAA,MACnB;AAAA,IACF,CAAC;AAAA;AAAA,IAGH,CAAA;AAAA,EAAC;AAGH,YAAU,MAAM;AACd,aAAS,QAAQ,WAAW,OAAQ;AACpC,WAAO,MAAM,SAAS,WAAA;AAAA,EAGxB,GAAG,CAAC,QAAQ,CAAC;AAEb,SAAO,oBAAA,UAAA,EAAE;AACX;AAEO,SAAS,oBAAoB,OAAiC;AACnE,QAAM,EAAE,eAAA,IAAmBA,kBAAA;AAE3B,MAAI,mBAAmB,MAAM;AAC3B,WAAO;AAAA,EACT;AAEA,SAAO,oBAAC,UAAA,EAAU,GAAG,MAAA,CAAO;AAC9B;ACtCO,MAAM,mBAAmB,UAAU,oBAAoB,CAAC,UAAiC;AAC9F,QAAM,MAAM,OAA8B,IAAI;AAE9C,SACE,qBAAA,UAAA,EACE,UAAA;AAAA,IAAA,oBAAC,qBAAA,EAAoB,YAAY,KAAM,GAAG,MAAA,CAAO;AAAA,IACjD,oBAAC,kBAAA,EAAiB,cAAc,KAAM,GAAG,MAAA,CAAO;AAAA,EAAA,GAClD;AAEJ,CAAC;ACbM,MAAM,iCAAiC;AAAA,EAC5C;AAAA,EACA,CAAC,UAAU;AACT,UAAM,EAAE,gBAAgB,MAAM;AAC9B,UAAM,YAAY,aAAA;AAElB,+BACG,OAAA,EAAI,WAAU,4BACZ,UAAA,YAAY,OAAO,OAAO,oBACvB,YAAY,QAAQ,oBAAoB,WAAW,YAAY,IAAI,IACnE,YAAY,MAClB;AAAA,EAEJ;AACF;ACjBO,MAAM,gCAAgC;AAAA,EAC3C;AAAA,EACA,CAAC,UAAgC;AAC/B,UAAM,EAAE,gBAAgB,MAAM;AAE9B,QAAI,YAAY,OAAO,OAAO,mBAAmB;AAC/C,aAAO;AAAA,IACT;AAEA,+BAAQ,OAAA,EAAI,WAAU,2BAA2B,UAAA,YAAY,OAAO,MAAK;AAAA,EAC3E;AACF;ACVO,MAAM,gCAAgC;AAAA,EAC3C;AAAA,EACA,CAAC,UAAgC;AAC/B,UAAM;AAAA,MACJ,MAAM;AAAA,QACJ,aAAa,EAAE,OAAA;AAAA,MAAO;AAAA,IACxB,IACE;AAEJ,UAAM,YAAY,aAAA;AAElB,WACE,oBAAC,OAAA,EAAI,WAAU,4BACZ,oBAAU,QAAQ,MAAM,IAAI,UAAU,UAAU,MAAM,IAAI,UAAU,SAAS,MAAM,GACtF;AAAA,EAEJ;AACF;ACfO,MAAM,0BAA0B,UAAU,2BAA2B,CAAC,UAAgC;AAC3G,SACE,qBAAC,OAAA,EAAI,WAAU,oBACb,UAAA;AAAA,IAAA,oBAAC,+BAAA,EAA+B,GAAG,OAAO;AAAA,IAC1C,oBAAC,gCAAA,EAAgC,GAAG,OAAO;AAAA,IAC3C,oBAAC,+BAAA,EAA+B,GAAG,MAAA,CAAO;AAAA,EAAA,GAC5C;AAEJ,CAAC;ACTM,MAAM,qBAAqB,UAAU,sBAAsB,CAAC,UAAgC;AACjG,QAAM,EAAE,OAAO,MAAM;AAErB,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,OACE;AAAA,QACE,sBAAsB,MAAM,IAAI,EAAE,WAAW,IAAI;AAAA,QACjD,WAAW,MAAM,IAAI,EAAE,YAAY,IAAI,WAAW,IAAI;AAAA,MAAA;AAAA,MAI1D,UAAA,oBAAC,MAAA,EAAK,MAAK,OAAA,CAAO;AAAA,IAAA;AAAA,EAAA;AAGxB,CAAC;ACLM,MAAM,kBAAkB,UAAU,mBAAmB,CAAC,UAAgC;AAC3F,QAAM,EAAE,SAAS,MAAA,IAAU;AAC3B,QAAM,EAAE,aAAa,kBAAA,IAAsB,MAAM;AACjD,QAAM,OAAO,qBAAqB,QAAQ,kBAAkB,cAAc,YAAY,EAAE,KAAK;AAE7F,SACE,qBAAC,SAAI,WAAW,iBAAiB,CAAC,QAAQ,CAAC,SAAS,cAAc,KAChE,UAAA;AAAA,IAAA,oBAAC,oBAAA,EAAoB,GAAG,OAAO;AAAA,IAC/B,qBAAC,QAAA,EAAK,WAAU,oBACd,UAAA;AAAA,MAAA,oBAAC,kBAAA,EAAkB,GAAG,OAAO;AAAA,MAC7B,oBAAC,yBAAA,EAAyB,GAAG,OAAO;AAAA,MACpC,oBAAC,yBAAA,EAAyB,GAAG,MAAA,CAAO;AAAA,IAAA,EAAA,CACtC;AAAA,EAAA,GACF;AAEJ,CAAC;ACND,SAAS,YAAY,OAAsB;AACzC,QAAM,EAAE,aAAa;AAErB,SAAO;AAAA,IACL,MACE,WACI,CAAC,SAA4D,SAAS,KAAK,GAAa,IACxF;AAAA,IACN,CAAC,QAAQ;AAAA,EAAA;AAEb;AAEA,SAAS,aAAa,OAAsB;AAE1C,QAAM,EAAE,OAAO,QAAQ,IAAA,IAAQ;AAC/B,QAAM,YAAY,aAAA;AAElB,SAAO,QAA4B,MAAM;AACvC,UAAM,SAAS,+BACX,QACD;AAAA,MACC,CAAC,GAAG,MAAM,CAAC,oBAAoB,EAAE,YAAY,EAAE,EAAE,cAAc,oBAAoB,EAAE,YAAY,EAAE,CAAC;AAAA,MAErG,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,2BAAQ,iBAAA,EAAgB,MAAM,GAAG,OAAA,CAAgB;AAE7E,QAAI,OAAO,MAAM;AACf,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,UACE,MAAM;AAAA,UACN,KAAK;AAAA,UACL,UAAU;AAAA,UACV,OACE,oBAAC,OAAA,EAAI,OAAO,EAAE,WAAW,UAAU,QAAQ,QAAQ,WAAW,YAC3D,UAAA,UAAU,SAAS,SAAS,GAAG,EAAA,CAClC;AAAA,QAAA;AAAA,MAEJ;AAAA,IAEJ;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,QAAQ,KAAK,SAAS,CAAC;AACpC;AAEO,MAAM,WAAW,UAAU,YAAY,CAAC,UAAyB;AACtE,QAAM,EAAE,UAAU,eAAA,IAAmB;AACrC,QAAM,WAAW,QAAQ,MAAO,iBAAiB,CAAC,cAAc,IAAI,CAAA,GAAK,CAAC,cAAc,CAAC;AACzF,QAAM,WAAW,YAAY,KAAK;AAClC,QAAM,QAAQ,aAAa,KAAK;AAEhC,SACE,oBAAA,UAAA,EACG,UAAA,SACC,oBAAC,MAAA,EAAK,WAAU,oBAAmB,cAAc,UAAU,UAAoB,MAAA,CAAc,GAEjG;AAEJ,CAAC;ACjFM,SAAS,eAAe;AAC7B,QAAM,YAAY,aAAA;AAElB,SAAO;AAAA,IACL,MAAM,CAAC,UAAkB;AACvB,UAAI,QAAQ,MAAM;AAChB,eAAO,UAAU,KAAK,MAAM,KAAK;AAAA,MACnC,WAAW,QAAQ,OAAO,MAAM;AAC9B,eAAO,UAAU,KAAK,GAAG,QAAQ,IAAI;AAAA,MACvC,OAAO;AACL,eAAO,UAAU,KAAK,GAAG,QAAQ,OAAO,IAAI;AAAA,MAC9C;AAAA,IACF;AAAA,EAAA;AAEJ;ACHO,MAAM,eAAe,UAAU,gBAAgB,CAAC,UAA6B;AAClF,QAAM,EAAE,MAAM,UAAU,SAAA,IAAa;AACrC,QAAM,YAAY,aAAA;AAClB,QAAM,gBAAgB,YAAY,MAAM,SAAS,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC;AAExE,SACE,qBAAC,OAAA,EAAI,WAAU,eACb,UAAA;AAAA,IAAA,qBAAC,OAAA,EAAI,WAAU,oBACb,UAAA;AAAA,MAAA,oBAAC,SAAI,WAAU,oBAAmB,OAAO,KAAK,MAC3C,eAAK,KAAA,CACR;AAAA,MACA,oBAAC,SAAI,WAAU,oBAAoB,oBAAU,KAAK,KAAK,KAAK,EAAA,CAAE;AAAA,IAAA,GAChE;AAAA,IACA,oBAAC,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,WAAU;AAAA,QACV,MAAK;AAAA,QACL,MAAM,oBAAC,MAAA,EAAK,MAAK,cAAA,CAAc;AAAA,QAC/B,SAAS;AAAA,MAAA;AAAA,IAAA,EACX,CACF;AAAA,EAAA,GACF;AAEJ,CAAC;AC3BM,MAAM,mBAAmB,UAAU,oBAAoB,CAAC,UAAiC;AAC9F,QAAM,EAAE,OAAO,UAAU,SAAA,IAAa;AAEtC,6BACG,OAAA,EAAI,WAAU,oBACZ,UAAA,MAAM,IAAI,CAAC,SACV,oBAAC,cAAA,EAA4B,MAAY,UAAoB,SAAA,GAA1C,KAAK,GAAyD,CAClF,GACH;AAEJ,CAAC;ACVD,SAAS,eAAe;AACtB,QAAM,EAAE,OAAA,IAAWA,kBAAA;AACnB,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,EAAE;AACnC,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,EAAE,UAAU,OAAO,SAAS,UAAU,aAAa,aAAA,IAAiB,sBAAA;AAE1E,QAAM,WAAW,YAAY,MAAM;AACjC,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AAEA,UAAM,YAAY,KAAK,KAAA,EAAO,WAAW,IAAI,OAAO,KAAK,KAAA;AAEzD,QAAK,CAAC,aAAa,MAAM,WAAW,KAAM,SAAS;AACjD;AAAA,IACF;AAEA,eAAW,IAAI;AACf,YAAQ,QAAQ,OAAO,EAAE,MAAM,WAAW,OAAO,CAAC,EAC/C,QAAQ,MAAM,WAAW,KAAK,CAAC,EAC/B,KAAK,MAAM;AACV,eAAS,CAAA,CAAE;AACX,cAAQ,EAAE;AAAA,IACZ,CAAC;AAAA,EAEL,GAAG,CAAC,MAAM,QAAQ,OAAO,UAAU,OAAO,CAAC;AAE3C,SAAO,CAAC,UAAU,EAAE,MAAM,SAAS,OAAO,UAAU,SAAS,aAAa,cAAc,QAAA,CAAS;AACnG;AAEA,SAAS,wBAAwB;AAC/B,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAiB,CAAA,CAAE;AAC7C,QAAM,EAAE,OAAA,IAAW,oBAAA;AAEnB,QAAM,WAAW;AAAA,IACf,CAACC,WAA6B;AAC5B,UAAI,CAAC,OAAQ;AAEb,iBAAW,IAAI;AACf,cAAQ,IAAIA,OAAM,IAAI,CAAC,SAAS,OAAO,MAAM,IAAI,CAAC,CAAC,EAChD;AAAA,QAAK,CAAC,eACL,SAAS,CAAC,SAAS;AAAA,UACjB,GAAG;AAAA,UACH,GAAG,WAAW,IAAI,CAAC,WAAW,WAAW;AAAA,YACvC,MAAMA,OAAM,KAAK,EAAE;AAAA,YACnB,KAAK;AAAA,YACL,OAAOA,OAAM,KAAK,EAAE;AAAA,UAAA,EACpB;AAAA,QAAA,CACH;AAAA,MAAA,EAEF,QAAQ,MAAM,WAAW,KAAK,CAAC;AAAA,IACpC;AAAA,IACA,CAAC,MAAM;AAAA,EAAA;AAGT,QAAM,eAAe,YAAY,CAAC,SAAe;AAC/C,aAAS,CAAC,SAAS,KAAK,OAAO,CAAC,MAAM,MAAM,IAAI,CAAC;AAAA,EACnD,GAAG,CAAA,CAAE;AAEL,SAAO,EAAE,UAAU,OAAO,SAAS,UAAU,aAAa,CAAC,CAAC,QAAQ,aAAA;AACtE;AAEO,MAAM,WAAW,UAAU,YAAY,MAAM;AAClD,QAAM,CAAC,QAAQ,EAAE,MAAM,SAAS,OAAO,SAAS,UAAU,aAAa,cAAc,QAAA,CAAS,IAC5F,aAAA;AACF,QAAM,WAAW,OAA4B,IAAI;AACjD,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,KAAK;AACtD,QAAM,qBAAqB,YAAY,MAAM,gBAAgB,CAAC,SAAS,CAAC,IAAI,GAAG,EAAE;AACjF,QAAM,kBAAkB,OAAO,MAAM,MAAM;AAE3C,kBAAgB,MAAA;;AAAM,0BAAS,YAAT,mBAAkB;AAAA,KAAS,CAAA,CAAE;AAEnD,YAAU,MAAM;AACd,QAAI,gBAAgB,YAAY,KAAK,MAAM,SAAS,KAAK,CAAC,cAAc;AACtE,sBAAgB,IAAI;AAAA,IACtB;AAEA,oBAAgB,UAAU,MAAM;AAEhC,QAAI,MAAM,WAAW,KAAK,cAAc;AACtC,sBAAgB,KAAK;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,OAAO,YAAY,CAAC;AAExB,6BACG,OAAA,EAAI,WAAU,qBACb,UAAA,qBAAC,OAAA,EAAI,WAAU,oBACZ,UAAA;AAAA,IAAA,gBACC,oBAAC,OAAA,EAAI,WAAU,wBACb,UAAA,oBAAC,kBAAA,EAAiB,OAAc,UAAU,cAAc,UAAU,QAAA,CAAS,GAC7E;AAAA,IAEF,qBAAC,OAAA,EAAI,WAAU,wBACZ,UAAA;AAAA,MAAA,eACC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,cAAc;AAAA,UACd;AAAA,UACA,OAAO;AAAA,UACP;AAAA,UACA,UAAU;AAAA,QAAA;AAAA,MAAA;AAAA,MAGd;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAO;AAAA,UACP;AAAA,UACA,UAAU;AAAA,UACV,UAAU;AAAA,UACV;AAAA,QAAA;AAAA,MAAA;AAAA,0BAED,sBAAA,EAAqB,UAAU,QAAQ,UAAU,SAAS,SAAS,QAAA,CAAS;AAAA,IAAA,EAAA,CAC/E;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAEJ,CAAC;ACzHM,MAAM,gBAAgB,UAAU,iBAAiB,CAAC,UAA2B;AAClF,QAAM,EAAE,WAAW,MAAM;AAEzB,SACE,oBAAC,SAAI,WAAU,yBACb,8BAAC,QAAA,EAAO,SAAS,QAAQ,EAAA,CAC3B;AAEJ,CAAC;ACTM,MAAM,cAAc,UAAU,eAAe,CAAC,UAA2B;AAC9E,QAAM,EAAE,SAAS,MAAM;AACvB,SAAO,oBAAC,OAAA,EAAI,WAAU,uBAAuB,UAAA,MAAK;AACpD,CAAC;ACED,SAAS,KAAK,KAAa;AACzB,QAAM,IAAI,OAAO,KAAK,KAAK,QAAQ;AACnC,yBAAG;AACL;AAMA,SAAS,QAAQ,OAAyB;AACxC,QAAM,EAAE,SAAS;AACjB,QAAM,EAAE,OAAA,IAAW,oBAAA;AACnB,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAS,KAAK;AAE1D,QAAM,SAAS;AAAA,IACb,MACE,UACA,QAAQ,QAAQ,kBAAkB,IAAI,CAAC,EACpC,KAAK,MAAM,OAAQ,UAAU,KAAK,GAAG,CAAC,EACtC,KAAK,IAAI,EACT,QAAQ,MAAM,kBAAkB,KAAK,CAAC;AAAA,IAC3C,CAAC,QAAQ,KAAK,GAAG;AAAA,EAAA;AAGnB,SAAO,CAAC,QAAQ,EAAE,gBAAgB;AACpC;AAEO,MAAM,cAAc,UAAU,eAAe,CAAC,UAA4B;AAC/E,QAAM,EAAE,SAAS;AACjB,QAAM,YAAY,aAAA;AAClB,QAAM,CAAC,QAAQ,EAAE,gBAAgB,IAAI,QAAQ,KAAK;AAElD,SACE,qBAAC,OAAA,EAAI,WAAU,eACb,UAAA;AAAA,IAAA,oBAAC,SAAI,WAAU,eACb,UAAA,oBAAC,QAAA,EAAO,SAAS,gBAAgB,SAAS,QAAQ,MAAK,QAAO,MAAM,oBAAC,QAAK,MAAK,YAAA,CAAY,GAAI,GACjG;AAAA,IACA,qBAAC,OAAA,EAAI,WAAU,oBACb,UAAA;AAAA,MAAA,oBAAC,SAAI,WAAU,eAAc,OAAO,KAAK,MACtC,eAAK,KAAA,CACR;AAAA,MACA,oBAAC,SAAI,WAAU,eAAe,oBAAU,KAAK,KAAK,KAAK,EAAA,CAAE;AAAA,IAAA,EAAA,CAC3D;AAAA,EAAA,GACF;AAEJ,CAAC;ACjDM,MAAM,kBAAkB,UAAU,mBAAmB,CAAC,UAA2B;AACtF,QAAM,EAAE,UAAU,MAAM;AACxB,SACE,oBAAC,OAAA,EAAI,WAAU,oBACZ,gBAAM,IAAI,CAAC,SACV,oBAAC,aAAA,EAA2B,KAAA,GAAV,KAAK,GAAiB,CACzC,GACH;AAEJ,CAAC;ACRM,MAAM,iBAAiB,UAAU,kBAAkB,CAAC,UAA2B;AACpF,QAAM,EAAE,OAAO,KAAA,IAAS,MAAM;AAE9B,SACE,qBAAC,OAAA,EAAI,WAAU,0BACZ,UAAA;AAAA,IAAA,QAAQ,oBAAC,aAAA,EAAa,GAAG,MAAA,CAAO;AAAA,IAChC,MAAM,SAAS,KAAK,oBAAC,iBAAA,EAAiB,GAAG,MAAA,CAAO;AAAA,EAAA,GACnD;AAEJ,CAAC;ACRM,MAAM,iBAAiB,UAAU,kBAAkB,CAAC,UAA2B;AACpF,QAAM,EAAE,YAAY;AACpB,QAAM,EAAE,IAAI,QAAQ,OAAA,IAAW;AAC/B,QAAM,EAAE,mBAAmB,WAAW,eAAA,IAAmBD,kBAAA;AACzD,QAAM,KAAK,WAAW,SAAS,GAAA;AAC/B,QAAM,KAAK,OAAO,OAAO;AACzB,QAAM,YAAY,aAAA;AAClB,QAAM,SAAS,qBAAqB,QAAQ,GAAG,cAAc,iBAAiB,KAAK;AACnF,QAAM,UAAU,CAAC,WAAU,uCAAY;AAEvC,SACE,qBAAC,OAAA,EAAI,WAAU,2BACZ,UAAA;AAAA,IAAA,CAAC,MAAM,qBAAC,OAAA,EAAI,WAAU,8BAA8B,UAAA;AAAA,MAAA,OAAO;AAAA,MAAK;AAAA,IAAA,GAAC;AAAA,wBACjE,OAAA,EAAI,WAAU,0BAA0B,UAAA,UAAU,UAAU,MAAM,GAAE;AAAA,IACpE,CAAC,MAAM,CAAC,kBACP,oBAAC,SAAI,WAAU,2BACZ,UAAA,UAAU,UAAU,QAAQ,QAAA,IAAY,UAAU,QAAQ,OAAK,CAClE;AAAA,EAAA,GAEJ;AAEJ,CAAC;ACfM,MAAM,aAAa,UAAU,cAAc,CAAC,UAA2B;AAC5E,QAAM,EAAE,SAAS,aAAA,IAAiB;AAClC,QAAM,EAAE,WAAW;AACnB,QAAM,KAAK,WAAW,SAAS,GAAA;AAC/B,QAAM,KAAK,OAAO,OAAO;AAEzB,SACE,qBAAC,SAAI,KAAK,cAAc,WAAW,oBAAoB,KAAK,UAAU,KACpE,UAAA;AAAA,IAAA,oBAAC,eAAA,EAAe,GAAG,OAAO;AAAA,yBACzB,OAAA,EACC,UAAA;AAAA,MAAA,oBAAC,gBAAA,EAAgB,GAAG,OAAO;AAAA,MAC3B,oBAAC,gBAAA,EAAgB,GAAG,MAAA,CAAO;AAAA,IAAA,EAAA,CAC7B;AAAA,EAAA,GACF;AAEJ,CAAC;ACjBM,MAAM,aAAa,UAAU,cAAc,CAAC,UAA2B;AAC5E,QAAM,MAAM,OAA8B,IAAI;AAE9C,SACE,qBAAA,UAAA,EACE,UAAA;AAAA,IAAA,oBAAC,qBAAA,EAAoB,YAAY,KAAM,GAAG,MAAA,CAAO;AAAA,IACjD,oBAAC,YAAA,EAAW,cAAc,KAAM,GAAG,MAAA,CAAO;AAAA,EAAA,GAC5C;AAEJ,CAAC;ACXM,SAAS,qBAAqB,OAAkC;AACrE,QAAM,EAAE,QAAQ,QAAA,IAAY;AAC5B,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,KAAK;AACtD,QAAM,MAAM,OAA8B,IAAI;AAC9C,QAAM,WAAW,OAAA;AAEjB,QAAM,WAAW;AAAA,IACf,MACE,IAAI,qBAAqB,CAAC,CAAC,KAAK,MAAM;AACpC,UAAI,MAAM,gBAAgB;AACxB,iBAAS,UAAU,OAAO,WAAW,MAAM,gBAAgB,IAAI,GAAG,GAAG;AAAA,MACvE,OAAO;AACL,qBAAa,SAAS,OAAQ;AAAA,MAChC;AAAA,IACF,CAAC;AAAA,IACH,CAAA;AAAA,EAAC;AAGH,YAAU,MAAM;AACd,aAAS,QAAQ,IAAI,OAAQ;AAC7B,WAAO,MAAM,SAAS,WAAA;AAAA,EACxB,GAAG,CAAC,QAAQ,CAAC;AAEb,YAAU,MAAM;AACd,QAAI,CAAC,cAAc;AACjB;AAAA,IACF;AAEA,WAAA;AAAA,EAGF,GAAG,CAAC,YAAY,CAAC;AAEjB,MAAI,WAAW,cAAc;AAC3B,WAAO,oBAAC,iBAAA,EAAgB,OAAO,EAAA,CAAG;AAAA,EACpC;AAEA,SAAO,oBAAC,OAAA,EAAI,WAAU,eAAc,IAAA,CAAU;AAChD;AC3CO,MAAM,qBAAqB,UAAU,sBAAsB,CAAC,UAAkC;AACnG,QAAM,EAAE,SAAS;AACjB,SAAO,oBAAC,OAAA,EAAI,WAAU,+BAA+B,UAAA,MAAK;AAC5D,CAAC;ACFM,MAAM,wBAAwB,UAAU,yBAAyB,CAAC,MAA8B;AACrG,QAAM,YAAY,aAAA;AAElB,SACE,oBAAC,OAAA,EAAI,WAAU,mCACb,UAAA,oBAAC,OAAA,EAAI,WAAU,sCAAsC,UAAA,UAAU,QAAQ,QAAA,EAAQ,CAAE,GACnF;AAEJ,CAAC;ACPM,MAAM,wBAAwB,UAAU,yBAAyB,CAAC,UAAkC;AACzG,SACE,qBAAC,OAAA,EAAI,WAAU,kCACb,UAAA;AAAA,IAAA,oBAAC,oBAAA,EAAoB,GAAG,OAAO;AAAA,IAC/B,oBAAC,uBAAA,EAAuB,GAAG,MAAA,CAAO;AAAA,EAAA,GACpC;AAEJ,CAAC;ACHM,MAAM,oBAAoB,UAAU,qBAAqB,CAAC,UAAkC;AACjG,SACE,oBAAC,SAAI,WAAU,0BACb,8BAAC,uBAAA,EAAuB,GAAG,OAAO,EAAA,CACpC;AAEJ,CAAC;ACVM,MAAM,sBAAsB,UAAU,uBAAuB,MAAM;AACxE,QAAM,EAAE,QAAA,IAAYA,kBAAA;AAEpB,MAAI,CAAC,QAAS,QAAO;AAErB,SAAO,oBAAC,QAAA,EAAO,SAAS,SAAS,MAAK,QAAO,MAAM,oBAAC,MAAA,EAAK,MAAK,QAAA,CAAQ,EAAA,CAAI;AAC5E,CAAC;ACFM,MAAM,mBAAmB,UAAU,oBAAoB,MAAM;AAClE,QAAM,EAAE,IAAI,WAAW,CAAA,GAAI,SAAS,QAAQ,YAAA,IAAgBA,kBAAA;AAE5D,SACE,qBAAC,OAAA,EAAI,WAAU,4BACZ,UAAA;AAAA,IAAA,CAAC,YAAY,oBAAC,iBAAA,EAAgB,OAAO,EAAA,CAAG;AAAA,IAExC,qCAAU,IAAI,CAAC,MAAM;AACpB,UAAI,EAAE,OAAO,OAAO,WAAW;AAC7B,eAAO,oBAAC,kBAAA,EAA4B,SAAS,EAAA,GAAf,EAAE,EAAgB;AAAA,MAClD;AAEA,aAAO,oBAAC,YAAA,EAAW,SAAS,EAAA,GAAQ,EAAE,EAAI;AAAA,IAC5C;AAAA,IAEC,+BAAY,sBAAA,EAAgD,QAAQ,QAAQ,SAAS,YAAA,GAA/C,SAAS,SAAS,EAA0C;AAAA,EAAA,GACrG;AAEJ,CAAC;ACxBM,MAAM,mBAAmB,UAAU,oBAAoB,MAAM;AAClE,QAAM,EAAE,KAAA,IAASA,kBAAA;AACjB,SAAO,oBAAC,QAAA,EAAK,WAAU,4BAA4B,UAAA,MAAK;AAC1D,CAAC;ACDM,MAAM,qBAAqB,UAAU,sBAAsB,MAAM;AACtE,SACE,oBAAC,SAAI,WAAU,8BACb,+BAAC,KAAA,EAAI,SAAQ,iBAAgB,OAAM,UACjC,UAAA;AAAA,IAAA,oBAAC,KAAA,EACC,UAAA,oBAAC,kBAAA,CAAA,CAAiB,GACpB;AAAA,wBACC,KAAA,EAAI,WAAU,+BACb,UAAA,oBAAC,uBAAoB,EAAA,CACvB;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAEJ,CAAC;ACaM,MAAM,eAAe,UAAU,gBAAgB,CAAC,UAA6B;AAClF,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAEJ,QAAM,EAAE,IAAI,QAAQ,MAAM,sBAAsB;AAEhD,QAAM,UAAU;AAAA,IACd,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAEF;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EACF;AAGF,SACE,oBAAC,oBAAoB,UAApB,EAA6B,OAAO,SACnC,UAAA,oBAAC,OAAA,EAAI,WAAU,uBACb,UAAA,qBAAC,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,IAAA,oBAAC,oBAAA,EAAmB;AAAA,wBACnB,kBAAA,EAAiB;AAAA,IACjB,8BAAW,UAAA,CAAA,CAAS;AAAA,EAAA,EAAA,CACvB,GACF,GACF;AAEJ,CAAC;ACpFD,MAAM,WAAW,SAAS,QAAQ;AAClC,MAAM,UAAU,SAAS,OAAO;AAEhC,SAAS,kBAAkB,IAAY,OAAe;AACpD,QAAM,CAAC,cAAc,IAAI,WAAW,0BAAA;AACpC,SAAO,MAAM,eAAe,EAAE,IAAI,MAAM,OAAO;AACjD;AAEO,MAAM,yBAAyB,UAAU,0BAA0B,MAAM;AAC9E,QAAM,EAAE,IAAI,MAAM,OAAA,IAAWA,kBAAA;AAC7B,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,EAAE;AACrD,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,iBAAiB,kBAAkB,IAAI,aAAa;AAE1D,YAAU,MAAM;AACd,QAAI,MAAM;AACR,uBAAiB,QAAQ,EAAE;AAAA,IAC7B;AAAA,EACF,GAAG,CAAC,MAAM,IAAI,CAAC;AAEf,MAAI,CAAC,QAAQ;AACX,WAAO,oBAAC,QAAA,EAAK,WAAU,4BAA4B,UAAA,MAAK;AAAA,EAC1D;AAEA,MAAI,MAAM;AACR,WACE,oBAAC,SAAA,EAAQ,aAAW,MAAC,OAAM,iEACzB,UAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,QACP,UAAU,CAAC,MAAM,iBAAiB,EAAE,OAAO,KAAK;AAAA,QAChD,QAAQ,MAAM,QAAQ,KAAK;AAAA,QAC3B,WAAW,CAAC,MAAM;AAChB,cAAI,SAAS,CAAC,GAAG;AACf,oBAAQ,KAAK;AAAA,UACf,WAAW,QAAQ,CAAC,GAAG;AACrB,oBAAQ,KAAK;AAEb,gBAAI,kBAAkB,QAAQ,cAAc,KAAA,MAAW,IAAI;AACzD,6BAAA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,WAAS;AAAA,MAAA;AAAA,IAAA,GAEb;AAAA,EAEJ;AAEA,SACE,oBAAC,SAAA,EAAQ,OAAM,yBACb,8BAAC,QAAA,EAAK,WAAU,uCAAsC,SAAS,MAAM,QAAQ,IAAI,GAC9E,gBACH,GACF;AAEJ,CAAC;ACzDM,MAAM,oBAAoB,UAAU,qBAAqB,MAAM;AACpE,QAAM,EAAE,OAAA,IAAWA,kBAAA;AAEnB,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,SACE,qBAAC,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,IAAA,oBAAC,oBAAA,EAAmB;AAAA,wBACnB,mBAAA,CAAA,CAAkB;AAAA,EAAA,GACrB;AAEJ,CAAC;ACQM,MAAM,oCAAgE;AAAA,EAC3E,kBAAkB,MAAM,oBAAC,wBAAA,EAAuB;AAAA,EAChD,qBAAqB,MAAM,oBAAC,mBAAA,CAAA,CAAkB;AAChD;AAEA,SAAS,gBAAgB,OAAkB;AACzC,QAAM,EAAE,OAAO,KAAA,IAAS;AACxB,QAAM,EAAE,IAAI,MAAM,QAAQ,sBAAsB;AAEhD,QAAM,EAAE,MAAM,gBAAgB,WAAW,2BAA2B,EAAE,QAAQ,IAAI;AAClF,QAAM,EAAE,UAAU,QAAA,IAAY,eAAe,CAAA;AAE7C,QAAM,CAAC,WAAW,EAAE,WAAW,oBAAoB,IAAI,WAAW,oCAAA;AAClE,QAAM,SAAS,YAAY,MAAM,UAAU,EAAE,QAAQ,GAAA,CAAI,GAAG,CAAC,WAAW,EAAE,CAAC;AAE3E,QAAM,CAAC,IAAI,IAAI,WAAW,2BAAA;AAC1B,QAAM,SAAS,YAAY,CAACE,QAAe,KAAK,EAAE,IAAAA,IAAAA,CAAI,GAAG,CAAC,IAAI,CAAC;AAE/D,QAAM,CAAC,IAAI,IAAI,WAAW,2BAAA;AAC1B,QAAM,SAAS,YAAY,CAAC,YAAyB,KAAK,EAAE,GAAG,SAAS,QAAQ,GAAA,CAAI,EAAE,OAAA,GAAU,CAAC,IAAI,IAAI,CAAC;AAE1G,QAAM,EAAE,MAAM,cAAc,WAAW,gCAAA;AAEvC,QAAM,eAAe,QAAQ,MAAM;AACjC,QAAI,CAAC,IAAI;AACP,aAAO;AAAA,IACT;AAEA,UAAM,SAA4B;AAAA,MAChC,OAAO,EAAE,IAAS,MAAa,QAAiB,kBAAA;AAAA,MAChD;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA,WAAW,CAACA,QAAe,UAAW,KAAK,CAAC,MAAM,OAAO,EAAE,KAAK,MAAM,OAAOA,GAAE,KAAKA,OAAM,EAAE,KAAK;AAAA,IAAA;AAGnG,WAAO;AAAA,EACT,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AAED,SAAO;AACT;AAEA,SAASC,UAAQ,OAAkB;AACjC,QAAM,eAAe,gBAAgB,KAAK;AAC1C,QAAM,EAAE,YAAA,IAAgB,eAAA;AAExB,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AAEA,SACE,qBAAC,OAAA,EAAI,WAAU,eACb,UAAA;AAAA,IAAA,oBAAC,cAAA,EAAc,GAAG,cAAc;AAAA,IAC/B,mCAAgB,kBAAA,CAAA,CAAiB;AAAA,EAAA,GACpC;AAEJ;AAEO,MAAM,WAAW,UAAU,YAAY,CAAC,UAAqB;AAClE,QAAM,EAAE,UAAU;AAClB,QAAM,aAAa,oBAAA;AACnB,QAAMC,aAAoC;AAAA,IACxC,OAAO,EAAE,GAAI,cAAc,IAAK,GAAG,kCAAA;AAAA,IACnC,CAAC,UAAU;AAAA,EAAA;AAGb,SACE,oBAAC,iBAAiB,UAAjB,EAA0B,OAAOA,YAChC,UAAA,oBAAC,aAAA,EAAY,IAAI,MAAM,IACrB,UAAA,oBAACD,WAAA,EAAQ,MAAA,CAAc,GACzB,GACF;AAEJ,CAAC;AClGM,SAAS,UAAU,OAAuB;AAC/C,QAAM,EAAE,IAAI,YAAY,IAAI,WAAAC,YAAW,YAAY,kBAAkB,UAAU;AAC/E,QAAM,EAAE,MAAM,KAAA,IAAS,WAAW,gBAAgB,EAAE,IAAI;AAExD,SACE,oBAAC,OAAA,EAAI,WAAW,oCAAoC,SAAS,IAAI,OAC/D,UAAA,oBAAC,iBAAiB,UAAjB,EAA0B,OAAO,WAChC,UAAA,oBAAC,iBAAiB,UAAjB,EAA0B,OAAOA,YAC/B,UAAA,QAAQ,oBAAC,UAAA,EAAS,OAAO,KAAA,GAAW,EAAI,EAAA,CAC3C,EAAA,CACF,GACF;AAEJ;ACfA,MAAM,wBAAwB,MAAM,cAAgC,IAAK;AAElE,SAAS,sBAAsB;AACpC,SAAO,WAAW,qBAAqB;AACzC;AAGO,SAAS,iBAAiB,OAA8B;AAC7D,QAAM,EAAE,aAAa;AACrB,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAoE;AAAA,IAC5F,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,EAAA,CACd;AAED,QAAM,QAAQ;AAAA,IACZ,OAAO;AAAA,MACL,GAAG;AAAA,MACH,UAAU,CAACP,YAAmB,SAAS,CAAC,UAAU,EAAE,GAAG,MAAM,MAAM,QAAQ,QAAAA,QAAA,EAAS;AAAA,MACpF,MAAM,MAAM,SAAS,CAAC,UAAU,EAAE,GAAG,MAAM,MAAM,MAAM,QAAQ,KAAA,EAAO;AAAA,MACtE,eAAe,MAAM,SAAS,CAAC,UAAU,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,YAAA,EAAc;AAAA,MACrF,eAAe,MACb,SAAS,CAAC,SAAS;AACjB,YAAI,KAAK,SAAS,cAAc,CAAC,KAAK,QAAQ;AAC5C,iBAAO,EAAE,GAAG,MAAM,MAAM,KAAA;AAAA,QAC1B,WAAW,KAAK,SAAS,cAAc,KAAK,QAAQ;AAClD,iBAAO,EAAE,GAAG,MAAM,MAAM,OAAA;AAAA,QAC1B,OAAO;AACL,iBAAO,EAAE,GAAG,MAAM,MAAM,WAAA;AAAA,QAC1B;AAAA,MACF,CAAC;AAAA,MACH,iBAAiB,MACf,SAAS,CAAC,SAAS;AACjB,YAAI,KAAK,SAAS,gBAAgB,KAAK,QAAQ;AAC7C,iBAAO,EAAE,GAAG,MAAM,MAAM,OAAA;AAAA,QAC1B,WAAW,KAAK,SAAS,gBAAgB,CAAC,KAAK,QAAQ;AACrD,iBAAO,EAAE,GAAG,MAAM,MAAM,KAAA;AAAA,QAC1B,OAAO;AACL,iBAAO,EAAE,GAAG,MAAM,MAAM,aAAA;AAAA,QAC1B;AAAA,MACF,CAAC;AAAA,IAAA;AAAA,IAEL,CAAC,KAAK;AAAA,EAAA;AAGR,SAAO,oBAAC,sBAAsB,UAAtB,EAA+B,OAAe,SAAA,CAAS;AACjE;ACtDO,MAAM,kBAAkB,UAAU,mBAAmB,MAAM;AAChE,QAAM,EAAE,gBAAA,IAAoB,oBAAA;AAC5B,QAAM,YAAY,aAAA;AAClB,QAAM,YAAY,UAAU,UAAU,YAAA;AAEtC,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,SAAS;AAAA,MACT,MAAM,oBAAC,MAAA,EAAK,MAAK,WAAA,CAAW;AAAA,MAC5B,OAAO;AAAA,MACP,cAAY;AAAA,IAAA;AAAA,EAAA;AAGlB,CAAC;ACZM,MAAM,uBAAuB,UAAU,wBAAwB,CAAC,UAAqC;AAC1G,QAAM,EAAE,SAAS;AACjB,QAAM,YAAY,aAAA;AAElB,SACE;AAAA,IAAC,KAAK;AAAA,IAAL;AAAA,MACC,OAAO,UAAU,UAAU,OAAO,MAAA;AAAA,MAClC;AAAA,MACA,OAAO,CAAC,EAAE,UAAU,MAAM,SAAS,UAAU,UAAU,OAAO,SAAA,GAAY;AAAA,MAE1E,UAAA,oBAAC,WAAW,aAAX,EAAuB,QAAQ,UAAU,UAAU,OAAO,SAAO,CAAG;AAAA,IAAA;AAAA,EAAA;AAG3E,CAAC;ACbM,MAAM,qBAAqB,UAAU,sBAAsB,CAAC,UAAmC;AACpG,QAAM,EAAE,SAAS;AACjB,QAAM,YAAY,aAAA;AAElB,SACE;AAAA,IAAC,KAAK;AAAA,IAAL;AAAA,MACC,OAAO,UAAU,UAAU,KAAK,MAAA;AAAA,MAChC;AAAA,MACA,OAAO,CAAC,EAAE,UAAU,MAAM,SAAS,UAAU,UAAU,KAAK,SAAA,GAAY;AAAA,MAExE,UAAA,oBAAC,MAAM,UAAN,EAAe,MAAM,EAAA,CAAG;AAAA,IAAA;AAAA,EAAA;AAG/B,CAAC;ACFM,MAAM,gCAAoD;AAAA,EAC/D,QAAQ,CAAA;AAAA,EACR,MAAM;AACR;AAEO,MAAM,gBAAgB,UAAU,iBAAiB,CAAC,UAA8B;AACrF,QAAM,EAAE,OAAO,OAAO,OAAO,aAAa;AAC1C,QAAM,YAAY,aAAA;AAElB,QAAM,CAAC,IAAI,IAAI,KAAK,QAAA;AAEpB,YAAU,MAAM;AACd,SAAK,eAAe,KAAK;AAAA,EAC3B,GAAG,CAAC,OAAO,IAAI,CAAC;AAEhB,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,QAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,MACV,eAAe;AAAA,MAEf,UAAA;AAAA,QAAA,oBAAC,sBAAA,EAAqB,MAAK,SAAA,CAAS;AAAA,QACpC,oBAAC,oBAAA,EAAmB,MAAK,OAAA,CAAO;AAAA,QAChC,oBAAC,QAAA,EAAO,SAAS,MAAM,MAAK,WAAU,OAAK,MAAC,UAAS,UAClD,UAAA,UAAU,UAAU,YAAU,CACjC;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN,CAAC;ACtCD,SAAS,eAAe,WAAkD;AACxE,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,QAAQ,CAAC,MAAM,UAAU,OAAO,KAAK,GAAG,MAAM,UAAU,OAAO,GAAG,CAAC;AAAA,IACnE,MAAM,UAAU;AAAA,EAAA;AAEpB;AAEA,SAAS,WAAW;AAClB,QAAM,EAAE,MAAM,OAAO,WAAW,6BAAA;AAEhC,QAAM,QAAQ,QAA4B,MAAM;AAC9C,WAAO,eAAe,yBAAI,SAAS;AAAA,EACrC,GAAG,CAAC,EAAE,CAAC;AAEP,SAAO;AACT;AAEA,SAAS,sBAAsB;AAC7B,QAAM,OAAO,WAAW,SAAS,GAAA;AACjC,QAAM,CAAC,eAAe,EAAE,WAAW,IAAI,WAAW,yBAAA;AAElD,QAAM,WAAW;AAAA,IACf,CAAC,UACC,cAAc;AAAA,MACZ,IAAI;AAAA,MACJ,WAAW;AAAA,QACT,UAAU;AAAA,QACV,OAAO;AAAA,UACL,MAAM,MAAM;AAAA,UACZ,QAAQ;AAAA,YACN,OAAO,MAAM,OAAO,CAAC,EAAE,YAAA;AAAA,YACvB,KAAK,MAAM,OAAO,CAAC,EAAE,YAAA;AAAA,UAAY;AAAA,QACnC;AAAA,MACF;AAAA,IACF,CACD,EAAE,OAAA;AAAA,IACL,CAAC,eAAe,IAAI;AAAA,EAAA;AAGtB,QAAM,UAAU;AAAA,IACd,MACE,cAAc;AAAA,MACZ,IAAI;AAAA,MACJ,WAAW;AAAA,QACT,UAAU;AAAA,QACV,OAAO;AAAA,MAAA;AAAA,IACT,CACD,EAAE,OAAA;AAAA,IACL,CAAC,eAAe,IAAI;AAAA,EAAA;AAGtB,SAAO,CAAC,UAAU,WAAW,OAAO;AACtC;AAEO,MAAM,iBAAiB,UAAU,kBAAkB,MAAM;AAC9D,QAAM,YAAY,aAAA;AAClB,QAAM,EAAE,gBAAA,IAAoB,oBAAA;AAC5B,QAAM,QAAQ,SAAA;AACd,QAAM,CAAC,UAAU,YAAY,OAAO,IAAI,oBAAA;AAExC,SACE,qBAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAS;AAAA,QACT,WAAU;AAAA,QACV,MAAK;AAAA,QACL,MAAM,oBAAC,MAAA,EAAK,MAAK,QAAA,CAAQ;AAAA,MAAA;AAAA,IAAA;AAAA,IAE3B,qBAAC,OAAA,EAAI,WAAU,kCACb,UAAA;AAAA,MAAA,oBAAC,MAAA,EAAI,UAAA,UAAU,UAAU,MAAA,GAAQ;AAAA,MACjC,oBAAC,QAAA,EAAO,MAAK,QAAO,SAAS,SAAS,UAAU,YAAY,WAAU,iCACnE,UAAA,UAAU,UAAU,WAAS,CAChC;AAAA,IAAA,GACF;AAAA,wBAEC,eAAA,EAAc,OAAc,MAAM,cAAc,OAAO,SAAA,CAAoB;AAAA,EAAA,GAC9E;AAEJ,CAAC;ACrFM,MAAM,sBAAsB,UAAU,uBAAuB,CAAC,UAAoC;AACvG,QAAM,EAAE,SAAS;AACjB,QAAM,YAAY,aAAA;AAElB,SACE;AAAA,IAAC,KAAK;AAAA,IAAL;AAAA,MACC;AAAA,MACA,OAAO,UAAU,QAAQ,KAAK,MAAA;AAAA,MAC9B,OAAO;AAAA,QACL,EAAE,UAAU,MAAM,SAAS,UAAU,QAAQ,KAAK,WAAS;AAAA,QAC3D,EAAE,KAAK,KAAK,SAAS,UAAU,QAAQ,KAAK,SAAO;AAAA,MAAE;AAAA,MAGvD,8BAAC,OAAA,CAAA,CAAM;AAAA,IAAA;AAAA,EAAA;AAGb,CAAC;ACRD,SAAS,aAAa,OAA0B;AAC9C,QAAM,EAAE,OAAO,SAAA,IAAa;AAC5B,QAAM,EAAE,MAAM,UAAU,WAAA,IAAe,WAAW,uBAAuB,EAAE;AAC3E,QAAM,KAAK,WAAW,SAAS,GAAA;AAC/B,QAAM,aAAa,QAAQ,OAAM,qCAAU,OAAO,CAAC,MAAM,EAAE,OAAO,QAAO,CAAA,GAAI,CAAC,UAAU,EAAE,CAAC;AAE3F,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,QAAO;AAAA,MACP,WAAU;AAAA,MACV,SAAS;AAAA,MACT;AAAA,MACA,YAAY,CAAC,MAAM;AACjB,cAAM,UAAU,MAAO,SAAS,EAAE,EAAE;AAEpC,mCACG,KAAK,MAAL,EAAU,WAAW,UAAU,eAAe,IAC7C,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC;AAAA,YACA,UAAU,MACR,SAAU,MAAO,SAAS,EAAE,EAAE,IAAI,MAAO,OAAO,CAAC,MAAM,MAAM,EAAE,EAAE,IAAI,CAAC,GAAG,OAAQ,EAAE,EAAE,CAAC;AAAA,YAGxF,UAAA,oBAAC,KAAK,KAAK,MAAV,EAAe,QAAQ,oBAAC,QAAA,EAAO,SAAS,EAAA,CAAG,GAAI,OAAO,EAAE,KAAA,CAAM;AAAA,UAAA;AAAA,QAAA,GAEnE;AAAA,MAEJ;AAAA,IAAA;AAAA,EAAA;AAGN;AAEO,MAAM,wBAAwB;AAAA,EACnC;AAAA,EACA,CAAC,UAAsC;AACrC,UAAM,EAAE,SAAS;AACjB,UAAM,YAAY,aAAA;AAElB,WACE;AAAA,MAAC,KAAK;AAAA,MAAL;AAAA,QACC,OAAO,UAAU,QAAQ,QAAQ,MAAA;AAAA,QACjC,OAAO,CAAC,EAAE,UAAU,MAAM,SAAS,UAAU,QAAQ,QAAQ,SAAA,GAAY;AAAA,QACzE;AAAA,QAEA,8BAAC,cAAA,CAAA,CAAa;AAAA,MAAA;AAAA,IAAA;AAAA,EAGpB;AACF;AC/CA,MAAM,gBAAqC;AAAA,EACzC,MAAM;AAAA,EACN,SAAS,CAAA;AACX;AAEO,MAAM,iBAAiB,UAAU,kBAAkB,CAAC,UAA+B;AACxF,QAAM,EAAE,QAAQ,eAAe,UAAU,OAAO,UAAU;AAC1D,QAAM,YAAY,aAAA;AAElB,SACE,qBAAC,QAAK,UAAU,UAAU,QAAO,YAAW,UAAU,MAAM,eAAe,OACzE,UAAA;AAAA,IAAA,oBAAC,qBAAA,EAAoB,MAAK,OAAA,CAAO;AAAA,IACjC,oBAAC,uBAAA,EAAsB,MAAK,UAAA,CAAU;AAAA,IACtC,oBAAC,QAAA,EAAO,SAAS,MAAM,MAAK,WAAU,OAAK,MAAC,UAAS,UAClD,UAAA,UAAU,QAAQ,YAAU,CAC/B;AAAA,EAAA,GACF;AAEJ,CAAC;AC1BD,SAAS,YAAY;AACnB,QAAM,CAAC,KAAK,EAAE,WAAW,IAAI,WAAW,mBAAA;AACxC,QAAM,EAAE,SAAA,IAAa,oBAAA;AAErB,QAAM,WAAW;AAAA,IACf,CAAC,UACC,IAAI;AAAA,MACF,MAAM,MAAM;AAAA,MACZ,SAAS,MAAM;AAAA,IAAA,CAChB,EACE,OAAA,EACA,KAAK,CAAC,OAAO,SAAS,EAAE,CAAC;AAAA,IAC9B,CAAC,KAAK,QAAQ;AAAA,EAAA;AAGhB,SAAO,CAAC,UAAU,SAAS;AAC7B;AAEO,MAAM,kBAAkB,UAAU,mBAAmB,MAAM;AAChE,QAAM,YAAY,aAAA;AAClB,QAAM,CAAC,UAAU,UAAU,IAAI,UAAA;AAC/B,QAAM,EAAE,cAAA,IAAkB,oBAAA;AAE1B,SACE,qBAAC,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAS,MAAM,cAAA;AAAA,QACf,WAAU;AAAA,QACV,MAAK;AAAA,QACL,MAAM,oBAAC,MAAA,EAAK,MAAK,QAAA,CAAQ;AAAA,MAAA;AAAA,IAAA;AAAA,IAE3B,oBAAC,MAAA,EAAI,UAAA,UAAU,QAAQ,SAAQ;AAAA,IAC/B,oBAAC,gBAAA,EAAe,MAAM,cAAc,OAAO,SAAA,CAAoB;AAAA,EAAA,GACjE;AAEJ,CAAC;ACxCM,MAAM,mBAAmB,UAAU,oBAAoB,MAAM;AAClE,QAAM,EAAE,cAAA,IAAkB,oBAAA;AAE1B,SACE,oBAAC,QAAA,EAAK,WAAU,0BACd,UAAA,oBAAC,QAAA,EAAO,WAAU,kBAAiB,SAAS,eAAe,MAAK,KAAI,sBAEpE,GACF;AAEJ,CAAC;ACTM,MAAM,mBAAmB,UAAU,oBAAoB,MAAM;AAClE,SACE,oBAAC,UAAK,WAAU,0BACd,+BAAC,MAAM,SAAN,EAAc,WAAU,wBACvB,UAAA;AAAA,IAAA,oBAAC,kBAAA,EAAiB;AAAA,wBACjB,iBAAA,CAAA,CAAgB;AAAA,EAAA,EAAA,CACnB,EAAA,CACF;AAEJ,CAAC;ACRD,SAAS,UAAU;AACjB,QAAM,EAAE,MAAM,UAAU,WAAW,oBAAA;AACnC,SAAO;AAAA,IACL,OACE,+BAAO;AAAA,MACL,CAAC,OAAsB;AAAA,QACrB,IAAI,EAAE;AAAA,QACN,MAAM,EAAE;AAAA,QACR,aAAa,EAAE;AAAA,QACf,mBAAmB,EAAE;AAAA,MAAA;AAAA,UAEpB,CAAA;AAAA,IACP,CAAC,KAAK;AAAA,EAAA;AAEV;AAEO,MAAM,gBAAgB,UAAU,iBAAiB,MAAM;AAC5D,QAAM,EAAE,QAAAA,SAAQ,SAAA,IAAa,oBAAA;AAC7B,QAAM,OAAO,QAAA;AAEb,6BAAQ,UAAA,EAAS,OAAO,MAAM,UAAUA,SAAQ,UAAU,UAAU;AACtE,CAAC;ACvBM,MAAM,iBAAiB,UAAU,kBAAkB,MAAM;AAC9D,SACE,qBAAC,OAAA,EAAI,WAAU,gBACb,UAAA;AAAA,IAAA,oBAAC,kBAAA,EAAiB;AAAA,wBACjB,eAAA,CAAA,CAAc;AAAA,EAAA,GACjB;AAEJ,CAAC;ACTM,MAAM,kBAAkB,UAAU,mBAAmB,MAAM;AAChE,SAAO,oBAAC,OAAA,EAAI,WAAU,gBAAA,CAAgB;AACxC,CAAC;ACFM,MAAM,kBAAkB,UAAU,mBAAmB,0BAAO,OAAA,EAAI,WAAU,iBAAgB,CAAM;ACKhG,MAAM,gBAAgB,UAAU,iBAAiB,MAAM;AAC5D,QAAM,EAAE,QAAAA,SAAQ,KAAA,IAAS,oBAAA;AACzB,QAAM,OAAO,WAAW,gBAAgBA,OAAM;AAE9C,SACE,qBAAC,OAAA,EAAI,WAAU,eACZ,UAAA;AAAA,IAAA,SAAS,UAAU,QAAQ,oBAAC,UAAA,EAAS,OAAO,QAAWA,OAAQ;AAAA,IAC/D,SAAS,cAAc,oBAAC,iBAAA,CAAA,CAAgB;AAAA,IACxC,SAAS,gBAAgB,oBAAC,gBAAA,CAAA,CAAe;AAAA,EAAA,GAC5C;AAEJ,CAAC;ACdM,MAAM,gBAAgB,UAAU,iBAAiB,MACtD,qBAAC,OAAA,EAAI,WAAU,eACb,UAAA;AAAA,EAAA,oBAAC,gBAAA,EAAe;AAAA,sBACf,eAAA,CAAA,CAAc;AAAA,GACjB,CACD;ACgBD,SAAS,QAAQ,OAAkD;AACjE,QAAM,EAAE,YAAY,IAAI,MAAA,IAAU;AAClC,QAAM,EAAE,MAAM,UAAU,WAAW,oBAAA;AACnC,QAAM,EAAE,UAAU,MAAM,QAAAA,QAAA,IAAW,oBAAA;AACnC,QAAM,mBAAmB,OAAO,KAAK;AAErC,YAAU,MAAM;AACd,QAAI,SAAS,CAAC,MAAM,KAAK,CAAC,MAAM,EAAE,OAAOA,OAAM,GAAG;AAChD,YAAM,SAAS,SAAS,MAAM,CAAC,EAAE,EAAE,IAAI,KAAA;AAAA,IACzC;AAAA,EAGF,GAAG,CAAC,OAAOA,OAAM,CAAC;AAElB,YAAU,MAAM;AACd,QAAI,SAAS,CAAC,iBAAiB,SAAS;AACtC,uBAAiB,UAAU;AAC3B,YAAM,UAAU,SAAS,MAAM,CAAC,EAAE,EAAE;AAAA,IACtC;AAAA,EAEF,GAAG,CAAC,KAAK,CAAC;AAEV,SACE,qBAAC,OAAA,EAAI,WAAW,YAAY,qCAAqC,OAC/D,UAAA;AAAA,IAAA,oBAAC,iBAAA,EAAgB;AAAA,wBAChB,eAAA,EAAc;AAAA,wBACd,iBAAA,CAAA,CAAgB;AAAA,EAAA,GACnB;AAEJ;AAEA,MAAMQ,sBAA6C;AAAA,EACjD,iBAAiB;AAAA,EACjB,iBAAiB;AACnB;AAEO,MAAM,iBAAmC,CAAC,UAAU;AACzD,QAAM,EAAE,YAAY,kBAAkB,WAAAD,aAAYC,wBAAsB;AACxE,QAAM,iBAAiB,QAAQ,MAAM,OAAO,OAAO,IAAIA,qBAAmBD,UAAS,GAAG,CAACA,UAAS,CAAC;AAEjG,SACE,oBAAC,iBAAiB,UAAjB,EAA0B,OAAO,WAChC,UAAA,oBAAC,iBAAiB,UAAjB,EAA0B,OAAO,gBAChC,UAAA,oBAAC,oBACC,UAAA,oBAAC,SAAA,EAAS,GAAG,MAAA,CAAO,GACtB,GACF,EAAA,CACF;AAEJ;AClEO,MAAM,gBAAgB,MAAM,cAAkC,IAAK;AAEnE,SAAS,mBAAmB;AACjC,SAAO,MAAM,WAAW,aAAa;AACvC;ACPO,MAAM,gBAAgB,UAAU,iBAAiB,MAAM;AAC5D,QAAM,EAAE,OAAO,QAAA,IAAY,iBAAA;AAE3B,MAAI,CAAC,OAAO;AACV,+BACG,SAAA,EAAQ,OAAM,gBACb,UAAA,oBAAC,QAAA,EAAO,MAAK,QAAO,0BAAO,MAAA,EAAK,MAAK,SAAQ,GAAI,SAAS,MAAM,QAAQ,IAAI,GAAG,GACjF;AAAA,EAEJ;AAEA,6BACG,SAAA,EAAQ,OAAM,kBACb,UAAA,oBAAC,QAAA,EAAO,MAAK,QAAO,0BAAO,MAAA,EAAK,MAAK,WAAU,GAAI,SAAS,MAAM,QAAQ,KAAK,GAAG,GACpF;AAEJ,CAAC;ACDD,SAAS,cAAc,OAAyB;AAC9C,QAAM,EAAE,aAAa;AACrB,QAAM,EAAE,MAAM,WAAW,WAAW,kBAAkB,EAAE,IAAI,UAAU;AACtE,QAAM,EAAE,MAAM,YAAA,IAAgB,WAAW,6BAA6B,EAAE,UAAU;AAClF,QAAM,EAAE,IAAI,MAAM,SAAS,mBAAmB,MAAA,IAAU,UAAU,CAAA;AAClE,QAAM,EAAE,UAAU,QAAA,IAAY,eAAe,CAAA;AAE7C,QAAM,CAAC,IAAI,IAAI,WAAW,6BAAA;AAC1B,QAAM,SAAS,YAAY,CAACF,QAAe,KAAK,EAAE,IAAAA,IAAAA,CAAI,GAAG,CAAC,IAAI,CAAC;AAE/D,QAAM,CAAC,WAAW,EAAE,WAAW,oBAAoB,IAAI,WAAW,sCAAA;AAClE,QAAM,SAAS,YAAY,MAAM,UAAU,EAAE,SAAA,CAAU,GAAG,CAAC,WAAW,QAAQ,CAAC;AAE/E,QAAM,CAAC,IAAI,IAAI,WAAW,6BAAA;AAC1B,QAAM,SAAS;AAAA,IACb,CAAC,YAAyB,KAAK,EAAE,MAAM,SAAS,SAAA,CAAU,EAAE,OAAA;AAAA,IAC5D,CAAC,UAAU,IAAI;AAAA,EAAA;AAGjB,QAAM,EAAE,MAAM,cAAc,WAAW,kCAAA;AAEvC,QAAM,eAAe,QAAQ,MAAM;AACjC,QAAI,CAAC,IAAI;AACP,aAAO;AAAA,IACT;AAEA,UAAM,SAA4B;AAAA,MAChC,OAAO,EAAE,IAAS,MAAa,QAAQ,CAAC,SAAS,mBAAmB,qBAAqB,KAAA;AAAA,MACzF;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA,gBAAgB,CAAC;AAAA,MACjB,WAAW,CAACA,QACV,UAAW;AAAA,QACT,CAAC,SAAS,qBAAqB,KAAK,KAAK,EAAE,CAAC,MAAM,qBAAqBA,GAAE,EAAE,CAAC,KAAKA,OAAM,KAAK;AAAA,MAAA;AAAA,IAC9F;AAGJ,WAAO;AAAA,EACT,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AAED,QAAM,CAAC,WAAW,IAAI,WAAW,uBAAA;AAEjC,QAAM,gBAAgB;AAAA,IACpB,MACE,SACI;AAAA,MACE,IAAI,OAAO;AAAA,MACX,OAAO,OAAO;AAAA,MACd,SAAS,CAAC,UAAU,YAAY,EAAE,IAAI,OAAO,IAAI,OAAO,MAAA,CAAO,EAAE,OAAA;AAAA,IAAO,IAE1E;AAAA,IACN,CAAC,QAAQ,WAAW;AAAA,EAAA;AAGtB,SAAO,CAAC,cAAc,aAAa;AACrC;AAEA,MAAM,oBAA0C;AAAA,EAC9C,qBAAqB,MAAM,oBAAC,eAAA,CAAA,CAAc;AAC5C;AAEO,SAAS,YAAY,OAAyB;AACnD,QAAM,EAAE,UAAU,WAAAE,YAAW,YAAY,kBAAkB,YAAY,OAAO;AAC9E,QAAM,CAAC,cAAc,aAAa,IAAI,cAAc,KAAK;AACzD,QAAM,sBAAsB,QAAQ,OAAO,EAAE,GAAG,mBAAmB,GAAGA,WAAA,IAAc,CAACA,UAAS,CAAC;AAE/F,YAAU,MAAM;AACd,eAAW,SAAS,OAAO,gBAAgB,QAAQ;AAEnD,WAAO,MAAM;AACX,iBAAW,SAAS,OAAO,qBAAqB,QAAQ;AAAA,IAC1D;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAEb,MAAI,CAAC,gBAAgB,CAAC,eAAe;AACnC,WAAO;AAAA,EACT;AAEA,SACE,oBAAC,iBAAiB,UAAjB,EAA0B,OAAO,WAChC,UAAA,oBAAC,cAAc,UAAd,EAAuB,OAAO,eAC7B,UAAA,oBAAC,iBAAiB,UAAjB,EAA0B,OAAO,qBAChC,UAAA,oBAAC,OAAA,EAAI,WAAW,gCAAgC,SAAS,IACtD,UAAA,gBAAgB,oBAAC,cAAA,EAAc,GAAG,aAAA,CAAc,EAAA,CACnD,EAAA,CACF,GACF,GACF;AAEJ;ACpHO,MAAM,UAAU;AAAA,EACrB,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,MAAM;AACR;"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { ChatifyApiSettings } from './baseApi';
|
|
2
|
+
import { Account, AddChatMemberRequest, Chat, ChatListItem, ChatMessage, RemoveChatMemberRequest, SendChatMessageRequest, SendThreadMessageRequest, Thread, ThreadMessage, ThreadWatchListItem, UpdateAccountRequest } from '../types';
|
|
3
|
+
import { DebounceValue } from '../debounce';
|
|
4
|
+
export interface ChatMessageListResult {
|
|
5
|
+
messages: ChatMessage[];
|
|
6
|
+
hasMore: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface ThreadMessageList {
|
|
9
|
+
messages: ThreadMessage[];
|
|
10
|
+
hasMore: boolean;
|
|
11
|
+
}
|
|
12
|
+
declare const __chatifyApi: import('@reduxjs/toolkit/query').Api<import('@reduxjs/toolkit/query').BaseQueryFn, {
|
|
13
|
+
getAccountList: import('@reduxjs/toolkit/query').QueryDefinition<{
|
|
14
|
+
ids?: string[];
|
|
15
|
+
}, import('@reduxjs/toolkit/query').BaseQueryFn, "chat" | "account" | "message" | "thread" | "thread-message", Account[], "chatify", unknown>;
|
|
16
|
+
geCurrentUserAccount: import('@reduxjs/toolkit/query').QueryDefinition<void, import('@reduxjs/toolkit/query').BaseQueryFn, "chat" | "account" | "message" | "thread" | "thread-message", Account | null, "chatify", unknown>;
|
|
17
|
+
updateAccount: import('@reduxjs/toolkit/query').MutationDefinition<UpdateAccountRequest, import('@reduxjs/toolkit/query').BaseQueryFn, "chat" | "account" | "message" | "thread" | "thread-message", void, "chatify", unknown>;
|
|
18
|
+
getChat: import('@reduxjs/toolkit/query').QueryDefinition<{
|
|
19
|
+
id: string;
|
|
20
|
+
}, import('@reduxjs/toolkit/query').BaseQueryFn, "chat" | "account" | "message" | "thread" | "thread-message", Chat, "chatify", unknown>;
|
|
21
|
+
addChat: import('@reduxjs/toolkit/query').MutationDefinition<{
|
|
22
|
+
name: string;
|
|
23
|
+
members: string[];
|
|
24
|
+
}, import('@reduxjs/toolkit/query').BaseQueryFn, "chat" | "account" | "message" | "thread" | "thread-message", string, "chatify", unknown>;
|
|
25
|
+
updateChatName: import('@reduxjs/toolkit/query').MutationDefinition<{
|
|
26
|
+
id: string;
|
|
27
|
+
name: string;
|
|
28
|
+
}, import('@reduxjs/toolkit/query').BaseQueryFn, "chat" | "account" | "message" | "thread" | "thread-message", void, "chatify", unknown>;
|
|
29
|
+
getChatList: import('@reduxjs/toolkit/query').QueryDefinition<void, import('@reduxjs/toolkit/query').BaseQueryFn, "chat" | "account" | "message" | "thread" | "thread-message", ChatListItem[], "chatify", unknown>;
|
|
30
|
+
removeChatMember: import('@reduxjs/toolkit/query').MutationDefinition<RemoveChatMemberRequest, import('@reduxjs/toolkit/query').BaseQueryFn, "chat" | "account" | "message" | "thread" | "thread-message", void, "chatify", unknown>;
|
|
31
|
+
addChatMember: import('@reduxjs/toolkit/query').MutationDefinition<AddChatMemberRequest, import('@reduxjs/toolkit/query').BaseQueryFn, "chat" | "account" | "message" | "thread" | "thread-message", void, "chatify", unknown>;
|
|
32
|
+
getChatMessageList: import('@reduxjs/toolkit/query').QueryDefinition<{
|
|
33
|
+
chatId: string;
|
|
34
|
+
}, import('@reduxjs/toolkit/query').BaseQueryFn, "chat" | "account" | "message" | "thread" | "thread-message", ChatMessageListResult, "chatify", unknown>;
|
|
35
|
+
fetchNextChatMessageList: import('@reduxjs/toolkit/query').MutationDefinition<{
|
|
36
|
+
chatId: string;
|
|
37
|
+
}, import('@reduxjs/toolkit/query').BaseQueryFn, "chat" | "account" | "message" | "thread" | "thread-message", void, "chatify", unknown>;
|
|
38
|
+
sendChatMessage: import('@reduxjs/toolkit/query').MutationDefinition<SendChatMessageRequest, import('@reduxjs/toolkit/query').BaseQueryFn, "chat" | "account" | "message" | "thread" | "thread-message", void, "chatify", unknown>;
|
|
39
|
+
readChatMessage: import('@reduxjs/toolkit/query').MutationDefinition<{
|
|
40
|
+
id: string;
|
|
41
|
+
}, import('@reduxjs/toolkit/query').BaseQueryFn, "chat" | "account" | "message" | "thread" | "thread-message", void, "chatify", unknown>;
|
|
42
|
+
getChatMessageReadQueue: import('@reduxjs/toolkit/query').QueryDefinition<void, import('@reduxjs/toolkit/query').BaseQueryFn, "chat" | "account" | "message" | "thread" | "thread-message", DebounceValue<string>[], "chatify", unknown>;
|
|
43
|
+
getWatchThreadList: import('@reduxjs/toolkit/query').QueryDefinition<void, import('@reduxjs/toolkit/query').BaseQueryFn, "chat" | "account" | "message" | "thread" | "thread-message", ThreadWatchListItem[], "chatify", unknown>;
|
|
44
|
+
getThread: import('@reduxjs/toolkit/query').QueryDefinition<{
|
|
45
|
+
id: string;
|
|
46
|
+
}, import('@reduxjs/toolkit/query').BaseQueryFn, "chat" | "account" | "message" | "thread" | "thread-message", Thread, "chatify", unknown>;
|
|
47
|
+
watchThread: import('@reduxjs/toolkit/query').MutationDefinition<{
|
|
48
|
+
id: string;
|
|
49
|
+
watch: boolean;
|
|
50
|
+
}, import('@reduxjs/toolkit/query').BaseQueryFn, "chat" | "account" | "message" | "thread" | "thread-message", void, "chatify", unknown>;
|
|
51
|
+
getThreadMessageList: import('@reduxjs/toolkit/query').QueryDefinition<{
|
|
52
|
+
threadId: string;
|
|
53
|
+
}, import('@reduxjs/toolkit/query').BaseQueryFn, "chat" | "account" | "message" | "thread" | "thread-message", ThreadMessageList, "chatify", unknown>;
|
|
54
|
+
fetchNextThreadMessageList: import('@reduxjs/toolkit/query').MutationDefinition<{
|
|
55
|
+
threadId: string;
|
|
56
|
+
}, import('@reduxjs/toolkit/query').BaseQueryFn, "chat" | "account" | "message" | "thread" | "thread-message", void, "chatify", unknown>;
|
|
57
|
+
sendThreadMessage: import('@reduxjs/toolkit/query').MutationDefinition<SendThreadMessageRequest, import('@reduxjs/toolkit/query').BaseQueryFn, "chat" | "account" | "message" | "thread" | "thread-message", string, "chatify", unknown>;
|
|
58
|
+
readThreadMessage: import('@reduxjs/toolkit/query').MutationDefinition<{
|
|
59
|
+
id: string;
|
|
60
|
+
}, import('@reduxjs/toolkit/query').BaseQueryFn, "chat" | "account" | "message" | "thread" | "thread-message", void, "chatify", unknown>;
|
|
61
|
+
getThreadMessageReadQueue: import('@reduxjs/toolkit/query').QueryDefinition<void, import('@reduxjs/toolkit/query').BaseQueryFn, "chat" | "account" | "message" | "thread" | "thread-message", DebounceValue<string>[], "chatify", unknown>;
|
|
62
|
+
}, "chatify", "chat" | "account" | "message" | "thread" | "thread-message", typeof import('@reduxjs/toolkit/query').coreModuleName | typeof import('@reduxjs/toolkit/query/react').reactHooksModuleName>;
|
|
63
|
+
export declare function useChatListItem(id: string | null): ChatListItem | null | undefined;
|
|
64
|
+
export declare function useUnreadThreadMessageCount(): readonly [number | null, {
|
|
65
|
+
status: import("@reduxjs/toolkit/query").QueryStatus.uninitialized;
|
|
66
|
+
error?: undefined;
|
|
67
|
+
fulfilledTimeStamp?: undefined;
|
|
68
|
+
originalArgs?: undefined;
|
|
69
|
+
requestId?: undefined;
|
|
70
|
+
endpointName?: string | undefined;
|
|
71
|
+
startedTimeStamp?: undefined;
|
|
72
|
+
isLoading: false;
|
|
73
|
+
isSuccess: false;
|
|
74
|
+
isError: false;
|
|
75
|
+
currentData?: ThreadWatchListItem[] | undefined;
|
|
76
|
+
isFetching: false;
|
|
77
|
+
isUninitialized: true;
|
|
78
|
+
refetch: () => import('@reduxjs/toolkit/query').QueryActionCreatorResult<import('@reduxjs/toolkit/query').QueryDefinition<void, import('@reduxjs/toolkit/query').BaseQueryFn, "chat" | "account" | "message" | "thread" | "thread-message", ThreadWatchListItem[], "chatify", unknown>>;
|
|
79
|
+
} | {
|
|
80
|
+
status: import('@reduxjs/toolkit/query').QueryStatus;
|
|
81
|
+
error?: unknown;
|
|
82
|
+
fulfilledTimeStamp?: number | undefined;
|
|
83
|
+
originalArgs?: void | undefined;
|
|
84
|
+
requestId?: string | undefined;
|
|
85
|
+
endpointName?: string | undefined;
|
|
86
|
+
startedTimeStamp?: number | undefined;
|
|
87
|
+
isUninitialized: false;
|
|
88
|
+
isSuccess: false;
|
|
89
|
+
isError: false;
|
|
90
|
+
currentData?: ThreadWatchListItem[] | undefined;
|
|
91
|
+
isLoading: true;
|
|
92
|
+
isFetching: boolean;
|
|
93
|
+
refetch: () => import('@reduxjs/toolkit/query').QueryActionCreatorResult<import('@reduxjs/toolkit/query').QueryDefinition<void, import('@reduxjs/toolkit/query').BaseQueryFn, "chat" | "account" | "message" | "thread" | "thread-message", ThreadWatchListItem[], "chatify", unknown>>;
|
|
94
|
+
} | {
|
|
95
|
+
status: import('@reduxjs/toolkit/query').QueryStatus;
|
|
96
|
+
originalArgs?: void | undefined;
|
|
97
|
+
requestId?: string | undefined;
|
|
98
|
+
endpointName?: string | undefined;
|
|
99
|
+
startedTimeStamp?: number | undefined;
|
|
100
|
+
isUninitialized: false;
|
|
101
|
+
isLoading: false;
|
|
102
|
+
isError: false;
|
|
103
|
+
currentData?: ThreadWatchListItem[] | undefined;
|
|
104
|
+
isSuccess: true;
|
|
105
|
+
isFetching: true;
|
|
106
|
+
error: undefined;
|
|
107
|
+
fulfilledTimeStamp: number;
|
|
108
|
+
refetch: () => import('@reduxjs/toolkit/query').QueryActionCreatorResult<import('@reduxjs/toolkit/query').QueryDefinition<void, import('@reduxjs/toolkit/query').BaseQueryFn, "chat" | "account" | "message" | "thread" | "thread-message", ThreadWatchListItem[], "chatify", unknown>>;
|
|
109
|
+
} | {
|
|
110
|
+
status: import('@reduxjs/toolkit/query').QueryStatus;
|
|
111
|
+
originalArgs?: void | undefined;
|
|
112
|
+
requestId?: string | undefined;
|
|
113
|
+
endpointName?: string | undefined;
|
|
114
|
+
startedTimeStamp?: number | undefined;
|
|
115
|
+
isUninitialized: false;
|
|
116
|
+
isLoading: false;
|
|
117
|
+
isError: false;
|
|
118
|
+
isSuccess: true;
|
|
119
|
+
isFetching: false;
|
|
120
|
+
error: undefined;
|
|
121
|
+
currentData: ThreadWatchListItem[];
|
|
122
|
+
fulfilledTimeStamp: number;
|
|
123
|
+
refetch: () => import('@reduxjs/toolkit/query').QueryActionCreatorResult<import('@reduxjs/toolkit/query').QueryDefinition<void, import('@reduxjs/toolkit/query').BaseQueryFn, "chat" | "account" | "message" | "thread" | "thread-message", ThreadWatchListItem[], "chatify", unknown>>;
|
|
124
|
+
} | {
|
|
125
|
+
status: import('@reduxjs/toolkit/query').QueryStatus;
|
|
126
|
+
fulfilledTimeStamp?: number | undefined;
|
|
127
|
+
originalArgs?: void | undefined;
|
|
128
|
+
requestId?: string | undefined;
|
|
129
|
+
endpointName?: string | undefined;
|
|
130
|
+
startedTimeStamp?: number | undefined;
|
|
131
|
+
isUninitialized: false;
|
|
132
|
+
isLoading: false;
|
|
133
|
+
isSuccess: false;
|
|
134
|
+
currentData?: ThreadWatchListItem[] | undefined;
|
|
135
|
+
isFetching: false;
|
|
136
|
+
isError: true;
|
|
137
|
+
error: unknown;
|
|
138
|
+
refetch: () => import('@reduxjs/toolkit/query').QueryActionCreatorResult<import('@reduxjs/toolkit/query').QueryDefinition<void, import('@reduxjs/toolkit/query').BaseQueryFn, "chat" | "account" | "message" | "thread" | "thread-message", ThreadWatchListItem[], "chatify", unknown>>;
|
|
139
|
+
}];
|
|
140
|
+
type ChatifyApi = typeof __chatifyApi & {
|
|
141
|
+
settings: ChatifyApiSettings;
|
|
142
|
+
useChatListItem: typeof useChatListItem;
|
|
143
|
+
useUnreadThreadMessageCount: typeof useUnreadThreadMessageCount;
|
|
144
|
+
};
|
|
145
|
+
export declare const chatifyApi: ChatifyApi;
|
|
146
|
+
export {};
|
package/package.json
CHANGED
package/src/core/api/api.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DEFAULT_MESSAGE_LIST_TAKE, __baseApi, __settings } from './baseApi';
|
|
1
|
+
import { ChatifyApiSettings, DEFAULT_MESSAGE_LIST_TAKE, __baseApi, __settings } from './baseApi';
|
|
2
2
|
import { useSelector } from 'react-redux';
|
|
3
3
|
import {
|
|
4
4
|
Account,
|
|
@@ -662,7 +662,13 @@ export function useUnreadThreadMessageCount() {
|
|
|
662
662
|
return [count, state] as const;
|
|
663
663
|
}
|
|
664
664
|
|
|
665
|
-
|
|
665
|
+
type ChatifyApi = typeof __chatifyApi & {
|
|
666
|
+
settings: ChatifyApiSettings;
|
|
667
|
+
useChatListItem: typeof useChatListItem;
|
|
668
|
+
useUnreadThreadMessageCount: typeof useUnreadThreadMessageCount;
|
|
669
|
+
};
|
|
670
|
+
|
|
671
|
+
export const chatifyApi: ChatifyApi = Object.assign(__chatifyApi, {
|
|
666
672
|
settings: __settings,
|
|
667
673
|
useChatListItem,
|
|
668
674
|
useUnreadThreadMessageCount,
|