@convokitapp/react-ui 0.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/LICENSE +21 -0
- package/PARITY.md +32 -0
- package/README.md +110 -0
- package/dist/index.cjs +1412 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.css +476 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.cts +316 -0
- package/dist/index.d.ts +316 -0
- package/dist/index.js +1372 -0
- package/dist/index.js.map +1 -0
- package/package.json +99 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/client.ts","../src/utils.ts","../src/components/avatar.tsx","../src/hooks/use-conversation.ts","../src/components/message-list.tsx","../src/components/conversation.tsx","../src/hooks/use-conversation-list.ts","../src/components/conversation-list.tsx","../src/theme.tsx"],"names":["useRef","useMemo","useCallback","useEffect","jsx","jsxs","useState","LoaderCircle","RefreshCw"],"mappings":"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","file":"index.js","sourcesContent":["import type { ConvoKitClient } from '@convokitapp/sdk'\nimport type { ConvoKitUiClient } from './types'\n\n/** Adapts a connected `@convokitapp/sdk` client to the replaceable UI boundary. */\nexport function createConvoKitUiClient(client: ConvoKitClient): ConvoKitUiClient {\n return {\n get currentUserId() {\n return client.currentUserId\n },\n getConversations: (options) => client.getConversations(options),\n getConversation: (conversationId) => client.getConversation(conversationId),\n getMessages: (options) => client.getMessages(options),\n sendMessage: (input) => client.sendMessage(input),\n markConversationRead: (conversationId) => client.markConversationRead(conversationId),\n sendTyping: (input) => client.sendTyping(input),\n onMessage: (conversationId, handler, onError) =>\n client.realtime.onMessage(conversationId, {\n onEvent: handler,\n ...(onError ? { onError } : {}),\n }),\n onReadReceipt: (conversationId, handler, onError) =>\n client.realtime.onReadReceipt(conversationId, {\n onEvent: handler,\n ...(onError ? { onError } : {}),\n }),\n onTyping: (conversationId, handler, onError) =>\n client.realtime.onTyping(conversationId, {\n onEvent: handler,\n ...(onError ? { onError } : {}),\n }),\n }\n}\n","import type { Conversation, Message } from '@convokitapp/sdk'\nimport { clsx, type ClassValue } from 'clsx'\nimport type { CSSProperties } from 'react'\nimport type { ConversationFilter, ConvoKitAppearanceProps, ConvoKitUiPart } from './types'\n\nexport function cx(...values: ClassValue[]): string {\n return clsx(values)\n}\n\nfunction participantIds(filter: ConversationFilter): ReadonlySet<string> {\n const values = filter.participantIds ?? []\n return values instanceof Set ? values : new Set(values)\n}\n\nexport function matchesConversation(\n conversation: Conversation,\n filter: ConversationFilter,\n): boolean {\n const query = filter.query?.trim().toLocaleLowerCase() ?? ''\n if (query) {\n const haystack = [\n conversation.id,\n conversation.displayTitle,\n conversation.title ?? '',\n conversation.description ?? '',\n ...conversation.participants.flatMap((participant) => [\n participant.id,\n participant.appUserId,\n participant.name,\n ]),\n ]\n .join(' ')\n .toLocaleLowerCase()\n if (!haystack.includes(query)) return false\n }\n\n const requestedParticipants = participantIds(filter)\n if (requestedParticipants.size > 0) {\n const available = new Set(\n conversation.participants.flatMap((participant) => [\n participant.id,\n participant.appUserId,\n ]),\n )\n const values = [...requestedParticipants]\n const matches = filter.requireAllParticipants\n ? values.every((id) => available.has(id))\n : values.some((id) => available.has(id))\n if (!matches) return false\n }\n\n return filter.predicate?.(conversation) ?? true\n}\n\nexport function applyConversationFilter(\n conversations: readonly Conversation[],\n filter: ConversationFilter,\n): Conversation[] {\n const result = conversations.filter((conversation) =>\n matchesConversation(conversation, filter),\n )\n if (filter.comparator) result.sort(filter.comparator)\n return result\n}\n\nexport function mergeConversations(\n current: readonly Conversation[],\n incoming: readonly Conversation[],\n): Conversation[] {\n const byId = new Map(current.map((conversation) => [conversation.id, conversation]))\n for (const conversation of incoming) byId.set(conversation.id, conversation)\n return [...byId.values()]\n}\n\nexport function mergeMessages(\n current: readonly Message[],\n incoming: readonly Message[],\n): Message[] {\n const byId = new Map(current.map((message) => [message.id, message]))\n for (const message of incoming) byId.set(message.id, message)\n return [...byId.values()].sort((left, right) => {\n const byTime = left.createdAt.getTime() - right.createdAt.getTime()\n return byTime === 0 ? left.id.localeCompare(right.id) : byTime\n })\n}\n\nexport function readerIdsFor(\n message: Message,\n readAtByUserId: ReadonlyMap<string, Date>,\n): ReadonlySet<string> {\n return new Set(\n [...readAtByUserId.entries()]\n .filter(\n ([userId, readAt]) =>\n userId !== message.senderId && readAt.getTime() >= message.createdAt.getTime(),\n )\n .map(([userId]) => userId),\n )\n}\n\nexport function partProps(\n part: ConvoKitUiPart,\n appearance: ConvoKitAppearanceProps,\n defaultClassName: string,\n): { className: string; style: CSSProperties | undefined } {\n return {\n className: cx(!appearance.unstyled && defaultClassName, appearance.classNames?.[part]),\n style: appearance.styles?.[part],\n }\n}\n\nexport function errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n\nexport function formatFileSize(size: number | undefined): string | null {\n if (size === undefined || !Number.isFinite(size) || size < 0) return null\n if (size < 1024) return `${Math.round(size)} B`\n if (size < 1024 * 1024) return `${(size / 1024).toFixed(size < 10 * 1024 ? 1 : 0)} KB`\n return `${(size / (1024 * 1024)).toFixed(size < 10 * 1024 * 1024 ? 1 : 0)} MB`\n}\n\nexport function initials(value: string): string {\n const words = value.trim().split(/\\s+/).filter(Boolean)\n return (words.length > 1 ? `${words[0]?.[0] ?? ''}${words.at(-1)?.[0] ?? ''}` : value[0] ?? '?')\n .toLocaleUpperCase()\n}\n","import * as Avatar from '@radix-ui/react-avatar'\nimport type { HTMLAttributes } from 'react'\nimport { cx, initials } from '../utils'\n\nexport interface ConvoKitAvatarProps extends HTMLAttributes<HTMLSpanElement> {\n name: string\n src?: string | null\n}\n\n/** Accessible avatar built on Radix Avatar. */\nexport function ConvoKitAvatar({ name, src, className, ...props }: ConvoKitAvatarProps) {\n return (\n <Avatar.Root className={cx('ckui-avatar', className)} {...props}>\n {src ? <Avatar.Image className=\"ckui-avatar__image\" src={src} alt=\"\" /> : null}\n <Avatar.Fallback className=\"ckui-avatar__fallback\" delayMs={src ? 300 : 0}>\n {initials(name)}\n </Avatar.Fallback>\n </Avatar.Root>\n )\n}\n","import type { Message, MessageMedia, RealtimeSubscription } from '@convokitapp/sdk'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { ConversationState, ConvoKitUiClient } from '../types'\nimport { mergeMessages, readerIdsFor } from '../utils'\n\nexport interface UseConversationOptions {\n client: ConvoKitUiClient\n conversationId: string\n messagePageSize?: number\n markReadOnLoad?: boolean\n markReadOnReceive?: boolean\n typingTimeoutMs?: number\n autoLoad?: boolean\n}\n\nexport interface ConversationController extends ConversationState {\n loadInitial(): Promise<void>\n refresh(): Promise<void>\n loadOlderMessages(): Promise<void>\n sendMessage(input: { text?: string; media?: MessageMedia[] }): Promise<Message | null>\n markRead(): Promise<void>\n updateTyping(isTyping: boolean): Promise<void>\n}\n\n/** Owns one conversation's history, realtime state, sending, and read positions. */\nexport function useConversation({\n client,\n conversationId,\n messagePageSize = 30,\n markReadOnLoad = true,\n markReadOnReceive = true,\n typingTimeoutMs = 3000,\n autoLoad = true,\n}: UseConversationOptions): ConversationController {\n if (!conversationId.trim()) throw new TypeError('conversationId is required')\n if (!Number.isInteger(messagePageSize) || messagePageSize <= 0) {\n throw new RangeError('messagePageSize must be a positive integer')\n }\n if (!Number.isFinite(typingTimeoutMs) || typingTimeoutMs < 0) {\n throw new RangeError('typingTimeoutMs must be non-negative')\n }\n\n const [conversation, setConversation] = useState<ConversationState['conversation']>(null)\n const [messages, setMessages] = useState<Message[]>([])\n const [typingUserIds, setTypingUserIds] = useState<ReadonlySet<string>>(new Set())\n const [readAtByUserId, setReadAtByUserId] = useState<ReadonlyMap<string, Date>>(new Map())\n const [isInitialLoading, setInitialLoading] = useState(false)\n const [isLoadingOlder, setLoadingOlder] = useState(false)\n const [isSending, setSending] = useState(false)\n const [hasOlderMessages, setHasOlderMessages] = useState(true)\n const [hasLoaded, setHasLoaded] = useState(false)\n const [error, setError] = useState<unknown>(null)\n\n const messagesRef = useRef(messages)\n const generationRef = useRef(0)\n const mountedRef = useRef(true)\n const initialLoadingRef = useRef(false)\n const loadingOlderRef = useRef(false)\n const sendingRef = useRef(false)\n const hasOlderRef = useRef(true)\n const sentTypingRef = useRef(false)\n const typingTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const subscriptionsRef = useRef<RealtimeSubscription[]>([])\n\n const storeMessages = useCallback((next: Message[]) => {\n messagesRef.current = next\n setMessages(next)\n }, [])\n\n const markRead = useCallback(async () => {\n try {\n await client.markConversationRead(conversationId)\n if (!mountedRef.current) return\n setReadAtByUserId((current) => {\n const next = new Map(current)\n next.set(client.currentUserId, new Date())\n return next\n })\n } catch (cause) {\n if (mountedRef.current) setError(cause)\n }\n }, [client, conversationId])\n\n const unsubscribe = useCallback(async () => {\n const active = subscriptionsRef.current\n subscriptionsRef.current = []\n await Promise.all(active.map((subscription) => subscription.unsubscribe()))\n }, [])\n\n const subscribe = useCallback(\n (generation: number) => {\n const report = (cause: Error) => {\n if (mountedRef.current && generation === generationRef.current) setError(cause)\n }\n subscriptionsRef.current = [\n client.onMessage(\n conversationId,\n (message) => {\n if (!mountedRef.current || generation !== generationRef.current) return\n storeMessages(mergeMessages(messagesRef.current, [message]))\n if (markReadOnReceive && message.senderId !== client.currentUserId) {\n void markRead()\n }\n },\n report,\n ),\n client.onReadReceipt(\n conversationId,\n ({ userId, readAt }) => {\n if (!mountedRef.current || generation !== generationRef.current) return\n setReadAtByUserId((current) => new Map(current).set(userId, readAt))\n },\n report,\n ),\n client.onTyping(\n conversationId,\n ({ userId, isTyping }) => {\n if (\n !mountedRef.current ||\n generation !== generationRef.current ||\n userId === client.currentUserId\n ) {\n return\n }\n setTypingUserIds((current) => {\n const next = new Set(current)\n if (isTyping) next.add(userId)\n else next.delete(userId)\n return next\n })\n },\n report,\n ),\n ]\n },\n [client, conversationId, markRead, markReadOnReceive, storeMessages],\n )\n\n const loadInitial = useCallback(async () => {\n const generation = ++generationRef.current\n await unsubscribe()\n storeMessages([])\n setTypingUserIds(new Set())\n setReadAtByUserId(new Map())\n hasOlderRef.current = true\n setHasOlderMessages(true)\n setError(null)\n initialLoadingRef.current = true\n setInitialLoading(true)\n subscribe(generation)\n try {\n const [nextConversation, page] = await Promise.all([\n client.getConversation(conversationId),\n client.getMessages({\n conversationId,\n limit: messagePageSize,\n offset: 0,\n }),\n ])\n if (!mountedRef.current || generation !== generationRef.current) return\n setConversation(nextConversation)\n setReadAtByUserId(\n new Map(\n nextConversation.participants.flatMap((participant) =>\n participant.lastReadAt ? [[participant.appUserId, participant.lastReadAt]] : [],\n ),\n ),\n )\n storeMessages(mergeMessages([], page))\n hasOlderRef.current = page.length === messagePageSize\n setHasOlderMessages(hasOlderRef.current)\n if (markReadOnLoad) await markRead()\n } catch (cause) {\n if (mountedRef.current && generation === generationRef.current) setError(cause)\n } finally {\n if (mountedRef.current && generation === generationRef.current) {\n initialLoadingRef.current = false\n setInitialLoading(false)\n setHasLoaded(true)\n }\n }\n }, [\n client,\n conversationId,\n markRead,\n markReadOnLoad,\n messagePageSize,\n storeMessages,\n subscribe,\n unsubscribe,\n ])\n\n const loadOlderMessages = useCallback(async () => {\n if (initialLoadingRef.current || loadingOlderRef.current || !hasOlderRef.current) return\n const generation = generationRef.current\n loadingOlderRef.current = true\n setLoadingOlder(true)\n setError(null)\n try {\n const page = await client.getMessages({\n conversationId,\n limit: messagePageSize,\n offset: messagesRef.current.length,\n })\n if (!mountedRef.current || generation !== generationRef.current) return\n storeMessages(mergeMessages(messagesRef.current, page))\n hasOlderRef.current = page.length === messagePageSize\n setHasOlderMessages(hasOlderRef.current)\n } catch (cause) {\n if (mountedRef.current && generation === generationRef.current) setError(cause)\n } finally {\n if (mountedRef.current && generation === generationRef.current) {\n loadingOlderRef.current = false\n setLoadingOlder(false)\n }\n }\n }, [client, conversationId, messagePageSize, storeMessages])\n\n const updateTyping = useCallback(\n async (isTyping: boolean) => {\n if (typingTimerRef.current) clearTimeout(typingTimerRef.current)\n if (isTyping) {\n typingTimerRef.current = setTimeout(() => void updateTyping(false), typingTimeoutMs)\n }\n if (sentTypingRef.current === isTyping) return\n sentTypingRef.current = isTyping\n try {\n await client.sendTyping({ conversationId, isTyping })\n } catch (cause) {\n if (mountedRef.current) setError(cause)\n }\n },\n [client, conversationId, typingTimeoutMs],\n )\n\n const sendMessage = useCallback(\n async ({ text, media }: { text?: string; media?: MessageMedia[] }) => {\n const normalizedText = text?.trim()\n if (!normalizedText && (!media || media.length === 0)) return null\n if (sendingRef.current) return null\n sendingRef.current = true\n setSending(true)\n setError(null)\n try {\n const message = await client.sendMessage({\n conversationId,\n ...(normalizedText ? { text: normalizedText } : {}),\n ...(media?.length ? { media } : {}),\n })\n if (mountedRef.current) storeMessages(mergeMessages(messagesRef.current, [message]))\n await updateTyping(false)\n return message\n } catch (cause) {\n if (mountedRef.current) setError(cause)\n return null\n } finally {\n sendingRef.current = false\n if (mountedRef.current) setSending(false)\n }\n },\n [client, conversationId, storeMessages, updateTyping],\n )\n\n useEffect(() => {\n mountedRef.current = true\n if (autoLoad) void loadInitial()\n return () => {\n mountedRef.current = false\n generationRef.current += 1\n if (typingTimerRef.current) clearTimeout(typingTimerRef.current)\n if (sentTypingRef.current) {\n void client.sendTyping({ conversationId, isTyping: false }).catch(() => undefined)\n }\n void unsubscribe()\n }\n }, [autoLoad, client, conversationId, loadInitial, unsubscribe])\n\n const currentUserId = client.currentUserId\n const stateReaderIdsFor = useCallback(\n (message: Message) => readerIdsFor(message, readAtByUserId),\n [readAtByUserId],\n )\n\n return useMemo(\n () => ({\n conversation,\n messages,\n typingUserIds,\n readAtByUserId,\n isInitialLoading,\n isLoadingOlder,\n isSending,\n hasOlderMessages,\n hasLoaded,\n error,\n currentUserId,\n readerIdsFor: stateReaderIdsFor,\n loadInitial,\n refresh: loadInitial,\n loadOlderMessages,\n sendMessage,\n markRead,\n updateTyping,\n }),\n [\n conversation,\n currentUserId,\n error,\n hasLoaded,\n hasOlderMessages,\n isInitialLoading,\n isLoadingOlder,\n isSending,\n loadInitial,\n loadOlderMessages,\n markRead,\n messages,\n readAtByUserId,\n sendMessage,\n stateReaderIdsFor,\n typingUserIds,\n updateTyping,\n ],\n )\n}\n","import type { Conversation, Message, MessageMedia } from '@convokitapp/sdk'\nimport {\n Check,\n CheckCheck,\n ContactRound,\n Download,\n FileText,\n ImageOff,\n LoaderCircle,\n MapPin,\n MessageCircle,\n} from 'lucide-react'\nimport type { ReactNode, UIEvent } from 'react'\nimport { useCallback, useEffect, useMemo, useRef } from 'react'\nimport type {\n BaseViewProps,\n ErrorRenderer,\n MediaRenderProps,\n MessageRenderProps,\n ReadReceiptRenderProps,\n ScrollOptions,\n StateRenderer,\n} from '../types'\nimport { cx, errorMessage, formatFileSize, partProps, readerIdsFor } from '../utils'\n\nexport interface MessageListViewProps extends BaseViewProps, ScrollOptions {\n conversation: Conversation\n messages: readonly Message[]\n currentUserId: string\n readAtByUserId?: ReadonlyMap<string, Date>\n readersResolver?: (message: Message) => ReadonlySet<string>\n onLoadOlder?: () => void | Promise<void>\n hasOlderMessages?: boolean\n isLoadingOlder?: boolean\n error?: unknown\n renderMessage?: (props: MessageRenderProps) => ReactNode\n renderMedia?: (props: MediaRenderProps) => ReactNode\n renderReadReceipt?: (props: ReadReceiptRenderProps) => ReactNode\n onAttachmentClick?: (media: MessageMedia, message: Message) => void\n renderEmpty?: StateRenderer\n renderLoadingOlder?: StateRenderer\n renderError?: ErrorRenderer\n reverse?: boolean\n stickToBottom?: boolean\n formatTime?: (date: Date) => string\n imageLoading?: 'eager' | 'lazy'\n}\n\n/** Controlled message history with read receipts, structured media, and older-page loading. */\nexport function MessageListView({\n conversation,\n messages,\n currentUserId,\n readAtByUserId = new Map(),\n readersResolver,\n onLoadOlder,\n hasOlderMessages = false,\n isLoadingOlder = false,\n error = null,\n renderMessage,\n renderMedia,\n renderReadReceipt,\n onAttachmentClick,\n renderEmpty,\n renderLoadingOlder,\n renderError,\n scrollRef,\n paginationThreshold = 240,\n reverse = true,\n stickToBottom = true,\n formatTime = defaultFormatTime,\n imageLoading = 'lazy',\n className,\n style,\n classNames,\n styles,\n density = 'comfortable',\n unstyled = false,\n onScroll,\n ...rootProps\n}: MessageListViewProps) {\n const appearance = {\n density,\n unstyled,\n ...(classNames ? { classNames } : {}),\n ...(styles ? { styles } : {}),\n }\n const internalRef = useRef<HTMLDivElement>(null)\n const requestInFlight = useRef(false)\n const lastRequestedLength = useRef<number | null>(null)\n const previousMessageCount = useRef(0)\n const participants = useMemo(\n () =>\n new Map(\n conversation.participants.flatMap((participant) => [\n [participant.id, participant] as const,\n [participant.appUserId, participant] as const,\n ]),\n ),\n [conversation.participants],\n )\n\n const requestOlder = useCallback(async () => {\n if (\n requestInFlight.current ||\n lastRequestedLength.current === messages.length ||\n isLoadingOlder ||\n !hasOlderMessages ||\n !onLoadOlder\n ) {\n return\n }\n requestInFlight.current = true\n lastRequestedLength.current = messages.length\n try {\n await onLoadOlder()\n } catch {\n lastRequestedLength.current = null\n } finally {\n requestInFlight.current = false\n }\n }, [hasOlderMessages, isLoadingOlder, messages.length, onLoadOlder])\n\n useEffect(() => {\n if (messages.length !== previousMessageCount.current || !hasOlderMessages) {\n lastRequestedLength.current = null\n }\n const element = internalRef.current\n const appended = messages.length > previousMessageCount.current\n if (element && reverse && stickToBottom && appended) {\n const distanceFromBottom = element.scrollHeight - element.scrollTop - element.clientHeight\n if (previousMessageCount.current === 0 || distanceFromBottom < 320) {\n requestAnimationFrame(() => {\n element.scrollTop = element.scrollHeight\n })\n }\n }\n previousMessageCount.current = messages.length\n }, [hasOlderMessages, messages.length, reverse, stickToBottom])\n\n const handleScroll = (event: UIEvent<HTMLDivElement>) => {\n onScroll?.(event)\n const element = event.currentTarget\n const distanceFromOldest = reverse\n ? element.scrollTop\n : element.scrollHeight - element.scrollTop - element.clientHeight\n if (distanceFromOldest <= paginationThreshold) void requestOlder()\n }\n\n const messageNodes = messages.map((message, index) => {\n const isCurrentUser = message.senderId === currentUserId\n const sender = participants.get(message.senderId)\n const readerIds = readersResolver\n ? readersResolver(message)\n : readerIdsFor(message, readAtByUserId)\n const renderProps: MessageRenderProps = {\n message,\n chronologicalIndex: index,\n isCurrentUser,\n sender,\n readerIds,\n }\n return (\n <div key={message.id} role=\"listitem\">\n {renderMessage?.(renderProps) ?? (\n <DefaultMessage\n {...renderProps}\n {...(renderMedia ? { renderMedia } : {})}\n {...(renderReadReceipt ? { renderReadReceipt } : {})}\n {...(onAttachmentClick ? { onAttachmentClick } : {})}\n formatTime={formatTime}\n imageLoading={imageLoading}\n appearance={appearance}\n />\n )}\n </div>\n )\n })\n\n return (\n <div\n {...rootProps}\n ref={(node) => {\n internalRef.current = node\n if (scrollRef) scrollRef.current = node\n }}\n className={cx(!unstyled && 'ckui ckui-message-list', classNames?.messages, className)}\n style={{ ...styles?.messages, ...style }}\n data-density={density}\n onScroll={handleScroll}\n role=\"log\"\n aria-live=\"polite\"\n aria-label={`Messages in ${conversation.displayTitle}`}\n >\n {isLoadingOlder\n ? renderLoadingOlder?.() ?? (\n <div {...partProps('loading', appearance, 'ckui-inline-state')} role=\"status\">\n <LoaderCircle className=\"ckui-spin\" aria-hidden=\"true\" /> Loading older messages…\n </div>\n )\n : null}\n {error\n ? renderError?.({ error, ...(onLoadOlder ? { retry: () => void requestOlder() } : {}) }) ?? (\n <div {...partProps('error', appearance, 'ckui-inline-state ckui-state--error')} role=\"alert\">\n <span>{errorMessage(error)}</span>\n {onLoadOlder ? (\n <button type=\"button\" className=\"ckui-link-button\" onClick={() => void requestOlder()}>\n Retry\n </button>\n ) : null}\n </div>\n )\n : null}\n {messages.length === 0 && !isLoadingOlder\n ? renderEmpty?.() ?? (\n <div {...partProps('empty', appearance, 'ckui-state')}>\n <MessageCircle aria-hidden=\"true\" /> No messages yet\n </div>\n )\n : messageNodes}\n </div>\n )\n}\n\ninterface DefaultMessageProps extends MessageRenderProps {\n renderMedia?: (props: MediaRenderProps) => ReactNode\n renderReadReceipt?: (props: ReadReceiptRenderProps) => ReactNode\n onAttachmentClick?: (media: MessageMedia, message: Message) => void\n formatTime: (date: Date) => string\n imageLoading: 'eager' | 'lazy'\n appearance: Pick<BaseViewProps, 'classNames' | 'styles' | 'density' | 'unstyled'>\n}\n\nfunction DefaultMessage({\n message,\n isCurrentUser,\n sender,\n readerIds,\n renderMedia,\n renderReadReceipt,\n onAttachmentClick,\n formatTime,\n imageLoading,\n appearance,\n}: DefaultMessageProps) {\n const messagePart = isCurrentUser ? 'outgoingMessage' : 'incomingMessage'\n return (\n <article\n className={cx(\n !appearance.unstyled && 'ckui-message-row',\n isCurrentUser && !appearance.unstyled && 'ckui-message-row--outgoing',\n appearance.classNames?.message,\n appearance.classNames?.[messagePart],\n )}\n style={{ ...appearance.styles?.message, ...appearance.styles?.[messagePart] }}\n data-message-id={message.id}\n >\n <div className=\"ckui-message-bubble\">\n {!isCurrentUser ? (\n <strong className=\"ckui-message-sender\">{sender?.name || message.senderId}</strong>\n ) : null}\n {message.text ? <div className=\"ckui-message-text\">{message.text}</div> : null}\n {message.media.map((media, mediaIndex) => {\n const open = onAttachmentClick ? () => onAttachmentClick(media, message) : undefined\n return (\n <div key={media.id ?? `${media.type}-${mediaIndex}`} {...partProps('media', appearance, 'ckui-media')}>\n {renderMedia?.({ media, message, isCurrentUser, ...(open ? { onOpen: open } : {}) }) ?? (\n <DefaultMedia\n media={media}\n message={message}\n isCurrentUser={isCurrentUser}\n {...(open ? { onOpen: open } : {})}\n imageLoading={imageLoading}\n />\n )}\n </div>\n )\n })}\n <time className=\"ckui-message-time\" dateTime={message.createdAt.toISOString()}>\n {formatTime(message.createdAt)}\n {isCurrentUser ? (\n readerIds.size > 0 ? (\n <CheckCheck size={14} aria-label=\"Read\" />\n ) : (\n <Check size={14} aria-label=\"Delivered\" />\n )\n ) : null}\n </time>\n </div>\n {isCurrentUser ? (\n renderReadReceipt?.({ message, readerIds }) ?? (\n <div {...partProps('receipt', appearance, 'ckui-read-receipt')}>\n {readerIds.size > 0 ? `Read by ${readerIds.size}` : 'Delivered'}\n </div>\n )\n ) : null}\n </article>\n )\n}\n\ninterface DefaultMediaProps extends MediaRenderProps {\n imageLoading: 'eager' | 'lazy'\n}\n\nfunction DefaultMedia({ media, onOpen, imageLoading }: DefaultMediaProps) {\n const Wrapper = onOpen ? 'button' : 'div'\n if (media.type === 'image') {\n return (\n <Wrapper\n {...(onOpen ? { type: 'button' as const, onClick: onOpen } : {})}\n className=\"ckui-media-card ckui-media-card--image\"\n >\n {media.url ? (\n <img src={media.url} alt={media.name ?? 'Shared image'} loading={imageLoading} />\n ) : (\n <span className=\"ckui-media-placeholder\"><ImageOff aria-hidden=\"true\" /> Image unavailable</span>\n )}\n {media.name ? <span className=\"ckui-media-name\">{media.name}</span> : null}\n </Wrapper>\n )\n }\n if (media.type === 'file') {\n return (\n <Wrapper\n {...(onOpen ? { type: 'button' as const, onClick: onOpen } : {})}\n className=\"ckui-media-card ckui-media-card--file\"\n >\n <FileText aria-hidden=\"true\" />\n <span><strong>{media.name || 'Attachment'}</strong>{formatFileSize(media.size) ? <small>{formatFileSize(media.size)}</small> : null}</span>\n {onOpen ? <Download aria-hidden=\"true\" size={18} /> : null}\n </Wrapper>\n )\n }\n if (media.type === 'location') {\n const label = media.name || `${media.metadata.lat}, ${media.metadata.lng}`\n return (\n <Wrapper\n {...(onOpen ? { type: 'button' as const, onClick: onOpen } : {})}\n className=\"ckui-media-card ckui-media-card--detail\"\n >\n <MapPin aria-hidden=\"true\" /><span><strong>{label}</strong><small>Shared location</small></span>\n </Wrapper>\n )\n }\n if (media.type === 'contact') {\n return (\n <Wrapper\n {...(onOpen ? { type: 'button' as const, onClick: onOpen } : {})}\n className=\"ckui-media-card ckui-media-card--detail\"\n >\n <ContactRound aria-hidden=\"true\" />\n <span><strong>{media.name || 'Shared contact'}</strong><small>{media.metadata.email || media.metadata.phone || 'Contact details'}</small></span>\n </Wrapper>\n )\n }\n return <div className=\"ckui-media-card\">Unsupported attachment</div>\n}\n\nfunction defaultFormatTime(date: Date): string {\n return new Intl.DateTimeFormat(undefined, {\n hour: '2-digit',\n minute: '2-digit',\n }).format(date)\n}\n","import type { Conversation as ConversationModel, Message, MessageMedia } from '@convokitapp/sdk'\nimport { ArrowLeft, LoaderCircle, Paperclip, RefreshCw, Send } from 'lucide-react'\nimport type { FormEvent, ReactNode, TextareaHTMLAttributes } from 'react'\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport type { ConversationController, UseConversationOptions } from '../hooks/use-conversation'\nimport { useConversation } from '../hooks/use-conversation'\nimport type {\n BaseViewProps,\n ComposerRenderProps,\n ErrorRenderer,\n MediaRenderProps,\n MessageRenderProps,\n ReadReceiptRenderProps,\n StateRenderer,\n TypingRenderProps,\n} from '../types'\nimport { cx, errorMessage, partProps, readerIdsFor } from '../utils'\nimport { ConvoKitAvatar } from './avatar'\nimport { MessageListView, type MessageListViewProps } from './message-list'\n\nexport interface ConversationViewProps extends BaseViewProps {\n conversation: ConversationModel\n messages: readonly Message[]\n currentUserId: string\n onSendMessage: (text: string) => boolean | void | Promise<boolean | void>\n typingUserIds?: ReadonlySet<string>\n readAtByUserId?: ReadonlyMap<string, Date>\n readersResolver?: (message: Message) => ReadonlySet<string>\n onBack?: () => void\n onRefresh?: () => void | Promise<void>\n onLoadOlder?: () => void | Promise<void>\n onTypingChange?: (isTyping: boolean) => void | Promise<void>\n onAddAttachment?: () => void\n onAttachmentClick?: (media: MessageMedia, message: Message) => void\n isInitialLoading?: boolean\n isLoadingOlder?: boolean\n isSending?: boolean\n hasOlderMessages?: boolean\n error?: unknown\n messageError?: unknown\n renderHeader?: (props: {\n conversation: ConversationModel\n onBack?: () => void\n onRefresh?: () => void | Promise<void>\n }) => ReactNode\n renderMessage?: (props: MessageRenderProps) => ReactNode\n renderMedia?: (props: MediaRenderProps) => ReactNode\n renderReadReceipt?: (props: ReadReceiptRenderProps) => ReactNode\n renderComposer?: (props: ComposerRenderProps) => ReactNode\n renderTypingIndicator?: (props: TypingRenderProps) => ReactNode\n renderEmpty?: StateRenderer\n renderLoading?: StateRenderer\n renderError?: ErrorRenderer\n renderLoadingOlder?: StateRenderer\n renderMessageError?: ErrorRenderer\n displayNameForUser?: (userId: string) => string | null | undefined\n reverseMessages?: boolean\n stickToBottom?: boolean\n paginationThreshold?: number\n formatTime?: MessageListViewProps['formatTime']\n imageLoading?: MessageListViewProps['imageLoading']\n composerPlaceholder?: string\n composerAriaLabel?: string\n composerProps?: Omit<\n TextareaHTMLAttributes<HTMLTextAreaElement>,\n 'value' | 'defaultValue' | 'onChange' | 'disabled'\n >\n draft?: string\n defaultDraft?: string\n onDraftChange?: (value: string) => void\n}\n\n/** Controlled, complete selected-conversation surface. */\nexport function ConversationView({\n conversation,\n messages,\n currentUserId,\n onSendMessage,\n typingUserIds = new Set(),\n readAtByUserId = new Map(),\n readersResolver,\n onBack,\n onRefresh,\n onLoadOlder,\n onTypingChange,\n onAddAttachment,\n onAttachmentClick,\n isInitialLoading = false,\n isLoadingOlder = false,\n isSending = false,\n hasOlderMessages = false,\n error = null,\n messageError = null,\n renderHeader,\n renderMessage,\n renderMedia,\n renderReadReceipt,\n renderComposer,\n renderTypingIndicator,\n renderEmpty,\n renderLoading,\n renderError,\n renderLoadingOlder,\n renderMessageError,\n displayNameForUser,\n reverseMessages = true,\n stickToBottom = true,\n paginationThreshold,\n formatTime,\n imageLoading,\n composerPlaceholder = 'Write a message',\n composerAriaLabel = 'Message',\n composerProps,\n draft: controlledDraft,\n defaultDraft = '',\n onDraftChange,\n className,\n classNames,\n styles,\n density = 'comfortable',\n unstyled = false,\n ...rootProps\n}: ConversationViewProps) {\n const appearance = {\n density,\n unstyled,\n ...(classNames ? { classNames } : {}),\n ...(styles ? { styles } : {}),\n }\n const [internalDraft, setInternalDraft] = useState(defaultDraft)\n const [submitting, setSubmitting] = useState(false)\n const draft = controlledDraft ?? internalDraft\n const setDraft = useCallback(\n (value: string) => {\n if (controlledDraft === undefined) setInternalDraft(value)\n onDraftChange?.(value)\n void onTypingChange?.(value.trim().length > 0)\n },\n [controlledDraft, onDraftChange, onTypingChange],\n )\n\n const submit = useCallback(async () => {\n const text = draft.trim()\n if (!text || isSending || submitting) return\n setSubmitting(true)\n try {\n const shouldClear = await onSendMessage(text)\n if (shouldClear !== false) setDraft('')\n } finally {\n setSubmitting(false)\n }\n }, [draft, isSending, onSendMessage, setDraft, submitting])\n\n const nameForUser = useCallback(\n (userId: string) => {\n const custom = displayNameForUser?.(userId)?.trim()\n if (custom) return custom\n const participant = conversation.participants.find(\n (value) => value.id === userId || value.appUserId === userId,\n )\n return participant?.name.trim() || userId\n },\n [conversation.participants, displayNameForUser],\n )\n\n if (isInitialLoading && messages.length === 0) {\n return (\n <div\n {...rootProps}\n className={cx(!unstyled && 'ckui ckui-conversation', classNames?.root, className)}\n style={{ ...styles?.root, ...rootProps.style }}\n data-density={density}\n >\n {renderLoading?.() ?? (\n <div {...partProps('loading', appearance, 'ckui-state')} role=\"status\">\n <LoaderCircle className=\"ckui-spin\" aria-hidden=\"true\" /> Loading conversation…\n </div>\n )}\n </div>\n )\n }\n\n const header = renderHeader?.({\n conversation,\n ...(onBack ? { onBack } : {}),\n ...(onRefresh ? { onRefresh } : {}),\n }) ?? (\n <header {...partProps('header', appearance, 'ckui-conversation-header')}>\n {onBack ? (\n <button type=\"button\" aria-label=\"Back\" onClick={onBack} {...partProps('button', appearance, 'ckui-icon-button')}>\n <ArrowLeft aria-hidden=\"true\" size={20} />\n </button>\n ) : null}\n <ConvoKitAvatar name={conversation.displayTitle} src={conversation.imageUrl} />\n <div className=\"ckui-conversation-header__body\">\n <strong>{conversation.displayTitle}</strong>\n <span>{conversation.participants.length} participant{conversation.participants.length === 1 ? '' : 's'}</span>\n </div>\n {onRefresh ? (\n <button type=\"button\" aria-label=\"Refresh conversation\" onClick={() => void onRefresh()} {...partProps('button', appearance, 'ckui-icon-button')}>\n <RefreshCw aria-hidden=\"true\" size={18} />\n </button>\n ) : null}\n </header>\n )\n\n const typing = renderTypingIndicator?.({\n userIds: typingUserIds,\n displayNameForUser: nameForUser,\n }) ?? (\n <div {...partProps('typing', appearance, 'ckui-typing')} aria-live=\"polite\">\n {typingLabel(typingUserIds, nameForUser)}\n </div>\n )\n\n const composer = renderComposer?.({\n value: draft,\n setValue: setDraft,\n isSending: isSending || submitting,\n send: () => void submit(),\n ...(onAddAttachment ? { addAttachment: onAddAttachment } : {}),\n }) ?? (\n <form\n {...partProps('composer', appearance, 'ckui-composer')}\n onSubmit={(event: FormEvent) => {\n event.preventDefault()\n void submit()\n }}\n >\n {onAddAttachment ? (\n <button type=\"button\" aria-label=\"Add attachment\" onClick={onAddAttachment} {...partProps('button', appearance, 'ckui-icon-button')}>\n <Paperclip aria-hidden=\"true\" size={20} />\n </button>\n ) : null}\n <textarea\n rows={1}\n placeholder={composerPlaceholder}\n aria-label={composerAriaLabel}\n {...composerProps}\n {...partProps('input', appearance, 'ckui-composer__input')}\n className={cx(!unstyled && 'ckui-composer__input', classNames?.input, composerProps?.className)}\n style={{ ...styles?.input, ...composerProps?.style }}\n value={draft}\n disabled={isSending || submitting}\n onChange={(event) => setDraft(event.currentTarget.value)}\n onKeyDown={(event) => {\n composerProps?.onKeyDown?.(event)\n if (event.defaultPrevented) return\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault()\n void submit()\n }\n }}\n />\n <button\n type=\"submit\"\n aria-label=\"Send message\"\n disabled={!draft.trim() || isSending || submitting}\n {...partProps('button', appearance, 'ckui-send-button')}\n >\n {isSending || submitting ? <LoaderCircle className=\"ckui-spin\" aria-hidden=\"true\" size={18} /> : <Send aria-hidden=\"true\" size={18} />}\n </button>\n </form>\n )\n\n return (\n <section\n {...rootProps}\n className={cx(!unstyled && 'ckui ckui-conversation', classNames?.root, className)}\n style={{ ...styles?.root, ...rootProps.style }}\n data-density={density}\n aria-label={conversation.displayTitle}\n >\n {header}\n {error\n ? renderError?.({ error, ...(onRefresh ? { retry: () => void onRefresh() } : {}) }) ?? (\n <div {...partProps('error', appearance, 'ckui-conversation-error')} role=\"alert\">\n <span>{errorMessage(error)}</span>\n {onRefresh ? <button type=\"button\" className=\"ckui-link-button\" onClick={() => void onRefresh()}>Retry</button> : null}\n </div>\n )\n : null}\n <MessageListView\n conversation={conversation}\n messages={messages}\n currentUserId={currentUserId}\n readAtByUserId={readAtByUserId}\n {...(readersResolver ? { readersResolver } : {})}\n {...(onLoadOlder ? { onLoadOlder } : {})}\n hasOlderMessages={hasOlderMessages}\n isLoadingOlder={isLoadingOlder}\n error={messageError}\n {...(renderMessage ? { renderMessage } : {})}\n {...(renderMedia ? { renderMedia } : {})}\n {...(renderReadReceipt ? { renderReadReceipt } : {})}\n {...(onAttachmentClick ? { onAttachmentClick } : {})}\n {...(renderEmpty ? { renderEmpty } : {})}\n {...(renderLoadingOlder ? { renderLoadingOlder } : {})}\n {...(renderMessageError ? { renderError: renderMessageError } : {})}\n reverse={reverseMessages}\n stickToBottom={stickToBottom}\n {...(paginationThreshold === undefined ? {} : { paginationThreshold })}\n {...(formatTime ? { formatTime } : {})}\n {...(imageLoading ? { imageLoading } : {})}\n {...(classNames ? { classNames } : {})}\n {...(styles ? { styles } : {})}\n density={density}\n unstyled={unstyled}\n />\n {typing}\n {composer}\n </section>\n )\n}\n\nexport interface ConversationProps\n extends Omit<\n ConversationViewProps,\n | 'conversation'\n | 'messages'\n | 'currentUserId'\n | 'onSendMessage'\n | 'typingUserIds'\n | 'readAtByUserId'\n | 'onRefresh'\n | 'onLoadOlder'\n | 'onTypingChange'\n | 'isInitialLoading'\n | 'isLoadingOlder'\n | 'isSending'\n | 'hasOlderMessages'\n | 'error'\n >,\n UseConversationOptions {\n renderLoading?: StateRenderer\n onControllerChange?: (controller: ConversationController) => void\n}\n\n/** Plug-and-play SDK-backed UI for one conversation. */\nexport function Conversation({\n client,\n conversationId,\n messagePageSize,\n markReadOnLoad,\n markReadOnReceive,\n typingTimeoutMs,\n autoLoad,\n renderLoading,\n onControllerChange,\n ...viewProps\n}: ConversationProps) {\n const controller = useConversation({\n client,\n conversationId,\n ...(messagePageSize === undefined ? {} : { messagePageSize }),\n ...(markReadOnLoad === undefined ? {} : { markReadOnLoad }),\n ...(markReadOnReceive === undefined ? {} : { markReadOnReceive }),\n ...(typingTimeoutMs === undefined ? {} : { typingTimeoutMs }),\n ...(autoLoad === undefined ? {} : { autoLoad }),\n })\n\n useEffect(() => onControllerChange?.(controller), [controller, onControllerChange])\n\n if (!controller.conversation) {\n return (\n <div\n className={cx(\n !viewProps.unstyled && 'ckui ckui-conversation',\n viewProps.classNames?.root,\n viewProps.className,\n )}\n style={{ ...viewProps.styles?.root, ...viewProps.style }}\n data-density={viewProps.density ?? 'comfortable'}\n >\n {controller.error\n ? viewProps.renderError?.({ error: controller.error, retry: controller.refresh }) ?? (\n <div className=\"ckui-state ckui-state--error\" role=\"alert\">\n <span>{errorMessage(controller.error)}</span>\n <button\n type=\"button\"\n className=\"ckui-link-button\"\n onClick={() => void controller.refresh()}\n >\n Try again\n </button>\n </div>\n )\n : renderLoading?.() ?? (\n <div className=\"ckui-state\" role=\"status\">\n <LoaderCircle className=\"ckui-spin\" aria-hidden=\"true\" />\n Loading conversation…\n </div>\n )}\n </div>\n )\n }\n\n return (\n <ConversationView\n {...viewProps}\n conversation={controller.conversation}\n messages={controller.messages}\n currentUserId={controller.currentUserId}\n onSendMessage={async (text) => (await controller.sendMessage({ text })) !== null}\n typingUserIds={controller.typingUserIds}\n readAtByUserId={controller.readAtByUserId}\n onRefresh={controller.refresh}\n onLoadOlder={controller.loadOlderMessages}\n onTypingChange={controller.updateTyping}\n isInitialLoading={controller.isInitialLoading}\n isLoadingOlder={controller.isLoadingOlder}\n isSending={controller.isSending}\n hasOlderMessages={controller.hasOlderMessages}\n error={controller.error}\n />\n )\n}\n\nexport function defaultReadersResolver(\n readAtByUserId: ReadonlyMap<string, Date>,\n): (message: Message) => ReadonlySet<string> {\n return (message) => readerIdsFor(message, readAtByUserId)\n}\n\nfunction typingLabel(\n userIds: ReadonlySet<string>,\n displayNameForUser: (userId: string) => string,\n): string {\n const names = [...userIds].map(displayNameForUser)\n if (names.length === 0) return ''\n if (names.length === 1) return `${names[0]} is typing…`\n if (names.length === 2) return `${names[0]} and ${names[1]} are typing…`\n return `${names[0]} and ${names.length - 1} others are typing…`\n}\n","import type { Conversation } from '@convokitapp/sdk'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type {\n ConversationFilter,\n ConversationListState,\n ConversationPageLoader,\n ConvoKitUiClient,\n} from '../types'\nimport { applyConversationFilter, mergeConversations } from '../utils'\n\nexport interface UseConversationListOptions {\n client: ConvoKitUiClient\n pageLoader?: ConversationPageLoader\n initialFilter?: ConversationFilter\n pageSize?: number\n autoLoad?: boolean\n}\n\nexport interface ConversationListController extends ConversationListState {\n loadInitial(): Promise<void>\n refresh(): Promise<void>\n loadMore(): Promise<void>\n setFilter(filter: ConversationFilter): Promise<void>\n setQuery(query: string): Promise<void>\n}\n\nconst EMPTY_FILTER: ConversationFilter = {}\n\n/** Loads, de-duplicates, filters, and paginates conversations. */\nexport function useConversationList({\n client,\n pageLoader,\n initialFilter = EMPTY_FILTER,\n pageSize = 30,\n autoLoad = true,\n}: UseConversationListOptions): ConversationListController {\n if (!Number.isInteger(pageSize) || pageSize <= 0) {\n throw new RangeError('pageSize must be a positive integer')\n }\n\n const [source, setSource] = useState<Conversation[]>([])\n const [filter, setFilterState] = useState<ConversationFilter>(initialFilter)\n const [isInitialLoading, setInitialLoading] = useState(false)\n const [isLoadingMore, setLoadingMore] = useState(false)\n const [hasMore, setHasMore] = useState(true)\n const [hasLoaded, setHasLoaded] = useState(false)\n const [error, setError] = useState<unknown>(null)\n\n const sourceRef = useRef(source)\n const filterRef = useRef(filter)\n const offsetRef = useRef(0)\n const hasMoreRef = useRef(true)\n const initialLoadingRef = useRef(false)\n const loadingMoreRef = useRef(false)\n const generationRef = useRef(0)\n const mountedRef = useRef(true)\n\n useEffect(() => {\n sourceRef.current = source\n }, [source])\n useEffect(() => {\n filterRef.current = filter\n }, [filter])\n useEffect(\n () => () => {\n mountedRef.current = false\n generationRef.current += 1\n },\n [],\n )\n\n const loadUntilVisible = useCallback(\n async (generation: number, activeFilter: ConversationFilter) => {\n const visibleBefore = applyConversationFilter(sourceRef.current, activeFilter).length\n while (true) {\n const request = {\n limit: pageSize,\n offset: offsetRef.current,\n filter: activeFilter,\n }\n const page = pageLoader\n ? await pageLoader(request)\n : await client.getConversations({\n limit: pageSize,\n offset: request.offset,\n archived: activeFilter.archived ?? false,\n })\n if (!mountedRef.current || generation !== generationRef.current) return\n\n offsetRef.current += page.length\n hasMoreRef.current = page.length === pageSize\n setHasMore(hasMoreRef.current)\n const merged = mergeConversations(sourceRef.current, page)\n sourceRef.current = merged\n setSource(merged)\n\n if (\n !hasMoreRef.current ||\n applyConversationFilter(merged, activeFilter).length > visibleBefore\n ) {\n return\n }\n }\n },\n [client, pageLoader, pageSize],\n )\n\n const loadInitialFor = useCallback(\n async (activeFilter: ConversationFilter = filterRef.current) => {\n const generation = ++generationRef.current\n sourceRef.current = []\n offsetRef.current = 0\n hasMoreRef.current = true\n initialLoadingRef.current = true\n loadingMoreRef.current = false\n setSource([])\n setHasMore(true)\n setError(null)\n setInitialLoading(true)\n setLoadingMore(false)\n try {\n await loadUntilVisible(generation, activeFilter)\n } catch (cause) {\n if (mountedRef.current && generation === generationRef.current) setError(cause)\n } finally {\n if (mountedRef.current && generation === generationRef.current) {\n initialLoadingRef.current = false\n setInitialLoading(false)\n setHasLoaded(true)\n }\n }\n },\n [loadUntilVisible],\n )\n\n const loadMore = useCallback(async () => {\n if (\n initialLoadingRef.current ||\n loadingMoreRef.current ||\n !hasMoreRef.current\n ) {\n return\n }\n const generation = generationRef.current\n loadingMoreRef.current = true\n setLoadingMore(true)\n setError(null)\n try {\n await loadUntilVisible(generation, filterRef.current)\n } catch (cause) {\n if (mountedRef.current && generation === generationRef.current) setError(cause)\n } finally {\n if (mountedRef.current && generation === generationRef.current) {\n loadingMoreRef.current = false\n setLoadingMore(false)\n }\n }\n }, [loadUntilVisible])\n\n const setFilter = useCallback(\n async (nextFilter: ConversationFilter) => {\n const previousArchived = filterRef.current.archived ?? false\n filterRef.current = nextFilter\n setFilterState(nextFilter)\n setError(null)\n if ((nextFilter.archived ?? false) !== previousArchived || !hasLoaded) {\n await loadInitialFor(nextFilter)\n } else if (\n applyConversationFilter(sourceRef.current, nextFilter).length === 0 &&\n hasMoreRef.current\n ) {\n await loadMore()\n }\n },\n [hasLoaded, loadInitialFor, loadMore],\n )\n\n const setQuery = useCallback(\n (query: string) => setFilter({ ...filterRef.current, query }),\n [setFilter],\n )\n\n useEffect(() => {\n if (autoLoad) void loadInitialFor(filterRef.current)\n }, [autoLoad, loadInitialFor])\n\n const conversations = useMemo(\n () => applyConversationFilter(source, filter),\n [filter, source],\n )\n\n return {\n conversations,\n filter,\n isInitialLoading,\n isLoadingMore,\n hasMore,\n hasLoaded,\n error,\n loadInitial: loadInitialFor,\n refresh: loadInitialFor,\n loadMore,\n setFilter,\n setQuery,\n }\n}\n","import type { Conversation } from '@convokitapp/sdk'\nimport { ChevronRight, Inbox, LoaderCircle, RefreshCw } from 'lucide-react'\nimport type { ReactNode, UIEvent } from 'react'\nimport { useCallback, useEffect, useRef } from 'react'\nimport type { ConversationListController, UseConversationListOptions } from '../hooks/use-conversation-list'\nimport { useConversationList } from '../hooks/use-conversation-list'\nimport type {\n BaseViewProps,\n ConversationItemRenderProps,\n ErrorRenderer,\n ScrollOptions,\n StateRenderer,\n} from '../types'\nimport { cx, errorMessage, partProps } from '../utils'\nimport { ConvoKitAvatar } from './avatar'\n\nexport interface ConversationListViewProps extends BaseViewProps, ScrollOptions {\n conversations: readonly Conversation[]\n onConversationSelect: (conversation: Conversation) => void\n selectedConversationId?: string\n onRefresh?: () => void | Promise<void>\n onLoadMore?: () => void | Promise<void>\n isInitialLoading?: boolean\n isLoadingMore?: boolean\n hasMore?: boolean\n error?: unknown\n renderConversationItem?: (props: ConversationItemRenderProps) => ReactNode\n renderSeparator?: (index: number) => ReactNode\n renderEmpty?: StateRenderer\n renderInitialLoading?: StateRenderer\n renderError?: ErrorRenderer\n renderLoadMore?: StateRenderer\n ariaLabel?: string\n}\n\n/** Controlled conversation list. It can be used with any state-management layer. */\nexport function ConversationListView({\n conversations,\n onConversationSelect,\n selectedConversationId,\n onRefresh,\n onLoadMore,\n isInitialLoading = false,\n isLoadingMore = false,\n hasMore = false,\n error = null,\n renderConversationItem,\n renderSeparator,\n renderEmpty,\n renderInitialLoading,\n renderError,\n renderLoadMore,\n scrollRef,\n paginationThreshold = 240,\n ariaLabel = 'Conversations',\n className,\n style,\n classNames,\n styles,\n density = 'comfortable',\n unstyled = false,\n onScroll,\n ...rootProps\n}: ConversationListViewProps) {\n const appearance = {\n density,\n unstyled,\n ...(classNames ? { classNames } : {}),\n ...(styles ? { styles } : {}),\n }\n const internalRef = useRef<HTMLDivElement>(null)\n const requestInFlight = useRef(false)\n const lastRequestedLength = useRef<number | null>(null)\n\n const requestMore = useCallback(async () => {\n if (\n requestInFlight.current ||\n lastRequestedLength.current === conversations.length ||\n isInitialLoading ||\n isLoadingMore ||\n !hasMore ||\n !onLoadMore\n ) {\n return\n }\n requestInFlight.current = true\n lastRequestedLength.current = conversations.length\n try {\n await onLoadMore()\n } catch {\n lastRequestedLength.current = null\n } finally {\n requestInFlight.current = false\n }\n }, [conversations.length, hasMore, isInitialLoading, isLoadingMore, onLoadMore])\n\n const handleScroll = (event: UIEvent<HTMLDivElement>) => {\n onScroll?.(event)\n const element = event.currentTarget\n if (element.scrollHeight - element.scrollTop - element.clientHeight <= paginationThreshold) {\n void requestMore()\n }\n }\n\n let content: ReactNode\n if (isInitialLoading && conversations.length === 0) {\n content = renderInitialLoading?.() ?? (\n <div {...partProps('loading', appearance, 'ckui-state')} role=\"status\">\n <LoaderCircle className=\"ckui-spin\" aria-hidden=\"true\" /> Loading conversations…\n </div>\n )\n } else if (error && conversations.length === 0) {\n const retry = onRefresh ? () => void onRefresh() : undefined\n content = renderError?.({ error, ...(retry ? { retry } : {}) }) ?? (\n <div {...partProps('error', appearance, 'ckui-state ckui-state--error')} role=\"alert\">\n <span>{errorMessage(error)}</span>\n {retry ? (\n <button type=\"button\" onClick={retry} className=\"ckui-link-button\">\n Try again\n </button>\n ) : null}\n </div>\n )\n } else if (conversations.length === 0) {\n content = renderEmpty?.() ?? (\n <div {...partProps('empty', appearance, 'ckui-state')}>\n <Inbox aria-hidden=\"true\" /> No conversations yet\n </div>\n )\n } else {\n content = (\n <div role=\"list\" {...partProps('list', appearance, 'ckui-conversation-list__items')}>\n {conversations.map((conversation, index) => {\n const selected = selectedConversationId === conversation.id\n const select = () => onConversationSelect(conversation)\n return (\n <div key={conversation.id} role=\"listitem\">\n {renderConversationItem?.({ conversation, index, selected, onSelect: select }) ?? (\n <button\n type=\"button\"\n data-selected={selected || undefined}\n aria-current={selected ? 'true' : undefined}\n onClick={select}\n {...partProps('listItem', appearance, 'ckui-conversation-item')}\n >\n <ConvoKitAvatar\n name={conversation.displayTitle}\n src={conversation.imageUrl}\n {...partProps('avatar', appearance, '')}\n />\n <span className=\"ckui-conversation-item__body\">\n <strong>{conversation.displayTitle}</strong>\n <span>\n {conversation.participants.map((participant) => participant.name).join(', ') ||\n conversation.description ||\n 'No participants'}\n </span>\n </span>\n <ChevronRight aria-hidden=\"true\" size={18} />\n </button>\n )}\n {index < conversations.length - 1\n ? renderSeparator?.(index) ?? <div className=\"ckui-separator\" />\n : null}\n </div>\n )\n })}\n {error ? (\n renderError?.({ error, retry: requestMore }) ?? (\n <div {...partProps('error', appearance, 'ckui-inline-state ckui-state--error')} role=\"alert\">\n <span>{errorMessage(error)}</span>\n <button type=\"button\" onClick={() => void requestMore()} className=\"ckui-link-button\">\n Retry\n </button>\n </div>\n )\n ) : isLoadingMore ? (\n renderLoadMore?.() ?? (\n <div {...partProps('loading', appearance, 'ckui-inline-state')} role=\"status\">\n <LoaderCircle className=\"ckui-spin\" aria-hidden=\"true\" /> Loading more…\n </div>\n )\n ) : null}\n </div>\n )\n }\n\n return (\n <div\n {...rootProps}\n {...partProps('root', appearance, 'ckui ckui-conversation-list')}\n className={cx(!unstyled && 'ckui ckui-conversation-list', classNames?.root, className)}\n style={{ ...styles?.root, ...style }}\n data-density={density}\n >\n {onRefresh ? (\n <div className=\"ckui-conversation-list__toolbar\">\n <span>{ariaLabel}</span>\n <button\n type=\"button\"\n aria-label=\"Refresh conversations\"\n onClick={() => void onRefresh()}\n {...partProps('button', appearance, 'ckui-icon-button')}\n >\n <RefreshCw size={17} aria-hidden=\"true\" />\n </button>\n </div>\n ) : null}\n <div\n ref={(node) => {\n internalRef.current = node\n if (scrollRef) scrollRef.current = node\n }}\n className={cx(!unstyled && 'ckui-scroll-area', classNames?.list)}\n style={styles?.list}\n onScroll={handleScroll}\n aria-label={ariaLabel}\n >\n {content}\n </div>\n </div>\n )\n}\n\nexport interface ConversationListProps\n extends Omit<\n ConversationListViewProps,\n | 'conversations'\n | 'onRefresh'\n | 'onLoadMore'\n | 'isInitialLoading'\n | 'isLoadingMore'\n | 'hasMore'\n | 'error'\n >,\n UseConversationListOptions {\n onControllerChange?: (controller: ConversationListController) => void\n}\n\n/** Plug-and-play SDK-backed conversation list. */\nexport function ConversationList({\n client,\n pageLoader,\n initialFilter,\n pageSize,\n autoLoad,\n onControllerChange,\n ...viewProps\n}: ConversationListProps) {\n const controller = useConversationList({\n client,\n ...(pageLoader ? { pageLoader } : {}),\n ...(initialFilter ? { initialFilter } : {}),\n ...(pageSize === undefined ? {} : { pageSize }),\n ...(autoLoad === undefined ? {} : { autoLoad }),\n })\n useEffect(() => onControllerChange?.(controller), [controller, onControllerChange])\n return (\n <ConversationListView\n {...viewProps}\n conversations={controller.conversations}\n onRefresh={controller.refresh}\n onLoadMore={controller.loadMore}\n isInitialLoading={controller.isInitialLoading}\n isLoadingMore={controller.isLoadingMore}\n hasMore={controller.hasMore}\n error={controller.error}\n />\n )\n}\n","import type { CSSProperties, PropsWithChildren } from 'react'\nimport { createContext, useContext, useMemo } from 'react'\nimport { cx } from './utils'\n\nexport interface ConvoKitTheme {\n background: string\n surface: string\n primary: string\n text: string\n mutedText: string\n border: string\n error: string\n incomingBubble: string\n outgoingBubble: string\n outgoingText: string\n radius: string\n avatarSize: string\n fontFamily: string\n}\n\nexport const defaultConvoKitTheme: ConvoKitTheme = {\n background: '#f7f9f8',\n surface: '#ffffff',\n primary: '#148f78',\n text: '#17211f',\n mutedText: '#66736f',\n border: '#dde5e2',\n error: '#ba1a1a',\n incomingBubble: '#ffffff',\n outgoingBubble: '#148f78',\n outgoingText: '#ffffff',\n radius: '16px',\n avatarSize: '44px',\n fontFamily: 'Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n}\n\nconst ThemeContext = createContext<ConvoKitTheme>(defaultConvoKitTheme)\n\nexport interface ConvoKitThemeProviderProps extends PropsWithChildren {\n theme?: Partial<ConvoKitTheme>\n className?: string\n style?: CSSProperties\n}\n\n/** Supplies theme tokens as CSS variables. Nest providers to override a subtree. */\nexport function ConvoKitThemeProvider({\n children,\n theme,\n className,\n style,\n}: ConvoKitThemeProviderProps) {\n const parent = useContext(ThemeContext)\n const value = useMemo(() => ({ ...parent, ...theme }), [parent, theme])\n const variables = {\n '--ckui-background': value.background,\n '--ckui-surface': value.surface,\n '--ckui-primary': value.primary,\n '--ckui-text': value.text,\n '--ckui-muted': value.mutedText,\n '--ckui-border': value.border,\n '--ckui-error': value.error,\n '--ckui-incoming': value.incomingBubble,\n '--ckui-outgoing': value.outgoingBubble,\n '--ckui-outgoing-text': value.outgoingText,\n '--ckui-radius': value.radius,\n '--ckui-avatar-size': value.avatarSize,\n '--ckui-font': value.fontFamily,\n ...style,\n } as CSSProperties\n\n return (\n <ThemeContext.Provider value={value}>\n <div className={cx('ckui-theme', className)} style={variables}>\n {children}\n </div>\n </ThemeContext.Provider>\n )\n}\n\nexport function useConvoKitTheme(): ConvoKitTheme {\n return useContext(ThemeContext)\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@convokitapp/react-ui",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Accessible, SDK-backed React chat components for ConvoKit.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"convokit",
|
|
7
|
+
"chat",
|
|
8
|
+
"messaging",
|
|
9
|
+
"react",
|
|
10
|
+
"realtime",
|
|
11
|
+
"ui"
|
|
12
|
+
],
|
|
13
|
+
"homepage": "https://convokit.app/docs/react-ui",
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "git+https://github.com/ConvoKitApp/ConvoKit-React-UI-Examples.git"
|
|
17
|
+
},
|
|
18
|
+
"bugs": {
|
|
19
|
+
"url": "https://github.com/ConvoKitApp/ConvoKit-React-UI-Examples/issues"
|
|
20
|
+
},
|
|
21
|
+
"license": "MIT",
|
|
22
|
+
"author": "ConvoKit",
|
|
23
|
+
"type": "module",
|
|
24
|
+
"main": "./dist/index.cjs",
|
|
25
|
+
"module": "./dist/index.js",
|
|
26
|
+
"types": "./dist/index.d.ts",
|
|
27
|
+
"style": "./dist/index.css",
|
|
28
|
+
"exports": {
|
|
29
|
+
".": {
|
|
30
|
+
"import": {
|
|
31
|
+
"types": "./dist/index.d.ts",
|
|
32
|
+
"default": "./dist/index.js"
|
|
33
|
+
},
|
|
34
|
+
"require": {
|
|
35
|
+
"types": "./dist/index.d.cts",
|
|
36
|
+
"default": "./dist/index.cjs"
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"./styles.css": "./dist/index.css"
|
|
40
|
+
},
|
|
41
|
+
"files": [
|
|
42
|
+
"dist",
|
|
43
|
+
"README.md",
|
|
44
|
+
"PARITY.md",
|
|
45
|
+
"LICENSE"
|
|
46
|
+
],
|
|
47
|
+
"sideEffects": [
|
|
48
|
+
"**/*.css"
|
|
49
|
+
],
|
|
50
|
+
"engines": {
|
|
51
|
+
"node": ">=18.0.0"
|
|
52
|
+
},
|
|
53
|
+
"scripts": {
|
|
54
|
+
"build": "tsup",
|
|
55
|
+
"clean": "rimraf dist coverage",
|
|
56
|
+
"lint": "tsc --noEmit",
|
|
57
|
+
"test": "vitest run --coverage",
|
|
58
|
+
"test:unit": "vitest run",
|
|
59
|
+
"check:parity": "node scripts/check-parity.mjs",
|
|
60
|
+
"check:package": "publint && attw --pack --entrypoints . && npm pack --dry-run",
|
|
61
|
+
"validate": "npm run lint && npm run test && npm run build && npm run check:parity && npm run check:package",
|
|
62
|
+
"prepublishOnly": "npm run validate"
|
|
63
|
+
},
|
|
64
|
+
"publishConfig": {
|
|
65
|
+
"access": "public"
|
|
66
|
+
},
|
|
67
|
+
"dependencies": {
|
|
68
|
+
"@radix-ui/react-avatar": "^1.1.10",
|
|
69
|
+
"clsx": "^2.1.1",
|
|
70
|
+
"lucide-react": "^0.542.0"
|
|
71
|
+
},
|
|
72
|
+
"peerDependencies": {
|
|
73
|
+
"@convokitapp/sdk": ">=0.1.1 <1.0.0",
|
|
74
|
+
"react": ">=18.2.0 <20.0.0",
|
|
75
|
+
"react-dom": ">=18.2.0 <20.0.0"
|
|
76
|
+
},
|
|
77
|
+
"devDependencies": {
|
|
78
|
+
"@arethetypeswrong/cli": "^0.18.2",
|
|
79
|
+
"@convokitapp/sdk": "^0.1.1",
|
|
80
|
+
"@testing-library/jest-dom": "^6.8.0",
|
|
81
|
+
"@testing-library/react": "^16.3.0",
|
|
82
|
+
"@testing-library/user-event": "^14.6.1",
|
|
83
|
+
"@types/node": "^24.3.0",
|
|
84
|
+
"@types/react": "^19.1.12",
|
|
85
|
+
"@types/react-dom": "^19.1.9",
|
|
86
|
+
"@vitest/coverage-v8": "^3.2.4",
|
|
87
|
+
"jsdom": "^26.1.0",
|
|
88
|
+
"publint": "^0.3.12",
|
|
89
|
+
"react": "^19.1.1",
|
|
90
|
+
"react-dom": "^19.1.1",
|
|
91
|
+
"rimraf": "^6.0.1",
|
|
92
|
+
"tsup": "^8.5.0",
|
|
93
|
+
"typescript": "^5.9.2",
|
|
94
|
+
"vitest": "^3.2.4"
|
|
95
|
+
},
|
|
96
|
+
"overrides": {
|
|
97
|
+
"esbuild": "^0.28.2"
|
|
98
|
+
}
|
|
99
|
+
}
|