diff --git a/packages/devextreme-angular/src/ui/chat/index.ts b/packages/devextreme-angular/src/ui/chat/index.ts index 33611204a5e..923e1b0dfc8 100644 --- a/packages/devextreme-angular/src/ui/chat/index.ts +++ b/packages/devextreme-angular/src/ui/chat/index.ts @@ -24,7 +24,7 @@ import { import { Store } from 'devextreme/data'; import DataSource, { Options as DataSourceOptions } from 'devextreme/data/data_source'; -import { ChatError, DisposingEvent, InitializedEvent, Message, MessageSendEvent, OptionChangedEvent, User } from 'devextreme/ui/chat'; +import { ChatError, DisposingEvent, InitializedEvent, Message, MessageSendEvent, OptionChangedEvent, TypingEndEvent, TypingStartEvent, User } from 'devextreme/ui/chat'; import DxChat from 'devextreme/ui/chat'; @@ -299,6 +299,22 @@ export class DxChatComponent extends DxComponent implements OnDestroy, OnChanges */ @Output() onOptionChanged: EventEmitter; + /** + + * [descr:dxChatOptions.onTypingEnd] + + + */ + @Output() onTypingEnd: EventEmitter; + + /** + + * [descr:dxChatOptions.onTypingStart] + + + */ + @Output() onTypingStart: EventEmitter; + /** * This member supports the internal infrastructure and is not intended to be used directly from your code. @@ -463,6 +479,8 @@ export class DxChatComponent extends DxComponent implements OnDestroy, OnChanges { subscribe: 'initialized', emit: 'onInitialized' }, { subscribe: 'messageSend', emit: 'onMessageSend' }, { subscribe: 'optionChanged', emit: 'onOptionChanged' }, + { subscribe: 'typingEnd', emit: 'onTypingEnd' }, + { subscribe: 'typingStart', emit: 'onTypingStart' }, { emit: 'accessKeyChange' }, { emit: 'activeStateEnabledChange' }, { emit: 'dataSourceChange' }, diff --git a/packages/devextreme-react/src/chat.ts b/packages/devextreme-react/src/chat.ts index 22572ba2b9a..a9e5f68284c 100644 --- a/packages/devextreme-react/src/chat.ts +++ b/packages/devextreme-react/src/chat.ts @@ -8,7 +8,7 @@ import dxChat, { import { Component as BaseComponent, IHtmlOptions, ComponentRef, NestedComponentMeta } from "./core/component"; import NestedOption from "./core/nested-option"; -import type { Message, DisposingEvent, InitializedEvent, MessageSendEvent, User as ChatUser } from "devextreme/ui/chat"; +import type { Message, DisposingEvent, InitializedEvent, MessageSendEvent, TypingEndEvent, TypingStartEvent, User as ChatUser } from "devextreme/ui/chat"; type ReplaceFieldTypes = { [P in keyof TSource]: P extends keyof TReplacement ? TReplacement[P] : TSource[P]; @@ -18,6 +18,8 @@ type IChatOptionsNarrowedEvents = { onDisposing?: ((e: DisposingEvent) => void); onInitialized?: ((e: InitializedEvent) => void); onMessageSend?: ((e: MessageSendEvent) => void); + onTypingEnd?: ((e: TypingEndEvent) => void); + onTypingStart?: ((e: TypingStartEvent) => void); } type IChatOptions = React.PropsWithChildren & IHtmlOptions & { @@ -43,7 +45,7 @@ const Chat = memo( ), [baseRef.current]); const subscribableOptions = useMemo(() => (["items"]), []); - const independentEvents = useMemo(() => (["onDisposing","onInitialized","onMessageSend"]), []); + const independentEvents = useMemo(() => (["onDisposing","onInitialized","onMessageSend","onTypingEnd","onTypingStart"]), []); const defaults = useMemo(() => ({ defaultItems: "items", diff --git a/packages/devextreme-vue/src/chat.ts b/packages/devextreme-vue/src/chat.ts index 03d7e8a84f0..40806bb420b 100644 --- a/packages/devextreme-vue/src/chat.ts +++ b/packages/devextreme-vue/src/chat.ts @@ -19,6 +19,8 @@ type AccessibleOptions = Pick & { user?: User }; -type TypingEndEvent = NativeEventInfo & { user?: User }; - type Properties = ChatProperties & { title: string; showDayHeaders: boolean; - onTypingStart?: ((e: TypingStartEvent) => void); - onTypingEnd?: ((e: TypingEndEvent) => void); }; class Chat extends Widget { diff --git a/packages/devextreme/js/ui/chat.d.ts b/packages/devextreme/js/ui/chat.d.ts index 3c1d3f414f1..d219ae695c7 100644 --- a/packages/devextreme/js/ui/chat.d.ts +++ b/packages/devextreme/js/ui/chat.d.ts @@ -42,6 +42,28 @@ export type MessageSendEvent = NativeEventInfo & { + /** @docid _ui_chat_TypingStartEvent.user */ + readonly user?: User; +}; + +/** + * @docid _ui_chat_TypingEndEvent + * @public + * @type object + * @inherits EventInfo + */ +export type TypingEndEvent = EventInfo & { + /** @docid _ui_chat_TypingEndEvent.user */ + readonly user?: User; +}; + /** * @docid * @namespace DevExpress.ui.dxChat @@ -170,12 +192,28 @@ export interface dxChatOptions extends WidgetOptions { errors?: Array; /** * @docid - * @default null + * @default undefined * @type_function_param1 e:{ui/chat:MessageSendEvent} * @action * @public */ onMessageSend?: ((e: MessageSendEvent) => void); + /** + * @docid + * @default undefined + * @type_function_param1 e:{ui/chat:TypingStartEvent} + * @action + * @public + */ + onTypingStart?: ((e: TypingEndEvent) => void); + /** + * @docid + * @default undefined + * @type_function_param1 e:{ui/chat:TypingEndEvent} + * @action + * @public + */ + onTypingEnd?: ((e: TypingEndEvent) => void); } /** @@ -212,7 +250,7 @@ import { CheckedEvents } from '../core'; type FilterOutHidden = Omit; -type EventsIntegrityCheckingHelper = CheckedEvents, Required, 'onMessageSend'>; +type EventsIntegrityCheckingHelper = CheckedEvents, Required, 'onMessageSend' | 'onTypingStart' | 'onTypingEnd'>; /** * @hidden diff --git a/packages/devextreme/js/ui/chat_types.d.ts b/packages/devextreme/js/ui/chat_types.d.ts index 4a4fa625a73..ed8ffc19bca 100644 --- a/packages/devextreme/js/ui/chat_types.d.ts +++ b/packages/devextreme/js/ui/chat_types.d.ts @@ -3,6 +3,8 @@ export { InitializedEvent, OptionChangedEvent, MessageSendEvent, + TypingStartEvent, + TypingEndEvent, User, ChatError, Message, diff --git a/packages/devextreme/ts/dx.all.d.ts b/packages/devextreme/ts/dx.all.d.ts index 145e80d9389..337e77a1b6a 100644 --- a/packages/devextreme/ts/dx.all.d.ts +++ b/packages/devextreme/ts/dx.all.d.ts @@ -9527,6 +9527,27 @@ declare module DevExpress.ui { export type OptionChangedEvent = DevExpress.events.EventInfo & DevExpress.events.ChangedOptionInfo; export type Properties = dxChatOptions; + /** + * [descr:_ui_chat_TypingEndEvent] + */ + export type TypingEndEvent = DevExpress.events.EventInfo & { + /** + * [descr:_ui_chat_TypingEndEvent.user] + */ + readonly user?: User; + }; + /** + * [descr:_ui_chat_TypingStartEvent] + */ + export type TypingStartEvent = DevExpress.events.NativeEventInfo< + dxChat, + UIEvent & { target: HTMLInputElement } + > & { + /** + * [descr:_ui_chat_TypingStartEvent.user] + */ + readonly user?: User; + }; } /** * [descr:dxChatOptions] @@ -9565,6 +9586,14 @@ declare module DevExpress.ui { * [descr:dxChatOptions.onMessageSend] */ onMessageSend?: (e: DevExpress.ui.dxChat.MessageSendEvent) => void; + /** + * [descr:dxChatOptions.onTypingStart] + */ + onTypingStart?: (e: DevExpress.ui.dxChat.TypingEndEvent) => void; + /** + * [descr:dxChatOptions.onTypingEnd] + */ + onTypingEnd?: (e: DevExpress.ui.dxChat.TypingEndEvent) => void; } /** * [descr:dxCheckBox]