@jokkoo/sdk-react 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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/context/JokkooProvider.tsx","../src/hooks/useGlobalRealtimeListener.ts","../src/lib/realtime-cache-utils.ts","../src/hooks/query-keys.ts","../src/lib/message-cache.ts","../src/theme.ts","../src/hooks/useRealtimeConversations.ts","../src/hooks/useRealtimeStatus.ts","../src/components/ConversationScreen.tsx","../src/hooks/useClosedConversationPolicy.ts","../src/hooks/useConversations.ts","../src/hooks/useFileUpload.ts","../src/hooks/useMessages.ts","../src/hooks/useRealtimeMessages.ts","../src/hooks/useVoiceRecorder.ts","../src/icons/index.tsx","../src/lib/status-badge.ts","../src/components/StatusBadge.tsx","../src/components/ConversationHeader.tsx","../src/components/MessageInput.tsx","../src/components/PendingAttachmentList.tsx","../src/components/MessageList.tsx","../src/components/ActivityEvent.tsx","../src/components/MessageBubble.tsx","../src/components/Avatar.tsx","../src/components/MessageAttachments.tsx","../src/components/VoiceMessagePlayer.tsx","../src/components/VoiceWaveform.tsx","../src/components/NewMessageIndicator.tsx","../src/components/ResolvedBanner.tsx","../src/components/SatisfactionRating.tsx","../src/components/VoiceRecordingOverlay.tsx","../src/components/FloatingButton.tsx","../src/components/RequestListScreen.tsx","../src/components/RequestCard.tsx","../src/components/PanelHeader.tsx","../src/components/WidgetPanel.tsx","../src/components/JokkooWidget.tsx","../src/hooks/useSendMessage.ts","../src/hooks/useUnreadCount.ts"],"sourcesContent":["import \"./styles/index.css\"\n\nexport {\n JokkooProvider,\n useJokkooContext,\n NEW_CONVERSATION_ID,\n} from \"./context/JokkooProvider\"\nexport type { JokkooProviderProps, JokkooScreen } from \"./context/JokkooProvider\"\n\nexport { JokkooWidget } from \"./components/JokkooWidget\"\nexport type { JokkooWidgetProps } from \"./components/JokkooWidget\"\n\nexport { FloatingButton as JokkooButton, FloatingButton } from \"./components/FloatingButton\"\nexport type { FloatingButtonProps, FloatingButtonPosition } from \"./components/FloatingButton\"\n\nexport { WidgetPanel } from \"./components/WidgetPanel\"\nexport type { WidgetPanelProps } from \"./components/WidgetPanel\"\n\nexport { RequestListScreen } from \"./components/RequestListScreen\"\nexport { ConversationScreen } from \"./components/ConversationScreen\"\nexport type { ConversationScreenProps } from \"./components/ConversationScreen\"\n\nexport { defaultTheme, mergeTheme, themeToCssVars } from \"./theme\"\nexport type {\n JokkooTheme,\n JokkooThemeColors,\n JokkooThemeSpacing,\n JokkooThemeTypography,\n} from \"./theme\"\n\nexport {\n useConversations,\n useMessages,\n useRealtimeStatus,\n useSendMessage,\n useUnreadCount,\n useFileUpload,\n useVoiceRecorder,\n jokkooQueryKeys,\n} from \"./hooks\"\nexport type {\n UseConversationsOptions,\n UseConversationsResult,\n UseMessagesOptions,\n UseMessagesResult,\n MessagesPageParam,\n VoiceRecorderState,\n} from \"./hooks\"\n\nexport type {\n Conversation,\n Message,\n JokkooConfig,\n UserTokenProvider,\n ChatMessage,\n Translations,\n} from \"@jokkoo/sdk-web\"\n","import { QueryClient, QueryClientProvider } from \"@tanstack/react-query\"\nimport {\n Jokkoo,\n JokkooApiClient,\n NEW_CONVERSATION_ID,\n getTranslations,\n type JokkooLocale,\n type JokkooRealtimeClient,\n type Translations,\n type UserTokenProvider,\n} from \"@jokkoo/sdk-web\"\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\"\n\nimport { useGlobalRealtimeListener } from \"../hooks/useGlobalRealtimeListener\"\nimport { mergeTheme, themeToCssVars, type JokkooTheme } from \"../theme\"\n\nexport type JokkooScreen =\n | { name: \"requestList\" }\n | { name: \"conversation\"; conversationId: number }\n\nexport interface JokkooProviderProps {\n children: ReactNode\n theme?: Partial<JokkooTheme>\n /** Public channel identifier from Jokkoo dashboard */\n clientToken: string\n /** Callback that returns a fresh user_token JWT from the tenant backend */\n userTokenProvider: UserTokenProvider\n /** Jokkoo API base URL (defaults to production) */\n baseUrl?: string\n /** End-user locale (defaults to \"fr\") */\n locale?: JokkooLocale\n /** Enable debug logging */\n debug?: boolean\n /** Seconds before JWT expiry to proactively refresh (default: 60) */\n tokenRefreshBufferSeconds?: number\n /** Optional shared QueryClient instance */\n queryClient?: QueryClient\n}\n\ninterface JokkooContextValue {\n theme: JokkooTheme\n themeStyle: CSSProperties\n t: Translations\n locale?: JokkooLocale\n isChatOpen: boolean\n isExpanded: boolean\n currentScreen: JokkooScreen\n apiClient: JokkooApiClient\n realtimeClient: JokkooRealtimeClient\n openChat: () => void\n closeChat: () => void\n toggleExpanded: () => void\n navigateTo: (screen: JokkooScreen) => void\n goBack: () => void\n unreadCount: number\n markConversationRead: (conversationId: number) => void\n isConversationUnread: (conversationId: number) => boolean\n}\n\nconst initialScreen: JokkooScreen = { name: \"requestList\" }\n\nconst JokkooContext = createContext<JokkooContextValue | null>(null)\n\nfunction createDefaultQueryClient(): QueryClient {\n return new QueryClient({\n defaultOptions: {\n queries: {\n retry: 1,\n refetchOnWindowFocus: false,\n },\n },\n })\n}\n\nexport function JokkooProvider({\n children,\n theme,\n clientToken,\n userTokenProvider,\n baseUrl,\n locale,\n debug,\n tokenRefreshBufferSeconds,\n queryClient: externalQueryClient,\n}: JokkooProviderProps) {\n const [isChatOpen, setIsChatOpen] = useState(false)\n const [isExpanded, setIsExpanded] = useState(false)\n const [currentScreen, setCurrentScreen] = useState<JokkooScreen>(initialScreen)\n const resolvedTheme = useMemo(() => mergeTheme(theme), [theme])\n const themeStyle = useMemo(\n () => themeToCssVars(resolvedTheme) as CSSProperties,\n [resolvedTheme]\n )\n const tokenProviderRef = useRef(userTokenProvider)\n tokenProviderRef.current = userTokenProvider\n\n const internalQueryClientRef = useRef<QueryClient | null>(null)\n if (!externalQueryClient && !internalQueryClientRef.current) {\n internalQueryClientRef.current = createDefaultQueryClient()\n }\n const queryClient = externalQueryClient ?? internalQueryClientRef.current!\n\n const translations = useMemo(() => getTranslations(locale), [locale])\n\n const apiClient = useMemo(() => {\n Jokkoo.init({\n clientToken,\n baseUrl,\n locale,\n debug,\n tokenRefreshBufferSeconds,\n userTokenProvider: () => tokenProviderRef.current(),\n })\n\n void Jokkoo.getRealtimeClient().connect()\n\n return new JokkooApiClient(Jokkoo.getConfig(), Jokkoo.getTokenManager())\n }, [clientToken, baseUrl, locale, debug, tokenRefreshBufferSeconds])\n\n const realtimeClient = useMemo(() => Jokkoo.getRealtimeClient(), [apiClient])\n\n const { unreadCount, markConversationRead, isConversationUnread } = useGlobalRealtimeListener({\n apiClient,\n realtimeClient,\n queryClient,\n isChatOpen,\n currentScreen,\n })\n\n useEffect(() => {\n return () => {\n Jokkoo.destroy()\n }\n }, [])\n\n const resetNavigation = useCallback(() => {\n setCurrentScreen(initialScreen)\n setIsExpanded(false)\n }, [])\n\n const openChat = useCallback(() => {\n if (!Jokkoo.isInitialized()) {\n throw new Error(\n \"Jokkoo SDK is not initialized. Ensure <JokkooProvider> is mounted with valid config.\"\n )\n }\n resetNavigation()\n setIsChatOpen(true)\n }, [resetNavigation])\n\n const closeChat = useCallback(() => {\n setIsChatOpen(false)\n resetNavigation()\n }, [resetNavigation])\n\n const toggleExpanded = useCallback(() => {\n setIsExpanded((current) => !current)\n }, [])\n\n const navigateTo = useCallback((screen: JokkooScreen) => {\n setCurrentScreen(screen)\n }, [])\n\n const goBack = useCallback(() => {\n setCurrentScreen(initialScreen)\n }, [])\n\n const value = useMemo<JokkooContextValue>(\n () => ({\n theme: resolvedTheme,\n themeStyle,\n t: translations,\n locale,\n isChatOpen,\n isExpanded,\n currentScreen,\n apiClient,\n realtimeClient,\n openChat,\n closeChat,\n toggleExpanded,\n navigateTo,\n goBack,\n unreadCount,\n markConversationRead,\n isConversationUnread,\n }),\n [\n resolvedTheme,\n themeStyle,\n translations,\n locale,\n isChatOpen,\n isExpanded,\n currentScreen,\n apiClient,\n realtimeClient,\n openChat,\n closeChat,\n toggleExpanded,\n navigateTo,\n goBack,\n unreadCount,\n markConversationRead,\n isConversationUnread,\n ]\n )\n\n return (\n <QueryClientProvider client={queryClient}>\n <JokkooContext.Provider value={value}>\n <div className=\"jokkoo-widget\" style={themeStyle}>\n {children}\n </div>\n </JokkooContext.Provider>\n </QueryClientProvider>\n )\n}\n\nexport function useJokkooContext(): JokkooContextValue {\n const context = useContext(JokkooContext)\n if (!context) {\n throw new Error(\"Jokkoo UI components must be wrapped in <JokkooProvider>.\")\n }\n return context\n}\n\nexport { NEW_CONVERSATION_ID }\n","import { useCallback, useEffect, useRef, useState } from \"react\"\nimport type { QueryClient } from \"@tanstack/react-query\"\nimport {\n REALTIME_EVENTS,\n shouldCountMessageAsUnread,\n type JokkooApiClient,\n type JokkooRealtimeClient,\n type Message,\n type RealtimeConversationPayload,\n type RealtimeStatus,\n} from \"@jokkoo/sdk-web\"\n\nimport type { JokkooScreen } from \"../context/JokkooProvider\"\nimport {\n appendMessageToCache,\n mapRealtimeConversationPayload,\n normalizeRealtimeMessage,\n prependConversationToListCache,\n updateConversationPreviewFromMessage,\n upsertConversationInListCache,\n} from \"../lib/realtime-cache-utils\"\n\ntype ConversationCreatedPayload = {\n organizationId: string\n conversation: RealtimeConversationPayload\n}\n\ntype ConversationUpdatedPayload = {\n organizationId: string\n conversation: RealtimeConversationPayload\n change: string\n}\n\ntype MessageCreatedPayload = {\n organizationId: string\n message: Message\n}\n\nfunction isViewingConversation(\n isChatOpen: boolean,\n currentScreen: JokkooScreen,\n conversationId: number\n): boolean {\n return (\n isChatOpen &&\n currentScreen.name === \"conversation\" &&\n currentScreen.conversationId === conversationId\n )\n}\n\nexport function useGlobalRealtimeListener(options: {\n apiClient: JokkooApiClient\n realtimeClient: JokkooRealtimeClient\n queryClient: QueryClient\n isChatOpen: boolean\n currentScreen: JokkooScreen\n}): {\n unreadCount: number\n markConversationRead: (conversationId: number) => void\n isConversationUnread: (conversationId: number) => boolean\n} {\n const { apiClient, realtimeClient, queryClient, isChatOpen, currentScreen } = options\n const [status, setStatus] = useState<RealtimeStatus>(realtimeClient.getStatus())\n const [unreadConversationIds, setUnreadConversationIds] = useState<Set<number>>(\n () => new Set()\n )\n const isChatOpenRef = useRef(isChatOpen)\n const currentScreenRef = useRef(currentScreen)\n\n isChatOpenRef.current = isChatOpen\n currentScreenRef.current = currentScreen\n\n const unreadCount = unreadConversationIds.size\n\n const isConversationUnread = useCallback(\n (conversationId: number) => unreadConversationIds.has(conversationId),\n [unreadConversationIds]\n )\n\n useEffect(() => {\n return realtimeClient.onStatusChange(setStatus)\n }, [realtimeClient])\n\n const markConversationRead = useCallback(\n (conversationId: number) => {\n setUnreadConversationIds((current) => {\n if (!current.has(conversationId)) {\n return current\n }\n\n const next = new Set(current)\n next.delete(conversationId)\n return next\n })\n\n void apiClient.markAsRead(conversationId).catch(() => {\n // Best-effort; next app launch reconciles from GET /unread-count.\n })\n },\n [apiClient]\n )\n\n const addUnreadConversation = useCallback((conversationId: number) => {\n setUnreadConversationIds((current) => {\n if (current.has(conversationId)) {\n return current\n }\n\n const next = new Set(current)\n next.add(conversationId)\n return next\n })\n }, [])\n\n useEffect(() => {\n let cancelled = false\n\n void apiClient.getUnreadCount().then((response) => {\n if (cancelled) {\n return\n }\n\n setUnreadConversationIds(new Set(response.conversationIds))\n })\n\n return () => {\n cancelled = true\n }\n }, [apiClient])\n\n useEffect(() => {\n if (status !== \"connected\") {\n return\n }\n\n const socket = realtimeClient.getSocket()\n if (!socket) {\n return\n }\n\n const handleConversationCreated = (payload: ConversationCreatedPayload): void => {\n prependConversationToListCache(\n queryClient,\n mapRealtimeConversationPayload(payload.conversation)\n )\n }\n\n const handleConversationUpdated = (payload: ConversationUpdatedPayload): void => {\n const conversation = mapRealtimeConversationPayload(payload.conversation)\n\n upsertConversationInListCache(queryClient, conversation)\n\n if (conversation.status === \"closed\") {\n markConversationRead(conversation.id)\n }\n }\n\n const handleMessageCreated = (payload: MessageCreatedPayload): void => {\n if (!payload?.message) {\n return\n }\n\n const message = normalizeRealtimeMessage(payload.message)\n\n appendMessageToCache(queryClient, message)\n updateConversationPreviewFromMessage(queryClient, message)\n\n if (message.senderType === \"end_user\") {\n markConversationRead(message.conversationId)\n return\n }\n\n if (\n isViewingConversation(\n isChatOpenRef.current,\n currentScreenRef.current,\n message.conversationId\n )\n ) {\n markConversationRead(message.conversationId)\n return\n }\n\n if (shouldCountMessageAsUnread(message)) {\n addUnreadConversation(message.conversationId)\n }\n }\n\n socket.on(REALTIME_EVENTS.messageCreated, handleMessageCreated)\n socket.on(REALTIME_EVENTS.conversationCreated, handleConversationCreated)\n socket.on(REALTIME_EVENTS.conversationUpdated, handleConversationUpdated)\n\n return () => {\n socket.off(REALTIME_EVENTS.messageCreated, handleMessageCreated)\n socket.off(REALTIME_EVENTS.conversationCreated, handleConversationCreated)\n socket.off(REALTIME_EVENTS.conversationUpdated, handleConversationUpdated)\n }\n }, [addUnreadConversation, markConversationRead, queryClient, realtimeClient, status])\n\n return { unreadCount, markConversationRead, isConversationUnread }\n}\n","import type { InfiniteData, QueryClient } from \"@tanstack/react-query\"\nimport type {\n Conversation,\n ConversationStatus,\n Message,\n PaginatedResponse,\n} from \"@jokkoo/sdk-web\"\nimport {\n mapRealtimeConversationPayload,\n normalizeRealtimeMessage,\n} from \"@jokkoo/sdk-web\"\n\nimport { jokkooQueryKeys } from \"../hooks/query-keys\"\nimport { prependMessageToMessagesCache } from \"./message-cache\"\n\nexport { mapRealtimeConversationPayload, normalizeRealtimeMessage }\n\nfunction sortConversationsByUpdatedAt(conversations: Conversation[]): Conversation[] {\n return [...conversations].sort(\n (a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime()\n )\n}\n\nexport function prependConversationToListCache(\n queryClient: QueryClient,\n conversation: Conversation\n): void {\n queryClient.setQueryData<InfiniteData<PaginatedResponse<Conversation>>>(\n jokkooQueryKeys.conversations,\n (current) => {\n if (!current || current.pages.length === 0) {\n return {\n pages: [\n {\n data: [conversation],\n total: 1,\n limit: 20,\n offset: 0,\n },\n ],\n pageParams: [0],\n }\n }\n\n const firstPage = current.pages[0]\n if (!firstPage) {\n return current\n }\n\n const withoutDuplicate = firstPage.data.filter((item) => item.id !== conversation.id)\n const nextData = sortConversationsByUpdatedAt([conversation, ...withoutDuplicate])\n\n return {\n ...current,\n pages: [\n {\n ...firstPage,\n data: nextData,\n total:\n withoutDuplicate.length === firstPage.data.length\n ? firstPage.total + 1\n : firstPage.total,\n },\n ...current.pages.slice(1),\n ],\n }\n }\n )\n}\n\nexport function upsertConversationInListCache(\n queryClient: QueryClient,\n conversation: Conversation\n): void {\n queryClient.setQueryData<InfiniteData<PaginatedResponse<Conversation>>>(\n jokkooQueryKeys.conversations,\n (current) => {\n if (!current || current.pages.length === 0) {\n return current\n }\n\n let found = false\n const pages = current.pages.map((page) => {\n const nextData = page.data.map((item) => {\n if (item.id !== conversation.id) {\n return item\n }\n\n found = true\n return {\n ...item,\n ...conversation,\n assignedAgentName: conversation.assignedAgentName ?? item.assignedAgentName ?? null,\n }\n })\n\n return {\n ...page,\n data: sortConversationsByUpdatedAt(nextData),\n }\n })\n\n if (!found) {\n return current\n }\n\n return {\n ...current,\n pages,\n }\n }\n )\n}\n\nexport function updateConversationStatusInListCache(\n queryClient: QueryClient,\n conversationId: number,\n status: ConversationStatus\n): void {\n queryClient.setQueryData<InfiniteData<PaginatedResponse<Conversation>>>(\n jokkooQueryKeys.conversations,\n (current) => {\n if (!current || current.pages.length === 0) {\n return current\n }\n\n let found = false\n const pages = current.pages.map((page) => {\n const nextData = page.data.map((item) => {\n if (item.id !== conversationId) {\n return item\n }\n\n found = true\n return {\n ...item,\n status,\n }\n })\n\n return {\n ...page,\n data: nextData,\n }\n })\n\n if (!found) {\n return current\n }\n\n return {\n ...current,\n pages,\n }\n }\n )\n}\n\nexport function updateConversationPreviewFromMessage(\n queryClient: QueryClient,\n message: Message\n): void {\n queryClient.setQueryData<InfiniteData<PaginatedResponse<Conversation>>>(\n jokkooQueryKeys.conversations,\n (current) => {\n if (!current || current.pages.length === 0) {\n return current\n }\n\n let found = false\n const pages = current.pages.map((page) => {\n const nextData = page.data.map((item) => {\n if (item.id !== message.conversationId) {\n return item\n }\n\n found = true\n return {\n ...item,\n lastMessageText: message.content,\n lastMessageSenderType: message.senderType,\n updatedAt: message.createdAt,\n }\n })\n\n return {\n ...page,\n data: sortConversationsByUpdatedAt(nextData),\n }\n })\n\n if (!found) {\n return current\n }\n\n return {\n ...current,\n pages,\n }\n }\n )\n}\n\nexport function appendMessageToCache(queryClient: QueryClient, message: Message): void {\n queryClient.setQueryData<InfiniteData<PaginatedResponse<Message>>>(\n jokkooQueryKeys.messages(message.conversationId),\n (current) => prependMessageToMessagesCache(current, message)\n )\n}\n","export const jokkooQueryKeys = {\n conversations: [\"jokkoo\", \"conversations\"] as const,\n conversationPolicies: [\"jokkoo\", \"conversation-policies\"] as const,\n messages: (conversationId: number) =>\n [\"jokkoo\", \"conversations\", conversationId, \"messages\"] as const,\n}\n","import type { InfiniteData } from \"@tanstack/react-query\"\nimport type { Message, PaginatedResponse } from \"@jokkoo/sdk-web\"\n\nconst DEFAULT_PAGE_SIZE = 50\n\nexport function createMessagesCacheWithMessage(\n message: Message,\n pageSize: number = DEFAULT_PAGE_SIZE\n): InfiniteData<PaginatedResponse<Message>> {\n return {\n pages: [\n {\n data: [message],\n total: 1,\n limit: pageSize,\n offset: 0,\n },\n ],\n pageParams: [\"latest\"],\n }\n}\n\nexport function prependMessageToMessagesCache(\n data: InfiniteData<PaginatedResponse<Message>> | undefined,\n message: Message\n): InfiniteData<PaginatedResponse<Message>> {\n if (!data || data.pages.length === 0) {\n return createMessagesCacheWithMessage(message)\n }\n\n const alreadyExists = data.pages.some((page) =>\n page.data.some((item) => item.id === message.id)\n )\n if (alreadyExists) {\n return data\n }\n\n const pages = [...data.pages]\n const firstPage = pages[0]\n if (!firstPage) {\n return createMessagesCacheWithMessage(message)\n }\n\n pages[0] = {\n ...firstPage,\n data: [message, ...firstPage.data],\n total: firstPage.total + 1,\n }\n\n return {\n ...data,\n pages,\n }\n}\n","export interface JokkooThemeColors {\n primary: string\n background: string\n surface: string\n text: string\n textMuted: string\n border: string\n onPrimary: string\n chatHeaderBackground: string\n chatHeaderText: string\n chatHeaderButtonBackground: string\n chatBackground: string\n chatSurface: string\n chatText: string\n chatTextMuted: string\n chatBorder: string\n inputBackground: string\n inputPlaceholder: string\n userBubbleBackground: string\n userBubbleText: string\n agentBubbleBackground: string\n agentBubbleText: string\n statusActiveBackground: string\n statusActiveText: string\n statusEndedBackground: string\n statusEndedText: string\n discussionEndedBackground: string\n resolvedBackground: string\n resolvedText: string\n unreadIndicator: string\n}\n\nexport interface JokkooThemeSpacing {\n xs: number\n sm: number\n md: number\n lg: number\n xl: number\n}\n\nexport interface JokkooThemeTypography {\n headingSize: number\n headingWeight: \"400\" | \"500\" | \"600\" | \"700\"\n headingLetterSpacing: number\n titleSize: number\n titleWeight: \"400\" | \"500\" | \"600\" | \"700\"\n smallSize: number\n smallWeight: \"400\" | \"500\" | \"600\" | \"700\"\n bodySize: number\n bodyWeight: \"400\" | \"500\" | \"600\" | \"700\"\n captionSize: number\n captionWeight: \"400\" | \"500\" | \"600\" | \"700\"\n messageSize: number\n timestampSize: number\n}\n\nexport interface JokkooTheme {\n colors: JokkooThemeColors\n spacing: JokkooThemeSpacing\n borderRadius: number\n cardBorderRadius: number\n badgeBorderRadius: number\n bubbleBorderRadius: number\n panelBorderRadius: number\n typography: JokkooThemeTypography\n}\n\nexport const defaultTheme: JokkooTheme = {\n colors: {\n primary: \"#1C1C1C\",\n background: \"#FFFFFF\",\n surface: \"#F5F6F8\",\n text: \"#1C1C1C\",\n textMuted: \"#8A8A9A\",\n border: \"#E4E4E8\",\n onPrimary: \"#FFFFFF\",\n chatHeaderBackground: \"#1C1C1C\",\n chatHeaderText: \"#FFFFFF\",\n chatHeaderButtonBackground: \"#404040\",\n chatBackground: \"#FFFFFF\",\n chatSurface: \"#FFFFFF\",\n chatText: \"#1C1C1C\",\n chatTextMuted: \"#8A8A9A\",\n chatBorder: \"#E4E4E8\",\n inputBackground: \"#F5F6F8\",\n inputPlaceholder: \"rgba(28, 28, 28, 0.5)\",\n userBubbleBackground: \"#1C1C1C\",\n userBubbleText: \"#FFFFFF\",\n agentBubbleBackground: \"#F5F6F8\",\n agentBubbleText: \"#1C1C1C\",\n statusActiveBackground: \"#DBEAFE\",\n statusActiveText: \"#3B82F6\",\n statusEndedBackground: \"#D1FAE5\",\n statusEndedText: \"#10B981\",\n discussionEndedBackground: \"#ECFDF5\",\n resolvedBackground: \"rgba(76, 175, 80, 0.08)\",\n resolvedText: \"#4CAF50\",\n unreadIndicator: \"#EF4444\",\n },\n spacing: {\n xs: 4,\n sm: 8,\n md: 16,\n lg: 24,\n xl: 32,\n },\n borderRadius: 12,\n cardBorderRadius: 16,\n badgeBorderRadius: 8,\n bubbleBorderRadius: 20,\n panelBorderRadius: 20,\n typography: {\n headingSize: 24,\n headingWeight: \"600\",\n headingLetterSpacing: -1,\n titleSize: 20,\n titleWeight: \"600\",\n smallSize: 14,\n smallWeight: \"600\",\n bodySize: 14,\n bodyWeight: \"400\",\n captionSize: 12,\n captionWeight: \"400\",\n messageSize: 12,\n timestampSize: 10,\n },\n}\n\nexport function mergeTheme(partial?: Partial<JokkooTheme>): JokkooTheme {\n if (!partial) {\n return defaultTheme\n }\n\n return {\n colors: { ...defaultTheme.colors, ...partial.colors },\n spacing: { ...defaultTheme.spacing, ...partial.spacing },\n borderRadius: partial.borderRadius ?? defaultTheme.borderRadius,\n cardBorderRadius: partial.cardBorderRadius ?? defaultTheme.cardBorderRadius,\n badgeBorderRadius: partial.badgeBorderRadius ?? defaultTheme.badgeBorderRadius,\n bubbleBorderRadius: partial.bubbleBorderRadius ?? defaultTheme.bubbleBorderRadius,\n panelBorderRadius: partial.panelBorderRadius ?? defaultTheme.panelBorderRadius,\n typography: { ...defaultTheme.typography, ...partial.typography },\n }\n}\n\n/** Map theme colors to CSS custom properties for `.jokkoo-widget`. */\nexport function themeToCssVars(theme: JokkooTheme): Record<string, string> {\n return {\n \"--jk-color-primary\": theme.colors.primary,\n \"--jk-color-background\": theme.colors.background,\n \"--jk-color-surface\": theme.colors.surface,\n \"--jk-color-border\": theme.colors.border,\n \"--jk-color-text\": theme.colors.text,\n \"--jk-color-text-secondary\": theme.colors.textMuted,\n \"--jk-color-on-primary\": theme.colors.onPrimary,\n \"--jk-color-user-bubble\": theme.colors.userBubbleBackground,\n \"--jk-color-agent-bubble\": theme.colors.agentBubbleBackground,\n \"--jk-color-status-blue-bg\": theme.colors.statusActiveBackground,\n \"--jk-color-status-blue-text\": theme.colors.statusActiveText,\n \"--jk-color-status-green-bg\": theme.colors.statusEndedBackground,\n \"--jk-color-status-green-text\": theme.colors.statusEndedText,\n \"--jk-color-resolved-bg\": theme.colors.resolvedBackground,\n \"--jk-color-resolved-text\": theme.colors.resolvedText,\n \"--jk-color-header\": theme.colors.chatHeaderBackground,\n \"--jk-color-header-text\": theme.colors.chatHeaderText,\n \"--jk-color-unread\": theme.colors.unreadIndicator,\n \"--jk-radius-panel\": `${theme.panelBorderRadius}px`,\n \"--jk-radius-bubble\": `${theme.bubbleBorderRadius}px`,\n \"--jk-radius-card\": `${theme.cardBorderRadius}px`,\n \"--jk-radius-badge\": `${theme.badgeBorderRadius}px`,\n \"--jk-radius-input\": `${theme.bubbleBorderRadius}px`,\n }\n}\n","import { useQueryClient } from \"@tanstack/react-query\"\nimport {\n REALTIME_EVENTS,\n type Message,\n type RealtimeConversationPayload,\n} from \"@jokkoo/sdk-web\"\nimport { useEffect } from \"react\"\n\nimport { useJokkooContext } from \"../context/JokkooProvider\"\nimport {\n mapRealtimeConversationPayload,\n normalizeRealtimeMessage,\n prependConversationToListCache,\n updateConversationPreviewFromMessage,\n upsertConversationInListCache,\n} from \"../lib/realtime-cache-utils\"\nimport { useRealtimeStatus } from \"./useRealtimeStatus\"\n\ntype ConversationCreatedPayload = {\n organizationId: string\n conversation: RealtimeConversationPayload\n}\n\ntype ConversationUpdatedPayload = {\n organizationId: string\n conversation: RealtimeConversationPayload\n change: string\n}\n\ntype MessageCreatedPayload = {\n organizationId: string\n message: Message\n}\n\nexport function useRealtimeConversations(): void {\n const { realtimeClient } = useJokkooContext()\n const queryClient = useQueryClient()\n const status = useRealtimeStatus()\n\n useEffect(() => {\n if (status !== \"connected\") {\n return\n }\n\n const socket = realtimeClient.getSocket()\n if (!socket) {\n return\n }\n\n const handleConversationCreated = (payload: ConversationCreatedPayload): void => {\n prependConversationToListCache(\n queryClient,\n mapRealtimeConversationPayload(payload.conversation)\n )\n }\n\n const handleConversationUpdated = (payload: ConversationUpdatedPayload): void => {\n upsertConversationInListCache(\n queryClient,\n mapRealtimeConversationPayload(payload.conversation)\n )\n }\n\n const handleMessageCreated = (payload: MessageCreatedPayload): void => {\n const message = normalizeRealtimeMessage(payload.message)\n updateConversationPreviewFromMessage(queryClient, message)\n }\n\n socket.on(REALTIME_EVENTS.messageCreated, handleMessageCreated)\n socket.on(REALTIME_EVENTS.conversationCreated, handleConversationCreated)\n socket.on(REALTIME_EVENTS.conversationUpdated, handleConversationUpdated)\n\n return () => {\n socket.off(REALTIME_EVENTS.messageCreated, handleMessageCreated)\n socket.off(REALTIME_EVENTS.conversationCreated, handleConversationCreated)\n socket.off(REALTIME_EVENTS.conversationUpdated, handleConversationUpdated)\n }\n }, [queryClient, realtimeClient, status])\n}\n","import { useEffect, useState } from \"react\"\nimport type { RealtimeStatus } from \"@jokkoo/sdk-web\"\n\nimport { useJokkooContext } from \"../context/JokkooProvider\"\n\nexport function useRealtimeStatus(): RealtimeStatus {\n const { realtimeClient } = useJokkooContext()\n const [status, setStatus] = useState<RealtimeStatus>(realtimeClient.getStatus())\n\n useEffect(() => {\n return realtimeClient.onStatusChange(setStatus)\n }, [realtimeClient])\n\n return status\n}\n","import { useQueryClient, type InfiniteData } from \"@tanstack/react-query\"\nimport {\n JokkooApiError,\n MESSAGE_CONTENT_MAX_LENGTH,\n MESSAGE_CONTENT_MIN_LENGTH,\n NEW_CONVERSATION_ID,\n canReplyToClosedConversation,\n conversationNeedsRating,\n createWelcomeMessage,\n formatMessageTimestamp,\n getConversationDisplayName,\n getSatisfactionSurveyMessage,\n isSatisfactionRequestMessage,\n mapMessageToChatMessage,\n type ChatMessage,\n type Message,\n type PaginatedResponse,\n} from \"@jokkoo/sdk-web\"\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\"\n\nimport { useJokkooContext } from \"../context/JokkooProvider\"\nimport { jokkooQueryKeys } from \"../hooks/query-keys\"\nimport { useClosedConversationPolicy } from \"../hooks/useClosedConversationPolicy\"\nimport { useConversations } from \"../hooks/useConversations\"\nimport { useFileUpload } from \"../hooks/useFileUpload\"\nimport { useMessages } from \"../hooks/useMessages\"\nimport { useRealtimeMessages } from \"../hooks/useRealtimeMessages\"\nimport { useVoiceRecorder } from \"../hooks/useVoiceRecorder\"\nimport { createMessagesCacheWithMessage, prependMessageToMessagesCache } from \"../lib/message-cache\"\nimport { ConversationHeader } from \"./ConversationHeader\"\nimport { MessageInput } from \"./MessageInput\"\nimport { MessageList } from \"./MessageList\"\nimport { ResolvedBanner } from \"./ResolvedBanner\"\nimport { SatisfactionRating } from \"./SatisfactionRating\"\nimport { VoiceRecordingOverlay } from \"./VoiceRecordingOverlay\"\n\nexport interface ConversationScreenProps {\n conversationId: number\n}\n\nexport function ConversationScreen({ conversationId }: ConversationScreenProps) {\n const { t, locale, goBack, navigateTo, apiClient, markConversationRead } = useJokkooContext()\n const queryClient = useQueryClient()\n const [message, setMessage] = useState(\"\")\n const [isSending, setIsSending] = useState(false)\n const [optimisticMessages, setOptimisticMessages] = useState<ChatMessage[]>([])\n\n const {\n pendingAttachments,\n isUploading,\n confirmedFileIds,\n pickAttachments,\n removeAttachment,\n retryAttachment,\n clearAttachments,\n } = useFileUpload()\n\n const {\n state: voiceRecorderState,\n durationMs: voiceDurationMs,\n meteringLevels: voiceMeteringLevels,\n uploadProgress: voiceUploadProgress,\n isRecordingActive,\n startRecording,\n cancelRecording,\n stopAndUpload,\n reset: resetVoiceRecorder,\n } = useVoiceRecorder()\n\n const isNewSupport = conversationId === NEW_CONVERSATION_ID\n const {\n pendingNewMessages,\n notifyScrolledToBottom,\n notifyScrolledAwayFromBottom,\n } = useRealtimeMessages(conversationId)\n const {\n messages: fetchedMessages,\n fetchNextPage,\n hasNextPage,\n isFetchingNextPage,\n isLoading,\n isError,\n } = useMessages(conversationId, { enabled: !isNewSupport })\n const { conversations } = useConversations()\n const { data: closedConversationPolicy } = useClosedConversationPolicy()\n\n const conversation = useMemo(\n () => conversations.find((item) => item.id === conversationId),\n [conversations, conversationId]\n )\n\n const isClosed = conversation?.status === \"closed\"\n const canReplyInClosedConversation = useMemo(\n () => canReplyToClosedConversation(conversation ?? { status: \"open\" }, closedConversationPolicy),\n [closedConversationPolicy, conversation]\n )\n const isEnded = Boolean(isClosed && !canReplyInClosedConversation)\n const isAwaitingRating = conversationNeedsRating(conversation?.status, fetchedMessages)\n const satisfactionMessage = useMemo(\n () => getSatisfactionSurveyMessage(fetchedMessages),\n [fetchedMessages]\n )\n const headerTitle = isNewSupport\n ? t.newSupportRequestHeader\n : conversation\n ? getConversationDisplayName(conversation, t)\n : t.support\n const assignedAgentName = conversation?.assignedAgentName ?? null\n const assignedAgentAvatarUrl = conversation?.assignedAgentAvatarUrl\n ? apiClient.resolveUrl(conversation.assignedAgentAvatarUrl)\n : null\n\n const trimmedLength = message.trim().length\n const isOverLimit = message.length > MESSAGE_CONTENT_MAX_LENGTH\n const attachmentsReady =\n pendingAttachments.length === 0 ||\n pendingAttachments.every((item) => item.status === \"confirmed\")\n const canSend =\n attachmentsReady &&\n (trimmedLength >= MESSAGE_CONTENT_MIN_LENGTH || confirmedFileIds.length > 0) &&\n !isOverLimit &&\n !isSending &&\n !isUploading &&\n !isAwaitingRating &&\n !isEnded &&\n !isRecordingActive\n const canRecordVoice =\n !canSend &&\n trimmedLength === 0 &&\n pendingAttachments.length === 0 &&\n !isSending &&\n !isUploading &&\n !isAwaitingRating &&\n !isEnded &&\n !isRecordingActive\n\n const messages = useMemo(() => {\n const visibleFetchedMessages = fetchedMessages.filter(\n (item) => !isSatisfactionRequestMessage(item)\n )\n\n const baseMessages = isNewSupport\n ? [createWelcomeMessage(t)]\n : visibleFetchedMessages.map((item) =>\n mapMessageToChatMessage(item, t, locale, assignedAgentName, assignedAgentAvatarUrl)\n )\n\n const pendingOptimistic = optimisticMessages.filter(\n (optimistic) =>\n !baseMessages.some(\n (base) => base.sender === optimistic.sender && base.text === optimistic.text\n )\n )\n\n if (isNewSupport) {\n return [...baseMessages, ...pendingOptimistic]\n }\n\n return [...baseMessages, ...pendingOptimistic]\n }, [\n assignedAgentName,\n assignedAgentAvatarUrl,\n fetchedMessages,\n isNewSupport,\n locale,\n optimisticMessages,\n t,\n ])\n\n const cancelRecordingRef = useRef(cancelRecording)\n const resetVoiceRecorderRef = useRef(resetVoiceRecorder)\n cancelRecordingRef.current = cancelRecording\n resetVoiceRecorderRef.current = resetVoiceRecorder\n\n useEffect(() => {\n setMessage(\"\")\n setOptimisticMessages([])\n clearAttachments()\n void cancelRecordingRef.current()\n resetVoiceRecorderRef.current()\n }, [clearAttachments, conversationId])\n\n useEffect(() => {\n if (!isNewSupport) {\n markConversationRead(conversationId)\n }\n }, [conversationId, isNewSupport, markConversationRead])\n\n useEffect(() => {\n if (!isNewSupport && isEnded) {\n markConversationRead(conversationId)\n }\n }, [conversationId, isEnded, isNewSupport, markConversationRead])\n\n const handleEndReached = useCallback(() => {\n if (!isNewSupport && hasNextPage && !isFetchingNextPage) {\n fetchNextPage()\n }\n }, [fetchNextPage, hasNextPage, isFetchingNextPage, isNewSupport])\n\n const handleSend = useCallback(async () => {\n const trimmed = message.trim()\n const content =\n trimmed.length >= MESSAGE_CONTENT_MIN_LENGTH ? trimmed : t.sharedFiles\n\n if (trimmed.length < MESSAGE_CONTENT_MIN_LENGTH && confirmedFileIds.length === 0) {\n return\n }\n\n if (content.length > MESSAGE_CONTENT_MAX_LENGTH || isSending) {\n return\n }\n\n const optimisticId = `optimistic-${Date.now()}`\n const optimisticMessage: ChatMessage = {\n id: optimisticId,\n sender: \"user\",\n text: content,\n timestamp: formatMessageTimestamp(new Date(), locale),\n attachments: pendingAttachments\n .filter((item) => item.status === \"confirmed\")\n .map((item) => ({\n fileId: item.confirmedFileId ?? item.id,\n fileName: item.fileName,\n mimeType: item.mimeType,\n size: item.size,\n })),\n }\n\n setOptimisticMessages((previous) => [...previous, optimisticMessage])\n setMessage(\"\")\n clearAttachments()\n setIsSending(true)\n\n try {\n const sentMessage = await apiClient.sendMessage({\n content,\n conversationId: isNewSupport ? undefined : conversationId,\n forceNew: isNewSupport ? true : undefined,\n fileIds: confirmedFileIds.length > 0 ? confirmedFileIds : undefined,\n })\n\n if (isNewSupport) {\n queryClient.setQueryData<InfiniteData<PaginatedResponse<Message>>>(\n jokkooQueryKeys.messages(sentMessage.conversationId),\n createMessagesCacheWithMessage(sentMessage)\n )\n setOptimisticMessages((previous) => previous.filter((item) => item.id !== optimisticId))\n navigateTo({\n name: \"conversation\",\n conversationId: sentMessage.conversationId,\n })\n } else {\n queryClient.setQueryData<InfiniteData<PaginatedResponse<Message>>>(\n jokkooQueryKeys.messages(conversationId),\n (current) => prependMessageToMessagesCache(current, sentMessage)\n )\n setOptimisticMessages((previous) => previous.filter((item) => item.id !== optimisticId))\n }\n\n void queryClient.invalidateQueries({ queryKey: jokkooQueryKeys.conversations })\n } catch (error) {\n setOptimisticMessages((previous) => previous.filter((item) => item.id !== optimisticId))\n setMessage(trimmed)\n\n const errorMessage =\n error instanceof JokkooApiError && error.message.trim().length > 0\n ? error.message\n : t.sendMessageError\n\n window.alert(errorMessage)\n } finally {\n setIsSending(false)\n }\n }, [\n apiClient,\n clearAttachments,\n confirmedFileIds,\n conversationId,\n isNewSupport,\n isSending,\n locale,\n message,\n navigateTo,\n pendingAttachments,\n queryClient,\n t,\n ])\n\n const handleSendVoiceMessage = useCallback(async () => {\n const uploaded = await stopAndUpload()\n if (!uploaded) {\n return\n }\n\n const optimisticId = `optimistic-voice-${Date.now()}`\n const optimisticMessage: ChatMessage = {\n id: optimisticId,\n sender: \"user\",\n text: t.voiceMessage,\n timestamp: formatMessageTimestamp(new Date(), locale),\n metadata: {\n isVoiceMessage: true,\n audioDurationMs: uploaded.audioDurationMs,\n },\n attachments: [\n {\n fileId: uploaded.fileId,\n fileName: \"voice.webm\",\n mimeType: \"audio/webm\",\n },\n ],\n }\n\n setOptimisticMessages((previous) => [...previous, optimisticMessage])\n setIsSending(true)\n\n try {\n const sentMessage = await apiClient.sendMessage({\n content: t.voiceMessage,\n conversationId: isNewSupport ? undefined : conversationId,\n forceNew: isNewSupport ? true : undefined,\n fileIds: [uploaded.fileId],\n metadata: {\n isVoiceMessage: true,\n audioDurationMs: uploaded.audioDurationMs,\n },\n })\n\n if (isNewSupport) {\n queryClient.setQueryData<InfiniteData<PaginatedResponse<Message>>>(\n jokkooQueryKeys.messages(sentMessage.conversationId),\n createMessagesCacheWithMessage(sentMessage)\n )\n setOptimisticMessages((previous) => previous.filter((item) => item.id !== optimisticId))\n navigateTo({\n name: \"conversation\",\n conversationId: sentMessage.conversationId,\n })\n } else {\n queryClient.setQueryData<InfiniteData<PaginatedResponse<Message>>>(\n jokkooQueryKeys.messages(conversationId),\n (current) => prependMessageToMessagesCache(current, sentMessage)\n )\n setOptimisticMessages((previous) => previous.filter((item) => item.id !== optimisticId))\n }\n\n void queryClient.invalidateQueries({ queryKey: jokkooQueryKeys.conversations })\n } catch (error) {\n setOptimisticMessages((previous) => previous.filter((item) => item.id !== optimisticId))\n\n const errorMessage =\n error instanceof JokkooApiError && error.message.trim().length > 0\n ? error.message\n : t.sendMessageError\n\n window.alert(errorMessage)\n } finally {\n resetVoiceRecorder()\n setIsSending(false)\n }\n }, [\n apiClient,\n conversationId,\n isNewSupport,\n locale,\n navigateTo,\n queryClient,\n resetVoiceRecorder,\n stopAndUpload,\n t.sendMessageError,\n t.voiceMessage,\n ])\n\n const handleSatisfactionSubmit = useCallback(\n async (score: number) => {\n await apiClient.recordSatisfaction(conversationId, score)\n markConversationRead(conversationId)\n await queryClient.invalidateQueries({ queryKey: jokkooQueryKeys.conversations })\n await queryClient.invalidateQueries({ queryKey: jokkooQueryKeys.messages(conversationId) })\n },\n [apiClient, conversationId, markConversationRead, queryClient]\n )\n\n return (\n <div className=\"jk-conversation\">\n <ConversationHeader\n title={headerTitle}\n status={isNewSupport ? undefined : conversation?.status}\n t={t}\n onBack={goBack}\n />\n\n <MessageList\n messages={messages}\n apiClient={apiClient}\n t={t}\n isNewSupport={isNewSupport}\n isLoading={isLoading}\n isError={isError}\n isFetchingNextPage={isFetchingNextPage}\n pendingNewMessages={pendingNewMessages}\n onLoadOlder={handleEndReached}\n onScrolledToBottom={notifyScrolledToBottom}\n onScrolledAwayFromBottom={notifyScrolledAwayFromBottom}\n onJumpToLatest={notifyScrolledToBottom}\n />\n\n {isAwaitingRating ? (\n <SatisfactionRating\n t={t}\n message={satisfactionMessage}\n onSubmit={handleSatisfactionSubmit}\n />\n ) : isRecordingActive ? (\n <VoiceRecordingOverlay\n t={t}\n durationMs={voiceDurationMs}\n meteringLevels={voiceMeteringLevels}\n isUploading={voiceRecorderState === \"uploading\"}\n uploadProgress={voiceUploadProgress}\n onCancel={() => {\n void cancelRecording()\n }}\n onSend={() => {\n void handleSendVoiceMessage()\n }}\n />\n ) : isEnded ? (\n <ResolvedBanner\n t={t}\n onNewRequest={() =>\n navigateTo({ name: \"conversation\", conversationId: NEW_CONVERSATION_ID })\n }\n />\n ) : (\n <>\n {canReplyInClosedConversation ? (\n <ResolvedBanner\n t={t}\n canReplyInConversation\n onNewRequest={() =>\n navigateTo({ name: \"conversation\", conversationId: NEW_CONVERSATION_ID })\n }\n />\n ) : null}\n <MessageInput\n t={t}\n apiClient={apiClient}\n value={message}\n onChange={setMessage}\n pendingAttachments={pendingAttachments}\n onRemoveAttachment={removeAttachment}\n onRetryAttachment={retryAttachment}\n onPickAttachments={pickAttachments}\n canSend={canSend}\n canRecordVoice={canRecordVoice}\n onSend={() => {\n void handleSend()\n }}\n onStartRecording={() => {\n void startRecording()\n }}\n />\n </>\n )}\n </div>\n )\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\"\nimport type { ClosedConversationPolicy } from \"@jokkoo/sdk-web\"\n\nimport { useJokkooContext } from \"../context/JokkooProvider\"\nimport { jokkooQueryKeys } from \"./query-keys\"\n\nexport function useClosedConversationPolicy(): UseQueryResult<ClosedConversationPolicy, Error> {\n const { apiClient } = useJokkooContext()\n\n return useQuery({\n queryKey: jokkooQueryKeys.conversationPolicies,\n queryFn: () => apiClient.getConversationPolicies(),\n staleTime: 5 * 60 * 1000,\n })\n}\n","import { useInfiniteQuery } from \"@tanstack/react-query\"\nimport type { Conversation } from \"@jokkoo/sdk-web\"\nimport { useMemo } from \"react\"\n\nimport { useJokkooContext } from \"../context/JokkooProvider\"\nimport { jokkooQueryKeys } from \"./query-keys\"\n\nconst DEFAULT_PAGE_SIZE = 20\n\nexport interface UseConversationsOptions {\n pageSize?: number\n}\n\nexport interface UseConversationsResult {\n conversations: Conversation[]\n fetchNextPage: () => void\n hasNextPage: boolean\n isFetchingNextPage: boolean\n isLoading: boolean\n isError: boolean\n refetch: () => void\n}\n\nexport function useConversations(options?: UseConversationsOptions): UseConversationsResult {\n const { apiClient } = useJokkooContext()\n const pageSize = options?.pageSize ?? DEFAULT_PAGE_SIZE\n\n const query = useInfiniteQuery({\n queryKey: jokkooQueryKeys.conversations,\n initialPageParam: 0,\n staleTime: 30_000,\n queryFn: ({ pageParam }) => apiClient.getConversations(pageSize, pageParam),\n getNextPageParam: (lastPage) => {\n const nextOffset = lastPage.offset + lastPage.limit\n return nextOffset < lastPage.total ? nextOffset : undefined\n },\n })\n\n const conversations = useMemo(\n () => query.data?.pages.flatMap((page) => page.data) ?? [],\n [query.data]\n )\n\n return {\n conversations,\n fetchNextPage: () => {\n void query.fetchNextPage()\n },\n hasNextPage: query.hasNextPage,\n isFetchingNextPage: query.isFetchingNextPage,\n isLoading: query.isLoading,\n isError: query.isError,\n refetch: () => {\n void query.refetch()\n },\n }\n}\n","import {\n canAddMoreAttachments,\n createPendingAttachment,\n uploadAttachmentFile,\n type PendingAttachment,\n} from \"@jokkoo/sdk-web\"\nimport { useCallback, useRef, useState } from \"react\"\n\nimport { useJokkooContext } from \"../context/JokkooProvider\"\n\nconst ACCEPT =\n \"image/jpeg,image/png,image/gif,image/webp,video/mp4,video/quicktime,video/webm,application/pdf,application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n\nexport function useFileUpload(): {\n pendingAttachments: PendingAttachment[]\n isUploading: boolean\n confirmedFileIds: string[]\n pickAttachments: () => void\n removeAttachment: (id: string) => void\n retryAttachment: (id: string) => void\n clearAttachments: () => void\n} {\n const { apiClient, t } = useJokkooContext()\n const [pendingAttachments, setPendingAttachments] = useState<PendingAttachment[]>([])\n const inputRef = useRef<HTMLInputElement | null>(null)\n\n const ensureInput = useCallback(() => {\n if (inputRef.current) {\n return inputRef.current\n }\n\n const input = document.createElement(\"input\")\n input.type = \"file\"\n input.accept = ACCEPT\n input.multiple = true\n input.style.display = \"none\"\n document.body.appendChild(input)\n inputRef.current = input\n return input\n }, [])\n\n const uploadPendingAttachment = useCallback(\n async (attachment: PendingAttachment) => {\n setPendingAttachments((current) =>\n current.map((item) =>\n item.id === attachment.id ? { ...item, status: \"uploading\", progress: 5 } : item\n )\n )\n\n try {\n const uploaded = await uploadAttachmentFile(apiClient, attachment, (progress, status) => {\n setPendingAttachments((current) =>\n current.map((item) =>\n item.id === attachment.id ? { ...item, progress, status } : item\n )\n )\n })\n\n setPendingAttachments((current) =>\n current.map((item) => (item.id === attachment.id ? uploaded : item))\n )\n } catch {\n setPendingAttachments((current) =>\n current.map((item) =>\n item.id === attachment.id\n ? {\n ...item,\n status: \"error\",\n progress: 0,\n error: t.uploadFailed,\n }\n : item\n )\n )\n }\n },\n [apiClient, t.uploadFailed]\n )\n\n const appendAttachment = useCallback(\n async (attachment: PendingAttachment) => {\n if (!canAddMoreAttachments(pendingAttachments.length)) {\n window.alert(t.maxAttachmentsReached)\n return\n }\n\n setPendingAttachments((current) => [...current, attachment])\n\n if (attachment.status === \"pending\") {\n await uploadPendingAttachment(attachment)\n }\n },\n [pendingAttachments.length, t.maxAttachmentsReached, uploadPendingAttachment]\n )\n\n const pickAttachments = useCallback(() => {\n const input = ensureInput()\n\n input.onchange = () => {\n const files = Array.from(input.files ?? [])\n input.value = \"\"\n\n for (const file of files) {\n const uri = URL.createObjectURL(file)\n const attachment = createPendingAttachment({\n fileName: file.name,\n mimeType: file.type || \"application/octet-stream\",\n uri,\n size: file.size,\n })\n void appendAttachment(attachment)\n }\n }\n\n input.click()\n }, [appendAttachment, ensureInput])\n\n const retryAttachment = useCallback(\n (id: string) => {\n const attachment = pendingAttachments.find((item) => item.id === id)\n if (!attachment || attachment.status !== \"error\") {\n return\n }\n\n const resetAttachment: PendingAttachment = {\n ...attachment,\n status: \"pending\",\n progress: 0,\n error: undefined,\n }\n\n setPendingAttachments((current) =>\n current.map((item) => (item.id === id ? resetAttachment : item))\n )\n\n void uploadPendingAttachment(resetAttachment)\n },\n [pendingAttachments, uploadPendingAttachment]\n )\n\n const removeAttachment = useCallback((id: string) => {\n setPendingAttachments((current) => {\n const target = current.find((item) => item.id === id)\n if (target?.uri.startsWith(\"blob:\")) {\n URL.revokeObjectURL(target.uri)\n }\n return current.filter((item) => item.id !== id)\n })\n }, [])\n\n const clearAttachments = useCallback(() => {\n setPendingAttachments((current) => {\n for (const item of current) {\n if (item.uri.startsWith(\"blob:\")) {\n URL.revokeObjectURL(item.uri)\n }\n }\n return []\n })\n }, [])\n\n const confirmedFileIds = pendingAttachments\n .filter((item) => item.status === \"confirmed\" && item.confirmedFileId)\n .map((item) => item.confirmedFileId as string)\n\n const isUploading = pendingAttachments.some(\n (item) =>\n item.status === \"uploading\" || item.status === \"confirming\" || item.status === \"pending\"\n )\n\n return {\n pendingAttachments,\n isUploading,\n confirmedFileIds,\n pickAttachments,\n removeAttachment,\n retryAttachment,\n clearAttachments,\n }\n}\n","import { useInfiniteQuery } from \"@tanstack/react-query\"\nimport {\n NEW_CONVERSATION_ID,\n fetchMessagesPage,\n getOlderMessagesPageParam,\n type Message,\n} from \"@jokkoo/sdk-web\"\nimport { useMemo } from \"react\"\n\nimport { useJokkooContext } from \"../context/JokkooProvider\"\nimport { jokkooQueryKeys } from \"./query-keys\"\n\nconst DEFAULT_PAGE_SIZE = 50\n\nexport type MessagesPageParam = \"latest\" | number\n\nexport interface UseMessagesOptions {\n pageSize?: number\n enabled?: boolean\n}\n\nexport interface UseMessagesResult {\n messages: Message[]\n fetchNextPage: () => void\n hasNextPage: boolean\n isFetchingNextPage: boolean\n isLoading: boolean\n isError: boolean\n}\n\nexport function useMessages(\n conversationId: number,\n options?: UseMessagesOptions\n): UseMessagesResult {\n const { apiClient } = useJokkooContext()\n const pageSize = options?.pageSize ?? DEFAULT_PAGE_SIZE\n const enabled = (options?.enabled ?? true) && conversationId !== NEW_CONVERSATION_ID\n\n const query = useInfiniteQuery({\n queryKey: jokkooQueryKeys.messages(conversationId),\n initialPageParam: \"latest\" as MessagesPageParam,\n enabled,\n staleTime: 0,\n queryFn: ({ pageParam }) =>\n fetchMessagesPage(apiClient, conversationId, pageSize, pageParam),\n getNextPageParam: (lastPage) => getOlderMessagesPageParam(lastPage),\n })\n\n const messages = useMemo(\n () => query.data?.pages.flatMap((page) => page.data) ?? [],\n [query.data]\n )\n\n return {\n messages,\n fetchNextPage: () => {\n void query.fetchNextPage()\n },\n hasNextPage: query.hasNextPage,\n isFetchingNextPage: query.isFetchingNextPage,\n isLoading: query.isLoading,\n isError: query.isError,\n }\n}\n","import { useQueryClient } from \"@tanstack/react-query\"\nimport {\n NEW_CONVERSATION_ID,\n REALTIME_EVENTS,\n isSatisfactionRequestMessage,\n type Message,\n} from \"@jokkoo/sdk-web\"\nimport { useCallback, useEffect, useRef, useState } from \"react\"\n\nimport { useJokkooContext } from \"../context/JokkooProvider\"\nimport {\n appendMessageToCache,\n normalizeRealtimeMessage,\n updateConversationPreviewFromMessage,\n updateConversationStatusInListCache,\n} from \"../lib/realtime-cache-utils\"\nimport { useRealtimeStatus } from \"./useRealtimeStatus\"\n\ntype MessageCreatedPayload = {\n organizationId: string\n message: Message\n}\n\nexport function useRealtimeMessages(conversationId: number): {\n pendingNewMessages: number\n clearPendingNewMessages: () => void\n notifyScrolledToBottom: () => void\n notifyScrolledAwayFromBottom: () => void\n} {\n const { realtimeClient } = useJokkooContext()\n const queryClient = useQueryClient()\n const status = useRealtimeStatus()\n const [pendingNewMessages, setPendingNewMessages] = useState(0)\n const isAtBottomRef = useRef(true)\n const conversationIdRef = useRef(conversationId)\n\n conversationIdRef.current = conversationId\n\n const clearPendingNewMessages = useCallback(() => {\n setPendingNewMessages(0)\n }, [])\n\n const notifyScrolledToBottom = useCallback(() => {\n isAtBottomRef.current = true\n setPendingNewMessages(0)\n }, [])\n\n const notifyScrolledAwayFromBottom = useCallback(() => {\n isAtBottomRef.current = false\n }, [])\n\n useEffect(() => {\n setPendingNewMessages(0)\n isAtBottomRef.current = true\n }, [conversationId])\n\n useEffect(() => {\n if (status !== \"connected\" || conversationId === NEW_CONVERSATION_ID) {\n return\n }\n\n const socket = realtimeClient.getSocket()\n if (!socket) {\n return\n }\n\n const handleMessageCreated = (payload: MessageCreatedPayload): void => {\n if (!payload?.message) {\n return\n }\n\n const message = normalizeRealtimeMessage(payload.message)\n\n if (message.conversationId !== conversationIdRef.current) {\n return\n }\n\n appendMessageToCache(queryClient, message)\n updateConversationPreviewFromMessage(queryClient, message)\n\n if (isSatisfactionRequestMessage(message)) {\n updateConversationStatusInListCache(queryClient, message.conversationId, \"pending_closure\")\n }\n\n if (message.senderType === \"agent\" || message.senderType === \"system\") {\n if (!isAtBottomRef.current) {\n setPendingNewMessages((count) => count + 1)\n }\n }\n }\n\n socket.on(REALTIME_EVENTS.messageCreated, handleMessageCreated)\n\n return () => {\n socket.off(REALTIME_EVENTS.messageCreated, handleMessageCreated)\n }\n }, [conversationId, queryClient, realtimeClient, status])\n\n return {\n pendingNewMessages,\n clearPendingNewMessages,\n notifyScrolledToBottom,\n notifyScrolledAwayFromBottom,\n }\n}\n","import {\n applyLiveBarVariation,\n blendLiveWaveformLevels,\n createIdleMeteringLevels,\n createVoiceMessageFileName,\n shiftMeteringLevel,\n smoothMeteringSample,\n uploadVoiceBlob,\n} from \"@jokkoo/sdk-web\"\nimport { useCallback, useEffect, useRef, useState } from \"react\"\n\nimport { useJokkooContext } from \"../context/JokkooProvider\"\n\nexport type VoiceRecorderState = \"idle\" | \"recording\" | \"stopped\" | \"uploading\" | \"confirmed\"\n\nconst MIN_VOICE_DURATION_MS = 500\nconst METERING_SAMPLE_INTERVAL_MS = 55\nconst VOICE_METERING_HISTORY_SIZE = 32\n\nfunction pickMimeType(): string {\n if (typeof MediaRecorder === \"undefined\") {\n return \"audio/webm\"\n }\n\n if (MediaRecorder.isTypeSupported(\"audio/webm;codecs=opus\")) {\n return \"audio/webm;codecs=opus\"\n }\n\n if (MediaRecorder.isTypeSupported(\"audio/webm\")) {\n return \"audio/webm\"\n }\n\n if (MediaRecorder.isTypeSupported(\"audio/mp4\")) {\n return \"audio/mp4\"\n }\n\n return \"audio/webm\"\n}\n\nexport function useVoiceRecorder(): {\n state: VoiceRecorderState\n durationMs: number\n meteringLevels: number[]\n uploadProgress: number\n confirmedFileId: string | null\n audioDurationMs: number\n isRecordingActive: boolean\n startRecording: () => Promise<void>\n cancelRecording: () => Promise<void>\n stopAndUpload: () => Promise<{ fileId: string; audioDurationMs: number } | null>\n reset: () => void\n} {\n const { apiClient, t } = useJokkooContext()\n const [state, setState] = useState<VoiceRecorderState>(\"idle\")\n const [durationMs, setDurationMs] = useState(0)\n const [meteringLevels, setMeteringLevels] = useState<number[]>(() => createIdleMeteringLevels())\n const [uploadProgress, setUploadProgress] = useState(0)\n const [confirmedFileId, setConfirmedFileId] = useState<string | null>(null)\n const [audioDurationMs, setAudioDurationMs] = useState(0)\n\n const mediaRecorderRef = useRef<MediaRecorder | null>(null)\n const mediaStreamRef = useRef<MediaStream | null>(null)\n const chunksRef = useRef<Blob[]>([])\n const mimeTypeRef = useRef(\"audio/webm\")\n const durationStartedAtRef = useRef<number | null>(null)\n const durationTimerRef = useRef<ReturnType<typeof setInterval> | null>(null)\n const analyserRef = useRef<AnalyserNode | null>(null)\n const audioContextRef = useRef<AudioContext | null>(null)\n const meteringTimerRef = useRef<ReturnType<typeof setInterval> | null>(null)\n const smoothedMeteringRef = useRef(createIdleMeteringLevels()[0])\n const sampleIndexRef = useRef(0)\n\n const clearTimers = useCallback(() => {\n if (durationTimerRef.current) {\n clearInterval(durationTimerRef.current)\n durationTimerRef.current = null\n }\n if (meteringTimerRef.current) {\n clearInterval(meteringTimerRef.current)\n meteringTimerRef.current = null\n }\n }, [])\n\n const stopTracks = useCallback(() => {\n mediaStreamRef.current?.getTracks().forEach((track) => track.stop())\n mediaStreamRef.current = null\n void audioContextRef.current?.close().catch(() => undefined)\n audioContextRef.current = null\n analyserRef.current = null\n mediaRecorderRef.current = null\n }, [])\n\n const reset = useCallback(() => {\n clearTimers()\n stopTracks()\n chunksRef.current = []\n setState(\"idle\")\n setDurationMs(0)\n setMeteringLevels(createIdleMeteringLevels())\n setUploadProgress(0)\n setConfirmedFileId(null)\n setAudioDurationMs(0)\n durationStartedAtRef.current = null\n smoothedMeteringRef.current = createIdleMeteringLevels()[0]\n sampleIndexRef.current = 0\n }, [clearTimers, stopTracks])\n\n useEffect(() => {\n return () => {\n clearTimers()\n stopTracks()\n }\n }, [clearTimers, stopTracks])\n\n const startRecording = useCallback(async () => {\n if (state === \"recording\" || state === \"uploading\") {\n return\n }\n\n if (typeof navigator === \"undefined\" || !navigator.mediaDevices?.getUserMedia) {\n window.alert(t.microphonePermissionDenied)\n return\n }\n\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true })\n mediaStreamRef.current = stream\n mimeTypeRef.current = pickMimeType()\n\n const audioContext = new AudioContext()\n audioContextRef.current = audioContext\n const source = audioContext.createMediaStreamSource(stream)\n const analyser = audioContext.createAnalyser()\n analyser.fftSize = 256\n source.connect(analyser)\n analyserRef.current = analyser\n\n const recorder = new MediaRecorder(stream, { mimeType: mimeTypeRef.current })\n mediaRecorderRef.current = recorder\n chunksRef.current = []\n\n recorder.ondataavailable = (event) => {\n if (event.data.size > 0) {\n chunksRef.current.push(event.data)\n }\n }\n\n setDurationMs(0)\n setMeteringLevels(createIdleMeteringLevels())\n setUploadProgress(0)\n setConfirmedFileId(null)\n setAudioDurationMs(0)\n durationStartedAtRef.current = Date.now()\n smoothedMeteringRef.current = createIdleMeteringLevels()[0]\n sampleIndexRef.current = 0\n\n recorder.start(100)\n setState(\"recording\")\n\n durationTimerRef.current = setInterval(() => {\n if (durationStartedAtRef.current) {\n setDurationMs(Date.now() - durationStartedAtRef.current)\n }\n }, 200)\n\n meteringTimerRef.current = setInterval(() => {\n const analyserNode = analyserRef.current\n if (!analyserNode) {\n return\n }\n\n const data = new Uint8Array(analyserNode.frequencyBinCount)\n analyserNode.getByteTimeDomainData(data)\n\n let sum = 0\n for (let i = 0; i < data.length; i += 1) {\n const centered = (data[i]! - 128) / 128\n sum += centered * centered\n }\n const rms = Math.sqrt(sum / data.length)\n const rawLevel = Math.max(0.14, Math.min(1, rms * 4))\n smoothedMeteringRef.current = smoothMeteringSample(smoothedMeteringRef.current, rawLevel)\n const variedLevel = applyLiveBarVariation(\n smoothedMeteringRef.current,\n sampleIndexRef.current\n )\n sampleIndexRef.current += 1\n\n setMeteringLevels((previous) => {\n const shifted = shiftMeteringLevel(previous, variedLevel)\n const sized =\n shifted.length >= VOICE_METERING_HISTORY_SIZE\n ? shifted.slice(shifted.length - VOICE_METERING_HISTORY_SIZE)\n : [\n ...createIdleMeteringLevels(VOICE_METERING_HISTORY_SIZE - shifted.length),\n ...shifted,\n ]\n return blendLiveWaveformLevels(sized)\n })\n }, METERING_SAMPLE_INTERVAL_MS)\n } catch {\n window.alert(t.microphonePermissionDenied)\n reset()\n }\n }, [reset, state, t.microphonePermissionDenied])\n\n const cancelRecording = useCallback(async () => {\n if (mediaRecorderRef.current && mediaRecorderRef.current.state !== \"inactive\") {\n mediaRecorderRef.current.stop()\n }\n reset()\n }, [reset])\n\n const stopAndUpload = useCallback(async () => {\n if (state !== \"recording\" || !mediaRecorderRef.current) {\n return null\n }\n\n const recorder = mediaRecorderRef.current\n const elapsedMs = durationStartedAtRef.current\n ? Date.now() - durationStartedAtRef.current\n : durationMs\n\n clearTimers()\n\n const blob = await new Promise<Blob | null>((resolve) => {\n recorder.onstop = () => {\n const type = mimeTypeRef.current.split(\";\")[0] ?? \"audio/webm\"\n resolve(new Blob(chunksRef.current, { type }))\n }\n recorder.stop()\n })\n\n stopTracks()\n\n if (!blob || elapsedMs < MIN_VOICE_DURATION_MS) {\n window.alert(t.voiceMessageTooShort)\n reset()\n return null\n }\n\n setAudioDurationMs(elapsedMs)\n setState(\"uploading\")\n setUploadProgress(5)\n\n const extension = blob.type.includes(\"mp4\") ? \"m4a\" : \"webm\"\n\n try {\n const fileId = await uploadVoiceBlob(\n apiClient,\n blob,\n createVoiceMessageFileName(extension),\n blob.type || \"audio/webm\",\n setUploadProgress\n )\n\n setConfirmedFileId(fileId)\n setState(\"confirmed\")\n\n return {\n fileId,\n audioDurationMs: elapsedMs,\n }\n } catch {\n window.alert(t.uploadFailed)\n reset()\n return null\n }\n }, [\n apiClient,\n clearTimers,\n durationMs,\n reset,\n state,\n stopTracks,\n t.uploadFailed,\n t.voiceMessageTooShort,\n ])\n\n return {\n state,\n durationMs,\n meteringLevels,\n uploadProgress,\n confirmedFileId,\n audioDurationMs,\n isRecordingActive: state === \"recording\" || state === \"uploading\",\n startRecording,\n cancelRecording,\n stopAndUpload,\n reset,\n }\n}\n","import type { CSSProperties, SVGProps } from \"react\"\n\nexport interface IconProps extends SVGProps<SVGSVGElement> {\n color?: string\n size?: number\n}\n\nfunction baseStyle(size: number, color: string): CSSProperties {\n return { width: size, height: size, color, display: \"block\", flexShrink: 0 }\n}\n\nexport function ArrowLeftIcon({ color = \"currentColor\", size = 20, ...rest }: IconProps) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" style={baseStyle(size, color)} aria-hidden {...rest}>\n <path\n d=\"M15 18l-6-6 6-6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nexport function CloseIcon({ color = \"currentColor\", size = 16, ...rest }: IconProps) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" style={baseStyle(size, color)} aria-hidden {...rest}>\n <path\n d=\"M18 6L6 18M6 6l12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n )\n}\n\nexport function ExpandIcon({ color = \"currentColor\", size = 16, ...rest }: IconProps) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" style={baseStyle(size, color)} aria-hidden {...rest}>\n <path\n d=\"M9 3H3v6M15 3h6v6M9 21H3v-6M21 15v6h-6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nexport function PaperclipIcon({ color = \"currentColor\", size = 16, ...rest }: IconProps) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" style={baseStyle(size, color)} aria-hidden {...rest}>\n <path\n d=\"M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66l-9.2 9.19a2 2 0 01-2.83-2.83l8.49-8.48\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nexport function MicIcon({ color = \"currentColor\", size = 24, ...rest }: IconProps) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" style={baseStyle(size, color)} aria-hidden {...rest}>\n <rect x=\"9\" y=\"2\" width=\"6\" height=\"12\" rx=\"3\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path\n d=\"M5 10a7 7 0 0014 0M12 17v4M8 21h8\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n )\n}\n\nexport function ChatIcon({ color = \"currentColor\", size = 20, ...rest }: IconProps) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" style={baseStyle(size, color)} aria-hidden {...rest}>\n <path\n d=\"M21 12a8.5 8.5 0 01-8.5 8.5H5l-2 2V12A8.5 8.5 0 0111.5 3.5 8.5 8.5 0 0121 12z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nexport function ClockIcon({ color = \"currentColor\", size = 11, ...rest }: IconProps) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" style={baseStyle(size, color)} aria-hidden {...rest}>\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path d=\"M12 7v5l3 2\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n\nexport function CheckCircleIcon({ color = \"currentColor\", size = 14, ...rest }: IconProps) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" style={baseStyle(size, color)} aria-hidden {...rest}>\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path\n d=\"M8 12l2.5 2.5L16 9\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nexport function SendIcon({ color = \"currentColor\", size = 22, ...rest }: IconProps) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" style={baseStyle(size, color)} aria-hidden {...rest}>\n <path\n d=\"M22 2L11 13M22 2l-7 20-4-9-9-4 20-7z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nexport function PlayIcon({ color = \"currentColor\", size = 16, ...rest }: IconProps) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" style={baseStyle(size, color)} aria-hidden {...rest}>\n <path d=\"M8 5v14l11-7L8 5z\" />\n </svg>\n )\n}\n\nexport function PauseIcon({ color = \"currentColor\", size = 16, ...rest }: IconProps) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" style={baseStyle(size, color)} aria-hidden {...rest}>\n <path d=\"M6 5h4v14H6V5zm8 0h4v14h-4V5z\" />\n </svg>\n )\n}\n\nexport function ArrowDownIcon({ color = \"currentColor\", size = 20, ...rest }: IconProps) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" style={baseStyle(size, color)} aria-hidden {...rest}>\n <path\n d=\"M12 5v14M5 12l7 7 7-7\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n","import type { ConversationStatus, Translations } from \"@jokkoo/sdk-web\"\n\nexport type StatusBadgeVariant = \"new\" | \"in-progress\" | \"resolved\" | \"ended\"\n\nexport interface StatusBadgeInfo {\n variant: StatusBadgeVariant\n label: string\n}\n\nexport function getStatusBadgeInfo(\n status: ConversationStatus,\n t: Pick<Translations, \"statusNew\" | \"statusInProgress\" | \"statusResolved\" | \"statusEnded\">\n): StatusBadgeInfo {\n switch (status) {\n case \"pending\":\n return { variant: \"new\", label: t.statusNew }\n case \"open\":\n case \"snoozed\":\n return { variant: \"in-progress\", label: t.statusInProgress }\n case \"pending_closure\":\n return { variant: \"resolved\", label: t.statusResolved }\n case \"closed\":\n return { variant: \"ended\", label: t.statusEnded }\n default:\n return { variant: \"in-progress\", label: t.statusInProgress }\n }\n}\n","import type { ConversationStatus, Translations } from \"@jokkoo/sdk-web\"\n\nimport { getStatusBadgeInfo } from \"../lib/status-badge\"\n\nexport interface StatusBadgeProps {\n status: ConversationStatus\n t: Pick<Translations, \"statusNew\" | \"statusInProgress\" | \"statusResolved\" | \"statusEnded\">\n}\n\nexport function StatusBadge({ status, t }: StatusBadgeProps) {\n const info = getStatusBadgeInfo(status, t)\n\n return (\n <span className={`jk-status-badge jk-status-badge--${info.variant}`}>{info.label}</span>\n )\n}\n","import type { ConversationStatus, Translations } from \"@jokkoo/sdk-web\"\n\nimport { ArrowLeftIcon } from \"../icons\"\nimport { StatusBadge } from \"./StatusBadge\"\n\nexport interface ConversationHeaderProps {\n title: string\n status?: ConversationStatus\n t: Translations\n onBack: () => void\n}\n\nexport function ConversationHeader({ title, status, t, onBack }: ConversationHeaderProps) {\n return (\n <div className=\"jk-conversation-header\">\n <button\n type=\"button\"\n className=\"jk-icon-btn jk-icon-btn--dark\"\n aria-label=\"Back\"\n onClick={onBack}\n >\n <ArrowLeftIcon color=\"currentColor\" size={16} />\n </button>\n <h2 className=\"jk-conversation-header__title\">{title}</h2>\n {status ? <StatusBadge status={status} t={t} /> : null}\n </div>\n )\n}\n","import {\n MESSAGE_CONTENT_MAX_LENGTH,\n type JokkooApiClient,\n type PendingAttachment,\n type Translations,\n} from \"@jokkoo/sdk-web\"\n\nimport { MicIcon, PaperclipIcon, SendIcon } from \"../icons\"\nimport { PendingAttachmentList } from \"./PendingAttachmentList\"\n\nexport interface MessageInputProps {\n t: Translations\n apiClient: JokkooApiClient\n value: string\n onChange: (value: string) => void\n pendingAttachments: PendingAttachment[]\n onRemoveAttachment: (id: string) => void\n onRetryAttachment: (id: string) => void\n onPickAttachments: () => void\n canSend: boolean\n canRecordVoice: boolean\n onSend: () => void\n onStartRecording: () => void\n}\n\nexport function MessageInput({\n t,\n apiClient,\n value,\n onChange,\n pendingAttachments,\n onRemoveAttachment,\n onRetryAttachment,\n onPickAttachments,\n canSend,\n canRecordVoice,\n onSend,\n onStartRecording,\n}: MessageInputProps) {\n const isOverLimit = value.length > MESSAGE_CONTENT_MAX_LENGTH\n\n return (\n <div className=\"jk-input-bar\">\n {pendingAttachments.length > 0 ? (\n <PendingAttachmentList\n attachments={pendingAttachments}\n apiClient={apiClient}\n t={t}\n onRemove={onRemoveAttachment}\n onRetry={onRetryAttachment}\n />\n ) : null}\n <div className=\"jk-input-shell\">\n <button\n type=\"button\"\n className=\"jk-input-shell__icon\"\n aria-label={t.attachFile}\n onClick={onPickAttachments}\n >\n <PaperclipIcon color=\"currentColor\" size={16} />\n </button>\n <div className=\"jk-input-shell__field\">\n <textarea\n rows={1}\n maxLength={MESSAGE_CONTENT_MAX_LENGTH}\n placeholder={t.typeYourMessage}\n value={value}\n onChange={(event) => onChange(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault()\n if (canSend) {\n onSend()\n }\n }\n }}\n />\n <div\n className={`jk-input-shell__counter${isOverLimit ? \" jk-input-shell__counter--error\" : \"\"}`}\n >\n {value.length}/{MESSAGE_CONTENT_MAX_LENGTH}\n </div>\n </div>\n <button\n type=\"button\"\n className=\"jk-input-shell__icon\"\n aria-label={canSend ? t.sendMessage : t.recordVoiceMessage}\n disabled={!canSend && !canRecordVoice}\n onClick={() => {\n if (canSend) {\n onSend()\n return\n }\n if (canRecordVoice) {\n onStartRecording()\n }\n }}\n >\n {canSend ? (\n <SendIcon color=\"currentColor\" size={22} />\n ) : (\n <MicIcon color=\"currentColor\" size={22} />\n )}\n </button>\n </div>\n </div>\n )\n}\n","import {\n isImageMimeType,\n type JokkooApiClient,\n type PendingAttachment,\n type Translations,\n} from \"@jokkoo/sdk-web\"\n\nexport interface PendingAttachmentListProps {\n attachments: PendingAttachment[]\n apiClient: JokkooApiClient\n t: Translations\n onRemove: (id: string) => void\n onRetry: (id: string) => void\n}\n\nfunction getStatusLabel(attachment: PendingAttachment, t: Translations): string {\n switch (attachment.status) {\n case \"uploading\":\n case \"confirming\":\n return `${t.uploadingAttachment} ${attachment.progress}%`\n case \"confirmed\":\n return t.attachmentReady\n case \"error\":\n return attachment.error ?? t.uploadFailed\n default:\n return t.uploadingAttachment\n }\n}\n\nexport function PendingAttachmentList({\n attachments,\n t,\n onRemove,\n onRetry,\n}: PendingAttachmentListProps) {\n if (attachments.length === 0) {\n return null\n }\n\n return (\n <div className=\"jk-pending-list\">\n {attachments.map((attachment) => (\n <div key={attachment.id} className=\"jk-pending-item\">\n <div className=\"jk-pending-item__thumb\">\n {isImageMimeType(attachment.mimeType) ? (\n <img src={attachment.uri} alt={attachment.fileName} />\n ) : (\n <span>{attachment.mimeType.startsWith(\"video/\") ? \"▶\" : \"📄\"}</span>\n )}\n </div>\n <div className=\"jk-pending-item__details\">\n <div className=\"jk-pending-item__name\">{attachment.fileName}</div>\n <div\n className={`jk-pending-item__status${\n attachment.status === \"error\"\n ? \" jk-pending-item__status--error\"\n : attachment.status === \"confirmed\"\n ? \" jk-pending-item__status--ready\"\n : \"\"\n }`}\n >\n {getStatusLabel(attachment, t)}\n </div>\n {attachment.status === \"uploading\" || attachment.status === \"confirming\" ? (\n <div className=\"jk-pending-item__progress\">\n <div\n className=\"jk-pending-item__progress-fill\"\n style={{ width: `${Math.max(attachment.progress, 8)}%` }}\n />\n </div>\n ) : null}\n </div>\n <div className=\"jk-pending-item__actions\">\n {attachment.status === \"error\" ? (\n <button type=\"button\" onClick={() => onRetry(attachment.id)}>\n {t.retryUpload}\n </button>\n ) : attachment.status === \"uploading\" || attachment.status === \"confirming\" ? (\n <div className=\"jk-spinner\" style={{ width: 16, height: 16 }} />\n ) : null}\n <button type=\"button\" onClick={() => onRemove(attachment.id)}>\n {t.cancel}\n </button>\n </div>\n </div>\n ))}\n </div>\n )\n}\n","import type { ChatMessage, JokkooApiClient, Translations } from \"@jokkoo/sdk-web\"\nimport { useEffect, useRef } from \"react\"\n\nimport { ActivityEvent } from \"./ActivityEvent\"\nimport { MessageBubble } from \"./MessageBubble\"\nimport { NewMessageIndicator } from \"./NewMessageIndicator\"\n\nexport interface MessageListProps {\n messages: ChatMessage[]\n apiClient: JokkooApiClient\n t: Translations\n isNewSupport: boolean\n isLoading: boolean\n isError: boolean\n isFetchingNextPage: boolean\n pendingNewMessages: number\n onLoadOlder: () => void\n onScrolledToBottom: () => void\n onScrolledAwayFromBottom: () => void\n onJumpToLatest: () => void\n}\n\nconst SCROLL_BOTTOM_THRESHOLD = 48\n\nexport function MessageList({\n messages,\n apiClient,\n t,\n isNewSupport,\n isLoading,\n isError,\n isFetchingNextPage,\n pendingNewMessages,\n onLoadOlder,\n onScrolledToBottom,\n onScrolledAwayFromBottom,\n onJumpToLatest,\n}: MessageListProps) {\n const listRef = useRef<HTMLDivElement>(null)\n const stickToBottomRef = useRef(true)\n\n useEffect(() => {\n if (!stickToBottomRef.current || !listRef.current) {\n return\n }\n listRef.current.scrollTop = listRef.current.scrollHeight\n }, [messages.length])\n\n const handleScroll = () => {\n const el = listRef.current\n if (!el || isNewSupport) {\n return\n }\n\n const distanceFromBottom = el.scrollHeight - el.scrollTop - el.clientHeight\n if (distanceFromBottom <= SCROLL_BOTTOM_THRESHOLD) {\n stickToBottomRef.current = true\n onScrolledToBottom()\n } else {\n stickToBottomRef.current = false\n onScrolledAwayFromBottom()\n }\n\n if (el.scrollTop < 40) {\n onLoadOlder()\n }\n }\n\n return (\n <div className=\"jk-conversation__body\">\n <div\n ref={listRef}\n className={`jk-messages${isNewSupport ? \" jk-messages--new\" : \"\"}`}\n onScroll={handleScroll}\n >\n {isFetchingNextPage ? (\n <div style={{ display: \"flex\", justifyContent: \"center\", padding: 8 }}>\n <div className=\"jk-spinner\" style={{ width: 18, height: 18 }} />\n </div>\n ) : null}\n\n {messages.length === 0 ? (\n isLoading ? (\n <div className=\"jk-empty\">\n <div className=\"jk-spinner\" />\n </div>\n ) : isError ? (\n <div className=\"jk-empty\">{t.unableToLoadMessages}</div>\n ) : null\n ) : (\n messages.map((item, index) => {\n if (item.sender === \"system\") {\n return <ActivityEvent key={item.id} text={item.text} timestamp={item.timestamp} />\n }\n\n const olderMessage = index > 0 ? messages[index - 1] : undefined\n const showAgentMeta = item.sender === \"agent\" && olderMessage?.sender !== \"agent\"\n\n return (\n <MessageBubble\n key={item.id}\n message={item}\n apiClient={apiClient}\n showAgentMeta={showAgentMeta}\n variant={isNewSupport && item.id === \"welcome\" ? \"welcome\" : \"default\"}\n />\n )\n })\n )}\n </div>\n\n {!isNewSupport ? (\n <NewMessageIndicator\n count={pendingNewMessages}\n t={t}\n bottomOffset={96}\n onPress={() => {\n stickToBottomRef.current = true\n if (listRef.current) {\n listRef.current.scrollTop = listRef.current.scrollHeight\n }\n onJumpToLatest()\n }}\n />\n ) : null}\n </div>\n )\n}\n","\nexport interface ActivityEventProps {\n text: string\n timestamp?: string\n}\n\nexport function ActivityEvent({ text, timestamp }: ActivityEventProps) {\n const trimmed = text.trim()\n if (trimmed.length === 0) {\n return null\n }\n\n return (\n <div className=\"jk-activity\">\n <div>{trimmed}</div>\n {timestamp ? <div className=\"jk-activity__time\">{timestamp}</div> : null}\n </div>\n )\n}\n","import {\n isVoiceMessageMetadata,\n type ChatMessage,\n type JokkooApiClient,\n} from \"@jokkoo/sdk-web\"\n\nimport { Avatar } from \"./Avatar\"\nimport { MessageAttachments } from \"./MessageAttachments\"\nimport { VoiceMessagePlayer } from \"./VoiceMessagePlayer\"\n\nexport interface MessageBubbleProps {\n message: ChatMessage\n apiClient: JokkooApiClient\n showAgentMeta?: boolean\n variant?: \"default\" | \"welcome\"\n}\n\nexport function MessageBubble({\n message,\n apiClient,\n showAgentMeta = true,\n variant = \"default\",\n}: MessageBubbleProps) {\n const isUser = message.sender === \"user\"\n const isVoiceMessage = isVoiceMessageMetadata(message.metadata)\n const voiceAttachment = message.attachments?.find((attachment) =>\n attachment.mimeType.startsWith(\"audio/\")\n )\n const voiceDurationMs =\n typeof message.metadata?.audioDurationMs === \"number\" ? message.metadata.audioDurationMs : 0\n\n const renderBody = () => {\n if (isVoiceMessage && voiceAttachment) {\n return (\n <VoiceMessagePlayer\n fileId={voiceAttachment.fileId}\n durationMs={voiceDurationMs}\n apiClient={apiClient}\n variant={isUser ? \"user\" : \"agent\"}\n />\n )\n }\n\n return (\n <>\n {message.text.trim().length > 0 ? message.text : null}\n {message.attachments && message.attachments.length > 0 ? (\n <MessageAttachments attachments={message.attachments} apiClient={apiClient} />\n ) : null}\n </>\n )\n }\n\n if (isUser) {\n return (\n <div className=\"jk-bubble-row jk-bubble-row--user\">\n <div className=\"jk-bubble jk-bubble--user\">{renderBody()}</div>\n <div className=\"jk-bubble__time\">{message.timestamp}</div>\n </div>\n )\n }\n\n if (variant === \"welcome\") {\n return (\n <div className=\"jk-bubble-row jk-bubble-row--agent\">\n {message.agentInitials ? (\n <Avatar initials={message.agentInitials} size={28} imageUrl={message.agentAvatarUrl} />\n ) : (\n <span style={{ width: 28 }} />\n )}\n <div className=\"jk-bubble jk-bubble--welcome\">{message.text}</div>\n </div>\n )\n }\n\n return (\n <div className=\"jk-bubble-row jk-bubble-row--agent\">\n {showAgentMeta && message.agentInitials ? (\n <Avatar initials={message.agentInitials} size={28} imageUrl={message.agentAvatarUrl} />\n ) : (\n <span style={{ width: 28 }} />\n )}\n <div className=\"jk-bubble-row__agent-body\">\n {showAgentMeta && message.agentName ? (\n <div className=\"jk-bubble-row__agent-name\">{message.agentName}</div>\n ) : null}\n <div className=\"jk-bubble jk-bubble--agent\">{renderBody()}</div>\n <div className=\"jk-bubble__time\">{message.timestamp}</div>\n </div>\n </div>\n )\n}\n","import { useState } from \"react\"\n\nexport interface AvatarProps {\n initials: string\n size?: number\n showUnreadIndicator?: boolean\n imageUrl?: string | null\n}\n\nexport function Avatar({\n initials,\n size = 40,\n showUnreadIndicator = false,\n imageUrl,\n}: AvatarProps) {\n const [imgError, setImgError] = useState(false)\n const showImage = Boolean(imageUrl) && !imgError\n const indicatorSize = Math.max(10, Math.round(size * 0.25))\n\n return (\n <div className=\"jk-avatar\">\n <div\n className=\"jk-avatar__circle\"\n style={{ width: size, height: size, fontSize: size * 0.34 }}\n >\n {showImage ? (\n <img\n className=\"jk-avatar__img\"\n src={imageUrl!}\n alt=\"\"\n onError={() => setImgError(true)}\n />\n ) : (\n initials\n )}\n </div>\n {showUnreadIndicator ? (\n <span\n className=\"jk-avatar__unread\"\n style={{ width: indicatorSize, height: indicatorSize }}\n />\n ) : null}\n </div>\n )\n}\n","import {\n canPreviewInApp,\n isImageMimeType,\n isVideoMimeType,\n type JokkooApiClient,\n} from \"@jokkoo/sdk-web\"\nimport type { MessageAttachment } from \"@jokkoo/sdk-web\"\nimport { useEffect, useState } from \"react\"\n\nfunction AttachmentDoc({\n attachment,\n onPress,\n}: {\n attachment: MessageAttachment\n onPress: () => void\n}) {\n return (\n <button type=\"button\" className=\"jk-attachments__doc\" onClick={onPress}>\n <div>{isVideoMimeType(attachment.mimeType) ? \"Video\" : \"Document\"}</div>\n <div className=\"jk-attachments__doc-name\">{attachment.fileName}</div>\n </button>\n )\n}\n\nfunction AttachmentRow({\n attachment,\n apiClient,\n onPress,\n}: {\n attachment: MessageAttachment\n apiClient: JokkooApiClient\n onPress: () => void\n}) {\n const [downloadUrl, setDownloadUrl] = useState<string | null>(null)\n\n useEffect(() => {\n if (!canPreviewInApp(attachment.mimeType)) {\n return\n }\n\n let cancelled = false\n void apiClient.getDownloadUrl(attachment.fileId).then((response) => {\n if (!cancelled) {\n setDownloadUrl(response.downloadUrl)\n }\n })\n\n return () => {\n cancelled = true\n }\n }, [apiClient, attachment.fileId, attachment.mimeType])\n\n if (isImageMimeType(attachment.mimeType)) {\n return (\n <button type=\"button\" onClick={onPress} style={{ padding: 0, background: \"none\", border: \"none\" }}>\n {downloadUrl ? (\n <img className=\"jk-attachments__img\" src={downloadUrl} alt={attachment.fileName} />\n ) : (\n <div className=\"jk-attachments__img\" style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"center\", background: \"var(--jk-color-surface)\" }}>\n <div className=\"jk-spinner\" />\n </div>\n )}\n </button>\n )\n }\n\n return <AttachmentDoc attachment={attachment} onPress={onPress} />\n}\n\nexport function MessageAttachments({\n attachments,\n apiClient,\n}: {\n attachments: MessageAttachment[]\n apiClient: JokkooApiClient\n}) {\n return (\n <div className=\"jk-attachments\">\n {attachments.map((attachment) => (\n <AttachmentRow\n key={attachment.fileId}\n attachment={attachment}\n apiClient={apiClient}\n onPress={() => {\n void apiClient.getDownloadUrl(attachment.fileId).then((response) => {\n window.open(response.downloadUrl, \"_blank\", \"noopener,noreferrer\")\n })\n }}\n />\n ))}\n </div>\n )\n}\n","import { formatAudioDuration, type JokkooApiClient } from \"@jokkoo/sdk-web\"\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\"\n\nimport { PauseIcon, PlayIcon } from \"../icons\"\nimport { VoiceWaveform } from \"./VoiceWaveform\"\n\nexport interface VoiceMessagePlayerProps {\n fileId: string\n durationMs: number\n apiClient: JokkooApiClient\n variant: \"user\" | \"agent\"\n}\n\ninterface PlayerColors {\n primary: string\n secondary: string\n buttonBackground: string\n}\n\nfunction VoiceMessagePlayerReady({\n downloadUrl,\n durationMs,\n colors,\n}: {\n downloadUrl: string\n durationMs: number\n colors: PlayerColors\n}) {\n const audioRef = useRef<HTMLAudioElement | null>(null)\n const [playing, setPlaying] = useState(false)\n const [currentMs, setCurrentMs] = useState(0)\n const [totalMs, setTotalMs] = useState(durationMs)\n\n useEffect(() => {\n const audio = new Audio(downloadUrl)\n audioRef.current = audio\n\n const onTime = () => setCurrentMs(audio.currentTime * 1000)\n const onMeta = () => {\n if (audio.duration && Number.isFinite(audio.duration)) {\n setTotalMs(audio.duration * 1000)\n }\n }\n const onEnded = () => {\n setPlaying(false)\n setCurrentMs(0)\n }\n\n audio.addEventListener(\"timeupdate\", onTime)\n audio.addEventListener(\"loadedmetadata\", onMeta)\n audio.addEventListener(\"ended\", onEnded)\n\n return () => {\n audio.pause()\n audio.removeEventListener(\"timeupdate\", onTime)\n audio.removeEventListener(\"loadedmetadata\", onMeta)\n audio.removeEventListener(\"ended\", onEnded)\n audioRef.current = null\n }\n }, [downloadUrl])\n\n const toggle = useCallback(async () => {\n const audio = audioRef.current\n if (!audio) {\n return\n }\n\n if (playing) {\n audio.pause()\n setPlaying(false)\n return\n }\n\n if (audio.currentTime >= audio.duration && audio.duration > 0) {\n audio.currentTime = 0\n }\n\n await audio.play()\n setPlaying(true)\n }, [playing])\n\n const progress = totalMs > 0 ? currentMs / totalMs : 0\n\n return (\n <div className=\"jk-voice-player\">\n <button\n type=\"button\"\n className=\"jk-voice-player__btn\"\n style={{ background: colors.buttonBackground, color: colors.primary }}\n aria-label={playing ? \"Pause voice message\" : \"Play voice message\"}\n onClick={() => {\n void toggle()\n }}\n >\n {playing ? (\n <PauseIcon color={colors.primary} size={16} />\n ) : (\n <PlayIcon color={colors.primary} size={16} />\n )}\n </button>\n <div className=\"jk-voice-player__content\">\n <VoiceWaveform\n progress={progress}\n activeColor={colors.primary}\n inactiveColor={colors.secondary}\n height={22}\n />\n <span className=\"jk-voice-player__duration\" style={{ color: colors.secondary }}>\n {formatAudioDuration(currentMs)} / {formatAudioDuration(totalMs)}\n </span>\n </div>\n </div>\n )\n}\n\nexport function VoiceMessagePlayer({\n fileId,\n durationMs,\n apiClient,\n variant,\n}: VoiceMessagePlayerProps) {\n const [downloadUrl, setDownloadUrl] = useState<string | null>(null)\n const [isLoadingUrl, setIsLoadingUrl] = useState(true)\n\n useEffect(() => {\n let cancelled = false\n\n void (async () => {\n try {\n const response = await apiClient.getDownloadUrl(fileId)\n if (!cancelled) {\n setDownloadUrl(response.downloadUrl)\n }\n } catch {\n if (!cancelled) {\n setDownloadUrl(null)\n }\n } finally {\n if (!cancelled) {\n setIsLoadingUrl(false)\n }\n }\n })()\n\n return () => {\n cancelled = true\n }\n }, [apiClient, fileId])\n\n const colors = useMemo<PlayerColors>(() => {\n if (variant === \"user\") {\n return {\n primary: \"#ffffff\",\n secondary: \"rgba(255, 255, 255, 0.5)\",\n buttonBackground: \"rgba(255, 255, 255, 0.18)\",\n }\n }\n\n return {\n primary: \"var(--jk-color-text)\",\n secondary: \"var(--jk-color-text-secondary)\",\n buttonBackground: \"var(--jk-color-background)\",\n }\n }, [variant])\n\n if (isLoadingUrl) {\n return (\n <div className=\"jk-voice-player\">\n <div className=\"jk-voice-player__btn\" style={{ background: colors.buttonBackground }}>\n <div className=\"jk-spinner\" style={{ width: 16, height: 16 }} />\n </div>\n <div className=\"jk-voice-player__content\">\n <VoiceWaveform progress={0} activeColor={colors.primary} inactiveColor={colors.secondary} height={22} />\n <span className=\"jk-voice-player__duration\" style={{ color: colors.secondary }}>\n {formatAudioDuration(0)} / {formatAudioDuration(durationMs)}\n </span>\n </div>\n </div>\n )\n }\n\n if (!downloadUrl) {\n return (\n <div className=\"jk-voice-player\">\n <span style={{ color: colors.secondary, fontSize: 12 }}>Unable to load voice message</span>\n </div>\n )\n }\n\n return <VoiceMessagePlayerReady downloadUrl={downloadUrl} durationMs={durationMs} colors={colors} />\n}\n","import { createPlaybackBarHeights } from \"@jokkoo/sdk-web\"\nimport { useMemo } from \"react\"\n\nconst DEFAULT_BAR_COUNT = 32\n\nexport interface VoiceWaveformProps {\n barCount?: number\n progress?: number\n levels?: number[]\n activeColor: string\n inactiveColor: string\n height?: number\n}\n\nexport function VoiceWaveform({\n barCount = DEFAULT_BAR_COUNT,\n progress = 0,\n levels,\n activeColor,\n inactiveColor,\n height = 24,\n}: VoiceWaveformProps) {\n const playbackHeights = useMemo(() => createPlaybackBarHeights(barCount, 3), [barCount])\n const clampedProgress = Math.max(0, Math.min(1, progress))\n const isLiveMode = levels !== undefined\n\n return (\n <div className=\"jk-waveform\" style={{ height }}>\n {isLiveMode\n ? levels.map((level, index) => (\n <span\n key={`live-${index}`}\n className=\"jk-waveform__bar\"\n style={{\n height: Math.max(3, level * height),\n backgroundColor: activeColor,\n }}\n />\n ))\n : playbackHeights.map((baseHeight, index) => {\n const position = barCount <= 1 ? 0 : index / (barCount - 1)\n const isActive = position <= clampedProgress\n return (\n <span\n key={`play-${index}`}\n className=\"jk-waveform__bar\"\n style={{\n height: Math.max(3, baseHeight * height),\n backgroundColor: isActive ? activeColor : inactiveColor,\n }}\n />\n )\n })}\n </div>\n )\n}\n","import type { Translations } from \"@jokkoo/sdk-web\"\n\nimport { ArrowDownIcon } from \"../icons\"\n\nexport interface NewMessageIndicatorProps {\n count: number\n t: Translations\n onPress: () => void\n bottomOffset?: number\n}\n\nfunction formatBadgeLabel(count: number): string {\n if (count > 99) {\n return \"99+\"\n }\n return String(count)\n}\n\nexport function NewMessageIndicator({\n count,\n t,\n onPress,\n bottomOffset = 88,\n}: NewMessageIndicatorProps) {\n if (count <= 0) {\n return null\n }\n\n return (\n <button\n type=\"button\"\n className=\"jk-new-msg-indicator\"\n style={{ bottom: bottomOffset }}\n aria-label={t.newMessageIndicator(count)}\n onClick={onPress}\n >\n <ArrowDownIcon color=\"currentColor\" size={20} />\n <span className=\"jk-new-msg-indicator__badge\">{formatBadgeLabel(count)}</span>\n </button>\n )\n}\n","import type { Translations } from \"@jokkoo/sdk-web\"\n\nimport { ChatIcon, CheckCircleIcon } from \"../icons\"\n\nexport interface ResolvedBannerProps {\n t: Translations\n onNewRequest: () => void\n canReplyInConversation?: boolean\n}\n\nexport function ResolvedBanner({\n t,\n onNewRequest,\n canReplyInConversation = false,\n}: ResolvedBannerProps) {\n return (\n <div className=\"jk-resolved-banner\">\n <div className=\"jk-resolved-banner__row\">\n <span className=\"jk-resolved-banner__icon\">\n <CheckCircleIcon color=\"currentColor\" size={14} />\n </span>\n <span>\n {canReplyInConversation ? t.discussionClosedCanReply : t.ticketResolved}\n </span>\n </div>\n {!canReplyInConversation ? (\n <button\n type=\"button\"\n className=\"jk-resolved-banner__cta\"\n aria-label={t.newSupportRequest}\n onClick={onNewRequest}\n >\n <ChatIcon color=\"currentColor\" size={16} />\n {t.newSupportRequest}\n </button>\n ) : null}\n </div>\n )\n}\n","import type { Translations } from \"@jokkoo/sdk-web\"\nimport { useCallback, useState } from \"react\"\n\nconst RATING_OPTIONS = [\n { score: 1, emoji: \"😞\", labelKey: \"ratingVeryUnsatisfied\" as const },\n { score: 2, emoji: \"😟\", labelKey: \"ratingUnsatisfied\" as const },\n { score: 3, emoji: \"😐\", labelKey: \"ratingNeutral\" as const },\n { score: 4, emoji: \"😊\", labelKey: \"ratingSatisfied\" as const },\n { score: 5, emoji: \"😄\", labelKey: \"ratingVerySatisfied\" as const },\n]\n\nexport interface SatisfactionRatingProps {\n t: Translations\n message?: string\n onSubmit: (score: number) => Promise<void>\n}\n\nexport function SatisfactionRating({ t, message, onSubmit }: SatisfactionRatingProps) {\n const [selectedScore, setSelectedScore] = useState<number | null>(null)\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [isSubmitted, setIsSubmitted] = useState(false)\n\n const handleSelect = useCallback(\n async (score: number) => {\n if (isSubmitting || isSubmitted) {\n return\n }\n\n setSelectedScore(score)\n setIsSubmitting(true)\n\n try {\n await onSubmit(score)\n setIsSubmitted(true)\n } catch {\n setSelectedScore(null)\n } finally {\n setIsSubmitting(false)\n }\n },\n [isSubmitted, isSubmitting, onSubmit]\n )\n\n if (isSubmitted) {\n return (\n <div className=\"jk-satisfaction\">\n <div className=\"jk-satisfaction__card\">\n <p className=\"jk-satisfaction__title\">{t.thankYouForRating}</p>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"jk-satisfaction\">\n <div className=\"jk-satisfaction__card\">\n <p className=\"jk-satisfaction__title\">{message ?? t.rateConversation}</p>\n {!message ? (\n <p className=\"jk-satisfaction__desc\">{t.rateConversationDescription}</p>\n ) : null}\n <div className=\"jk-satisfaction__row\">\n {RATING_OPTIONS.map((option) => (\n <button\n key={option.score}\n type=\"button\"\n className={`jk-satisfaction__btn${selectedScore === option.score ? \" jk-satisfaction__btn--selected\" : \"\"}`}\n aria-label={t[option.labelKey]}\n disabled={isSubmitting}\n onClick={() => {\n void handleSelect(option.score)\n }}\n >\n {option.emoji}\n </button>\n ))}\n </div>\n {isSubmitting ? <div className=\"jk-spinner\" style={{ margin: \"4px auto 0\" }} /> : null}\n </div>\n </div>\n )\n}\n","import { formatAudioDuration, type Translations } from \"@jokkoo/sdk-web\"\n\nimport { CloseIcon, SendIcon } from \"../icons\"\nimport { VoiceWaveform } from \"./VoiceWaveform\"\n\nexport interface VoiceRecordingOverlayProps {\n t: Translations\n durationMs: number\n meteringLevels: number[]\n isUploading: boolean\n uploadProgress: number\n onCancel: () => void\n onSend: () => void\n}\n\nexport function VoiceRecordingOverlay({\n t,\n durationMs,\n meteringLevels,\n isUploading,\n uploadProgress,\n onCancel,\n onSend,\n}: VoiceRecordingOverlayProps) {\n return (\n <div className=\"jk-voice-overlay\">\n <div className=\"jk-voice-overlay__panel\">\n <button\n type=\"button\"\n className=\"jk-input-shell__icon\"\n aria-label={t.cancelRecording}\n disabled={isUploading}\n onClick={onCancel}\n >\n <CloseIcon color=\"currentColor\" size={14} />\n </button>\n\n {isUploading ? (\n <div className=\"jk-voice-overlay__uploading\">\n <div className=\"jk-spinner\" style={{ width: 16, height: 16 }} />\n {`${t.uploadingAttachment} ${uploadProgress}%`}\n </div>\n ) : (\n <>\n <div className=\"jk-voice-overlay__rec\">\n <span className=\"jk-voice-overlay__dot\" />\n {formatAudioDuration(durationMs)}\n </div>\n <VoiceWaveform\n levels={meteringLevels}\n activeColor=\"var(--jk-color-primary)\"\n inactiveColor=\"rgba(28,28,28,0.2)\"\n height={28}\n />\n </>\n )}\n\n <button\n type=\"button\"\n className=\"jk-input-shell__icon\"\n aria-label={t.sendRecording}\n disabled={isUploading}\n onClick={onSend}\n >\n {isUploading ? (\n <div className=\"jk-spinner\" style={{ width: 16, height: 16 }} />\n ) : (\n <SendIcon color=\"currentColor\" size={22} />\n )}\n </button>\n </div>\n </div>\n )\n}\n","\nimport { useJokkooContext } from \"../context/JokkooProvider\"\nimport { ChatIcon } from \"../icons\"\n\nexport type FloatingButtonPosition = \"bottom-right\" | \"bottom-left\"\n\nexport interface FloatingButtonProps {\n position?: FloatingButtonPosition\n label?: string\n onClick?: () => void\n showBadge?: boolean\n className?: string\n}\n\nfunction formatBadgeLabel(count: number): string {\n if (count > 99) {\n return \"99+\"\n }\n return String(count)\n}\n\nexport function FloatingButton({\n position = \"bottom-right\",\n label,\n onClick,\n showBadge = true,\n className,\n}: FloatingButtonProps) {\n const { t, openChat, unreadCount } = useJokkooContext()\n const displayLabel = label ?? t.newSupportRequest\n const badgeVisible = showBadge && unreadCount > 0\n\n return (\n <button\n type=\"button\"\n className={`jk-floating-btn jk-floating-btn--${position}${className ? ` ${className}` : \"\"}`}\n aria-label={\n badgeVisible\n ? `Open Jokkoo support, ${unreadCount} unread conversations`\n : \"Open Jokkoo support\"\n }\n onClick={onClick ?? openChat}\n >\n <span className=\"jk-floating-btn__icon\">\n <ChatIcon color=\"currentColor\" size={20} />\n </span>\n <span className=\"jk-floating-btn__label\">{displayLabel}</span>\n {badgeVisible ? (\n <span className=\"jk-floating-btn__badge\">{formatBadgeLabel(unreadCount)}</span>\n ) : null}\n </button>\n )\n}\n","import { NEW_CONVERSATION_ID } from \"@jokkoo/sdk-web\"\nimport { useCallback, type UIEvent } from \"react\"\n\nimport { useJokkooContext } from \"../context/JokkooProvider\"\nimport { useConversations } from \"../hooks/useConversations\"\nimport { ChatIcon } from \"../icons\"\nimport { RequestCard } from \"./RequestCard\"\n\nexport function RequestListScreen() {\n const { t, locale, navigateTo, isConversationUnread, apiClient } = useJokkooContext()\n const {\n conversations,\n fetchNextPage,\n hasNextPage,\n isFetchingNextPage,\n isLoading,\n isError,\n refetch,\n } = useConversations()\n\n const activeCount = conversations.filter((conversation) => conversation.status === \"open\").length\n\n const handleScroll = useCallback(\n (event: UIEvent<HTMLDivElement>) => {\n const target = event.currentTarget\n const nearBottom = target.scrollHeight - target.scrollTop - target.clientHeight < 80\n if (nearBottom && hasNextPage && !isFetchingNextPage) {\n fetchNextPage()\n }\n },\n [fetchNextPage, hasNextPage, isFetchingNextPage]\n )\n\n return (\n <div className=\"jk-request-list\">\n <div className=\"jk-request-list__header\">\n <h2 className=\"jk-request-list__title\">{t.supportCenter}</h2>\n <p className=\"jk-request-list__subtitle\">{t.activeConversation(activeCount)}</p>\n <p className=\"jk-request-list__section\">{t.myRequests}</p>\n </div>\n\n <div className=\"jk-request-list__items\" onScroll={handleScroll}>\n {conversations.length === 0 ? (\n isLoading ? (\n <div className=\"jk-empty\">\n <div className=\"jk-spinner\" />\n </div>\n ) : isError ? (\n <div className=\"jk-empty\">\n <span>{t.unableToLoadConversations}</span>\n <button type=\"button\" className=\"jk-empty__retry\" onClick={refetch}>\n {t.retry}\n </button>\n </div>\n ) : (\n <div className=\"jk-empty\">{t.noConversationsYet}</div>\n )\n ) : (\n conversations.map((item) => (\n <RequestCard\n key={item.id}\n conversation={item}\n t={t}\n locale={locale}\n isUnread={isConversationUnread(item.id)}\n onPress={(conversationId) => navigateTo({ name: \"conversation\", conversationId })}\n apiClient={apiClient}\n />\n ))\n )}\n {isFetchingNextPage ? (\n <div className=\"jk-empty\" style={{ paddingTop: 16 }}>\n <div className=\"jk-spinner\" />\n </div>\n ) : null}\n </div>\n\n <div className=\"jk-request-list__footer\">\n <button\n type=\"button\"\n className=\"jk-floating-btn\"\n style={{ position: \"static\" }}\n aria-label={t.newSupportRequest}\n onClick={() =>\n navigateTo({ name: \"conversation\", conversationId: NEW_CONVERSATION_ID })\n }\n >\n <span className=\"jk-floating-btn__icon\">\n <ChatIcon color=\"currentColor\" size={20} />\n </span>\n <span className=\"jk-floating-btn__label\">{t.newSupportRequest}</span>\n </button>\n </div>\n </div>\n )\n}\n","import type { JokkooApiClient, Conversation, Translations } from \"@jokkoo/sdk-web\"\nimport {\n formatRelativeTimestamp,\n getAgentInitials,\n getConversationDisplayName,\n} from \"@jokkoo/sdk-web\"\n\nimport { ClockIcon } from \"../icons\"\nimport { Avatar } from \"./Avatar\"\nimport { StatusBadge } from \"./StatusBadge\"\n\nexport interface RequestCardProps {\n conversation: Conversation\n t: Translations\n locale?: string\n isUnread?: boolean\n onPress: (conversationId: number) => void\n apiClient: JokkooApiClient\n}\n\nexport function RequestCard({\n conversation,\n t,\n locale,\n isUnread = false,\n onPress,\n apiClient,\n}: RequestCardProps) {\n const title = getConversationDisplayName(conversation, t)\n const avatarInitials = getAgentInitials(conversation.assignedAgentName, \"SP\")\n const avatarUrl = conversation.assignedAgentAvatarUrl\n ? apiClient.resolveUrl(conversation.assignedAgentAvatarUrl)\n : null\n\n return (\n <button\n type=\"button\"\n className={`jk-request-card${isUnread ? \" jk-request-card--unread\" : \"\"}`}\n aria-label={\n isUnread\n ? `${title}, ${conversation.lastMessageText ?? t.noMessagesYet}, unread`\n : `${title}, ${conversation.lastMessageText ?? t.noMessagesYet}`\n }\n onClick={() => onPress(conversation.id)}\n >\n <Avatar\n initials={avatarInitials}\n size={48}\n showUnreadIndicator={isUnread}\n imageUrl={avatarUrl}\n />\n <div className=\"jk-request-card__content\">\n <div className=\"jk-request-card__row\">\n <p className=\"jk-request-card__title\">{title}</p>\n <StatusBadge status={conversation.status} t={t} />\n </div>\n <p\n className={`jk-request-card__preview${isUnread ? \" jk-request-card__preview--unread\" : \"\"}`}\n >\n {conversation.lastMessageText ?? t.noMessagesYet}\n </p>\n <div className=\"jk-request-card__time\">\n <ClockIcon color=\"currentColor\" size={11} />\n {formatRelativeTimestamp(conversation.updatedAt, {\n locale,\n nowLabel: t.now,\n })}\n </div>\n </div>\n </button>\n )\n}\n","\nimport { CloseIcon, ExpandIcon } from \"../icons\"\n\nexport interface PanelHeaderProps {\n variant?: \"light\" | \"dark\"\n onExpand: () => void\n onClose: () => void\n expandLabel?: string\n closeLabel?: string\n}\n\nexport function PanelHeader({\n variant = \"light\",\n onExpand,\n onClose,\n expandLabel = \"Expand\",\n closeLabel = \"Close\",\n}: PanelHeaderProps) {\n const dark = variant === \"dark\"\n\n return (\n <div className={`jk-panel-header${dark ? \" jk-panel-header--dark\" : \"\"}`}>\n <button\n type=\"button\"\n className={`jk-icon-btn${dark ? \" jk-icon-btn--dark\" : \"\"}`}\n aria-label={expandLabel}\n onClick={onExpand}\n >\n <ExpandIcon color=\"currentColor\" size={14} />\n </button>\n <button\n type=\"button\"\n className={`jk-icon-btn${dark ? \" jk-icon-btn--dark\" : \"\"}`}\n aria-label={closeLabel}\n onClick={onClose}\n >\n <CloseIcon color=\"currentColor\" size={14} />\n </button>\n </div>\n )\n}\n","import { type ReactNode } from \"react\"\n\nimport { useJokkooContext } from \"../context/JokkooProvider\"\nimport { PanelHeader } from \"./PanelHeader\"\n\nexport interface WidgetPanelProps {\n children: ReactNode\n headerVariant?: \"light\" | \"dark\"\n}\n\nexport function WidgetPanel({ children, headerVariant = \"light\" }: WidgetPanelProps) {\n const { isExpanded, toggleExpanded, closeChat } = useJokkooContext()\n\n return (\n <div className={`jk-panel${isExpanded ? \" jk-panel--expanded\" : \"\"}`} role=\"dialog\" aria-modal>\n <PanelHeader\n variant={headerVariant}\n onExpand={toggleExpanded}\n onClose={closeChat}\n />\n <div className=\"jk-panel-body\">{children}</div>\n </div>\n )\n}\n","import { useJokkooContext } from \"../context/JokkooProvider\"\nimport { useRealtimeConversations } from \"../hooks/useRealtimeConversations\"\nimport { ConversationScreen } from \"./ConversationScreen\"\nimport { FloatingButton, type FloatingButtonPosition } from \"./FloatingButton\"\nimport { RequestListScreen } from \"./RequestListScreen\"\nimport { WidgetPanel } from \"./WidgetPanel\"\n\nexport interface JokkooWidgetProps {\n /** Position of the floating launcher button when the panel is closed */\n position?: FloatingButtonPosition\n /** Optional custom label for the floating launcher */\n launcherLabel?: string\n}\n\n/**\n * Complete Jokkoo support widget: floating launcher + slide-up panel with\n * request list and conversation screens.\n */\nexport function JokkooWidget({ position = \"bottom-right\", launcherLabel }: JokkooWidgetProps) {\n const { isChatOpen, currentScreen } = useJokkooContext()\n\n useRealtimeConversations()\n\n const headerVariant = currentScreen.name === \"conversation\" ? \"dark\" : \"light\"\n\n if (!isChatOpen) {\n return <FloatingButton position={position} label={launcherLabel} />\n }\n\n return (\n <WidgetPanel headerVariant={headerVariant}>\n {currentScreen.name === \"requestList\" ? (\n <RequestListScreen />\n ) : (\n <ConversationScreen\n key={currentScreen.conversationId}\n conversationId={currentScreen.conversationId}\n />\n )}\n </WidgetPanel>\n )\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\"\nimport type { SendMessagePayload } from \"@jokkoo/sdk-web\"\n\nimport { useJokkooContext } from \"../context/JokkooProvider\"\nimport { jokkooQueryKeys } from \"./query-keys\"\n\nexport function useSendMessage() {\n const { apiClient } = useJokkooContext()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: (payload: SendMessagePayload) => apiClient.sendMessage(payload),\n onSuccess: (message) => {\n void queryClient.invalidateQueries({ queryKey: jokkooQueryKeys.conversations })\n void queryClient.invalidateQueries({\n queryKey: jokkooQueryKeys.messages(message.conversationId),\n })\n },\n })\n}\n","import { useJokkooContext } from \"../context/JokkooProvider\"\n\nexport function useUnreadCount(): number {\n return useJokkooContext().unreadCount\n}\n"],"mappings":"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","names":["import_sdk_web","import_react","import_sdk_web","import_react_query","import_sdk_web","import_react","import_react","import_react_query","import_sdk_web","import_react","import_react_query","import_react_query","import_react","DEFAULT_PAGE_SIZE","import_sdk_web","import_react","import_react_query","import_sdk_web","import_react","DEFAULT_PAGE_SIZE","import_react_query","import_sdk_web","import_react","import_sdk_web","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_sdk_web","import_sdk_web","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_sdk_web","import_react","import_jsx_runtime","import_sdk_web","import_react","import_jsx_runtime","import_sdk_web","import_react","import_sdk_web","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_sdk_web","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","formatBadgeLabel","import_sdk_web","import_react","import_sdk_web","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react_query"]}