@natoe/colab 0.1.30 → 0.1.34
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.mts +51 -5
- package/dist/index.d.ts +51 -5
- package/dist/index.js +149 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +149 -7
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -369,10 +369,13 @@ interface CollabPanelProps {
|
|
|
369
369
|
declare function CollabPanel({ orderId, conversation: providedConversation, patientData, participantIds, kind, showSeenBy, onBack, hidePatientName, hideOpenCase, onConversationChange, themeMode, showSettings: controlledShowSettings, onSettingsChange, className, style, }: CollabPanelProps): react_jsx_runtime.JSX.Element;
|
|
370
370
|
|
|
371
371
|
interface CollabPopupProps {
|
|
372
|
-
/** Order
|
|
373
|
-
|
|
372
|
+
/** Order this thread belongs to. Required for a `case` thread; omitted for a
|
|
373
|
+
* help channel, which belongs to a lab rather than an order. */
|
|
374
|
+
orderId?: string;
|
|
375
|
+
/** A thread the caller already resolved — how a help channel is opened. */
|
|
376
|
+
conversation?: Conversation | null;
|
|
374
377
|
/** Patient/study data */
|
|
375
|
-
patientData
|
|
378
|
+
patientData?: PatientData;
|
|
376
379
|
/** Participant user IDs — only used when creating a brand-new conversation */
|
|
377
380
|
participantIds?: string[];
|
|
378
381
|
/** Which thread on the case. Defaults to the shared `case` thread. */
|
|
@@ -406,7 +409,7 @@ interface CollabPopupProps {
|
|
|
406
409
|
* Draggable floating chat popup — drop-in replacement for DraggableChatPopup.
|
|
407
410
|
* Renders a CollabPanel inside a movable, resizable container.
|
|
408
411
|
*/
|
|
409
|
-
declare function CollabPopup({ orderId, patientData, participantIds, kind, isOpen, onClose, onBack, onMinimize, initialPosition, width, height, className, }: CollabPopupProps): react_jsx_runtime.JSX.Element | null;
|
|
412
|
+
declare function CollabPopup({ orderId, conversation: providedConversation, patientData, participantIds, kind, isOpen, onClose, onBack, onMinimize, initialPosition, width, height, className, }: CollabPopupProps): react_jsx_runtime.JSX.Element | null;
|
|
410
413
|
|
|
411
414
|
type ColabInlineMode = 'light' | 'dark';
|
|
412
415
|
interface CollabInlineProps {
|
|
@@ -462,6 +465,49 @@ interface CollabInboxProps {
|
|
|
462
465
|
*/
|
|
463
466
|
declare function CollabInbox({ initialConversationId, onSelectConversation, className, style, }: CollabInboxProps): react_jsx_runtime.JSX.Element;
|
|
464
467
|
|
|
468
|
+
interface HelpPanelProps {
|
|
469
|
+
/**
|
|
470
|
+
* The lab's help channel, already resolved by the host from
|
|
471
|
+
* `GET /help_channel`. Required — unlike a case thread there is nothing to
|
|
472
|
+
* look up and nothing to lazily create, so a HelpPanel without a channel has
|
|
473
|
+
* nothing to render.
|
|
474
|
+
*/
|
|
475
|
+
conversation: Conversation;
|
|
476
|
+
/** Show "seen by" under own messages (default true) */
|
|
477
|
+
showSeenBy?: boolean;
|
|
478
|
+
/** Rendered above the composer — the host's case-reference control lives here. */
|
|
479
|
+
composerAccessory?: React.ReactNode;
|
|
480
|
+
className?: string;
|
|
481
|
+
style?: React.CSSProperties;
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* The imaging centre's support thread.
|
|
485
|
+
*
|
|
486
|
+
* A deliberately SEPARATE shell from CollabPanel rather than CollabPanel with
|
|
487
|
+
* flags. The two surfaces only look similar — CollabPanel is case-shaped, and
|
|
488
|
+
* serving support through it meant suppressing the patient header, the DICOM
|
|
489
|
+
* button, the open-case action, the participant roster and channel settings one
|
|
490
|
+
* at a time. Every case-oriented feature added another thing to suppress, and
|
|
491
|
+
* missing one is not cosmetic: a roster control that slipped through crashed
|
|
492
|
+
* the whole tree on an unmapped participant role.
|
|
493
|
+
*
|
|
494
|
+
* Building additively instead means a support thread can never inherit a
|
|
495
|
+
* case affordance by accident. What IS shared is the part worth sharing — the
|
|
496
|
+
* engine. useConversation, MessageList and MessageInput are identical here, so
|
|
497
|
+
* socket lifecycle, optimistic sends, read receipts, typing, attachments,
|
|
498
|
+
* audio and pagination all behave exactly as they do on a case thread, with no
|
|
499
|
+
* second implementation to drift.
|
|
500
|
+
*
|
|
501
|
+
* Deliberately absent, and none of it by oversight:
|
|
502
|
+
* - patient / study header — there is no patient
|
|
503
|
+
* - View DICOM, Open case — there is no order
|
|
504
|
+
* - participant roster — the roster is fixed by the backend (this lab
|
|
505
|
+
* plus Natoe support) and is not editable
|
|
506
|
+
* - channel settings — invite / remove / leave do not apply
|
|
507
|
+
* - pinned messages — a support thread is chronological
|
|
508
|
+
*/
|
|
509
|
+
declare function HelpPanel({ conversation, showSeenBy, composerAccessory, className, style, }: HelpPanelProps): react_jsx_runtime.JSX.Element;
|
|
510
|
+
|
|
465
511
|
type MessageCallback = (message: Message) => void;
|
|
466
512
|
type TypingCallback = (event: TypingEvent) => void;
|
|
467
513
|
type ParticipantCallback = (participant: Participant) => void;
|
|
@@ -1277,4 +1323,4 @@ declare const SUPPORTED_IMAGE_TYPES: string[];
|
|
|
1277
1323
|
/** Max file size in bytes (20MB) */
|
|
1278
1324
|
declare const MAX_FILE_SIZE: number;
|
|
1279
1325
|
|
|
1280
|
-
export { AUDIO_MIME_TYPE, type ChannelEvent, ChannelSettings, type ChannelUpdatePayload, type CollabConfig, type CollabError, CollabInbox, CollabInline, CollabPanel, CollabPopup, CollabProvider, CollabSocket, type Conversation, type ConversationKind, ConversationList, ConversationListItem, type ConversationListItem$1 as ConversationListItemData, type ConversationPreview, type CreateConversationResponse, DEEP_LINK_PREFIX, EVENTS, type InviteUserPayload, MAX_FILE_SIZE, MAX_PINNED_MESSAGES, MESSAGES_PAGE_SIZE, MESSAGE_TYPES, type Message, MessageActionsMenu, MessageBubble, MessageInput, MessageList, type MessageListHandle, type MessageSnapshot, type MessageType, type Participant, ParticipantsList, type PatientData, PatientHeader, PinnedMessagesBar, type PreviewBatchResponse, ReplyPreview, ReplyQuoteBlock, SUPPORTED_IMAGE_TYPES, SeenByIndicator, type SendMessagePayload, THEME_DEFAULTS, THEME_VAR, TYPING_DEBOUNCE_MS, type Theme, type TypingEvent, type UserRole, applyThemeOverrides, isCaseKind, isHelpKind, useAudioRecorder, useChannelSettings, useCollab, useConversation, useConversationList, useDeepLinks, useInlineCollab, useMessages, usePinnedMessages, useUnreadCount };
|
|
1326
|
+
export { AUDIO_MIME_TYPE, type ChannelEvent, ChannelSettings, type ChannelUpdatePayload, type CollabConfig, type CollabError, CollabInbox, CollabInline, CollabPanel, CollabPopup, CollabProvider, CollabSocket, type Conversation, type ConversationKind, ConversationList, ConversationListItem, type ConversationListItem$1 as ConversationListItemData, type ConversationPreview, type CreateConversationResponse, DEEP_LINK_PREFIX, EVENTS, HelpPanel, type InviteUserPayload, MAX_FILE_SIZE, MAX_PINNED_MESSAGES, MESSAGES_PAGE_SIZE, MESSAGE_TYPES, type Message, MessageActionsMenu, MessageBubble, MessageInput, MessageList, type MessageListHandle, type MessageSnapshot, type MessageType, type Participant, ParticipantsList, type PatientData, PatientHeader, PinnedMessagesBar, type PreviewBatchResponse, ReplyPreview, ReplyQuoteBlock, SUPPORTED_IMAGE_TYPES, SeenByIndicator, type SendMessagePayload, THEME_DEFAULTS, THEME_VAR, TYPING_DEBOUNCE_MS, type Theme, type TypingEvent, type UserRole, applyThemeOverrides, isCaseKind, isHelpKind, useAudioRecorder, useChannelSettings, useCollab, useConversation, useConversationList, useDeepLinks, useInlineCollab, useMessages, usePinnedMessages, useUnreadCount };
|
package/dist/index.d.ts
CHANGED
|
@@ -369,10 +369,13 @@ interface CollabPanelProps {
|
|
|
369
369
|
declare function CollabPanel({ orderId, conversation: providedConversation, patientData, participantIds, kind, showSeenBy, onBack, hidePatientName, hideOpenCase, onConversationChange, themeMode, showSettings: controlledShowSettings, onSettingsChange, className, style, }: CollabPanelProps): react_jsx_runtime.JSX.Element;
|
|
370
370
|
|
|
371
371
|
interface CollabPopupProps {
|
|
372
|
-
/** Order
|
|
373
|
-
|
|
372
|
+
/** Order this thread belongs to. Required for a `case` thread; omitted for a
|
|
373
|
+
* help channel, which belongs to a lab rather than an order. */
|
|
374
|
+
orderId?: string;
|
|
375
|
+
/** A thread the caller already resolved — how a help channel is opened. */
|
|
376
|
+
conversation?: Conversation | null;
|
|
374
377
|
/** Patient/study data */
|
|
375
|
-
patientData
|
|
378
|
+
patientData?: PatientData;
|
|
376
379
|
/** Participant user IDs — only used when creating a brand-new conversation */
|
|
377
380
|
participantIds?: string[];
|
|
378
381
|
/** Which thread on the case. Defaults to the shared `case` thread. */
|
|
@@ -406,7 +409,7 @@ interface CollabPopupProps {
|
|
|
406
409
|
* Draggable floating chat popup — drop-in replacement for DraggableChatPopup.
|
|
407
410
|
* Renders a CollabPanel inside a movable, resizable container.
|
|
408
411
|
*/
|
|
409
|
-
declare function CollabPopup({ orderId, patientData, participantIds, kind, isOpen, onClose, onBack, onMinimize, initialPosition, width, height, className, }: CollabPopupProps): react_jsx_runtime.JSX.Element | null;
|
|
412
|
+
declare function CollabPopup({ orderId, conversation: providedConversation, patientData, participantIds, kind, isOpen, onClose, onBack, onMinimize, initialPosition, width, height, className, }: CollabPopupProps): react_jsx_runtime.JSX.Element | null;
|
|
410
413
|
|
|
411
414
|
type ColabInlineMode = 'light' | 'dark';
|
|
412
415
|
interface CollabInlineProps {
|
|
@@ -462,6 +465,49 @@ interface CollabInboxProps {
|
|
|
462
465
|
*/
|
|
463
466
|
declare function CollabInbox({ initialConversationId, onSelectConversation, className, style, }: CollabInboxProps): react_jsx_runtime.JSX.Element;
|
|
464
467
|
|
|
468
|
+
interface HelpPanelProps {
|
|
469
|
+
/**
|
|
470
|
+
* The lab's help channel, already resolved by the host from
|
|
471
|
+
* `GET /help_channel`. Required — unlike a case thread there is nothing to
|
|
472
|
+
* look up and nothing to lazily create, so a HelpPanel without a channel has
|
|
473
|
+
* nothing to render.
|
|
474
|
+
*/
|
|
475
|
+
conversation: Conversation;
|
|
476
|
+
/** Show "seen by" under own messages (default true) */
|
|
477
|
+
showSeenBy?: boolean;
|
|
478
|
+
/** Rendered above the composer — the host's case-reference control lives here. */
|
|
479
|
+
composerAccessory?: React.ReactNode;
|
|
480
|
+
className?: string;
|
|
481
|
+
style?: React.CSSProperties;
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* The imaging centre's support thread.
|
|
485
|
+
*
|
|
486
|
+
* A deliberately SEPARATE shell from CollabPanel rather than CollabPanel with
|
|
487
|
+
* flags. The two surfaces only look similar — CollabPanel is case-shaped, and
|
|
488
|
+
* serving support through it meant suppressing the patient header, the DICOM
|
|
489
|
+
* button, the open-case action, the participant roster and channel settings one
|
|
490
|
+
* at a time. Every case-oriented feature added another thing to suppress, and
|
|
491
|
+
* missing one is not cosmetic: a roster control that slipped through crashed
|
|
492
|
+
* the whole tree on an unmapped participant role.
|
|
493
|
+
*
|
|
494
|
+
* Building additively instead means a support thread can never inherit a
|
|
495
|
+
* case affordance by accident. What IS shared is the part worth sharing — the
|
|
496
|
+
* engine. useConversation, MessageList and MessageInput are identical here, so
|
|
497
|
+
* socket lifecycle, optimistic sends, read receipts, typing, attachments,
|
|
498
|
+
* audio and pagination all behave exactly as they do on a case thread, with no
|
|
499
|
+
* second implementation to drift.
|
|
500
|
+
*
|
|
501
|
+
* Deliberately absent, and none of it by oversight:
|
|
502
|
+
* - patient / study header — there is no patient
|
|
503
|
+
* - View DICOM, Open case — there is no order
|
|
504
|
+
* - participant roster — the roster is fixed by the backend (this lab
|
|
505
|
+
* plus Natoe support) and is not editable
|
|
506
|
+
* - channel settings — invite / remove / leave do not apply
|
|
507
|
+
* - pinned messages — a support thread is chronological
|
|
508
|
+
*/
|
|
509
|
+
declare function HelpPanel({ conversation, showSeenBy, composerAccessory, className, style, }: HelpPanelProps): react_jsx_runtime.JSX.Element;
|
|
510
|
+
|
|
465
511
|
type MessageCallback = (message: Message) => void;
|
|
466
512
|
type TypingCallback = (event: TypingEvent) => void;
|
|
467
513
|
type ParticipantCallback = (participant: Participant) => void;
|
|
@@ -1277,4 +1323,4 @@ declare const SUPPORTED_IMAGE_TYPES: string[];
|
|
|
1277
1323
|
/** Max file size in bytes (20MB) */
|
|
1278
1324
|
declare const MAX_FILE_SIZE: number;
|
|
1279
1325
|
|
|
1280
|
-
export { AUDIO_MIME_TYPE, type ChannelEvent, ChannelSettings, type ChannelUpdatePayload, type CollabConfig, type CollabError, CollabInbox, CollabInline, CollabPanel, CollabPopup, CollabProvider, CollabSocket, type Conversation, type ConversationKind, ConversationList, ConversationListItem, type ConversationListItem$1 as ConversationListItemData, type ConversationPreview, type CreateConversationResponse, DEEP_LINK_PREFIX, EVENTS, type InviteUserPayload, MAX_FILE_SIZE, MAX_PINNED_MESSAGES, MESSAGES_PAGE_SIZE, MESSAGE_TYPES, type Message, MessageActionsMenu, MessageBubble, MessageInput, MessageList, type MessageListHandle, type MessageSnapshot, type MessageType, type Participant, ParticipantsList, type PatientData, PatientHeader, PinnedMessagesBar, type PreviewBatchResponse, ReplyPreview, ReplyQuoteBlock, SUPPORTED_IMAGE_TYPES, SeenByIndicator, type SendMessagePayload, THEME_DEFAULTS, THEME_VAR, TYPING_DEBOUNCE_MS, type Theme, type TypingEvent, type UserRole, applyThemeOverrides, isCaseKind, isHelpKind, useAudioRecorder, useChannelSettings, useCollab, useConversation, useConversationList, useDeepLinks, useInlineCollab, useMessages, usePinnedMessages, useUnreadCount };
|
|
1326
|
+
export { AUDIO_MIME_TYPE, type ChannelEvent, ChannelSettings, type ChannelUpdatePayload, type CollabConfig, type CollabError, CollabInbox, CollabInline, CollabPanel, CollabPopup, CollabProvider, CollabSocket, type Conversation, type ConversationKind, ConversationList, ConversationListItem, type ConversationListItem$1 as ConversationListItemData, type ConversationPreview, type CreateConversationResponse, DEEP_LINK_PREFIX, EVENTS, HelpPanel, type InviteUserPayload, MAX_FILE_SIZE, MAX_PINNED_MESSAGES, MESSAGES_PAGE_SIZE, MESSAGE_TYPES, type Message, MessageActionsMenu, MessageBubble, MessageInput, MessageList, type MessageListHandle, type MessageSnapshot, type MessageType, type Participant, ParticipantsList, type PatientData, PatientHeader, PinnedMessagesBar, type PreviewBatchResponse, ReplyPreview, ReplyQuoteBlock, SUPPORTED_IMAGE_TYPES, SeenByIndicator, type SendMessagePayload, THEME_DEFAULTS, THEME_VAR, TYPING_DEBOUNCE_MS, type Theme, type TypingEvent, type UserRole, applyThemeOverrides, isCaseKind, isHelpKind, useAudioRecorder, useChannelSettings, useCollab, useConversation, useConversationList, useDeepLinks, useInlineCollab, useMessages, usePinnedMessages, useUnreadCount };
|
package/dist/index.js
CHANGED
|
@@ -1645,7 +1645,7 @@ function PatientHeader({
|
|
|
1645
1645
|
}
|
|
1646
1646
|
)
|
|
1647
1647
|
] }) : null;
|
|
1648
|
-
const settingsButton = onOpenSettings ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1648
|
+
const settingsButton = onOpenSettings && !isSupportChannel ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1649
1649
|
"button",
|
|
1650
1650
|
{
|
|
1651
1651
|
onClick: onOpenSettings,
|
|
@@ -3937,6 +3937,7 @@ function fallbackName(role) {
|
|
|
3937
3937
|
return "User";
|
|
3938
3938
|
}
|
|
3939
3939
|
}
|
|
3940
|
+
var FALLBACK_ROLE_COLOR = { bg: "#f1f5f9", text: "#64748b" };
|
|
3940
3941
|
function RoleBadge({ role }) {
|
|
3941
3942
|
const colors = {
|
|
3942
3943
|
radiologist: { bg: "#eef2ff", text: "#4f46e5" },
|
|
@@ -3948,8 +3949,8 @@ function RoleBadge({ role }) {
|
|
|
3948
3949
|
admin: { bg: "#f1f5f9", text: "#64748b" }
|
|
3949
3950
|
// slate
|
|
3950
3951
|
};
|
|
3951
|
-
const color = colors[role];
|
|
3952
|
-
return /* @__PURE__ */ jsxRuntime.jsx("span", { style: { ...styles9.roleBadge, backgroundColor: color.bg, color: color.text }, children: role });
|
|
3952
|
+
const color = colors[role] ?? FALLBACK_ROLE_COLOR;
|
|
3953
|
+
return /* @__PURE__ */ jsxRuntime.jsx("span", { style: { ...styles9.roleBadge, backgroundColor: color.bg, color: color.text }, children: fallbackName(role) });
|
|
3953
3954
|
}
|
|
3954
3955
|
var styles9 = {
|
|
3955
3956
|
list: {
|
|
@@ -4835,6 +4836,7 @@ ensureGlobalStyles();
|
|
|
4835
4836
|
var FOCUSABLE_SELECTOR = 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])';
|
|
4836
4837
|
function CollabPopup({
|
|
4837
4838
|
orderId,
|
|
4839
|
+
conversation: providedConversation,
|
|
4838
4840
|
patientData,
|
|
4839
4841
|
participantIds,
|
|
4840
4842
|
kind,
|
|
@@ -4861,7 +4863,8 @@ function CollabPopup({
|
|
|
4861
4863
|
const containerRef = React4.useRef(null);
|
|
4862
4864
|
const previouslyFocused = React4.useRef(null);
|
|
4863
4865
|
const titleId = React4.useId();
|
|
4864
|
-
const titleText = cleanChannelName(loadedConversation?.name) || buildChannelName(patientData);
|
|
4866
|
+
const titleText = cleanChannelName(loadedConversation?.name) || (patientData ? buildChannelName(patientData) : "Natoe Support");
|
|
4867
|
+
const isSupportChannel = !patientData;
|
|
4865
4868
|
const handleMouseDown = React4.useCallback(
|
|
4866
4869
|
(e) => {
|
|
4867
4870
|
if (!e.target.closest("[data-drag-handle]")) return;
|
|
@@ -4966,8 +4969,9 @@ function CollabPopup({
|
|
|
4966
4969
|
}
|
|
4967
4970
|
),
|
|
4968
4971
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: styles13.titleCenter, children: [
|
|
4969
|
-
/* @__PURE__ */ jsxRuntime.jsx("h2", { id: titleId, style: styles13.patientName, children: patientData
|
|
4972
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { id: titleId, style: styles13.patientName, children: patientData?.patientName || titleText }),
|
|
4970
4973
|
(() => {
|
|
4974
|
+
if (!patientData) return /* @__PURE__ */ jsxRuntime.jsx("div", { style: styles13.subRow, children: /* @__PURE__ */ jsxRuntime.jsx("span", { style: styles13.metaText, children: "Help and support" }) });
|
|
4971
4975
|
const parts = [];
|
|
4972
4976
|
if (patientData.patientAge) parts.push(String(patientData.patientAge));
|
|
4973
4977
|
if (patientData.patientSex) parts.push(String(patientData.patientSex));
|
|
@@ -4979,7 +4983,7 @@ function CollabPopup({
|
|
|
4979
4983
|
})()
|
|
4980
4984
|
] }),
|
|
4981
4985
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: styles13.titleActions, children: [
|
|
4982
|
-
loadedConversation && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
4986
|
+
loadedConversation && !isSupportChannel && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
4983
4987
|
"button",
|
|
4984
4988
|
{
|
|
4985
4989
|
type: "button",
|
|
@@ -5024,6 +5028,7 @@ function CollabPopup({
|
|
|
5024
5028
|
CollabPanel,
|
|
5025
5029
|
{
|
|
5026
5030
|
orderId,
|
|
5031
|
+
conversation: providedConversation,
|
|
5027
5032
|
patientData,
|
|
5028
5033
|
participantIds,
|
|
5029
5034
|
kind,
|
|
@@ -6684,6 +6689,143 @@ var styles17 = {
|
|
|
6684
6689
|
maxWidth: "320px"
|
|
6685
6690
|
}
|
|
6686
6691
|
};
|
|
6692
|
+
ensureGlobalStyles();
|
|
6693
|
+
function HelpPanel({
|
|
6694
|
+
conversation,
|
|
6695
|
+
showSeenBy = true,
|
|
6696
|
+
composerAccessory,
|
|
6697
|
+
className,
|
|
6698
|
+
style
|
|
6699
|
+
}) {
|
|
6700
|
+
const { config } = useCollab();
|
|
6701
|
+
const { handleDeepLink } = useDeepLinks();
|
|
6702
|
+
const messageListRef = React4.useRef(null);
|
|
6703
|
+
const {
|
|
6704
|
+
messages,
|
|
6705
|
+
typingUsers,
|
|
6706
|
+
isLoading,
|
|
6707
|
+
hasMore,
|
|
6708
|
+
error,
|
|
6709
|
+
replyTo,
|
|
6710
|
+
setReplyTo,
|
|
6711
|
+
sendMessage,
|
|
6712
|
+
retryMessage,
|
|
6713
|
+
sendAudioMessage,
|
|
6714
|
+
sendFileMessage,
|
|
6715
|
+
sendTyping,
|
|
6716
|
+
markAsRead,
|
|
6717
|
+
loadMoreMessages
|
|
6718
|
+
} = useConversation({ conversation, kind: "help_lab" });
|
|
6719
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
6720
|
+
"div",
|
|
6721
|
+
{
|
|
6722
|
+
className: [ROOT_CLASS, className].filter(Boolean).join(" "),
|
|
6723
|
+
style: { ...styles18.container, ...style },
|
|
6724
|
+
children: [
|
|
6725
|
+
/* @__PURE__ */ jsxRuntime.jsxs("header", { style: styles18.header, children: [
|
|
6726
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { style: styles18.avatar, "aria-hidden": "true", children: "N" }),
|
|
6727
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { style: styles18.headerText, children: [
|
|
6728
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { style: styles18.title, children: "Natoe Support" }),
|
|
6729
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { style: styles18.subtitle, children: "Questions about your account, billing or a case" })
|
|
6730
|
+
] })
|
|
6731
|
+
] }),
|
|
6732
|
+
error && /* @__PURE__ */ jsxRuntime.jsx("div", { style: styles18.error, role: "alert", children: error }),
|
|
6733
|
+
isLoading && messages.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: styles18.loading, children: /* @__PURE__ */ jsxRuntime.jsx(Spinner, {}) }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
6734
|
+
MessageList,
|
|
6735
|
+
{
|
|
6736
|
+
ref: messageListRef,
|
|
6737
|
+
messages,
|
|
6738
|
+
currentUserId: config.userId,
|
|
6739
|
+
showSeenBy,
|
|
6740
|
+
typingUsers,
|
|
6741
|
+
hasMore,
|
|
6742
|
+
isLoading,
|
|
6743
|
+
onLoadMore: loadMoreMessages,
|
|
6744
|
+
onDeepLinkClick: handleDeepLink,
|
|
6745
|
+
onMessageVisible: markAsRead,
|
|
6746
|
+
onReply: setReplyTo,
|
|
6747
|
+
onRetry: retryMessage,
|
|
6748
|
+
pinDisabled: true
|
|
6749
|
+
}
|
|
6750
|
+
),
|
|
6751
|
+
composerAccessory,
|
|
6752
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
6753
|
+
MessageInput,
|
|
6754
|
+
{
|
|
6755
|
+
onSendText: sendMessage,
|
|
6756
|
+
onSendAudio: sendAudioMessage,
|
|
6757
|
+
onSendFile: sendFileMessage,
|
|
6758
|
+
onTyping: sendTyping,
|
|
6759
|
+
replyTo,
|
|
6760
|
+
onCancelReply: () => setReplyTo(null),
|
|
6761
|
+
placeholder: "Ask Natoe support\u2026"
|
|
6762
|
+
}
|
|
6763
|
+
)
|
|
6764
|
+
]
|
|
6765
|
+
}
|
|
6766
|
+
);
|
|
6767
|
+
}
|
|
6768
|
+
var styles18 = {
|
|
6769
|
+
container: {
|
|
6770
|
+
display: "flex",
|
|
6771
|
+
flexDirection: "column",
|
|
6772
|
+
height: "100%",
|
|
6773
|
+
minHeight: 0,
|
|
6774
|
+
fontFamily: FONT_STACK,
|
|
6775
|
+
background: COLOR.white
|
|
6776
|
+
},
|
|
6777
|
+
header: {
|
|
6778
|
+
display: "flex",
|
|
6779
|
+
alignItems: "center",
|
|
6780
|
+
gap: SPACE.S3,
|
|
6781
|
+
padding: `${SPACE.S3} ${SPACE.S4}`,
|
|
6782
|
+
borderBottom: `1px solid ${COLOR.neutral200}`,
|
|
6783
|
+
flex: "0 0 auto"
|
|
6784
|
+
},
|
|
6785
|
+
avatar: {
|
|
6786
|
+
flex: "0 0 auto",
|
|
6787
|
+
width: 32,
|
|
6788
|
+
height: 32,
|
|
6789
|
+
borderRadius: RADIUS.full,
|
|
6790
|
+
background: COLOR.primary,
|
|
6791
|
+
color: COLOR.white,
|
|
6792
|
+
display: "flex",
|
|
6793
|
+
alignItems: "center",
|
|
6794
|
+
justifyContent: "center",
|
|
6795
|
+
fontSize: FONT_SIZE.md,
|
|
6796
|
+
fontWeight: FONT_WEIGHT.semibold
|
|
6797
|
+
},
|
|
6798
|
+
headerText: {
|
|
6799
|
+
display: "flex",
|
|
6800
|
+
flexDirection: "column",
|
|
6801
|
+
minWidth: 0
|
|
6802
|
+
},
|
|
6803
|
+
title: {
|
|
6804
|
+
fontSize: FONT_SIZE.md,
|
|
6805
|
+
fontWeight: FONT_WEIGHT.semibold,
|
|
6806
|
+
color: COLOR.neutral900
|
|
6807
|
+
},
|
|
6808
|
+
subtitle: {
|
|
6809
|
+
fontSize: FONT_SIZE.sm,
|
|
6810
|
+
color: COLOR.neutral500,
|
|
6811
|
+
overflow: "hidden",
|
|
6812
|
+
textOverflow: "ellipsis",
|
|
6813
|
+
whiteSpace: "nowrap"
|
|
6814
|
+
},
|
|
6815
|
+
error: {
|
|
6816
|
+
padding: `${SPACE.S2} ${SPACE.S4}`,
|
|
6817
|
+
fontSize: FONT_SIZE.sm,
|
|
6818
|
+
color: COLOR.danger,
|
|
6819
|
+
background: COLOR.dangerBg,
|
|
6820
|
+
flex: "0 0 auto"
|
|
6821
|
+
},
|
|
6822
|
+
loading: {
|
|
6823
|
+
flex: "1 1 auto",
|
|
6824
|
+
display: "flex",
|
|
6825
|
+
alignItems: "center",
|
|
6826
|
+
justifyContent: "center"
|
|
6827
|
+
}
|
|
6828
|
+
};
|
|
6687
6829
|
function useMessages({
|
|
6688
6830
|
conversationId,
|
|
6689
6831
|
initialLimit = MESSAGES_PAGE_SIZE
|
|
@@ -6901,6 +7043,7 @@ exports.ConversationList = ConversationList;
|
|
|
6901
7043
|
exports.ConversationListItem = ConversationListItem;
|
|
6902
7044
|
exports.DEEP_LINK_PREFIX = DEEP_LINK_PREFIX;
|
|
6903
7045
|
exports.EVENTS = EVENTS;
|
|
7046
|
+
exports.HelpPanel = HelpPanel;
|
|
6904
7047
|
exports.MAX_FILE_SIZE = MAX_FILE_SIZE;
|
|
6905
7048
|
exports.MAX_PINNED_MESSAGES = MAX_PINNED_MESSAGES;
|
|
6906
7049
|
exports.MESSAGES_PAGE_SIZE = MESSAGES_PAGE_SIZE;
|