@arbidocs/blocks 0.5.43 → 0.5.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -0
- package/dist/{ConnectedNativeDocxComparison-52KQKJGY.js → ConnectedNativeDocxComparison-4DYPHNY2.js} +6 -6
- package/dist/{ConnectedNativeDocxComparison-52KQKJGY.js.map → ConnectedNativeDocxComparison-4DYPHNY2.js.map} +1 -1
- package/dist/{ConnectedNativeDocxComparison-UVLZGS2V.cjs → ConnectedNativeDocxComparison-OZE2SPNU.cjs} +7 -7
- package/dist/{ConnectedNativeDocxComparison-UVLZGS2V.cjs.map → ConnectedNativeDocxComparison-OZE2SPNU.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxEditor-BRBL3MOV.js → ConnectedNativeDocxEditor-F3EHJKDI.js} +5 -5
- package/dist/{ConnectedNativeDocxEditor-BRBL3MOV.js.map → ConnectedNativeDocxEditor-F3EHJKDI.js.map} +1 -1
- package/dist/{ConnectedNativeDocxEditor-KHR5I7W6.cjs → ConnectedNativeDocxEditor-MUM6YRPY.cjs} +7 -7
- package/dist/{ConnectedNativeDocxEditor-KHR5I7W6.cjs.map → ConnectedNativeDocxEditor-MUM6YRPY.cjs.map} +1 -1
- package/dist/{ConnectedStreamedWordArtifact-DSVFI7BX.cjs → ConnectedStreamedWordArtifact-F6M766FG.cjs} +7 -7
- package/dist/ConnectedStreamedWordArtifact-F6M766FG.cjs.map +1 -0
- package/dist/{ConnectedStreamedWordArtifact-EQUE6WT5.js → ConnectedStreamedWordArtifact-XUWLRRG5.js} +6 -6
- package/dist/{ConnectedStreamedWordArtifact-EQUE6WT5.js.map → ConnectedStreamedWordArtifact-XUWLRRG5.js.map} +1 -1
- package/dist/WorkspaceTableView-2CGEO5KK.cjs +1 -1
- package/dist/WorkspaceTableView-3ARFQYNO.js +1 -1
- package/dist/agents/index.cjs +326 -326
- package/dist/agents/index.js +4 -4
- package/dist/calls/index.cjs +73 -696
- package/dist/calls/index.cjs.map +1 -1
- package/dist/calls/index.js +10 -666
- package/dist/calls/index.js.map +1 -1
- package/dist/{chunk-3YZ3RUSB.cjs → chunk-3GHFTAOV.cjs} +4 -4
- package/dist/{chunk-3YZ3RUSB.cjs.map → chunk-3GHFTAOV.cjs.map} +1 -1
- package/dist/{chunk-6AJJJ5HR.cjs → chunk-5R256EMF.cjs} +671 -3
- package/dist/chunk-5R256EMF.cjs.map +1 -0
- package/dist/{chunk-EFDZRAW6.js → chunk-CG7EYB3J.js} +3 -3
- package/dist/{chunk-EFDZRAW6.js.map → chunk-CG7EYB3J.js.map} +1 -1
- package/dist/{chunk-YAGSGBVM.js → chunk-EY4IEOW3.js} +3 -3
- package/dist/{chunk-YAGSGBVM.js.map → chunk-EY4IEOW3.js.map} +1 -1
- package/dist/{chunk-YD3RN2FY.cjs → chunk-F72ZD5Q2.cjs} +3 -3
- package/dist/{chunk-YD3RN2FY.cjs.map → chunk-F72ZD5Q2.cjs.map} +1 -1
- package/dist/{chunk-E3IEZMRK.cjs → chunk-FKFGP7MQ.cjs} +18 -18
- package/dist/{chunk-E3IEZMRK.cjs.map → chunk-FKFGP7MQ.cjs.map} +1 -1
- package/dist/{chunk-WAIHNFUH.js → chunk-G5JENSLN.js} +3 -3
- package/dist/{chunk-WAIHNFUH.js.map → chunk-G5JENSLN.js.map} +1 -1
- package/dist/{chunk-O3MRE2HL.cjs → chunk-GUV63FUC.cjs} +11 -11
- package/dist/{chunk-O3MRE2HL.cjs.map → chunk-GUV63FUC.cjs.map} +1 -1
- package/dist/{chunk-REHG7VRQ.js → chunk-H6UK6LGL.js} +4 -4
- package/dist/{chunk-REHG7VRQ.js.map → chunk-H6UK6LGL.js.map} +1 -1
- package/dist/{chunk-75Z5AUMM.js → chunk-JS7KJRKG.js} +3 -3
- package/dist/{chunk-75Z5AUMM.js.map → chunk-JS7KJRKG.js.map} +1 -1
- package/dist/{chunk-TPNLYQD2.cjs → chunk-PV5A5SAC.cjs} +5 -5
- package/dist/{chunk-TPNLYQD2.cjs.map → chunk-PV5A5SAC.cjs.map} +1 -1
- package/dist/{chunk-K53QRFPJ.cjs → chunk-QPDQYZIR.cjs} +4 -4
- package/dist/{chunk-K53QRFPJ.cjs.map → chunk-QPDQYZIR.cjs.map} +1 -1
- package/dist/{chunk-UZVXVTTB.cjs → chunk-QWSAJNQE.cjs} +9 -9
- package/dist/{chunk-UZVXVTTB.cjs.map → chunk-QWSAJNQE.cjs.map} +1 -1
- package/dist/{chunk-2QDNQM63.cjs → chunk-T5BCPKU3.cjs} +3 -3
- package/dist/{chunk-2QDNQM63.cjs.map → chunk-T5BCPKU3.cjs.map} +1 -1
- package/dist/{chunk-X7CXCEGO.js → chunk-T6KAZPOZ.js} +3 -3
- package/dist/{chunk-X7CXCEGO.js.map → chunk-T6KAZPOZ.js.map} +1 -1
- package/dist/{chunk-4U4NXFV5.js → chunk-TKTNXFAB.js} +666 -9
- package/dist/chunk-TKTNXFAB.js.map +1 -0
- package/dist/{chunk-FOIDBAZB.js → chunk-TOP5BMS7.js} +3 -3
- package/dist/{chunk-FOIDBAZB.js.map → chunk-TOP5BMS7.js.map} +1 -1
- package/dist/{chunk-7CHI36EP.js → chunk-VE6DHRXD.js} +3 -3
- package/dist/{chunk-7CHI36EP.js.map → chunk-VE6DHRXD.js.map} +1 -1
- package/dist/connect/docx.cjs +9 -9
- package/dist/connect/docx.js +5 -5
- package/dist/connect/index.cjs +1957 -774
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/index.d.ts +1 -0
- package/dist/connect/index.js +1667 -487
- package/dist/connect/index.js.map +1 -1
- package/dist/connect/viewer.cjs +3 -3
- package/dist/connect/viewer.js +3 -3
- package/dist/connection/ConnectedFilterDropdown.d.ts +6 -0
- package/dist/connection/conversation/ConnectedConversation.d.ts +7 -9
- package/dist/connection/conversation/ConnectedConversationPage.d.ts +30 -0
- package/dist/connection/conversation/SemanticSearchButton.d.ts +12 -0
- package/dist/connection/files/imports/ConnectedAccountsImport.d.ts +16 -0
- package/dist/connection/files/imports/DriveImportPanel.d.ts +10 -0
- package/dist/connection/files/imports/EmailImportPanel.d.ts +21 -0
- package/dist/connection/files/imports/ImportHandoff.d.ts +24 -0
- package/dist/connection/files/imports/useDriveSyncTrigger.d.ts +11 -0
- package/dist/connection/files/imports/useEmailSyncTrigger.d.ts +11 -0
- package/dist/connection/files/imports/useImportHandoff.d.ts +20 -0
- package/dist/connection/files/index.d.ts +1 -0
- package/dist/facts/index.cjs +55 -55
- package/dist/facts/index.js +3 -3
- package/dist/index.cjs +384 -384
- package/dist/index.js +5 -5
- package/dist/settings/index.cjs +1 -1
- package/dist/settings/index.js +1 -1
- package/dist/workflow-canvas/index.cjs +17 -17
- package/dist/workflow-canvas/index.js +4 -4
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +5 -5
- package/dist/ConnectedStreamedWordArtifact-DSVFI7BX.cjs.map +0 -1
- package/dist/chunk-4U4NXFV5.js.map +0 -1
- package/dist/chunk-6AJJJ5HR.cjs.map +0 -1
package/dist/calls/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/calls/connected/ConnectedIncomingCall.tsx","../../src/calls/connected/ConnectedCallLayer.tsx","../../src/calls/connected/StartCallButton.tsx","../../src/calls/connected/call-people.ts","../../src/calls/connected/CallPeoplePicker.tsx","../../src/calls/connected/ThreadCallButton.tsx","../../src/calls/connected/GroupCallButton.tsx","../../src/calls/connected/DmCallButton.tsx","../../src/calls/connected/NewCallChip.tsx","../../src/calls/connected/ScheduleCallButton.tsx","../../src/calls/connected/MeetingThreadTranscriptAction.tsx","../../src/calls/connected/MeetingThreadRecordingsAction.tsx","../../src/calls/connected/ConnectedConversationCallActions.tsx","../../src/calls/connected/ChatCallCard.tsx","../../src/calls/connected/ConnectedCallChatHistory.tsx"],"names":["useEffect","callSession","useArbi","useCallSession","useState","useRingtoneMuted","useRingtone","acceptRing","jsx","IncomingCallCard","CallUserPill","declineRing","lazy","useCallsEnabled","jsxs","Fragment","Suspense","useCanHostCalls","Tooltip","TooltipTrigger","Button","cn","Phone","TooltipContent","getUserDisplayName","isAgent","Checkbox","Mail","UserPlus","useBlocksEnvironment","useRevokeCallInviteLink","useCallInviteLinks","X","useCreateContact","useConnectedWorkspace","useWorkspaces","usePeople","usePeopleSearch","useMemo","added","ArbiApiError","refusalReason","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","Input","DialogFooter","useConnectedConversations","threadLiveCallId","openCall","startThreadCall","chatLiveCallId","startChatCall","userDisplayName","startDmCall","DmInviteChip","startContactsCall","contactsCallTitle","useConversationItems","requestCalendarComposer","CalendarPlus","useCall","useWorkspaceUsers","threadTranscriptLines","SaveTranscriptToThread","usePendingRecording","HeaderAction","Disc","RecordingsList","useArbiSessionState","useConversationData","useMeetingThreadMessages","isCallLive","formatCallDuration","PhoneOff","chats","hasRecordingTranscript","chatTranscriptRef","useRecordingWindows","supersededTranscriptLines","sortTranscriptMessages","transcriptRuns","TranscriptEntry","useProvisionalSpeakers","CallConversationEmpty","ConversationFilter","ProvisionalSpeakers","DateSeparator","RecordingCard"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * ConnectedIncomingCall — persistent ringer for the oldest queued `call.ringing` (the card itself is\n * `IncomingCallCard`).\n *\n * A non-modal card (role=\"alertdialog\") rather than a blocking modal: a ring\n * should not trap the user mid-sentence. It rings (WebAudio, mutable) and\n * stays until accepted, declined, cancelled by the caller (`call.ended`), or\n * 30 s pass (then it is dropped silently — the backend records a missed call).\n * Accepting joins at once (microphone on, camera off), without the pre-join.\n */\n\nimport {\n useArbi,\n callSession,\n useCallSession,\n type IncomingCall,\n acceptRing,\n declineRing,\n} from '@arbidocs/react'\nimport { useEffect, useState, type ReactElement } from 'react'\nimport { IncomingCallCard } from '../cards'\nimport { useRingtone, useRingtoneMuted } from '../ringtone'\nimport { CallUserPill } from './CallUserPill'\n\nexport const RING_TIMEOUT_MS = 30_000\n\nfunction useRingTimeout(ring: IncomingCall | undefined) {\n useEffect(() => {\n if (!ring) return\n const remaining = Math.max(0, ring.receivedAt + RING_TIMEOUT_MS - Date.now())\n const timer = setTimeout(() => callSession.removeIncomingCall(ring.call_ext_id), remaining)\n return () => clearTimeout(timer)\n }, [ring])\n}\n\nexport function ConnectedIncomingCall(): ReactElement | null {\n const arbi = useArbi()\n const ring = useCallSession((s) => s.incoming[0])\n const [busy, setBusy] = useState(false)\n const [muted, setMuted] = useRingtoneMuted()\n useRingTimeout(ring)\n // Stops on accept (busy), decline / timeout / caller hang-up (ring removed), or mute.\n useRingtone(!!ring && !busy, muted)\n\n if (!ring) return null\n\n const accept = async () => {\n setBusy(true)\n await acceptRing(arbi, ring)\n setBusy(false)\n }\n\n // thread: a workspace-locked thread call; dm: our direct chat; meeting: a group / meeting chat;\n // none: a contacts or calendar-event call.\n const context =\n ring.context === 'dm'\n ? 'is calling you'\n : ring.context === 'thread'\n ? 'started a call in a shared thread'\n : ring.context === 'meeting'\n ? 'invites you to a group call'\n : 'invites you to a call'\n\n return (\n <IncomingCallCard\n className=\"fixed right-4 top-4 z-[60]\"\n callerName={ring.caller_name}\n caller={<CallUserPill identity={ring.caller_ext_id} name={ring.caller_name} size=\"sm\" />}\n context={context}\n busy={busy}\n muted={muted}\n onMutedChange={setMuted}\n onAccept={() => void accept()}\n onDecline={() => declineRing(arbi, ring)}\n />\n )\n}\n","/**\n * The global call surface, mounted once by the host: the incoming-call ringer (when the call UI is\n * on, `useCallsEnabled`) and, only while a call is active, the dock. The dock is loaded on demand: it\n * pulls in LiveKit, so a page without a call never downloads it. The dock is not gated: an active\n * call comes from the gated call buttons or from a call link, which must open for everyone.\n */\n\nimport { lazy, Suspense, type ReactElement } from 'react'\nimport { useCallSession, useCallsEnabled } from '@arbidocs/react'\nimport { ConnectedIncomingCall } from './ConnectedIncomingCall'\n\n/** The dock (and with it LiveKit), loaded when a call starts. */\nexport const ConnectedCallDock = lazy(() =>\n import('./ConnectedCallDock').then((m) => ({ default: m.ConnectedCallDock }))\n)\n\n/** One call room, loaded on demand (LiveKit); render it inside `<Suspense>`. */\nexport const ConnectedCallRoom = lazy(() =>\n import('./ConnectedCallRoom').then((m) => ({ default: m.ConnectedCallRoom }))\n)\n\nexport function ConnectedCallLayer(): ReactElement {\n const hasActiveCall = useCallSession((s) => s.active !== null)\n const hasIncomingCall = useCallSession((s) => s.incoming.length > 0)\n const callsEnabled = useCallsEnabled()\n return (\n <>\n {hasActiveCall && (\n <Suspense fallback={null}>\n <ConnectedCallDock />\n </Suspense>\n )}\n {hasIncomingCall && callsEnabled && <ConnectedIncomingCall />}\n </>\n )\n}\n","/**\n * Header button that starts (or joins) a call. Renders nothing when calling is\n * not configured on this deployment, and offers only joining a live call to people who may\n * not host calls (Free on the hosted service, external on a Box).\n */\n\nimport { useCallSession, useCallsEnabled, useCanHostCalls } from '@arbidocs/react'\nimport { useState, type ReactElement } from 'react'\nimport { Phone } from 'lucide-react'\nimport { Button, cn, Tooltip, TooltipContent, TooltipTrigger } from '@arbidocs/react/ui'\n\nexport interface StartCallButtonProps {\n /** Starts the call; resolves to whether it opened. */\n onStart(): Promise<boolean>\n /** A call is already running here (the button joins it). */\n isLive?: boolean\n /** Tooltip / accessible label. */\n label?: string\n testId?: string\n}\n\nexport function StartCallButton(props: StartCallButtonProps): ReactElement | null {\n // Gate first so a deployment without calls pays for none of the hooks below.\n const enabled = useCallsEnabled()\n const canHost = useCanHostCalls()\n return enabled && (canHost || props.isLive) ? <EnabledStartCallButton {...props} /> : null\n}\n\nfunction EnabledStartCallButton({\n onStart,\n isLive = false,\n label = 'Start call',\n testId = 'start-call-button',\n}: StartCallButtonProps): ReactElement {\n const [isStarting, setIsStarting] = useState(false)\n const inCall = useCallSession((s) => s.active !== null)\n const text = inCall ? 'Already in a call' : isLive ? 'Join call' : label\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={isLive ? 'Join call' : label}\n data-testid={testId}\n data-live={isLive || undefined}\n disabled={isStarting || inCall}\n onClick={() => {\n setIsStarting(true)\n void onStart().finally(() => setIsStarting(false))\n }}\n className={cn(\n 'text-muted-foreground hover:text-foreground',\n isLive && 'text-green-text hover:text-green-text'\n )}\n >\n <Phone className={cn('size-5', isLive && 'animate-pulse')} />\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>{text}</p>\n </TooltipContent>\n </Tooltip>\n )\n}\n","/**\n * Who a call picker offers, in which order, and what picking them does — pure, so the rules are\n * tested without React (see `CallPeoplePicker`).\n *\n * - `workspace` (a thread call): members of the thread's own workspace only. Nobody else may be\n * rung, admitted or knock on a workspace-locked call.\n * - `chat` (a group's call): the group's members.\n * - `contacts` (\"New call\", calendar): members of the current workspace first, then my other\n * contacts. Only contacts can be picked (the server answers `403 not_a_contact` otherwise): a\n * workspace member who is not one yet offers \"Add contact\". Registered contacts are rung (K\n * sealed to them); unregistered ones (invited / expired / a card with an e-mail) get a personal\n * invite link by e-mail: create an ARBI account, then straight into the call (no anonymous\n * guests).\n *\n * Agents and I are never offered.\n */\n\nimport type { contacts } from '@arbidocs/sdk/browser'\nimport { getUserDisplayName, isAgent } from '@arbidocs/react/ui'\nimport { type UserResponse } from '@arbidocs/react'\n\ntype Contact = contacts.Contact\n\nexport type CallPickerScope = 'workspace' | 'chat' | 'contacts'\n\n/**\n * - `ring`: an ARBI user, rung in-app.\n * - `invite`: an unregistered contact, e-mailed a personal invite link (register, then join).\n * - `add-contact`: a workspace member who is not my contact yet (add, then pick).\n * - `unavailable`: shown greyed out with `reason`.\n */\ntype CallCandidateStatus = 'ring' | 'invite' | 'add-contact' | 'unavailable'\n\nexport interface CallCandidate {\n /** `usr-…` for a user, `cnt-…` for an unregistered contact. */\n id: string\n name: string\n email: string | null\n section: 'members' | 'contacts'\n status: CallCandidateStatus\n /** Why it cannot be picked (tooltip), or what picking does (\"will get an e-mail link\"). */\n reason?: string\n user: UserResponse | null\n contactExtId: string | null\n}\n\nexport const INVITE_LINK_HINT = 'will get an invitation to create an ARBI account and join'\nconst NO_KEY_REASON = 'Cannot receive encrypted calls yet'\nconst NO_EMAIL_REASON = 'No e-mail address to send a link to'\n\nfunction contactName(contact: Contact): string {\n return (\n contact.card?.name?.trim() ||\n [contact.card?.given_name, contact.card?.family_name].filter(Boolean).join(' ') ||\n (contact.user ? getUserDisplayName(contact.user) : '') ||\n contactEmail(contact) ||\n 'Contact'\n )\n}\n\nfunction contactEmail(contact: Contact): string | null {\n return contact.email ?? contact.user?.email ?? contact.card?.emails?.[0]?.email ?? null\n}\n\n/** One of my contacts, as the picker needs it (from a people search hit, or a contact just added). */\nexport interface CallContact {\n contactExtId: string\n /** The ARBI account; null for a contact not on ARBI yet. */\n user: UserResponse | null\n name: string\n email: string | null\n}\n\n/** A contact row as a {@link CallContact}; null for one that cannot be called (failed, agent, no id). */\nexport function callContactOf(contact: Contact): CallContact | null {\n if (!contact.external_id || contact.status === 'failed') return null\n if (contact.user && isAgent(contact.user)) return null\n return {\n contactExtId: contact.external_id,\n user: contact.user ?? null,\n name: contactName(contact),\n email: contactEmail(contact),\n }\n}\n\nfunction userCandidate(\n user: UserResponse,\n section: CallCandidate['section'],\n status: CallCandidateStatus,\n contactExtId: string | null = null\n): CallCandidate {\n const ringable = status !== 'ring' || !!user.encryption_public_key\n return {\n id: user.external_id,\n name: getUserDisplayName(user) || user.email,\n email: user.email ?? null,\n section,\n status: ringable ? status : 'unavailable',\n reason: ringable ? undefined : NO_KEY_REASON,\n user,\n contactExtId,\n }\n}\n\nexport function buildCallCandidates(opts: {\n scope: CallPickerScope\n /** `workspace` / `contacts`: the workspace's members; `chat`: the chat's members. */\n members: UserResponse[]\n /** `contacts` only: my contacts to offer (the people search's hits). */\n contacts?: CallContact[]\n /** `contacts` only: my contact id for a workspace member, null when they are not my contact. */\n contactIdOf?: (user: UserResponse) => string | null\n me: string | null | undefined\n}): CallCandidate[] {\n const seen = new Set<string>()\n const out: CallCandidate[] = []\n const add = (c: CallCandidate) => {\n if (seen.has(c.id)) return\n seen.add(c.id)\n out.push(c)\n }\n const people = (users: UserResponse[]) =>\n users.filter((u) => !isAgent(u) && u.external_id !== opts.me)\n\n if (opts.scope !== 'contacts') {\n for (const u of people(opts.members)) add(userCandidate(u, 'members', 'ring'))\n return out\n }\n\n const contacts = (opts.contacts ?? []).filter((c) => !(c.user && isAgent(c.user)))\n const contactOf = new Map(\n contacts.filter((c) => c.user).map((c) => [c.user!.external_id, c.contactExtId] as const)\n )\n // Members of the current workspace first: pickable once they are my contacts.\n for (const u of people(opts.members)) {\n const contactId = contactOf.get(u.external_id) ?? opts.contactIdOf?.(u) ?? null\n add(userCandidate(u, 'members', contactId ? 'ring' : 'add-contact', contactId))\n }\n for (const c of contacts) {\n if (c.user) {\n if (c.user.external_id === opts.me) continue\n add(userCandidate(c.user, 'contacts', 'ring', c.contactExtId))\n continue\n }\n const status: CallCandidateStatus = c.email ? 'invite' : 'unavailable'\n add({\n id: c.contactExtId,\n name: c.name,\n email: c.email,\n section: 'contacts',\n status,\n reason: c.email ? INVITE_LINK_HINT : NO_EMAIL_REASON,\n user: null,\n contactExtId: c.contactExtId,\n })\n }\n return out\n}\n\n/** Whether a candidate can be ticked. */\nexport function isPickable(c: CallCandidate): boolean {\n return c.status === 'ring' || c.status === 'invite'\n}\n\n/** Case-insensitive match on name or e-mail. */\nexport function matchesQuery(c: CallCandidate, query: string): boolean {\n const q = query.trim().toLowerCase()\n if (!q) return true\n return c.name.toLowerCase().includes(q) || (c.email ?? '').toLowerCase().includes(q)\n}\n","/**\n * Pick who a call rings — one picker for every way a call starts:\n *\n * - `workspace` (thread call): members of the thread's own workspace, nobody ticked by default;\n * - `chat` (a group's call): the group's members (the caller decides who is pre-ticked);\n * - `contacts` (\"New call\", or adding people to a running call): members of the current\n * workspace first, then my contacts matching the search (the one people search). Only contacts can be picked; \"Add contact…\" creates\n * one inline (and sends the platform invitation) and ticks it. Registered contacts are rung;\n * unregistered ones are marked \"will get an invitation to create an ARBI account and join\" and\n * get a personal invite link by e-mail.\n *\n * With `callExtId` (a running call I host) the invitations already sent are listed with \"Revoke\".\n * Agents are never offered. The rules live in `call-people.ts`.\n */\n\nimport {\n useCallInviteLinks,\n useCreateContact,\n useRevokeCallInviteLink,\n useWorkspaces,\n type CallInviteContact,\n usePeople,\n usePeopleSearch,\n type UserResponse,\n} from '@arbidocs/react'\nimport { useEffect, useMemo, useState, type ReactElement } from 'react'\nimport { ArbiApiError, refusalReason } from '@arbidocs/sdk/browser'\nimport { Mail, UserPlus, X } from 'lucide-react'\nimport {\n Button,\n Checkbox,\n cn,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@arbidocs/react/ui'\nimport type { calls } from '@arbidocs/sdk/browser'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { useConnectedWorkspace } from '../../connection/ConnectionProvider'\nimport {\n buildCallCandidates,\n callContactOf,\n type CallContact,\n isPickable,\n matchesQuery,\n type CallCandidate,\n type CallPickerScope,\n} from './call-people'\n\nconst EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n\nexport interface CallPeopleSelection {\n /** ARBI users to ring (K sealed to each). */\n ring: UserResponse[]\n /** Unregistered contacts to e-mail a personal invite link. */\n invites: CallInviteContact[]\n}\n\nexport interface CallPeoplePickerProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n scope: CallPickerScope\n /** `workspace`: the thread's workspace; `contacts`: the current one (default: the selected one). */\n workspaceExtId?: string | null\n /** `chat`: the chat's members. */\n members?: UserResponse[]\n /** Ticked when the picker opens. */\n preselected?: string[]\n title?: string\n description?: string\n actionLabel?: string\n /** A running call I host: list its invitations (with revoke). */\n callExtId?: string | null\n /** Start / invite. A rejection keeps the picker open. */\n onSubmit: (selection: CallPeopleSelection) => Promise<unknown>\n}\n\nconst COPY: Record<CallPickerScope, { title: string; description: string; action: string }> = {\n workspace: {\n title: 'Call thread members',\n description:\n 'Only members of this thread’s workspace can join. Pick who to ring — or nobody, and share the call from the thread.',\n action: 'Start call',\n },\n chat: {\n title: 'Call the group',\n description: 'The people you pick are rung.',\n action: 'Start call',\n },\n contacts: {\n title: 'New call',\n description:\n 'Your contacts with an ARBI account are rung. Others get an invitation to create an account and join.',\n action: 'Start call',\n },\n}\n\nfunction CandidateRow({\n candidate,\n checked,\n onToggle,\n onAddContact,\n adding,\n}: {\n candidate: CallCandidate\n checked: boolean\n onToggle: () => void\n onAddContact: () => void\n adding: boolean\n}) {\n const pickable = isPickable(candidate)\n const hint =\n candidate.status === 'invite'\n ? candidate.reason\n : candidate.status === 'add-contact'\n ? 'Not in your contacts'\n : undefined\n const row = (\n <li\n className={cn(\n 'flex items-center gap-3 rounded-md px-2 py-1.5',\n pickable ? 'hover:bg-muted' : 'opacity-60'\n )}\n data-testid={`call-picker-row-${candidate.id}`}\n data-status={candidate.status}\n aria-disabled={!pickable || undefined}\n >\n <Checkbox\n checked={checked}\n disabled={!pickable}\n onCheckedChange={onToggle}\n aria-label={`Invite ${candidate.name}`}\n data-testid={`call-picker-check-${candidate.id}`}\n />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm\">{candidate.name}</span>\n <span className=\"block truncate text-xs text-muted-foreground\">\n {candidate.email}\n {hint && (\n <span className=\"ml-1 inline-flex items-center gap-1\">\n {candidate.status === 'invite' && <Mail className=\"size-3\" aria-hidden />}\n {candidate.email ? `· ${hint}` : hint}\n </span>\n )}\n </span>\n </span>\n {candidate.status === 'add-contact' && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n disabled={adding}\n onClick={onAddContact}\n data-testid={`call-picker-add-${candidate.id}`}\n >\n <UserPlus className=\"mr-1 size-3.5\" />\n Add contact\n </Button>\n )}\n </li>\n )\n if (candidate.status !== 'unavailable' || !candidate.reason) return row\n return (\n <Tooltip>\n <TooltipTrigger asChild>{row}</TooltipTrigger>\n <TooltipContent>\n <p>{candidate.reason}</p>\n </TooltipContent>\n </Tooltip>\n )\n}\n\nfunction InviteLinks({ callExtId }: { callExtId: string }) {\n const { notify } = useBlocksEnvironment()\n const revokeLink = useRevokeCallInviteLink(callExtId)\n const { data: invites = [] } = useCallInviteLinks(callExtId)\n const live = invites.filter((i: calls.CallInviteLinkResponse) => !i.revoked_at)\n if (!live.length) return null\n const revoke = async (id: string) => {\n try {\n await revokeLink(id)\n } catch (err) {\n notify(err instanceof Error ? err.message : 'Could not revoke the link', 'error')\n }\n }\n return (\n <section className=\"flex flex-col gap-1\" data-testid=\"call-picker-invite-links\">\n <h3 className=\"text-xs font-medium text-muted-foreground\">Invitations sent</h3>\n <ul className=\"flex flex-col gap-1\">\n {live.map((invite) => (\n <li key={invite.external_id} className=\"flex items-center gap-2 text-sm\">\n <Mail className=\"size-3.5 text-muted-foreground\" aria-hidden />\n <span className=\"min-w-0 flex-1 truncate\">{invite.email}</span>\n {invite.used_at && <span className=\"text-xs text-muted-foreground\">joined</span>}\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => void revoke(invite.external_id)}\n data-testid={`call-picker-revoke-${invite.external_id}`}\n >\n <X className=\"mr-1 size-3.5\" />\n Revoke\n </Button>\n </li>\n ))}\n </ul>\n </section>\n )\n}\n\nexport function CallPeoplePicker({\n open,\n onOpenChange,\n scope,\n workspaceExtId,\n members: chatMembers = [],\n preselected = [],\n title,\n description,\n actionLabel,\n callExtId,\n onSubmit,\n}: CallPeoplePickerProps): ReactElement {\n const { notify } = useBlocksEnvironment()\n const createContact = useCreateContact()\n const { userId: me, workspaceId: selectedWorkspaceId } = useConnectedWorkspace()\n const { data: workspaces = [] } = useWorkspaces({ enabled: scope !== 'chat' })\n const [picked, setPicked] = useState<Set<string>>(() => new Set(preselected))\n const [query, setQuery] = useState('')\n const [newEmail, setNewEmail] = useState<string | null>(null)\n const [newName, setNewName] = useState('')\n const [adding, setAdding] = useState(false)\n const [busy, setBusy] = useState(false)\n // Contacts added here (the search may not have them yet).\n const [added, setAdded] = useState<CallContact[]>([])\n const { byEmail } = usePeople()\n const { people: hits } = usePeopleSearch(open && scope === 'contacts' ? query : '')\n\n const preselectedKey = preselected.join(',')\n useEffect(() => {\n if (open) setPicked(new Set(preselectedKey ? preselectedKey.split(',') : []))\n }, [open, preselectedKey])\n\n const workspaceId = workspaceExtId ?? (scope === 'contacts' ? selectedWorkspaceId : null)\n const workspaceMembers = useMemo(\n () => (workspaces.find((w) => w.external_id === workspaceId)?.users ?? []).map((wu) => wu.user),\n [workspaces, workspaceId]\n )\n const candidates = useMemo(() => {\n // Only my contacts can be picked: the hits that are contacts, and anyone added here.\n const found: CallContact[] = hits.flatMap((p) =>\n p.contactId ? [{ contactExtId: p.contactId, user: p.user, name: p.name, email: p.email }] : []\n )\n return buildCallCandidates({\n scope,\n members: scope === 'chat' ? chatMembers : workspaceMembers,\n contacts: [...added, ...found],\n contactIdOf: (u) => byEmail(u.email)?.contactId ?? null,\n me,\n })\n }, [scope, chatMembers, workspaceMembers, hits, added, byEmail, me])\n const shown = candidates.filter((c) => matchesQuery(c, query))\n const copy = COPY[scope]\n\n const toggle = (id: string) =>\n setPicked((prev) => {\n const next = new Set(prev)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n return next\n })\n\n /**\n * Add a contact (and send the platform invitation), then tick it. `name` (optional) is kept as the\n * contact card's name, so the invitation and the call title show it instead of the e-mail.\n */\n const addContact = async (email: string, name?: string) => {\n setAdding(true)\n try {\n const cardName = name?.trim()\n const contact = await createContact.mutateAsync({\n email,\n invite: true,\n ...(cardName ? { card: { name: cardName, emails: [{ email }] } } : {}),\n })\n if (contact.status === 'failed') {\n throw new Error(contact.outcome_detail || 'Could not add the contact')\n }\n const added = callContactOf(contact)\n if (added) setAdded((prev) => [...prev, added])\n const id = contact.user?.external_id ?? contact.external_id\n const pickable = contact.user ? !!contact.user.encryption_public_key : !!added?.email\n if (id && pickable) setPicked((prev) => new Set(prev).add(id))\n setNewEmail(null)\n setNewName('')\n } catch (err) {\n notify(\n err instanceof ArbiApiError\n ? refusalReason(err, 'Could not add the contact')\n : err instanceof Error\n ? err.message\n : 'Could not add the contact',\n 'error'\n )\n } finally {\n setAdding(false)\n }\n }\n\n const submit = async () => {\n if (busy) return\n const chosen = candidates.filter((c) => picked.has(c.id) && isPickable(c))\n setBusy(true)\n try {\n await onSubmit({\n ring: chosen.filter((c) => c.status === 'ring' && c.user).map((c) => c.user!),\n invites: chosen\n .filter((c) => c.status === 'invite' && c.contactExtId)\n .map((c) => ({ contactExtId: c.contactExtId!, name: c.name })),\n })\n onOpenChange(false)\n } catch (err) {\n notify(err instanceof Error ? err.message : 'Something went wrong', 'error')\n } finally {\n setBusy(false)\n }\n }\n\n const sections: { id: CallCandidate['section']; label: string }[] =\n scope === 'contacts'\n ? [\n { id: 'members', label: 'Workspace members' },\n { id: 'contacts', label: 'Contacts' },\n ]\n : [{ id: 'members', label: scope === 'chat' ? 'Members' : 'Workspace members' }]\n const count = candidates.filter((c) => picked.has(c.id) && isPickable(c)).length\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md\" data-testid=\"call-people-picker\">\n <DialogHeader>\n <DialogTitle>{title ?? copy.title}</DialogTitle>\n <DialogDescription>{description ?? copy.description}</DialogDescription>\n </DialogHeader>\n <div className=\"flex min-h-0 flex-col gap-3\">\n <Input\n placeholder=\"Search people\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n aria-label=\"Search people\"\n data-testid=\"call-picker-search\"\n />\n <div className=\"max-h-80 overflow-y-auto\">\n {sections.map((section) => {\n const rows = shown.filter((c) => c.section === section.id)\n if (!rows.length) return null\n return (\n <section key={section.id} className=\"mb-2\">\n <h3 className=\"px-2 pb-1 text-xs font-medium text-muted-foreground\">\n {section.label}\n </h3>\n <ul data-testid={`call-picker-section-${section.id}`}>\n {rows.map((c) => (\n <CandidateRow\n key={c.id}\n candidate={c}\n checked={picked.has(c.id)}\n onToggle={() => toggle(c.id)}\n adding={adding}\n onAddContact={() => c.email && void addContact(c.email)}\n />\n ))}\n </ul>\n </section>\n )\n })}\n {!shown.length && (\n <p className=\"px-2 py-3 text-sm text-muted-foreground\">\n {scope === 'contacts' && !query.trim()\n ? 'Search your contacts by name or e-mail.'\n : candidates.length\n ? 'Nobody matches.'\n : 'Nobody to call here yet.'}\n </p>\n )}\n </div>\n {scope === 'contacts' &&\n (newEmail === null ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"self-start\"\n onClick={() => setNewEmail(EMAIL_RE.test(query.trim()) ? query.trim() : '')}\n data-testid=\"call-picker-add-contact\"\n >\n <UserPlus className=\"mr-1 size-4\" />\n Add contact…\n </Button>\n ) : (\n <form\n className=\"flex flex-wrap items-center gap-2\"\n onSubmit={(e) => {\n e.preventDefault()\n if (EMAIL_RE.test(newEmail.trim())) void addContact(newEmail.trim(), newName)\n }}\n >\n <Input\n className=\"min-w-[8rem] flex-1\"\n placeholder=\"Name (optional)\"\n value={newName}\n maxLength={200}\n onChange={(e) => setNewName(e.target.value)}\n aria-label=\"New contact's name\"\n autoComplete=\"off\"\n data-testid=\"call-picker-new-name\"\n />\n <Input\n className=\"min-w-[10rem] flex-1\"\n type=\"email\"\n autoFocus\n placeholder=\"name@example.com\"\n value={newEmail}\n onChange={(e) => setNewEmail(e.target.value)}\n aria-label=\"New contact's e-mail\"\n data-testid=\"call-picker-new-email\"\n />\n <Button\n type=\"submit\"\n size=\"sm\"\n disabled={adding || !EMAIL_RE.test(newEmail.trim())}\n data-testid=\"call-picker-new-submit\"\n >\n Add\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setNewEmail(null)\n setNewName('')\n }}\n >\n Cancel\n </Button>\n </form>\n ))}\n {callExtId && scope === 'contacts' && <InviteLinks callExtId={callExtId} />}\n <p className=\"text-xs text-muted-foreground\">Agents can’t join calls.</p>\n </div>\n <DialogFooter>\n <Button variant=\"ghost\" onClick={() => onOpenChange(false)} disabled={busy}>\n Cancel\n </Button>\n <Button onClick={() => void submit()} disabled={busy} data-testid=\"call-picker-submit\">\n {busy ? 'Working…' : `${actionLabel ?? copy.action}${count ? ` (${count})` : ''}`}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n","/**\n * Call button for the open thread — shared threads only. A thread call is locked to the thread's\n * workspace and logged in the thread (a log card). The button opens a members-only picker with\n * nobody ticked: only the members picked are rung (never the whole workspace). While the thread's\n * call is live, the button joins it instead.\n */\n\nimport {\n useArbi,\n threadLiveCallId,\n useCallSession,\n useCanHostCalls,\n openCall,\n startThreadCall,\n} from '@arbidocs/react'\nimport { useState, type ReactElement } from 'react'\nimport { useConnectedConversations } from '../../connection/workspaceData'\nimport { useConnectedWorkspace } from '../../connection/ConnectionProvider'\nimport { StartCallButton } from './StartCallButton'\nimport { CallPeoplePicker } from './CallPeoplePicker'\n\nexport function ThreadCallButton({\n conversationId,\n}: {\n conversationId: string\n}): ReactElement | null {\n const arbi = useArbi()\n const { data: conversations } = useConnectedConversations()\n // The conversation list is the workspace open in this session: the thread's own workspace.\n const { workspaceId: workspaceExtId } = useConnectedWorkspace()\n const liveCallId = useCallSession((s) => threadLiveCallId(s, conversationId))\n const isLive = liveCallId !== null\n const canHost = useCanHostCalls()\n const [picking, setPicking] = useState(false)\n const conversation = conversations.find((c) => c.external_id === conversationId)\n if (!conversation?.is_shared) return null\n const title = conversation.title ?? null\n\n return (\n <>\n <StartCallButton\n onStart={async () => {\n // Live: join the thread's running call (get-or-create), ringing nobody. Someone who may not host\n // opens that call directly: get-or-create would make them the host of a new one.\n if (liveCallId && !canHost) return openCall(arbi, { callExtId: liveCallId })\n if (isLive) return startThreadCall(arbi, { threadExtId: conversationId, title, ring: [] })\n setPicking(true)\n return true\n }}\n isLive={isLive}\n label=\"Call thread members\"\n testId=\"thread-call-button\"\n />\n {picking && (\n <CallPeoplePicker\n open\n onOpenChange={setPicking}\n scope=\"workspace\"\n workspaceExtId={workspaceExtId}\n onSubmit={async ({ ring }) => {\n await startThreadCall(arbi, { threadExtId: conversationId, title, ring })\n }}\n />\n )}\n </>\n )\n}\n","/**\n * Call button for an open group chat: the group's call (the group is its meeting chat). The\n * members picker opens with everyone ticked; only the people left ticked are rung.\n */\n\nimport {\n useArbi,\n chatLiveCallId,\n useCallSession,\n openCall,\n startChatCall,\n useCanHostCalls,\n type UserResponse,\n} from '@arbidocs/react'\nimport { isAgent } from '@arbidocs/react/ui'\nimport { useState, type ReactElement } from 'react'\nimport { useConnectedWorkspace } from '../../connection/ConnectionProvider'\nimport { StartCallButton } from './StartCallButton'\nimport { CallPeoplePicker } from './CallPeoplePicker'\n\nexport function GroupCallButton({\n chatExtId,\n title,\n members,\n}: {\n chatExtId: string\n title: string | null\n members: UserResponse[]\n}): ReactElement {\n const arbi = useArbi()\n const { userId: me } = useConnectedWorkspace()\n const liveCallId = useCallSession((s) => chatLiveCallId(s, chatExtId))\n const isLive = liveCallId !== null\n const canHost = useCanHostCalls()\n const [picking, setPicking] = useState(false)\n const others = members.filter((u) => u.external_id !== me && !isAgent(u))\n\n return (\n <>\n <StartCallButton\n onStart={async () => {\n // Someone who may not host opens the running call itself (a new create would make them its host).\n if (liveCallId && !canHost) return openCall(arbi, { callExtId: liveCallId })\n if (isLive) return startChatCall(arbi, { chatExtId, title, ring: [] })\n setPicking(true)\n return true\n }}\n isLive={isLive}\n label=\"Call the group\"\n testId=\"group-call-button\"\n />\n {picking && (\n <CallPeoplePicker\n open\n onOpenChange={setPicking}\n scope=\"chat\"\n members={others}\n preselected={others.map((u) => u.external_id)}\n onSubmit={async ({ ring }) => {\n await startChatCall(arbi, { chatExtId, title, ring })\n }}\n />\n )}\n </>\n )\n}\n","/** Call button for an open DM thread: a new call with the peer as context, ringing the peer. */\n\nimport { useArbi, userDisplayName, startDmCall, type UserResponse } from '@arbidocs/react'\nimport type { ReactElement } from 'react'\nimport { StartCallButton } from './StartCallButton'\n\nexport function DmCallButton({ peer }: { peer: UserResponse }): ReactElement {\n const arbi = useArbi()\n const name = userDisplayName(peer)\n return (\n <StartCallButton\n onStart={() =>\n startDmCall(arbi, {\n external_id: peer.external_id,\n encryption_public_key: peer.encryption_public_key ?? null,\n name,\n })\n }\n label={`Call ${name}`}\n testId=\"dm-call-button\"\n />\n )\n}\n","/**\n * \"New call\" — a call with people from my contacts (no thread or chat). Registered contacts are\n * rung; unregistered ones get a personal invite link by e-mail (register, then join). Its meeting chat is made on first\n * use. Renders nothing unless the person may host calls (server + Settings → Experimental + entitlement).\n */\n\nimport { useArbi, useCallSession, useCanHostCalls, startContactsCall } from '@arbidocs/react'\nimport { getUserDisplayName } from '@arbidocs/react/ui'\nimport { useState, type ReactElement } from 'react'\nimport { DmInviteChip } from '../../collaboration/direct-messages/DirectMessages'\nimport { CallPeoplePicker } from './CallPeoplePicker'\nimport { contactsCallTitle } from '../call-cards'\n\nexport function NewCallChip(): ReactElement | null {\n // Gate first so a deployment without calls pays for none of the hooks below.\n return useCanHostCalls() ? <EnabledNewCallChip /> : null\n}\n\nfunction EnabledNewCallChip(): ReactElement {\n const arbi = useArbi()\n const inCall = useCallSession((s) => s.active !== null)\n const [open, setOpen] = useState(false)\n return (\n <>\n <DmInviteChip\n testId=\"dm-new-call-chip\"\n title=\"New call\"\n description={inCall ? 'You are already in a call' : 'Call people from your contacts'}\n onClick={() => !inCall && setOpen(true)}\n />\n {open && (\n <CallPeoplePicker\n open\n onOpenChange={setOpen}\n scope=\"contacts\"\n onSubmit={async ({ ring, invites }) => {\n await startContactsCall(arbi, {\n title: contactsCallTitle([\n ...ring.map((u) => getUserDisplayName(u)),\n ...invites.map((g) => g.name),\n ]),\n ring,\n invites,\n })\n }}\n />\n )}\n </>\n )\n}\n","/**\n * \"Schedule call\": one scheduling system — the calendar. Opens the calendar's event editor prefilled with the\n * context's people (a shared thread's workspace members, or a DM peer), the thread linked, and \"Add ARBI call\"\n * ticked; saving makes the event and its ARBI call (key sealed to the ARBI attendees). The calendar opens\n * where the host shows it (`BlocksEnvironment.openCalendar`).\n */\nimport { CalendarPlus } from 'lucide-react'\nimport { Button, cn, getUserDisplayName, isAgent } from '@arbidocs/react/ui'\nimport {\n useCanHostCalls,\n useConversationItems,\n useWorkspaces,\n type UserResponse,\n} from '@arbidocs/react'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { useConnectedWorkspace } from '../../connection/ConnectionProvider'\nimport { requestCalendarComposer } from '../../connection/calendar/store'\n\nexport interface ScheduleCallButtonProps {\n /** A thread: its workspace members are invited when the thread is shared. */\n conversationId?: string | null\n /** A DM peer to invite. */\n peer?: UserResponse | null\n /** `icon` for headers, `label` for a text button. */\n variant?: 'icon' | 'label'\n className?: string\n}\n\nexport function ScheduleCallButton({\n conversationId,\n peer,\n variant = 'icon',\n className,\n}: ScheduleCallButtonProps) {\n // Scheduling a call is hosting it.\n const callsEnabled = useCanHostCalls()\n const { conversations } = useConversationItems()\n const { data: workspaces = [] } = useWorkspaces()\n const { workspaceId: selectedWorkspaceId, userId: me } = useConnectedWorkspace()\n const { openCalendar } = useBlocksEnvironment()\n if (!callsEnabled) return null\n\n const open = () => {\n const conversation = conversationId\n ? conversations?.find((c) => c.external_id === conversationId)\n : undefined\n let people: UserResponse[] = []\n if (peer) people = [peer]\n else if (conversation?.is_shared) {\n const workspace = workspaces.find((w) => w.external_id === selectedWorkspaceId)\n people = (workspace?.users ?? []).map((wu) => wu.user as UserResponse)\n }\n requestCalendarComposer({\n title: peer\n ? `Call with ${getUserDisplayName(peer) || peer.email}`\n : (conversation?.title ?? ''),\n conversationId: conversationId ?? null,\n attendees: people\n .filter((u) => !isAgent(u) && u.external_id !== me)\n .map((u) => ({\n email: u.email,\n user_id: u.external_id,\n name: getUserDisplayName(u) || null,\n })),\n addCall: true,\n })\n openCalendar()\n }\n\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size={variant === 'icon' ? 'icon' : 'sm'}\n className={cn(variant === 'icon' && 'size-8', className)}\n onClick={open}\n aria-label=\"Schedule call\"\n title=\"Schedule call\"\n data-testid=\"schedule-call-button\"\n >\n <CalendarPlus className=\"size-4\" />\n {variant === 'label' && <span className=\"ml-1.5\">Schedule call</span>}\n </Button>\n )\n}\n","/**\n * \"Save transcript to thread\" in a WORKSPACE meeting thread (a thread call's meeting chat): for the\n * call's creator, the thread's `transcript_segment` comments are posted as one attributed transcript\n * comment into another thread they pick. Renders nothing for anyone else or without a transcript.\n */\n\nimport { useMemo, type ReactElement } from 'react'\nimport { useCall, useWorkspaceUsers, threadTranscriptLines } from '@arbidocs/react'\nimport { getUserDisplayName } from '@arbidocs/react/ui'\nimport { SaveTranscriptToThread } from './SaveTranscriptToThread'\n\nexport function MeetingThreadTranscriptAction({\n conversationExtId,\n meetingCallExtId,\n title,\n messages,\n}: {\n conversationExtId: string\n /** The thread's call (`meeting_call_ext_id`), or null when it is not a meeting thread. */\n meetingCallExtId: string | null | undefined\n title: string | null | undefined\n messages: { content?: string | null; created_at?: string | null; tools?: unknown }[]\n}): ReactElement | null {\n const { data: call } = useCall(meetingCallExtId)\n const { data: workspaceUsers = [] } = useWorkspaceUsers()\n const lines = useMemo(\n () =>\n threadTranscriptLines(messages, (id) => {\n const user = workspaceUsers.find((wu) => wu.user.external_id === id)?.user\n return user ? getUserDisplayName(user) : null\n }),\n [messages, workspaceUsers]\n )\n if (!meetingCallExtId || !call?.is_creator) return null\n return (\n <SaveTranscriptToThread\n title={title}\n lines={lines}\n excludeConversationExtId={conversationExtId}\n iconOnly\n />\n )\n}\n","/**\n * \"Recordings\" in a WORKSPACE meeting thread (a thread call's meeting chat): the call's recordings\n * in a dialog — for members of the thread's workspace (the recordings are under its key). A\n * recording link (`/<wrk>/<con>?recording=<crc>`) opens it.\n */\n\nimport { useEffect, useState, type ReactElement } from 'react'\nimport { Disc } from 'lucide-react'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '@arbidocs/react/ui'\nimport { usePendingRecording } from '../recording-link'\nimport { HeaderAction } from '../HeaderAction'\nimport { RecordingsList } from './RecordingCard'\n\nexport function MeetingThreadRecordingsAction({\n meetingCallExtId,\n title,\n iconOnly = false,\n}: {\n /** The thread's call (`meeting_call_ext_id`). */\n meetingCallExtId: string\n title: string | null | undefined\n /** Icon only, the label in a tooltip (a crowded header: the thread's title keeps the room). */\n iconOnly?: boolean\n}): ReactElement {\n const [open, setOpen] = useState(false)\n const pending = usePendingRecording()\n useEffect(() => {\n if (pending) setOpen(true)\n }, [pending])\n return (\n <>\n <HeaderAction\n label=\"Recordings\"\n icon={<Disc className=\"size-3.5\" aria-hidden />}\n iconOnly={iconOnly}\n onClick={() => setOpen(true)}\n testId=\"meeting-recordings\"\n />\n {open && (\n <Dialog open onOpenChange={(o) => !o && setOpen(false)}>\n <DialogContent className=\"sm:max-w-2xl\" data-testid=\"meeting-recordings-dialog\">\n <DialogHeader>\n <DialogTitle>Recordings</DialogTitle>\n <DialogDescription>\n Recordings of this meeting, encrypted under the workspace key. Playing or\n downloading one decrypts it in this browser.\n </DialogDescription>\n </DialogHeader>\n <RecordingsList\n callExtId={meetingCallExtId}\n title={title}\n className=\"max-h-[60vh] overflow-y-auto\"\n />\n </DialogContent>\n </Dialog>\n )}\n </>\n )\n}\n","/**\n * The call actions of the open conversation (`ConnectedConversation`), for the host's header: call\n * the thread's members (or join its live call), schedule a call, and in a meeting thread the host's\n * \"Save transcript to thread\" and the meeting's Recordings. Renders nothing without an open\n * conversation; each action hides itself when calls are off or it does not apply.\n */\n\nimport { useMemo, type ReactElement } from 'react'\nimport { useArbiSessionState, useConversationData, useConversationItems } from '@arbidocs/react'\nimport { useMeetingThreadMessages } from '../../connection/conversation/useMeetingThreadMessages'\nimport { ThreadCallButton } from './ThreadCallButton'\nimport { ScheduleCallButton } from './ScheduleCallButton'\nimport { MeetingThreadTranscriptAction } from './MeetingThreadTranscriptAction'\nimport { MeetingThreadRecordingsAction } from './MeetingThreadRecordingsAction'\n\nexport function ConnectedConversationCallActions(): ReactElement | null {\n const conversationId = useArbiSessionState((state) => state.conversationId)\n const { conversations } = useConversationItems()\n const conversation = conversationId\n ? conversations.find((c) => c.external_id === conversationId)\n : undefined\n const meetingCallExtId = conversation?.meeting_call_ext_id ?? null\n const { messageHistory } = useConversationData()\n // Its transcript lines (a recording's transcript supersedes the live ones), for the host's save.\n const threadMessages = useMeetingThreadMessages(meetingCallExtId, messageHistory)\n const meetingMessages = useMemo(\n () =>\n meetingCallExtId\n ? threadMessages.map((m) => ({\n content: m.content,\n created_at: m.created_at,\n tools: m.tools ?? m.meta?.tools,\n }))\n : [],\n [meetingCallExtId, threadMessages]\n )\n if (!conversationId) return null\n return (\n <>\n <ThreadCallButton conversationId={conversationId} />\n <ScheduleCallButton conversationId={conversationId} />\n {meetingCallExtId && (\n <MeetingThreadTranscriptAction\n conversationExtId={conversationId}\n meetingCallExtId={meetingCallExtId}\n title={conversation?.title}\n messages={meetingMessages}\n />\n )}\n {meetingCallExtId && (\n <MeetingThreadRecordingsAction\n meetingCallExtId={meetingCallExtId}\n title={conversation?.title}\n iconOnly\n />\n )}\n </>\n )\n}\n","/**\n * A `kind=call` chat message (the server posts one into the call's chat — a DM, a group or a\n * meeting chat — when a session starts). The newest card of a call shows its state:\n *\n * live: \"Ada started a call\" · Join\n * ended: \"Call · 12 min · joined Ada, Bob\"\n *\n * Older cards of the same call (earlier sessions) stay a plain \"Call\" line. The call is re-read on\n * `call.started` / `call.ended` (see `refreshCallCards`).\n */\n\nimport { useArbi, useCallSession, useCall, openCall } from '@arbidocs/react'\nimport { useState, type ReactElement } from 'react'\nimport { Phone, PhoneOff } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { formatCallDuration, isCallLive } from '../call-cards'\n\nexport function ChatCallCard({\n callExtId,\n senderName,\n latest,\n name,\n time,\n}: {\n callExtId: string\n /** Who started the session (the card's sender). */\n senderName: string | null\n /** The newest card of this call in the chat. */\n latest: boolean\n /** A member's display name by user ext id. */\n name: (userExtId: string) => string\n time?: string\n}): ReactElement {\n const arbi = useArbi()\n const { data: call } = useCall(latest ? callExtId : null)\n const liveNow = useCallSession((s) => callExtId in s.liveCalls)\n const inThisCall = useCallSession((s) => s.active?.callExtId === callExtId)\n const inAnotherCall = useCallSession((s) => !!s.active && s.active.callExtId !== callExtId)\n const [busy, setBusy] = useState(false)\n const live = latest && isCallLive(call, liveNow)\n\n let summary: string\n if (live) summary = senderName ? `${senderName} started a call` : 'Call in progress'\n else if (latest && call?.started_at && call.ended_at) {\n const seconds = (Date.parse(call.ended_at) - Date.parse(call.started_at)) / 1000\n const joined = (call.last_participants ?? []).map(name)\n summary = [\n 'Call',\n formatCallDuration(seconds),\n joined.length ? `joined ${joined.join(', ')}` : null,\n ]\n .filter(Boolean)\n .join(' · ')\n } else summary = senderName ? `Call started by ${senderName}` : 'Call'\n\n return (\n <div\n className=\"mx-auto my-2 flex w-fit max-w-full flex-wrap items-center justify-center gap-2 rounded-md border border-border bg-card px-3 py-2 text-xs\"\n data-testid=\"chat-call-card\"\n data-live={live || undefined}\n >\n {live ? (\n <Phone className=\"size-4 animate-pulse text-green-text\" aria-hidden />\n ) : (\n <PhoneOff className=\"size-4 text-muted-foreground\" aria-hidden />\n )}\n <span data-testid=\"chat-call-card-summary\">{summary}</span>\n {time && <time className=\"text-muted-foreground\">{time}</time>}\n {live && (\n <Button\n type=\"button\"\n size=\"sm\"\n className=\"h-7 bg-green-600 text-white hover:bg-green-700\"\n disabled={busy || inThisCall || inAnotherCall}\n title={inAnotherCall ? 'You are already in a call' : undefined}\n onClick={() => {\n setBusy(true)\n void openCall(arbi, { callExtId }).finally(() => setBusy(false))\n }}\n data-testid=\"chat-call-card-join\"\n >\n {inThisCall ? 'In call' : 'Join'}\n </Button>\n )}\n </div>\n )\n}\n","/**\n * A chat thread's history with its call: the messenger kit's `ThreadHistory` (blocks\n * `ConnectedChatThread`). A chat with a call (a meeting chat, or a direct or group chat a call was\n * started from) shows its call cards, live transcript, recordings and the speakers talking right\n * now, and filters between everything, the typed chat, the transcript and the recordings. Typed\n * messages are drawn by the kit (`renderItem`).\n */\n\nimport { Fragment, useEffect, useMemo, useState } from 'react'\nimport {\n DateSeparator,\n useArbi,\n type ChatThreadMessage,\n useCall,\n chatTranscriptRef,\n hasRecordingTranscript,\n sortTranscriptMessages,\n supersededTranscriptLines,\n type TranscriptExportLine,\n useRecordingWindows,\n} from '@arbidocs/react'\nimport { chats } from '@arbidocs/sdk/browser'\nimport { ConversationFilter } from '../../chat/TranscriptLine'\nimport { transcriptRuns } from '../../chat/transcript-runs'\nimport type { ChatHistoryProps } from '../../connection/messenger/types'\nimport { usePendingRecording } from '../recording-link'\nimport { ChatCallCard } from './ChatCallCard'\nimport { TranscriptEntry } from './TranscriptEntry'\nimport { CallConversationEmpty, ProvisionalSpeakers } from './CallConversationParts'\nimport { useProvisionalSpeakers } from './provisional-speakers'\nimport { SaveTranscriptToThread } from './SaveTranscriptToThread'\nimport { RecordingCard, RecordingsList } from './RecordingCard'\n\nconst { isTranscriptMessage, parseTranscriptContent } = chats\n\nexport function ConnectedCallChatHistory({\n chat,\n messages,\n items,\n renderItem,\n loadOlder,\n memberById,\n senderName,\n myExtId,\n formatTime,\n formatDay,\n}: ChatHistoryProps) {\n const arbi = useArbi()\n // A call's chat: everything, typed chat only, the transcript only, or the recordings.\n const [view, setView] = useState<'all' | 'chat' | 'transcript' | 'recordings'>('all')\n useEffect(() => setView('all'), [chat?.external_id])\n // A call's chat (meeting, DM or group with a call) lists the call's recordings.\n const recordingsCallExtId = chat?.call_ext_id ?? null\n // A recording link opened this chat: show its recordings.\n const pendingRecording = usePendingRecording()\n useEffect(() => {\n if (pendingRecording && recordingsCallExtId) setView('recordings')\n }, [pendingRecording, recordingsCallExtId])\n\n // The newest call card of each call shows its live / ended state; older ones are a plain line.\n const latestCallCards = useMemo(() => {\n const latest = new Map<string, string>()\n for (const m of messages)\n if (m.kind === 'call' && m.call_ext_id && !m.deleted) latest.set(m.call_ext_id, m.external_id)\n return new Set(latest.values())\n }, [messages])\n\n // A recording's transcript supersedes the live lines spoken while it recorded (else both show).\n const hasRecTranscript = useMemo(\n () => hasRecordingTranscript(messages, chatTranscriptRef),\n [messages]\n )\n const recordingWindows = useRecordingWindows(recordingsCallExtId, hasRecTranscript)\n const supersededTranscript = useMemo(\n () => supersededTranscriptLines(messages, chatTranscriptRef, recordingWindows),\n [messages, recordingWindows]\n )\n const transcriptMessages = useMemo(\n () =>\n sortTranscriptMessages(\n messages.filter((m) => isTranscriptMessage(m) && !m.deleted && !supersededTranscript.has(m))\n ),\n [messages, supersededTranscript]\n )\n const hasTranscript = transcriptMessages.length > 0\n\n // The host can save the decrypted transcript as one comment into a workspace thread.\n const { data: meetingCall } = useCall(hasTranscript ? chat?.call_ext_id : null)\n const isHost = !!meetingCall?.is_creator\n const [meetingTitle, setMeetingTitle] = useState<string | null>(null)\n useEffect(() => {\n if (!chat || (!isHost && !recordingsCallExtId)) return\n let cancelled = false\n arbi.chats\n .title(chat)\n .then((t) => !cancelled && setMeetingTitle(t))\n .catch(() => undefined)\n return () => {\n cancelled = true\n }\n }, [arbi, isHost, chat, recordingsCallExtId])\n\n const transcriptSpeaker = (msg: ChatThreadMessage) => {\n const parsed = msg.decryptFailed ? null : parseTranscriptContent(msg.content)\n return { parsed, speakerId: parsed?.speaker_identity || msg.sender_ext_id || '' }\n }\n const transcriptExport = useMemo<TranscriptExportLine[]>(\n () =>\n transcriptMessages\n .filter((m) => !m.decryptFailed)\n .map((m) => {\n const parsed = parseTranscriptContent(m.content)\n const speakerId = parsed?.speaker_identity || m.sender_ext_id || ''\n return {\n speaker:\n parsed?.speaker_name ||\n (memberById(speakerId) ? senderName(speakerId) : '') ||\n 'Former member',\n at: parsed?.started_at ?? m.created_at,\n text: parsed?.text ?? m.content ?? '',\n }\n }),\n [transcriptMessages, memberById, senderName]\n )\n // Consecutive lines of one speaker are one run (the name once); each speaker's newest line is\n // highlighted while they talk in the call.\n const transcriptLayout = useMemo(() => {\n const shown = view === 'transcript' ? transcriptMessages : messages\n const continued = transcriptRuns(\n shown,\n (m) =>\n isTranscriptMessage(m) && !supersededTranscript.has(m)\n ? transcriptSpeaker(m).speakerId\n : null,\n (m) => Date.parse(transcriptSpeaker(m).parsed?.started_at ?? m.created_at ?? '') || 0\n )\n return { continued }\n }, [view, messages, transcriptMessages, supersededTranscript])\n const transcriptEntry = (msg: ChatThreadMessage) => {\n const { parsed, speakerId } = transcriptSpeaker(msg)\n return (\n <TranscriptEntry\n key={msg.external_id}\n speakerId={speakerId}\n speakerName={\n speakerId === myExtId\n ? 'Me'\n : parsed?.speaker_name ||\n (memberById(speakerId) ? senderName(speakerId) : senderName(msg.sender_ext_id))\n }\n text={parsed?.text ?? msg.content ?? ''}\n at={parsed?.started_at ?? msg.created_at}\n continued={transcriptLayout.continued.has(msg)}\n />\n )\n }\n // While I am in this chat's call: \"<speaker> is speaking…\" until their line arrives.\n const chatLines = useMemo(\n () =>\n transcriptMessages.map((m) => {\n const { parsed, speakerId } = transcriptSpeaker(m)\n return { speakerId, at: Date.parse(parsed?.started_at ?? m.created_at ?? '') || 0 }\n }),\n\n [transcriptMessages]\n )\n const provisionalSpeakers = useProvisionalSpeakers(recordingsCallExtId, chatLines)\n\n const filterOptions = [\n { value: 'all' as const, label: 'All' },\n { value: 'chat' as const, label: 'Chat', testId: 'chat-filter' },\n {\n value: 'transcript' as const,\n label: 'Transcript',\n count: transcriptMessages.length,\n testId: 'transcript-filter',\n },\n ...(recordingsCallExtId\n ? [{ value: 'recordings' as const, label: 'Recordings', testId: 'recordings-filter' }]\n : []),\n ]\n\n return (\n <>\n {messages.length === 0 && recordingsCallExtId && (\n <CallConversationEmpty callExtId={recordingsCallExtId} />\n )}\n {(hasTranscript || recordingsCallExtId) && (\n <div className=\"sticky top-0 z-10 flex justify-center py-1\">\n <ConversationFilter<typeof view>\n value={view}\n options={filterOptions}\n onChange={setView}\n />\n </div>\n )}\n {view === 'recordings' && recordingsCallExtId && (\n <RecordingsList callExtId={recordingsCallExtId} title={meetingTitle} className=\"py-1\" />\n )}\n {loadOlder}\n {view === 'transcript' && (\n <div className=\"flex flex-col py-1\" data-testid=\"transcript-view\">\n {isHost && (\n <SaveTranscriptToThread\n title={meetingTitle}\n lines={transcriptExport}\n className=\"mx-3 mb-2 self-start\"\n />\n )}\n {transcriptMessages.map((msg) => transcriptEntry(msg))}\n <ProvisionalSpeakers ids={provisionalSpeakers} />\n </div>\n )}\n {(view === 'all' || view === 'chat') &&\n items.map((item, i) => {\n const { message: msg, isFirstOfDay } = item\n const deleted = !!msg.deleted\n // A deleted transcript line is not part of the record (it may be stored again).\n if (deleted && isTranscriptMessage(msg)) return null\n const separator = isFirstOfDay && (\n <DateSeparator>{formatDay(msg.created_at)}</DateSeparator>\n )\n if (isTranscriptMessage(msg)) {\n if (view === 'chat') return null\n // A live line superseded by the recording's transcript is not shown.\n const superseded = supersededTranscript.has(msg)\n if (superseded && !isFirstOfDay) return null\n return (\n <Fragment key={msg.external_id}>\n {separator}\n {!superseded && transcriptEntry(msg)}\n </Fragment>\n )\n }\n if (msg.kind === 'recording' && msg.call_ext_id && !deleted) {\n // The server's Recording card (posted when a recording stops).\n return (\n <Fragment key={msg.external_id}>\n {separator}\n <RecordingCard\n callExtId={msg.call_ext_id}\n recordingExtId={msg.recording_ext_id ?? null}\n title={meetingTitle}\n time={formatTime(msg.created_at)}\n />\n </Fragment>\n )\n }\n if (msg.kind === 'call' && msg.call_ext_id && !deleted) {\n return (\n <Fragment key={msg.external_id}>\n {separator}\n <ChatCallCard\n callExtId={msg.call_ext_id}\n senderName={msg.sender_ext_id ? senderName(msg.sender_ext_id) : null}\n latest={latestCallCards.has(msg.external_id)}\n name={senderName}\n time={formatTime(msg.created_at)}\n />\n </Fragment>\n )\n }\n return renderItem(item, i)\n })}\n {view === 'all' && <ProvisionalSpeakers ids={provisionalSpeakers} />}\n </>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/calls/connected/ConnectedIncomingCall.tsx","../../src/calls/connected/ConnectedCallLayer.tsx","../../src/calls/connected/GroupCallButton.tsx","../../src/calls/connected/DmCallButton.tsx","../../src/calls/connected/NewCallChip.tsx","../../src/calls/connected/ChatCallCard.tsx","../../src/calls/connected/ConnectedCallChatHistory.tsx"],"names":["useEffect","callSession","useArbi","useCallSession","useState","useRingtoneMuted","useRingtone","acceptRing","jsx","IncomingCallCard","CallUserPill","declineRing","lazy","useCallsEnabled","jsxs","Fragment","Suspense","useConnectedWorkspace","chatLiveCallId","useCanHostCalls","isAgent","StartCallButton","openCall","startChatCall","CallPeoplePicker","userDisplayName","startDmCall","DmInviteChip","startContactsCall","contactsCallTitle","getUserDisplayName","useCall","isCallLive","formatCallDuration","Phone","PhoneOff","Button","chats","usePendingRecording","useMemo","hasRecordingTranscript","chatTranscriptRef","useRecordingWindows","supersededTranscriptLines","sortTranscriptMessages","transcriptRuns","TranscriptEntry","useProvisionalSpeakers","CallConversationEmpty","ConversationFilter","RecordingsList","SaveTranscriptToThread","ProvisionalSpeakers","DateSeparator","RecordingCard"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * ConnectedIncomingCall — persistent ringer for the oldest queued `call.ringing` (the card itself is\n * `IncomingCallCard`).\n *\n * A non-modal card (role=\"alertdialog\") rather than a blocking modal: a ring\n * should not trap the user mid-sentence. It rings (WebAudio, mutable) and\n * stays until accepted, declined, cancelled by the caller (`call.ended`), or\n * 30 s pass (then it is dropped silently — the backend records a missed call).\n * Accepting joins at once (microphone on, camera off), without the pre-join.\n */\n\nimport {\n useArbi,\n callSession,\n useCallSession,\n type IncomingCall,\n acceptRing,\n declineRing,\n} from '@arbidocs/react'\nimport { useEffect, useState, type ReactElement } from 'react'\nimport { IncomingCallCard } from '../cards'\nimport { useRingtone, useRingtoneMuted } from '../ringtone'\nimport { CallUserPill } from './CallUserPill'\n\nexport const RING_TIMEOUT_MS = 30_000\n\nfunction useRingTimeout(ring: IncomingCall | undefined) {\n useEffect(() => {\n if (!ring) return\n const remaining = Math.max(0, ring.receivedAt + RING_TIMEOUT_MS - Date.now())\n const timer = setTimeout(() => callSession.removeIncomingCall(ring.call_ext_id), remaining)\n return () => clearTimeout(timer)\n }, [ring])\n}\n\nexport function ConnectedIncomingCall(): ReactElement | null {\n const arbi = useArbi()\n const ring = useCallSession((s) => s.incoming[0])\n const [busy, setBusy] = useState(false)\n const [muted, setMuted] = useRingtoneMuted()\n useRingTimeout(ring)\n // Stops on accept (busy), decline / timeout / caller hang-up (ring removed), or mute.\n useRingtone(!!ring && !busy, muted)\n\n if (!ring) return null\n\n const accept = async () => {\n setBusy(true)\n await acceptRing(arbi, ring)\n setBusy(false)\n }\n\n // thread: a workspace-locked thread call; dm: our direct chat; meeting: a group / meeting chat;\n // none: a contacts or calendar-event call.\n const context =\n ring.context === 'dm'\n ? 'is calling you'\n : ring.context === 'thread'\n ? 'started a call in a shared thread'\n : ring.context === 'meeting'\n ? 'invites you to a group call'\n : 'invites you to a call'\n\n return (\n <IncomingCallCard\n className=\"fixed right-4 top-4 z-[60]\"\n callerName={ring.caller_name}\n caller={<CallUserPill identity={ring.caller_ext_id} name={ring.caller_name} size=\"sm\" />}\n context={context}\n busy={busy}\n muted={muted}\n onMutedChange={setMuted}\n onAccept={() => void accept()}\n onDecline={() => declineRing(arbi, ring)}\n />\n )\n}\n","/**\n * The global call surface, mounted once by the host: the incoming-call ringer (when the call UI is\n * on, `useCallsEnabled`) and, only while a call is active, the dock. The dock is loaded on demand: it\n * pulls in LiveKit, so a page without a call never downloads it. The dock is not gated: an active\n * call comes from the gated call buttons or from a call link, which must open for everyone.\n */\n\nimport { lazy, Suspense, type ReactElement } from 'react'\nimport { useCallSession, useCallsEnabled } from '@arbidocs/react'\nimport { ConnectedIncomingCall } from './ConnectedIncomingCall'\n\n/** The dock (and with it LiveKit), loaded when a call starts. */\nexport const ConnectedCallDock = lazy(() =>\n import('./ConnectedCallDock').then((m) => ({ default: m.ConnectedCallDock }))\n)\n\n/** One call room, loaded on demand (LiveKit); render it inside `<Suspense>`. */\nexport const ConnectedCallRoom = lazy(() =>\n import('./ConnectedCallRoom').then((m) => ({ default: m.ConnectedCallRoom }))\n)\n\nexport function ConnectedCallLayer(): ReactElement {\n const hasActiveCall = useCallSession((s) => s.active !== null)\n const hasIncomingCall = useCallSession((s) => s.incoming.length > 0)\n const callsEnabled = useCallsEnabled()\n return (\n <>\n {hasActiveCall && (\n <Suspense fallback={null}>\n <ConnectedCallDock />\n </Suspense>\n )}\n {hasIncomingCall && callsEnabled && <ConnectedIncomingCall />}\n </>\n )\n}\n","/**\n * Call button for an open group chat: the group's call (the group is its meeting chat). The\n * members picker opens with everyone ticked; only the people left ticked are rung.\n */\n\nimport {\n useArbi,\n chatLiveCallId,\n useCallSession,\n openCall,\n startChatCall,\n useCanHostCalls,\n type UserResponse,\n} from '@arbidocs/react'\nimport { isAgent } from '@arbidocs/react/ui'\nimport { useState, type ReactElement } from 'react'\nimport { useConnectedWorkspace } from '../../connection/ConnectionProvider'\nimport { StartCallButton } from './StartCallButton'\nimport { CallPeoplePicker } from './CallPeoplePicker'\n\nexport function GroupCallButton({\n chatExtId,\n title,\n members,\n}: {\n chatExtId: string\n title: string | null\n members: UserResponse[]\n}): ReactElement {\n const arbi = useArbi()\n const { userId: me } = useConnectedWorkspace()\n const liveCallId = useCallSession((s) => chatLiveCallId(s, chatExtId))\n const isLive = liveCallId !== null\n const canHost = useCanHostCalls()\n const [picking, setPicking] = useState(false)\n const others = members.filter((u) => u.external_id !== me && !isAgent(u))\n\n return (\n <>\n <StartCallButton\n onStart={async () => {\n // Someone who may not host opens the running call itself (a new create would make them its host).\n if (liveCallId && !canHost) return openCall(arbi, { callExtId: liveCallId })\n if (isLive) return startChatCall(arbi, { chatExtId, title, ring: [] })\n setPicking(true)\n return true\n }}\n isLive={isLive}\n label=\"Call the group\"\n testId=\"group-call-button\"\n />\n {picking && (\n <CallPeoplePicker\n open\n onOpenChange={setPicking}\n scope=\"chat\"\n members={others}\n preselected={others.map((u) => u.external_id)}\n onSubmit={async ({ ring }) => {\n await startChatCall(arbi, { chatExtId, title, ring })\n }}\n />\n )}\n </>\n )\n}\n","/** Call button for an open DM thread: a new call with the peer as context, ringing the peer. */\n\nimport { useArbi, userDisplayName, startDmCall, type UserResponse } from '@arbidocs/react'\nimport type { ReactElement } from 'react'\nimport { StartCallButton } from './StartCallButton'\n\nexport function DmCallButton({ peer }: { peer: UserResponse }): ReactElement {\n const arbi = useArbi()\n const name = userDisplayName(peer)\n return (\n <StartCallButton\n onStart={() =>\n startDmCall(arbi, {\n external_id: peer.external_id,\n encryption_public_key: peer.encryption_public_key ?? null,\n name,\n })\n }\n label={`Call ${name}`}\n testId=\"dm-call-button\"\n />\n )\n}\n","/**\n * \"New call\" — a call with people from my contacts (no thread or chat). Registered contacts are\n * rung; unregistered ones get a personal invite link by e-mail (register, then join). Its meeting chat is made on first\n * use. Renders nothing unless the person may host calls (server + Settings → Experimental + entitlement).\n */\n\nimport { useArbi, useCallSession, useCanHostCalls, startContactsCall } from '@arbidocs/react'\nimport { getUserDisplayName } from '@arbidocs/react/ui'\nimport { useState, type ReactElement } from 'react'\nimport { DmInviteChip } from '../../collaboration/direct-messages/DirectMessages'\nimport { CallPeoplePicker } from './CallPeoplePicker'\nimport { contactsCallTitle } from '../call-cards'\n\nexport function NewCallChip(): ReactElement | null {\n // Gate first so a deployment without calls pays for none of the hooks below.\n return useCanHostCalls() ? <EnabledNewCallChip /> : null\n}\n\nfunction EnabledNewCallChip(): ReactElement {\n const arbi = useArbi()\n const inCall = useCallSession((s) => s.active !== null)\n const [open, setOpen] = useState(false)\n return (\n <>\n <DmInviteChip\n testId=\"dm-new-call-chip\"\n title=\"New call\"\n description={inCall ? 'You are already in a call' : 'Call people from your contacts'}\n onClick={() => !inCall && setOpen(true)}\n />\n {open && (\n <CallPeoplePicker\n open\n onOpenChange={setOpen}\n scope=\"contacts\"\n onSubmit={async ({ ring, invites }) => {\n await startContactsCall(arbi, {\n title: contactsCallTitle([\n ...ring.map((u) => getUserDisplayName(u)),\n ...invites.map((g) => g.name),\n ]),\n ring,\n invites,\n })\n }}\n />\n )}\n </>\n )\n}\n","/**\n * A `kind=call` chat message (the server posts one into the call's chat — a DM, a group or a\n * meeting chat — when a session starts). The newest card of a call shows its state:\n *\n * live: \"Ada started a call\" · Join\n * ended: \"Call · 12 min · joined Ada, Bob\"\n *\n * Older cards of the same call (earlier sessions) stay a plain \"Call\" line. The call is re-read on\n * `call.started` / `call.ended` (see `refreshCallCards`).\n */\n\nimport { useArbi, useCallSession, useCall, openCall } from '@arbidocs/react'\nimport { useState, type ReactElement } from 'react'\nimport { Phone, PhoneOff } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { formatCallDuration, isCallLive } from '../call-cards'\n\nexport function ChatCallCard({\n callExtId,\n senderName,\n latest,\n name,\n time,\n}: {\n callExtId: string\n /** Who started the session (the card's sender). */\n senderName: string | null\n /** The newest card of this call in the chat. */\n latest: boolean\n /** A member's display name by user ext id. */\n name: (userExtId: string) => string\n time?: string\n}): ReactElement {\n const arbi = useArbi()\n const { data: call } = useCall(latest ? callExtId : null)\n const liveNow = useCallSession((s) => callExtId in s.liveCalls)\n const inThisCall = useCallSession((s) => s.active?.callExtId === callExtId)\n const inAnotherCall = useCallSession((s) => !!s.active && s.active.callExtId !== callExtId)\n const [busy, setBusy] = useState(false)\n const live = latest && isCallLive(call, liveNow)\n\n let summary: string\n if (live) summary = senderName ? `${senderName} started a call` : 'Call in progress'\n else if (latest && call?.started_at && call.ended_at) {\n const seconds = (Date.parse(call.ended_at) - Date.parse(call.started_at)) / 1000\n const joined = (call.last_participants ?? []).map(name)\n summary = [\n 'Call',\n formatCallDuration(seconds),\n joined.length ? `joined ${joined.join(', ')}` : null,\n ]\n .filter(Boolean)\n .join(' · ')\n } else summary = senderName ? `Call started by ${senderName}` : 'Call'\n\n return (\n <div\n className=\"mx-auto my-2 flex w-fit max-w-full flex-wrap items-center justify-center gap-2 rounded-md border border-border bg-card px-3 py-2 text-xs\"\n data-testid=\"chat-call-card\"\n data-live={live || undefined}\n >\n {live ? (\n <Phone className=\"size-4 animate-pulse text-green-text\" aria-hidden />\n ) : (\n <PhoneOff className=\"size-4 text-muted-foreground\" aria-hidden />\n )}\n <span data-testid=\"chat-call-card-summary\">{summary}</span>\n {time && <time className=\"text-muted-foreground\">{time}</time>}\n {live && (\n <Button\n type=\"button\"\n size=\"sm\"\n className=\"h-7 bg-green-600 text-white hover:bg-green-700\"\n disabled={busy || inThisCall || inAnotherCall}\n title={inAnotherCall ? 'You are already in a call' : undefined}\n onClick={() => {\n setBusy(true)\n void openCall(arbi, { callExtId }).finally(() => setBusy(false))\n }}\n data-testid=\"chat-call-card-join\"\n >\n {inThisCall ? 'In call' : 'Join'}\n </Button>\n )}\n </div>\n )\n}\n","/**\n * A chat thread's history with its call: the messenger kit's `ThreadHistory` (blocks\n * `ConnectedChatThread`). A chat with a call (a meeting chat, or a direct or group chat a call was\n * started from) shows its call cards, live transcript, recordings and the speakers talking right\n * now, and filters between everything, the typed chat, the transcript and the recordings. Typed\n * messages are drawn by the kit (`renderItem`).\n */\n\nimport { Fragment, useEffect, useMemo, useState } from 'react'\nimport {\n DateSeparator,\n useArbi,\n type ChatThreadMessage,\n useCall,\n chatTranscriptRef,\n hasRecordingTranscript,\n sortTranscriptMessages,\n supersededTranscriptLines,\n type TranscriptExportLine,\n useRecordingWindows,\n} from '@arbidocs/react'\nimport { chats } from '@arbidocs/sdk/browser'\nimport { ConversationFilter } from '../../chat/TranscriptLine'\nimport { transcriptRuns } from '../../chat/transcript-runs'\nimport type { ChatHistoryProps } from '../../connection/messenger/types'\nimport { usePendingRecording } from '../recording-link'\nimport { ChatCallCard } from './ChatCallCard'\nimport { TranscriptEntry } from './TranscriptEntry'\nimport { CallConversationEmpty, ProvisionalSpeakers } from './CallConversationParts'\nimport { useProvisionalSpeakers } from './provisional-speakers'\nimport { SaveTranscriptToThread } from './SaveTranscriptToThread'\nimport { RecordingCard, RecordingsList } from './RecordingCard'\n\nconst { isTranscriptMessage, parseTranscriptContent } = chats\n\nexport function ConnectedCallChatHistory({\n chat,\n messages,\n items,\n renderItem,\n loadOlder,\n memberById,\n senderName,\n myExtId,\n formatTime,\n formatDay,\n}: ChatHistoryProps) {\n const arbi = useArbi()\n // A call's chat: everything, typed chat only, the transcript only, or the recordings.\n const [view, setView] = useState<'all' | 'chat' | 'transcript' | 'recordings'>('all')\n useEffect(() => setView('all'), [chat?.external_id])\n // A call's chat (meeting, DM or group with a call) lists the call's recordings.\n const recordingsCallExtId = chat?.call_ext_id ?? null\n // A recording link opened this chat: show its recordings.\n const pendingRecording = usePendingRecording()\n useEffect(() => {\n if (pendingRecording && recordingsCallExtId) setView('recordings')\n }, [pendingRecording, recordingsCallExtId])\n\n // The newest call card of each call shows its live / ended state; older ones are a plain line.\n const latestCallCards = useMemo(() => {\n const latest = new Map<string, string>()\n for (const m of messages)\n if (m.kind === 'call' && m.call_ext_id && !m.deleted) latest.set(m.call_ext_id, m.external_id)\n return new Set(latest.values())\n }, [messages])\n\n // A recording's transcript supersedes the live lines spoken while it recorded (else both show).\n const hasRecTranscript = useMemo(\n () => hasRecordingTranscript(messages, chatTranscriptRef),\n [messages]\n )\n const recordingWindows = useRecordingWindows(recordingsCallExtId, hasRecTranscript)\n const supersededTranscript = useMemo(\n () => supersededTranscriptLines(messages, chatTranscriptRef, recordingWindows),\n [messages, recordingWindows]\n )\n const transcriptMessages = useMemo(\n () =>\n sortTranscriptMessages(\n messages.filter((m) => isTranscriptMessage(m) && !m.deleted && !supersededTranscript.has(m))\n ),\n [messages, supersededTranscript]\n )\n const hasTranscript = transcriptMessages.length > 0\n\n // The host can save the decrypted transcript as one comment into a workspace thread.\n const { data: meetingCall } = useCall(hasTranscript ? chat?.call_ext_id : null)\n const isHost = !!meetingCall?.is_creator\n const [meetingTitle, setMeetingTitle] = useState<string | null>(null)\n useEffect(() => {\n if (!chat || (!isHost && !recordingsCallExtId)) return\n let cancelled = false\n arbi.chats\n .title(chat)\n .then((t) => !cancelled && setMeetingTitle(t))\n .catch(() => undefined)\n return () => {\n cancelled = true\n }\n }, [arbi, isHost, chat, recordingsCallExtId])\n\n const transcriptSpeaker = (msg: ChatThreadMessage) => {\n const parsed = msg.decryptFailed ? null : parseTranscriptContent(msg.content)\n return { parsed, speakerId: parsed?.speaker_identity || msg.sender_ext_id || '' }\n }\n const transcriptExport = useMemo<TranscriptExportLine[]>(\n () =>\n transcriptMessages\n .filter((m) => !m.decryptFailed)\n .map((m) => {\n const parsed = parseTranscriptContent(m.content)\n const speakerId = parsed?.speaker_identity || m.sender_ext_id || ''\n return {\n speaker:\n parsed?.speaker_name ||\n (memberById(speakerId) ? senderName(speakerId) : '') ||\n 'Former member',\n at: parsed?.started_at ?? m.created_at,\n text: parsed?.text ?? m.content ?? '',\n }\n }),\n [transcriptMessages, memberById, senderName]\n )\n // Consecutive lines of one speaker are one run (the name once); each speaker's newest line is\n // highlighted while they talk in the call.\n const transcriptLayout = useMemo(() => {\n const shown = view === 'transcript' ? transcriptMessages : messages\n const continued = transcriptRuns(\n shown,\n (m) =>\n isTranscriptMessage(m) && !supersededTranscript.has(m)\n ? transcriptSpeaker(m).speakerId\n : null,\n (m) => Date.parse(transcriptSpeaker(m).parsed?.started_at ?? m.created_at ?? '') || 0\n )\n return { continued }\n }, [view, messages, transcriptMessages, supersededTranscript])\n const transcriptEntry = (msg: ChatThreadMessage) => {\n const { parsed, speakerId } = transcriptSpeaker(msg)\n return (\n <TranscriptEntry\n key={msg.external_id}\n speakerId={speakerId}\n speakerName={\n speakerId === myExtId\n ? 'Me'\n : parsed?.speaker_name ||\n (memberById(speakerId) ? senderName(speakerId) : senderName(msg.sender_ext_id))\n }\n text={parsed?.text ?? msg.content ?? ''}\n at={parsed?.started_at ?? msg.created_at}\n continued={transcriptLayout.continued.has(msg)}\n />\n )\n }\n // While I am in this chat's call: \"<speaker> is speaking…\" until their line arrives.\n const chatLines = useMemo(\n () =>\n transcriptMessages.map((m) => {\n const { parsed, speakerId } = transcriptSpeaker(m)\n return { speakerId, at: Date.parse(parsed?.started_at ?? m.created_at ?? '') || 0 }\n }),\n\n [transcriptMessages]\n )\n const provisionalSpeakers = useProvisionalSpeakers(recordingsCallExtId, chatLines)\n\n const filterOptions = [\n { value: 'all' as const, label: 'All' },\n { value: 'chat' as const, label: 'Chat', testId: 'chat-filter' },\n {\n value: 'transcript' as const,\n label: 'Transcript',\n count: transcriptMessages.length,\n testId: 'transcript-filter',\n },\n ...(recordingsCallExtId\n ? [{ value: 'recordings' as const, label: 'Recordings', testId: 'recordings-filter' }]\n : []),\n ]\n\n return (\n <>\n {messages.length === 0 && recordingsCallExtId && (\n <CallConversationEmpty callExtId={recordingsCallExtId} />\n )}\n {(hasTranscript || recordingsCallExtId) && (\n <div className=\"sticky top-0 z-10 flex justify-center py-1\">\n <ConversationFilter<typeof view>\n value={view}\n options={filterOptions}\n onChange={setView}\n />\n </div>\n )}\n {view === 'recordings' && recordingsCallExtId && (\n <RecordingsList callExtId={recordingsCallExtId} title={meetingTitle} className=\"py-1\" />\n )}\n {loadOlder}\n {view === 'transcript' && (\n <div className=\"flex flex-col py-1\" data-testid=\"transcript-view\">\n {isHost && (\n <SaveTranscriptToThread\n title={meetingTitle}\n lines={transcriptExport}\n className=\"mx-3 mb-2 self-start\"\n />\n )}\n {transcriptMessages.map((msg) => transcriptEntry(msg))}\n <ProvisionalSpeakers ids={provisionalSpeakers} />\n </div>\n )}\n {(view === 'all' || view === 'chat') &&\n items.map((item, i) => {\n const { message: msg, isFirstOfDay } = item\n const deleted = !!msg.deleted\n // A deleted transcript line is not part of the record (it may be stored again).\n if (deleted && isTranscriptMessage(msg)) return null\n const separator = isFirstOfDay && (\n <DateSeparator>{formatDay(msg.created_at)}</DateSeparator>\n )\n if (isTranscriptMessage(msg)) {\n if (view === 'chat') return null\n // A live line superseded by the recording's transcript is not shown.\n const superseded = supersededTranscript.has(msg)\n if (superseded && !isFirstOfDay) return null\n return (\n <Fragment key={msg.external_id}>\n {separator}\n {!superseded && transcriptEntry(msg)}\n </Fragment>\n )\n }\n if (msg.kind === 'recording' && msg.call_ext_id && !deleted) {\n // The server's Recording card (posted when a recording stops).\n return (\n <Fragment key={msg.external_id}>\n {separator}\n <RecordingCard\n callExtId={msg.call_ext_id}\n recordingExtId={msg.recording_ext_id ?? null}\n title={meetingTitle}\n time={formatTime(msg.created_at)}\n />\n </Fragment>\n )\n }\n if (msg.kind === 'call' && msg.call_ext_id && !deleted) {\n return (\n <Fragment key={msg.external_id}>\n {separator}\n <ChatCallCard\n callExtId={msg.call_ext_id}\n senderName={msg.sender_ext_id ? senderName(msg.sender_ext_id) : null}\n latest={latestCallCards.has(msg.external_id)}\n name={senderName}\n time={formatTime(msg.created_at)}\n />\n </Fragment>\n )\n }\n return renderItem(item, i)\n })}\n {view === 'all' && <ProvisionalSpeakers ids={provisionalSpeakers} />}\n </>\n )\n}\n"]}
|