@poolse/react-native 2.0.13 → 2.1.0

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/index.d.cts CHANGED
@@ -100,6 +100,8 @@ interface ConversationViewProps {
100
100
  threads?: boolean;
101
101
  quotations?: boolean;
102
102
  readReceipts?: boolean;
103
+ /** Render message bodies as Markdown (links, bold, code). Defaults true. */
104
+ markdown?: boolean;
103
105
  maxBodyLength?: number;
104
106
  /** Show sender labels in group chats. `auto` (default), `always`, `never`. */
105
107
  senderLabels?: 'auto' | 'always' | 'never';
@@ -131,7 +133,7 @@ interface ConversationViewProps {
131
133
  */
132
134
  keyboardOffset?: number;
133
135
  }
134
- declare function ConversationView({ conversationId, emptyState, renderMessage, labelFor, avatarFor, header, onHeaderMembersPress, onHeaderPress, reactions, mentions, attachments, actions, threads, quotations, readReceipts, maxBodyLength, senderLabels, avatars, onMarkedRead, onSent, keyboardOffset, }: ConversationViewProps): react_jsx_runtime.JSX.Element;
136
+ declare function ConversationView({ conversationId, emptyState, renderMessage, labelFor, avatarFor, header, onHeaderMembersPress, onHeaderPress, reactions, mentions, attachments, actions, threads, quotations, readReceipts, markdown, maxBodyLength, senderLabels, avatars, onMarkedRead, onSent, keyboardOffset, }: ConversationViewProps): react_jsx_runtime.JSX.Element;
135
137
 
136
138
  interface ChatHeaderProps {
137
139
  conversationId: Uuid;
@@ -222,16 +224,15 @@ interface MessageBubbleProps {
222
224
  actionsTrigger?: ReactNode;
223
225
  /** Render in-bubble attachments (images, file cards). Defaults to true. */
224
226
  showAttachments?: boolean;
227
+ /**
228
+ * Render the body as Markdown (bold, italic, code, lists, links).
229
+ * Links open via `Linking.openURL`. Requires
230
+ * `react-native-markdown-display` to be installed in the host app;
231
+ * without it we fall back to plain text. Defaults to true.
232
+ */
233
+ markdown?: boolean;
225
234
  }
226
- declare function MessageBubble({ message, currentUserId, readState, labelFor, onQuotedClick, groupPosition, maxBodyLength, showSenderName, actionsTrigger, showAttachments, }: MessageBubbleProps): react_jsx_runtime.JSX.Element;
227
-
228
- interface EditableMessageBubbleProps {
229
- message: Message;
230
- currentUserId: string | null;
231
- onCancel: () => void;
232
- onSave: (body: string) => Promise<unknown> | void;
233
- }
234
- declare function EditableMessageBubble({ message, currentUserId, onCancel, onSave, }: EditableMessageBubbleProps): react_jsx_runtime.JSX.Element;
235
+ declare function MessageBubble({ message, currentUserId, readState, labelFor, onQuotedClick, groupPosition, maxBodyLength, showSenderName, actionsTrigger, showAttachments, markdown, }: MessageBubbleProps): react_jsx_runtime.JSX.Element;
235
236
 
236
237
  interface MessageRowProps {
237
238
  msg: Message;
@@ -243,11 +244,23 @@ interface MessageRowProps {
243
244
  threads?: boolean;
244
245
  /** WhatsApp-style quote-reply. Defaults true on ConversationView. */
245
246
  quotations?: boolean;
247
+ /** Forwarded to `<MessageBubble markdown>`. Defaults true. */
248
+ markdown?: boolean;
246
249
  readState?: 'sent' | 'read';
247
- editing?: boolean;
250
+ /**
251
+ * Whether this row's message is the one currently being edited.
252
+ * Editing happens in the composer (see MessageComposer's
253
+ * `editingMessage` prop); this flag is only used to elevate the
254
+ * row above the dim backdrop ConversationView renders during
255
+ * edit mode.
256
+ */
257
+ isEditing?: boolean;
258
+ /**
259
+ * Long-press → "Edit". Omitted entirely (no Edit option in the
260
+ * menu) when the parent has decided this message isn't editable
261
+ * (someone read it, it's deleted, it isn't yours).
262
+ */
248
263
  onStartEdit?: () => void;
249
- onCancelEdit?: () => void;
250
- onSaveEdit?: (body: string) => Promise<unknown> | void;
251
264
  onDelete?: () => void;
252
265
  onOpenThread?: () => void;
253
266
  onQuote?: () => void;
@@ -262,7 +275,7 @@ interface MessageRowProps {
262
275
  /** Avatar resolver — same signature as `<MemberList avatarFor>`. */
263
276
  avatarFor?: (externalId: string) => string | null;
264
277
  }
265
- declare function MessageRow({ msg, meId, reactions, attachments, actions, threads, quotations, readState, editing, onStartEdit, onCancelEdit, onSaveEdit, onDelete, onOpenThread, onQuote, labelFor, onQuotedClick, groupPosition, maxBodyLength, showSenderName, showAvatar, avatarFor, }: MessageRowProps): react_jsx_runtime.JSX.Element;
278
+ declare function MessageRow({ msg, meId, reactions, attachments, actions, threads, quotations, markdown, readState, isEditing, onStartEdit, onDelete, onOpenThread, onQuote, labelFor, onQuotedClick, groupPosition, maxBodyLength, showSenderName, showAvatar, avatarFor, }: MessageRowProps): react_jsx_runtime.JSX.Element;
266
279
 
267
280
  interface MessageComposerProps {
268
281
  /**
@@ -298,6 +311,16 @@ interface MessageComposerProps {
298
311
  * ignored.
299
312
  */
300
313
  keyboardOffset?: number;
314
+ /**
315
+ * When set, the composer enters edit mode: prefills the input with
316
+ * the message body and renders an "Editing message" chip above
317
+ * (mirrors `replyingTo`). Tapping Send calls `onSaveEdit(body)`
318
+ * instead of `onSend`; `onCancelEdit` clears the chip and restores
319
+ * the previous draft. Pass `null` (or omit) when not editing.
320
+ */
321
+ editingMessage?: Message | null;
322
+ onCancelEdit?: () => void;
323
+ onSaveEdit?: (body: string) => Promise<unknown> | void;
301
324
  }
302
325
  /**
303
326
  * Imperative handle for parents that want to add files to the
@@ -338,8 +361,27 @@ interface MessageActionsProps {
338
361
  */
339
362
  declare function MessageActions({ visible, onClose, isSelf, emojis, onPickReaction, onReply, onReplyInThread, onQuote, onEdit, onDelete, onCopy, }: MessageActionsProps): react_jsx_runtime.JSX.Element;
340
363
 
364
+ /**
365
+ * Either a real message or a day-separator row. ConversationView
366
+ * builds the list of items (interleaving separators where the day
367
+ * changes) and hands it to MessageList; MessageList just renders.
368
+ */
369
+ type MessageListItem = {
370
+ kind: 'msg';
371
+ msg: Message;
372
+ } | {
373
+ kind: 'separator';
374
+ id: string;
375
+ node: ReactElement;
376
+ };
341
377
  interface MessageListProps {
342
378
  messages: Message[];
379
+ /**
380
+ * Optional pre-built item list (with day separators interleaved).
381
+ * When omitted, a list with `{ kind: 'msg' }` items is derived
382
+ * from `messages` and rendered without separators.
383
+ */
384
+ items?: MessageListItem[];
343
385
  loading?: boolean;
344
386
  hasMore?: boolean;
345
387
  onLoadMore?: () => void;
@@ -350,6 +392,13 @@ interface MessageListProps {
350
392
  ListFooter?: ReactElement | null;
351
393
  /** Custom empty state when there are no messages. */
352
394
  emptyState?: ReactElement | string;
395
+ /**
396
+ * The current user's id. When provided, MessageList will show a
397
+ * "↓ N new messages" jump button at the bottom of the chat
398
+ * whenever new messages from OTHER users arrive while the user is
399
+ * scrolled away from the bottom. Tapping scrolls to the latest.
400
+ */
401
+ meId?: string | null;
353
402
  }
354
403
  /**
355
404
  * Inverted FlatList wrapper for chat history. Newest message at the
@@ -359,7 +408,18 @@ interface MessageListProps {
359
408
  * Pagination is owned by `useMessages` (hand it `messages` +
360
409
  * `hasMore` + `loadMore`); this component just renders + scrolls.
361
410
  */
362
- declare function MessageList({ messages, loading, hasMore, onLoadMore, renderItem, ListHeader, ListFooter, emptyState, }: MessageListProps): react_jsx_runtime.JSX.Element;
411
+ declare function MessageList({ messages, items, loading, hasMore, onLoadMore, renderItem, ListHeader, ListFooter, emptyState, meId, }: MessageListProps): react_jsx_runtime.JSX.Element;
412
+
413
+ interface DaySeparatorProps {
414
+ label: string;
415
+ }
416
+ /**
417
+ * Centered date pill rendered between messages whose `inserted_at`
418
+ * falls on a different calendar day from the previous message. Pair
419
+ * with `formatDayLabel` from `@poolse/react` to compute the label
420
+ * ("Today" / "Yesterday" / weekday / "26 May 2024").
421
+ */
422
+ declare function DaySeparator({ label }: DaySeparatorProps): react_jsx_runtime.JSX.Element;
363
423
 
364
424
  interface TypingIndicatorProps {
365
425
  /** Set of `external_id`s currently typing — what `useTyping` returns. */
@@ -904,4 +964,4 @@ declare const defaultDarkTheme: PoolseRNTheme;
904
964
  */
905
965
  declare function useAppStateLifecycle(): void;
906
966
 
907
- export { AttachmentPicker, type AttachmentPickerProps, AttachmentPreview, type AttachmentPreviewProps, Avatar, type AvatarProps, ChatHeader, type ChatHeaderProps, ConversationList, type ConversationListProps, ConversationView, type ConversationViewProps, EditableMessageBubble, type EditableMessageBubbleProps, GroupDetailsSheet, type GroupDetailsSheetProps, type IconName, ImageMosaic, type ImageMosaicProps, type InboxUser, MemberList, type MemberListProps, MentionInput, type MentionInputProps, MessageActions, type MessageActionsProps, MessageBubble, type MessageBubbleProps, MessageComposer, type MessageComposerProps, MessageList, type MessageListProps, MessageRow, type MessageRowProps, PoolseIcon, type PoolseIconProps, PoolseInbox, type PoolseInboxHandle, type PoolseInboxProps, PoolseLogo, type PoolseLogoProps, type PoolseLogoVariant, type PoolseRNTheme, type PoolseRNThemeOverrides, PoolseTheme, type PoolseThemeProps, primitives as Primitives, ReactionPicker, type ReactionPickerProps, ReactionStrip, type ReactionStripProps, type ThemeColors, type ThemeRadii, type ThemeShadows, type ThemeSpacing, type ThemeType, ThreadView, type ThreadViewProps, TypingIndicator, type TypingIndicatorProps, UploadQueueStrip, UserName, type UserNameProps, defaultDarkTheme, defaultLightTheme, useAppStateLifecycle, useDisplayName, usePoolseTheme };
967
+ export { AttachmentPicker, type AttachmentPickerProps, AttachmentPreview, type AttachmentPreviewProps, Avatar, type AvatarProps, ChatHeader, type ChatHeaderProps, ConversationList, type ConversationListProps, ConversationView, type ConversationViewProps, DaySeparator, type DaySeparatorProps, GroupDetailsSheet, type GroupDetailsSheetProps, type IconName, ImageMosaic, type ImageMosaicProps, type InboxUser, MemberList, type MemberListProps, MentionInput, type MentionInputProps, MessageActions, type MessageActionsProps, MessageBubble, type MessageBubbleProps, MessageComposer, type MessageComposerProps, MessageList, type MessageListItem, type MessageListProps, MessageRow, type MessageRowProps, PoolseIcon, type PoolseIconProps, PoolseInbox, type PoolseInboxHandle, type PoolseInboxProps, PoolseLogo, type PoolseLogoProps, type PoolseLogoVariant, type PoolseRNTheme, type PoolseRNThemeOverrides, PoolseTheme, type PoolseThemeProps, primitives as Primitives, ReactionPicker, type ReactionPickerProps, ReactionStrip, type ReactionStripProps, type ThemeColors, type ThemeRadii, type ThemeShadows, type ThemeSpacing, type ThemeType, ThreadView, type ThreadViewProps, TypingIndicator, type TypingIndicatorProps, UploadQueueStrip, UserName, type UserNameProps, defaultDarkTheme, defaultLightTheme, useAppStateLifecycle, useDisplayName, usePoolseTheme };
package/dist/index.d.ts CHANGED
@@ -100,6 +100,8 @@ interface ConversationViewProps {
100
100
  threads?: boolean;
101
101
  quotations?: boolean;
102
102
  readReceipts?: boolean;
103
+ /** Render message bodies as Markdown (links, bold, code). Defaults true. */
104
+ markdown?: boolean;
103
105
  maxBodyLength?: number;
104
106
  /** Show sender labels in group chats. `auto` (default), `always`, `never`. */
105
107
  senderLabels?: 'auto' | 'always' | 'never';
@@ -131,7 +133,7 @@ interface ConversationViewProps {
131
133
  */
132
134
  keyboardOffset?: number;
133
135
  }
134
- declare function ConversationView({ conversationId, emptyState, renderMessage, labelFor, avatarFor, header, onHeaderMembersPress, onHeaderPress, reactions, mentions, attachments, actions, threads, quotations, readReceipts, maxBodyLength, senderLabels, avatars, onMarkedRead, onSent, keyboardOffset, }: ConversationViewProps): react_jsx_runtime.JSX.Element;
136
+ declare function ConversationView({ conversationId, emptyState, renderMessage, labelFor, avatarFor, header, onHeaderMembersPress, onHeaderPress, reactions, mentions, attachments, actions, threads, quotations, readReceipts, markdown, maxBodyLength, senderLabels, avatars, onMarkedRead, onSent, keyboardOffset, }: ConversationViewProps): react_jsx_runtime.JSX.Element;
135
137
 
136
138
  interface ChatHeaderProps {
137
139
  conversationId: Uuid;
@@ -222,16 +224,15 @@ interface MessageBubbleProps {
222
224
  actionsTrigger?: ReactNode;
223
225
  /** Render in-bubble attachments (images, file cards). Defaults to true. */
224
226
  showAttachments?: boolean;
227
+ /**
228
+ * Render the body as Markdown (bold, italic, code, lists, links).
229
+ * Links open via `Linking.openURL`. Requires
230
+ * `react-native-markdown-display` to be installed in the host app;
231
+ * without it we fall back to plain text. Defaults to true.
232
+ */
233
+ markdown?: boolean;
225
234
  }
226
- declare function MessageBubble({ message, currentUserId, readState, labelFor, onQuotedClick, groupPosition, maxBodyLength, showSenderName, actionsTrigger, showAttachments, }: MessageBubbleProps): react_jsx_runtime.JSX.Element;
227
-
228
- interface EditableMessageBubbleProps {
229
- message: Message;
230
- currentUserId: string | null;
231
- onCancel: () => void;
232
- onSave: (body: string) => Promise<unknown> | void;
233
- }
234
- declare function EditableMessageBubble({ message, currentUserId, onCancel, onSave, }: EditableMessageBubbleProps): react_jsx_runtime.JSX.Element;
235
+ declare function MessageBubble({ message, currentUserId, readState, labelFor, onQuotedClick, groupPosition, maxBodyLength, showSenderName, actionsTrigger, showAttachments, markdown, }: MessageBubbleProps): react_jsx_runtime.JSX.Element;
235
236
 
236
237
  interface MessageRowProps {
237
238
  msg: Message;
@@ -243,11 +244,23 @@ interface MessageRowProps {
243
244
  threads?: boolean;
244
245
  /** WhatsApp-style quote-reply. Defaults true on ConversationView. */
245
246
  quotations?: boolean;
247
+ /** Forwarded to `<MessageBubble markdown>`. Defaults true. */
248
+ markdown?: boolean;
246
249
  readState?: 'sent' | 'read';
247
- editing?: boolean;
250
+ /**
251
+ * Whether this row's message is the one currently being edited.
252
+ * Editing happens in the composer (see MessageComposer's
253
+ * `editingMessage` prop); this flag is only used to elevate the
254
+ * row above the dim backdrop ConversationView renders during
255
+ * edit mode.
256
+ */
257
+ isEditing?: boolean;
258
+ /**
259
+ * Long-press → "Edit". Omitted entirely (no Edit option in the
260
+ * menu) when the parent has decided this message isn't editable
261
+ * (someone read it, it's deleted, it isn't yours).
262
+ */
248
263
  onStartEdit?: () => void;
249
- onCancelEdit?: () => void;
250
- onSaveEdit?: (body: string) => Promise<unknown> | void;
251
264
  onDelete?: () => void;
252
265
  onOpenThread?: () => void;
253
266
  onQuote?: () => void;
@@ -262,7 +275,7 @@ interface MessageRowProps {
262
275
  /** Avatar resolver — same signature as `<MemberList avatarFor>`. */
263
276
  avatarFor?: (externalId: string) => string | null;
264
277
  }
265
- declare function MessageRow({ msg, meId, reactions, attachments, actions, threads, quotations, readState, editing, onStartEdit, onCancelEdit, onSaveEdit, onDelete, onOpenThread, onQuote, labelFor, onQuotedClick, groupPosition, maxBodyLength, showSenderName, showAvatar, avatarFor, }: MessageRowProps): react_jsx_runtime.JSX.Element;
278
+ declare function MessageRow({ msg, meId, reactions, attachments, actions, threads, quotations, markdown, readState, isEditing, onStartEdit, onDelete, onOpenThread, onQuote, labelFor, onQuotedClick, groupPosition, maxBodyLength, showSenderName, showAvatar, avatarFor, }: MessageRowProps): react_jsx_runtime.JSX.Element;
266
279
 
267
280
  interface MessageComposerProps {
268
281
  /**
@@ -298,6 +311,16 @@ interface MessageComposerProps {
298
311
  * ignored.
299
312
  */
300
313
  keyboardOffset?: number;
314
+ /**
315
+ * When set, the composer enters edit mode: prefills the input with
316
+ * the message body and renders an "Editing message" chip above
317
+ * (mirrors `replyingTo`). Tapping Send calls `onSaveEdit(body)`
318
+ * instead of `onSend`; `onCancelEdit` clears the chip and restores
319
+ * the previous draft. Pass `null` (or omit) when not editing.
320
+ */
321
+ editingMessage?: Message | null;
322
+ onCancelEdit?: () => void;
323
+ onSaveEdit?: (body: string) => Promise<unknown> | void;
301
324
  }
302
325
  /**
303
326
  * Imperative handle for parents that want to add files to the
@@ -338,8 +361,27 @@ interface MessageActionsProps {
338
361
  */
339
362
  declare function MessageActions({ visible, onClose, isSelf, emojis, onPickReaction, onReply, onReplyInThread, onQuote, onEdit, onDelete, onCopy, }: MessageActionsProps): react_jsx_runtime.JSX.Element;
340
363
 
364
+ /**
365
+ * Either a real message or a day-separator row. ConversationView
366
+ * builds the list of items (interleaving separators where the day
367
+ * changes) and hands it to MessageList; MessageList just renders.
368
+ */
369
+ type MessageListItem = {
370
+ kind: 'msg';
371
+ msg: Message;
372
+ } | {
373
+ kind: 'separator';
374
+ id: string;
375
+ node: ReactElement;
376
+ };
341
377
  interface MessageListProps {
342
378
  messages: Message[];
379
+ /**
380
+ * Optional pre-built item list (with day separators interleaved).
381
+ * When omitted, a list with `{ kind: 'msg' }` items is derived
382
+ * from `messages` and rendered without separators.
383
+ */
384
+ items?: MessageListItem[];
343
385
  loading?: boolean;
344
386
  hasMore?: boolean;
345
387
  onLoadMore?: () => void;
@@ -350,6 +392,13 @@ interface MessageListProps {
350
392
  ListFooter?: ReactElement | null;
351
393
  /** Custom empty state when there are no messages. */
352
394
  emptyState?: ReactElement | string;
395
+ /**
396
+ * The current user's id. When provided, MessageList will show a
397
+ * "↓ N new messages" jump button at the bottom of the chat
398
+ * whenever new messages from OTHER users arrive while the user is
399
+ * scrolled away from the bottom. Tapping scrolls to the latest.
400
+ */
401
+ meId?: string | null;
353
402
  }
354
403
  /**
355
404
  * Inverted FlatList wrapper for chat history. Newest message at the
@@ -359,7 +408,18 @@ interface MessageListProps {
359
408
  * Pagination is owned by `useMessages` (hand it `messages` +
360
409
  * `hasMore` + `loadMore`); this component just renders + scrolls.
361
410
  */
362
- declare function MessageList({ messages, loading, hasMore, onLoadMore, renderItem, ListHeader, ListFooter, emptyState, }: MessageListProps): react_jsx_runtime.JSX.Element;
411
+ declare function MessageList({ messages, items, loading, hasMore, onLoadMore, renderItem, ListHeader, ListFooter, emptyState, meId, }: MessageListProps): react_jsx_runtime.JSX.Element;
412
+
413
+ interface DaySeparatorProps {
414
+ label: string;
415
+ }
416
+ /**
417
+ * Centered date pill rendered between messages whose `inserted_at`
418
+ * falls on a different calendar day from the previous message. Pair
419
+ * with `formatDayLabel` from `@poolse/react` to compute the label
420
+ * ("Today" / "Yesterday" / weekday / "26 May 2024").
421
+ */
422
+ declare function DaySeparator({ label }: DaySeparatorProps): react_jsx_runtime.JSX.Element;
363
423
 
364
424
  interface TypingIndicatorProps {
365
425
  /** Set of `external_id`s currently typing — what `useTyping` returns. */
@@ -904,4 +964,4 @@ declare const defaultDarkTheme: PoolseRNTheme;
904
964
  */
905
965
  declare function useAppStateLifecycle(): void;
906
966
 
907
- export { AttachmentPicker, type AttachmentPickerProps, AttachmentPreview, type AttachmentPreviewProps, Avatar, type AvatarProps, ChatHeader, type ChatHeaderProps, ConversationList, type ConversationListProps, ConversationView, type ConversationViewProps, EditableMessageBubble, type EditableMessageBubbleProps, GroupDetailsSheet, type GroupDetailsSheetProps, type IconName, ImageMosaic, type ImageMosaicProps, type InboxUser, MemberList, type MemberListProps, MentionInput, type MentionInputProps, MessageActions, type MessageActionsProps, MessageBubble, type MessageBubbleProps, MessageComposer, type MessageComposerProps, MessageList, type MessageListProps, MessageRow, type MessageRowProps, PoolseIcon, type PoolseIconProps, PoolseInbox, type PoolseInboxHandle, type PoolseInboxProps, PoolseLogo, type PoolseLogoProps, type PoolseLogoVariant, type PoolseRNTheme, type PoolseRNThemeOverrides, PoolseTheme, type PoolseThemeProps, primitives as Primitives, ReactionPicker, type ReactionPickerProps, ReactionStrip, type ReactionStripProps, type ThemeColors, type ThemeRadii, type ThemeShadows, type ThemeSpacing, type ThemeType, ThreadView, type ThreadViewProps, TypingIndicator, type TypingIndicatorProps, UploadQueueStrip, UserName, type UserNameProps, defaultDarkTheme, defaultLightTheme, useAppStateLifecycle, useDisplayName, usePoolseTheme };
967
+ export { AttachmentPicker, type AttachmentPickerProps, AttachmentPreview, type AttachmentPreviewProps, Avatar, type AvatarProps, ChatHeader, type ChatHeaderProps, ConversationList, type ConversationListProps, ConversationView, type ConversationViewProps, DaySeparator, type DaySeparatorProps, GroupDetailsSheet, type GroupDetailsSheetProps, type IconName, ImageMosaic, type ImageMosaicProps, type InboxUser, MemberList, type MemberListProps, MentionInput, type MentionInputProps, MessageActions, type MessageActionsProps, MessageBubble, type MessageBubbleProps, MessageComposer, type MessageComposerProps, MessageList, type MessageListItem, type MessageListProps, MessageRow, type MessageRowProps, PoolseIcon, type PoolseIconProps, PoolseInbox, type PoolseInboxHandle, type PoolseInboxProps, PoolseLogo, type PoolseLogoProps, type PoolseLogoVariant, type PoolseRNTheme, type PoolseRNThemeOverrides, PoolseTheme, type PoolseThemeProps, primitives as Primitives, ReactionPicker, type ReactionPickerProps, ReactionStrip, type ReactionStripProps, type ThemeColors, type ThemeRadii, type ThemeShadows, type ThemeSpacing, type ThemeType, ThreadView, type ThreadViewProps, TypingIndicator, type TypingIndicatorProps, UploadQueueStrip, UserName, type UserNameProps, defaultDarkTheme, defaultLightTheme, useAppStateLifecycle, useDisplayName, usePoolseTheme };