@bcc-code/vue-bcc-chat-ui 7.2.3 → 7.2.7
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.
- package/dist/App.vue.d.ts +4 -0
- package/dist/FixtureApp.vue.d.ts +4 -0
- package/dist/auth.d.ts +3 -0
- package/dist/chat/accessToken.d.ts +11 -0
- package/dist/chat/avatar.d.ts +3 -0
- package/dist/chat/cacheScope.d.ts +13 -0
- package/dist/chat/client.d.ts +7 -0
- package/dist/chat/clipboardFiles.d.ts +5 -0
- package/dist/chat/conversationState.d.ts +17 -0
- package/dist/chat/data.d.ts +18 -0
- package/dist/chat/environment.d.ts +8 -0
- package/dist/chat/i18n/en.d.ts +151 -0
- package/dist/chat/i18n/nb.d.ts +151 -0
- package/dist/chat/i18n/types.d.ts +2 -0
- package/dist/chat/index.d.ts +240 -0
- package/dist/chat/localization.d.ts +17 -0
- package/dist/chat/mentions.d.ts +33 -0
- package/dist/chat/messageText.d.ts +21 -0
- package/dist/chat/mockClient.d.ts +13 -0
- package/dist/chat/offlineStore.d.ts +55 -0
- package/dist/chat/participants.d.ts +8 -0
- package/dist/chat/pinnedMessages.d.ts +12 -0
- package/dist/chat/publicChannelMessageFallback.d.ts +1 -0
- package/dist/chat/reactions.d.ts +8 -0
- package/dist/chat/richText.d.ts +9 -0
- package/dist/chat/runtime.d.ts +3 -0
- package/dist/chat/theme.d.ts +19 -0
- package/dist/chat/types.d.ts +409 -0
- package/dist/components/chat/BccChat.vue.d.ts +100 -0
- package/dist/components/chat/ChatStatusOverlay.vue.d.ts +34 -0
- package/dist/components/chat/publicContract.d.ts +44 -0
- package/dist/components/conversations/ConversationList.vue.d.ts +18 -0
- package/dist/components/conversations/UserProfileCard.vue.d.ts +9 -0
- package/dist/components/messages/ActionMessageRow.vue.d.ts +7 -0
- package/dist/components/messages/AudioStickyPlayer.vue.d.ts +12 -0
- package/dist/components/messages/ComposerActionsPopover.vue.d.ts +15 -0
- package/dist/components/messages/ComposerContextBanner.vue.d.ts +15 -0
- package/dist/components/messages/ComposerFormatMenu.vue.d.ts +19 -0
- package/dist/components/messages/ComposerLinkDialog.vue.d.ts +18 -0
- package/dist/components/messages/ComposerPollDialog.vue.d.ts +18 -0
- package/dist/components/messages/ComposerScheduleDialog.vue.d.ts +22 -0
- package/dist/components/messages/ComposerTriggerMenu.vue.d.ts +24 -0
- package/dist/components/messages/ConversationComposer.vue.d.ts +30 -0
- package/dist/components/messages/LinkPreviewCard.vue.d.ts +8 -0
- package/dist/components/messages/LinkifiedText.vue.d.ts +15 -0
- package/dist/components/messages/MessageAttachmentList.vue.d.ts +12 -0
- package/dist/components/messages/MessageComposer.vue.d.ts +59 -0
- package/dist/components/messages/MessageDateSeparator.vue.d.ts +7 -0
- package/dist/components/messages/MessageDeliveryStatus.vue.d.ts +8 -0
- package/dist/components/messages/MessageForwardedLabel.vue.d.ts +8 -0
- package/dist/components/messages/MessageItem.vue.d.ts +36 -0
- package/dist/components/messages/MessageItemHeader.vue.d.ts +8 -0
- package/dist/components/messages/MessageItemMenu.vue.d.ts +36 -0
- package/dist/components/messages/MessageItemMenuReactions.vue.d.ts +13 -0
- package/dist/components/messages/MessageItemReactions.vue.d.ts +16 -0
- package/dist/components/messages/MessageList.vue.d.ts +42 -0
- package/dist/components/messages/MessageListHeader.vue.d.ts +9 -0
- package/dist/components/messages/MessagePinnedLabel.vue.d.ts +4 -0
- package/dist/components/messages/MessagePollContent.vue.d.ts +14 -0
- package/dist/components/messages/MessageReactionList.vue.d.ts +14 -0
- package/dist/components/messages/MessageReplyQuote.vue.d.ts +12 -0
- package/dist/components/messages/MessageTextContent.vue.d.ts +12 -0
- package/dist/components/messages/PinnedMessagesBar.vue.d.ts +4 -0
- package/dist/components/overlays/ForwardMessageDialog.vue.d.ts +16 -0
- package/dist/components/overlays/FullscreenDialog.vue.d.ts +34 -0
- package/dist/components/overlays/MediaViewerDialog.vue.d.ts +12 -0
- package/dist/components/overlays/MessageInfoDialog.vue.d.ts +16 -0
- package/dist/components/overlays/PinnedMessagesDialog.vue.d.ts +20 -0
- package/dist/components/overlays/ReceiptSection.vue.d.ts +13 -0
- package/dist/components/overlays/ScheduledMessagesDialog.vue.d.ts +37 -0
- package/dist/components/shared/PersonAvatar.vue.d.ts +8 -0
- package/dist/composables/chat/index.d.ts +13 -0
- package/dist/composables/chat/useComposerContext.d.ts +44 -0
- package/dist/composables/chat/useConversationContext.d.ts +36 -0
- package/dist/composables/chat/useDialogsContext.d.ts +43 -0
- package/dist/composables/chat/useMessagesContext.d.ts +42 -0
- package/dist/composables/useAudioPlayer.d.ts +18 -0
- package/dist/composables/useChatActions.d.ts +21 -0
- package/dist/composables/useChatEventBus.d.ts +108 -0
- package/dist/composables/useComposerDrafts.d.ts +47 -0
- package/dist/composables/useComposerTriggers.d.ts +63 -0
- package/dist/composables/useConversationComposer.d.ts +16 -0
- package/dist/composables/useGroupMemberTracking.d.ts +33 -0
- package/dist/composables/useImageZoom.d.ts +26 -0
- package/dist/composables/useIsTouchUi.d.ts +4 -0
- package/dist/composables/useMessageActionMenu.d.ts +257 -0
- package/dist/composables/useMessageInfoDialog.d.ts +201 -0
- package/dist/composables/useMessageListScroll.d.ts +15 -0
- package/dist/composables/useMessageNavigation.d.ts +16 -0
- package/dist/composables/usePinnedMessages.d.ts +190 -0
- package/dist/composables/useRichTextComposer.d.ts +75 -0
- package/dist/demo/ApiExamplesPanel.vue.d.ts +8 -0
- package/dist/demo/CallDebugPanel.vue.d.ts +8 -0
- package/dist/demo/ChatShell.vue.d.ts +12 -0
- package/dist/demo/StatCard.vue.d.ts +17 -0
- package/dist/demo/ThemeModeToggle.vue.d.ts +17 -0
- package/dist/demo/useDemoThemeMode.d.ts +7 -0
- package/dist/{dist-CP-Tq-KK.js → dist-BJ6-Om37.js} +1 -1
- package/dist/dist-BJ6-Om37.js.map +1 -0
- package/dist/index.d.ts +11 -841
- package/dist/main.d.ts +0 -0
- package/dist/sfc-styles-entry.d.ts +1 -0
- package/dist/shims-vue.d.ts +6 -0
- package/dist/style.css +1 -1
- package/dist/vite-env.d.ts +1 -0
- package/dist/vue-bcc-chat-ui.js +6174 -5663
- package/dist/vue-bcc-chat-ui.js.map +1 -1
- package/dist/{web-CDfDePhG.js → web-DSJwqhTK.js} +2 -2
- package/dist/web-DSJwqhTK.js.map +1 -0
- package/package.json +9 -5
- package/dist/dist-CP-Tq-KK.js.map +0 -1
- package/dist/web-CDfDePhG.js.map +0 -1
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { TemplateRef, Ref } from 'vue';
|
|
2
|
+
import { AttachmentUploadInput, ChatClient, ChatMessageItem, MessageSendOptions, PollComposerInput, ScheduleMessageInput } from '../chat/types';
|
|
3
|
+
/** Minimal public interface exposed by MessageComposer via `defineExpose`. */
|
|
4
|
+
interface ComposerHandle {
|
|
5
|
+
focusEditor: () => Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
export interface UseComposerDraftsOptions {
|
|
8
|
+
/** Returns the active chat client, or null when unavailable. */
|
|
9
|
+
getClient: () => ChatClient | null;
|
|
10
|
+
/** Returns the resolved send options for the current conversation. */
|
|
11
|
+
getSendOptions: () => MessageSendOptions | undefined;
|
|
12
|
+
/** Maps mention uids to display names for editable drafts. */
|
|
13
|
+
getMentionNameByUid: () => Record<string, string>;
|
|
14
|
+
/**
|
|
15
|
+
* Called after a message has been scheduled so the parent can refresh the
|
|
16
|
+
* scheduled-messages overlay.
|
|
17
|
+
*/
|
|
18
|
+
afterSchedule: () => Promise<void>;
|
|
19
|
+
mainComposerRef?: TemplateRef<ComposerHandle | null>;
|
|
20
|
+
threadComposerRef?: TemplateRef<ComposerHandle | null>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Composable that owns all state for the main + thread dual-composer drafts, including
|
|
24
|
+
* draft text, reset signals, focus helpers, and delegated send actions.
|
|
25
|
+
*/
|
|
26
|
+
export declare function useComposerDrafts(options: UseComposerDraftsOptions): {
|
|
27
|
+
draft: Ref<string, string>;
|
|
28
|
+
threadDraft: Ref<string, string>;
|
|
29
|
+
composerResetSignal: Ref<number, number>;
|
|
30
|
+
threadComposerResetSignal: Ref<number, number>;
|
|
31
|
+
resetMainComposer: () => void;
|
|
32
|
+
resetThreadComposer: () => void;
|
|
33
|
+
focusMainComposer: () => void;
|
|
34
|
+
focusThreadComposer: () => void;
|
|
35
|
+
shouldFocusThreadComposer: (message: ChatMessageItem) => boolean;
|
|
36
|
+
getEditableMessageText: (message: ChatMessageItem) => string;
|
|
37
|
+
loadMainDraft: (message: ChatMessageItem) => void;
|
|
38
|
+
loadThreadDraft: (message: ChatMessageItem) => void;
|
|
39
|
+
sendMessage: () => Promise<void>;
|
|
40
|
+
sendAttachment: (input: AttachmentUploadInput) => Promise<void>;
|
|
41
|
+
sendPoll: (input: PollComposerInput) => Promise<void>;
|
|
42
|
+
scheduleMessage: (input: ScheduleMessageInput) => Promise<void>;
|
|
43
|
+
sendThreadMessage: () => Promise<void>;
|
|
44
|
+
sendThreadAttachment: (input: AttachmentUploadInput) => Promise<void>;
|
|
45
|
+
sendThreadPoll: (input: PollComposerInput) => Promise<void>;
|
|
46
|
+
};
|
|
47
|
+
export {};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Ref, ComputedRef } from 'vue';
|
|
2
|
+
import { MentionCandidate } from '../chat/mentions';
|
|
3
|
+
export interface ComposerTriggerCandidate {
|
|
4
|
+
id: string;
|
|
5
|
+
label: string;
|
|
6
|
+
subtitle?: string;
|
|
7
|
+
avatar?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ComposerTriggerDefinition {
|
|
10
|
+
id: string;
|
|
11
|
+
triggerChar: string;
|
|
12
|
+
enabled: () => boolean;
|
|
13
|
+
getCandidates: (query: string) => ComposerTriggerCandidate[];
|
|
14
|
+
apply: (candidate: ComposerTriggerCandidate, triggerRange: Range) => void;
|
|
15
|
+
maxSuggestions?: number;
|
|
16
|
+
}
|
|
17
|
+
interface UseComposerTriggersOptions {
|
|
18
|
+
editorRef: Ref<HTMLDivElement | null>;
|
|
19
|
+
getTriggers: () => ComposerTriggerDefinition[];
|
|
20
|
+
onChange?: () => void;
|
|
21
|
+
}
|
|
22
|
+
export declare function createMentionTriggerDefinition(options: {
|
|
23
|
+
enabled: () => boolean;
|
|
24
|
+
getMentionCandidates: () => ReadonlyArray<MentionCandidate>;
|
|
25
|
+
insertMention: (candidate: MentionCandidate, triggerRange: Range) => void;
|
|
26
|
+
maxSuggestions?: number;
|
|
27
|
+
}): ComposerTriggerDefinition;
|
|
28
|
+
export declare function useComposerTriggers(options: UseComposerTriggersOptions): {
|
|
29
|
+
activeTriggerId: () => string | null;
|
|
30
|
+
triggerCandidates: Ref<{
|
|
31
|
+
id: string;
|
|
32
|
+
label: string;
|
|
33
|
+
subtitle?: string | undefined;
|
|
34
|
+
avatar?: string | undefined;
|
|
35
|
+
}[], ComposerTriggerCandidate[] | {
|
|
36
|
+
id: string;
|
|
37
|
+
label: string;
|
|
38
|
+
subtitle?: string | undefined;
|
|
39
|
+
avatar?: string | undefined;
|
|
40
|
+
}[]>;
|
|
41
|
+
triggerMenuPosition: Ref<{
|
|
42
|
+
x: number;
|
|
43
|
+
y: number;
|
|
44
|
+
placement: "above" | "below";
|
|
45
|
+
}, {
|
|
46
|
+
x: number;
|
|
47
|
+
y: number;
|
|
48
|
+
placement: "above" | "below";
|
|
49
|
+
} | {
|
|
50
|
+
x: number;
|
|
51
|
+
y: number;
|
|
52
|
+
placement: "above" | "below";
|
|
53
|
+
}>;
|
|
54
|
+
highlightedTriggerIndex: Ref<number, number>;
|
|
55
|
+
showTriggerMenu: ComputedRef<boolean>;
|
|
56
|
+
hideTriggerMenu: () => void;
|
|
57
|
+
handleInput: () => void;
|
|
58
|
+
handleKeydown: (event: KeyboardEvent) => boolean;
|
|
59
|
+
selectTriggerCandidate: (candidate: ComposerTriggerCandidate) => void;
|
|
60
|
+
refreshActiveTrigger: () => void;
|
|
61
|
+
};
|
|
62
|
+
export declare function insertMentionAtRange(range: Range, candidate: MentionCandidate): void;
|
|
63
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { AttachmentUploadInput, ChatClient, ChatMessageItem, MessageSendOptions, PollComposerInput, ScheduleMessageInput } from '../chat/types';
|
|
2
|
+
import { Ref } from 'vue';
|
|
3
|
+
export declare function useConversationComposer(options: {
|
|
4
|
+
client: ChatClient;
|
|
5
|
+
getSendOptions: () => MessageSendOptions | undefined;
|
|
6
|
+
afterSchedule?: () => Promise<void> | void;
|
|
7
|
+
}): {
|
|
8
|
+
draft: Ref<string, string>;
|
|
9
|
+
loadMessageDraft: (message: ChatMessageItem) => void;
|
|
10
|
+
reset: () => void;
|
|
11
|
+
resetSignal: Ref<number, number>;
|
|
12
|
+
scheduleMessage: (input: ScheduleMessageInput) => Promise<void>;
|
|
13
|
+
sendAttachment: (input: AttachmentUploadInput) => Promise<void>;
|
|
14
|
+
sendPoll: (input: PollComposerInput) => Promise<void>;
|
|
15
|
+
sendText: () => Promise<void>;
|
|
16
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { ParticipantInfo } from '../chat/types';
|
|
2
|
+
import { Ref } from 'vue';
|
|
3
|
+
export interface UseGroupMemberTrackingOptions {
|
|
4
|
+
/** Returns the CometChat GUID of the currently active conversation, or undefined when none is selected. */
|
|
5
|
+
getConversationTargetId: () => string | undefined;
|
|
6
|
+
/** Returns true when the active conversation is a broadcast channel (members are not tracked). */
|
|
7
|
+
isChannel: () => boolean;
|
|
8
|
+
/** Returns true when the current user has joined the active group. */
|
|
9
|
+
hasJoined: () => boolean;
|
|
10
|
+
/** Called whenever the member list changes with the new complete list. */
|
|
11
|
+
onMembersChanged: (members: ParticipantInfo[]) => void;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Composable that keeps a live `groupMembers` ref in sync with CometChat
|
|
15
|
+
* membership events and exposes a manual `fetchGroupMembers` loader for the
|
|
16
|
+
* initial page-load.
|
|
17
|
+
*/
|
|
18
|
+
export declare function useGroupMemberTracking(options: UseGroupMemberTrackingOptions): {
|
|
19
|
+
groupMembers: Ref<{
|
|
20
|
+
uid: string;
|
|
21
|
+
displayName: string;
|
|
22
|
+
avatar: string;
|
|
23
|
+
role: string;
|
|
24
|
+
lastSeen?: Date | undefined;
|
|
25
|
+
}[], ParticipantInfo[] | {
|
|
26
|
+
uid: string;
|
|
27
|
+
displayName: string;
|
|
28
|
+
avatar: string;
|
|
29
|
+
role: string;
|
|
30
|
+
lastSeen?: Date | undefined;
|
|
31
|
+
}[]>;
|
|
32
|
+
fetchGroupMembers: (groupUid: string) => Promise<void>;
|
|
33
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Ref } from 'vue';
|
|
2
|
+
export interface UseImageZoomOptions {
|
|
3
|
+
/** Ref to the scrollable viewport wrapper element. */
|
|
4
|
+
viewportRef: Ref<HTMLElement | null>;
|
|
5
|
+
/** Ref to the `<img>` element whose natural dimensions guide clamping. */
|
|
6
|
+
imageRef: Ref<HTMLImageElement | null>;
|
|
7
|
+
/** Returns true when the current attachment is an image (non-image = zoom disabled). */
|
|
8
|
+
isImage: () => boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Composable that owns scale, translateX, and translateY state and exposes
|
|
12
|
+
* all pointer event handlers required by the media-viewer image stage.
|
|
13
|
+
*/
|
|
14
|
+
export declare function useImageZoom(options: UseImageZoomOptions): {
|
|
15
|
+
scale: Ref<number, number>;
|
|
16
|
+
translateX: Ref<number, number>;
|
|
17
|
+
translateY: Ref<number, number>;
|
|
18
|
+
isDragging: Ref<boolean, boolean>;
|
|
19
|
+
resetTransform: () => void;
|
|
20
|
+
handlePointerDown: (event: PointerEvent) => void;
|
|
21
|
+
handlePointerMove: (event: PointerEvent) => void;
|
|
22
|
+
handlePointerUp: (event: PointerEvent) => void;
|
|
23
|
+
handlePointerCancel: (event: PointerEvent) => void;
|
|
24
|
+
handleWheel: (event: WheelEvent) => void;
|
|
25
|
+
handleDoubleClick: () => void;
|
|
26
|
+
};
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import { Component, TemplateRef, ShallowRef, Ref, ComputedRef } from 'vue';
|
|
2
|
+
import { TranslationParams } from '../chat/i18n/types';
|
|
3
|
+
import { TranslationKey } from '../chat/localization';
|
|
4
|
+
import { ChatMessageItem, ChatMessageReceiptItem, ChatPollData, ChatReactionDetailItem } from '../chat/types';
|
|
5
|
+
import { ChatMessageKind, ChatDeliveryState } from '..';
|
|
6
|
+
/** Minimal public interface of the custom MessageItemMenu component. */
|
|
7
|
+
interface ActionMenuHandle {
|
|
8
|
+
show: (event: Event, fallbackPosition?: {
|
|
9
|
+
x: number;
|
|
10
|
+
y: number;
|
|
11
|
+
}, element?: HTMLElement) => void;
|
|
12
|
+
hide: () => void;
|
|
13
|
+
}
|
|
14
|
+
export interface UseMessageActionMenuOptions {
|
|
15
|
+
/** Returns true when message actions are enabled for this view. */
|
|
16
|
+
canUseMessageActions: () => boolean;
|
|
17
|
+
/** Returns true when reactions are allowed. */
|
|
18
|
+
canReact: () => boolean;
|
|
19
|
+
/** Returns true when replying is allowed. */
|
|
20
|
+
canReply: () => boolean;
|
|
21
|
+
/** Returns true when opening a thread is allowed. */
|
|
22
|
+
canOpenThread: () => boolean;
|
|
23
|
+
/** Returns true when pinning messages is allowed for this view. */
|
|
24
|
+
canPin: () => boolean;
|
|
25
|
+
/** Returns true when the supplied message is currently pinned. */
|
|
26
|
+
isPinned: (message: ChatMessageItem) => boolean;
|
|
27
|
+
/** Returns true when the conversation is at its server-owned pin cap. Absent means no cap is known. */
|
|
28
|
+
pinLimitReached?: () => boolean;
|
|
29
|
+
/** Returns true when the list is rendering a thread view (disables thread action). */
|
|
30
|
+
isInThread: () => boolean;
|
|
31
|
+
/** Translation helper forwarded from the parent component. */
|
|
32
|
+
t: (key: TranslationKey, params?: TranslationParams) => string;
|
|
33
|
+
emit: {
|
|
34
|
+
reply: (message: ChatMessageItem) => void;
|
|
35
|
+
edit: (message: ChatMessageItem) => void;
|
|
36
|
+
openThread: (message: ChatMessageItem) => void;
|
|
37
|
+
delete: (message: ChatMessageItem) => void;
|
|
38
|
+
translate: (message: ChatMessageItem) => void;
|
|
39
|
+
toggleReaction: (message: ChatMessageItem, emoji: string) => void;
|
|
40
|
+
forward: (message: ChatMessageItem) => void;
|
|
41
|
+
togglePin: (message: ChatMessageItem) => void;
|
|
42
|
+
};
|
|
43
|
+
/** Optional callback fired right before opening the message actions menu. */
|
|
44
|
+
onMenuOpen?: () => void;
|
|
45
|
+
/** Returns cached message receipts for the context-menu receipt summary. */
|
|
46
|
+
getCachedMessageReceipts?: (message: ChatMessageItem) => ChatMessageReceiptItem[] | undefined;
|
|
47
|
+
/** Loads message receipts for the context-menu receipt summary. */
|
|
48
|
+
loadMessageReceipts?: (message: ChatMessageItem) => Promise<ChatMessageReceiptItem[]>;
|
|
49
|
+
/** Returns true while receipts are being loaded for the supplied message. */
|
|
50
|
+
isLoadingMessageReceipts?: (message: ChatMessageItem) => boolean;
|
|
51
|
+
/** Returns cached reaction detail (who reacted with which emoji) for the supplied message. */
|
|
52
|
+
getCachedMessageReactions?: (message: ChatMessageItem) => ChatReactionDetailItem[] | undefined;
|
|
53
|
+
/** Loads reaction detail for the supplied message. Only called when the user opens the reactions view. */
|
|
54
|
+
loadMessageReactions?: (message: ChatMessageItem) => Promise<ChatReactionDetailItem[]>;
|
|
55
|
+
/** Returns true while reaction detail is being loaded for the supplied message. */
|
|
56
|
+
isLoadingMessageReactions?: (message: ChatMessageItem) => boolean;
|
|
57
|
+
actionMenuRef: TemplateRef<ActionMenuHandle>;
|
|
58
|
+
}
|
|
59
|
+
export interface MessageReceiptSummaryAction {
|
|
60
|
+
label: string;
|
|
61
|
+
receipts: ChatMessageReceiptItem[];
|
|
62
|
+
loading: boolean;
|
|
63
|
+
}
|
|
64
|
+
export interface MessagePollVotersSummaryAction {
|
|
65
|
+
label: string;
|
|
66
|
+
poll: ChatPollData;
|
|
67
|
+
}
|
|
68
|
+
export interface MessageReactionsSummaryAction {
|
|
69
|
+
label: string;
|
|
70
|
+
/** Reaction detail once loaded; null while not yet requested or still loading. */
|
|
71
|
+
details: ChatReactionDetailItem[] | null;
|
|
72
|
+
loading: boolean;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Composable that owns all state for the per-message action popover, reaction
|
|
76
|
+
* expansion, inline reaction toggles, and message copying.
|
|
77
|
+
*/
|
|
78
|
+
export declare function useMessageActionMenu(options: UseMessageActionMenuOptions): {
|
|
79
|
+
actionMenuRef: Readonly< ShallowRef<ActionMenuHandle | null>>;
|
|
80
|
+
activeActionMessage: Ref<{
|
|
81
|
+
id: string;
|
|
82
|
+
muid?: string | undefined;
|
|
83
|
+
conversationId: string;
|
|
84
|
+
senderId: string;
|
|
85
|
+
senderName: string;
|
|
86
|
+
text: string;
|
|
87
|
+
kind: ChatMessageKind;
|
|
88
|
+
sentAt: Date;
|
|
89
|
+
category: string;
|
|
90
|
+
type: string;
|
|
91
|
+
senderAvatar?: string | undefined;
|
|
92
|
+
isOwn: boolean;
|
|
93
|
+
isDeleted: boolean;
|
|
94
|
+
isEdited: boolean;
|
|
95
|
+
attachments: {
|
|
96
|
+
kind: Extract< ChatMessageKind, "image" | "video" | "audio" | "file">;
|
|
97
|
+
name: string;
|
|
98
|
+
url?: string | undefined;
|
|
99
|
+
mimeType?: string | undefined;
|
|
100
|
+
extension?: string | undefined;
|
|
101
|
+
size?: number | undefined;
|
|
102
|
+
width?: number | undefined;
|
|
103
|
+
height?: number | undefined;
|
|
104
|
+
}[];
|
|
105
|
+
poll?: {
|
|
106
|
+
id?: string | undefined;
|
|
107
|
+
question: string;
|
|
108
|
+
options: {
|
|
109
|
+
id: string;
|
|
110
|
+
text: string;
|
|
111
|
+
voteCount: number;
|
|
112
|
+
voters: {
|
|
113
|
+
uid: string;
|
|
114
|
+
name: string;
|
|
115
|
+
avatar?: string | undefined;
|
|
116
|
+
status?: string | undefined;
|
|
117
|
+
lastSeen?: Date | undefined;
|
|
118
|
+
}[];
|
|
119
|
+
}[];
|
|
120
|
+
totalVotes: number;
|
|
121
|
+
allowsMultipleAnswers: boolean;
|
|
122
|
+
} | undefined;
|
|
123
|
+
scheduled?: {
|
|
124
|
+
scheduleDate?: Date | undefined;
|
|
125
|
+
originalChatUid?: string | undefined;
|
|
126
|
+
muid?: string | undefined;
|
|
127
|
+
messageId?: number | undefined;
|
|
128
|
+
} | undefined;
|
|
129
|
+
translatedText?: string | undefined;
|
|
130
|
+
replyTo?: {
|
|
131
|
+
messageId: string;
|
|
132
|
+
senderName: string;
|
|
133
|
+
text: string;
|
|
134
|
+
kind: ChatMessageKind;
|
|
135
|
+
} | undefined;
|
|
136
|
+
forwardedFrom?: {
|
|
137
|
+
senderName: string;
|
|
138
|
+
} | undefined;
|
|
139
|
+
parentMessageId?: string | undefined;
|
|
140
|
+
replyCount: number;
|
|
141
|
+
reactions: {
|
|
142
|
+
emoji: string;
|
|
143
|
+
count: number;
|
|
144
|
+
reactedByMe: boolean;
|
|
145
|
+
}[];
|
|
146
|
+
receipts: {
|
|
147
|
+
deliveredAt?: Date | undefined;
|
|
148
|
+
deliveredToMeAt?: Date | undefined;
|
|
149
|
+
readAt?: Date | undefined;
|
|
150
|
+
readByMeAt?: Date | undefined;
|
|
151
|
+
};
|
|
152
|
+
pinnedAt?: Date | undefined;
|
|
153
|
+
pinnedBy?: string | undefined;
|
|
154
|
+
deliveryState: ChatDeliveryState;
|
|
155
|
+
metadata?: Record<string, unknown> | undefined;
|
|
156
|
+
source: any;
|
|
157
|
+
} | null, ChatMessageItem | {
|
|
158
|
+
id: string;
|
|
159
|
+
muid?: string | undefined;
|
|
160
|
+
conversationId: string;
|
|
161
|
+
senderId: string;
|
|
162
|
+
senderName: string;
|
|
163
|
+
text: string;
|
|
164
|
+
kind: ChatMessageKind;
|
|
165
|
+
sentAt: Date;
|
|
166
|
+
category: string;
|
|
167
|
+
type: string;
|
|
168
|
+
senderAvatar?: string | undefined;
|
|
169
|
+
isOwn: boolean;
|
|
170
|
+
isDeleted: boolean;
|
|
171
|
+
isEdited: boolean;
|
|
172
|
+
attachments: {
|
|
173
|
+
kind: Extract< ChatMessageKind, "image" | "video" | "audio" | "file">;
|
|
174
|
+
name: string;
|
|
175
|
+
url?: string | undefined;
|
|
176
|
+
mimeType?: string | undefined;
|
|
177
|
+
extension?: string | undefined;
|
|
178
|
+
size?: number | undefined;
|
|
179
|
+
width?: number | undefined;
|
|
180
|
+
height?: number | undefined;
|
|
181
|
+
}[];
|
|
182
|
+
poll?: {
|
|
183
|
+
id?: string | undefined;
|
|
184
|
+
question: string;
|
|
185
|
+
options: {
|
|
186
|
+
id: string;
|
|
187
|
+
text: string;
|
|
188
|
+
voteCount: number;
|
|
189
|
+
voters: {
|
|
190
|
+
uid: string;
|
|
191
|
+
name: string;
|
|
192
|
+
avatar?: string | undefined;
|
|
193
|
+
status?: string | undefined;
|
|
194
|
+
lastSeen?: Date | undefined;
|
|
195
|
+
}[];
|
|
196
|
+
}[];
|
|
197
|
+
totalVotes: number;
|
|
198
|
+
allowsMultipleAnswers: boolean;
|
|
199
|
+
} | undefined;
|
|
200
|
+
scheduled?: {
|
|
201
|
+
scheduleDate?: Date | undefined;
|
|
202
|
+
originalChatUid?: string | undefined;
|
|
203
|
+
muid?: string | undefined;
|
|
204
|
+
messageId?: number | undefined;
|
|
205
|
+
} | undefined;
|
|
206
|
+
translatedText?: string | undefined;
|
|
207
|
+
replyTo?: {
|
|
208
|
+
messageId: string;
|
|
209
|
+
senderName: string;
|
|
210
|
+
text: string;
|
|
211
|
+
kind: ChatMessageKind;
|
|
212
|
+
} | undefined;
|
|
213
|
+
forwardedFrom?: {
|
|
214
|
+
senderName: string;
|
|
215
|
+
} | undefined;
|
|
216
|
+
parentMessageId?: string | undefined;
|
|
217
|
+
replyCount: number;
|
|
218
|
+
reactions: {
|
|
219
|
+
emoji: string;
|
|
220
|
+
count: number;
|
|
221
|
+
reactedByMe: boolean;
|
|
222
|
+
}[];
|
|
223
|
+
receipts: {
|
|
224
|
+
deliveredAt?: Date | undefined;
|
|
225
|
+
deliveredToMeAt?: Date | undefined;
|
|
226
|
+
readAt?: Date | undefined;
|
|
227
|
+
readByMeAt?: Date | undefined;
|
|
228
|
+
};
|
|
229
|
+
pinnedAt?: Date | undefined;
|
|
230
|
+
pinnedBy?: string | undefined;
|
|
231
|
+
deliveryState: ChatDeliveryState;
|
|
232
|
+
metadata?: Record<string, unknown> | undefined;
|
|
233
|
+
source: any;
|
|
234
|
+
} | null>;
|
|
235
|
+
copiedMessageId: Ref<string | null, string | null>;
|
|
236
|
+
isTouchUI: ComputedRef<boolean>;
|
|
237
|
+
handleMessageContextMenu: (message: ChatMessageItem, event: MouseEvent) => void;
|
|
238
|
+
handleMessageTap: (message: ChatMessageItem, event: MouseEvent) => void;
|
|
239
|
+
closeActionMenu: () => void;
|
|
240
|
+
resetActionMenuState: () => void;
|
|
241
|
+
reactToMessage: (message: ChatMessageItem, emoji: string) => void;
|
|
242
|
+
toggleInlineReaction: (message: ChatMessageItem, emoji: string) => void;
|
|
243
|
+
loadReceiptPreview: (message: ChatMessageItem) => Promise<void>;
|
|
244
|
+
getReceiptSummaryAction: (message: ChatMessageItem) => MessageReceiptSummaryAction | null;
|
|
245
|
+
getPollVotersSummaryAction: (message: ChatMessageItem) => MessagePollVotersSummaryAction | null;
|
|
246
|
+
loadReactionDetails: (message: ChatMessageItem) => Promise<void>;
|
|
247
|
+
getReactionsSummaryAction: (message: ChatMessageItem) => MessageReactionsSummaryAction | null;
|
|
248
|
+
getActionItems: (message: ChatMessageItem) => {
|
|
249
|
+
key: string;
|
|
250
|
+
label: string;
|
|
251
|
+
icon: Component;
|
|
252
|
+
visible: boolean;
|
|
253
|
+
command: () => void;
|
|
254
|
+
}[];
|
|
255
|
+
togglePinnedMessage: (message: ChatMessageItem) => void;
|
|
256
|
+
};
|
|
257
|
+
export {};
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { ChatClient, ChatMessageItem, ChatMessageReceiptItem, ChatReactionDetailItem } from '../chat/types';
|
|
2
|
+
import { Ref } from 'vue';
|
|
3
|
+
import { ChatMessageKind, ChatDeliveryState, ChatMessageReceiptKind } from '..';
|
|
4
|
+
export interface UseMessageInfoDialogOptions {
|
|
5
|
+
/** Returns the active chat client, or null when none is available. */
|
|
6
|
+
getClient: () => ChatClient | null;
|
|
7
|
+
/** Fallback error string shown when the receipt fetch fails without a message. */
|
|
8
|
+
fetchErrorFallback: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Composable that owns the reactive state required to display the per-message
|
|
12
|
+
* info overlay and handles the asynchronous receipt-loading lifecycle.
|
|
13
|
+
*/
|
|
14
|
+
export declare function useMessageInfoDialog(options: UseMessageInfoDialogOptions): {
|
|
15
|
+
infoMessage: Ref<{
|
|
16
|
+
id: string;
|
|
17
|
+
muid?: string | undefined;
|
|
18
|
+
conversationId: string;
|
|
19
|
+
senderId: string;
|
|
20
|
+
senderName: string;
|
|
21
|
+
text: string;
|
|
22
|
+
kind: ChatMessageKind;
|
|
23
|
+
sentAt: Date;
|
|
24
|
+
category: string;
|
|
25
|
+
type: string;
|
|
26
|
+
senderAvatar?: string | undefined;
|
|
27
|
+
isOwn: boolean;
|
|
28
|
+
isDeleted: boolean;
|
|
29
|
+
isEdited: boolean;
|
|
30
|
+
attachments: {
|
|
31
|
+
kind: Extract< ChatMessageKind, "image" | "video" | "audio" | "file">;
|
|
32
|
+
name: string;
|
|
33
|
+
url?: string | undefined;
|
|
34
|
+
mimeType?: string | undefined;
|
|
35
|
+
extension?: string | undefined;
|
|
36
|
+
size?: number | undefined;
|
|
37
|
+
width?: number | undefined;
|
|
38
|
+
height?: number | undefined;
|
|
39
|
+
}[];
|
|
40
|
+
poll?: {
|
|
41
|
+
id?: string | undefined;
|
|
42
|
+
question: string;
|
|
43
|
+
options: {
|
|
44
|
+
id: string;
|
|
45
|
+
text: string;
|
|
46
|
+
voteCount: number;
|
|
47
|
+
voters: {
|
|
48
|
+
uid: string;
|
|
49
|
+
name: string;
|
|
50
|
+
avatar?: string | undefined;
|
|
51
|
+
status?: string | undefined;
|
|
52
|
+
lastSeen?: Date | undefined;
|
|
53
|
+
}[];
|
|
54
|
+
}[];
|
|
55
|
+
totalVotes: number;
|
|
56
|
+
allowsMultipleAnswers: boolean;
|
|
57
|
+
} | undefined;
|
|
58
|
+
scheduled?: {
|
|
59
|
+
scheduleDate?: Date | undefined;
|
|
60
|
+
originalChatUid?: string | undefined;
|
|
61
|
+
muid?: string | undefined;
|
|
62
|
+
messageId?: number | undefined;
|
|
63
|
+
} | undefined;
|
|
64
|
+
translatedText?: string | undefined;
|
|
65
|
+
replyTo?: {
|
|
66
|
+
messageId: string;
|
|
67
|
+
senderName: string;
|
|
68
|
+
text: string;
|
|
69
|
+
kind: ChatMessageKind;
|
|
70
|
+
} | undefined;
|
|
71
|
+
forwardedFrom?: {
|
|
72
|
+
senderName: string;
|
|
73
|
+
} | undefined;
|
|
74
|
+
parentMessageId?: string | undefined;
|
|
75
|
+
replyCount: number;
|
|
76
|
+
reactions: {
|
|
77
|
+
emoji: string;
|
|
78
|
+
count: number;
|
|
79
|
+
reactedByMe: boolean;
|
|
80
|
+
}[];
|
|
81
|
+
receipts: {
|
|
82
|
+
deliveredAt?: Date | undefined;
|
|
83
|
+
deliveredToMeAt?: Date | undefined;
|
|
84
|
+
readAt?: Date | undefined;
|
|
85
|
+
readByMeAt?: Date | undefined;
|
|
86
|
+
};
|
|
87
|
+
pinnedAt?: Date | undefined;
|
|
88
|
+
pinnedBy?: string | undefined;
|
|
89
|
+
deliveryState: ChatDeliveryState;
|
|
90
|
+
metadata?: Record<string, unknown> | undefined;
|
|
91
|
+
source: any;
|
|
92
|
+
} | null, ChatMessageItem | {
|
|
93
|
+
id: string;
|
|
94
|
+
muid?: string | undefined;
|
|
95
|
+
conversationId: string;
|
|
96
|
+
senderId: string;
|
|
97
|
+
senderName: string;
|
|
98
|
+
text: string;
|
|
99
|
+
kind: ChatMessageKind;
|
|
100
|
+
sentAt: Date;
|
|
101
|
+
category: string;
|
|
102
|
+
type: string;
|
|
103
|
+
senderAvatar?: string | undefined;
|
|
104
|
+
isOwn: boolean;
|
|
105
|
+
isDeleted: boolean;
|
|
106
|
+
isEdited: boolean;
|
|
107
|
+
attachments: {
|
|
108
|
+
kind: Extract< ChatMessageKind, "image" | "video" | "audio" | "file">;
|
|
109
|
+
name: string;
|
|
110
|
+
url?: string | undefined;
|
|
111
|
+
mimeType?: string | undefined;
|
|
112
|
+
extension?: string | undefined;
|
|
113
|
+
size?: number | undefined;
|
|
114
|
+
width?: number | undefined;
|
|
115
|
+
height?: number | undefined;
|
|
116
|
+
}[];
|
|
117
|
+
poll?: {
|
|
118
|
+
id?: string | undefined;
|
|
119
|
+
question: string;
|
|
120
|
+
options: {
|
|
121
|
+
id: string;
|
|
122
|
+
text: string;
|
|
123
|
+
voteCount: number;
|
|
124
|
+
voters: {
|
|
125
|
+
uid: string;
|
|
126
|
+
name: string;
|
|
127
|
+
avatar?: string | undefined;
|
|
128
|
+
status?: string | undefined;
|
|
129
|
+
lastSeen?: Date | undefined;
|
|
130
|
+
}[];
|
|
131
|
+
}[];
|
|
132
|
+
totalVotes: number;
|
|
133
|
+
allowsMultipleAnswers: boolean;
|
|
134
|
+
} | undefined;
|
|
135
|
+
scheduled?: {
|
|
136
|
+
scheduleDate?: Date | undefined;
|
|
137
|
+
originalChatUid?: string | undefined;
|
|
138
|
+
muid?: string | undefined;
|
|
139
|
+
messageId?: number | undefined;
|
|
140
|
+
} | undefined;
|
|
141
|
+
translatedText?: string | undefined;
|
|
142
|
+
replyTo?: {
|
|
143
|
+
messageId: string;
|
|
144
|
+
senderName: string;
|
|
145
|
+
text: string;
|
|
146
|
+
kind: ChatMessageKind;
|
|
147
|
+
} | undefined;
|
|
148
|
+
forwardedFrom?: {
|
|
149
|
+
senderName: string;
|
|
150
|
+
} | undefined;
|
|
151
|
+
parentMessageId?: string | undefined;
|
|
152
|
+
replyCount: number;
|
|
153
|
+
reactions: {
|
|
154
|
+
emoji: string;
|
|
155
|
+
count: number;
|
|
156
|
+
reactedByMe: boolean;
|
|
157
|
+
}[];
|
|
158
|
+
receipts: {
|
|
159
|
+
deliveredAt?: Date | undefined;
|
|
160
|
+
deliveredToMeAt?: Date | undefined;
|
|
161
|
+
readAt?: Date | undefined;
|
|
162
|
+
readByMeAt?: Date | undefined;
|
|
163
|
+
};
|
|
164
|
+
pinnedAt?: Date | undefined;
|
|
165
|
+
pinnedBy?: string | undefined;
|
|
166
|
+
deliveryState: ChatDeliveryState;
|
|
167
|
+
metadata?: Record<string, unknown> | undefined;
|
|
168
|
+
source: any;
|
|
169
|
+
} | null>;
|
|
170
|
+
infoMessageReceipts: Ref<{
|
|
171
|
+
kind: ChatMessageReceiptKind;
|
|
172
|
+
user: {
|
|
173
|
+
uid: string;
|
|
174
|
+
name: string;
|
|
175
|
+
avatar?: string | undefined;
|
|
176
|
+
status?: string | undefined;
|
|
177
|
+
lastSeen?: Date | undefined;
|
|
178
|
+
};
|
|
179
|
+
timestamp?: Date | undefined;
|
|
180
|
+
}[], ChatMessageReceiptItem[] | {
|
|
181
|
+
kind: ChatMessageReceiptKind;
|
|
182
|
+
user: {
|
|
183
|
+
uid: string;
|
|
184
|
+
name: string;
|
|
185
|
+
avatar?: string | undefined;
|
|
186
|
+
status?: string | undefined;
|
|
187
|
+
lastSeen?: Date | undefined;
|
|
188
|
+
};
|
|
189
|
+
timestamp?: Date | undefined;
|
|
190
|
+
}[]>;
|
|
191
|
+
loadingMessageReceipts: Ref<boolean, boolean>;
|
|
192
|
+
messageReceiptsError: Ref<string | null, string | null>;
|
|
193
|
+
messageReceiptsByMessageId: Ref<Record<string, ChatMessageReceiptItem[]>, Record<string, ChatMessageReceiptItem[]>>;
|
|
194
|
+
loadingMessageReceiptIds: Ref<Record<string, boolean>, Record<string, boolean>>;
|
|
195
|
+
getMessageReceipts: (message: ChatMessageItem) => Promise<ChatMessageReceiptItem[]>;
|
|
196
|
+
messageReactionsByMessageId: Ref<Record<string, ChatReactionDetailItem[]>, Record<string, ChatReactionDetailItem[]>>;
|
|
197
|
+
loadingMessageReactionIds: Ref<Record<string, boolean>, Record<string, boolean>>;
|
|
198
|
+
getMessageReactions: (message: ChatMessageItem) => Promise<ChatReactionDetailItem[]>;
|
|
199
|
+
openMessageInfo: (message: ChatMessageItem) => Promise<void>;
|
|
200
|
+
closeMessageInfo: () => void;
|
|
201
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { TemplateRef } from 'vue';
|
|
2
|
+
import { ChatConversationItem, ChatMessageItem } from '../chat/types';
|
|
3
|
+
export interface UseMessageListScrollOptions {
|
|
4
|
+
getConversation: () => ChatConversationItem | null | undefined;
|
|
5
|
+
getParentMessage: () => ChatMessageItem | null | undefined;
|
|
6
|
+
getMessages: () => ChatMessageItem[];
|
|
7
|
+
isLoading: () => boolean;
|
|
8
|
+
isLoadingOlder: () => boolean;
|
|
9
|
+
canLoadOlder: () => boolean;
|
|
10
|
+
onLoadOlder: () => void;
|
|
11
|
+
threadRef: TemplateRef<HTMLElement | null>;
|
|
12
|
+
}
|
|
13
|
+
export declare function useMessageListScroll(options: UseMessageListScrollOptions): {
|
|
14
|
+
handleThreadScroll: () => void;
|
|
15
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Ref } from 'vue';
|
|
2
|
+
import { ChatClient } from '../chat/types';
|
|
3
|
+
export interface UseMessageNavigationOptions {
|
|
4
|
+
/** Ref to the root chat wrapper element used as the querySelector scope. */
|
|
5
|
+
chatRootRef: Ref<HTMLElement | null>;
|
|
6
|
+
/** Returns the currently resolved chat client, or null. */
|
|
7
|
+
getClient: () => ChatClient | null;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Composable that scrolls the chat root to a requested message ID coming from
|
|
11
|
+
* either the `loadMessageId` prop or the global `chat` navigation refs.
|
|
12
|
+
*/
|
|
13
|
+
export declare function useMessageNavigation(options: UseMessageNavigationOptions): {
|
|
14
|
+
scrollToRequestedMessage: (messageId?: string) => Promise<void>;
|
|
15
|
+
handleOpenReferencedMessage: (messageId: string) => void;
|
|
16
|
+
};
|