@ethora/chat-component 26.9.8 → 26.10.3
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/README.md +2 -1
- package/dist/{ChatProfileModal-3UH0H5Ec.js → ChatProfileModal-D73ioMj9.js} +44 -44
- package/dist/FilePreviewModal-BeGa8s4u.js +1763 -0
- package/dist/{ManageDataModal-BblTuE9g.js → ManageDataModal-DxhvKwLo.js} +17 -17
- package/dist/{MarkdownBody-RMEx8yW2.js → MarkdownBody-fzjy9KUP.js} +1 -1
- package/dist/{MessageSearchModal-CrYR2EH8.js → MessageSearchModal-3I0b3Nut.js} +40 -40
- package/dist/{PublicChatsModal-Bi5r4mrV.js → PublicChatsModal-Dzwl63q-.js} +19 -19
- package/dist/{SideDrawer-CDAoobvX.js → SideDrawer-BPebE2tZ.js} +37 -37
- package/dist/{UserProfileModal-4Frgvam-.js → UserProfileModal-BS5FZdJb.js} +10 -10
- package/dist/{UserSettingsModal-C-mb-9cb.js → UserSettingsModal-pBqmF_r2.js} +5 -5
- package/dist/{VideoCallOverlay-92dFLb9U.js → VideoCallOverlay-PIg8Z5Xr.js} +3824 -3708
- package/dist/{VisibilityModal-zIAV6dAP.js → VisibilityModal-CnBRSRQ9.js} +11 -11
- package/dist/api.config.d.ts +0 -23
- package/dist/assets/icons.d.ts +2 -3
- package/dist/components/ContextMenu/ContextMenuComponents.d.ts +24 -8
- package/dist/components/ExampleComponents/CustomMessage.d.ts +27 -9
- package/dist/components/Files/fileCategory.d.ts +4 -2
- package/dist/components/MainComponents/AlbumGrid.d.ts +22 -0
- package/dist/components/MainComponents/AttachmentList.d.ts +6 -6
- package/dist/components/MainComponents/ChooseChatMessage.d.ts +12 -4
- package/dist/components/MainComponents/EditWrapper.d.ts +12 -4
- package/dist/components/MainComponents/ImageUnavailable.d.ts +21 -0
- package/dist/components/MainComponents/MediaUploadOverlay.d.ts +31 -0
- package/dist/components/MainComponents/MessageContainer.d.ts +3 -0
- package/dist/components/MainComponents/MessageList.d.ts +2 -1
- package/dist/components/MainComponents/SystemMessage.d.ts +3 -1
- package/dist/components/MessageBubble/CustomDivider.d.ts +3 -1
- package/dist/components/MessageBubble/MediaCaption.d.ts +9 -0
- package/dist/components/MessageBubble/MessageAvatarPhoto.d.ts +17 -0
- package/dist/components/MessageBubble/MessageReaction.d.ts +6 -0
- package/dist/components/MessageBubble/MessageReply.d.ts +3 -1
- package/dist/components/MessageBubble/QuickReplies.d.ts +2 -0
- package/dist/components/Modals/FilePreviewModal/FilePreviewModal.d.ts +8 -10
- package/dist/components/Modals/FilePreviewModal/ImageLightbox.d.ts +4 -0
- package/dist/components/Modals/FilePreviewModal/PdfView.d.ts +4 -0
- package/dist/components/Modals/FilePreviewModal/ViewerChrome.d.ts +100 -0
- package/dist/components/Modals/MessageSearchModal/MessageHitResults.d.ts +3 -1
- package/dist/components/Modals/ModalReportChat/ModalReportChat.d.ts +3 -1
- package/dist/components/Modals/NewChatModal/styledNewChatComponents.d.ts +15 -5
- package/dist/components/Modals/SettingsModals/SharedStyledComponents.d.ts +27 -15
- package/dist/components/Modals/SettingsModals/Visibility/StyledComponents.d.ts +18 -6
- package/dist/components/Modals/SideDrawer/DrawerProfileParts.d.ts +27 -9
- package/dist/components/Modals/SideDrawer/SideDrawer.d.ts +39 -13
- package/dist/components/Modals/motionVariants.d.ts +8 -10
- package/dist/components/Modals/styledModalComponents.d.ts +53 -25
- package/dist/components/Notification/index.d.ts +3 -1
- package/dist/components/RoomComponents/LastMessageItem.d.ts +2 -0
- package/dist/components/RoomComponents/styled/LastMessageMedia.d.ts +19 -0
- package/dist/components/RoomComponents/styled/LastTextMessage.d.ts +2 -2
- package/dist/components/RoomComponents/styled/StyledRoomComponents.d.ts +29 -8
- package/dist/components/UsersList/StyledComponents.d.ts +18 -6
- package/dist/components/VideoCalls/VideoCallSession.d.ts +13 -0
- package/dist/components/styled/ChatWrapperBox.d.ts +9 -2
- package/dist/components/styled/DateLabel.d.ts +3 -1
- package/dist/components/styled/FileCard.d.ts +20 -0
- package/dist/components/styled/Loader.d.ts +3 -1
- package/dist/components/styled/MediaModal.d.ts +6 -2
- package/dist/components/styled/MediaSurface.d.ts +56 -0
- package/dist/components/styled/MessageImage.d.ts +9 -10
- package/dist/components/styled/NewMessageLabel.d.ts +3 -1
- package/dist/components/styled/RoomListComponents/index.d.ts +66 -22
- package/dist/components/styled/SendInput.d.ts +12 -2
- package/dist/components/styled/StyledComponents.d.ts +199 -41
- package/dist/components/styled/StyledInputComponents/MediaComponents.d.ts +78 -24
- package/dist/components/styled/StyledInputComponents/StyledInputComponents.d.ts +60 -22
- package/dist/components/styled/StyledInputComponents/VideoComponents.d.ts +18 -6
- package/dist/components/styled/TreadLabel.d.ts +3 -1
- package/dist/components/styled/UnsupportedType.d.ts +1 -0
- package/dist/components/styled/VideoMessage.d.ts +13 -6
- package/dist/e2ee/callKey.d.ts +32 -0
- package/dist/e2ee/fileEnvelope.d.ts +16 -5
- package/dist/e2ee/omemo.d.ts +18 -0
- package/dist/firebase-messaging-sw.js +20 -3
- package/dist/{handleCopyClick-BtXos0AJ.js → handleCopyClick-vPvh9hOU.js} +1 -1
- package/dist/helpers/albumLayout.d.ts +53 -0
- package/dist/helpers/attachments.d.ts +22 -1
- package/dist/helpers/avatarImageCache.d.ts +9 -0
- package/dist/helpers/caption.d.ts +63 -0
- package/dist/helpers/composerFocus.d.ts +22 -0
- package/dist/helpers/createMainMessageForThread.d.ts +1 -1
- package/dist/helpers/downloadFile.d.ts +19 -0
- package/dist/helpers/fileKind.d.ts +17 -0
- package/dist/helpers/lastMessagePreview.d.ts +55 -0
- package/dist/helpers/mapWithConcurrency.d.ts +8 -0
- package/dist/helpers/mediaBox.d.ts +110 -0
- package/dist/helpers/mediaBubble.d.ts +67 -0
- package/dist/helpers/mediaLabel.d.ts +10 -0
- package/dist/helpers/mediaSendRetry.d.ts +25 -0
- package/dist/helpers/messageRuns.d.ts +10 -0
- package/dist/helpers/receiptState.d.ts +48 -0
- package/dist/helpers/repairFilenameEncoding.d.ts +11 -0
- package/dist/helpers/roomImageGallery.d.ts +34 -0
- package/dist/helpers/safeUrl.d.ts +15 -0
- package/dist/helpers/secureFileUrl.d.ts +4 -1
- package/dist/helpers/textareaFit.d.ts +31 -0
- package/dist/helpers/timestamp.d.ts +7 -0
- package/dist/helpers/userEntry.d.ts +14 -0
- package/dist/helpers/viewerSender.d.ts +47 -0
- package/dist/hooks/useAvatarImage.d.ts +21 -0
- package/dist/hooks/useIsMobileViewport.d.ts +5 -0
- package/dist/hooks/useMediaProbe.d.ts +41 -0
- package/dist/hooks/usePaneWidthVar.d.ts +11 -0
- package/dist/hooks/usePdfThumbnail.d.ts +0 -1
- package/dist/hooks/usePrefersReducedMotion.d.ts +2 -0
- package/dist/hooks/useRoomInitialization.d.ts +2 -2
- package/dist/hooks/useRoomUrl.d.ts +2 -2
- package/dist/hooks/useSendMessage.d.ts +4 -1
- package/dist/{main-BnLtessp.js → main-CghdNDlB.js} +20803 -16260
- package/dist/main.js +10 -10
- package/dist/networking/api-requests/auth.api.d.ts +13 -5
- package/dist/networking/api-requests/user.api.d.ts +4 -4
- package/dist/networking/callKeyStanza.d.ts +7 -0
- package/dist/networking/deliveryReceiptBatcher.d.ts +53 -0
- package/dist/networking/displayedMarkerThrottle.d.ts +29 -0
- package/dist/networking/receiptsPolicy.d.ts +32 -0
- package/dist/networking/stanzaHandlers.d.ts +4 -2
- package/dist/networking/xmpp/sendDisplayedMarker.xmpp.d.ts +2 -0
- package/dist/networking/xmpp/sendMediaMessage.xmpp.d.ts +8 -0
- package/dist/networking/xmpp/sendReceivedReceipt.xmpp.d.ts +2 -0
- package/dist/networking/xmppClient.d.ts +5 -0
- package/dist/roomStore/callSlice.d.ts +6 -1
- package/dist/roomStore/index.d.ts +10 -0
- package/dist/roomStore/roomsSlice.d.ts +22 -3
- package/dist/styles/motion.d.ts +22 -2
- package/dist/types/models/attachment.model.d.ts +19 -0
- package/dist/types/models/config.model.d.ts +56 -2
- package/dist/types/models/customComponents.model.d.ts +2 -0
- package/dist/types/models/message.model.d.ts +9 -0
- package/dist/types/models/modal.model.d.ts +19 -0
- package/dist/types/models/room.model.d.ts +17 -0
- package/dist/types/models/xmpp.model.d.ts +3 -0
- package/dist/utils/messageNotificationContent.d.ts +34 -0
- package/dist/version.d.ts +1 -1
- package/package.json +8 -7
- package/public/firebase-messaging-sw.js +20 -3
- package/dist/FilePreviewModal-Cgj1iHry.js +0 -743
- package/dist/components/RoomComponents/styled/LastAudioMessage.d.ts +0 -6
- package/dist/components/RoomComponents/styled/LastMessageFile.d.ts +0 -6
- package/dist/components/RoomComponents/styled/LastMessagePhoto.d.ts +0 -6
- package/dist/components/RoomComponents/styled/LastMessageVideo.d.ts +0 -6
package/dist/main.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { br as a, bs as r, bt as b, bu as o, bv as t, bw as u, bx as i, by as p, bz as h, bA as n, bB as d, i as l, bC as y, S as I, bD as T, bE as f, bF as m, bG as R, bH as g, bI as c, bJ as C, bK as A, bL as E, aq as F, ar as M, bM as Q, bN as k } from "./main-CghdNDlB.js";
|
|
2
2
|
export {
|
|
3
3
|
a as AuthTestIds,
|
|
4
4
|
r as Chat,
|
|
@@ -10,21 +10,21 @@ export {
|
|
|
10
10
|
p as applyTypography,
|
|
11
11
|
h as clearTypography,
|
|
12
12
|
n as formatFingerprint,
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
d as handleQRChatId,
|
|
14
|
+
l as isE2eeEnabled,
|
|
15
|
+
y as isRefreshFatalError,
|
|
16
|
+
I as logoutService,
|
|
17
17
|
T as omemo,
|
|
18
18
|
f as parseQuickReplies,
|
|
19
|
-
|
|
19
|
+
m as refreshAuthTokens,
|
|
20
20
|
R as refreshAuthTokensQuietly,
|
|
21
21
|
g as resendMessage,
|
|
22
22
|
c as useInAppNotifications,
|
|
23
23
|
C as useIsUserOnline,
|
|
24
24
|
A as usePushNotifications,
|
|
25
25
|
E as useQRCodeChat,
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
26
|
+
F as useRoomMute,
|
|
27
|
+
M as useRoomPresence,
|
|
28
|
+
Q as useTypography,
|
|
29
|
+
k as useUnread
|
|
30
30
|
};
|
|
@@ -5,10 +5,16 @@ export declare function loginEmail(email: string, password: string): Promise<imp
|
|
|
5
5
|
refreshToken: string;
|
|
6
6
|
token: string;
|
|
7
7
|
fileToken?: string;
|
|
8
|
-
}, any, {}>>;
|
|
9
|
-
export declare function loginSocial(idToken: string, accessToken: string, loginType: string, authToken?: string): Promise<import('axios').AxiosResponse<any, any, {}>>;
|
|
10
|
-
export declare function registerSocial(idToken: string, accessToken: string, authToken: string, loginType: string, signUpPlan?: string): Promise<import('axios').AxiosResponse<any,
|
|
11
|
-
|
|
8
|
+
}, any, {}, any>>;
|
|
9
|
+
export declare function loginSocial(idToken: string, accessToken: string, loginType: string, authToken?: string): Promise<import('axios').AxiosResponse<any, any, {}, any>>;
|
|
10
|
+
export declare function registerSocial(idToken: string, accessToken: string, authToken: string, loginType: string, signUpPlan?: string): Promise<import('axios').AxiosResponse<any, {
|
|
11
|
+
idToken: string;
|
|
12
|
+
accessToken: string;
|
|
13
|
+
loginType: string;
|
|
14
|
+
authToken: string;
|
|
15
|
+
signupPlan: string;
|
|
16
|
+
}, {}, any>>;
|
|
17
|
+
export declare function checkEmailExist(email: string): Promise<import('axios').AxiosResponse<any, any, {}, any>>;
|
|
12
18
|
export declare function loginViaJwt(clientToken: string): Promise<User>;
|
|
13
19
|
export declare const signInWithGoogle: () => Promise<{
|
|
14
20
|
user?: undefined;
|
|
@@ -27,6 +33,8 @@ export interface UploadFileOptions {
|
|
|
27
33
|
* BEFORE the secure/legacy split so both routes carry it.
|
|
28
34
|
*/
|
|
29
35
|
clientEncrypted?: boolean;
|
|
36
|
+
/** Upload progress for this request, 0 to 100. */
|
|
37
|
+
onProgress?: (percent: number) => void;
|
|
30
38
|
}
|
|
31
|
-
export declare function uploadFile(formData: FormData, activeRoomJID: string, options?: UploadFileOptions): Promise<import('axios').AxiosResponse<any,
|
|
39
|
+
export declare function uploadFile(formData: FormData, activeRoomJID: string, options?: UploadFileOptions): Promise<import('axios').AxiosResponse<any, FormData, {}, any>>;
|
|
32
40
|
export declare function ensureUserFromMy(user: User | null | undefined): Promise<User | null>;
|
|
@@ -4,10 +4,10 @@ interface GetMyUserOptions {
|
|
|
4
4
|
endpoint?: string;
|
|
5
5
|
signal?: AbortSignal;
|
|
6
6
|
}
|
|
7
|
-
export declare function getDocuments(walletAddress: string): Promise<import('axios').AxiosResponse<any, any, {}>>;
|
|
8
|
-
export declare function getExportMyData(): Promise<import('axios').AxiosResponse<any, any, {}>>;
|
|
9
|
-
export declare function deleteMe(): Promise<import('axios').AxiosResponse<any, any, {}>>;
|
|
10
|
-
export declare function updateMe(data: any): Promise<import('axios').AxiosResponse<any, any, {}>>;
|
|
7
|
+
export declare function getDocuments(walletAddress: string): Promise<import('axios').AxiosResponse<any, any, {}, any>>;
|
|
8
|
+
export declare function getExportMyData(): Promise<import('axios').AxiosResponse<any, any, {}, any>>;
|
|
9
|
+
export declare function deleteMe(): Promise<import('axios').AxiosResponse<any, any, {}, any>>;
|
|
10
|
+
export declare function updateMe(data: any): Promise<import('axios').AxiosResponse<any, any, {}, any>>;
|
|
11
11
|
export declare function updateProfile(fd: FormData): Promise<{
|
|
12
12
|
user: User;
|
|
13
13
|
}>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Element } from 'ltx';
|
|
2
|
+
/**
|
|
3
|
+
* Claims a decrypted <call-key> signal, feeding the media key into the call
|
|
4
|
+
* slice. Returns true when it handled the stanza (so the caller stops
|
|
5
|
+
* dispatching it to the chat handlers).
|
|
6
|
+
*/
|
|
7
|
+
export declare function onCallKeyStanza(stanza: Element): boolean;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coalesces XEP-0184 delivery receipts per room.
|
|
3
|
+
*
|
|
4
|
+
* Per room, the first message enqueued while no window is open is acked at
|
|
5
|
+
* once (leading edge). Everything that arrives during the following
|
|
6
|
+
* `coalesceMs` window is held, keeping only the newest message by timestamp,
|
|
7
|
+
* and that one is acked when the window closes (trailing edge). A receipt
|
|
8
|
+
* for a message implies delivery of everything before it, so one stanza can
|
|
9
|
+
* stand for a whole burst or a whole history replay.
|
|
10
|
+
*/
|
|
11
|
+
export interface DeliveryReceiptBatcherOptions {
|
|
12
|
+
/** Sends one `<received/>` for `messageId` in `roomJid`. */
|
|
13
|
+
send: (roomJid: string, messageId: string) => void;
|
|
14
|
+
/** Injectable timer for tests. */
|
|
15
|
+
setTimer?: (fn: () => void, ms: number) => unknown;
|
|
16
|
+
/** Injectable timer cancel for tests. */
|
|
17
|
+
clearTimer?: (handle: unknown) => void;
|
|
18
|
+
/** Injectable clock, used when `enqueue` gets no timestamp. */
|
|
19
|
+
now?: () => number;
|
|
20
|
+
/** Bound on remembered acked ids (oldest forgotten first). */
|
|
21
|
+
maxAckedIds?: number;
|
|
22
|
+
}
|
|
23
|
+
export declare class DeliveryReceiptBatcher {
|
|
24
|
+
private readonly options;
|
|
25
|
+
private readonly rooms;
|
|
26
|
+
private readonly acked;
|
|
27
|
+
private readonly maxAckedIds;
|
|
28
|
+
private readonly setTimer;
|
|
29
|
+
private readonly clearTimer;
|
|
30
|
+
private readonly now;
|
|
31
|
+
constructor(options: DeliveryReceiptBatcherOptions);
|
|
32
|
+
/**
|
|
33
|
+
* Queues a receipt for `messageId`. `coalesceMs` is the window length used
|
|
34
|
+
* when a window opens; 0 sends every call straight away.
|
|
35
|
+
*/
|
|
36
|
+
enqueue(roomJid: string, messageId: string, coalesceMs: number, timestamp?: number): void;
|
|
37
|
+
/** Cancels the window and drops the held message for one room. */
|
|
38
|
+
clearRoom(roomJid: string): void;
|
|
39
|
+
/**
|
|
40
|
+
* Cancels every window and drops every held message (disconnect). Acked
|
|
41
|
+
* ids are kept so a reconnect replay does not ack them twice.
|
|
42
|
+
*/
|
|
43
|
+
clear(): void;
|
|
44
|
+
/** Full teardown: timers, held messages and the acked-id memory. */
|
|
45
|
+
destroy(): void;
|
|
46
|
+
/** Test/inspection helper: number of rooms with an open window. */
|
|
47
|
+
openWindowCount(): number;
|
|
48
|
+
private stateFor;
|
|
49
|
+
private ack;
|
|
50
|
+
private onWindowEnd;
|
|
51
|
+
private cancel;
|
|
52
|
+
private remember;
|
|
53
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rate-limits XEP-0333 `<displayed/>` markers for one room. The first mark
|
|
3
|
+
* goes out at once; marks inside `minIntervalMs` of the last send are held
|
|
4
|
+
* and only the newest id is sent when the interval ends (trailing edge), so
|
|
5
|
+
* the final read watermark is never lost. `dispose()` sends a held mark
|
|
6
|
+
* immediately, then cancels the timer.
|
|
7
|
+
*/
|
|
8
|
+
export interface DisplayedMarkerThrottleOptions {
|
|
9
|
+
minIntervalMs: number;
|
|
10
|
+
send: (messageId: string) => void;
|
|
11
|
+
now?: () => number;
|
|
12
|
+
setTimer?: (fn: () => void, ms: number) => unknown;
|
|
13
|
+
clearTimer?: (handle: unknown) => void;
|
|
14
|
+
}
|
|
15
|
+
export declare class DisplayedMarkerThrottle {
|
|
16
|
+
private readonly options;
|
|
17
|
+
private lastSentAt;
|
|
18
|
+
private pendingId;
|
|
19
|
+
private timer;
|
|
20
|
+
private disposed;
|
|
21
|
+
private readonly now;
|
|
22
|
+
private readonly setTimer;
|
|
23
|
+
private readonly clearTimer;
|
|
24
|
+
constructor(options: DisplayedMarkerThrottleOptions);
|
|
25
|
+
mark(messageId: string): void;
|
|
26
|
+
dispose(): void;
|
|
27
|
+
private onTimer;
|
|
28
|
+
private fire;
|
|
29
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { ReceiptsConfig } from '../types/models/config.model';
|
|
2
|
+
import { IMessage, IRoom } from '../types/types';
|
|
3
|
+
export declare const RECEIPTS_DEFAULTS: {
|
|
4
|
+
mode: "auto";
|
|
5
|
+
deliveryMaxRoomSize: number;
|
|
6
|
+
readMaxRoomSize: number;
|
|
7
|
+
maxAgeDays: number;
|
|
8
|
+
coalesceMs: number;
|
|
9
|
+
};
|
|
10
|
+
export interface ResolvedReceiptsConfig {
|
|
11
|
+
mode: 'auto' | 'all' | 'off';
|
|
12
|
+
deliveryMaxRoomSize: number;
|
|
13
|
+
readMaxRoomSize: number;
|
|
14
|
+
maxAgeDays: number;
|
|
15
|
+
coalesceMs: number;
|
|
16
|
+
}
|
|
17
|
+
/** Fills every unset or invalid option with its default. */
|
|
18
|
+
export declare const resolveReceiptsConfig: (cfg?: ReceiptsConfig | null) => ResolvedReceiptsConfig;
|
|
19
|
+
/**
|
|
20
|
+
* Other members of the room (the sender excluded). The larger of the true
|
|
21
|
+
* `usersCnt` and the loaded `members` list wins. 0 when the size is unknown.
|
|
22
|
+
*/
|
|
23
|
+
export declare const roomOtherMembers: (room?: Pick<IRoom, "usersCnt" | "members"> | null) => number;
|
|
24
|
+
/** Timestamp of a message in ms (date, timestamp, then id), 0 when unreadable. */
|
|
25
|
+
export declare const messageTimestamp: (message: Pick<IMessage, "id" | "date" | "timestamp">) => number;
|
|
26
|
+
/**
|
|
27
|
+
* Whether this client should send a XEP-0184 `<received/>` for `message`.
|
|
28
|
+
* The caller has already excluded our own messages and MAM/echo duplicates.
|
|
29
|
+
*/
|
|
30
|
+
export declare const shouldSendDelivery: (room: Pick<IRoom, "type" | "usersCnt" | "members"> | null | undefined, message: Pick<IMessage, "id" | "date" | "timestamp" | "isSystemMessage">, cfg: ResolvedReceiptsConfig, now: number) => boolean;
|
|
31
|
+
/** Whether this client should send a XEP-0333 `<displayed/>` for the room. */
|
|
32
|
+
export declare const shouldSendRead: (room: Pick<IRoom, "type" | "usersCnt" | "members"> | null | undefined, cfg: ResolvedReceiptsConfig) => boolean;
|
|
@@ -4,9 +4,11 @@ import { default as XmppClient } from './xmppClient';
|
|
|
4
4
|
declare const onRealtimeMessage: (stanza: Element, xmppClient?: XmppClient) => Promise<IMessage>;
|
|
5
5
|
declare const onReactionMessage: (stanza: Element) => Promise<void>;
|
|
6
6
|
declare const onDeleteMessage: (stanza: Element) => Promise<void>;
|
|
7
|
+
declare const onReceivedReceipt: (stanza: Element) => Promise<void>;
|
|
8
|
+
declare const onDisplayedMarker: (stanza: Element) => Promise<void>;
|
|
7
9
|
declare const onEditMessage: (stanza: Element) => Promise<void>;
|
|
8
10
|
declare const onReactionHistory: (stanza: any) => Promise<void>;
|
|
9
|
-
declare const onMessageHistory: (stanza: any) => Promise<void>;
|
|
11
|
+
declare const onMessageHistory: (stanza: any, xmppClient?: XmppClient) => Promise<void>;
|
|
10
12
|
declare const handleComposing: (stanza: Element, currentUser: string) => Promise<void>;
|
|
11
13
|
declare const onPresenceInRoom: (stanza: Element | any) => void;
|
|
12
14
|
declare const onChatInvite: (stanza: Element, client: XmppClient) => Promise<void>;
|
|
@@ -31,4 +33,4 @@ export type XMPPErrorInfo = {
|
|
|
31
33
|
export declare const handleErrorMessageStanza: (stanza: Element) => XMPPErrorInfo | null;
|
|
32
34
|
declare const onUserUpdate: (stanza: Element, xmppWs?: XmppClient) => Promise<void>;
|
|
33
35
|
declare const onChatUpdate: (stanza: Element, xmppWs?: XmppClient) => Promise<void>;
|
|
34
|
-
export { onRealtimeMessage, onMessageHistory, onPresenceInRoom, onReactionHistory, onGetLastMessageArchive, handleComposing, onGetChatRooms, onNewRoomCreated, onGetMembers, onGetRoomInfo, onDeleteMessage, onEditMessage, onReactionMessage, onChatInvite, onRoomKicked, onRoomMembershipChange, onMembersRefreshSignal, onMessageError, onUserUpdate, onChatUpdate, };
|
|
36
|
+
export { onRealtimeMessage, onMessageHistory, onPresenceInRoom, onReactionHistory, onGetLastMessageArchive, handleComposing, onGetChatRooms, onNewRoomCreated, onGetMembers, onGetRoomInfo, onDeleteMessage, onEditMessage, onReactionMessage, onReceivedReceipt, onDisplayedMarker, onChatInvite, onRoomKicked, onRoomMembershipChange, onMembersRefreshSignal, onMessageError, onUserUpdate, onChatUpdate, };
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Client } from '@xmpp/client';
|
|
2
|
+
import { IMentionSpan } from '../../types/types';
|
|
2
3
|
/**
|
|
3
4
|
* What <body> carries in an e2ee room: the key material for each sealed
|
|
4
5
|
* attachment, in the same order as `attachments` / the flat fields on <data>.
|
|
@@ -9,5 +10,12 @@ import { Client } from '@xmpp/client';
|
|
|
9
10
|
export interface E2eeMediaBody {
|
|
10
11
|
v: 1;
|
|
11
12
|
keys: string[];
|
|
13
|
+
/**
|
|
14
|
+
* The text typed with the files. It lives here, inside the envelope, and
|
|
15
|
+
* nowhere on <data>, so an e2ee caption is never readable in transit.
|
|
16
|
+
* Older readers only look at `keys` and ignore the rest.
|
|
17
|
+
*/
|
|
18
|
+
caption?: string;
|
|
19
|
+
captionMentions?: IMentionSpan[];
|
|
12
20
|
}
|
|
13
21
|
export declare function sendMediaMessage(client: Client, roomJID: string, data: any, id: string): Promise<void>;
|
|
@@ -64,6 +64,7 @@ export declare class XmppClient implements XmppClientInterface {
|
|
|
64
64
|
private historyQueueWorkerScheduled;
|
|
65
65
|
private historyQueueWorkerTimer;
|
|
66
66
|
private roomHistoryEpoch;
|
|
67
|
+
private readonly deliveryBatcher;
|
|
67
68
|
private criticalSendUntil;
|
|
68
69
|
private activeRoomBoostUntil;
|
|
69
70
|
private sendStartedAtById;
|
|
@@ -313,6 +314,10 @@ export declare class XmppClient implements XmppClientInterface {
|
|
|
313
314
|
deleteMessageStanza(room: string, msgId: string): void;
|
|
314
315
|
editMessageStanza(room: string, msgId: string, text: string): void;
|
|
315
316
|
sendMessageReactionStanza(messageId: string, roomJid: string, reactionsList: string[], reactionSymbol?: any): void;
|
|
317
|
+
sendReceivedReceiptStanza(messageId: string, roomJid: string): void;
|
|
318
|
+
sendDisplayedMarkerStanza(messageId: string, roomJid: string): void;
|
|
319
|
+
queueDeliveryReceipt(roomJid: string, messageId: string, timestamp?: number, coalesceMs?: number): void;
|
|
320
|
+
sendHistoryReceivedReceiptStanza(roomJid: string, messageId: string, timestamp?: number, coalesceMs?: number): void;
|
|
316
321
|
sendTypingRequestStanza(chatId: string, fullName: string, start: boolean): void;
|
|
317
322
|
getChatsPrivateStoreRequestStanza: () => Promise<Record<string, string | number> | null>;
|
|
318
323
|
actionSetTimestampToPrivateStoreStanza(chatId: string, timestamp: number, chats?: string[]): Promise<void>;
|
|
@@ -11,6 +11,8 @@ export interface CallState {
|
|
|
11
11
|
callId: string | null;
|
|
12
12
|
peerXmppUsername: string | null;
|
|
13
13
|
token: string | null;
|
|
14
|
+
e2eeKey: string | null;
|
|
15
|
+
e2eeKeyCallId: string | null;
|
|
14
16
|
error: string | null;
|
|
15
17
|
startedAt: number | null;
|
|
16
18
|
connectedAt: number | null;
|
|
@@ -33,6 +35,9 @@ export declare const startOutgoingCall: import('@reduxjs/toolkit').ActionCreator
|
|
|
33
35
|
roomJid: string;
|
|
34
36
|
token: string;
|
|
35
37
|
callId?: string | null;
|
|
36
|
-
}, "call/setOutgoingCallToken">, acceptIncomingCall: import('@reduxjs/toolkit').ActionCreatorWithoutPayload<"call/acceptIncomingCall">, declineIncomingCall: import('@reduxjs/toolkit').ActionCreatorWithoutPayload<"call/declineIncomingCall">, endCall: import('@reduxjs/toolkit').ActionCreatorWithoutPayload<"call/endCall">, setCallError: import('@reduxjs/toolkit').ActionCreatorWithOptionalPayload<string, "call/setCallError">, setCallPhase: import('@reduxjs/toolkit').ActionCreatorWithOptionalPayload<CallPhase, "call/setCallPhase">, setCallKind: import('@reduxjs/toolkit').ActionCreatorWithOptionalPayload<CallKind, "call/setCallKind">,
|
|
38
|
+
}, "call/setOutgoingCallToken">, acceptIncomingCall: import('@reduxjs/toolkit').ActionCreatorWithoutPayload<"call/acceptIncomingCall">, declineIncomingCall: import('@reduxjs/toolkit').ActionCreatorWithoutPayload<"call/declineIncomingCall">, endCall: import('@reduxjs/toolkit').ActionCreatorWithoutPayload<"call/endCall">, setCallError: import('@reduxjs/toolkit').ActionCreatorWithOptionalPayload<string, "call/setCallError">, setCallPhase: import('@reduxjs/toolkit').ActionCreatorWithOptionalPayload<CallPhase, "call/setCallPhase">, setCallKind: import('@reduxjs/toolkit').ActionCreatorWithOptionalPayload<CallKind, "call/setCallKind">, setCallE2eeKey: import('@reduxjs/toolkit').ActionCreatorWithOptionalPayload<{
|
|
39
|
+
key: string;
|
|
40
|
+
callId: string | null;
|
|
41
|
+
}, "call/setCallE2eeKey">, resetCall: import('@reduxjs/toolkit').ActionCreatorWithoutPayload<"call/resetCall">;
|
|
37
42
|
declare const _default: import('redux').Reducer<import('immer').WritableDraft<CallState>>;
|
|
38
43
|
export default _default;
|
|
@@ -44,6 +44,16 @@ export declare const restoreUsersSetForRehydrate: (usersSet: Record<string, any>
|
|
|
44
44
|
* /chats/my response re-seeds it.
|
|
45
45
|
*/
|
|
46
46
|
export declare const resetSessionRoomState: (roomsMap: Record<string, IRoom>) => Record<string, IRoom>;
|
|
47
|
+
/**
|
|
48
|
+
* A transcript cached by a build that did not persist reactions repaints every
|
|
49
|
+
* bubble without its reaction chips, and the archive will not re-deliver them
|
|
50
|
+
* for the cached middle (the latest page is merged onto the cache and the
|
|
51
|
+
* backfill resumes from the cache's oldest message). Such a cache is dropped
|
|
52
|
+
* once - the room shell stays, the transcript is refetched from MAM - exactly
|
|
53
|
+
* like the cache-budget eviction, except the paging cursors go with it: a
|
|
54
|
+
* stale first/last id would make the backfill start behind the dropped range.
|
|
55
|
+
*/
|
|
56
|
+
export declare const dropReactionlessCaches: (roomsMap: Record<string, IRoom>) => Record<string, IRoom>;
|
|
47
57
|
export declare const limitMessagesTransform: import('redux-persist').Transform<any, any, Record<string, any>, Record<string, any>>;
|
|
48
58
|
export declare const scrubSensitiveChatStateTransform: import('redux-persist').Transform<any, any, Record<string, any>, Record<string, any>>;
|
|
49
59
|
export declare const sanitizeRoomsStateTransform: import('redux-persist').Transform<any, any, Record<string, any>, Record<string, any>>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AddRoomMessageAction, ApiRoom, EditAction, IMessage, IRoom, ReactionAction, RoomMember, Translation } from '../types/types';
|
|
1
|
+
import { AddRoomMessageAction, ApiRoom, EditAction, IAttachment, IMessage, IRoom, ReactionAction, RoomMember, Translation } from '../types/types';
|
|
2
2
|
import { default as XmppClient } from '../networking/xmppClient';
|
|
3
3
|
/**
|
|
4
4
|
* Draft caps. Drafts ride along in the persisted rooms slice, so they have
|
|
@@ -129,7 +129,13 @@ export declare const addRoom: import('@reduxjs/toolkit').ActionCreatorWithOption
|
|
|
129
129
|
}, "roomMessages/setMessageSendFailed">, setMessageSendRetrying: import('@reduxjs/toolkit').ActionCreatorWithOptionalPayload<{
|
|
130
130
|
roomJID: string;
|
|
131
131
|
messageId: string;
|
|
132
|
-
}, "roomMessages/setMessageSendRetrying">,
|
|
132
|
+
}, "roomMessages/setMessageSendRetrying">, setMediaUploadState: import('@reduxjs/toolkit').ActionCreatorWithOptionalPayload<{
|
|
133
|
+
roomJID: string;
|
|
134
|
+
messageId: string;
|
|
135
|
+
attachments?: IAttachment[];
|
|
136
|
+
pending?: boolean;
|
|
137
|
+
failed?: boolean;
|
|
138
|
+
}, "roomMessages/setMediaUploadState">, editRoomMessage: import('@reduxjs/toolkit').ActionCreatorWithOptionalPayload<{
|
|
133
139
|
roomJID: string;
|
|
134
140
|
messageId: string;
|
|
135
141
|
text: string;
|
|
@@ -182,7 +188,20 @@ export declare const addRoom: import('@reduxjs/toolkit').ActionCreatorWithOption
|
|
|
182
188
|
}, "roomMessages/setMemberOffline">, setChatUiVisible: import('@reduxjs/toolkit').ActionCreatorWithOptionalPayload<boolean, "roomMessages/setChatUiVisible">, setRoomRole: import('@reduxjs/toolkit').ActionCreatorWithOptionalPayload<{
|
|
183
189
|
chatJID: string;
|
|
184
190
|
role: string;
|
|
185
|
-
}, "roomMessages/setRoomRole">, setReactions: import('@reduxjs/toolkit').ActionCreatorWithOptionalPayload<ReactionAction, "roomMessages/setReactions">,
|
|
191
|
+
}, "roomMessages/setRoomRole">, setReactions: import('@reduxjs/toolkit').ActionCreatorWithOptionalPayload<ReactionAction, "roomMessages/setReactions">, setReceivedReceipt: import('@reduxjs/toolkit').ActionCreatorWithOptionalPayload<{
|
|
192
|
+
roomJID: string;
|
|
193
|
+
messageId: string;
|
|
194
|
+
fromXmppUsername: string;
|
|
195
|
+
timestamp: number;
|
|
196
|
+
}, "roomMessages/setReceivedReceipt">, setReceivedWatermark: import('@reduxjs/toolkit').ActionCreatorWithOptionalPayload<{
|
|
197
|
+
roomJID: string;
|
|
198
|
+
xmppUsername: string;
|
|
199
|
+
messageId: string;
|
|
200
|
+
}, "roomMessages/setReceivedWatermark">, setDisplayedMarker: import('@reduxjs/toolkit').ActionCreatorWithOptionalPayload<{
|
|
201
|
+
roomJID: string;
|
|
202
|
+
xmppUsername: string;
|
|
203
|
+
messageId: string;
|
|
204
|
+
}, "roomMessages/setDisplayedMarker">, setLogoutState: import('@reduxjs/toolkit').ActionCreatorWithoutPayload<"roomMessages/setLogoutState">, setActiveMessage: import('@reduxjs/toolkit').ActionCreatorWithOptionalPayload<{
|
|
186
205
|
id: string;
|
|
187
206
|
chatJID: string;
|
|
188
207
|
}, "roomMessages/setActiveMessage">, setCloseActiveMessage: import('@reduxjs/toolkit').ActionCreatorWithOptionalPayload<{
|
package/dist/styles/motion.d.ts
CHANGED
|
@@ -20,7 +20,17 @@ export declare const MOTION_BASE_MS = 220;
|
|
|
20
20
|
export declare const fadeIn: import('styled-components/dist/models/Keyframes').default;
|
|
21
21
|
export declare const fadeInUp: import('styled-components/dist/models/Keyframes').default;
|
|
22
22
|
export declare const scaleIn: import('styled-components/dist/models/Keyframes').default;
|
|
23
|
-
|
|
23
|
+
/** Skeleton timing: one sweep cycle, and the delay before anything shows. */
|
|
24
|
+
export declare const SHIMMER_SWEEP_MS = 2000;
|
|
25
|
+
export declare const SHIMMER_DELAY_MS = 120;
|
|
26
|
+
export declare const SHIMMER_FADE_IN_MS = 240;
|
|
27
|
+
/**
|
|
28
|
+
* The loading band drifts left to right (reading direction). Keyframes move
|
|
29
|
+
* the band's own transform, not background-position, so the browser can run
|
|
30
|
+
* it on the compositor. The band is 60% of the host wide, so -100% parks it
|
|
31
|
+
* just off the left edge and 166.67% just off the right edge.
|
|
32
|
+
*/
|
|
33
|
+
export declare const shimmerSweep: import('styled-components/dist/models/Keyframes').default;
|
|
24
34
|
/**
|
|
25
35
|
* Right-hand side drawer entrance. Travels further than `fadeInUp` (a panel
|
|
26
36
|
* sliding in from the screen edge reads as motion only if it actually
|
|
@@ -47,7 +57,17 @@ export declare const fadeInAnimation: import('styled-components').RuleSet<object
|
|
|
47
57
|
export declare const scaleInAnimation: import('styled-components').RuleSet<object>;
|
|
48
58
|
/** Convenience: side-drawer slide-in shorthand, respecting reduced motion. */
|
|
49
59
|
export declare const slideInRightAnimation: import('styled-components').RuleSet<object>;
|
|
50
|
-
/**
|
|
60
|
+
/**
|
|
61
|
+
* Loading skeleton: a calm, slightly tinted base with one soft band sweeping
|
|
62
|
+
* left to right every 2s. The band fades in with its own transparent edges,
|
|
63
|
+
* so there is no hard leading or trailing line. Nothing shows for the first
|
|
64
|
+
* 120ms, so an image that arrives quickly never flashes a placeholder.
|
|
65
|
+
*
|
|
66
|
+
* The host must be positioned (`position: relative` or `absolute`, set by the
|
|
67
|
+
* host itself so this helper cannot override it); the band is an ::after
|
|
68
|
+
* clipped by the host's `overflow: hidden`. Reduced motion keeps only the
|
|
69
|
+
* static base.
|
|
70
|
+
*/
|
|
51
71
|
export declare const shimmerBackground: import('styled-components').RuleSet<object>;
|
|
52
72
|
export declare const fadeOut: import('styled-components/dist/models/Keyframes').default;
|
|
53
73
|
export declare const scaleOut: import('styled-components/dist/models/Keyframes').default;
|
|
@@ -23,6 +23,9 @@ export interface IAttachment {
|
|
|
23
23
|
/** Bytes, as a string - that is how it travels on the wire. */
|
|
24
24
|
size?: string;
|
|
25
25
|
duration?: string;
|
|
26
|
+
/** Natural pixel size, when the storage recorded it. Sizes the solo preview box. */
|
|
27
|
+
width?: number;
|
|
28
|
+
height?: number;
|
|
26
29
|
ownerKey?: string;
|
|
27
30
|
userId?: string;
|
|
28
31
|
createdAt?: string;
|
|
@@ -30,4 +33,20 @@ export interface IAttachment {
|
|
|
30
33
|
expiresAt?: string;
|
|
31
34
|
isVisible?: boolean;
|
|
32
35
|
isPrivate?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Local-only state of an outgoing attachment, set by the sender while its
|
|
38
|
+
* message is still being sent. Never written to the wire.
|
|
39
|
+
* uploading - the file is going up (or every file is up and the message
|
|
40
|
+
* is waiting on its siblings); `uploadProgress` is 0 to 100.
|
|
41
|
+
* failed - this file did not upload; the message is held until it
|
|
42
|
+
* is retried.
|
|
43
|
+
*/
|
|
44
|
+
uploadStatus?: 'uploading' | 'failed';
|
|
45
|
+
uploadProgress?: number;
|
|
46
|
+
/**
|
|
47
|
+
* Local-only `blob:` URL of the sender's own picture, so an outgoing image
|
|
48
|
+
* shows at once and stays on screen while the server copy loads. Never
|
|
49
|
+
* written to the wire.
|
|
50
|
+
*/
|
|
51
|
+
localUrl?: string;
|
|
33
52
|
}
|
|
@@ -45,6 +45,32 @@ export interface VideoCallsConfig {
|
|
|
45
45
|
showScreenShare?: boolean;
|
|
46
46
|
/** Custom icons for the call control bar / ring screen. See VideoCallIcons. */
|
|
47
47
|
icons?: VideoCallIcons;
|
|
48
|
+
/**
|
|
49
|
+
* End-to-end encrypt the call media (LiveKit insertable streams). The media
|
|
50
|
+
* key is exchanged over OMEMO - the same channel the chat uses - so the SFU
|
|
51
|
+
* and the server never see it, which makes the call private even from the
|
|
52
|
+
* operator. The trust model is OMEMO's (blind-trust-before-verification on
|
|
53
|
+
* device fingerprints).
|
|
54
|
+
*
|
|
55
|
+
* Requires the chat's own encryption to be on (`config.e2ee.enabled`) and a
|
|
56
|
+
* room the backend marked `e2ee`. A call that cannot set E2EE up - an
|
|
57
|
+
* unsupported browser, an insecure (non-HTTPS) context, or a peer with no
|
|
58
|
+
* published OMEMO device - falls back to a normal (transport-encrypted)
|
|
59
|
+
* call rather than failing.
|
|
60
|
+
*/
|
|
61
|
+
e2ee?: {
|
|
62
|
+
enabled: boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Supplies the Web Worker LiveKit needs for insertable-stream E2EE. The
|
|
65
|
+
* library stays bundler-agnostic, so the host app creates it, typically:
|
|
66
|
+
* () => new Worker(
|
|
67
|
+
* new URL('livekit-client/e2ee-worker', import.meta.url),
|
|
68
|
+
* { type: 'module' }
|
|
69
|
+
* )
|
|
70
|
+
* Without a factory, call E2EE stays off.
|
|
71
|
+
*/
|
|
72
|
+
workerFactory?: () => Worker;
|
|
73
|
+
};
|
|
48
74
|
}
|
|
49
75
|
export interface FBConfig {
|
|
50
76
|
apiKey: string;
|
|
@@ -134,6 +160,32 @@ export type ChatErrorFallbackRenderer = (context: ChatErrorInfo & {
|
|
|
134
160
|
reset: () => void;
|
|
135
161
|
}) => React.ReactNode;
|
|
136
162
|
export type ChatColorScheme = 'light' | 'dark' | 'system';
|
|
163
|
+
/**
|
|
164
|
+
* Delivery (XEP-0184 `<received/>`) and read (XEP-0333 `<displayed/>`)
|
|
165
|
+
* receipts. The client always DISPLAYS the receipts it receives; these
|
|
166
|
+
* options only control what this client SENDS, so large rooms do not turn
|
|
167
|
+
* every message into a broadcast to every occupant.
|
|
168
|
+
*
|
|
169
|
+
* - `mode`: `'auto'` (default) sends delivery receipts only in rooms of up to
|
|
170
|
+
* `deliveryMaxRoomSize` other members and read markers only in rooms of up
|
|
171
|
+
* to `readMaxRoomSize` other members; `'all'` always sends (still coalesced);
|
|
172
|
+
* `'off'` never sends a delivery or read signal.
|
|
173
|
+
* - `deliveryMaxRoomSize` / `readMaxRoomSize`: room size (other members, the
|
|
174
|
+
* sender excluded) above which the signal is skipped in `'auto'`. Private
|
|
175
|
+
* 1:1 rooms and rooms whose size is unknown always send.
|
|
176
|
+
* - `maxAgeDays`: in `'auto'`, messages older than this are not acknowledged
|
|
177
|
+
* (old history replays do not generate receipts).
|
|
178
|
+
* - `coalesceMs`: delivery receipts are sent at most once per window per
|
|
179
|
+
* room; the first one goes out at once, the rest of the window is collapsed
|
|
180
|
+
* into one receipt for the newest message.
|
|
181
|
+
*/
|
|
182
|
+
export interface ReceiptsConfig {
|
|
183
|
+
mode?: 'auto' | 'all' | 'off';
|
|
184
|
+
deliveryMaxRoomSize?: number;
|
|
185
|
+
readMaxRoomSize?: number;
|
|
186
|
+
maxAgeDays?: number;
|
|
187
|
+
coalesceMs?: number;
|
|
188
|
+
}
|
|
137
189
|
export interface IConfig {
|
|
138
190
|
appId?: string;
|
|
139
191
|
/**
|
|
@@ -155,8 +207,8 @@ export interface IConfig {
|
|
|
155
207
|
/** Composer attachment limits. Applies to the built-in SendInput. */
|
|
156
208
|
attachments?: {
|
|
157
209
|
/**
|
|
158
|
-
* How many files one message may carry. Defaults to
|
|
159
|
-
*
|
|
210
|
+
* How many files one message may carry. Defaults to 10, which is also the
|
|
211
|
+
* hard cap set by the stanza payload (MAX_ATTACHMENTS_PER_MESSAGE).
|
|
160
212
|
*/
|
|
161
213
|
maxFiles?: number;
|
|
162
214
|
/** Per-file ceiling in MB. Omit to skip the client-side size check. */
|
|
@@ -527,6 +579,8 @@ export interface IConfig {
|
|
|
527
579
|
};
|
|
528
580
|
newArch?: boolean;
|
|
529
581
|
disableLastRead?: boolean;
|
|
582
|
+
/** Delivery and read receipt sending policy. See ReceiptsConfig. */
|
|
583
|
+
receipts?: ReceiptsConfig;
|
|
530
584
|
qrUrl?: string;
|
|
531
585
|
secondarySendButton?: {
|
|
532
586
|
enabled: boolean;
|
|
@@ -11,6 +11,8 @@ export interface NewMessageLabelProps {
|
|
|
11
11
|
export interface DecoratedMessage {
|
|
12
12
|
message: IMessage;
|
|
13
13
|
showDateLabel: boolean;
|
|
14
|
+
/** False when the next row is the same sender's message (a run continues). */
|
|
15
|
+
isLastInGroup?: boolean;
|
|
14
16
|
}
|
|
15
17
|
export interface ScrollControllerApi {
|
|
16
18
|
scrollToBottom: () => void;
|
|
@@ -55,6 +55,7 @@ export interface IMessage {
|
|
|
55
55
|
mainMessage?: string;
|
|
56
56
|
reply?: IReply[];
|
|
57
57
|
reaction?: Record<string, ReactionMessage>;
|
|
58
|
+
receivedBy?: Record<string, number>;
|
|
58
59
|
fileName?: string;
|
|
59
60
|
translations?: TranslationObject;
|
|
60
61
|
langSource?: Iso639_1Codes;
|
|
@@ -71,6 +72,8 @@ export interface IMessage {
|
|
|
71
72
|
xmppFrom?: string;
|
|
72
73
|
quickReplies?: unknown;
|
|
73
74
|
mentions?: IMentionSpan[];
|
|
75
|
+
caption?: string;
|
|
76
|
+
captionMentions?: IMentionSpan[];
|
|
74
77
|
callLog?: {
|
|
75
78
|
callId: string;
|
|
76
79
|
direction: 'outgoing' | 'incoming';
|
|
@@ -95,6 +98,12 @@ export interface MessageProps {
|
|
|
95
98
|
message: IMessage;
|
|
96
99
|
isUser: boolean;
|
|
97
100
|
isReply: boolean;
|
|
101
|
+
/**
|
|
102
|
+
* False when the next message comes from the same sender (a run). The last
|
|
103
|
+
* message of a run carries the bubble tail and the larger gap below it.
|
|
104
|
+
* Omitted means last.
|
|
105
|
+
*/
|
|
106
|
+
isLastInGroup?: boolean;
|
|
98
107
|
}
|
|
99
108
|
export interface MediaMessageType {
|
|
100
109
|
}
|
|
@@ -4,4 +4,23 @@ export interface ModalFile {
|
|
|
4
4
|
fileName: string;
|
|
5
5
|
fileURL: string;
|
|
6
6
|
mimetype: string;
|
|
7
|
+
/** Optional low-resolution copy, used for viewer thumbnails. */
|
|
8
|
+
previewURL?: string;
|
|
9
|
+
/** Optional message timestamp (ISO) shown in the viewer header. */
|
|
10
|
+
date?: string;
|
|
11
|
+
/** Optional sender shown in the viewer header. */
|
|
12
|
+
sender?: {
|
|
13
|
+
id?: string;
|
|
14
|
+
username?: string;
|
|
15
|
+
name?: string;
|
|
16
|
+
firstName?: string;
|
|
17
|
+
lastName?: string;
|
|
18
|
+
photo?: string;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Optional sibling files (e.g. a whole album) the viewer can page through
|
|
22
|
+
* when the room's loaded messages do not already contain this file.
|
|
23
|
+
* Single-file callers leave it out.
|
|
24
|
+
*/
|
|
25
|
+
siblings?: ModalFile[];
|
|
7
26
|
}
|
|
@@ -62,6 +62,8 @@ export interface IRoom {
|
|
|
62
62
|
composingList?: string[];
|
|
63
63
|
lastViewedTimestamp?: number;
|
|
64
64
|
unreadBaselineTimestamp?: number;
|
|
65
|
+
lastDisplayedByUser?: Record<string, string>;
|
|
66
|
+
lastReceivedByUser?: Record<string, string>;
|
|
65
67
|
unreadMessages?: number;
|
|
66
68
|
/**
|
|
67
69
|
* Unread count the server reported for this room in `GET /v1/chats/my`
|
|
@@ -80,6 +82,8 @@ export interface IRoom {
|
|
|
80
82
|
firstMessageTimestamp?: number;
|
|
81
83
|
};
|
|
82
84
|
historyComplete?: boolean;
|
|
85
|
+
/** Persisted-cache stamp: the saved transcript includes its reactions. */
|
|
86
|
+
reactionsCached?: boolean;
|
|
83
87
|
historyPreloadState?: 'idle' | 'loading' | 'partial' | 'done' | 'error';
|
|
84
88
|
unreadCapped?: boolean;
|
|
85
89
|
/**
|
|
@@ -109,6 +113,19 @@ export interface ApiRoomLastMessage {
|
|
|
109
113
|
isOwn?: boolean;
|
|
110
114
|
senderFirstName?: string;
|
|
111
115
|
senderLastName?: string;
|
|
116
|
+
/**
|
|
117
|
+
* Media fields, present when the last message is a file. Any subset may be
|
|
118
|
+
* sent: a thin payload can carry just `mimetype` and `fileName`.
|
|
119
|
+
*/
|
|
120
|
+
isMediafile?: string | boolean;
|
|
121
|
+
mimetype?: string;
|
|
122
|
+
fileName?: string;
|
|
123
|
+
originalName?: string;
|
|
124
|
+
location?: string;
|
|
125
|
+
locationPreview?: string;
|
|
126
|
+
duration?: string | number;
|
|
127
|
+
attachments?: unknown;
|
|
128
|
+
clientEncrypted?: string | boolean;
|
|
112
129
|
}
|
|
113
130
|
export interface ApiRoom {
|
|
114
131
|
name: string;
|
|
@@ -104,6 +104,9 @@ export interface XmppClientInterface {
|
|
|
104
104
|
sendMessage(roomJID: string, firstName: string, lastName: string, photo: string, walletAddress: string, userMessage: string, notDisplayedValue?: string, isReply?: boolean, showInChannel?: boolean, mainMessage?: string, customId?: string): void;
|
|
105
105
|
deleteMessageStanza(room: string, msgId: string): void;
|
|
106
106
|
editMessageStanza(room: string, msgId: string, text: string): void;
|
|
107
|
+
sendReceivedReceiptStanza(messageId: string, roomJid: string): void;
|
|
108
|
+
sendDisplayedMarkerStanza(messageId: string, roomJid: string): void;
|
|
109
|
+
sendHistoryReceivedReceiptStanza(roomJid: string, messageId: string): void;
|
|
107
110
|
sendTypingRequestStanza(chatId: string, fullName: string, start: boolean): void;
|
|
108
111
|
getChatsPrivateStoreRequestStanza(): Promise<any>;
|
|
109
112
|
actionSetTimestampToPrivateStoreStanza(chatId: string, timestamp: number, chats?: string[]): Promise<void>;
|