@corva/chat-core 0.1.0 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/alert.ts","../src/types/appComment.ts","../src/types/corvaSystemMessage.ts","../src/constants/constants.ts","../src/utils/alertMessageAsText.ts","../src/utils/buildGroupChannelName.ts","../src/utils/isSystemMessage.ts","../src/utils/canDeleteMessage.ts","../src/utils/canEditMessage.ts","../src/utils/channelToAsset.ts","../src/utils/chatAssetPermissionsSnapshot.ts","../src/utils/isUnread.ts","../src/utils/compareByActivity.ts","../src/utils/compareByName.ts","../src/utils/createLatestWinsQueue.ts","../src/utils/dateLabels.ts","../src/utils/deriveChatAsset.ts","../src/utils/getAssetTypeFromDisplayName.ts","../src/utils/getReactionCount.ts","../src/utils/getRoomDisplayName.ts","../src/utils/getUserDisplayName.ts","../src/utils/getSystemMessageWithCorvaNames.ts","../src/utils/getUserSecondaryText.ts","../src/utils/hasReactions.ts","../src/utils/hasUserReacted.ts","../src/utils/isAlertMessage.ts","../src/utils/isAppCommentMessage.ts","../src/utils/isAskCorvaMessage.ts","../src/utils/isDmGroup.ts","../src/utils/isForwardedMessage.ts","../src/utils/isGeneralRoom.ts","../src/utils/isSoftDeletedMessage.ts","../src/utils/isUserOnline.ts","../src/utils/isVisibleUnread.ts","../src/utils/parseCorvaSystemMessage.ts","../src/utils/searchMessages.ts","../src/utils/searchRooms.ts","../src/utils/searchUsers.ts","../src/utils/sortByRecency.ts","../src/utils/sortChannels.ts","../src/utils/sortDMs.ts","../src/utils/sortMessagesByTime.ts","../src/utils/sortUsersByStatus.ts","../src/utils/stripPlatformMentions.ts","../src/utils/ulidTimestamp.ts","../src/utils/validateChannelName.ts","../src/platform/types.ts","../src/api/core/http.ts","../src/api/modules/auth.ts","../src/api/modules/users.ts","../src/api/socket/transforms/messageTransform.ts","../src/api/modules/messages.ts","../src/api/modules/channels.ts","../src/api/modules/reactions.ts","../src/api/modules/attachments.ts","../src/api/modules/directMessages.ts","../src/api/modules/groups.ts","../src/api/RevoltAPI.ts","../src/api/socket/core/connection.ts","../src/api/socket/services/userCache.ts","../src/api/socket/handlers/messageHandlers.ts","../src/api/socket/handlers/eventRouter.ts","../src/api/socket/services/reconnection.ts","../src/api/RevoltSocket.ts","../src/platform/storage.ts","../src/store/services/sessionManager.ts","../src/store/services/lastRoomTracker.ts","../src/store/services/messageCache.ts","../src/store/services/messageLocator.ts","../src/store/services/typingManager.ts","../src/store/services/roomTaskQueue.ts","../src/store/utils/messageOperations.ts","../src/store/utils/messageHelpers.ts","../src/store/utils/subscriptionOperations.ts","../src/platform/host.ts","../src/utils/isDeepEqual.ts","../src/utils/notificationPause.ts","../src/utils/waitForNextPaint.ts","../src/api/modules/assetChats.ts","../src/services/corvaUserService.ts","../src/store/sharedRefs.ts","../src/store/stores/notificationStore.ts","../src/store/stores/channelContentFilterStore.ts","../src/store/stores/favoriteRoomsStore.ts","../src/store/services/roomSelectionCoordinator.ts","../src/store/stores/memberStore.ts","../src/store/stores/assetStore.ts","../src/store/stores/navigationHistoryStore.ts","../src/store/stores/roomStore.ts","../src/store/stores/uiStore.ts","../src/store/stores/authStore.ts","../src/store/stores/messageStore.ts","../src/store/services/socketEventHandlers.ts","../src/store/services/ackScheduler.ts","../src/store/services/unreadWatcher.ts","../src/store/init.ts","../src/store/stores/chatToastStore.ts","../src/store/services/chatSession.ts"],"names":["suffix","inFlight","me","searchUsers","userCache","url","message","handlers","getDisplayName","response","uploadedFiles","uuid","createStore","members","getInitialState","setChatError","isSystemMessage"],"mappings":"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","file":"index.js","sourcesContent":["export const ALERT_SEVERITY = {\n CRITICAL: 'critical',\n WARNING: 'warning',\n INFO: 'info',\n} as const;\n\nexport type AlertSeverity = (typeof ALERT_SEVERITY)[keyof typeof ALERT_SEVERITY];\n\nexport interface AlertData {\n alertId: string;\n alertDefinitionId?: string;\n severity: AlertSeverity;\n rig?: {\n id: string;\n name: string;\n };\n title: string;\n description: string;\n isTruncated?: boolean;\n details?: string;\n detailsUrl?: string;\n appName?: string;\n assetId?: string;\n assetName?: string;\n}\n","export interface AppCommentAttachment {\n url: string;\n /** Original file name (with extension), used to tell images apart from other file types. */\n name?: string;\n /** File size in bytes, shown next to the name for non-media attachments. */\n size?: number;\n}\n\nexport interface AppCommentData {\n body: string;\n appName?: string;\n authorCorvaId?: number;\n forwarderCorvaId?: number;\n activityType?: string;\n activityId?: string;\n attachments?: AppCommentAttachment[];\n /** @deprecated Use `attachments`. Kept so messages sent before multi-attachment still render. */\n attachmentUrl?: string;\n /** @deprecated Use `attachments`. */\n attachmentName?: string;\n /** @deprecated Use `attachments`. */\n attachmentSize?: number;\n appId?: string;\n dashboardId?: string;\n appUrl?: string;\n /** Structured metadata — depth values in ft, formatted at render time in the viewer's preferred unit. */\n metadata?: { holeDepth?: number; bitDepth?: number; commentDepth?: number };\n settingsSnapshotId?: string;\n isTruncated?: boolean;\n /** Transient: app settings at forward time. Saved to snapshot storage, never sent in the message. */\n settings?: Record<string, unknown>;\n}\n\n/** Single source of truth for reading a comment's files, whichever field the sender populated. */\nexport function getAppCommentAttachments(data: AppCommentData): AppCommentAttachment[] {\n if (data.attachments?.length) return data.attachments.filter(file => !!file?.url);\n\n return data.attachmentUrl\n ? [{ url: data.attachmentUrl, name: data.attachmentName, size: data.attachmentSize }]\n : [];\n}\n\n/** A single file shared to channels as a new message, rather than forwarded with its comment. */\nexport interface SharedFile {\n url: string;\n name: string;\n type?: string;\n /** Worked out from the file name upstream; more reliable than a stored MIME type. */\n kind?: 'image' | 'video' | 'file';\n}\n","export const CORVA_SYS_PREFIX = '$$CORVA::';\n\nexport const CORVA_MESSAGE_TYPES = {\n ALERT: 'alert',\n FEED: 'feed',\n ASK_CORVA: 'ask',\n FORWARD: 'fwd',\n APP_COMMENT: 'cmt',\n} as const;\n\nexport interface ForwardWirePayload {\n cid: string;\n mid: string;\n cn: string;\n priv: boolean;\n n?: string;\n ts?: string; // ISO timestamp of the original message\n}\n\nexport type CorvaSystemMessage =\n | { t: typeof CORVA_MESSAGE_TYPES.ALERT; v: number; d: AlertWirePayload }\n | { t: typeof CORVA_MESSAGE_TYPES.FEED; v: number; d: FeedWirePayload }\n | { t: typeof CORVA_MESSAGE_TYPES.ASK_CORVA; v: number; d: AskCorvaWirePayload }\n | { t: typeof CORVA_MESSAGE_TYPES.FORWARD; v: number; d: ForwardWirePayload }\n | { t: typeof CORVA_MESSAGE_TYPES.APP_COMMENT; v: number; d: AppCommentWirePayload };\n\nexport type WireSeverity = 'c' | 'w' | 'i';\n\nexport interface AlertWirePayload {\n id: string;\n defId?: string;\n sev: WireSeverity;\n ttl: string;\n dsc: string;\n trunc?: boolean;\n app?: string;\n assetId?: string;\n assetName?: string;\n}\n\nexport interface FeedWirePayload {\n id: string;\n ft: string;\n ttl: string;\n dsc?: string;\n assetId?: string;\n usr?: string;\n}\n\nexport interface AskCorvaWirePayload {\n id: string;\n a: string;\n aRef?: string; // conversationId — fetch full answer from AskCorva backend when `a` is empty\n cId?: number; // sharer's company_id — askcorva.history records live under it, not the viewer's\n trunc?: boolean;\n assetId?: number;\n agentName?: string; // human-readable agent display name\n}\n\n/**\n * One attachment on the wire. Keys are single letters like every other field in these payloads:\n * they ride inside the message body, which is truncated at MAX_COMMENT_BODY_LENGTH.\n */\ninterface AttachmentWirePayload {\n /** Attachment URL. */\n u: string;\n /** Original file name, with extension — lets the reader tell media apart from documents. */\n n?: string;\n /** File size in bytes. */\n s?: number;\n}\n\nexport interface AppCommentWirePayload {\n body: string;\n app?: string; // app display name\n usrId?: number; // forwarder corva user ID\n autId?: number; // comment author corva user ID\n at?: string; // activity type (e.g. \"dvd_comment\")\n att?: string; // first attachment URL — kept so pre-multi-attachment clients still render one file\n atts?: AttachmentWirePayload[];\n actId?: string; // activity ID for lazy-fetching full content\n appId?: string; // app definition ID for icon/info fetching\n dashId?: string; // dashboard ID for deep linking\n appUrl?: string; // full app URL with asset context\n meta?: { hd?: number; bd?: number; cd?: number }; // raw depth values in ft for viewer-side unit conversion\n snpId?: string; // settings snapshot ID — replaces dashboard-based settings fetching\n trunc?: boolean; // body was truncated, fetch full content from activity API\n}\n","import type { ChatAssetType, SelectableAssetType } from '../types/asset';\n\n// Lowercase name prefixes the backend uses for system-created asset chats\n// (\"Rig: …\" / \"Fleet: …\" / \"Unit: …\").\nexport const ASSET_CHAT_PREFIXES: Record<ChatAssetType, string> = {\n rig: 'rig: ',\n frac_fleet: 'fleet: ',\n intervention_unit: 'unit: ',\n};\n\n// Human-readable noun per selectable asset type.\nexport const ASSET_NOUN: Record<SelectableAssetType, string> = {\n rig: 'Rig',\n frac_fleet: 'Fleet',\n intervention_unit: 'Unit',\n well: 'Well',\n};\n\n// jsonApi field lists per chat asset type, shared by the list and by-id fetchers.\nexport const ASSET_API_FIELDS: Record<ChatAssetType, string[]> = {\n rig: ['rig.id', 'rig.name'],\n frac_fleet: ['frac_fleet.id', 'frac_fleet.name'],\n intervention_unit: ['intervention_unit.id', 'intervention_unit.name'],\n};\n\n// Mention patterns\nexport const MENTION_REPLACE_PATTERN = /@[a-zA-Z0-9_.+-]*$/;\nexport const MENTION_SPLIT_PATTERN = /(\\B@[a-zA-Z0-9_.+-]+)/g;\n\n// Revolt system/null user ID - used to identify system messages and invalid users\nexport const REVOLT_SYSTEM_USER_ID = '00000000000000000000000000';\n\n// System message text templates\nexport const SYSTEM_MESSAGE_TEXTS = {\n USER_ADDED: (by: string, user: string) => `${by} added ${user} to the channel`,\n USER_REMOVED: (by: string, user: string) => `${user} was removed from this channel by ${by}`,\n USER_LEFT: (user: string) => `${user} left the channel`,\n MESSAGE_PINNED: (user: string) => `${user} pinned a message`,\n MESSAGE_UNPINNED: (user: string) => `${user} unpinned a message`,\n DEFAULT_USER: 'User',\n} as const;\n\n// Revolt channel types\nexport const CHANNEL_TYPES = {\n DIRECT_MESSAGE: 'DirectMessage',\n GROUP: 'Group',\n TEXT_CHANNEL: 'TextChannel',\n SAVED_MESSAGES: 'SavedMessages',\n} as const;\n\nexport const GENERAL_CHAT_NAME = 'General';\nexport const CHANNEL_NAME_MAX_LENGTH = 32;\n\nexport const SIDEBAR_SECTIONS = {\n FAVORITES: 'favorites',\n CHANNELS: 'channels',\n DIRECT: 'direct',\n} as const;\n\nexport type SidebarSectionKey = (typeof SIDEBAR_SECTIONS)[keyof typeof SIDEBAR_SECTIONS];\n\nexport const SIDEBAR_TABS = {\n ALL: 'all',\n UNREAD: 'unread',\n RECENT: 'recent',\n} as const;\n\nexport type SidebarTabKey = (typeof SIDEBAR_TABS)[keyof typeof SIDEBAR_TABS];\n\nexport const ROOM_LIST_ORDER = {\n ALPHABETICAL: 'alphabetical',\n RECENT: 'recent',\n} as const;\n\nexport type RoomListOrder = (typeof ROOM_LIST_ORDER)[keyof typeof ROOM_LIST_ORDER];\n\nexport const DEFAULT_ROOM_LIST_ORDER: RoomListOrder = ROOM_LIST_ORDER.ALPHABETICAL;\n\n// Mirrors the server (Autumn) upper bound so oversized files fail fast with a clear\n// message instead of a slow upload round-trip.\nexport const MAX_ATTACHMENT_SIZE_MB = 500;\nexport const MAX_ATTACHMENT_SIZE_BYTES = MAX_ATTACHMENT_SIZE_MB * 1024 * 1024;\n","import type { Message } from '../types/message';\n\nexport function alertMessageAsText(message: Message): Message {\n const { alert, ...rest } = message;\n return {\n ...rest,\n t: undefined,\n msg: [alert?.title, alert?.description].filter(Boolean).join('\\n'),\n groupable: true,\n };\n}\n","import { CHANNEL_NAME_MAX_LENGTH } from '../constants/constants';\n\n/**\n * Builds a group channel name from an ordered list of display names, fitting\n * within the backend's 32-character limit.\n *\n * Strategy (in order):\n * 1. Full display names joined by \", \"\n * 2. First names only joined by \", \"\n * 3. As many first names as fit + \", and N others\"\n * 4. Single (possibly truncated) first name + \", and N others\"\n */\nexport function buildGroupChannelName(displayNames: string[]): string {\n const fullName = displayNames.join(', ');\n if (fullName.length <= CHANNEL_NAME_MAX_LENGTH) return fullName;\n\n const firstNames = displayNames.map(n => n.split(' ')[0]);\n const firstNamesJoined = firstNames.join(', ');\n if (firstNamesJoined.length <= CHANNEL_NAME_MAX_LENGTH) return firstNamesJoined;\n\n let result = '';\n for (let i = 1; i < firstNames.length; i += 1) {\n const remaining = firstNames.length - i;\n const suffix = `, and ${remaining} other${remaining > 1 ? 's' : ''}`;\n const candidate = firstNames.slice(0, i).join(', ') + suffix;\n if (candidate.length <= CHANNEL_NAME_MAX_LENGTH) {\n result = candidate;\n } else {\n break;\n }\n }\n if (result) return result;\n\n const others = firstNames.length - 1;\n const suffix = `, and ${others} other${others > 1 ? 's' : ''}`;\n return `${(firstNames[0] ?? '').slice(0, CHANNEL_NAME_MAX_LENGTH - suffix.length)}${suffix}`;\n}\n","import type { Message } from '../types/message';\nimport { CORVA_MESSAGE_TYPES } from '../types/corvaSystemMessage';\n\nconst CORVA_TYPES: string[] = Object.values(CORVA_MESSAGE_TYPES);\n\nexport const isSystemMessage = (message: Message): boolean => {\n if (!message.t || message.t === 'message') return false;\n if (CORVA_TYPES.includes(message.t)) return false;\n return true;\n};\n","import type { Message } from '../types/message';\n\nimport { isSystemMessage } from './isSystemMessage';\n\nexport const canDeleteMessage = (message: Message, currentUserId: string): boolean => {\n return message.u._id === currentUserId && !isSystemMessage(message);\n};\n","import type { Message } from '../types/message';\n\nimport { isSystemMessage } from './isSystemMessage';\n\nexport const canEditMessage = (message: Message, currentUserId: string): boolean => {\n return message.u._id === currentUserId && !isSystemMessage(message);\n};\n","import type { AssetChatChannel, ChatAssetType } from '../types/asset';\n\nexport interface ChannelAsset {\n assetId: number;\n assetType: ChatAssetType;\n}\n\nexport function channelToAsset(channel: AssetChatChannel): ChannelAsset | null {\n if (channel.rig_id != null) return { assetId: channel.rig_id, assetType: 'rig' };\n if (channel.frac_fleet_id != null) {\n return { assetId: channel.frac_fleet_id, assetType: 'frac_fleet' };\n }\n if (channel.intervention_unit_id != null) {\n return { assetId: channel.intervention_unit_id, assetType: 'intervention_unit' };\n }\n return null;\n}\n","import type { AssetChatChannel, ChatAssetType } from '../types/asset';\n\nimport { channelToAsset } from './channelToAsset';\n\n// Non-React snapshot of the per-segment chat permissions, written by\n// useChatPermissions once the ability checks resolve. Lets stores and services\n// (room auto-restore, permalinks, notification toasts) gate asset chats the\n// same way the React consumers of useDisallowedAssetChatIds do. While the\n// snapshot is unset (permissions still loading) every asset chat is treated as\n// disallowed, so a socket message cannot surface a chat the user may not see.\nlet allowedAssetTypesSnapshot: ChatAssetType[] | null = null;\n\nexport function setAllowedChatAssetTypes(assetTypes: ChatAssetType[]): void {\n allowedAssetTypesSnapshot = assetTypes;\n}\n\nexport function isChatAssetTypeAllowed(assetType: ChatAssetType): boolean {\n return !!allowedAssetTypesSnapshot?.includes(assetType);\n}\n\nexport function isDisallowedAssetChatRoom(\n roomId: string,\n assetChatChannels: AssetChatChannel[]\n): boolean {\n const channel = assetChatChannels.find(c => c.revolt_channel_id === roomId);\n const asset = channel ? channelToAsset(channel) : null;\n return !!asset && !isChatAssetTypeAllowed(asset.assetType);\n}\n\nexport function resetChatAssetPermissionsSnapshot(): void {\n allowedAssetTypesSnapshot = null;\n}\n","import type { Subscription } from '../types/subscription';\n\n// Channel is unread when there's a newer message than what the user has\n// acknowledged. Revolt message IDs are ULIDs — lexicographic comparison is\n// chronological. Mirrors Stoat's derived `channel.unread`.\nexport function isUnread(\n sub: Pick<Subscription, 'last_message_id' | 'last_acked_message_id'>\n): boolean {\n if (!sub.last_message_id) return false;\n const acked = sub.last_acked_message_id ?? '0';\n return acked < sub.last_message_id;\n}\n","import type { Subscription } from '../types/subscription';\n\nimport { isUnread } from './isUnread';\n\n/**\n * Comparator factory for subscription lists: unread first, then by last activity\n * (last_message_id descending — ULIDs are lexicographically time-sortable), then\n * alphabetically by the name returned from getName.\n */\nexport const compareByActivity =\n (getName: (sub: Subscription) => string) =>\n (a: Subscription, b: Subscription): number => {\n const aUnread = isUnread(a) ? 0 : 1;\n const bUnread = isUnread(b) ? 0 : 1;\n if (aUnread !== bUnread) return aUnread - bUnread;\n\n const aLast = a.last_message_id || '';\n const bLast = b.last_message_id || '';\n if (aLast !== bLast) return aLast > bLast ? -1 : 1;\n\n return getName(a).toLowerCase().localeCompare(getName(b).toLowerCase());\n };\n","import type { Subscription } from '../types/subscription';\n\nexport const compareByName =\n (getName: (sub: Subscription) => string) =>\n (a: Subscription, b: Subscription): number =>\n getName(a).toLowerCase().localeCompare(getName(b).toLowerCase());\n","// One request in flight; anything queued meanwhile collapses to the newest value.\nexport function createLatestWinsQueue<T>(send: (value: T) => Promise<unknown> | void) {\n let inFlight = false;\n let pending: { value: T } | null = null;\n\n const flush = (): void => {\n if (!pending) {\n inFlight = false;\n return;\n }\n const { value } = pending;\n pending = null;\n inFlight = true;\n // Executor runs synchronously; a sync throw becomes a rejection instead of stalling the queue.\n new Promise<unknown>(resolve => resolve(send(value))).catch(() => undefined).then(flush);\n };\n\n return (value: T): void => {\n pending = { value };\n if (!inFlight) flush();\n };\n}\n","export const DATE_SEPARATOR_LABELS = {\n TODAY: 'Today',\n YESTERDAY: 'Yesterday',\n} as const;\n","import type { ChatAssetType } from '../types/asset';\n\nexport interface ChatAssetIdentity {\n assetId: string;\n assetType: ChatAssetType;\n}\n\n// Asset chats are keyed by the parent asset of the dashboard:\n// drilling/drillout -> rig, completion -> frac fleet, intervention -> intervention unit.\nfunction deriveChatAsset(\n segment: string | null | undefined,\n rigId: number | null | undefined,\n fracFleetId: number | null | undefined,\n interventionUnitId: number | null | undefined\n): ChatAssetIdentity | null {\n if ((segment === 'drilling' || segment === 'drillout') && rigId) {\n return { assetId: String(rigId), assetType: 'rig' };\n }\n if (segment === 'intervention' && interventionUnitId) {\n return { assetId: String(interventionUnitId), assetType: 'intervention_unit' };\n }\n if (segment === 'completion' && fracFleetId) {\n return { assetId: String(fracFleetId), assetType: 'frac_fleet' };\n }\n return null;\n}\n\n// A dashboard asset in a segment the user has no chat permission for behaves\n// like a dashboard with no chat asset at all.\nexport function deriveAllowedChatAsset(\n segment: string | null | undefined,\n rigId: number | null | undefined,\n fracFleetId: number | null | undefined,\n interventionUnitId: number | null | undefined,\n allowedAssetTypes: ChatAssetType[]\n): ChatAssetIdentity | null {\n const asset = deriveChatAsset(segment, rigId, fracFleetId, interventionUnitId);\n if (!asset || !allowedAssetTypes.includes(asset.assetType)) {\n return null;\n }\n return asset;\n}\n","import type { ChatAssetType } from '../types/asset';\nimport { ASSET_CHAT_PREFIXES } from '../constants/constants';\n\n/**\n * Infers asset type from room display name. Asset chat names use\n * \"Rig: ...\" / \"Fleet: ...\" / \"Unit: ...\" prefixes.\n * Returns null if the name does not match.\n */\nexport function getAssetTypeFromDisplayName(displayName: string): ChatAssetType | null {\n const lower = displayName.toLowerCase();\n const entry = Object.entries(ASSET_CHAT_PREFIXES).find(([, prefix]) => lower.startsWith(prefix));\n return entry ? (entry[0] as ChatAssetType) : null;\n}\n","import type { Message } from '../types/message';\n\nexport const getReactionCount = (message: Message, emoji: string): number => {\n return message.reactions?.[emoji]?.userIds?.length || 0;\n};\n","import type { Room } from '../types/room';\nimport type { Subscription } from '../types/subscription';\nimport { ASSET_CHAT_PREFIXES } from '../constants/constants';\n\nexport const DIRECT_MESSAGE_PLACEHOLDER = 'Direct Message';\n\n/**\n * Strips the system prefix from asset chat names: \"Rig: AssetName\" /\n * \"Fleet: AssetName\" / \"Unit: AssetName\" display as just \"AssetName\".\n */\nexport function formatAssetChatName(name: string): string {\n const lower = name.toLowerCase();\n const prefix = Object.values(ASSET_CHAT_PREFIXES).find(p => lower.startsWith(p));\n return prefix ? name.slice(prefix.length) : name;\n}\n\nexport const getRoomDisplayName = (room: Room | Subscription): string => {\n if (room.t === 'd' && room.dmUsername && room.dmUsername !== DIRECT_MESSAGE_PLACEHOLDER) {\n return room.dmUsername;\n }\n if ('fname' in room && room.fname) return formatAssetChatName(room.fname);\n if (room.name) return formatAssetChatName(room.name);\n return 'Unknown Room';\n};\n","import type { User } from '../types/user';\n\nexport const getUserDisplayName = (user: Partial<User>): string => {\n return user.displayName || user.name || user.username || 'Unknown User';\n};\n","import type { Message } from '../types/message';\nimport type { User } from '../types/user';\nimport { SYSTEM_MESSAGE_TEXTS } from '../constants/constants';\n\nimport { getUserDisplayName } from './getUserDisplayName';\n\nconst resolveDisplayName = (\n userId: string | undefined,\n getUserById: (userId: string) => User | undefined\n): string | null => {\n if (!userId) return null;\n const user = getUserById(userId);\n return user ? getUserDisplayName(user) : null;\n};\n\nexport const getSystemMessageWithCorvaNames = (\n message: Message,\n getUserById: (userId: string) => User | undefined\n): string => {\n if (message.systemUsers) {\n const { userId, actorId } = message.systemUsers;\n\n // Only enrich when all referenced users resolve; otherwise fall back to\n // the prebaked msg (e.g. after removal, the user is gone from the cache).\n const actorName = actorId ? resolveDisplayName(actorId, getUserById) : null;\n const userName = userId ? resolveDisplayName(userId, getUserById) : null;\n const actorOk = !actorId || actorName !== null;\n const userOk = !userId || userName !== null;\n\n if (!actorOk || !userOk) {\n if (message.msg) return message.msg;\n } else {\n switch (message.t) {\n case 'au':\n return SYSTEM_MESSAGE_TEXTS.USER_ADDED(actorName ?? '', userName ?? '');\n case 'ru':\n return SYSTEM_MESSAGE_TEXTS.USER_REMOVED(actorName ?? '', userName ?? '');\n case 'ul':\n return SYSTEM_MESSAGE_TEXTS.USER_LEFT(userName ?? '');\n case 'message_pinned':\n return SYSTEM_MESSAGE_TEXTS.MESSAGE_PINNED(actorName ?? '');\n case 'message_unpinned':\n return SYSTEM_MESSAGE_TEXTS.MESSAGE_UNPINNED(actorName ?? '');\n default:\n break;\n }\n }\n }\n\n if (message.msg && message.u.username === 'system') {\n return message.msg;\n }\n\n return message.msg || 'System message';\n};\n","import type { User } from '../types/user';\n\n/**\n * Returns a secondary text for a user (typically shown below the display name).\n * Format: \"email | title/role\" or just \"title/role\" or \"@username\"\n */\nexport const getUserSecondaryText = (user: Partial<User>): string | undefined => {\n const titleOrRole = user.title || user.role;\n const { email } = user;\n\n if (email && titleOrRole) {\n return `${email} | ${titleOrRole}`;\n }\n\n if (email) return email;\n if (titleOrRole) return titleOrRole;\n if (user.username) return `@${user.username}`;\n\n return undefined;\n};\n","import type { Message } from '../types/message';\n\nexport const hasReactions = (message: Message): boolean => {\n return !!message.reactions && Object.keys(message.reactions).length > 0;\n};\n","import type { Message } from '../types/message';\n\nexport const hasUserReacted = (\n message: Message,\n emoji: string,\n _username: string,\n currentUserId?: string\n): boolean => {\n if (!currentUserId) return false;\n return message.reactions?.[emoji]?.userIds?.includes(currentUserId) || false;\n};\n","import type { Message } from '../types/message';\nimport { CORVA_MESSAGE_TYPES } from '../types/corvaSystemMessage';\n\nexport function isAlertMessage(message: Message): boolean {\n return message.t === CORVA_MESSAGE_TYPES.ALERT || !!message.alert;\n}\n","import type { Message } from '../types/message';\nimport { CORVA_MESSAGE_TYPES } from '../types/corvaSystemMessage';\n\nexport function isAppCommentMessage(message: Message): boolean {\n return message.t === CORVA_MESSAGE_TYPES.APP_COMMENT || !!message.appComment;\n}\n","import type { Message } from '../types/message';\nimport { CORVA_MESSAGE_TYPES } from '../types/corvaSystemMessage';\n\nexport function isAskCorvaMessage(message: Message): boolean {\n return message.t === CORVA_MESSAGE_TYPES.ASK_CORVA || !!message.askCorva;\n}\n","import type { Subscription } from '../types/subscription';\n\n// Group DMs are private rooms whose name is the comma-joined member list.\nexport const isDmGroup = (sub: Subscription) => sub.t === 'p' && sub.name.includes(', ');\n","import type { Message } from '../types/message';\nimport { CORVA_MESSAGE_TYPES } from '../types/corvaSystemMessage';\n\nexport function isForwardedMessage(message: Message): boolean {\n return message.t === CORVA_MESSAGE_TYPES.FORWARD || !!message.forwardedFrom;\n}\n","import { GENERAL_CHAT_NAME } from '../constants/constants';\n\n/**\n * Identifies the \"General\" room (backend-created channel). Name is \"General\" only.\n */\nexport function isGeneralRoom(room: { name?: string; fname?: string } | null | undefined): boolean {\n if (!room) return false;\n const name = (room.fname || room.name || '').toLowerCase();\n return name === GENERAL_CHAT_NAME.toLowerCase();\n}\n\n/**\n * Find the General room from a list. General is always a channel (t === 'c').\n */\nexport function findGeneralRoom<\n T extends { _id: string; name?: string; fname?: string; t?: string },\n>(rooms: T[]): T | undefined {\n return rooms.find(r => isGeneralRoom(r) && r.t === 'c');\n}\n","import type { Message } from '../types/message';\n\nexport const SOFT_DELETE_MARKER = '[sysmessage: deleted]';\n\nexport const isSoftDeletedMessage = (message: Message): boolean => {\n if (message.deleted) return true;\n return message.msg.startsWith(SOFT_DELETE_MARKER);\n};\n\nexport const createSoftDeletedMessage = (message: Message): Message => {\n return {\n ...message,\n deleted: true,\n msg: SOFT_DELETE_MARKER,\n attachments: undefined,\n file: undefined,\n reactions: undefined,\n };\n};\n","import type { User } from '../types/user';\n\nexport function isUserOnline(user: User): boolean {\n return user.status === 'online' || user.statusConnection === 'online';\n}\n","import type { Subscription } from '../types/subscription';\n\nimport { isUnread } from './isUnread';\n\n// Shared by the panel badge and Mark All As Read so they never disagree.\nexport function isVisibleUnread(\n sub: Subscription,\n isRoomDisallowed: (roomId: string) => boolean\n): boolean {\n return sub.open !== false && !isRoomDisallowed(sub.rid) && isUnread(sub);\n}\n","import type { Message, ForwardedFrom } from '../types/message';\nimport type { AlertData, AlertSeverity } from '../types/alert';\nimport { ALERT_SEVERITY } from '../types/alert';\nimport type { FeedItemData } from '../types/feedItem';\nimport type { AskCorvaData } from '../types/askCorva';\nimport { getAppCommentAttachments, type AppCommentData } from '../types/appComment';\nimport type {\n CorvaSystemMessage,\n AlertWirePayload,\n FeedWirePayload,\n AskCorvaWirePayload,\n ForwardWirePayload,\n AppCommentWirePayload,\n WireSeverity,\n} from '../types/corvaSystemMessage';\nimport { CORVA_SYS_PREFIX, CORVA_MESSAGE_TYPES } from '../types/corvaSystemMessage';\n\nconst WIRE_SEVERITY_MAP: Record<WireSeverity, AlertSeverity> = {\n c: ALERT_SEVERITY.CRITICAL,\n w: ALERT_SEVERITY.WARNING,\n i: ALERT_SEVERITY.INFO,\n};\n\nfunction mapAlertPayload(d: AlertWirePayload): AlertData {\n return {\n alertId: d.id,\n alertDefinitionId: d.defId,\n severity: WIRE_SEVERITY_MAP[d.sev] || ALERT_SEVERITY.INFO,\n title: d.ttl,\n description: d.dsc,\n isTruncated: d.trunc,\n appName: d.app,\n assetId: d.assetId,\n assetName: d.assetName,\n };\n}\n\nfunction mapFeedPayload(d: FeedWirePayload): FeedItemData {\n return {\n feedItemId: d.id,\n feedType: d.ft,\n title: d.ttl,\n description: d.dsc,\n assetId: d.assetId,\n author: d.usr,\n };\n}\n\nfunction mapAskCorvaPayload(d: AskCorvaWirePayload): AskCorvaData {\n return {\n responseId: d.id,\n answer: d.a,\n answerRef: d.aRef,\n companyId: d.cId,\n isTruncated: d.trunc,\n assetId: d.assetId,\n agentName: d.agentName,\n };\n}\n\nfunction mapForwardPayload(d: ForwardWirePayload): ForwardedFrom {\n return {\n channelId: d.cid,\n messageId: d.mid,\n channelName: d.cn,\n isPrivate: d.priv,\n note: d.n || undefined,\n ...(d.ts && { ts: d.ts }),\n };\n}\n\nfunction mapAppCommentPayload(d: AppCommentWirePayload): AppCommentData {\n return {\n body: d.body,\n appName: d.app,\n authorCorvaId: d.autId,\n forwarderCorvaId: d.usrId,\n activityType: d.at,\n attachments: d.atts?.length\n ? d.atts.filter(file => !!file?.u).map(file => ({ url: file.u, name: file.n, size: file.s }))\n : undefined,\n attachmentUrl: d.att,\n activityId: d.actId,\n appId: d.appId,\n dashboardId: d.dashId,\n appUrl: d.appUrl,\n metadata: d.meta\n ? { holeDepth: d.meta.hd, bitDepth: d.meta.bd, commentDepth: d.meta.cd }\n : undefined,\n settingsSnapshotId: d.snpId,\n isTruncated: d.trunc,\n };\n}\n\ninterface ParsedCorvaMessage {\n messageType: string;\n alert?: AlertData;\n feedItem?: FeedItemData;\n askCorva?: AskCorvaData;\n appComment?: AppCommentData;\n forwardedFrom?: ForwardedFrom;\n}\n\n/**\n * Builds the wire-format content string for an AskCorva response.\n */\nexport function buildAskCorvaMessageContent(\n requestId: string,\n answer: string,\n answerRef?: string,\n isTruncated?: boolean,\n assetId?: number,\n agentName?: string,\n companyId?: number\n): string {\n const payload: AskCorvaWirePayload = {\n id: requestId,\n a: answerRef ? '' : answer,\n ...(answerRef && { aRef: answerRef }),\n ...(answerRef && companyId && { cId: companyId }),\n ...(isTruncated && { trunc: true }),\n ...(assetId && { assetId }),\n ...(agentName && { agentName }),\n };\n return `${CORVA_SYS_PREFIX}${JSON.stringify({ t: CORVA_MESSAGE_TYPES.ASK_CORVA, v: 1, d: payload })}`;\n}\n\n/**\n * Builds the wire-format content string for a forwarded message.\n */\nexport function buildForwardMessageContent(\n sourceChannelId: string,\n messageId: string,\n channelName: string,\n isPrivate: boolean,\n note?: string,\n ts?: string\n): string {\n const payload: ForwardWirePayload = {\n cid: sourceChannelId,\n mid: messageId,\n cn: channelName,\n priv: isPrivate,\n ...(note?.trim() && { n: note.trim() }),\n ...(ts && { ts }),\n };\n return `${CORVA_SYS_PREFIX}${JSON.stringify({ t: CORVA_MESSAGE_TYPES.FORWARD, v: 1, d: payload })}`;\n}\n\nconst MAX_COMMENT_BODY_LENGTH = 2000;\n\nconst toDurableUrl = (url: string): string => {\n const queryIndex = url.indexOf('?');\n return queryIndex === -1 ? url : url.slice(0, queryIndex);\n};\n\n/**\n * Builds the wire-format content string for an app comment forwarded to chat.\n * If the body exceeds MAX_COMMENT_BODY_LENGTH and an activityId is provided,\n * the body is truncated and `trunc` flag is set for lazy-fetching.\n */\nexport function buildAppCommentMessageContent(data: AppCommentData): string {\n const rawBody = data.body ?? '';\n const shouldTruncate = rawBody.length > MAX_COMMENT_BODY_LENGTH && !!data.activityId;\n const body = shouldTruncate ? rawBody.slice(0, MAX_COMMENT_BODY_LENGTH) : rawBody;\n const attachments = getAppCommentAttachments(data);\n const [firstAttachment] = attachments;\n\n const payload: AppCommentWirePayload = {\n body,\n ...(data.appName && { app: data.appName }),\n ...(data.authorCorvaId && { autId: data.authorCorvaId }),\n ...(data.forwarderCorvaId && { usrId: data.forwarderCorvaId }),\n ...(data.activityType && { at: data.activityType }),\n ...(firstAttachment && {\n // `att` keeps pre-multi-attachment clients rendering the first file.\n att: toDurableUrl(firstAttachment.url),\n atts: attachments.map(file => ({\n u: toDurableUrl(file.url),\n ...(file.name && { n: file.name }),\n ...(typeof file.size === 'number' && { s: file.size }),\n })),\n }),\n ...(data.activityId && { actId: data.activityId }),\n ...(data.appId && { appId: data.appId }),\n ...(data.dashboardId && { dashId: data.dashboardId }),\n ...(data.appUrl && { appUrl: data.appUrl }),\n ...(data.metadata && {\n meta: {\n ...(data.metadata.holeDepth != null && { hd: data.metadata.holeDepth }),\n ...(data.metadata.bitDepth != null && { bd: data.metadata.bitDepth }),\n ...(data.metadata.commentDepth != null && { cd: data.metadata.commentDepth }),\n },\n }),\n ...(data.settingsSnapshotId && { snpId: data.settingsSnapshotId }),\n ...((data.isTruncated || shouldTruncate) && { trunc: true }),\n };\n return `${CORVA_SYS_PREFIX}${JSON.stringify({ t: CORVA_MESSAGE_TYPES.APP_COMMENT, v: 1, d: payload })}`;\n}\n\n/**\n * Detects the $$CORVA:: prefix in message content\n * and parses the JSON payload into internal types.\n * Returns null if the content is not a Corva system message.\n */\nexport function parseCorvaSystemMessage(content: string): ParsedCorvaMessage | null {\n if (!content.startsWith(CORVA_SYS_PREFIX)) {\n return null;\n }\n\n let parsed: CorvaSystemMessage;\n try {\n parsed = JSON.parse(content.slice(CORVA_SYS_PREFIX.length));\n } catch {\n return null;\n }\n\n if (!parsed || !parsed.t || !parsed.d) {\n return null;\n }\n\n switch (parsed.t) {\n case CORVA_MESSAGE_TYPES.ALERT:\n return {\n messageType: CORVA_MESSAGE_TYPES.ALERT,\n alert: mapAlertPayload(parsed.d),\n };\n\n case CORVA_MESSAGE_TYPES.FEED:\n return {\n messageType: CORVA_MESSAGE_TYPES.FEED,\n feedItem: mapFeedPayload(parsed.d),\n };\n\n case CORVA_MESSAGE_TYPES.ASK_CORVA:\n return {\n messageType: CORVA_MESSAGE_TYPES.ASK_CORVA,\n askCorva: mapAskCorvaPayload(parsed.d),\n };\n\n case CORVA_MESSAGE_TYPES.FORWARD:\n return {\n messageType: CORVA_MESSAGE_TYPES.FORWARD,\n forwardedFrom: mapForwardPayload(parsed.d),\n };\n\n case CORVA_MESSAGE_TYPES.APP_COMMENT:\n return {\n messageType: CORVA_MESSAGE_TYPES.APP_COMMENT,\n appComment: mapAppCommentPayload(parsed.d),\n };\n\n default:\n return null;\n }\n}\n\n/**\n * If the raw message content is a $$CORVA:: message,\n * enriches the Message object with parsed typed data\n * and sets `t` to the appropriate message type.\n * Returns the message unchanged if it's not a Corva\n * system message.\n */\nexport function enrichWithCorvaData(message: Message): Message {\n const parsed = parseCorvaSystemMessage(message.msg);\n if (!parsed) return message;\n\n return {\n ...message,\n msg: parsed.forwardedFrom?.note || '',\n t: parsed.messageType,\n alert: parsed.alert,\n feedItem: parsed.feedItem,\n askCorva: parsed.askCorva,\n appComment: parsed.appComment,\n forwardedFrom: parsed.forwardedFrom,\n groupable: false,\n };\n}\n","import type { Message } from '../types/message';\n\nconst getSearchableText = (message: Message): string => {\n const parts: string[] = [message.msg || ''];\n\n if (message.alert) {\n parts.push(\n message.alert.title || '',\n message.alert.description || '',\n message.alert.details || '',\n message.alert.rig?.name || ''\n );\n }\n\n if (message.appComment) {\n parts.push(message.appComment.body || '');\n // Matches the card's visible link text, e.g. \"See In Treatment Plot\"\n if (message.appComment.appName) parts.push(`See In ${message.appComment.appName}`);\n }\n\n if (message.feedItem) {\n parts.push(message.feedItem.title || '', message.feedItem.description || '');\n }\n\n if (message.askCorva) {\n parts.push(message.askCorva.answer || '');\n }\n\n return parts.join(' ').toLowerCase();\n};\n\nexport const searchMessages = (messages: Message[], query: string): Message[] => {\n const searchTerm = query.trim().toLowerCase();\n if (!searchTerm) return messages;\n\n return messages.filter(message => {\n // Exclude thread replies (messages that are replies to other messages)\n // Only show main messages in search results\n if (message.replies && message.replies.length > 0) {\n return false;\n }\n\n return getSearchableText(message).includes(searchTerm);\n });\n};\n","import type { Room } from '../types/room';\nimport type { Subscription } from '../types/subscription';\n\nimport { getRoomDisplayName } from './getRoomDisplayName';\n\nexport const searchRooms = (\n rooms: (Room | Subscription)[],\n query: string\n): (Room | Subscription)[] => {\n if (!query.trim()) return rooms;\n\n const searchTerm = query.toLowerCase();\n return rooms.filter(room => {\n const displayName = getRoomDisplayName(room).toLowerCase();\n return displayName.includes(searchTerm);\n });\n};\n","import type { User } from '../types/user';\n\nexport const searchUsers = (users: User[], query: string): User[] => {\n if (!query.trim()) return users;\n\n const searchTerm = query.toLowerCase();\n return users.filter(\n user =>\n user.username.toLowerCase().includes(searchTerm) ||\n (user.name && user.name.toLowerCase().includes(searchTerm))\n );\n};\n","import type { Subscription } from '../types/subscription';\n\nconst CROCKFORD_BASE32 = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';\n\n// The first 10 ULID characters encode the creation time in ms.\nfunction ulidTimeMs(ulid: string): number {\n let ms = 0;\n for (const char of ulid.slice(0, 10)) {\n const value = CROCKFORD_BASE32.indexOf(char);\n if (value === -1) return 0;\n ms = ms * 32 + value;\n }\n return ms;\n}\n\n// ISO timestamps and ULIDs only compare once both are milliseconds.\nfunction getRecencyMs(sub: Subscription): number {\n if (sub.lastMessage?.ts) {\n const parsed = Date.parse(sub.lastMessage.ts);\n if (!Number.isNaN(parsed)) return parsed;\n }\n if (sub.last_message_id) return ulidTimeMs(sub.last_message_id);\n const created = sub.ts ? Date.parse(sub.ts) : NaN;\n return Number.isNaN(created) ? 0 : created;\n}\n\nexport const compareByRecencyDesc = (a: Subscription, b: Subscription): number =>\n getRecencyMs(b) - getRecencyMs(a);\n","import type { Subscription } from '../types/subscription';\nimport { ROOM_LIST_ORDER, type RoomListOrder } from '../constants/constants';\n\nimport { compareByName } from './compareByName';\nimport { compareByRecencyDesc } from './sortByRecency';\nimport { getRoomDisplayName } from './getRoomDisplayName';\nimport { isGeneralRoom } from './isGeneralRoom';\n\n/**\n * Sorts channels: pinned first (asset chat if set, else General), then by the\n * chosen order — alphabetically by name or most recent activity first.\n */\nexport function sortChannels(\n channels: Subscription[],\n assetChatId: string | undefined,\n order: RoomListOrder = ROOM_LIST_ORDER.ALPHABETICAL\n): Subscription[] {\n const list = [...channels];\n\n const pinnedIndex = list.findIndex(sub => {\n if (assetChatId && sub.rid === assetChatId) return true;\n if (!assetChatId && isGeneralRoom(sub)) return true;\n return false;\n });\n\n const pinned = pinnedIndex >= 0 ? list.splice(pinnedIndex, 1)[0]! : null;\n const rest = list;\n\n rest.sort(\n order === ROOM_LIST_ORDER.RECENT ? compareByRecencyDesc : compareByName(getRoomDisplayName)\n );\n\n return pinned ? [pinned, ...rest] : rest;\n}\n","import type { Subscription } from '../types/subscription';\nimport { ROOM_LIST_ORDER, type RoomListOrder } from '../constants/constants';\n\nimport { compareByName } from './compareByName';\nimport { compareByRecencyDesc } from './sortByRecency';\n\n/**\n * Returns the display name to use for alphabetical sorting.\n * Regular DMs use dmUsername; group DMs (t === 'p') use the channel name.\n */\nfunction getDisplayName(sub: Subscription): string {\n return (sub.t === 'p' ? sub.name : sub.dmUsername) ?? '';\n}\n\n/**\n * Sorts DMs and group DMs by the chosen order — alphabetically by display name\n * or most recent activity first.\n */\nexport function sortDMs(\n dms: Subscription[],\n order: RoomListOrder = ROOM_LIST_ORDER.ALPHABETICAL\n): Subscription[] {\n return [...dms].sort(\n order === ROOM_LIST_ORDER.RECENT ? compareByRecencyDesc : compareByName(getDisplayName)\n );\n}\n","import type { Message } from '../types/message';\n\nexport const sortMessagesByTime = (messages: Message[]): Message[] => {\n return [...messages].sort((a, b) => new Date(a.ts).getTime() - new Date(b.ts).getTime());\n};\n","import type { User } from '../types/user';\n\nimport { getUserDisplayName } from './getUserDisplayName';\n\nexport const sortUsersByStatus = (users: User[]): User[] => {\n const statusOrder = { online: 0, away: 1, busy: 2, offline: 3 } as const;\n return [...users].sort((a, b) => {\n const aOrder = statusOrder[a.status || 'offline'];\n const bOrder = statusOrder[b.status || 'offline'];\n if (aOrder !== bOrder) return aOrder - bOrder;\n return getUserDisplayName(a).localeCompare(getUserDisplayName(b));\n });\n};\n","/**\n * Converts platform mention markup (@[user:ID|Display Name]) to plain @Display Name.\n */\nexport function stripPlatformMentions(body: string): string {\n return (body ?? '').replace(/@\\[user:\\d+\\|([^\\]]+)\\]/g, '@$1');\n}\n","/**\n * Extract timestamp from Revolt ULID\n * ULIDs contain a timestamp in the first 48 bits\n */\nexport function extractTimestampFromULID(ulid: string): Date {\n if (!ulid || ulid.length < 10) {\n return new Date();\n }\n\n try {\n // ULID uses Crockford Base32 encoding\n // First 10 characters represent 48-bit timestamp in milliseconds\n const timeStr = ulid.substring(0, 10);\n\n // Convert from Base32 to timestamp\n // This is a simplified conversion - for production you'd want a proper ULID library\n const chars = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';\n let timestamp = 0;\n\n const timeChars = timeStr.split('');\n const invalidChar = timeChars.some(char => {\n const value = chars.indexOf(char);\n if (value === -1) {\n return true;\n }\n timestamp = timestamp * 32 + value;\n return false;\n });\n\n if (invalidChar) {\n // Invalid character, return current time\n return new Date();\n }\n\n return new Date(timestamp);\n } catch (error) {\n console.error('Failed to extract timestamp from ULID:', ulid, error);\n return new Date();\n }\n}\n\n/**\n * Get message timestamp from Revolt message\n * Uses _id (ULID) to extract creation time\n */\nexport function getMessageTimestamp(message: { _id: string; nonce?: string }): string {\n const timestamp = extractTimestampFromULID(message._id);\n return timestamp.toISOString();\n}\n","import {\n GENERAL_CHAT_NAME,\n CHANNEL_NAME_MAX_LENGTH,\n ASSET_CHAT_PREFIXES,\n} from '../constants/constants';\n\nexport { CHANNEL_NAME_MAX_LENGTH };\n\nconst RESERVED_NAMES = new Set([GENERAL_CHAT_NAME.toLowerCase()]);\n\n// Prefixes reserved for system-created asset chats (Rig: …, Fleet: …, Unit: …).\n// A user-created channel with these prefixes would be misidentified as an asset room.\nconst RESERVED_PREFIXES = Object.values(ASSET_CHAT_PREFIXES);\n\nexport interface ChannelNameValidation {\n error: string | null;\n isValid: boolean;\n}\n\nexport function validateChannelName(\n name: string,\n existingChannelNames: string[] = []\n): ChannelNameValidation {\n const trimmed = name.trim();\n\n if (!trimmed) return { error: null, isValid: false };\n\n if (trimmed.length > CHANNEL_NAME_MAX_LENGTH) {\n return {\n error: `Channel name must be ${CHANNEL_NAME_MAX_LENGTH} characters or less`,\n isValid: false,\n };\n }\n\n if (trimmed.includes(',')) {\n return { error: 'Channel name cannot contain commas', isValid: false };\n }\n\n const lowerName = trimmed.toLowerCase();\n\n if (RESERVED_NAMES.has(lowerName)) {\n return { error: `\"${trimmed}\" is a reserved name`, isValid: false };\n }\n\n const matchedPrefix = RESERVED_PREFIXES.find(prefix => lowerName.startsWith(prefix));\n if (matchedPrefix) {\n return {\n error: `Channel names starting with \"${matchedPrefix.trimEnd()}\" are reserved for asset chats`,\n isValid: false,\n };\n }\n\n if (existingChannelNames.some(n => n.toLowerCase() === lowerName)) {\n return { error: `A channel named \"${trimmed}\" already exists`, isValid: false };\n }\n\n return { error: null, isValid: true };\n}\n","import type { UploadFile } from '../types/message';\n\n// Method-style signature so a platform's richer event type (DOM MessageEvent, RN WebSocket\n// events) still fits a handler slot typed with the few fields core reads.\ntype Handler<E> = { bivarianceHack(event: E): void }['bivarianceHack'];\n\nexport interface HttpRequestInit {\n method?: string;\n headers?: Record<string, string>;\n body?: unknown;\n keepalive?: boolean;\n}\n\nexport interface HttpResponseLike {\n ok: boolean;\n status: number;\n statusText: string;\n headers: { get(name: string): string | null };\n json(): Promise<unknown>;\n text(): Promise<string>;\n}\n\nexport interface SocketCloseEventLike {\n code: number;\n reason: string;\n wasClean: boolean;\n}\n\nexport const WEBSOCKET_CONNECTING = 0;\nexport const WEBSOCKET_OPEN = 1;\n\nexport interface WebSocketLike {\n readonly readyState: number;\n onopen: Handler<unknown> | null;\n onmessage: Handler<{ data: unknown }> | null;\n onclose: Handler<SocketCloseEventLike> | null;\n onerror: Handler<unknown> | null;\n send(data: string): void;\n close(code?: number): void;\n}\n\n/**\n * Everything core needs from the host platform. Web passes browser APIs; React Native passes its\n * own `fetch`, `WebSocket` and `FormData` handling plus AppState/NetInfo for reconnect hints.\n *\n * Wrap native functions rather than passing them bare (`fetch: (url, init) => fetch(url, init)`):\n * browsers throw \"Illegal invocation\" when `window.fetch` is called on another object.\n */\nexport interface ChatPlatform {\n fetch(url: string, init?: HttpRequestInit): Promise<HttpResponseLike>;\n createWebSocket(url: string): WebSocketLike;\n /** Multipart body for an Autumn upload, with the file under the `file` field. */\n createUploadBody(file: UploadFile): unknown;\n /**\n * Calls `retry` whenever a pending reconnect is worth attempting right away (network came back,\n * app returned to the foreground). Returns an unsubscribe function.\n */\n subscribeReconnectHints?(retry: () => void): () => void;\n}\n","import type { ChatPlatform, HttpRequestInit } from '../../platform/types';\n\nexport interface HttpClientConfig {\n baseUrl: string;\n fetch: ChatPlatform['fetch'];\n getToken: () => string | null;\n onUnauthorized?: (path: string) => void;\n}\n\nconst summarizeBody = (body: unknown): string => {\n if (body === undefined || body === null || body === '') return '';\n const text = typeof body === 'string' ? body : JSON.stringify(body);\n return text.length > 200 ? `${text.slice(0, 200)}…` : text;\n};\n\n// Callers decide whether a failed response is worth logging (a 404 for a deleted\n// forwarded message is not), so the error carries everything they need instead\n// of the client logging every non-2xx itself.\nexport class HttpError extends Error {\n status: number;\n statusText: string;\n body: unknown;\n\n constructor(status: number, statusText: string, body: unknown, method = 'GET', path = '') {\n const summary = summarizeBody(body);\n super(`HTTP ${status} ${method} ${path}${summary ? `: ${summary}` : ''}`);\n this.name = 'HttpError';\n this.status = status;\n this.statusText = statusText;\n this.body = body;\n }\n}\n\nexport function createHttpClient(config: HttpClientConfig) {\n const { baseUrl, getToken, onUnauthorized, fetch } = config;\n\n async function request<T = unknown>(path: string, init: HttpRequestInit = {}): Promise<T> {\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n const token = getToken();\n if (token) {\n headers['x-session-token'] = token;\n }\n\n const resp = await fetch(`${baseUrl}${path}`, {\n ...init,\n headers: { ...headers, ...(init.headers || {}) },\n });\n\n if (!resp.ok) {\n const contentType = resp.headers.get('content-type') || '';\n let errorBody;\n\n try {\n if (contentType.includes('application/json')) {\n errorBody = await resp.json();\n } else {\n errorBody = await resp.text().catch(() => 'No error body');\n }\n } catch (e) {\n errorBody = await resp.text().catch(() => 'No error body');\n }\n\n if (resp.status === 401) onUnauthorized?.(path);\n\n throw new HttpError(resp.status, resp.statusText, errorBody, init.method ?? 'GET', path);\n }\n\n if (resp.status === 204) {\n return undefined as unknown as T;\n }\n\n const ct = resp.headers.get('content-type') || '';\n if (!ct.includes('application/json')) {\n return undefined as unknown as T;\n }\n\n return (await resp.json()) as T;\n }\n\n return { request };\n}\n\nexport type HttpClient = ReturnType<typeof createHttpClient>;\n","import type { HttpClient } from '../core/http';\nimport type { User } from '../../types/user';\nimport type { LoginCredentials } from '../../types/auth';\nimport type { RevoltLoginResponse, RevoltUserResponse } from '../../types/revolt';\n\nexport function createAuthAPI(http: HttpClient, tokenStore: { token: string | null }) {\n async function login(credentials: LoginCredentials): Promise<{ token: string; me: User }> {\n try {\n const data = await http.request<RevoltLoginResponse>('/auth/session/login', {\n method: 'POST',\n body: JSON.stringify({\n email: credentials.username,\n password: credentials.password,\n }),\n });\n\n const token = data?.token;\n if (!token) throw new Error('Login failed - no token received');\n tokenStore.token = token;\n\n try {\n await http.request('/auth/account/');\n } catch (e) {\n console.error('⚠️ Session initialization failed, continuing anyway:', e);\n }\n\n let me: User;\n try {\n const userInfo = await http.request<RevoltUserResponse>('/users/@me');\n me = {\n _id: userInfo._id,\n username: userInfo.username || credentials.username.split('@')[0] || '',\n name: userInfo.display_name || userInfo.username || credentials.username.split('@')[0],\n status: 'online',\n };\n } catch (e) {\n console.error('⚠️ Failed to get /users/@me, using fallback user info:', e);\n me = {\n _id: data.user_id || 'unknown-user-id',\n username: credentials.username.split('@')[0] || 'user',\n name: credentials.username.split('@')[0] || 'User',\n status: 'online',\n };\n }\n\n return { token, me };\n } catch (error: unknown) {\n console.error('Login error:', error);\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Login failed: ${message}`);\n }\n }\n\n async function me(): Promise<User> {\n const userInfo = await http.request<RevoltUserResponse>('/users/@me');\n return {\n _id: userInfo._id,\n username: userInfo.username,\n name: userInfo.display_name || userInfo.username,\n status: 'online',\n };\n }\n\n function setToken(token: string | null) {\n tokenStore.token = token;\n }\n\n function getToken() {\n return tokenStore.token;\n }\n\n return {\n login,\n me,\n setToken,\n getToken,\n };\n}\n","import type { HttpClient } from '../core/http';\nimport type { User } from '../../types/user';\nimport type { RevoltUserResponse } from '../../types/revolt';\nimport { isGeneralRoom } from '../../utils/isGeneralRoom';\n\n// Simple user cache to avoid duplicate API calls\nconst userCache: Record<string, User> = {};\n// In-flight requests for deduplication\nconst pendingRequests: Record<string, Promise<User | null> | undefined> = {};\n\nexport function createUsersAPI(http: HttpClient) {\n async function getUser(userId: string): Promise<User | null> {\n // Check cache first\n if (userCache[userId]) {\n return userCache[userId];\n }\n\n // Deduplicate in-flight requests\n if (pendingRequests[userId]) {\n return pendingRequests[userId];\n }\n\n const request = (async () => {\n try {\n const user = await http.request<RevoltUserResponse>(`/users/${userId}`);\n const result: User = {\n _id: user._id,\n username: user.username,\n name: user.display_name || user.username,\n status: user.online ? 'online' : 'offline',\n isBot: !!user.bot,\n };\n userCache[userId] = result;\n return result;\n } catch (error) {\n console.error('Failed to get user:', error);\n return null;\n } finally {\n delete pendingRequests[userId];\n }\n })();\n\n pendingRequests[userId] = request;\n return request;\n }\n\n // Seed cache from external data (e.g., from store's membersById)\n function seedUserCache(users: User[]): void {\n users.forEach(user => {\n if (user._id && !userCache[user._id]) {\n userCache[user._id] = user;\n }\n });\n }\n\n function clearUserCache(): void {\n Object.keys(userCache).forEach(key => delete userCache[key]);\n Object.keys(pendingRequests).forEach(key => delete pendingRequests[key]);\n }\n\n async function getFriends(): Promise<User[]> {\n try {\n // TODO: Replace with proper batch endpoint or pagination\n // Fetching from General Chat to avoid rate limiting with individual friend requests\n const dms =\n await http.request<Array<{ _id: string; name?: string; channel_type?: string }>>(\n '/users/dms'\n );\n\n const generalChat = dms.find(ch => isGeneralRoom(ch));\n\n if (generalChat?._id) {\n try {\n const response = await http.request<RevoltUserResponse[]>(\n `/channels/${generalChat._id}/members`\n );\n const users = response.map<User>(member => ({\n _id: member._id,\n username: member.username,\n name: member.display_name || member.username,\n status: member.online ? 'online' : 'offline',\n isBot: !!member.bot,\n }));\n // Seed cache with fetched users\n seedUserCache(users);\n return users;\n } catch (e) {\n console.error('Failed to fetch General Chat members:', e);\n }\n }\n\n console.error('General Chat not found or members fetch failed');\n return [];\n } catch (e) {\n console.error('Failed to get friends:', e);\n return [];\n }\n }\n\n async function searchUsers(_query: string): Promise<User[]> {\n try {\n // Get all server users (from General Chat members)\n const allUsers = await getFriends();\n\n const q = _query.trim();\n\n // If no query, return all users\n if (!q) {\n return allUsers;\n }\n\n // Filter locally by username or display name\n const queryLower = q.toLowerCase();\n return allUsers.filter(\n u =>\n u.username?.toLowerCase().includes(queryLower) ||\n u.name?.toLowerCase().includes(queryLower)\n );\n } catch (error) {\n console.error('User search error:', error);\n return [];\n }\n }\n\n return {\n getUser,\n getFriends,\n searchUsers,\n seedUserCache,\n clearUserCache,\n };\n}\n","import type { Message, Attachment } from '../../../types/message';\n\n// Revolt API attachment structure (before transformation)\ninterface RevoltAttachment {\n _id?: string;\n id?: string;\n tag?: string;\n filename?: string;\n metadata?: {\n type?: string;\n width?: number;\n height?: number;\n };\n content_type?: string;\n size?: number;\n}\n\nexport function normalizeReplies(\n replies?: Array<{ id: string; mention?: boolean }> | string[]\n): string[] | undefined {\n if (!replies) return undefined;\n if (Array.isArray(replies) && replies.length > 0 && typeof replies[0] === 'object') {\n const arr = replies as Array<{ id?: string }>;\n return arr.map(r => r.id).filter((id): id is string => Boolean(id));\n }\n return replies as string[];\n}\n\nexport function cleanAttachmentUrls(content: string, attachments: RevoltAttachment[]): string {\n let cleaned = content;\n\n attachments.forEach(att => {\n const id = att?._id || att?.id;\n if (id) {\n const urlPattern = new RegExp(`https?://[^\\\\s]*${id}[^\\\\s]*`, 'gi');\n cleaned = cleaned.replace(urlPattern, '').trim();\n }\n });\n\n return cleaned;\n}\n\nexport function transformAttachments(\n attachments: RevoltAttachment[] | undefined,\n autumnUrl: string\n): Attachment[] | undefined {\n if (!Array.isArray(attachments) || attachments.length === 0) {\n return undefined;\n }\n\n return attachments\n .map(att => {\n const id = att?._id || att?.id;\n const filename = att?.filename || 'file';\n if (id) {\n return {\n image_url: `${autumnUrl}/attachments/${id}/${encodeURIComponent(filename)}`,\n title: filename,\n } as Attachment;\n }\n return undefined;\n })\n .filter((att): att is Attachment => att !== undefined);\n}\n\nexport function transformFileAttachments(\n attachments: RevoltAttachment[] | undefined,\n autumnUrl: string,\n channelId: string,\n authorId: string\n) {\n if (!Array.isArray(attachments) || attachments.length === 0) {\n return undefined;\n }\n\n const files = attachments\n .map(att => {\n const id = att._id || att.id;\n if (!id) return null;\n\n return {\n _id: id,\n name: att.filename || 'file',\n type: att.content_type || att.metadata?.type || 'application/octet-stream',\n size: att.size || 0,\n rid: channelId,\n userId: authorId || 'unknown',\n url: `${autumnUrl}/attachments/${id}/${encodeURIComponent(att.filename || 'file')}`,\n };\n })\n .filter((f): f is NonNullable<typeof f> => f !== null);\n\n return files.length > 0 ? files : undefined;\n}\n\nexport function createSystemMessage(\n id: string,\n channelId: string,\n messageText: string,\n timestamp: string,\n systemType: string,\n systemUsers?: { userId?: string; actorId?: string },\n extraFields?: Partial<Message>\n): Message {\n return {\n _id: id,\n rid: channelId,\n msg: messageText,\n ts: timestamp,\n u: { _id: 'system', username: 'system' },\n _updatedAt: timestamp,\n replies: undefined,\n t: systemType,\n systemUsers,\n ...extraFields,\n };\n}\n","import type { HttpClient } from '../core/http';\nimport type { Message } from '../../types/message';\nimport type { RevoltMessage, RevoltUserResponse } from '../../types/revolt';\nimport type { User } from '../../types/user';\nimport { getMessageTimestamp } from '../../utils/ulidTimestamp';\nimport {\n buildForwardMessageContent,\n enrichWithCorvaData,\n} from '../../utils/parseCorvaSystemMessage';\nimport { SOFT_DELETE_MARKER } from '../../utils/isSoftDeletedMessage';\nimport { REVOLT_SYSTEM_USER_ID, SYSTEM_MESSAGE_TEXTS } from '../../constants/constants';\nimport {\n transformFileAttachments,\n createSystemMessage,\n} from '../socket/transforms/messageTransform';\n\nexport function createMessagesAPI(\n http: HttpClient,\n autumnUrl: string,\n getUserFn: (userId: string) => Promise<User | null>\n) {\n async function getChannelMessages(\n channelId: string,\n limit = 100,\n before?: string,\n nearby?: string\n ): Promise<Message[]> {\n try {\n // Built by hand: React Native's URLSearchParams is only partly implemented.\n const params = [`limit=${limit}`];\n if (nearby) {\n params.push(`nearby=${encodeURIComponent(nearby)}`);\n } else if (before) {\n params.push(`before=${encodeURIComponent(before)}`);\n }\n const url = `/channels/${channelId}/messages?${params.join('&')}`;\n const response = await http.request<RevoltMessage[] | { messages: RevoltMessage[] }>(url);\n const messages: RevoltMessage[] = Array.isArray(response)\n ? response\n : response.messages || [];\n\n // Collect all user IDs we might need to resolve\n const userIds = Array.from(\n new Set<string>(\n messages\n .flatMap(msg => {\n const ids: unknown[] = [];\n if (msg.system?.type === 'user_added') {\n ids.push(msg.system.id, msg.system.by);\n }\n if (msg.system?.type === 'user_remove' && msg.system.by) {\n ids.push(msg.system.id, msg.system.by);\n }\n if (msg.system?.type === 'user_left') {\n ids.push(msg.system.id);\n }\n ids.push(msg.author);\n const { reactions } = msg;\n if (reactions && typeof reactions === 'object') {\n if (Array.isArray(reactions)) {\n reactions.forEach(r => {\n if (r && typeof r.user_id === 'string') ids.push(r.user_id);\n });\n } else {\n Object.values(reactions).forEach(v => {\n if (Array.isArray(v)) {\n v.forEach(u => {\n if (typeof u === 'string') ids.push(u);\n });\n }\n });\n }\n }\n return ids;\n })\n .filter((id: unknown): id is string => typeof id === 'string' && id.length > 0)\n )\n );\n\n // Use cached getUser function instead of direct HTTP calls\n const userCache: Record<string, RevoltUserResponse> = {};\n await Promise.all(\n userIds\n .filter(userId => userId && userId !== REVOLT_SYSTEM_USER_ID)\n .map(async userId => {\n const user = await getUserFn(userId);\n if (user) {\n userCache[userId] = {\n _id: user._id,\n username: user.username || '',\n display_name: user.name,\n online: user.status === 'online',\n } as RevoltUserResponse;\n }\n })\n );\n\n const convertedMessages = messages\n .map(msg => {\n if (msg.system?.type === 'user_added') {\n const addedUser = userCache[String(msg.system.id)];\n const addedBy = userCache[String(msg.system.by)];\n return createSystemMessage(\n msg._id,\n channelId,\n SYSTEM_MESSAGE_TEXTS.USER_ADDED(\n addedBy?.username || SYSTEM_MESSAGE_TEXTS.DEFAULT_USER,\n addedUser?.username || SYSTEM_MESSAGE_TEXTS.DEFAULT_USER\n ),\n getMessageTimestamp(msg),\n 'au',\n { userId: String(msg.system.id), actorId: String(msg.system.by) }\n );\n }\n\n if (msg.system?.type === 'user_remove' && msg.system.by) {\n const removedUser = userCache[String(msg.system.id)];\n const removedBy = userCache[String(msg.system.by)];\n return createSystemMessage(\n msg._id,\n channelId,\n SYSTEM_MESSAGE_TEXTS.USER_REMOVED(\n removedBy?.username || SYSTEM_MESSAGE_TEXTS.DEFAULT_USER,\n removedUser?.username || SYSTEM_MESSAGE_TEXTS.DEFAULT_USER\n ),\n getMessageTimestamp(msg),\n 'ru',\n { userId: String(msg.system.id), actorId: String(msg.system.by) }\n );\n }\n\n if (msg.system?.type === 'user_left') {\n const leftUser = userCache[String(msg.system.id)];\n return createSystemMessage(\n msg._id,\n channelId,\n SYSTEM_MESSAGE_TEXTS.USER_LEFT(\n leftUser?.username || SYSTEM_MESSAGE_TEXTS.DEFAULT_USER\n ),\n getMessageTimestamp(msg),\n 'ul',\n { userId: String(msg.system.id) }\n );\n }\n\n if (msg.system?.type === 'message_pinned') {\n const pinnedBy = userCache[String(msg.system.by)];\n return createSystemMessage(\n msg._id,\n channelId,\n SYSTEM_MESSAGE_TEXTS.MESSAGE_PINNED(\n pinnedBy?.username || SYSTEM_MESSAGE_TEXTS.DEFAULT_USER\n ),\n getMessageTimestamp(msg),\n 'message_pinned',\n { actorId: String(msg.system.by) },\n { pinnedMessageId: msg.system.id }\n );\n }\n\n if (msg.system?.type === 'message_unpinned') {\n const unpinnedBy = userCache[String(msg.system.by)];\n return createSystemMessage(\n msg._id,\n channelId,\n SYSTEM_MESSAGE_TEXTS.MESSAGE_UNPINNED(\n unpinnedBy?.username || SYSTEM_MESSAGE_TEXTS.DEFAULT_USER\n ),\n getMessageTimestamp(msg),\n 'message_unpinned',\n { actorId: String(msg.system.by) },\n { unpinnedMessageId: msg.system.id }\n );\n }\n\n const author = userCache[String(msg.author)];\n const messageContent = msg.content || '';\n\n let cleanContent = messageContent;\n\n if (Array.isArray(msg.attachments) && msg.attachments.length > 0) {\n msg.attachments.forEach(att => {\n const id = att?._id || att?.id;\n if (id) {\n const urlPattern = new RegExp(`https?://[^\\\\s]*${id}[^\\\\s]*`, 'gi');\n cleanContent = cleanContent.replace(urlPattern, '').trim();\n }\n });\n }\n\n const attachments = Array.isArray(msg.attachments)\n ? msg.attachments.map(att => {\n const attId = att?._id || att?.id;\n const filename = att?.filename || 'file';\n const url = attId ? `${autumnUrl}/attachments/${attId}` : undefined;\n return {\n image_url: url,\n title: filename,\n };\n })\n : undefined;\n\n const files = transformFileAttachments(msg.attachments, autumnUrl, channelId, msg.author);\n\n let reactions: Record<string, { userIds: string[]; usernames?: string[] }> | undefined;\n if (msg.reactions) {\n reactions = {};\n if (Array.isArray(msg.reactions)) {\n msg.reactions.forEach(r => {\n const emoji = r?.emoji;\n const uid: string | undefined = r?.user_id;\n if (!emoji || !uid) return;\n if (!reactions![emoji]) {\n reactions![emoji] = { userIds: [] };\n }\n if (!reactions![emoji].userIds.includes(uid)) {\n reactions![emoji].userIds.push(uid);\n }\n });\n } else if (typeof msg.reactions === 'object') {\n Object.entries(msg.reactions).forEach(([emoji, users]) => {\n const ids: string[] = Array.isArray(users)\n ? users.filter((u): u is string => typeof u === 'string')\n : [];\n reactions![emoji] = { userIds: ids };\n });\n }\n }\n\n const isSoftDeleted = msg.content === SOFT_DELETE_MARKER;\n\n return enrichWithCorvaData({\n _id: msg._id,\n nonce: msg.nonce,\n rid: channelId,\n msg: isSoftDeleted ? SOFT_DELETE_MARKER : cleanContent,\n ts: getMessageTimestamp(msg),\n u: {\n _id: msg.author || 'unknown',\n username:\n author?.username ||\n (typeof msg.author === 'string' && msg.author.length >= 4\n ? `User-${msg.author.slice(-4)}`\n : 'user'),\n },\n _updatedAt: msg.edited || getMessageTimestamp(msg),\n editedAt: msg.edited,\n replies: msg.replies || undefined,\n attachments: isSoftDeleted ? undefined : attachments,\n files: isSoftDeleted ? undefined : files,\n reactions: isSoftDeleted ? undefined : reactions,\n deleted: isSoftDeleted || undefined,\n pinned: msg.pinned || undefined,\n });\n })\n .filter(msg => {\n if (msg.t || msg.deleted) return true;\n return msg.msg.trim() !== '' || (msg.attachments && msg.attachments.length > 0);\n });\n\n const messagesWithThreadCounts = convertedMessages.map(msg => {\n const replyCount = convertedMessages.filter(\n otherMsg => otherMsg.replies && otherMsg.replies.includes(msg._id)\n ).length;\n\n if (replyCount > 0) {\n return { ...msg, tcount: replyCount };\n }\n return msg;\n });\n\n return messagesWithThreadCounts;\n } catch (error: unknown) {\n console.error('Get channel messages error:', error);\n return [];\n }\n }\n\n async function sendMessage(\n channelId: string,\n text: string,\n threadId?: string,\n attachmentIds?: string[],\n nonce?: string\n ) {\n try {\n const response = await http.request(`/channels/${channelId}/messages`, {\n method: 'POST',\n body: JSON.stringify({\n content: text,\n nonce,\n replies: threadId ? [{ id: threadId, mention: false }] : undefined,\n ...(attachmentIds && attachmentIds.length > 0 ? { attachments: attachmentIds } : {}),\n }),\n });\n return response;\n } catch (error: unknown) {\n console.error('Send message error:', error);\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to send message: ${message}`);\n }\n }\n\n async function editMessage(channelId: string, messageId: string, content: string): Promise<void> {\n await http.request(`/channels/${channelId}/messages/${messageId}`, {\n method: 'PATCH',\n body: JSON.stringify({ content }),\n });\n }\n\n async function deleteMessage(channelId: string, messageId: string): Promise<void> {\n await http.request(`/channels/${channelId}/messages/${messageId}`, {\n method: 'DELETE',\n });\n }\n\n async function pinMessage(channelId: string, messageId: string): Promise<void> {\n await http.request(`/channels/${channelId}/messages/${messageId}/pin`, {\n method: 'POST',\n });\n }\n\n async function unpinMessage(channelId: string, messageId: string): Promise<void> {\n await http.request(`/channels/${channelId}/messages/${messageId}/pin`, {\n method: 'DELETE',\n });\n }\n\n async function fetchMessage(channelId: string, messageId: string): Promise<RevoltMessage> {\n const response = await http.request<RevoltMessage>(\n `/channels/${channelId}/messages/${messageId}`\n );\n return response;\n }\n\n async function forwardMessage(\n targetChannelId: string,\n sourceChannelId: string,\n messageId: string,\n channelName: string,\n isPrivate: boolean,\n customMessage?: string,\n attachmentIds?: string[],\n sourceTs?: string\n ): Promise<unknown> {\n const content = buildForwardMessageContent(\n sourceChannelId,\n messageId,\n channelName,\n isPrivate,\n customMessage,\n sourceTs\n );\n return sendMessage(targetChannelId, content, undefined, attachmentIds);\n }\n\n return {\n getChannelMessages,\n sendMessage,\n editMessage,\n deleteMessage,\n pinMessage,\n unpinMessage,\n fetchMessage,\n forwardMessage,\n };\n}\n","import type { HttpClient } from '../core/http';\nimport type { Room } from '../../types/room';\nimport type { RevoltChannel } from '../../types/revolt';\nimport { CHANNEL_TYPES } from '../../constants/constants';\nimport { isGeneralRoom } from '../../utils/isGeneralRoom';\n\ninterface FetchServerResponse {\n _id: string;\n channels?: RevoltChannel[];\n}\n\nexport function createChannelsAPI(http: HttpClient) {\n async function getChannel(channelId: string): Promise<RevoltChannel> {\n return http.request<RevoltChannel>(`/channels/${channelId}`);\n }\n\n type RevoltUnread = {\n _id: { channel: string };\n last_id?: string;\n };\n\n async function getUnreads(): Promise<Map<string, string>> {\n const ackedMap = new Map<string, string>();\n try {\n const unreads = await http.request<RevoltUnread[]>('/sync/unreads');\n unreads.forEach(entry => {\n if (entry?._id?.channel && entry.last_id) {\n ackedMap.set(entry._id.channel, entry.last_id);\n }\n });\n } catch (e) {\n console.error('Failed to fetch unreads:', e);\n }\n return ackedMap;\n }\n\n async function ackMessage(\n channelId: string,\n messageId: string,\n options: { keepalive?: boolean } = {}\n ): Promise<boolean> {\n try {\n await http.request(`/channels/${channelId}/ack/${messageId}`, {\n method: 'PUT',\n keepalive: options.keepalive,\n });\n return true;\n } catch (error) {\n console.error('Ack message error:', error);\n return false;\n }\n }\n\n async function getRooms(serverId?: string | null): Promise<Room[]> {\n try {\n const channelMap = new Map<string, RevoltChannel>();\n\n // Fetch server channels (e.g. General) when server ID is available\n if (serverId) {\n try {\n const server = await http.request<FetchServerResponse>(\n `/servers/${serverId}?include_channels=true`\n );\n const channelsPayload = server?.channels;\n if (Array.isArray(channelsPayload) && channelsPayload.length > 0) {\n channelsPayload.forEach(channel => {\n if (channel?._id && channel.channel_type === CHANNEL_TYPES.TEXT_CHANNEL) {\n channelMap.set(channel._id, channel);\n }\n });\n }\n } catch (e) {\n console.error('Failed to fetch channels:', e);\n }\n }\n\n // Fetch DMs, group channels, and text channels from /users/dms\n try {\n const dms = await http.request<RevoltChannel[]>('/users/dms');\n if (Array.isArray(dms)) {\n dms.forEach(channel => {\n if (channel?._id) {\n channelMap.set(channel._id, channel);\n }\n });\n }\n } catch (e) {\n console.error('Failed to fetch DMs:', e);\n }\n\n // Convert channels to rooms - NO additional API calls needed!\n const rooms: Room[] = [];\n\n channelMap.forEach(channel => {\n let roomType: Room['t'] = 'c';\n let name = channel.name || 'Unnamed Channel';\n\n // Every account has a nameless SavedMessages channel in /users/dms; nothing to show for it.\n if (channel.channel_type === CHANNEL_TYPES.SAVED_MESSAGES) return;\n if (!channel.name && channel.channel_type !== CHANNEL_TYPES.DIRECT_MESSAGE) return;\n\n if (channel.channel_type === CHANNEL_TYPES.GROUP) {\n roomType = 'p';\n } else if (channel.channel_type === CHANNEL_TYPES.DIRECT_MESSAGE) {\n roomType = 'd';\n name = 'Direct Message'; // Will be enriched lazily with recipient name\n } else if (channel.channel_type === CHANNEL_TYPES.TEXT_CHANNEL) {\n roomType = 'c';\n }\n\n rooms.push({\n _id: channel._id,\n name,\n t: roomType,\n default: false,\n fname: name,\n topic: channel.description || '',\n description: channel.description || '',\n ro: false,\n sysMes: true,\n last_message_id: channel.last_message_id,\n // Store recipients array for lazy loading DM usernames\n recipients: channel.recipients,\n ...(channel.owner\n ? {\n u: {\n _id: channel.owner,\n username: '', // Username not needed - ChannelSettingsDialog uses getMemberById(_id) instead\n },\n }\n : {}),\n });\n });\n\n // Sort: General chat first, then alphabetically\n return [...rooms].sort((a, b) => {\n const byGeneral = (isGeneralRoom(a) ? 0 : 1) - (isGeneralRoom(b) ? 0 : 1);\n if (byGeneral) return byGeneral;\n const nameA = (a.name || '').toLowerCase();\n const nameB = (b.name || '').toLowerCase();\n if (nameA < nameB) return -1;\n return nameA > nameB ? 1 : 0;\n });\n } catch (error) {\n console.error('❌ Failed to get rooms:', error);\n return [];\n }\n }\n\n async function leaveChannel(\n channelId: string,\n leaveSilently: boolean | null = null\n ): Promise<void> {\n try {\n const qs = leaveSilently === null ? 'leave_silently=null' : `leave_silently=${leaveSilently}`;\n await http.request(`/channels/${channelId}?${qs}`, { method: 'DELETE' });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to leave channel: ${message}`);\n }\n }\n\n async function updateChannel(\n channelId: string,\n updates: { name?: string; description?: string }\n ): Promise<RevoltChannel> {\n try {\n return await http.request<RevoltChannel>(`/channels/${channelId}`, {\n method: 'PATCH',\n body: JSON.stringify(updates),\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to update channel: ${message}`);\n }\n }\n\n return {\n getChannel,\n getRooms,\n leaveChannel,\n ackMessage,\n getUnreads,\n updateChannel,\n };\n}\n","import type { HttpClient } from '../core/http';\n\nexport function createReactionsAPI(http: HttpClient) {\n async function addReaction(channelId: string, messageId: string, emoji: string): Promise<void> {\n const encoded = encodeURIComponent(emoji);\n await http.request(`/channels/${channelId}/messages/${messageId}/reactions/${encoded}`, {\n method: 'PUT',\n });\n }\n\n async function removeReaction(\n channelId: string,\n messageId: string,\n emoji: string\n ): Promise<void> {\n const encoded = encodeURIComponent(emoji);\n await http.request(`/channels/${channelId}/messages/${messageId}/reactions/${encoded}`, {\n method: 'DELETE',\n });\n }\n\n return {\n addReaction,\n removeReaction,\n };\n}\n","import type { ChatPlatform } from '../../platform/types';\nimport type { UploadFile } from '../../types/message';\nimport { MAX_ATTACHMENT_SIZE_MB } from '../../constants/constants';\n\nexport function createAttachmentsAPI(\n autumnUrl: string,\n getToken: () => string | null,\n platform: Pick<ChatPlatform, 'fetch' | 'createUploadBody'>\n) {\n async function uploadAttachment(file: UploadFile): Promise<{ id?: string; url?: string }> {\n try {\n const form = platform.createUploadBody(file);\n const token = getToken();\n const resp = await platform.fetch(`${autumnUrl}/attachments`, {\n method: 'POST',\n headers: token ? { 'x-session-token': token } : undefined,\n body: form,\n });\n\n if (!resp.ok) {\n const errorText = await resp.text();\n console.error('Upload failed:', resp.status, errorText);\n\n if (resp.status === 413) {\n throw new Error(\n `File is too large. Maximum size is ${MAX_ATTACHMENT_SIZE_MB} MB. Your file: ${(file.size / (1024 * 1024)).toFixed(1)} MB`\n );\n } else if (resp.status === 415) {\n throw new Error(`File type \"${file.type}\" is not supported by the server.`);\n } else if (resp.status === 401 || resp.status === 403) {\n throw new Error(`Authentication failed. Please try logging out and back in.`);\n } else {\n throw new Error(`Upload failed (${resp.status}): ${errorText || resp.statusText}`);\n }\n }\n\n let data;\n try {\n const responseText = await resp.text();\n data = responseText ? JSON.parse(responseText) : {};\n } catch (parseError) {\n console.error('Failed to parse JSON response:', parseError);\n data = {};\n }\n\n const id = data?.id || data?._id || data?.attachment?._id;\n if (!id) {\n console.error('No attachment ID in response');\n return {};\n }\n\n const filename = file && file.name ? encodeURIComponent(file.name) : 'file';\n const primaryUrl = `${autumnUrl}/attachments/${id}/${filename}`;\n\n return { id, url: primaryUrl };\n } catch (e) {\n console.error('Upload attachment failed:', e);\n throw e;\n }\n }\n\n return {\n uploadAttachment,\n };\n}\n","import type { HttpClient } from '../core/http';\nimport type { User } from '../../types/user';\nimport type { RevoltChannel } from '../../types/revolt';\nimport type { Message } from '../../types/message';\n\nexport function createDirectMessagesAPI(\n http: HttpClient,\n getUserFn: (id: string) => Promise<User | null>,\n getMessagesFn: (channelId: string, limit: number) => Promise<Message[]>\n) {\n async function getOrCreateDMFromUser(userId: string): Promise<{ _id: string }> {\n return http.request<{ _id: string }>(`/users/${userId}/dm`);\n }\n\n async function getDMRecipient(\n dmChannelId: string,\n currentUserId?: string,\n cachedChannel?: RevoltChannel\n ): Promise<User | null> {\n try {\n // Use cached channel if provided to avoid duplicate API call\n const chan = cachedChannel || (await http.request<RevoltChannel>(`/channels/${dmChannelId}`));\n let recipientId: string | undefined;\n\n if (Array.isArray(chan?.recipients) && chan.recipients.length > 0) {\n recipientId =\n chan.recipients.find((id: string) => id !== currentUserId) || chan.recipients[0];\n } else if (typeof (chan as RevoltChannel & { user?: string })?.user === 'string') {\n const { user } = chan as RevoltChannel & { user?: string };\n recipientId = user !== currentUserId ? user : undefined;\n }\n\n if (recipientId) {\n return getUserFn(recipientId);\n }\n\n const messages = await getMessagesFn(dmChannelId, 5);\n const other = messages.find(\n m => m.u?._id && m.u._id !== 'system' && m.u._id !== currentUserId\n );\n if (other?.u?._id) return getUserFn(other.u._id);\n return null;\n } catch {\n return null;\n }\n }\n\n return {\n getOrCreateDMFromUser,\n getDMRecipient,\n };\n}\n","import type { HttpClient } from '../core/http';\nimport type { User } from '../../types/user';\nimport type { RevoltUserResponse } from '../../types/revolt';\n\nexport function createGroupsAPI(http: HttpClient) {\n async function createGroup(name: string, recipientIds: string[]): Promise<{ _id: string }> {\n try {\n const response = await http.request<{ _id: string }>(`/channels/create`, {\n method: 'POST',\n body: JSON.stringify({ name, users: recipientIds }),\n });\n return response;\n } catch (error: unknown) {\n console.error('Failed to create group:', error);\n throw error;\n }\n }\n\n async function addUserToGroup(groupId: string, userId: string): Promise<boolean> {\n try {\n await http.request(`/channels/${groupId}/recipients/${userId}`, {\n method: 'PUT',\n });\n return true;\n } catch (error: unknown) {\n console.error('❌ Failed to add user to group:', error);\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to add user to group: ${message}`);\n }\n }\n\n async function removeUserFromGroup(groupId: string, userId: string): Promise<boolean> {\n try {\n await http.request(`/channels/${groupId}/recipients/${userId}`, {\n method: 'DELETE',\n });\n return true;\n } catch (error: unknown) {\n console.error('❌ Failed to remove user from group:', error);\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to remove user from group: ${message}`);\n }\n }\n\n async function getGroupMembers(groupId: string): Promise<User[]> {\n try {\n const response = await http.request<RevoltUserResponse[]>(`/channels/${groupId}/members`);\n return response.map(member => ({\n _id: member._id,\n username: member.username,\n name: member.display_name || member.username,\n status: member.online ? 'online' : 'offline',\n isBot: !!member.bot,\n }));\n } catch (error: unknown) {\n console.error('❌ Failed to get group members:', error);\n return [];\n }\n }\n\n async function getServerMembers(serverId: string): Promise<User[]> {\n try {\n const response = await http.request<{\n members: Array<{ _id: { user: string } }>;\n users: RevoltUserResponse[];\n }>(`/servers/${serverId}/members`);\n\n const users = response?.users || [];\n return users.map(member => ({\n _id: member._id,\n username: member.username,\n name: member.display_name || member.username,\n status: member.online ? 'online' : 'offline',\n isBot: !!member.bot,\n }));\n } catch (error: unknown) {\n console.error('Failed to get server members:', error);\n return [];\n }\n }\n\n return {\n createGroup,\n addUserToGroup,\n removeUserFromGroup,\n getGroupMembers,\n getServerMembers,\n };\n}\n","import type { ChatPlatform } from '../platform/types';\n\nimport { createHttpClient } from './core/http';\nimport { createAuthAPI } from './modules/auth';\nimport { createUsersAPI } from './modules/users';\nimport { createMessagesAPI } from './modules/messages';\nimport { createChannelsAPI } from './modules/channels';\nimport { createReactionsAPI } from './modules/reactions';\nimport { createAttachmentsAPI } from './modules/attachments';\nimport { createDirectMessagesAPI } from './modules/directMessages';\nimport { createGroupsAPI } from './modules/groups';\n\nexport function createRevoltAPI(baseUrl: string, platform: ChatPlatform) {\n const normalizedBaseUrl = baseUrl.replace(/\\/$/, '');\n const autumnUrl = normalizedBaseUrl.replace(/\\/api$/i, '/autumn');\n const tokenStore = { token: null as string | null };\n const unauthorized = { handler: null as ((source: string) => void) | null };\n\n const http = createHttpClient({\n baseUrl: normalizedBaseUrl,\n fetch: (url, init) => platform.fetch(url, init),\n getToken: () => tokenStore.token,\n onUnauthorized: path => unauthorized.handler?.(path),\n });\n\n const auth = createAuthAPI(http, tokenStore);\n const users = createUsersAPI(http);\n const reactions = createReactionsAPI(http);\n const groups = createGroupsAPI(http);\n const attachments = createAttachmentsAPI(autumnUrl, () => tokenStore.token, platform);\n\n const channels = createChannelsAPI(http);\n\n const messages = createMessagesAPI(http, autumnUrl, users.getUser);\n const directMessages = createDirectMessagesAPI(http, users.getUser, messages.getChannelMessages);\n\n const api = {\n ...auth,\n ...users,\n ...channels,\n ...messages,\n ...reactions,\n ...attachments,\n ...directMessages,\n ...groups,\n getBaseUrl: () => normalizedBaseUrl,\n seedUserCache: users.seedUserCache,\n clearUserCache: users.clearUserCache,\n setUnauthorizedHandler: (handler: ((source: string) => void) | null) => {\n unauthorized.handler = handler;\n },\n notifyUnauthorized: (source: string) => unauthorized.handler?.(source),\n };\n\n return api;\n}\n\nexport type RevoltAPIInstance = ReturnType<typeof createRevoltAPI>;\n","import { Emitter } from '@socket.io/component-emitter';\n\nimport type { ChatPlatform, SocketCloseEventLike, WebSocketLike } from '../../../platform/types';\nimport { WEBSOCKET_CONNECTING, WEBSOCKET_OPEN } from '../../../platform/types';\n\ninterface ConnectionEvents {\n open: () => void;\n message: (data: string) => void;\n close: (event: SocketCloseEventLike) => void;\n error: (error: unknown) => void;\n}\n\nexport class Connection extends Emitter<ConnectionEvents, ConnectionEvents> {\n private ws: WebSocketLike | null = null;\n private serverUrl: string;\n private createWebSocket: ChatPlatform['createWebSocket'];\n\n constructor(serverUrl: string, createWebSocket: ChatPlatform['createWebSocket']) {\n super();\n this.serverUrl = serverUrl;\n this.createWebSocket = createWebSocket;\n }\n\n connect(): Promise<void> {\n // Two live sockets would double every event.\n this.dropSocket();\n\n return new Promise((resolve, reject) => {\n try {\n const ws = this.createWebSocket(this.serverUrl);\n this.ws = ws;\n\n ws.onopen = () => {\n this.emit('open');\n resolve();\n };\n\n ws.onmessage = event => {\n this.emit('message', event.data as string);\n };\n\n ws.onclose = event => {\n this.emit('close', event);\n };\n\n ws.onerror = error => {\n this.emit('error', error);\n reject(error);\n };\n\n setTimeout(() => {\n if (ws.readyState === WEBSOCKET_CONNECTING) {\n // Closing fires onclose, which schedules the next retry.\n ws.close();\n reject(new Error('WebSocket connection timeout'));\n }\n }, 10000);\n } catch (error) {\n reject(error);\n }\n });\n }\n\n private dropSocket(): void {\n const { ws } = this;\n if (!ws) return;\n ws.onopen = null;\n ws.onmessage = null;\n ws.onclose = null;\n ws.onerror = null;\n if (ws.readyState === WEBSOCKET_CONNECTING || ws.readyState === WEBSOCKET_OPEN) {\n ws.close(1000);\n }\n this.ws = null;\n }\n\n send(data: unknown): void {\n if (this.ws?.readyState === WEBSOCKET_OPEN) {\n this.ws.send(JSON.stringify(data));\n }\n }\n\n disconnect(): void {\n if (this.ws) {\n this.ws.close(1000);\n this.ws = null;\n }\n }\n\n isConnected(): boolean {\n return this.ws?.readyState === WEBSOCKET_OPEN;\n }\n}\n","import type { HttpClient } from '../../core/http';\nimport type { RevoltUserResponse } from '../../../types/revolt';\n\nexport function createUserCache(http: HttpClient) {\n const cache: Record<string, string> = {};\n\n function seed(users: Array<{ _id: string; username: string }>): void {\n users.forEach(u => {\n if (u?._id && u.username) {\n cache[u._id] = u.username;\n }\n });\n }\n\n function get(userId: string): string | undefined {\n return cache[userId];\n }\n\n async function fetch(userId: string, sessionToken: string | null): Promise<string | undefined> {\n const cached = cache[userId];\n if (cached) return cached;\n\n if (!sessionToken) return undefined;\n\n try {\n const user = await http.request<RevoltUserResponse>(`/users/${userId}`);\n const { username } = user;\n if (username && user._id) {\n cache[user._id] = username;\n }\n return username;\n } catch (e) {\n console.error(`Failed to fetch user ${userId}:`, e);\n return undefined;\n }\n }\n\n async function fetchMultiple(\n userIds: string[],\n sessionToken: string | null\n ): Promise<Record<string, string>> {\n const result: Record<string, string> = {};\n const toFetch = userIds.filter(id => !cache[id]);\n\n if (toFetch.length === 0) {\n userIds.forEach(id => {\n const username = cache[id];\n if (username) result[id] = username;\n });\n return result;\n }\n\n if (!sessionToken) {\n userIds.forEach(id => {\n const username = cache[id];\n if (username) result[id] = username;\n });\n return result;\n }\n\n await Promise.all(\n toFetch.map(async userId => {\n try {\n const user = await http.request<RevoltUserResponse>(`/users/${userId}`);\n if (user?.username && user._id) {\n cache[user._id] = user.username;\n result[user._id] = user.username;\n }\n } catch (e) {\n console.error(`Failed to fetch user ${userId}:`, e);\n }\n })\n );\n\n userIds.forEach(id => {\n const username = cache[id];\n if (username) result[id] = username;\n });\n\n return result;\n }\n\n function getFallback(userId: string): string {\n return userId.length >= 4 ? `User-${userId.slice(-4)}` : 'user';\n }\n\n return {\n seed,\n get,\n fetch,\n fetchMultiple,\n getFallback,\n };\n}\n\nexport type UserCache = ReturnType<typeof createUserCache>;\n","import type { Message } from '../../../types/message';\nimport type { RevoltIncomingMessagePayload } from '../../../types/revolt';\nimport type { RevoltSocketEventHandlers } from '../../../types/socket';\nimport type { UserCache } from '../services/userCache';\nimport type { User } from '../../../types/user';\nimport {\n cleanAttachmentUrls,\n transformAttachments,\n transformFileAttachments,\n normalizeReplies,\n createSystemMessage,\n} from '../transforms/messageTransform';\nimport { REVOLT_SYSTEM_USER_ID, SYSTEM_MESSAGE_TEXTS } from '../../../constants/constants';\nimport { getUserDisplayName } from '../../../utils/getUserDisplayName';\nimport { enrichWithCorvaData } from '../../../utils/parseCorvaSystemMessage';\n\n// Helper: get display name from membersById cache or fallback to userCache\nasync function getUserDisplayNameOrFetch(\n userId: string,\n getMemberById: ((id: string) => User | undefined) | undefined,\n userCache: UserCache,\n sessionToken: string | null\n): Promise<string> {\n const member = getMemberById?.(userId);\n if (member) {\n return getUserDisplayName(member);\n }\n const usernames = await userCache.fetchMultiple([userId], sessionToken);\n return usernames[userId] || userId.slice(-4);\n}\n\n// Helper: get multiple display names efficiently, batching cache misses\nasync function getMultipleUserDisplayNames(\n userIds: string[],\n getMemberById: ((id: string) => User | undefined) | undefined,\n userCache: UserCache,\n sessionToken: string | null\n): Promise<Record<string, string>> {\n const cachedResults: Record<string, string> = {};\n const toFetch = userIds.filter(userId => {\n const member = getMemberById?.(userId);\n if (member) {\n cachedResults[userId] = getUserDisplayName(member);\n return false;\n }\n return true;\n });\n\n if (toFetch.length === 0) {\n return cachedResults;\n }\n\n const usernames = await userCache.fetchMultiple(toFetch, sessionToken);\n const fetchedResults = toFetch.reduce(\n (acc, userId) => {\n acc[userId] = usernames[userId] || userId.slice(-4);\n return acc;\n },\n {} as Record<string, string>\n );\n\n return { ...cachedResults, ...fetchedResults };\n}\n\nexport async function handleIncomingMessage(\n data: RevoltIncomingMessagePayload,\n userCache: UserCache,\n sessionToken: string | null,\n autumnUrl: string,\n handlers: RevoltSocketEventHandlers,\n getMemberById?: (userId: string) => User | undefined\n): Promise<void> {\n const sys = data.system;\n\n if (sys?.type === 'user_added' && sys.id) {\n const userIds = sys.by ? [sys.id, sys.by] : [sys.id];\n const names = await getMultipleUserDisplayNames(\n userIds,\n getMemberById,\n userCache,\n sessionToken\n );\n const addedName = names[sys.id];\n const byName = sys.by ? names[sys.by] : undefined;\n\n const messageText = byName\n ? `${byName} added ${addedName} to conversation`\n : `${addedName} was added to conversation`;\n\n const message = createSystemMessage(\n data._id,\n data.channel,\n messageText,\n data.created_at || new Date().toISOString(),\n 'au',\n {\n userId: sys.id,\n actorId: sys.by,\n }\n );\n\n handlers.onMessage?.(message);\n return;\n }\n\n if (sys?.type === 'user_joined' && sys.id) {\n const addedName = await getUserDisplayNameOrFetch(\n sys.id,\n getMemberById,\n userCache,\n sessionToken\n );\n\n const message = createSystemMessage(\n data._id,\n data.channel,\n `${addedName} joined the conversation`,\n data.created_at || new Date().toISOString(),\n 'au',\n {\n userId: sys.id,\n }\n );\n\n handlers.onMessage?.(message);\n return;\n }\n\n if (sys?.type === 'user_remove' && sys.id && sys.by) {\n const names = await getMultipleUserDisplayNames(\n [sys.id, sys.by],\n getMemberById,\n userCache,\n sessionToken\n );\n const removedUserName = names[sys.id];\n const removedByName = names[sys.by];\n\n const message = createSystemMessage(\n data._id,\n data.channel,\n SYSTEM_MESSAGE_TEXTS.USER_REMOVED(\n removedByName || SYSTEM_MESSAGE_TEXTS.DEFAULT_USER,\n removedUserName || SYSTEM_MESSAGE_TEXTS.DEFAULT_USER\n ),\n data.created_at || new Date().toISOString(),\n 'ru',\n {\n userId: sys.id,\n actorId: sys.by,\n }\n );\n\n handlers.onMessage?.(message);\n return;\n }\n\n if (sys?.type === 'user_left' && sys.id) {\n const leftUserName = await getUserDisplayNameOrFetch(\n sys.id,\n getMemberById,\n userCache,\n sessionToken\n );\n\n const message = createSystemMessage(\n data._id,\n data.channel,\n SYSTEM_MESSAGE_TEXTS.USER_LEFT(leftUserName || SYSTEM_MESSAGE_TEXTS.DEFAULT_USER),\n data.created_at || new Date().toISOString(),\n 'ul',\n {\n userId: sys.id,\n }\n );\n\n handlers.onMessage?.(message);\n return;\n }\n\n if (sys?.type === 'message_pinned' && sys.id) {\n const pinnedBy = sys.by\n ? await getUserDisplayNameOrFetch(sys.by, getMemberById, userCache, sessionToken)\n : 'User';\n\n const message: Message = {\n ...createSystemMessage(\n data._id,\n data.channel,\n `${pinnedBy} pinned a message`,\n data.created_at || new Date().toISOString(),\n 'message_pinned',\n {\n actorId: sys.by,\n }\n ),\n pinnedMessageId: sys.id,\n };\n\n handlers.onMessage?.(message);\n return;\n }\n\n if (sys?.type === 'message_unpinned' && sys.id) {\n const unpinnedBy = sys.by\n ? await getUserDisplayNameOrFetch(sys.by, getMemberById, userCache, sessionToken)\n : 'User';\n\n const message: Message = {\n ...createSystemMessage(\n data._id,\n data.channel,\n `${unpinnedBy} unpinned a message`,\n data.created_at || new Date().toISOString(),\n 'message_unpinned',\n {\n actorId: sys.by,\n }\n ),\n unpinnedMessageId: sys.id,\n };\n\n handlers.onMessage?.(message);\n return;\n }\n\n let username = data.author ? userCache.get(data.author) : undefined;\n\n if (!username && data.author && sessionToken) {\n username = await userCache.fetch(data.author, sessionToken);\n }\n\n if (!username) {\n if (data.author === REVOLT_SYSTEM_USER_ID) {\n username = 'system';\n } else if (data.author) {\n username = userCache.getFallback(data.author);\n }\n }\n\n const messageContent = data.content || '';\n\n let cleanContent = messageContent;\n if (Array.isArray(data.attachments) && data.attachments.length > 0) {\n cleanContent = cleanAttachmentUrls(messageContent, data.attachments);\n }\n\n const attachments = transformAttachments(data.attachments, autumnUrl);\n\n if (!cleanContent.trim() && !attachments?.length) {\n return;\n }\n const files = transformFileAttachments(\n data.attachments,\n autumnUrl,\n data.channel,\n data.author || 'unknown'\n );\n\n const message: Message = enrichWithCorvaData({\n _id: data._id,\n nonce: data.nonce,\n rid: data.channel,\n msg: cleanContent,\n ts: data.created_at || new Date().toISOString(),\n u: {\n _id: data.author || 'system',\n username: username || 'unknown',\n },\n _updatedAt: data.edited || data.created_at || new Date().toISOString(),\n editedAt: data.edited,\n replies: normalizeReplies(data.replies),\n attachments,\n files,\n });\n\n handlers.onMessage?.(message);\n}\n\nexport async function handleTypingEvent(\n channelId: string,\n userId: string,\n isTyping: boolean,\n userCache: UserCache,\n sessionToken: string | null,\n handlers: RevoltSocketEventHandlers\n): Promise<void> {\n let username = userCache.get(userId);\n\n if (!username && userId && sessionToken) {\n username = await userCache.fetch(userId, sessionToken);\n }\n\n if (!username) {\n username = userCache.getFallback(userId);\n }\n\n handlers.onTyping?.({\n userId: userId || 'unknown',\n username,\n isTyping,\n roomId: channelId,\n });\n}\n","import type { RevoltSocketEventHandlers, ChannelUnread } from '../../../types/socket';\nimport type { UserCache } from '../services/userCache';\nimport type { User } from '../../../types/user';\n\nimport { handleIncomingMessage, handleTypingEvent } from './messageHandlers';\n\ninterface ReadyChannel {\n _id: string;\n channel_type: string;\n last_message_id?: string;\n name?: string;\n}\n\ninterface ReadyEvent {\n type: 'Ready';\n channels: ReadyChannel[];\n channel_unreads?: ChannelUnread[];\n}\n\nexport function createEventRouter(\n userCache: UserCache,\n sessionToken: () => string | null,\n autumnUrl: string,\n handlers: RevoltSocketEventHandlers,\n getMemberById?: (userId: string) => User | undefined\n) {\n async function route(data: string): Promise<void> {\n try {\n const message = JSON.parse(data);\n\n switch (message.type) {\n case 'Authenticated':\n handlers.onAuthenticated?.();\n break;\n\n case 'Ready': {\n const readyEvent = message as ReadyEvent;\n handlers.onReady?.(readyEvent.channels, readyEvent.channel_unreads);\n break;\n }\n\n case 'Message':\n await handleIncomingMessage(\n message,\n userCache,\n sessionToken(),\n autumnUrl,\n handlers,\n getMemberById\n );\n break;\n\n case 'MessageUpdate': {\n const updateData = message as {\n id: string;\n channel: string;\n data?: {\n content?: string;\n edited?: string;\n };\n };\n\n handlers.onMessageUpdate?.(updateData.id, updateData.channel, {\n content: updateData.data?.content,\n edited: updateData.data?.edited,\n });\n break;\n }\n\n case 'MessageDelete': {\n const deleteData = message as {\n id: string;\n channel: string;\n };\n handlers.onMessageDelete?.(deleteData.id, deleteData.channel);\n break;\n }\n\n case 'MessageReact': {\n const emoji = message.emoji_id as string;\n const payload = {\n event: 'reaction',\n op: 'add',\n messageId: message.id as string,\n userId: message.user_id as string,\n emoji,\n };\n handlers.onRoomChange?.(message.channel_id as string, payload);\n break;\n }\n\n case 'MessageUnreact': {\n const emoji = message.emoji_id as string;\n const payload = {\n event: 'reaction',\n op: 'remove',\n messageId: message.id as string,\n userId: message.user_id as string,\n emoji,\n };\n handlers.onRoomChange?.(message.channel_id as string, payload);\n break;\n }\n\n case 'ChannelStartTyping':\n await handleTypingEvent(\n message.id,\n message.user,\n true,\n userCache,\n sessionToken(),\n handlers\n );\n break;\n\n case 'ChannelStopTyping':\n await handleTypingEvent(\n message.id,\n message.user,\n false,\n userCache,\n sessionToken(),\n handlers\n );\n break;\n\n case 'ChannelCreate': {\n const payload = {\n event: 'create',\n channel_type: message.channel_type,\n name: message.name,\n recipients: message.recipients,\n owner: message.owner,\n };\n handlers.onRoomChange?.(message._id, payload);\n break;\n }\n\n case 'ChannelGroupLeave': {\n const payload = { event: 'leave', userId: message.user };\n handlers.onRoomChange?.(message.id, payload);\n break;\n }\n\n case 'ChannelAck': {\n if (message.id && message.message_id) {\n handlers.onChannelAck?.(message.id, message.message_id);\n }\n break;\n }\n\n case 'UserUpdate':\n if (message.data && typeof message.data.online === 'boolean') {\n handlers.onUserStatusChange?.(message.id, message.data.online ? 'online' : 'offline');\n }\n break;\n\n case 'Error':\n if (message.error === 'InvalidSession') handlers.onInvalidSession?.();\n break;\n\n default:\n break;\n }\n } catch (error) {\n console.error('🔌 Error parsing Revolt WebSocket message:', error);\n }\n }\n\n return { route };\n}\n","export interface ReconnectionConfig {\n baseDelay: number;\n maxDelay: number;\n onReconnect: () => void;\n subscribeReconnectHints?: (retry: () => void) => () => void;\n}\n\n// Backoff with jitter and no attempt cap; a platform reconnect hint (back online, app visible)\n// retries at once.\nexport function createReconnectionManager(config: ReconnectionConfig) {\n let attempts = 0;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n let stopped = false;\n\n const clearTimer = () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n const fire = () => {\n clearTimer();\n config.onReconnect();\n };\n\n const retryNow = () => {\n if (timeoutId && !stopped) fire();\n };\n\n const unsubscribeHints = config.subscribeReconnectHints?.(retryNow);\n\n function schedule(): void {\n if (stopped) return;\n clearTimer();\n attempts += 1;\n const exponential = Math.min(config.maxDelay, config.baseDelay * 2 ** (attempts - 1));\n timeoutId = setTimeout(fire, Math.round(exponential * (0.5 + Math.random())));\n }\n\n function reset(): void {\n attempts = 0;\n clearTimer();\n }\n\n function stop(): void {\n stopped = true;\n clearTimer();\n }\n\n function resume(): void {\n stopped = false;\n }\n\n function shouldReconnect(closeCode: number): boolean {\n return !stopped && closeCode !== 1000;\n }\n\n function getAttempts(): number {\n return attempts;\n }\n\n function isScheduled(): boolean {\n return timeoutId !== null;\n }\n\n function dispose(): void {\n stop();\n unsubscribeHints?.();\n }\n\n return {\n schedule,\n reset,\n stop,\n resume,\n shouldReconnect,\n getAttempts,\n isScheduled,\n dispose,\n };\n}\n","import type { ChatPlatform, SocketCloseEventLike } from '../platform/types';\nimport type { RevoltSocketEventHandlers } from '../types/socket';\nimport type { User } from '../types/user';\n\nimport { createHttpClient } from './core/http';\nimport { Connection } from './socket/core/connection';\nimport { createUserCache } from './socket/services/userCache';\nimport { createEventRouter } from './socket/handlers/eventRouter';\nimport { createReconnectionManager } from './socket/services/reconnection';\n\nexport interface RevoltSocketConfig {\n apiUrl: string;\n wsUrl: string;\n platform: ChatPlatform;\n}\n\nexport function createRevoltSocket(\n { apiUrl, wsUrl, platform }: RevoltSocketConfig,\n handlers: RevoltSocketEventHandlers = {},\n getMemberById?: (userId: string) => User | undefined\n) {\n let autumnUrl = apiUrl;\n try {\n const httpBase = apiUrl.replace(/\\/$/, '');\n autumnUrl = httpBase.replace(/\\/api$/i, '/autumn');\n } catch {\n /* keep default */\n }\n\n const state = {\n sessionToken: null as string | null,\n userId: null as string | null,\n handlers,\n };\n\n const http = createHttpClient({\n baseUrl: apiUrl,\n fetch: (url, init) => platform.fetch(url, init),\n getToken: () => state.sessionToken,\n onUnauthorized: () => state.handlers.onInvalidSession?.(),\n });\n\n const connection = new Connection(wsUrl, url => platform.createWebSocket(url));\n\n const reconnection = createReconnectionManager({\n baseDelay: 1000,\n maxDelay: 30000,\n subscribeReconnectHints: platform.subscribeReconnectHints?.bind(platform),\n onReconnect: () => {\n if (state.sessionToken && state.userId) {\n connect(state.sessionToken, state.userId).catch(error => {\n console.error('🔌 Revolt WebSocket reconnect failed:', error);\n // A failure without a close event still needs a retry.\n if (!reconnection.isScheduled()) reconnection.schedule();\n });\n }\n },\n });\n\n const userCache = createUserCache(http);\n const eventRouter = createEventRouter(\n userCache,\n () => state.sessionToken,\n autumnUrl,\n {\n ...handlers,\n // Only an accepted token ends a retry run.\n onAuthenticated: () => {\n reconnection.reset();\n state.handlers.onAuthenticated?.();\n },\n },\n getMemberById\n );\n\n function authenticate(): void {\n if (state.sessionToken) {\n connection.send({\n type: 'Authenticate',\n token: state.sessionToken,\n });\n }\n }\n\n async function connect(sessionToken: string, userId: string): Promise<void> {\n state.sessionToken = sessionToken;\n state.userId = userId;\n reconnection.resume();\n return connection.connect();\n }\n\n connection.on('open', () => {\n authenticate();\n state.handlers.onConnected?.();\n });\n\n connection.on('message', (data: string) => {\n eventRouter.route(data).catch(console.error);\n });\n\n connection.on('close', (event: SocketCloseEventLike) => {\n console.error('🔌 Revolt WebSocket disconnected:', {\n code: event.code,\n reason: event.reason,\n wasClean: event.wasClean,\n attempts: reconnection.getAttempts(),\n });\n state.handlers.onDisconnected?.();\n\n if (reconnection.shouldReconnect(event.code)) {\n reconnection.schedule();\n }\n });\n\n connection.on('error', (error: unknown) => {\n console.error('🔌 Revolt WebSocket error:', error);\n state.handlers.onError?.(error);\n });\n\n function seedUsers(users: Array<{ _id: string; username: string }>): void {\n userCache.seed(users);\n }\n\n function subscribeToRoom(_roomId: string): void {\n // Revolt doesn't require explicit subscription\n }\n\n function sendTyping(roomId: string, isTyping: boolean): void {\n if (isTyping) {\n connection.send({\n type: 'BeginTyping',\n channel: roomId,\n });\n } else {\n connection.send({\n type: 'EndTyping',\n channel: roomId,\n });\n }\n }\n\n function disconnect(): void {\n reconnection.stop();\n connection.disconnect();\n }\n\n function destroy(): void {\n disconnect();\n reconnection.dispose();\n }\n\n function isConnected(): boolean {\n return connection.isConnected();\n }\n\n function setEventHandlers(handlers: RevoltSocketEventHandlers): void {\n state.handlers = handlers;\n }\n\n return {\n connect,\n disconnect,\n destroy,\n isConnected,\n seedUsers,\n subscribeToRoom,\n sendTyping,\n setEventHandlers,\n };\n}\n\nexport type RevoltSocketInstance = ReturnType<typeof createRevoltSocket>;\n","/**\n * Synchronous key-value storage, shaped like `localStorage`. Core reads session and last-room\n * data synchronously; React Native can back this with MMKV, or an in-memory map hydrated from\n * AsyncStorage before chat starts and written through in the background.\n */\nexport interface KeyValueStorage {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\nlet configuredStorage: KeyValueStorage | null = null;\n\nexport function configureChatStorage(storage: KeyValueStorage | null): void {\n configuredStorage = storage;\n}\n\n/** Throws until configured; callers already treat storage errors as \"storage unavailable\". */\nexport function getChatStorage(): KeyValueStorage {\n if (!configuredStorage) {\n throw new Error('Chat storage is not configured. Call configureChatStorage() first.');\n }\n return configuredStorage;\n}\n\nexport function createMemoryStorage(): KeyValueStorage {\n const items = new Map<string, string>();\n return {\n getItem: key => items.get(key) ?? null,\n setItem: (key, value) => {\n items.set(key, value);\n },\n removeItem: key => {\n items.delete(key);\n },\n };\n}\n","import type { User } from '../../types/user';\nimport type { AssetChatChannel } from '../../types/asset';\nimport { getChatStorage } from '../../platform/storage';\n\nexport const SESSION_STORAGE_KEY = 'revolt_chat_session';\nconst H24 = 24 * 60 * 60 * 1000;\n\nexport interface SessionData {\n user: User;\n token: string;\n serverId?: string;\n revoltUserId?: string;\n assetChatChannels?: AssetChatChannel[];\n chatUsed?: boolean | null;\n attentionSeriesPlayed?: number;\n attentionNextSeriesAt?: number | null;\n}\n\ninterface AttentionBudget {\n attentionSeriesPlayed: number;\n attentionNextSeriesAt: number | null;\n}\n\nexport interface SaveSessionParams {\n user: User;\n token: string;\n serverId?: string;\n assetChatChannels?: AssetChatChannel[];\n chatUsed?: boolean | null;\n}\n\nexport class SessionManager {\n static clear(): void {\n try {\n getChatStorage().removeItem(SESSION_STORAGE_KEY);\n } catch (error) {\n console.error('Failed to clear session:', error);\n }\n }\n\n static save({\n user,\n token,\n serverId,\n assetChatChannels,\n chatUsed = null,\n }: SaveSessionParams): void {\n try {\n const session = {\n user,\n token,\n serverId,\n revoltUserId: user._id,\n assetChatChannels,\n chatUsed,\n timestamp: Date.now(),\n };\n getChatStorage().setItem(SESSION_STORAGE_KEY, JSON.stringify(session));\n } catch (error) {\n console.error('Failed to save session:', error);\n }\n }\n\n static markChatUsed(): void {\n this.patch({ chatUsed: true });\n }\n\n static saveAttentionBudget(budget: AttentionBudget): void {\n this.patch(budget);\n }\n\n static loadAttentionBudget(): AttentionBudget {\n const session = this.load();\n return {\n attentionSeriesPlayed: session?.attentionSeriesPlayed ?? 0,\n attentionNextSeriesAt: session?.attentionNextSeriesAt ?? null,\n };\n }\n\n private static patch(fields: Partial<SessionData>): void {\n try {\n const stored = getChatStorage().getItem(SESSION_STORAGE_KEY);\n if (!stored) return;\n\n getChatStorage().setItem(\n SESSION_STORAGE_KEY,\n JSON.stringify({ ...JSON.parse(stored), ...fields })\n );\n } catch (error) {\n console.error('Failed to update session:', error);\n }\n }\n\n // For storage event payloads; skips load()'s expiry check.\n static parseChatUsed(serialized: string | null): boolean | null {\n try {\n return serialized ? (JSON.parse(serialized).chatUsed ?? null) : null;\n } catch {\n return null;\n }\n }\n\n static load(): SessionData | null {\n try {\n const stored = getChatStorage().getItem(SESSION_STORAGE_KEY);\n if (!stored) return null;\n\n const session = JSON.parse(stored);\n if (Date.now() - session.timestamp > H24) {\n this.clear();\n return null;\n }\n\n return {\n user: session.user,\n token: session.token,\n serverId: session.serverId,\n revoltUserId: session.revoltUserId || session.user?._id,\n assetChatChannels: session.assetChatChannels,\n chatUsed: session.chatUsed ?? null,\n attentionSeriesPlayed: session.attentionSeriesPlayed ?? 0,\n attentionNextSeriesAt: session.attentionNextSeriesAt ?? null,\n };\n } catch (error) {\n console.error('Failed to load session:', error);\n return null;\n }\n }\n}\n","import { getChatStorage } from '../../platform/storage';\n\nconst STORAGE_KEY_PREFIX = 'corva_chat_last_room';\nconst ACTIVITY_KEY_PREFIX = 'corva_chat_last_activity';\nconst DEFAULT_ACTIVITY_THRESHOLD_DAYS = 3;\nconst DAY_MS = 24 * 60 * 60 * 1000;\n\nfunction getStorageKey(userId: string): string {\n return `${STORAGE_KEY_PREFIX}_${userId}`;\n}\n\nfunction getActivityKey(userId: string): string {\n return `${ACTIVITY_KEY_PREFIX}_${userId}`;\n}\n\nexport function saveLastOpenedRoom(roomId: string, userId: string): void {\n try {\n getChatStorage().setItem(getStorageKey(userId), roomId);\n } catch {\n console.error('Failed to save last opened room');\n }\n}\n\nexport function getLastOpenedRoom(userId: string): string | null {\n try {\n return getChatStorage().getItem(getStorageKey(userId));\n } catch {\n return null;\n }\n}\n\nexport function clearLastOpenedRoom(userId: string): void {\n try {\n getChatStorage().removeItem(getStorageKey(userId));\n } catch {\n console.error('Failed to clear last opened room');\n }\n}\n\nexport function saveLastChatActivity(userId: string): void {\n try {\n getChatStorage().setItem(getActivityKey(userId), String(Date.now()));\n } catch {\n console.error('Failed to save last chat activity');\n }\n}\n\nexport function wasRecentlyActive(\n userId: string,\n thresholdDays: number = DEFAULT_ACTIVITY_THRESHOLD_DAYS\n): boolean {\n try {\n const timestamp = getChatStorage().getItem(getActivityKey(userId));\n if (!timestamp) return false;\n\n return Date.now() - Number(timestamp) < thresholdDays * DAY_MS;\n } catch {\n return false;\n }\n}\n","import type { Message } from '../../types/message';\n\nconst MAX_CACHED_ROOMS = 20;\nconst MAX_MESSAGES_PER_ROOM = 500;\n\ninterface CacheEntry {\n messages: Message[];\n lastAccessed: number;\n}\n\nexport function createMessageCache() {\n const cache: Record<string, CacheEntry> = {};\n const dirtyChannels = new Set<string>();\n\n function evictLRU(): void {\n let oldestRoomId: string | null = null;\n let oldestTime = Infinity;\n\n Object.keys(cache).forEach(roomId => {\n const entry = cache[roomId];\n if (entry && entry.lastAccessed < oldestTime) {\n oldestTime = entry.lastAccessed;\n oldestRoomId = roomId;\n }\n });\n\n if (oldestRoomId) {\n delete cache[oldestRoomId];\n }\n }\n\n function get(roomId: string): Message[] | undefined {\n if (dirtyChannels.has(roomId)) {\n return undefined;\n }\n\n const entry = cache[roomId];\n if (!entry) {\n return undefined;\n }\n\n entry.lastAccessed = Date.now();\n return entry.messages;\n }\n\n function set(roomId: string, messages: Message[]): void {\n const trimmedMessages =\n messages.length > MAX_MESSAGES_PER_ROOM ? messages.slice(0, MAX_MESSAGES_PER_ROOM) : messages;\n\n if (!cache[roomId] && Object.keys(cache).length >= MAX_CACHED_ROOMS) {\n evictLRU();\n }\n\n cache[roomId] = {\n messages: trimmedMessages,\n lastAccessed: Date.now(),\n };\n dirtyChannels.delete(roomId);\n }\n\n function markDirty(roomId: string): void {\n dirtyChannels.add(roomId);\n delete cache[roomId];\n }\n\n function isDirty(roomId: string): boolean {\n return dirtyChannels.has(roomId);\n }\n\n function clear(roomId?: string): void {\n if (roomId) {\n delete cache[roomId];\n dirtyChannels.delete(roomId);\n } else {\n Object.keys(cache).forEach(key => delete cache[key]);\n dirtyChannels.clear();\n }\n }\n\n return {\n get,\n set,\n markDirty,\n isDirty,\n clear,\n };\n}\n\nexport type MessageCache = ReturnType<typeof createMessageCache>;\n","import type { Message } from '../../types/message';\n\ninterface PageCursor {\n before?: string;\n around?: string;\n}\n\nexport interface LocatorContext {\n getMessages: () => Message[];\n applyMessages: (messages: Message[]) => void;\n fetchPage: (cursor: PageCursor) => Promise<Message[]>;\n isCancelled: () => boolean;\n maxPages?: number;\n}\n\nconst DEFAULT_MAX_PAGES = 60;\n\nfunction merge(existing: Message[], incoming: Message[]): Message[] {\n if (incoming.length === 0) return existing;\n const seen = new Set(existing.map(m => m._id));\n const additions = incoming.filter(m => !seen.has(m._id));\n if (additions.length === 0) return existing;\n return [...existing, ...additions].sort(\n (a, b) => new Date(b.ts).getTime() - new Date(a.ts).getTime()\n );\n}\n\nexport async function loadUntilFound(targetId: string, ctx: LocatorContext): Promise<boolean> {\n const isLoaded = () => ctx.getMessages().some(m => m._id === targetId);\n if (isLoaded()) return true;\n\n const around = await ctx.fetchPage({ around: targetId });\n if (ctx.isCancelled()) return false;\n if (around.length > 0) ctx.applyMessages(merge(ctx.getMessages(), around));\n if (isLoaded()) return true;\n\n const max = ctx.maxPages ?? DEFAULT_MAX_PAGES;\n for (let i = 0; i < max && !ctx.isCancelled() && !isLoaded(); i += 1) {\n const oldest = ctx.getMessages()[ctx.getMessages().length - 1];\n if (!oldest) break;\n // eslint-disable-next-line no-await-in-loop -- sequential cursor\n const older = await ctx.fetchPage({ before: oldest._id });\n if (ctx.isCancelled()) return false;\n if (older.length === 0) break;\n ctx.applyMessages(merge(ctx.getMessages(), older));\n }\n\n return isLoaded();\n}\n","export function createTypingManager() {\n const timeouts: Record<string, ReturnType<typeof setTimeout>> = {};\n const displayById: Record<string, string> = {};\n\n function getDisplayName(userId: string): string | undefined {\n return displayById[userId];\n }\n\n function setDisplayName(userId: string, displayName: string): void {\n displayById[userId] = displayName;\n }\n\n function getDisplayById(): Record<string, string> {\n return displayById;\n }\n\n function clearUserTimeout(userId: string): void {\n const existing = timeouts[userId];\n if (existing) {\n clearTimeout(existing);\n delete timeouts[userId];\n }\n }\n\n function setUserTimeout(userId: string, callback: () => void, delay: number): void {\n clearUserTimeout(userId);\n timeouts[userId] = setTimeout(() => {\n callback();\n delete timeouts[userId];\n }, delay);\n }\n\n function clearAllTimeouts(): void {\n Object.values(timeouts).forEach(t => clearTimeout(t));\n Object.keys(timeouts).forEach(key => delete timeouts[key]);\n }\n\n function clear(): void {\n clearAllTimeouts();\n Object.keys(displayById).forEach(key => delete displayById[key]);\n }\n\n return {\n getDisplayName,\n setDisplayName,\n getDisplayById,\n clearTimeout: clearUserTimeout,\n setTimeout: setUserTimeout,\n clearAllTimeouts,\n clear,\n };\n}\n\nexport type TypingManager = ReturnType<typeof createTypingManager>;\n","// Chains a room's socket events so awaited API calls cannot apply out of order.\nexport function createRoomTaskQueue() {\n const tails = new Map<string, Promise<void>>();\n\n return (roomId: string, task: () => Promise<void>): Promise<void> => {\n const previous = tails.get(roomId) ?? Promise.resolve();\n const next = previous\n .then(task)\n .catch(error => console.error('Room event handling failed:', error))\n .finally(() => {\n if (tails.get(roomId) === next) tails.delete(roomId);\n });\n tails.set(roomId, next);\n return next;\n };\n}\n","import type { Message } from '../../types/message';\n\nexport const addMessage = (currentMessages: Message[], newMessage: Message): Message[] => {\n const messageExists = currentMessages.some(m => m._id === newMessage._id);\n\n if (messageExists) {\n return currentMessages;\n }\n\n const messageWithValidTimestamp = {\n ...newMessage,\n ts: newMessage.ts || new Date().toISOString(),\n // eslint-disable-next-line no-underscore-dangle\n _updatedAt: newMessage._updatedAt || newMessage.ts || new Date().toISOString(),\n };\n\n // Add and sort messages chronologically\n return [...currentMessages, messageWithValidTimestamp].sort(\n (a, b) => new Date(a.ts).getTime() - new Date(b.ts).getTime()\n );\n};\n\nexport const updateMessageInList = (\n messages: Message[],\n messageId: string,\n updates: Partial<Message>\n): Message[] => {\n return messages.map(msg => (msg._id === messageId ? { ...msg, ...updates } : msg));\n};\n\nexport const removeMessageFromList = (messages: Message[], messageId: string): Message[] => {\n return messages.filter(msg => msg._id !== messageId);\n};\n","import { v4 as uuid } from 'uuid';\n\nimport type { Message, MessageFormData, FileAttachment, UploadFile } from '../../types/message';\nimport type { RevoltMessageResponse, RevoltUploadResponse } from '../../types/revolt';\nimport type { RevoltAPIInstance } from '../../api/RevoltAPI';\n\nimport { addMessage } from './messageOperations';\n\n// Structural rather than `instanceof File`: React Native picks files as plain objects.\nconst isUploadFile = (file: unknown): file is UploadFile =>\n !!file && typeof (file as UploadFile).name === 'string';\n\nexport interface UploadedFile {\n file: UploadFile;\n url: string;\n id?: string;\n}\n\nexport interface UploadAndSendResult {\n response: RevoltMessageResponse;\n uploadedFiles: UploadedFile[];\n}\n\n// Upload file (if any) and send message to API\nexport async function uploadAndSend(\n api: RevoltAPIInstance,\n data: MessageFormData,\n nonce: string\n): Promise<UploadAndSendResult> {\n if (data.uploadedFileIds?.length) {\n const response = (await api.sendMessage(\n data.roomId,\n data.text,\n data.threadId,\n data.uploadedFileIds,\n nonce\n )) as RevoltMessageResponse;\n\n const files = data.files || [];\n const uploadedFiles: UploadedFile[] = data.uploadedFileIds\n .map((id, i) => ({\n file: files[i] as UploadFile,\n url: data.uploadedFileUrls?.[i] || '',\n id,\n }))\n .filter(uf => isUploadFile(uf.file));\n\n return { response, uploadedFiles };\n }\n\n // Fallback: Handle multiple files that need to be uploaded\n const filesToUpload = data.files || (data.file ? [data.file] : []);\n\n // Upload all files in parallel\n const uploadPromises = filesToUpload.filter(isUploadFile).map(async file => {\n const uploaded = (await api.uploadAttachment(file)) as RevoltUploadResponse;\n if (!uploaded || !uploaded.url) {\n throw new Error('Upload failed: No URL returned from server');\n }\n return { file, url: uploaded.url, id: uploaded.id };\n });\n\n const uploadResults = await Promise.allSettled(uploadPromises);\n const uploadedFiles: UploadedFile[] = uploadResults\n .filter(\n (\n result\n ): result is PromiseFulfilledResult<{\n file: UploadFile;\n url: string;\n id: string | undefined;\n }> => result.status === 'fulfilled'\n )\n .map(result => result.value);\n\n if (uploadResults.some(r => r.status === 'rejected') && uploadedFiles.length === 0) {\n throw new Error('All file uploads failed');\n }\n\n const uploadedIds = uploadedFiles.map(f => f.id).filter((id): id is string => Boolean(id));\n\n const response = (await api.sendMessage(\n data.roomId,\n data.text,\n data.threadId,\n uploadedIds.length ? uploadedIds : undefined,\n nonce\n )) as RevoltMessageResponse;\n\n return { response, uploadedFiles };\n}\n\n// Build final message object from API response\nexport function buildFinalMessage(\n response: RevoltMessageResponse,\n data: MessageFormData,\n currentUser: { _id: string; username: string } | null,\n uploadedFiles: UploadedFile[] = []\n): Message {\n const files: FileAttachment[] = uploadedFiles.map(({ file, url, id }) => ({\n _id: id || `file-${uuid()}`,\n name: file.name,\n type: file.type,\n size: file.size,\n rid: data.roomId,\n userId: response.author,\n url,\n }));\n\n return {\n _id: response._id,\n nonce: response.nonce,\n rid: response.channel,\n msg: data.text, // Use original text, not response.content which may include attachment URLs\n ts: new Date().toISOString(),\n u: {\n _id: response.author,\n username: response.user?.username || currentUser?.username || 'You',\n },\n _updatedAt: new Date().toISOString(),\n replies: data.threadId ? [data.threadId] : undefined,\n attachments: uploadedFiles.length\n ? uploadedFiles.map(({ file, url }) => ({ image_url: url, title: file.name || 'file' }))\n : undefined,\n files: files.length ? files : undefined,\n };\n}\n\n// Mark message as failed and rollback thread count if needed\nfunction markMessageFailed(messages: Message[], tempId: string, threadId?: string): Message[] {\n return messages.map(msg => {\n if (msg._id === tempId) {\n return { ...msg, isOptimistic: false, sendFailed: true };\n }\n if (threadId && msg._id === threadId) {\n return { ...msg, tcount: Math.max(0, (msg.tcount || 1) - 1) };\n }\n return msg;\n });\n}\n\n// The echo may have landed first, or the optimistic copy may be gone after a reload.\nexport function settleOptimisticMessage(\n messages: Message[],\n tempId: string,\n finalMessage: Message\n): Message[] {\n const withoutEcho = messages.filter(msg => msg._id !== finalMessage._id);\n return withoutEcho.some(msg => msg._id === tempId)\n ? withoutEcho.map(msg => (msg._id === tempId ? finalMessage : msg))\n : addMessage(withoutEcho, finalMessage);\n}\n\nexport function failOptimisticMessage(\n messages: Message[],\n optimistic: Message,\n threadId?: string\n): Message[] {\n const existing = messages.find(msg => msg._id === optimistic._id);\n if (!existing) {\n return addMessage(messages, { ...optimistic, isOptimistic: false, sendFailed: true });\n }\n // Only a copy still marked optimistic carries the thread-count bump.\n return markMessageFailed(messages, optimistic._id, existing.isOptimistic ? threadId : undefined);\n}\n","import type { Subscription } from '../../types/subscription';\nimport type { User } from '../../types/user';\nimport { DIRECT_MESSAGE_PLACEHOLDER } from '../../utils/getRoomDisplayName';\n\nexport const createGroupSubscription = (\n groupId: string,\n name: string,\n owner: { _id: string; username: string },\n recipientIds: string[]\n): Subscription => ({\n _id: groupId,\n rid: groupId,\n name,\n t: 'p',\n u: owner,\n ts: new Date().toISOString(),\n open: true,\n alert: false,\n userMentions: 0,\n groupMentions: 0,\n recipients: recipientIds,\n});\n\nexport const createDMSubscription = (roomId: string, recipient?: User): Subscription => {\n const displayName = recipient?.username || DIRECT_MESSAGE_PLACEHOLDER;\n\n return {\n _id: roomId,\n rid: roomId,\n name: displayName,\n t: 'd',\n u: { _id: '', username: '' },\n ts: new Date().toISOString(),\n open: true,\n alert: false,\n userMentions: 0,\n groupMentions: 0,\n dmUsername: recipient?.username,\n dmAvatarUrl: recipient?.avatarUrl,\n dmUserId: recipient?._id,\n };\n};\n\nexport const addOrUpdateSubscription = (\n subscriptions: Subscription[],\n newSubscription: Subscription\n): Subscription[] => {\n const index = subscriptions.findIndex(s => s.rid === newSubscription.rid);\n\n if (index >= 0) {\n const updated = [...subscriptions];\n updated[index] = { ...updated[index], ...newSubscription };\n return updated;\n }\n\n return [...subscriptions, newSubscription];\n};\n\nexport const removeSubscription = (\n subscriptions: Subscription[],\n roomId: string\n): Subscription[] => {\n return subscriptions.filter(s => s.rid !== roomId);\n};\n","import type { ChatPlatform } from './types';\nimport type { KeyValueStorage } from './storage';\nimport { configureChatStorage } from './storage';\n\n/** Requests against corva-api. The host adds the base URL, the Corva JWT and query encoding. */\nexport interface CorvaApiAdapter {\n get<T = unknown>(path: string, params?: Record<string, unknown>): Promise<T>;\n post<T = unknown>(path: string, body?: Record<string, unknown>): Promise<T>;\n}\n\nexport interface AppStateAdapter {\n /** Tab hidden (web) or app in the background (React Native). */\n isHidden(): boolean;\n /** Hidden, or visible without focus. Incoming messages alert while inactive. */\n isInactive(): boolean;\n /** Fires on hidden <-> visible changes. Returns an unsubscribe function. */\n subscribe(listener: (hidden: boolean) => void): () => void;\n /** Fires when the page or app is about to go away (web `pagehide`), to flush pending acks. */\n onTerminate?(listener: () => void): () => void;\n}\n\n/** Host-side reactions to chat events; each app decides how (browser notification, push, sound). */\nexport interface ChatNotifier<TContext = unknown> {\n showIncomingMessage?(context: TContext): void;\n onMessageSent?(userId: string): void;\n onLogout?(): void;\n}\n\nexport interface ChatDates {\n /** Epoch ms of tomorrow at `hour`:00 in the user's timezone. */\n startOfTomorrowAt(hour: number, now: number): number;\n}\n\nexport interface ChatHost {\n apiUrl: string;\n wsUrl: string;\n platform: ChatPlatform;\n storage: KeyValueStorage;\n corvaApi: CorvaApiAdapter;\n appState: AppStateAdapter;\n dates: ChatDates;\n notifier?: ChatNotifier;\n}\n\nlet configuredHost: ChatHost | null = null;\n\n/** Call once at app start, before any store is used. */\nexport function configureChat(host: ChatHost): void {\n configuredHost = host;\n configureChatStorage(host.storage);\n}\n\nexport function getChatHost(): ChatHost {\n if (!configuredHost) {\n throw new Error('Chat is not configured. Call configureChat() first.');\n }\n return configuredHost;\n}\n\nexport function resetChatHost(): void {\n configuredHost = null;\n configureChatStorage(null);\n}\n","/** Structural equality for plain JSON-like data (settings objects), in place of lodash `isEqual`. */\nexport function isDeepEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n\n return keysA.every(\n key =>\n Object.prototype.hasOwnProperty.call(b, key) &&\n isDeepEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key])\n );\n}\n","import { getChatHost } from '../platform/host';\n\n// JSON-safe stand-in for \"no end date\" so the value survives the chat_settings round-trip.\nexport const PAUSE_INDEFINITELY = Number.MAX_SAFE_INTEGER;\n\nexport const PAUSE_PRESETS = {\n THIRTY_MIN: '30m',\n ONE_HOUR: '1h',\n FOUR_HOURS: '4h',\n EIGHT_HOURS: '8h',\n UNTIL_TOMORROW: 'tomorrow',\n INDEFINITELY: 'indefinitely',\n} as const;\n\nexport type PausePreset = (typeof PAUSE_PRESETS)[keyof typeof PAUSE_PRESETS];\n\nexport interface PausePresetOption {\n value: PausePreset;\n label: string;\n}\n\nconst DURATION_MS: Partial<Record<PausePreset, number>> = {\n [PAUSE_PRESETS.THIRTY_MIN]: 30 * 60 * 1000,\n [PAUSE_PRESETS.ONE_HOUR]: 60 * 60 * 1000,\n [PAUSE_PRESETS.FOUR_HOURS]: 4 * 60 * 60 * 1000,\n [PAUSE_PRESETS.EIGHT_HOURS]: 8 * 60 * 60 * 1000,\n};\n\nconst PRESET_LABELS: Record<PausePreset, string> = {\n [PAUSE_PRESETS.THIRTY_MIN]: '30 min',\n [PAUSE_PRESETS.ONE_HOUR]: '1 hour',\n [PAUSE_PRESETS.FOUR_HOURS]: '4 hour',\n [PAUSE_PRESETS.EIGHT_HOURS]: '8 hour',\n [PAUSE_PRESETS.UNTIL_TOMORROW]: 'Until Tomorrow',\n [PAUSE_PRESETS.INDEFINITELY]: 'Indefinitely',\n};\n\nconst toOptions = (presets: PausePreset[]): PausePresetOption[] =>\n presets.map(value => ({ value, label: PRESET_LABELS[value] }));\n\nexport const PAUSE_PRESET_OPTIONS = toOptions([\n PAUSE_PRESETS.THIRTY_MIN,\n PAUSE_PRESETS.ONE_HOUR,\n PAUSE_PRESETS.FOUR_HOURS,\n PAUSE_PRESETS.UNTIL_TOMORROW,\n PAUSE_PRESETS.INDEFINITELY,\n]);\n\nexport const MUTE_PRESET_OPTIONS = toOptions([\n PAUSE_PRESETS.THIRTY_MIN,\n PAUSE_PRESETS.ONE_HOUR,\n PAUSE_PRESETS.FOUR_HOURS,\n PAUSE_PRESETS.EIGHT_HOURS,\n PAUSE_PRESETS.UNTIL_TOMORROW,\n PAUSE_PRESETS.INDEFINITELY,\n]);\n\nconst TOMORROW_START_HOUR = 8;\n\nexport function getPauseUntil(preset: PausePreset, now = Date.now()): number {\n if (preset === PAUSE_PRESETS.INDEFINITELY) return PAUSE_INDEFINITELY;\n if (preset === PAUSE_PRESETS.UNTIL_TOMORROW) {\n return getChatHost().dates.startOfTomorrowAt(TOMORROW_START_HOUR, now);\n }\n return now + (DURATION_MS[preset] ?? 0);\n}\n\nexport function isPauseActive(until: number | null | undefined, now = Date.now()): boolean {\n return typeof until === 'number' && until > now;\n}\n\nexport function isValidPausePreset(value: unknown): value is PausePreset {\n return typeof value === 'string' && Object.values(PAUSE_PRESETS).includes(value as PausePreset);\n}\n","export function waitForNextPaint(): Promise<void> {\n if (typeof requestAnimationFrame !== 'function') return Promise.resolve();\n\n return new Promise(resolve => {\n requestAnimationFrame(() => {\n setTimeout(resolve, 0);\n });\n });\n}\n","import { getChatHost } from '../../platform/host';\n\nimport type { ChatAssetType } from '../../types/asset';\n\n/**\n * Asset Chats API Module\n *\n * Fetches or creates a Revolt channel for a specific rig / frac fleet /\n * intervention unit. The backend will return the associated revolt_channel_id.\n */\n\ninterface AssetChatResponse {\n revolt_channel_id: string;\n}\n\nconst ASSET_ID_PARAM: Record<ChatAssetType, string> = {\n rig: 'rig_id',\n frac_fleet: 'frac_fleet_id',\n intervention_unit: 'intervention_unit_id',\n};\n\nexport async function getAssetChatChannel(\n assetId: string,\n assetType: ChatAssetType\n): Promise<string> {\n if (!assetId || Number.isNaN(Number(assetId))) {\n throw new Error('Asset ID is required');\n }\n\n const body = { [ASSET_ID_PARAM[assetType]]: Number(assetId) };\n\n const response = await getChatHost().corvaApi.post<AssetChatResponse>(\n '/v2/integration/revolt_chat_sessions',\n body\n );\n\n if (!response?.revolt_channel_id) {\n throw new Error('No revolt_channel_id returned from asset chat API');\n }\n\n return response.revolt_channel_id;\n}\n","import type { User as RevoltUser } from '../types/user';\nimport type { CorvaUser, CorvaAPIUser } from '../types/corvaIntegration';\n\n// Union type for user data we might have (full CorvaUser or API response)\ntype StoredCorvaUser = CorvaUser | CorvaAPIUser;\n\n/** Extracts common fields from either CorvaUser or CorvaAPIUser */\nexport function getCorvaUserFields(corvaUser: StoredCorvaUser) {\n const isAPIUser = 'attributes' in corvaUser;\n const attrs = isAPIUser ? corvaUser.attributes : corvaUser;\n return {\n firstName: attrs.first_name,\n lastName: attrs.last_name,\n email: attrs.email,\n profilePhoto: attrs.profile_photo,\n title: attrs.title,\n role: 'role' in attrs ? attrs.role : undefined,\n id: isAPIUser ? corvaUser.id : (corvaUser as CorvaUser).id,\n };\n}\n\nexport function createCorvaUserService() {\n const revoltToCorva = new Map<string, StoredCorvaUser>();\n\n return {\n setMapping(revoltUserId: string, corvaUser: StoredCorvaUser) {\n revoltToCorva.set(revoltUserId, corvaUser);\n },\n\n getCorvaUser(revoltUserId: string): StoredCorvaUser | undefined {\n return revoltToCorva.get(revoltUserId);\n },\n\n clear() {\n revoltToCorva.clear();\n },\n\n enrichUser(user: RevoltUser): RevoltUser {\n const corvaUser = revoltToCorva.get(user._id);\n\n if (!corvaUser) {\n return {\n ...user,\n displayName: user.name || user.username || 'Unknown User',\n displayAvatar: user.avatarUrl || undefined,\n email: user.emails?.[0]?.address || undefined,\n };\n }\n\n const fields = getCorvaUserFields(corvaUser);\n const corvaName = `${fields.firstName} ${fields.lastName}`.trim() || fields.email;\n const displayName = corvaName || user.name || user.username || 'Unknown User';\n\n return {\n ...user,\n displayName,\n displayAvatar: fields.profilePhoto || user.avatarUrl || undefined,\n email: fields.email || user.emails?.[0]?.address || undefined,\n title: fields.title || undefined,\n role: fields.role || undefined,\n company: !('attributes' in corvaUser) ? corvaUser.company?.name : undefined,\n };\n },\n };\n}\n\nexport type CorvaUserService = ReturnType<typeof createCorvaUserService>;\n","import type { Message } from '../types/message';\nimport type { RevoltAPIInstance } from '../api/RevoltAPI';\nimport type { RevoltSocketInstance } from '../api/RevoltSocket';\nimport { createCorvaUserService, type CorvaUserService } from '../services/corvaUserService';\n\nimport { createMessageCache, type MessageCache } from './services/messageCache';\nimport { createTypingManager, type TypingManager } from './services/typingManager';\nimport type { AckScheduler } from './services/ackScheduler';\n\nexport interface SharedRefs {\n api?: RevoltAPIInstance;\n socket?: RevoltSocketInstance;\n serverUrl?: string;\n messageCache: MessageCache;\n typingManager: TypingManager;\n corvaUserService: CorvaUserService;\n forwardedMessageCache: Map<string, Message>;\n ackChannel?: AckScheduler;\n}\n\nexport const sharedRefs: SharedRefs = {\n api: undefined,\n socket: undefined,\n serverUrl: undefined,\n messageCache: createMessageCache(),\n typingManager: createTypingManager(),\n corvaUserService: createCorvaUserService(),\n forwardedMessageCache: new Map(),\n ackChannel: undefined,\n};\n","import { createStore } from 'zustand/vanilla';\nimport { isDeepEqual } from '../../utils/isDeepEqual';\n\nimport {\n getPauseUntil,\n isPauseActive,\n PAUSE_INDEFINITELY,\n type PausePreset,\n} from '../../utils/notificationPause';\n\nexport const NOTIFICATION_SETTING_ALL = 'all' as const;\nexport const NOTIFICATION_SETTING_MENTIONS = 'mentions' as const;\nexport const NOTIFICATION_SETTING_NOTHING = 'nothing' as const;\n\nexport type ChannelNotificationSetting =\n | typeof NOTIFICATION_SETTING_ALL\n | typeof NOTIFICATION_SETTING_MENTIONS\n | typeof NOTIFICATION_SETTING_NOTHING;\n\ntype EmailNotificationSetting =\n typeof NOTIFICATION_SETTING_MENTIONS | typeof NOTIFICATION_SETTING_NOTHING;\n\nexport const NOTIFICATION_DESTINATIONS = {\n PLATFORM: 'platform',\n MOBILE: 'mobile',\n EMAIL: 'email',\n} as const;\n\nexport type NotificationDestination =\n (typeof NOTIFICATION_DESTINATIONS)[keyof typeof NOTIFICATION_DESTINATIONS];\n\n// corva-api's unread email digest reads `setting.email` (RevoltChats::ChannelEmailSetting).\ninterface ChannelDestinationSettings {\n platform: ChannelNotificationSetting;\n mobile: ChannelNotificationSetting;\n email: EmailNotificationSetting;\n}\n\nexport interface ChannelNotificationPreference {\n setting: ChannelDestinationSettings;\n // Legacy indefinite mute; timed mutes live in `mutedUntil` (see `isChannelMuted`).\n muted: boolean;\n mutedUntil: number | null;\n mutePreset: PausePreset | null;\n notifyThreadReplies: boolean;\n}\n\nexport interface NotificationSettings {\n channels: Record<string, ChannelNotificationPreference>;\n}\n\n// User-level; the browser permission is checked separately.\nexport interface NotificationPreferences {\n browserNotifications: boolean;\n sound: boolean;\n pausedUntil: number | null;\n pausePreset: PausePreset | null;\n}\n\nexport interface NotificationStore {\n notificationSettings: NotificationSettings;\n preferences: NotificationPreferences;\n setPreferences: (preferences: NotificationPreferences) => void;\n setBrowserNotificationsEnabled: (enabled: boolean) => void;\n setSoundEnabled: (enabled: boolean) => void;\n pauseNotifications: (preset: PausePreset) => void;\n resumeNotifications: () => void;\n setChannelNotificationSetting: (roomId: string, setting: ChannelNotificationSetting) => void;\n setChannelDestinationSetting: {\n (\n roomId: string,\n destination: typeof NOTIFICATION_DESTINATIONS.EMAIL,\n setting: EmailNotificationSetting\n ): void;\n (\n roomId: string,\n destination:\n typeof NOTIFICATION_DESTINATIONS.PLATFORM | typeof NOTIFICATION_DESTINATIONS.MOBILE,\n setting: ChannelNotificationSetting\n ): void;\n (\n roomId: string,\n destination: NotificationDestination,\n setting: ChannelNotificationSetting\n ): void;\n };\n setChannelMuted: (roomId: string, muted: boolean) => void;\n muteChannelFor: (roomId: string, preset: PausePreset | null) => void;\n setChannelThreadReplies: (roomId: string, notify: boolean) => void;\n resetChannelPreference: (roomId: string) => void;\n setNotificationSettings: (settings: NotificationSettings) => void;\n}\n\nexport const DEFAULT_NOTIFICATION_SETTINGS: NotificationSettings = {\n channels: {},\n};\n\nexport const DEFAULT_NOTIFICATION_PREFERENCES: NotificationPreferences = {\n browserNotifications: true,\n sound: true,\n pausedUntil: null,\n pausePreset: null,\n};\n\nconst DEFAULT_CHANNEL_DESTINATION_SETTINGS: ChannelDestinationSettings = {\n platform: NOTIFICATION_SETTING_ALL,\n mobile: NOTIFICATION_SETTING_ALL,\n email: NOTIFICATION_SETTING_MENTIONS,\n};\n\nexport const DEFAULT_CHANNEL_PREFERENCE: ChannelNotificationPreference = {\n setting: DEFAULT_CHANNEL_DESTINATION_SETTINGS,\n muted: false,\n mutedUntil: null,\n mutePreset: null,\n notifyThreadReplies: false,\n};\n\n// Older stored prefs lack the mute fields and hold `setting` as the bare platform value.\nexport type StoredChannelPreference = Partial<\n Omit<ChannelNotificationPreference, 'setting'> & {\n setting: ChannelNotificationSetting | Partial<ChannelDestinationSettings>;\n }\n>;\n\nexport function withChannelPreferenceDefaults(\n pref: StoredChannelPreference | undefined\n): ChannelNotificationPreference {\n const { setting, ...rest } = pref ?? {};\n const destinations =\n typeof setting === 'string'\n ? { ...DEFAULT_CHANNEL_DESTINATION_SETTINGS, platform: setting }\n : { ...DEFAULT_CHANNEL_DESTINATION_SETTINGS, ...setting };\n return { ...DEFAULT_CHANNEL_PREFERENCE, ...rest, setting: destinations };\n}\n\nexport function isDefaultChannelPreference(pref: StoredChannelPreference | undefined): boolean {\n const full = withChannelPreferenceDefaults(pref);\n return (\n isDeepEqual(full.setting, DEFAULT_CHANNEL_DESTINATION_SETTINGS) &&\n full.muted === DEFAULT_CHANNEL_PREFERENCE.muted &&\n full.mutedUntil === DEFAULT_CHANNEL_PREFERENCE.mutedUntil &&\n full.mutePreset === DEFAULT_CHANNEL_PREFERENCE.mutePreset &&\n full.notifyThreadReplies === DEFAULT_CHANNEL_PREFERENCE.notifyThreadReplies\n );\n}\n\nexport function isChannelMuted(\n pref: Pick<ChannelNotificationPreference, 'muted' | 'mutedUntil'> | undefined,\n now = Date.now()\n): boolean {\n if (!pref) return false;\n return pref.muted || isPauseActive(pref.mutedUntil, now);\n}\n\nexport function isNotificationsPaused(\n preferences: Pick<NotificationPreferences, 'pausedUntil'>,\n now = Date.now()\n): boolean {\n return isPauseActive(preferences.pausedUntil, now);\n}\n\nexport const notificationStore = createStore<NotificationStore>()((set, get) => {\n const updateChannelPreference = (\n roomId: string,\n update: Partial<ChannelNotificationPreference>\n ) => {\n const currentSettings = get().notificationSettings;\n const currentPref = withChannelPreferenceDefaults(currentSettings.channels[roomId]);\n set({\n notificationSettings: {\n channels: {\n ...currentSettings.channels,\n [roomId]: { ...currentPref, ...update },\n },\n },\n });\n };\n\n return {\n notificationSettings: DEFAULT_NOTIFICATION_SETTINGS,\n preferences: DEFAULT_NOTIFICATION_PREFERENCES,\n setPreferences: preferences => set({ preferences }),\n setBrowserNotificationsEnabled: enabled =>\n set(state => ({ preferences: { ...state.preferences, browserNotifications: enabled } })),\n setSoundEnabled: enabled =>\n set(state => ({ preferences: { ...state.preferences, sound: enabled } })),\n pauseNotifications: preset =>\n set(state => ({\n preferences: {\n ...state.preferences,\n pausedUntil: getPauseUntil(preset),\n pausePreset: preset,\n },\n })),\n resumeNotifications: () => {\n if (get().preferences.pausedUntil === null) return;\n set(state => ({\n preferences: { ...state.preferences, pausedUntil: null, pausePreset: null },\n }));\n },\n\n setChannelNotificationSetting: (roomId, setting) =>\n get().setChannelDestinationSetting(roomId, NOTIFICATION_DESTINATIONS.PLATFORM, setting),\n setChannelDestinationSetting: (\n roomId: string,\n destination: NotificationDestination,\n setting: ChannelNotificationSetting\n ) => {\n // Email has no \"all\" mode; the popover switch may still send it.\n const value =\n destination === NOTIFICATION_DESTINATIONS.EMAIL && setting === NOTIFICATION_SETTING_ALL\n ? NOTIFICATION_SETTING_MENTIONS\n : setting;\n const current = withChannelPreferenceDefaults(get().notificationSettings.channels[roomId]);\n updateChannelPreference(roomId, { setting: { ...current.setting, [destination]: value } });\n },\n setChannelMuted: (roomId, muted) =>\n updateChannelPreference(roomId, {\n muted,\n mutedUntil: muted ? PAUSE_INDEFINITELY : null,\n mutePreset: null,\n }),\n muteChannelFor: (roomId, preset) => {\n if (preset) {\n updateChannelPreference(roomId, {\n muted: false,\n mutedUntil: getPauseUntil(preset),\n mutePreset: preset,\n });\n return;\n }\n const current = withChannelPreferenceDefaults(get().notificationSettings.channels[roomId]);\n if (!current.muted && current.mutedUntil === null) return;\n updateChannelPreference(roomId, { muted: false, mutedUntil: null, mutePreset: null });\n },\n setChannelThreadReplies: (roomId, notify) =>\n updateChannelPreference(roomId, { notifyThreadReplies: notify }),\n // Explicit defaults: a removed key does not survive the merging user-settings save.\n resetChannelPreference: roomId => updateChannelPreference(roomId, DEFAULT_CHANNEL_PREFERENCE),\n setNotificationSettings: settings => set({ notificationSettings: settings }),\n };\n});\n\nexport const resetNotificationStore = () =>\n notificationStore.setState({\n notificationSettings: DEFAULT_NOTIFICATION_SETTINGS,\n preferences: DEFAULT_NOTIFICATION_PREFERENCES,\n });\n","import { createStore } from 'zustand/vanilla';\n\nexport interface ChannelContentFilter {\n showFeeds: boolean;\n selectedFeeds: string[];\n}\n\nexport interface ChannelContentFilters {\n channels: Record<string, ChannelContentFilter>;\n}\n\nexport interface ChannelContentFilterStore {\n channelContentFilters: ChannelContentFilters;\n setChannelContentFilters: (filters: ChannelContentFilters) => void;\n setChannelShowFeeds: (channelId: string, showFeeds: boolean) => void;\n setChannelSelectedFeeds: (channelId: string, selectedFeeds: string[]) => void;\n}\n\nexport const DEFAULT_CHANNEL_CONTENT_FILTER: ChannelContentFilter = {\n showFeeds: true,\n selectedFeeds: ['alert'],\n};\n\nexport const DEFAULT_CHANNEL_CONTENT_FILTERS: ChannelContentFilters = {\n channels: {},\n};\n\nexport const channelContentFilterStore = createStore<ChannelContentFilterStore>()((set, get) => {\n const updateChannelFilter = (channelId: string, update: Partial<ChannelContentFilter>) => {\n const current = get().channelContentFilters;\n const currentFilter = current.channels[channelId] || DEFAULT_CHANNEL_CONTENT_FILTER;\n set({\n channelContentFilters: {\n channels: {\n ...current.channels,\n [channelId]: { ...currentFilter, ...update },\n },\n },\n });\n };\n\n return {\n channelContentFilters: DEFAULT_CHANNEL_CONTENT_FILTERS,\n\n setChannelContentFilters: filters => set({ channelContentFilters: filters }),\n setChannelShowFeeds: (channelId, showFeeds) => updateChannelFilter(channelId, { showFeeds }),\n setChannelSelectedFeeds: (channelId, selectedFeeds) =>\n updateChannelFilter(channelId, { selectedFeeds }),\n };\n});\n\nexport const resetChannelContentFilterStore = () =>\n channelContentFilterStore.setState({\n channelContentFilters: DEFAULT_CHANNEL_CONTENT_FILTERS,\n });\n","import { createStore } from 'zustand/vanilla';\n\nexport interface FavoriteRoomsSettings {\n favoriteRoomIds: string[];\n}\n\nexport interface FavoriteRoomsStore {\n favoriteRoomsSettings: FavoriteRoomsSettings;\n persistFavoriteRoomsCallback?: (favoriteRoomIds: string[]) => void;\n\n setFavoriteRoomsSettings: (settings: FavoriteRoomsSettings) => void;\n setPersistFavoriteRoomsCallback: (\n callback: ((favoriteRoomIds: string[]) => void) | undefined\n ) => void;\n addFavoriteRoom: (roomId: string) => void;\n removeFavoriteRoom: (roomId: string) => void;\n isRoomFavorite: (roomId: string) => boolean;\n}\n\nexport const DEFAULT_FAVORITE_ROOMS_SETTINGS: FavoriteRoomsSettings = {\n favoriteRoomIds: [],\n};\n\nexport const favoriteRoomsStore = createStore<FavoriteRoomsStore>()((set, get) => ({\n favoriteRoomsSettings: DEFAULT_FAVORITE_ROOMS_SETTINGS,\n persistFavoriteRoomsCallback: undefined,\n\n setFavoriteRoomsSettings: settings => set({ favoriteRoomsSettings: settings }),\n\n setPersistFavoriteRoomsCallback: callback => set({ persistFavoriteRoomsCallback: callback }),\n\n addFavoriteRoom: roomId => {\n const current = get().favoriteRoomsSettings?.favoriteRoomIds || [];\n if (current.includes(roomId)) return;\n const next = [...current, roomId];\n set({ favoriteRoomsSettings: { favoriteRoomIds: next } });\n get().persistFavoriteRoomsCallback?.(next);\n },\n\n removeFavoriteRoom: roomId => {\n const current = get().favoriteRoomsSettings?.favoriteRoomIds || [];\n if (!current.includes(roomId)) return;\n const next = current.filter(id => id !== roomId);\n set({ favoriteRoomsSettings: { favoriteRoomIds: next } });\n get().persistFavoriteRoomsCallback?.(next);\n },\n\n isRoomFavorite: roomId => get().favoriteRoomsSettings?.favoriteRoomIds?.includes(roomId) || false,\n}));\n\nexport const resetFavoriteRoomsStore = () =>\n favoriteRoomsStore.setState({\n favoriteRoomsSettings: DEFAULT_FAVORITE_ROOMS_SETTINGS,\n persistFavoriteRoomsCallback: undefined,\n });\n","import type { Message } from '../../types/message';\nimport { waitForNextPaint } from '../../utils/waitForNextPaint';\nimport { messageStore } from '../stores/messageStore';\nimport type { UIStore } from '../stores/uiStore';\n\ntype RoomSelectionStateUpdate = Partial<Pick<UIStore, 'isLoading' | 'isSwitchingRoom'>>;\n\ninterface PrepareRoomSelectionParams {\n roomId: string;\n currentRoomId?: string;\n isCacheDirty: (roomId: string) => boolean;\n getCachedMessages: (roomId: string) => Message[] | undefined;\n setState: (state: RoomSelectionStateUpdate) => void;\n}\n\ninterface RoomSelectionRequest {\n id: number;\n roomId: string;\n}\n\nlet latestRequestId = 0;\n\nexport function isCurrentRoomSelection(request: RoomSelectionRequest): boolean {\n return latestRequestId === request.id;\n}\n\nexport async function prepareRoomSelection({\n roomId,\n currentRoomId,\n isCacheDirty,\n getCachedMessages,\n setState,\n}: PrepareRoomSelectionParams): Promise<RoomSelectionRequest | null> {\n if (currentRoomId === roomId && !isCacheDirty(roomId)) return null;\n\n const request = {\n id: latestRequestId + 1,\n roomId,\n };\n latestRequestId = request.id;\n\n const isDirty = isCacheDirty(roomId);\n const cachedMessages = !isDirty ? getCachedMessages(roomId) || [] : [];\n\n if (cachedMessages.length > 0) {\n setState({ isSwitchingRoom: true, isLoading: true });\n messageStore.getState().setHasMoreMessages(cachedMessages.length >= 100);\n } else {\n setState({ isSwitchingRoom: true, isLoading: true });\n messageStore.setState({ messages: [], hasMoreMessages: false });\n }\n\n // Cached rooms need one paint before their heavy message render starts.\n await waitForNextPaint();\n\n return isCurrentRoomSelection(request) ? request : null;\n}\n","import { createStore } from 'zustand/vanilla';\n\nimport { getChatHost } from '../../platform/host';\n\nimport type { User } from '../../types/user';\nimport type { RoomType } from '../../types/room';\nimport type { CorvaUser, CorvaAPIUser } from '../../types/corvaIntegration';\nimport { sharedRefs } from '../sharedRefs';\n\nimport { authStore } from './authStore';\nimport { roomStore } from './roomStore';\n\nexport interface MemberStore {\n members: User[];\n membersRoomId: string | null;\n membersById: Record<string, User>;\n typingUsers: string[];\n serverMembersLoaded: boolean;\n serverMembersCache: User[] | null;\n allVisibleUsersCache: User[] | null;\n corvaUserMappings: Record<string, CorvaUser | CorvaAPIUser>;\n\n setMembers: (members: User[], roomId?: string) => void;\n setCorvaUserMapping: (revoltUserId: string, corvaUser: CorvaUser | CorvaAPIUser) => void;\n bulkSetCorvaUserMappings: (\n mappings: Array<{ revoltUserId: string; corvaUser: CorvaUser | CorvaAPIUser }>\n ) => void;\n getCorvaUserFromState: (revoltUserId: string) => CorvaUser | CorvaAPIUser | undefined;\n addMemberToCache: (user: User) => void;\n getMemberById: (userId: string) => User | undefined;\n removeUserFromMembers: (userId: string) => void;\n\n addTypingUser: (userId: string) => void;\n removeTypingUser: (userId: string) => void;\n setTypingUsers: (users: string[]) => void;\n simulateTyping: (userKey: string, isTyping: boolean, displayName?: string) => void;\n\n loadRoomMembers: (roomId: string, roomType: RoomType, isAssetChat?: boolean) => Promise<void>;\n searchUsers: (query: string) => Promise<User[]>;\n getUserByUsername: (username: string) => Promise<User | null>;\n getAllVisibleUsers: () => Promise<User[]>;\n syncCorvaUsers: (companyId?: number) => Promise<boolean>;\n}\n\nconst getInitialState = () => ({\n members: [] as User[],\n membersRoomId: null,\n membersById: {} as Record<string, User>,\n typingUsers: [] as string[],\n serverMembersLoaded: false,\n serverMembersCache: null,\n allVisibleUsersCache: null,\n corvaUserMappings: {} as Record<string, CorvaUser | CorvaAPIUser>,\n});\n\nlet visibleUsersRequest: Promise<User[]> | null = null;\nlet visibleUsersGeneration = 0;\n\n// A fetch that was in flight when the cache was dropped (logout, Corva re-sync) must not write\n// the old list back; bumping the generation makes it a no-op and lets the next caller refetch.\nconst invalidateVisibleUsers = () => {\n visibleUsersGeneration += 1;\n visibleUsersRequest = null;\n};\n\nconst seedSocketUsers = (members: { _id: string; username: string }[]) => {\n sharedRefs.socket?.seedUsers(members);\n sharedRefs.api?.seedUserCache(members);\n};\n\nasync function fetchAllVisibleUsers(): Promise<User[]> {\n const { api } = sharedRefs;\n if (!api) return [];\n\n const generation = visibleUsersGeneration;\n try {\n const { serverId } = authStore.getState();\n const aggregated = serverId ? await api.getServerMembers(serverId) : await api.getFriends();\n if (generation !== visibleUsersGeneration) return [];\n\n const map: Record<string, User> = {};\n aggregated.forEach(u => {\n const { _id } = u || {};\n if (_id && !map[_id]) {\n map[_id] = u;\n }\n });\n\n const { corvaUserService } = sharedRefs;\n const enrichedUsers = Object.values(map).map(u => corvaUserService.enrichUser(u));\n\n api.seedUserCache(enrichedUsers);\n memberStore.setState({ allVisibleUsersCache: enrichedUsers });\n return enrichedUsers;\n } catch {\n return [];\n }\n}\n\nexport const memberStore = createStore<MemberStore>()((set, get) => ({\n ...getInitialState(),\n\n setCorvaUserMapping: (revoltUserId, corvaUser) =>\n set(state => ({\n corvaUserMappings: { ...state.corvaUserMappings, [revoltUserId]: corvaUser },\n })),\n\n bulkSetCorvaUserMappings: mappings =>\n set(state => {\n const newMappings = { ...state.corvaUserMappings };\n mappings.forEach(({ revoltUserId, corvaUser }) => {\n newMappings[revoltUserId] = corvaUser;\n });\n return { corvaUserMappings: newMappings };\n }),\n\n getCorvaUserFromState: revoltUserId => get().corvaUserMappings[revoltUserId],\n\n setMembers: (members, roomId) => {\n const { corvaUserService } = sharedRefs;\n const enrichedMembers = members.map(m => corvaUserService.enrichUser(m));\n\n const { membersById: existingMembersById } = get();\n const { currentRoom } = roomStore.getState();\n const membersById: Record<string, User> = { ...existingMembersById };\n enrichedMembers.forEach(m => {\n membersById[m._id] = m;\n });\n\n const isCurrentRoomMembers = !roomId || currentRoom?._id === roomId;\n\n if (!isCurrentRoomMembers) {\n set({ membersById });\n return;\n }\n\n set({\n members: enrichedMembers,\n membersRoomId: roomId ?? currentRoom?._id ?? null,\n membersById,\n });\n\n if (currentRoom) {\n roomStore.getState().setCurrentRoom({\n ...currentRoom,\n usersCount: enrichedMembers.length,\n });\n }\n },\n\n addMemberToCache: user => {\n const { membersById } = get();\n if (!membersById[user._id]) {\n set({ membersById: { ...membersById, [user._id]: user } });\n }\n },\n\n getMemberById: userId => get().membersById[userId],\n\n removeUserFromMembers: userId =>\n set(state => {\n const members = state.members.filter(m => m._id !== userId);\n const membersById = { ...state.membersById };\n delete membersById[userId];\n return { members, membersById };\n }),\n\n addTypingUser: userId =>\n set(state => {\n if (!state.typingUsers.includes(userId)) {\n return { typingUsers: [...state.typingUsers, userId] };\n }\n return state;\n }),\n\n removeTypingUser: userId =>\n set(state => ({ typingUsers: state.typingUsers.filter(u => u !== userId) })),\n\n setTypingUsers: users => set({ typingUsers: users }),\n\n simulateTyping: (userKey, isTyping, displayName) => {\n const { typingManager } = sharedRefs;\n typingManager.clearTimeout(userKey);\n\n if (isTyping) {\n if (displayName) typingManager.setDisplayName(userKey, displayName);\n const currentTypingUsers = get().typingUsers;\n if (!currentTypingUsers.includes(userKey)) {\n set({ typingUsers: [...currentTypingUsers, userKey] });\n }\n typingManager.setTimeout(\n userKey,\n () => {\n const { typingUsers: current } = get();\n set({ typingUsers: current.filter(u => u !== userKey) });\n },\n 5000\n );\n } else {\n const currentTypingUsers = get().typingUsers;\n set({ typingUsers: currentTypingUsers.filter(u => u !== userKey) });\n }\n },\n\n loadRoomMembers: async (roomId, roomType, isAssetChat = false) => {\n const { api } = sharedRefs;\n if (!api) return;\n\n const { serverId } = authStore.getState();\n\n try {\n const useServerMembers = (isAssetChat || roomType === 'c') && serverId;\n if (useServerMembers) {\n const { serverMembersCache, serverMembersLoaded } = get();\n\n if (serverMembersLoaded && serverMembersCache && serverMembersCache.length > 0) {\n get().setMembers(serverMembersCache, roomId);\n seedSocketUsers(serverMembersCache.map(m => ({ _id: m._id, username: m.username })));\n return;\n }\n\n const members: User[] = await api.getServerMembers(serverId);\n get().setMembers(members, roomId);\n seedSocketUsers(members.map(m => ({ _id: m._id, username: m.username })));\n set({ serverMembersLoaded: true, serverMembersCache: members });\n return;\n }\n\n const channel = await api.getChannel(roomId);\n const channelMembers = channel?.members;\n if (Array.isArray(channelMembers) && channelMembers.length > 0) {\n const members: User[] = channelMembers.map(m => ({\n _id: m._id,\n username: m.username,\n name: m.display_name || m.username,\n status: m.online ? 'online' : 'offline',\n isBot: !!m.bot,\n }));\n get().setMembers(members, roomId);\n seedSocketUsers(members.map(m => ({ _id: m._id, username: m.username })));\n return;\n }\n\n const members: User[] = await api.getGroupMembers(roomId);\n get().setMembers(members, roomId);\n seedSocketUsers(members.map(m => ({ _id: m._id, username: m.username })));\n } catch (e: unknown) {\n console.error('Failed to load room members:', e);\n }\n },\n\n searchUsers: async query => {\n try {\n const allUsers = await get().getAllVisibleUsers();\n const q = query.trim().toLowerCase();\n\n if (!q) return allUsers;\n\n return allUsers.filter(\n u =>\n u.username?.toLowerCase().includes(q) ||\n u.name?.toLowerCase().includes(q) ||\n u.displayName?.toLowerCase().includes(q)\n );\n } catch (e) {\n console.error('Failed to search users:', e);\n return [];\n }\n },\n\n getUserByUsername: async username => {\n const { api } = sharedRefs;\n if (!api) return null;\n\n try {\n const usernameLc = username.toLowerCase();\n\n const allUsers = await get().getAllVisibleUsers();\n const found = allUsers.find(u => u.username?.toLowerCase() === usernameLc);\n if (found) return found;\n\n const users = await api.searchUsers(username);\n const user = users.find(u => u.username?.toLowerCase() === usernameLc);\n\n if (user) return sharedRefs.corvaUserService.enrichUser(user);\n\n return null;\n } catch {\n return null;\n }\n },\n\n getAllVisibleUsers: async () => {\n const cached = get().allVisibleUsersCache;\n if (cached && cached.length > 0) return cached;\n\n if (!visibleUsersRequest) {\n visibleUsersRequest = fetchAllVisibleUsers().finally(() => {\n visibleUsersRequest = null;\n });\n }\n return visibleUsersRequest;\n },\n\n syncCorvaUsers: async companyId => {\n const { api } = sharedRefs;\n if (!api) return false;\n\n try {\n const corvaUsersResponse = await getChatHost().corvaApi.get<{ data?: CorvaAPIUser[] }>(\n '/v2/users',\n {\n company_id: companyId ?? 1,\n per_page: 500,\n fields: [\n 'user.first_name',\n 'user.last_name',\n 'user.email',\n 'user.profile_photo',\n 'user.title',\n 'user.role',\n 'user.company',\n ],\n }\n );\n\n const corvaUsers = corvaUsersResponse?.data || [];\n const allUsers = await get().getAllVisibleUsers();\n const currentMembers = get().members;\n\n const userMap = new Map<string, User>();\n allUsers.forEach(u => userMap.set(u._id, u));\n currentMembers.forEach(u => {\n if (!userMap.has(u._id)) userMap.set(u._id, u);\n });\n const usersToSync = Array.from(userMap.values());\n\n if (usersToSync.length === 0) return false;\n\n const corvaUsersByUsername = new Map<string, CorvaAPIUser>();\n corvaUsers.forEach((corvaUser: CorvaAPIUser) => {\n const email = corvaUser.attributes?.email;\n if (email) {\n const username = email.split('@')[0].toLowerCase();\n corvaUsersByUsername.set(username, corvaUser);\n }\n });\n\n const mappings: Array<{ revoltUserId: string; corvaUser: CorvaAPIUser }> = [];\n usersToSync.forEach(revoltUser => {\n if (!revoltUser.username) return;\n const username = revoltUser.username.toLowerCase();\n const corvaUser = corvaUsersByUsername.get(username);\n if (corvaUser) {\n mappings.push({ revoltUserId: revoltUser._id, corvaUser });\n }\n });\n\n get().bulkSetCorvaUserMappings(mappings);\n mappings.forEach(({ revoltUserId, corvaUser }) => {\n sharedRefs.corvaUserService.setMapping(revoltUserId, corvaUser);\n });\n\n if (mappings.length > 0) {\n const refreshedMembers = get().members;\n const currentRoomId = roomStore.getState().currentRoom?._id;\n get().setMembers(refreshedMembers, currentRoomId);\n set({ allVisibleUsersCache: null });\n invalidateVisibleUsers();\n }\n\n return true;\n } catch (error: unknown) {\n console.error('Failed to sync Corva users:', error);\n return false;\n }\n },\n}));\n\nexport const resetMemberStore = () => {\n invalidateVisibleUsers();\n memberStore.setState(getInitialState());\n};\n","import { createStore } from 'zustand/vanilla';\n\nimport type { ChatAsset, ChatAssetType } from '../../types/asset';\nimport type { Subscription } from '../../types/subscription';\nimport { getAssetChatChannel } from '../../api/modules/assetChats';\nimport { findGeneralRoom } from '../../utils/isGeneralRoom';\nimport { formatAssetChatName } from '../../utils/getRoomDisplayName';\nimport { channelToAsset } from '../../utils/channelToAsset';\nimport { isChatAssetTypeAllowed } from '../../utils/chatAssetPermissionsSnapshot';\nimport { CHANNEL_TYPES } from '../../constants/constants';\nimport { sharedRefs } from '../sharedRefs';\n\nimport { authStore } from './authStore';\nimport { uiStore } from './uiStore';\nimport { roomStore } from './roomStore';\n\n// A locked asset is always a chat asset (rig / frac fleet / intervention unit).\ntype LockedAsset = ChatAsset & { type: ChatAssetType };\n\nconst registerAssetChatChannel = (\n channelId: string,\n assetId: string,\n assetType: ChatAssetType\n): void => {\n const id = Number(assetId);\n if (!Number.isFinite(id)) return;\n authStore.getState().addAssetChatChannel({\n revolt_channel_id: channelId,\n rig_id: assetType === 'rig' ? id : null,\n frac_fleet_id: assetType === 'frac_fleet' ? id : null,\n intervention_unit_id: assetType === 'intervention_unit' ? id : null,\n });\n};\n\nconst openRoomLockedAsset = (): LockedAsset | null => {\n const room = roomStore.getState().currentRoom;\n if (!room?._id) return null;\n const channel = authStore\n .getState()\n .assetChatChannels.find(c => c.revolt_channel_id === room._id);\n const asset = channel ? channelToAsset(channel) : null;\n if (!asset) return null;\n return {\n id: String(asset.assetId),\n type: asset.assetType,\n name: formatAssetChatName(room.name || ''),\n };\n};\n\nexport interface AssetStore {\n currentAssetId: string | null;\n currentAssetType: ChatAssetType | null;\n currentAssetName: string | null;\n currentAssetStatus: string | null;\n assetChatId: string | null;\n assetChatError: string | null;\n knownAssetChatIds: Set<string>;\n // Last dashboard asset the open chat panel synced to; null until the panel\n // has handled one. Lets the panel tell a background-only sync from its own.\n panelSyncedAssetId: string | null;\n isAssetLocked: boolean;\n lockedAsset: LockedAsset | null;\n isAssetSwitching: boolean;\n\n setAssetContext: (\n assetId: string,\n assetType: ChatAssetType,\n assetName?: string,\n assetStatus?: string,\n skipAutoSelect?: boolean\n ) => Promise<void>;\n clearAssetContext: () => void;\n ensureAssetChatSubscription: () => Promise<Subscription | null>;\n toggleAssetLock: () => void;\n relockToAsset: (assetId: string, assetType: ChatAssetType, assetName: string) => Promise<void>;\n}\n\nconst getInitialState = () => ({\n currentAssetId: null,\n currentAssetType: null,\n currentAssetName: null,\n currentAssetStatus: null,\n assetChatId: null,\n assetChatError: null,\n knownAssetChatIds: new Set<string>(),\n panelSyncedAssetId: null,\n isAssetLocked: false,\n lockedAsset: null,\n isAssetSwitching: false,\n});\n\nconst inFlightByAsset = new Map<string, Promise<Subscription | null>>();\n\nexport const assetStore = createStore<AssetStore>()((set, get) => ({\n ...getInitialState(),\n\n setAssetContext: async (assetId, assetType, assetName, assetStatus, skipAutoSelect) => {\n const currentState = get();\n const isSameAsset = currentState.currentAssetId === assetId;\n if (isSameAsset && (currentState.assetChatId || currentState.assetChatError)) return;\n\n const isAssetChanging = !isSameAsset;\n\n uiStore.setState({ isLoading: true });\n set({\n currentAssetId: assetId,\n currentAssetType: assetType,\n currentAssetName: assetName || assetId,\n currentAssetStatus: assetStatus ?? null,\n assetChatError: null,\n ...(isSameAsset ? {} : { assetChatId: null }),\n ...(isAssetChanging && { isAssetSwitching: true }),\n });\n\n // Both the panel and the background init call this; a slower response for a\n // previous asset must not overwrite the current one.\n const isStale = () => get().currentAssetId !== assetId;\n\n try {\n const chatId = await getAssetChatChannel(assetId, assetType);\n if (isStale()) return;\n registerAssetChatChannel(chatId, assetId, assetType);\n\n set({\n assetChatId: chatId,\n knownAssetChatIds: new Set(Array.from(currentState.knownAssetChatIds).concat(chatId)),\n });\n uiStore.setState({ isLoading: false });\n\n if (!skipAutoSelect) {\n await roomStore.getState().selectRoom(chatId);\n }\n } catch (error) {\n if (isStale()) return;\n console.error('Failed to get asset chat channel:', error);\n const errorMessage = `Failed to load chat for ${assetName || assetId}: ${(error as Error)?.message || 'Unknown error'}`;\n set({ assetChatId: null, assetChatError: errorMessage });\n uiStore.setState({ isLoading: false, error: errorMessage });\n } finally {\n if (isAssetChanging && !isStale()) {\n set({ isAssetSwitching: false });\n }\n }\n },\n\n clearAssetContext: () => {\n const previousAssetChatId = get().assetChatId;\n const currentUser = authStore.getState().user;\n\n set({\n currentAssetId: null,\n currentAssetType: null,\n currentAssetName: null,\n currentAssetStatus: null,\n assetChatId: null,\n panelSyncedAssetId: null,\n lockedAsset: null,\n assetChatError: null,\n });\n\n if (\n currentUser &&\n previousAssetChatId &&\n roomStore.getState().currentRoom?._id === previousAssetChatId\n ) {\n const generalChat = findGeneralRoom(roomStore.getState().subscriptions);\n if (generalChat) {\n roomStore.getState().selectRoom(generalChat.rid ?? generalChat._id);\n }\n }\n },\n\n ensureAssetChatSubscription: async () => {\n const { currentAssetId, currentAssetType } = get();\n if (!currentAssetId || !currentAssetType) return null;\n if (!isChatAssetTypeAllowed(currentAssetType)) return null;\n\n const cached = inFlightByAsset.get(currentAssetId);\n if (cached) return cached;\n\n const promise = (async (): Promise<Subscription | null> => {\n try {\n let chatId = get().assetChatId;\n if (!chatId) {\n try {\n chatId = await getAssetChatChannel(currentAssetId, currentAssetType);\n registerAssetChatChannel(chatId, currentAssetId, currentAssetType);\n set({\n assetChatId: chatId,\n knownAssetChatIds: new Set(Array.from(get().knownAssetChatIds).concat(chatId)),\n });\n } catch (e) {\n console.error('Failed to fetch asset chat channel:', e);\n return null;\n }\n }\n\n const existing = roomStore.getState().subscriptions.find(s => s.rid === chatId);\n if (existing) return existing;\n\n const { api } = sharedRefs;\n if (!api) return null;\n let channel;\n try {\n channel = await api.getChannel(chatId);\n } catch (e) {\n console.error('Failed to fetch asset chat subscription channel:', e);\n return null;\n }\n const inferredType: 'c' | 'p' = channel?.channel_type === CHANNEL_TYPES.GROUP ? 'p' : 'c';\n const sub = {\n _id: chatId,\n rid: chatId,\n name: channel?.name || 'Asset Chat',\n t: inferredType,\n u: { _id: '', username: '' },\n ts: new Date().toISOString(),\n open: true,\n alert: false,\n userMentions: 0,\n groupMentions: 0,\n } as unknown as Subscription;\n\n const subs = roomStore.getState().subscriptions;\n const dupe = subs.find(s => s.rid === chatId);\n if (dupe) return dupe;\n roomStore.getState().setSubscriptions([...subs, sub]);\n return sub;\n } finally {\n inFlightByAsset.delete(currentAssetId);\n }\n })();\n\n inFlightByAsset.set(currentAssetId, promise);\n return promise;\n },\n\n toggleAssetLock: () => {\n if (get().isAssetLocked) {\n set({ isAssetLocked: false, lockedAsset: null });\n return;\n }\n\n const roomAsset = openRoomLockedAsset();\n if (roomAsset) {\n set({\n isAssetLocked: true,\n lockedAsset: roomAsset,\n currentAssetId: roomAsset.id,\n currentAssetType: roomAsset.type,\n currentAssetName: roomAsset.name,\n currentAssetStatus: null,\n assetChatId: roomStore.getState().currentRoom?._id ?? get().assetChatId,\n });\n return;\n }\n\n const { currentAssetId, currentAssetType, currentAssetName, currentAssetStatus } = get();\n if (currentAssetId && currentAssetType) {\n const lockedAsset: LockedAsset = {\n id: currentAssetId,\n name: currentAssetName || currentAssetId,\n type: currentAssetType,\n };\n if (currentAssetStatus) {\n lockedAsset.status = currentAssetStatus;\n }\n set({ isAssetLocked: true, lockedAsset });\n }\n },\n\n relockToAsset: async (assetId, assetType, assetName) => {\n await get().setAssetContext(assetId, assetType, assetName);\n\n // Only re-lock once the chat actually switched: if the channel resolution\n // failed, keep the previous locked asset so the chip matches the open room.\n const { assetChatId, currentAssetId } = get();\n if (assetChatId && currentAssetId === assetId) {\n set({ lockedAsset: { id: assetId, name: assetName, type: assetType } });\n }\n },\n}));\n\nexport const resetAssetStore = () => assetStore.setState(getInitialState());\n","import { createStore } from 'zustand/vanilla';\n\nexport interface NavigationEntry {\n roomId: string;\n threadId?: string;\n}\n\nexport interface NavigationHistoryStore {\n entries: NavigationEntry[];\n index: number;\n // Entry the user asked to travel to via back/forward; the UI applies it and\n // `record` clears it once the visible state matches.\n requestedEntry: NavigationEntry | null;\n\n record: (entry: NavigationEntry) => void;\n goBack: () => void;\n goForward: () => void;\n clearRequestedEntry: () => void;\n // Drop every view of a room the user left or hid, so Back can't resurrect it.\n forgetRoom: (roomId: string) => void;\n}\n\nexport const MAX_NAVIGATION_HISTORY = 50;\n\nconst isSameEntry = (a: NavigationEntry | null | undefined, b: NavigationEntry) =>\n !!a && a.roomId === b.roomId && (a.threadId ?? undefined) === (b.threadId ?? undefined);\n\nconst getInitialState = () => ({\n entries: [] as NavigationEntry[],\n index: -1,\n requestedEntry: null as NavigationEntry | null,\n});\n\nexport const navigationHistoryStore = createStore<NavigationHistoryStore>()((set, get) => ({\n ...getInitialState(),\n\n record: entry => {\n const { entries, index, requestedEntry } = get();\n\n if (requestedEntry) {\n if (isSameEntry(requestedEntry, entry)) {\n set({ requestedEntry: null });\n return;\n }\n // Room switch and thread open/close settle in separate renders; states in\n // the target room that don't match yet are transitional, not new history.\n if (requestedEntry.roomId === entry.roomId) return;\n set({ requestedEntry: null });\n }\n\n if (isSameEntry(entries[index], entry)) return;\n\n const next = [...entries.slice(0, index + 1), entry].slice(-MAX_NAVIGATION_HISTORY);\n set({ entries: next, index: next.length - 1 });\n },\n\n goBack: () => {\n const { entries, index } = get();\n if (index <= 0) return;\n set({ index: index - 1, requestedEntry: entries[index - 1] });\n },\n\n goForward: () => {\n const { entries, index } = get();\n if (index >= entries.length - 1) return;\n set({ index: index + 1, requestedEntry: entries[index + 1] });\n },\n\n clearRequestedEntry: () => set({ requestedEntry: null }),\n\n forgetRoom: roomId => {\n const { entries, index, requestedEntry } = get();\n const next: NavigationEntry[] = [];\n let nextIndex = -1;\n entries.forEach((entry, i) => {\n if (entry.roomId === roomId) return;\n if (isSameEntry(next[next.length - 1], entry)) {\n if (i <= index) nextIndex = next.length - 1;\n return;\n }\n next.push(entry);\n if (i <= index) nextIndex = next.length - 1;\n });\n set({\n entries: next,\n index: nextIndex,\n requestedEntry: requestedEntry?.roomId === roomId ? null : requestedEntry,\n });\n },\n}));\n\nexport const selectCanGoBack = (s: NavigationHistoryStore) => s.index > 0;\nexport const selectCanGoForward = (s: NavigationHistoryStore) => s.index < s.entries.length - 1;\n\nexport const resetNavigationHistoryStore = () => navigationHistoryStore.setState(getInitialState());\n","import { createStore } from 'zustand/vanilla';\n\nimport type { Room } from '../../types/room';\nimport type { Subscription } from '../../types/subscription';\nimport type { User } from '../../types/user';\nimport type { RevoltAPIInstance } from '../../api/RevoltAPI';\nimport type { RevoltChannel } from '../../types/revolt';\nimport { DIRECT_MESSAGE_PLACEHOLDER } from '../../utils/getRoomDisplayName';\nimport { isUnread } from '../../utils/isUnread';\nimport { isVisibleUnread } from '../../utils/isVisibleUnread';\nimport { saveLastOpenedRoom, clearLastOpenedRoom } from '../services/lastRoomTracker';\nimport {\n createDMSubscription,\n addOrUpdateSubscription,\n removeSubscription,\n createGroupSubscription,\n} from '../utils/subscriptionOperations';\nimport {\n CHANNEL_TYPES,\n DEFAULT_ROOM_LIST_ORDER,\n type RoomListOrder,\n} from '../../constants/constants';\nimport { isCurrentRoomSelection, prepareRoomSelection } from '../services/roomSelectionCoordinator';\nimport { loadUntilFound } from '../services/messageLocator';\nimport { sharedRefs } from '../sharedRefs';\nimport { getChatHost } from '../../platform/host';\nimport { isDisallowedAssetChatRoom } from '../../utils/chatAssetPermissionsSnapshot';\n\nimport { messageStore } from './messageStore';\nimport { authStore } from './authStore';\nimport { memberStore } from './memberStore';\nimport { uiStore } from './uiStore';\nimport { assetStore } from './assetStore';\nimport { navigationHistoryStore } from './navigationHistoryStore';\n\nconst dmRecipientCache: Record<string, User | null> = {};\n\nexport interface HiddenRoomsSettings {\n hiddenRooms: string[];\n}\n\nexport const DEFAULT_HIDDEN_ROOMS_SETTINGS: HiddenRoomsSettings = { hiddenRooms: [] };\n\nexport interface RoomStore {\n rooms: Room[];\n subscriptions: Subscription[];\n /** True once the initial loadSubscriptions attempt has finished (even on failure). */\n subscriptionsLoaded: boolean;\n /** True once Ready (or /sync/unreads) has replaced the \"seeded as read\" pointers with server truth. */\n unreadsHydrated: boolean;\n currentRoom: Room | null;\n hiddenRoomsSettings: HiddenRoomsSettings;\n persistHiddenRoomsCallback?: (hiddenRooms: string[]) => void;\n roomListOrder: RoomListOrder;\n\n setRooms: (rooms: Room[]) => void;\n setSubscriptions: (subscriptions: Subscription[]) => void;\n setCurrentRoom: (room: Room | null) => void;\n addOrUpdateSubscription: (subscription: Subscription) => void;\n removeSubscriptionById: (roomId: string) => void;\n setRoomListOrder: (order: RoomListOrder) => void;\n markAllAsRead: () => void;\n\n setHiddenRoomsSettings: (settings: HiddenRoomsSettings) => void;\n setPersistHiddenRoomsCallback: (callback: ((hiddenRooms: string[]) => void) | undefined) => void;\n hideRoom: (roomId: string) => void;\n unhideRoom: (roomId: string) => void;\n isRoomHidden: (roomId: string) => boolean;\n\n loadSubscriptions: () => Promise<void>;\n selectRoom: (roomId: string) => Promise<void>;\n navigateToMessage: (\n roomId: string,\n messageId: string,\n options?: { threadId?: string }\n ) => Promise<boolean>;\n enrichDmSubscription: (roomId: string, userId: string) => Promise<void>;\n createDirectMessage: (username: string) => Promise<Room | undefined>;\n createDirectMessageById: (userId: string) => Promise<Room | undefined>;\n createGroupChannel: (name: string, userIds: string[]) => Promise<Room | undefined>;\n addUserToGroup: (groupId: string, userId: string) => Promise<boolean>;\n removeUserFromGroup: (groupId: string, userId: string) => Promise<boolean>;\n getGroupMembers: (groupId: string) => Promise<User[]>;\n leaveCurrentChannel: (leaveSilently?: boolean | null) => Promise<boolean>;\n updateChannel: (\n channelId: string,\n updates: { name?: string; description?: string }\n ) => Promise<RevoltChannel | null>;\n}\n\nconst getInitialState = () => ({\n rooms: [] as Room[],\n subscriptions: [] as Subscription[],\n subscriptionsLoaded: false,\n unreadsHydrated: false,\n currentRoom: null,\n hiddenRoomsSettings: DEFAULT_HIDDEN_ROOMS_SETTINGS,\n persistHiddenRoomsCallback: undefined,\n roomListOrder: DEFAULT_ROOM_LIST_ORDER,\n});\n\nlet isLoadingSubscriptions = false;\n\nconst waitForUIIdle = (): Promise<void> =>\n new Promise<void>(resolve => {\n if (!uiStore.getState().isLoading) {\n resolve();\n return;\n }\n const unsubscribe = uiStore.subscribe(state => {\n if (!state.isLoading) {\n unsubscribe();\n resolve();\n }\n });\n });\n\n// Stoat counts the CORS preflight against the same 20-per-10s \"users\" bucket as the GET, so the\n// sidebar resolving every unknown DM partner at once got 429s that surfaced as \"Failed to fetch\".\n// Interactive lookups stay direct; only this background enrichment is drip-fed.\nconst DM_PARTNER_FETCH_GAP_MS = 1000;\nconst MARK_ALL_READ_ACK_GAP_MS = 250;\nlet dmPartnerFetchChain: Promise<void> = Promise.resolve();\n\nfunction fetchDmPartnerThrottled(api: RevoltAPIInstance, userId: string): Promise<User | null> {\n const run = dmPartnerFetchChain.then(() => api.getUser(userId));\n const gap = () => new Promise<void>(r => setTimeout(r, DM_PARTNER_FETCH_GAP_MS));\n dmPartnerFetchChain = run.then(gap, gap);\n return run;\n}\n\nexport const roomStore = createStore<RoomStore>()((set, get) => ({\n ...getInitialState(),\n\n setRooms: rooms => set({ rooms }),\n setSubscriptions: subscriptions => set({ subscriptions }),\n setCurrentRoom: room => set({ currentRoom: room }),\n\n addOrUpdateSubscription: subscription =>\n set(state => ({\n subscriptions: addOrUpdateSubscription(state.subscriptions, subscription),\n })),\n\n removeSubscriptionById: roomId =>\n set(state => ({ subscriptions: removeSubscription(state.subscriptions, roomId) })),\n setRoomListOrder: order => set({ roomListOrder: order }),\n // Acks are dripped: the scheduler only debounces per channel (DRA-6042 429s).\n markAllAsRead: () => {\n const ack = sharedRefs.ackChannel;\n if (!ack) return;\n const { assetChatChannels } = authStore.getState();\n const toAck = get().subscriptions.filter(sub =>\n isVisibleUnread(sub, rid => isDisallowedAssetChatRoom(rid, assetChatChannels))\n );\n if (toAck.length === 0) return;\n const ackIds = new Set(toAck.map(sub => sub.rid));\n set(state => ({\n subscriptions: state.subscriptions.map(sub =>\n ackIds.has(sub.rid) ? { ...sub, last_acked_message_id: sub.last_message_id } : sub\n ),\n }));\n toAck.forEach((sub, index) => {\n const send = () => ack(sub.rid, sub.last_message_id!);\n if (index === 0) send();\n else setTimeout(send, index * MARK_ALL_READ_ACK_GAP_MS);\n });\n },\n\n setHiddenRoomsSettings: settings => set({ hiddenRoomsSettings: settings }),\n\n setPersistHiddenRoomsCallback: callback => set({ persistHiddenRoomsCallback: callback }),\n\n hideRoom: roomId => {\n const current = get().hiddenRoomsSettings?.hiddenRooms || [];\n if (current.includes(roomId)) return;\n const newHiddenRooms = [...current, roomId];\n set(state => ({\n hiddenRoomsSettings: { hiddenRooms: newHiddenRooms },\n subscriptions: state.subscriptions.map(s =>\n s.rid === roomId && s.t === 'd' ? { ...s, open: false } : s\n ),\n }));\n get().persistHiddenRoomsCallback?.(newHiddenRooms);\n navigationHistoryStore.getState().forgetRoom(roomId);\n },\n\n unhideRoom: roomId => {\n const current = get().hiddenRoomsSettings?.hiddenRooms || [];\n const newHiddenRooms = current.filter(id => id !== roomId);\n set(state => ({\n hiddenRoomsSettings: { hiddenRooms: newHiddenRooms },\n subscriptions: state.subscriptions.map(s =>\n s.rid === roomId && s.t === 'd' ? { ...s, open: true } : s\n ),\n }));\n get().persistHiddenRoomsCallback?.(newHiddenRooms);\n },\n\n isRoomHidden: roomId => get().hiddenRoomsSettings?.hiddenRooms?.includes(roomId) || false,\n\n loadSubscriptions: async () => {\n const { api } = sharedRefs;\n if (!api) return;\n if (isLoadingSubscriptions) return;\n\n isLoadingSubscriptions = true;\n uiStore.setState({ isLoading: true });\n\n try {\n const serverId = authStore.getState().serverId ?? undefined;\n const userId = authStore.getState().user?._id ?? undefined;\n const rooms = await api.getRooms(serverId);\n const { isRoomHidden } = get();\n\n const subs: Subscription[] = rooms.map(room => {\n let dmUserId: string | undefined;\n if (room.t === 'd' && Array.isArray(room.recipients) && room.recipients.length > 0) {\n dmUserId = room.recipients.find(id => id !== userId) || room.recipients[0];\n }\n const cachedRecipient = dmUserId ? dmRecipientCache[room._id] : null;\n const isHidden = room.t === 'd' && isRoomHidden(room._id);\n\n return {\n _id: room._id,\n rid: room._id,\n name: room.name || room._id,\n t: room.t,\n u: room.u || { _id: '', username: '' },\n ts: new Date().toISOString(),\n open: !isHidden,\n alert: false,\n userMentions: 0,\n groupMentions: 0,\n last_message_id: room.last_message_id,\n // Initialize as fully read; Ready event corrects with server truth.\n last_acked_message_id: room.last_message_id,\n dmUsername: cachedRecipient?.username,\n dmAvatarUrl: cachedRecipient?.avatarUrl,\n dmUserId: cachedRecipient?._id || dmUserId,\n recipients: room.recipients,\n };\n });\n\n const existingSubs = get().subscriptions;\n const newSubRids = new Set(subs.map(s => s.rid));\n const synthesizedSubs = existingSubs.filter(s => !newSubRids.has(s.rid));\n\n set({ subscriptions: [...subs, ...synthesizedSubs], rooms });\n uiStore.setState({ isLoading: false });\n } catch (e: unknown) {\n console.error('❌ Failed to load subscriptions:', e);\n uiStore.setState({\n error: (e as Error)?.message || 'Failed to load subscriptions',\n isLoading: false,\n });\n } finally {\n isLoadingSubscriptions = false;\n set({ subscriptionsLoaded: true });\n }\n },\n\n selectRoom: async roomId => {\n const { api, socket, messageCache } = sharedRefs;\n if (!api || !socket) return;\n\n const request = await prepareRoomSelection({\n roomId,\n currentRoomId: get().currentRoom?._id,\n isCacheDirty: rid => messageCache.isDirty(rid),\n getCachedMessages: rid => messageCache.get(rid),\n setState: s => uiStore.setState(s),\n });\n\n if (!request) return;\n\n try {\n const { assetChatId } = assetStore.getState();\n const isAssetChat = !!assetChatId && roomId === assetChatId;\n\n let sub = get().subscriptions.find(s => s.rid === roomId);\n\n // Unhide if hidden DM\n if (sub?.t === 'd' && get().isRoomHidden(roomId)) {\n get().unhideRoom(roomId);\n }\n\n // Lazy-enrich existing DM subscriptions missing recipient info\n if (sub && sub.t === 'd' && !sub.dmUserId) {\n try {\n let recipient = dmRecipientCache[roomId];\n if (recipient === undefined) {\n const meId = authStore.getState().user?._id ?? undefined;\n recipient = await api.getDMRecipient(roomId, meId);\n dmRecipientCache[roomId] = recipient;\n }\n if (recipient) {\n const enrichedSub = {\n ...sub,\n dmUserId: recipient._id,\n dmUsername: recipient.username,\n dmAvatarUrl: recipient.avatarUrl,\n };\n const updatedSubs = get().subscriptions.map(s => (s.rid === roomId ? enrichedSub : s));\n set({ subscriptions: updatedSubs });\n sub = enrichedSub;\n }\n } catch {\n // ignore enrichment failures\n }\n }\n\n // Synthesize subscription if not found\n if (!sub) {\n try {\n const chan = await api.getChannel(roomId);\n let inferredType: Room['t'] = 'c';\n if (chan?.channel_type === CHANNEL_TYPES.DIRECT_MESSAGE) inferredType = 'd';\n else if (chan?.channel_type === CHANNEL_TYPES.GROUP) inferredType = 'p';\n\n if (inferredType === 'd') {\n let recipient: User | undefined = dmRecipientCache[roomId] ?? undefined;\n if (!recipient) {\n try {\n const meId = authStore.getState().user?._id ?? undefined;\n const result = await api.getDMRecipient(roomId, meId);\n recipient = result ?? undefined;\n dmRecipientCache[roomId] = recipient ?? null;\n } catch {\n // ignore\n }\n }\n sub = createDMSubscription(roomId, recipient);\n } else {\n sub = {\n _id: roomId,\n rid: roomId,\n name: chan?.name || 'Channel',\n t: inferredType,\n u: { _id: '', username: '' },\n ts: new Date().toISOString(),\n open: true,\n alert: false,\n userMentions: 0,\n groupMentions: 0,\n } as unknown as Subscription;\n }\n\n const currentSubs = get().subscriptions;\n if (!currentSubs.some(s => s.rid === sub!.rid)) {\n set({ subscriptions: [...currentSubs, sub!] });\n }\n } catch (e) {\n throw new Error((e as Error)?.message || 'Room not found');\n }\n }\n\n const roomFromList = get().rooms.find(r => r._id === roomId);\n const room: Room = {\n _id: sub.rid,\n name: sub.name,\n t: sub.t || 'c',\n msgs: 0,\n usersCount: roomFromList?.usersCount ?? 0,\n ...(roomFromList?.u ? { u: roomFromList.u } : {}),\n ...(roomFromList?.topic ? { topic: roomFromList.topic } : {}),\n ...(roomFromList?.description ? { description: roomFromList.description } : {}),\n ...(roomFromList?.ts ? { ts: roomFromList.ts } : {}),\n ...(roomFromList?.last_message_id ? { last_message_id: roomFromList.last_message_id } : {}),\n };\n\n sharedRefs.typingManager.clearAllTimeouts();\n\n const isDirty = messageCache.isDirty(roomId);\n const cachedMessages = !isDirty ? messageCache.get(roomId) || [] : [];\n const needsLoad = cachedMessages.length === 0 || isDirty;\n\n set({ currentRoom: room });\n // Ack only what is actually unread: re-acking an id the server already holds\n // is pure noise (Stoat re-runs its notify path for a repeated id). Before Ready\n // the pointers are only the \"seeded as read\" placeholders, so ack unconditionally\n // there. A room opened in a hidden tab is acked by the watcher once shown.\n const knownRead = get().unreadsHydrated && !isUnread(sub);\n if (sub.last_message_id && !knownRead && !getChatHost().appState.isHidden()) {\n sharedRefs.ackChannel?.(roomId, sub.last_message_id);\n }\n messageStore.getState().setHasMoreMessages(cachedMessages.length >= 100);\n\n const currentUserIdForRoom = authStore.getState().user?._id;\n if (currentUserIdForRoom) {\n saveLastOpenedRoom(roomId, currentUserIdForRoom);\n }\n\n if (socket?.isConnected()) {\n socket.subscribeToRoom(roomId);\n }\n\n if (sub.t === 'd') {\n const me = authStore.getState().user;\n // dmUserId/dmUsername aren't rehydrated on refresh, but recipients are — derive\n // the partner from there so they don't vanish from the member list.\n const otherId =\n sub.dmUserId || sub.recipients?.find(id => id !== me?._id) || sub.recipients?.[0];\n\n const buildMembers = (other?: User | null): User[] => {\n const list: User[] = me ? [me] : [];\n if (other) list.push(other);\n return list;\n };\n const seed = (list: User[]) =>\n socket?.seedUsers(\n list.filter(m => m.username).map(m => ({ _id: m._id, username: m.username }))\n );\n\n const cachedOther = otherId ? memberStore.getState().getMemberById(otherId) : null;\n const knownOther =\n cachedOther ??\n (otherId && sub.dmUsername\n ? { _id: otherId, username: sub.dmUsername, name: sub.dmUsername }\n : otherId\n ? { _id: otherId, username: '', name: '' }\n : null);\n const initialMembers = buildMembers(knownOther);\n memberStore.getState().setMembers(initialMembers, roomId);\n seed(initialMembers);\n\n // Resolve the partner's name in the background when it isn't known yet.\n if (otherId && !cachedOther?.username && !sub.dmUsername) {\n sharedRefs.api\n ?.getUser(otherId)\n .then(user => {\n if (!user?.username || get().currentRoom?._id !== roomId) return;\n const resolved: User = {\n _id: user._id,\n username: user.username,\n name: user.username,\n };\n const members = buildMembers(resolved);\n memberStore.getState().setMembers(members, roomId);\n seed(members);\n })\n .catch(() => {});\n }\n }\n\n if (sub.t !== 'd' && sub.t !== 'l') {\n memberStore\n .getState()\n .loadRoomMembers(roomId, sub.t, isAssetChat)\n .catch(e => console.error('Failed to load room members in background:', e));\n }\n\n if (needsLoad) {\n await messageStore.getState().loadMessages(roomId, sub.t);\n } else if (get().currentRoom?._id === roomId) {\n messageStore.getState().setMessages(cachedMessages);\n }\n\n if (!isCurrentRoomSelection(request) || get().currentRoom?._id !== roomId) return;\n\n if (!messageCache.isDirty(roomId)) {\n const cachedNow = messageCache.get(roomId);\n if (cachedNow && cachedNow.length > 0 && cachedNow !== messageStore.getState().messages) {\n messageStore.getState().setMessages(cachedNow);\n }\n }\n uiStore.setState({ isLoading: false, isSwitchingRoom: false });\n } catch (e: unknown) {\n if (!isCurrentRoomSelection(request)) return;\n uiStore.setState({\n error: (e as Error)?.message || 'Failed to select room',\n isLoading: false,\n isSwitchingRoom: false,\n });\n }\n },\n\n navigateToMessage: async (roomId, messageId, options) => {\n uiStore.setState({ isNavigatingToMessage: true });\n\n if (get().currentRoom?._id !== roomId) {\n await get().selectRoom(roomId);\n }\n await waitForUIIdle();\n if (get().currentRoom?._id !== roomId || !sharedRefs.api) {\n uiStore.setState({ isNavigatingToMessage: false });\n return false;\n }\n\n const targetId = options?.threadId || messageId;\n const found = await loadUntilFound(targetId, {\n getMessages: () => messageStore.getState().messages,\n applyMessages: messages => {\n if (get().currentRoom?._id !== roomId) return;\n messageStore.getState().setMessages(messages);\n sharedRefs.messageCache.set(roomId, messages);\n },\n fetchPage: async ({ before, around }) => {\n try {\n const limit = around ? 60 : 100;\n const page = await sharedRefs.api!.getChannelMessages(roomId, limit, before, around);\n if (around && page.length < limit) messageStore.getState().setHasMoreMessages(false);\n if (before) messageStore.getState().setHasMoreMessages(page.length >= limit);\n return page;\n } catch {\n return [];\n }\n },\n isCancelled: () => get().currentRoom?._id !== roomId,\n });\n\n if (!found) {\n uiStore.setState({ isNavigatingToMessage: false });\n return false;\n }\n\n uiStore.setState({\n pendingHighlightMessageId: messageId,\n isNavigatingToMessage: false,\n ...(options?.threadId\n ? { pendingThreadId: options.threadId, pendingThreadRoomId: roomId }\n : {}),\n });\n return true;\n },\n\n enrichDmSubscription: async (roomId, userId) => {\n const { api } = sharedRefs;\n if (!api) return;\n\n try {\n const existingMember = memberStore.getState().members.find(m => m._id === userId);\n let user: { _id: string; username: string; avatarUrl?: string } | undefined = existingMember;\n\n if (!user) {\n const visibleUsers = await memberStore.getState().getAllVisibleUsers();\n user = visibleUsers.find(u => u._id === userId);\n }\n\n if (!user) {\n const fetchedUser = await fetchDmPartnerThrottled(api, userId);\n user = fetchedUser ?? undefined;\n }\n\n if (!user?.username) return;\n\n const currentSubs = get().subscriptions;\n const subToUpdate = currentSubs.find(s => s.rid === roomId);\n\n if (subToUpdate?.dmUsername && subToUpdate.dmUsername !== DIRECT_MESSAGE_PLACEHOLDER) return;\n\n const updatedSubs = currentSubs.map(sub => {\n if (sub.rid === roomId && sub.t === 'd') {\n return {\n ...sub,\n dmUserId: user!._id,\n dmUsername: user!.username,\n dmAvatarUrl: user!.avatarUrl,\n };\n }\n return sub;\n });\n\n set({ subscriptions: updatedSubs });\n } catch (error) {\n console.error('[DM enrich error]', error);\n }\n },\n\n createDirectMessage: async username => {\n const { api } = sharedRefs;\n if (!api) return undefined;\n\n try {\n const users = await api.searchUsers(username);\n const target = users.find(u => u.username?.toLowerCase() === username.toLowerCase());\n if (!target) return undefined;\n\n const dm = await api.getOrCreateDMFromUser(target._id);\n if (dm?._id && target) {\n const subscription = createDMSubscription(dm._id, target);\n set(state => ({\n subscriptions: addOrUpdateSubscription(state.subscriptions, subscription),\n }));\n sharedRefs.messageCache.markDirty(dm._id);\n await new Promise(r => setTimeout(r, 50));\n return { _id: dm._id, name: target.username, t: 'd' };\n }\n return undefined;\n } catch (e) {\n uiStore.setState({ error: (e as Error)?.message || 'Failed to create DM' });\n return undefined;\n }\n },\n\n createDirectMessageById: async userId => {\n const { api } = sharedRefs;\n if (!api) return undefined;\n\n try {\n const existingSub = get().subscriptions.find(s => s.t === 'd' && s.dmUserId === userId);\n if (existingSub) {\n return { _id: existingSub._id, name: existingSub.name, t: 'd' };\n }\n\n const [targetUser, dm] = await Promise.all([\n api.getUser(userId),\n api.getOrCreateDMFromUser(userId),\n ]);\n\n if (targetUser && dm?._id) {\n const subscription = createDMSubscription(dm._id, targetUser);\n set(state => ({\n subscriptions: addOrUpdateSubscription(state.subscriptions, subscription),\n }));\n sharedRefs.messageCache.markDirty(dm._id);\n await new Promise(r => setTimeout(r, 50));\n return { _id: dm._id, name: targetUser.username, t: 'd' };\n }\n\n throw new Error('Failed to create DM');\n } catch (e) {\n uiStore.setState({ error: (e as Error)?.message || 'Failed to create DM' });\n return undefined;\n }\n },\n\n createGroupChannel: async (name, userIds) => {\n const { api, socket } = sharedRefs;\n if (!api || !socket) return undefined;\n\n try {\n const created = await api.createGroup(name, userIds);\n const groupId = created?._id;\n if (!groupId) return undefined;\n\n try {\n const members = await api.getGroupMembers(groupId);\n socket?.seedUsers(members.map(m => ({ _id: m._id, username: m.username })));\n } catch {\n // ignore\n }\n\n const currentUser = authStore.getState().user;\n const subscription = createGroupSubscription(\n groupId,\n name,\n { _id: currentUser?._id ?? '', username: currentUser?.username ?? '' },\n userIds\n );\n set(state => ({\n subscriptions: addOrUpdateSubscription(state.subscriptions, subscription),\n }));\n\n return { _id: groupId, name, t: 'p' };\n } catch (e) {\n uiStore.setState({ error: (e as Error)?.message || 'Failed to create group' });\n return undefined;\n }\n },\n\n addUserToGroup: async (groupId, userId) => {\n const { api } = sharedRefs;\n if (!api) throw new Error('Store not initialized');\n\n try {\n const result = await api.addUserToGroup(groupId, userId);\n const members = await api.getGroupMembers(groupId);\n memberStore.getState().setMembers(members, groupId);\n return result;\n } catch (e) {\n uiStore.setState({\n error: (e as Error)?.message || 'Failed to add user to group',\n });\n throw e;\n }\n },\n\n removeUserFromGroup: async (groupId, userId) => {\n const { api } = sharedRefs;\n if (!api) throw new Error('Store not initialized');\n\n try {\n const result = await api.removeUserFromGroup(groupId, userId);\n const members = await api.getGroupMembers(groupId);\n memberStore.getState().setMembers(members, groupId);\n return result;\n } catch (e) {\n uiStore.setState({\n error: (e as Error)?.message || 'Failed to remove user from group',\n });\n throw e;\n }\n },\n\n getGroupMembers: async groupId => {\n const { api } = sharedRefs;\n if (!api) return [];\n\n try {\n const members = await api.getGroupMembers(groupId);\n memberStore.getState().setMembers(members, groupId);\n return members;\n } catch (e) {\n uiStore.setState({\n error: (e as Error)?.message || 'Failed to get group members',\n });\n return [];\n }\n },\n\n updateChannel: async (channelId, updates) => {\n const { api } = sharedRefs;\n if (!api) return null;\n\n try {\n const updatedChannel = await api.updateChannel(channelId, updates);\n\n const currentSubs = get().subscriptions;\n const subIndex = currentSubs.findIndex(s => s.rid === channelId);\n if (subIndex >= 0) {\n const updatedSubs = [...currentSubs];\n updatedSubs[subIndex] = {\n ...updatedSubs[subIndex],\n name: updates.name || updatedSubs[subIndex].name,\n };\n set({ subscriptions: updatedSubs });\n }\n\n const currentRooms = get().rooms;\n const roomIndex = currentRooms.findIndex(r => r._id === channelId);\n if (roomIndex >= 0) {\n const updatedRooms = [...currentRooms];\n updatedRooms[roomIndex] = {\n ...updatedRooms[roomIndex],\n name: updates.name || updatedRooms[roomIndex].name,\n description: updates.description || updatedRooms[roomIndex].description,\n };\n set({ rooms: updatedRooms });\n\n const { currentRoom } = get();\n if (currentRoom?._id === channelId) {\n set({\n currentRoom: {\n ...currentRoom,\n name: updates.name || currentRoom.name,\n description: updates.description || currentRoom.description,\n },\n });\n }\n }\n\n return updatedChannel;\n } catch (e: unknown) {\n console.error('Failed to update channel:', e);\n uiStore.setState({ error: (e as Error)?.message || 'Failed to update channel' });\n return null;\n }\n },\n\n leaveCurrentChannel: async (leaveSilently = null) => {\n const { api } = sharedRefs;\n if (!api) return false;\n\n const room = get().currentRoom;\n if (!room?._id) return false;\n\n try {\n await api.leaveChannel(room._id, leaveSilently);\n const isDM = room.t === 'd';\n\n if (isDM) {\n get().hideRoom(room._id);\n const userId = authStore.getState().user?._id;\n if (userId) clearLastOpenedRoom(userId);\n } else {\n navigationHistoryStore.getState().forgetRoom(room._id);\n }\n\n const updatedSubscriptions = isDM\n ? get().subscriptions.map(s => (s.rid === room._id ? { ...s, open: false } : s))\n : get().subscriptions.filter(s => s.rid !== room._id);\n\n messageStore.getState().setMessages([]);\n memberStore.setState({ members: [] });\n set({ subscriptions: updatedSubscriptions, currentRoom: null });\n return true;\n } catch (e) {\n uiStore.setState({ error: (e as Error)?.message || 'Failed to leave channel' });\n return false;\n }\n },\n}));\n\nexport const resetRoomStore = () => {\n // Room ids outlive a session: after a re-login a shared DM would otherwise keep the previous\n // user's view of who the partner is.\n Object.keys(dmRecipientCache).forEach(roomId => delete dmRecipientCache[roomId]);\n roomStore.setState(getInitialState());\n};\n","import { createStore } from 'zustand/vanilla';\n\nimport type { ViewportDeepLink } from '../../types/viewport';\n\nimport type { User } from '../../types/user';\nimport type { Message } from '../../types/message';\nimport type { AppCommentData, SharedFile } from '../../types/appComment';\nimport type { FilterEntityWindow } from '../../types/filterEntity';\nimport {\n SIDEBAR_TABS,\n type SidebarSectionKey,\n type SidebarTabKey,\n} from '../../constants/constants';\nimport { SessionManager } from '../services/sessionManager';\nimport { sharedRefs } from '../sharedRefs';\n\nimport { roomStore } from './roomStore';\nimport { assetStore } from './assetStore';\n\n// The window a \"show me\" request asks for, carried into `AppPage`'s `initialSettings` —\n// never into the URL, which `AppPage` reads back via `window.top.location.href`.\nexport interface TracesViewportRequest {\n wellAssetId: number;\n viewport: ViewportDeepLink;\n}\n\ninterface InlineViewState {\n appId: string;\n activityId?: string;\n viewKey: string;\n appUrl?: string;\n settingsSnapshotId?: string;\n tracesViewport?: TracesViewportRequest;\n}\n\nexport interface UIStore {\n isLoading: boolean;\n error: string | null;\n isChatVisible: boolean;\n isSidebarOpen: boolean;\n sidebarTab: SidebarTabKey;\n // Set by the collapsed nav rail, consumed by RoomList to expand + scroll to the section.\n sidebarSectionRequest: SidebarSectionKey | null;\n // Bumped by the rail's Search button; Sidebar focuses its search box on change.\n sidebarSearchFocusTrigger: number;\n isNewMessageOpen: boolean;\n inputFocusTrigger: number;\n pendingThreadId: string | null;\n pendingThreadRoomId: string | null;\n pendingHighlightMessageId: string | null;\n ephemeralMentionUsersByRoom: Record<string, User[]>;\n messageDraftsByRoom: Record<string, string>;\n forwardingMessage: Message | null;\n forwardingComment: AppCommentData | null;\n sharingFile: SharedFile | null;\n inlineViewState: InlineViewState | null;\n isNavigatingToMessage: boolean;\n isSwitchingRoom: boolean;\n // A well/pad selected in the header popover, consumed by MessageList to scroll the chat.\n pendingWellJump: FilterEntityWindow | null;\n attentionSeriesPlayed: number;\n attentionNextSeriesAt: number | null;\n // Set by the notifications toast, consumed by Header.\n channelSettingsRequestedAt: number | null;\n\n setLoading: (loading: boolean) => void;\n setError: (error: string | null) => void;\n clearError: () => void;\n setChatVisible: (visible: boolean) => void;\n setSidebarOpen: (open: boolean) => void;\n setSidebarTab: (tab: SidebarTabKey) => void;\n requestSidebarSection: (section: SidebarSectionKey) => void;\n clearSidebarSectionRequest: () => void;\n requestSidebarSearchFocus: () => void;\n setNewMessageOpen: (open: boolean) => void;\n triggerInputFocus: () => void;\n setPendingThreadId: (threadId: string | null) => void;\n setPendingThreadRoomId: (roomId: string | null) => void;\n setPendingHighlightMessageId: (messageId: string | null) => void;\n setEphemeralMentionUsers: (roomId: string, users: User[]) => void;\n clearEphemeralMentionUsers: (roomId: string) => void;\n getEphemeralMentionUsers: (roomId: string | undefined) => User[];\n setMessageDraft: (draftKey: string, text: string) => void;\n setForwardingMessage: (message: Message | null) => void;\n setForwardingComment: (data: AppCommentData | null) => void;\n setSharingFile: (file: SharedFile | null) => void;\n setInlineViewState: (state: InlineViewState | null) => void;\n setNavigatingToMessage: (navigating: boolean) => void;\n setSwitchingRoom: (switching: boolean) => void;\n setPendingWellJump: (period: FilterEntityWindow | null) => void;\n recordAttentionSeries: (params: { startedAt: number; cooldownMs: number }) => void;\n requestChannelSettings: () => void;\n clearChannelSettingsRequest: () => void;\n}\n\nconst getInitialState = () => ({\n isLoading: false,\n error: null,\n isChatVisible: false,\n isSidebarOpen: true,\n sidebarTab: SIDEBAR_TABS.ALL as SidebarTabKey,\n sidebarSectionRequest: null as SidebarSectionKey | null,\n sidebarSearchFocusTrigger: 0,\n isNewMessageOpen: false,\n inputFocusTrigger: 0,\n pendingThreadId: null,\n pendingThreadRoomId: null,\n pendingHighlightMessageId: null,\n ephemeralMentionUsersByRoom: {},\n messageDraftsByRoom: {},\n forwardingMessage: null,\n forwardingComment: null,\n sharingFile: null,\n inlineViewState: null,\n isNavigatingToMessage: false,\n isSwitchingRoom: false,\n pendingWellJump: null,\n channelSettingsRequestedAt: null as number | null,\n ...SessionManager.loadAttentionBudget(),\n});\n\nconst EMPTY_USERS: User[] = [];\n\nexport const uiStore = createStore<UIStore>()((set, get) => ({\n ...getInitialState(),\n\n setLoading: loading => set({ isLoading: loading }),\n setError: error => set({ error }),\n clearError: () => set({ error: null }),\n setChatVisible: visible => {\n const prevVisible = get().isChatVisible;\n set({ isChatVisible: visible });\n\n if (visible && !prevVisible) {\n // If an asset chat switch is in flight, don't re-select the stale current\n // room — setAssetContext will land on the new asset chat once its API resolves.\n if (assetStore.getState().isAssetSwitching) return;\n\n const currentRoomId = roomStore.getState().currentRoom?._id;\n if (currentRoomId && sharedRefs.messageCache.isDirty(currentRoomId)) {\n roomStore\n .getState()\n .selectRoom(currentRoomId)\n .catch((e: unknown) => {\n console.error('Failed to refresh room on chat reopen:', e);\n });\n }\n }\n },\n setSidebarOpen: open => set({ isSidebarOpen: open }),\n setSidebarTab: tab => set({ sidebarTab: tab }),\n requestSidebarSection: section =>\n set({ sidebarTab: SIDEBAR_TABS.ALL, sidebarSectionRequest: section, isSidebarOpen: true }),\n clearSidebarSectionRequest: () => set({ sidebarSectionRequest: null }),\n requestSidebarSearchFocus: () =>\n set(state => ({\n isSidebarOpen: true,\n sidebarSearchFocusTrigger: state.sidebarSearchFocusTrigger + 1,\n })),\n setNewMessageOpen: open => set({ isNewMessageOpen: open }),\n triggerInputFocus: () => set(state => ({ inputFocusTrigger: state.inputFocusTrigger + 1 })),\n setPendingThreadId: threadId => set({ pendingThreadId: threadId }),\n setPendingThreadRoomId: roomId => set({ pendingThreadRoomId: roomId }),\n setPendingHighlightMessageId: messageId => set({ pendingHighlightMessageId: messageId }),\n setEphemeralMentionUsers: (roomId, users) =>\n set(state => ({\n ephemeralMentionUsersByRoom: {\n ...state.ephemeralMentionUsersByRoom,\n [roomId]: users,\n },\n })),\n clearEphemeralMentionUsers: roomId =>\n set(state => {\n const { [roomId]: _omit, ...rest } = state.ephemeralMentionUsersByRoom;\n return { ephemeralMentionUsersByRoom: rest };\n }),\n getEphemeralMentionUsers: roomId => {\n if (!roomId) return EMPTY_USERS;\n return get().ephemeralMentionUsersByRoom[roomId] || EMPTY_USERS;\n },\n setMessageDraft: (draftKey, text) =>\n set(state => {\n if (!text) {\n const { [draftKey]: _omit, ...rest } = state.messageDraftsByRoom;\n return { messageDraftsByRoom: rest };\n }\n return { messageDraftsByRoom: { ...state.messageDraftsByRoom, [draftKey]: text } };\n }),\n setForwardingMessage: message => set({ forwardingMessage: message }),\n setForwardingComment: data => set({ forwardingComment: data }),\n setSharingFile: file => set({ sharingFile: file }),\n setInlineViewState: state => set({ inlineViewState: state }),\n setNavigatingToMessage: navigating => set({ isNavigatingToMessage: navigating }),\n setSwitchingRoom: switching => set({ isSwitchingRoom: switching }),\n setPendingWellJump: period => set({ pendingWellJump: period }),\n requestChannelSettings: () => set({ channelSettingsRequestedAt: Date.now() }),\n clearChannelSettingsRequest: () => set({ channelSettingsRequestedAt: null }),\n recordAttentionSeries: ({ startedAt, cooldownMs }) => {\n const budget = {\n attentionSeriesPlayed: get().attentionSeriesPlayed + 1,\n attentionNextSeriesAt: startedAt + cooldownMs,\n };\n SessionManager.saveAttentionBudget(budget);\n set(budget);\n },\n}));\n\nexport const resetUIStore = () => uiStore.setState(getInitialState());\n","import { createStore } from 'zustand/vanilla';\n\nimport { getChatHost } from '../../platform/host';\n\nimport type { User } from '../../types/user';\nimport type { LoginCredentials } from '../../types/auth';\nimport type { AssetChatChannel } from '../../types/asset';\nimport type { CorvaUser, CorvaRevoltAuthResponse } from '../../types/corvaIntegration';\nimport { SessionManager } from '../services/sessionManager';\nimport { sharedRefs } from '../sharedRefs';\n\nimport { resetMessageStore } from './messageStore';\nimport { uiStore, resetUIStore } from './uiStore';\nimport { memberStore, resetMemberStore } from './memberStore';\nimport { roomStore, resetRoomStore } from './roomStore';\nimport { resetAssetStore } from './assetStore';\nimport { resetChatAssetPermissionsSnapshot } from '../../utils/chatAssetPermissionsSnapshot';\nimport { resetNotificationStore } from './notificationStore';\nimport { resetChannelContentFilterStore } from './channelContentFilterStore';\nimport { resetFavoriteRoomsStore } from './favoriteRoomsStore';\nimport { resetNavigationHistoryStore } from './navigationHistoryStore';\n\nexport interface AuthStore {\n user: User | null;\n serverId: string | null;\n isConnected: boolean;\n hasEverConnected: boolean;\n // Repeated re-auth rejections; the socket stays stopped until reload.\n connectionGaveUp: boolean;\n assetChatChannels: AssetChatChannel[];\n // null = unknown\n chatUsed: boolean | null;\n\n setUser: (user: User | null) => void;\n setConnected: (connected: boolean) => void;\n setHasEverConnected: (hasConnected: boolean) => void;\n addAssetChatChannel: (channel: AssetChatChannel) => void;\n markChatUsed: () => void;\n\n login: (\n credentials: LoginCredentials\n ) => Promise<{ success: boolean; user?: User; error?: string }>;\n loginWithCorva: (\n corvaUser: CorvaUser\n ) => Promise<{ success: boolean; user?: User; error?: string }>;\n logout: () => void;\n restoreSession: (expectedRevoltUserId?: string) => Promise<boolean>;\n\n isAuthenticated: () => boolean;\n isSocketConnected: () => boolean;\n}\n\nconst getInitialState = () => ({\n user: null,\n serverId: null,\n isConnected: false,\n hasEverConnected: false,\n connectionGaveUp: false,\n assetChatChannels: [] as AssetChatChannel[],\n chatUsed: null as boolean | null,\n});\n\n// Having used chat is irreversible; a cached or stale server answer must not undo it.\nexport function keepChatUsed(\n current: boolean | null,\n incoming: boolean | null | undefined\n): boolean | null {\n return current === true ? true : (incoming ?? null);\n}\n\nconst setChatError = (message: string | null) => uiStore.setState({ error: message });\nconst setChatLoading = (loading: boolean) => uiStore.setState({ isLoading: loading });\n\nexport const authStore = createStore<AuthStore>()((set, get) => ({\n ...getInitialState(),\n\n setUser: user => set({ user }),\n setConnected: connected => set({ isConnected: connected }),\n setHasEverConnected: hasConnected => set({ hasEverConnected: hasConnected }),\n\n addAssetChatChannel: channel =>\n set(state => ({\n assetChatChannels: [\n ...state.assetChatChannels.filter(c => c.revolt_channel_id !== channel.revolt_channel_id),\n channel,\n ],\n })),\n\n markChatUsed: () => {\n if (get().chatUsed === true) return;\n\n set({ chatUsed: true });\n SessionManager.markChatUsed();\n },\n\n login: async credentials => {\n const { api } = sharedRefs;\n const { socket } = sharedRefs;\n if (!api || !socket) throw new Error('Store not initialized');\n\n setChatLoading(true);\n setChatError(null);\n set({ isConnected: false });\n\n try {\n const resp = await api.login(credentials);\n set({ user: resp.me });\n SessionManager.save({ user: resp.me, token: resp.token, chatUsed: get().chatUsed });\n\n setTimeout(async () => {\n try {\n if (resp.token) {\n await socket.connect(resp.token, resp.me._id);\n }\n } catch (socketError) {\n console.error('⚠️ WebSocket connection failed:', socketError);\n }\n }, 1000);\n\n await roomStore.getState().loadSubscriptions();\n setChatLoading(false);\n\n return { success: true, user: resp.me };\n } catch (e: unknown) {\n const errorMsg = (e as Error)?.message || 'Login failed';\n setChatLoading(false);\n setChatError(errorMsg);\n return { success: false, error: errorMsg };\n }\n },\n\n loginWithCorva: async corvaUser => {\n const { api } = sharedRefs;\n const { socket } = sharedRefs;\n if (!api || !socket) throw new Error('Store not initialized');\n\n setChatLoading(true);\n setChatError(null);\n set({ isConnected: false });\n\n try {\n const revoltSession = await getChatHost().corvaApi.post<CorvaRevoltAuthResponse>(\n '/v2/integration/revolt_chat_sessions',\n {}\n );\n\n if (!revoltSession?.revolt_session_token) {\n throw new Error('No valid session token received from Corva backend');\n }\n\n api.setToken(revoltSession.revolt_session_token);\n const revoltUser = await api.me();\n const assetChatChannels = revoltSession.revolt_chat_channels ?? [];\n const chatUsed = keepChatUsed(get().chatUsed, revoltSession.chat_used);\n set({\n user: revoltUser,\n serverId: revoltSession.revolt_company_server_id || null,\n assetChatChannels,\n chatUsed,\n });\n\n SessionManager.save({\n user: revoltUser,\n token: revoltSession.revolt_session_token,\n serverId: revoltSession.revolt_company_server_id,\n assetChatChannels,\n chatUsed,\n });\n\n setTimeout(async () => {\n try {\n await socket.connect(revoltSession.revolt_session_token, revoltUser._id);\n } catch (socketError) {\n console.error('⚠️ WebSocket connection failed:', socketError);\n }\n }, 1000);\n\n // Map the corva user → revolt user for member lookups\n memberStore.getState().setCorvaUserMapping(revoltUser._id, corvaUser);\n sharedRefs.corvaUserService.setMapping(revoltUser._id, corvaUser);\n\n await roomStore.getState().loadSubscriptions();\n setChatLoading(false);\n\n return { success: true, user: revoltUser };\n } catch (e: unknown) {\n console.error('❌ Corva-Revolt login failed:', e);\n const errorMsg = (e as Error)?.message || 'Corva login failed';\n setChatLoading(false);\n setChatError(errorMsg);\n return { success: false, error: errorMsg };\n }\n },\n\n logout: () => {\n SessionManager.clear();\n\n if (sharedRefs.socket) {\n sharedRefs.socket.disconnect();\n }\n\n if (sharedRefs.api) {\n sharedRefs.api.setToken(null);\n sharedRefs.api.clearUserCache();\n }\n\n set(getInitialState());\n getChatHost().notifier?.onLogout?.();\n resetRoomStore();\n resetAssetStore();\n resetMessageStore();\n resetChatAssetPermissionsSnapshot();\n resetUIStore();\n resetMemberStore();\n resetNotificationStore();\n resetChannelContentFilterStore();\n resetFavoriteRoomsStore();\n resetNavigationHistoryStore();\n\n sharedRefs.messageCache.clear();\n sharedRefs.typingManager.clear();\n sharedRefs.corvaUserService.clear();\n sharedRefs.forwardedMessageCache.clear();\n sharedRefs.ackChannel?.clear();\n },\n\n restoreSession: async expectedRevoltUserId => {\n const { api } = sharedRefs;\n const { socket } = sharedRefs;\n if (!api || !socket) return false;\n\n setChatLoading(true);\n setChatError(null);\n\n try {\n const session = SessionManager.load();\n if (!session) {\n setChatLoading(false);\n return false;\n }\n\n if (expectedRevoltUserId && session.revoltUserId !== expectedRevoltUserId) {\n SessionManager.clear();\n setChatLoading(false);\n return false;\n }\n\n api.setToken(session.token);\n const currentUser = await api.me();\n\n if (session.revoltUserId && currentUser._id !== session.revoltUserId) {\n SessionManager.clear();\n api.setToken(null);\n setChatLoading(false);\n return false;\n }\n\n set({\n user: currentUser,\n serverId: session.serverId || null,\n assetChatChannels: session.assetChatChannels ?? [],\n chatUsed: keepChatUsed(get().chatUsed, session.chatUsed),\n });\n\n setTimeout(async () => {\n try {\n if (session.token) {\n await socket.connect(session.token, currentUser._id);\n }\n } catch (socketError) {\n console.error('⚠️ WebSocket connection failed during session restore:', socketError);\n }\n }, 1000);\n\n await roomStore.getState().loadSubscriptions();\n setChatLoading(false);\n\n return true;\n } catch {\n setChatLoading(false);\n SessionManager.clear();\n api.setToken(null);\n return false;\n }\n },\n\n isAuthenticated: () => !!get().user,\n isSocketConnected: () => !!sharedRefs.socket?.isConnected(),\n}));\n\n/** @public */\nexport const resetAuthStore = () => authStore.setState(getInitialState());\n","import { createStore } from 'zustand/vanilla';\nimport { v4 as uuid } from 'uuid';\n\nimport type { Message, MessageFormData } from '../../types/message';\nimport type { RoomType } from '../../types/room';\nimport {\n cleanAttachmentUrls,\n transformAttachments,\n transformFileAttachments,\n} from '../../api/socket/transforms/messageTransform';\nimport { addMessage, updateMessageInList, removeMessageFromList } from '../utils/messageOperations';\nimport { SOFT_DELETE_MARKER, createSoftDeletedMessage } from '../../utils/isSoftDeletedMessage';\nimport { enrichWithCorvaData } from '../../utils/parseCorvaSystemMessage';\nimport { saveLastChatActivity } from '../services/lastRoomTracker';\nimport { getChatHost } from '../../platform/host';\nimport {\n uploadAndSend,\n buildFinalMessage,\n settleOptimisticMessage,\n failOptimisticMessage,\n} from '../utils/messageHelpers';\nimport { sharedRefs } from '../sharedRefs';\nimport { HttpError } from '../../api/core/http';\n\nimport { authStore } from './authStore';\nimport { uiStore } from './uiStore';\nimport { roomStore } from './roomStore';\nimport { memberStore } from './memberStore';\n\nexport interface MessageStore {\n messages: Message[];\n hasMoreMessages: boolean;\n isLoadingMoreMessages: boolean;\n\n setMessages: (messages: Message[]) => void;\n addMessageToList: (message: Message) => void;\n updateMessage: (messageId: string, updates: Partial<Message>) => void;\n removeMessage: (messageId: string) => void;\n setHasMoreMessages: (hasMore: boolean) => void;\n setLoadingMoreMessages: (loading: boolean) => void;\n\n loadMessages: (roomId: string, roomType: RoomType, count?: number) => Promise<void>;\n loadMoreMessages: () => Promise<void>;\n sendMessage: (data: MessageFormData) => Promise<unknown>;\n retrySendMessage: (tempId: string) => Promise<unknown>;\n dismissFailedMessage: (tempId: string) => void;\n editMessage: (messageId: string, content: string) => Promise<void>;\n deleteMessage: (messageId: string) => Promise<void>;\n pinMessage: (messageId: string) => Promise<void>;\n unpinMessage: (messageId: string) => Promise<void>;\n toggleReaction: (messageId: string, emoji: string) => Promise<void>;\n getAllMessages: (roomId: string, maxMessages?: number) => Promise<Message[]>;\n preloadRoomMessages: (roomId: string) => Promise<void>;\n fetchOriginalMessage: (channelId: string, messageId: string) => Promise<Message | null>;\n}\n\nconst getInitialState = () => ({\n messages: [] as Message[],\n hasMoreMessages: false,\n isLoadingMoreMessages: false,\n});\n\nconst getCurrentRoomId = () => roomStore.getState().currentRoom?._id;\nconst getCurrentUser = () => authStore.getState().user;\nconst setChatError = (message: string) => uiStore.setState({ error: message });\n\n// A room can be loaded several times in quick succession (NewMessageView's\n// existingRoom effect + handleOpenDm + the ChannelCreate socket event). Only the\n// latest fetch per room may apply, and messages sent/echoed while a fetch was in\n// flight must survive it — otherwise the pre-send snapshot wipes the sent message.\nconst loadSeqByRoom = new Map<string, number>();\nconst CLOCK_SKEW_TOLERANCE_MS = 5000;\n\nconst mergeMessagesSentDuringFetch = (\n fetched: Message[],\n local: Message[],\n roomId: string,\n fetchStartedAt: number\n): Message[] => {\n const cutoff = fetchStartedAt - CLOCK_SKEW_TOLERANCE_MS;\n const fetchedNonces = new Set(fetched.map(m => m.nonce).filter(Boolean));\n return local\n .filter(m => {\n if (m.rid !== roomId) return false;\n // An optimistic/failed copy whose server copy came back in the fetch is\n // already represented — keeping it would duplicate the message.\n if (m.isOptimistic || m.sendFailed) return !fetchedNonces.has(m.nonce);\n return new Date(m.ts).getTime() >= cutoff;\n })\n .reduce(addMessage, fetched);\n};\n\n// A send may settle after the user left its room; a dirty cache is left for the next open.\nconst applyToRoom = (roomId: string, update: (messages: Message[]) => Message[]) => {\n if (getCurrentRoomId() === roomId) {\n const next = update(messageStore.getState().messages);\n messageStore.setState({ messages: next });\n sharedRefs.messageCache.set(roomId, next);\n return;\n }\n const cached = sharedRefs.messageCache.get(roomId);\n if (cached) sharedRefs.messageCache.set(roomId, update(cached));\n};\n\nexport const messageStore = createStore<MessageStore>()((set, get) => ({\n ...getInitialState(),\n\n setMessages: messages => set({ messages }),\n addMessageToList: message => set(state => ({ messages: addMessage(state.messages, message) })),\n updateMessage: (messageId, updates) =>\n set(state => ({ messages: updateMessageInList(state.messages, messageId, updates) })),\n removeMessage: messageId =>\n set(state => ({ messages: removeMessageFromList(state.messages, messageId) })),\n setHasMoreMessages: hasMore => set({ hasMoreMessages: hasMore }),\n setLoadingMoreMessages: loading => set({ isLoadingMoreMessages: loading }),\n\n loadMessages: async (roomId, _roomType, count = 100) => {\n const { api } = sharedRefs;\n if (!api) return;\n\n const seq = (loadSeqByRoom.get(roomId) ?? 0) + 1;\n loadSeqByRoom.set(roomId, seq);\n const fetchStartedAt = Date.now();\n\n try {\n const fetched = await api.getChannelMessages(roomId, count);\n if (loadSeqByRoom.get(roomId) !== seq) return;\n\n const hasMoreMessages = fetched.length >= count;\n const isCurrentRoom = getCurrentRoomId() === roomId;\n const msgs = isCurrentRoom\n ? mergeMessagesSentDuringFetch(fetched, get().messages, roomId, fetchStartedAt)\n : fetched;\n\n sharedRefs.messageCache.set(roomId, msgs);\n\n if (isCurrentRoom) {\n set({ messages: msgs, hasMoreMessages });\n }\n } catch (e: unknown) {\n if (loadSeqByRoom.get(roomId) !== seq) return;\n setChatError((e as Error)?.message || 'Failed to load messages');\n }\n },\n\n loadMoreMessages: async () => {\n const { api } = sharedRefs;\n if (!api) return;\n\n const currentRoomId = getCurrentRoomId();\n const { messages, isLoadingMoreMessages, hasMoreMessages } = get();\n\n if (isLoadingMoreMessages || !hasMoreMessages || !currentRoomId) {\n return;\n }\n\n try {\n set({ isLoadingMoreMessages: true });\n\n // Array order is not stable — pick the oldest by ts.\n const oldestMessage = messages.reduce<Message | undefined>((oldest, msg) => {\n if (!oldest) return msg;\n return new Date(msg.ts).getTime() < new Date(oldest.ts).getTime() ? msg : oldest;\n }, undefined);\n if (!oldestMessage) {\n set({ isLoadingMoreMessages: false, hasMoreMessages: false });\n return;\n }\n\n const olderMessages = await api.getChannelMessages(currentRoomId, 100, oldestMessage._id);\n\n if (getCurrentRoomId() !== currentRoomId) {\n set({ isLoadingMoreMessages: false });\n return;\n }\n\n const currentMessages = get().messages;\n const newMessages = [...currentMessages];\n olderMessages.forEach(msg => {\n if (!newMessages.find(m => m._id === msg._id)) {\n newMessages.push(msg);\n }\n });\n\n set({\n messages: newMessages,\n isLoadingMoreMessages: false,\n hasMoreMessages: olderMessages.length >= 100,\n });\n\n sharedRefs.messageCache.set(currentRoomId, newMessages);\n } catch (e: unknown) {\n set({ isLoadingMoreMessages: false });\n setChatError((e as Error)?.message || 'Failed to load more messages');\n }\n },\n\n sendMessage: async data => {\n const { api } = sharedRefs;\n if (!api) return Promise.resolve();\n\n const currentUser = getCurrentUser();\n const tempId = `temp-${uuid()}`;\n\n const optimisticMessage: Message = {\n _id: tempId,\n nonce: tempId,\n rid: data.roomId,\n msg: data.text,\n ts: new Date().toISOString(),\n u: {\n _id: currentUser?._id || 'mock-user-id',\n username: currentUser?.username || 'You',\n },\n _updatedAt: new Date().toISOString(),\n replies: data.threadId ? [data.threadId] : undefined,\n isOptimistic: true,\n retryFormData: data,\n };\n\n const currentMessages = get().messages;\n if (data.threadId) {\n const bumpedParents = currentMessages.map(m =>\n m._id === data.threadId\n ? { ...m, tcount: (m.tcount || 0) + 1, tlm: optimisticMessage.ts }\n : m\n );\n set({ messages: addMessage(bumpedParents, optimisticMessage) });\n } else {\n set({ messages: addMessage(currentMessages, optimisticMessage) });\n }\n\n try {\n const { response, uploadedFiles } = await uploadAndSend(api, data, tempId);\n const finalMessage = buildFinalMessage(response, data, currentUser, uploadedFiles);\n\n applyToRoom(data.roomId, msgs => settleOptimisticMessage(msgs, tempId, finalMessage));\n\n // Ack own send directly — the socket-echo ack is skipped if the socket\n // is down, which would leave the server pointer behind our own message.\n if (response._id) sharedRefs.ackChannel?.(data.roomId, response._id);\n\n if (currentUser?._id) {\n saveLastChatActivity(currentUser._id);\n getChatHost().notifier?.onMessageSent?.(currentUser._id);\n }\n authStore.getState().markChatUsed();\n\n return response;\n } catch (e) {\n applyToRoom(data.roomId, msgs =>\n failOptimisticMessage(msgs, optimisticMessage, data.threadId)\n );\n console.error('❌ Send message error:', (e as Error)?.message || 'Failed to send message');\n setChatError((e as Error)?.message || 'Failed to send message');\n throw e;\n }\n },\n\n retrySendMessage: async tempId => {\n const { api } = sharedRefs;\n if (!api) return Promise.resolve();\n\n const currentUser = getCurrentUser();\n const { messages } = get();\n const failedMessage = messages.find(msg => msg._id === tempId && msg.sendFailed);\n\n if (!failedMessage || !failedMessage.retryFormData) {\n throw new Error('Failed message not found or missing form data');\n }\n\n const data = failedMessage.retryFormData;\n\n let updatedMessages = messages.map(msg =>\n msg._id === tempId ? { ...msg, sendFailed: false, isOptimistic: true } : msg\n );\n\n if (data.threadId) {\n updatedMessages = updatedMessages.map(m =>\n m._id === data.threadId ? { ...m, tcount: (m.tcount || 0) + 1, tlm: failedMessage.ts } : m\n );\n }\n set({ messages: updatedMessages });\n\n try {\n const { response, uploadedFiles } = await uploadAndSend(api, data, tempId);\n const finalMessage = buildFinalMessage(response, data, currentUser, uploadedFiles);\n\n applyToRoom(data.roomId, msgs => settleOptimisticMessage(msgs, tempId, finalMessage));\n\n if (response._id) sharedRefs.ackChannel?.(data.roomId, response._id);\n\n if (currentUser?._id) {\n saveLastChatActivity(currentUser._id);\n getChatHost().notifier?.onMessageSent?.(currentUser._id);\n }\n authStore.getState().markChatUsed();\n\n return response;\n } catch (e) {\n applyToRoom(data.roomId, msgs => failOptimisticMessage(msgs, failedMessage, data.threadId));\n console.error('❌ Retry send message error:', (e as Error)?.message || 'Failed');\n setChatError((e as Error)?.message || 'Failed to retry sending message');\n throw e;\n }\n },\n\n dismissFailedMessage: tempId => {\n const { messages } = get();\n const failedMessage = messages.find(msg => msg._id === tempId && msg.sendFailed);\n if (!failedMessage) return;\n set({ messages: messages.filter(msg => msg._id !== tempId) });\n },\n\n editMessage: async (messageId, content) => {\n const { api } = sharedRefs;\n if (!api) throw new Error('Store not initialized');\n const roomId = getCurrentRoomId();\n if (!roomId) throw new Error('No room selected');\n\n const { messages } = get();\n const originalMessage = messages.find(msg => msg._id === messageId);\n\n const updatedMessages = messages.map(msg => {\n if (msg._id === messageId) {\n return enrichWithCorvaData({\n ...msg,\n msg: content,\n editedAt: new Date().toISOString(),\n isOptimistic: true,\n });\n }\n return msg;\n });\n set({ messages: updatedMessages });\n\n try {\n await api.editMessage(roomId, messageId, content);\n\n const finalMessages = get().messages.map(msg => {\n if (msg._id === messageId) {\n const { isOptimistic, ...rest } = msg;\n return rest as Message;\n }\n return msg;\n });\n set({ messages: finalMessages });\n\n sharedRefs.messageCache.set(roomId, finalMessages);\n } catch (e) {\n if (originalMessage) {\n const rolledBack = get().messages.map(msg =>\n msg._id === messageId ? originalMessage : msg\n );\n set({ messages: rolledBack });\n }\n setChatError((e as Error)?.message || 'Failed to edit message');\n throw new Error((e as Error)?.message || 'Failed to edit message');\n }\n },\n\n deleteMessage: async messageId => {\n const { api } = sharedRefs;\n if (!api) throw new Error('Store not initialized');\n const roomId = getCurrentRoomId();\n if (!roomId) throw new Error('No room selected');\n\n const { messages } = get();\n const originalMessages = [...messages];\n\n const deletedMessage = messages.find(msg => msg._id === messageId);\n if (!deletedMessage) return;\n\n const isThreadReply =\n Array.isArray(deletedMessage.replies) && deletedMessage.replies.length > 0;\n const parentId = isThreadReply ? (deletedMessage.replies as string[])[0] : undefined;\n const hasReplies = deletedMessage.tcount && deletedMessage.tcount > 0;\n\n let optimisticMessages: Message[];\n\n if (hasReplies) {\n optimisticMessages = messages.map(msg => {\n if (msg._id === messageId) {\n return { ...createSoftDeletedMessage(msg), isOptimistic: true };\n }\n return msg;\n });\n } else {\n optimisticMessages = messages.filter(msg => msg._id !== messageId);\n\n if (parentId) {\n optimisticMessages = optimisticMessages\n .map(msg => {\n if (msg._id === parentId) {\n const newTcount = (msg.tcount || 1) - 1;\n if (msg.deleted && newTcount === 0) {\n return null as unknown as Message;\n }\n return { ...msg, tcount: newTcount };\n }\n return msg;\n })\n .filter((msg): msg is Message => msg !== null && msg !== undefined);\n }\n }\n\n set({ messages: optimisticMessages });\n\n try {\n if (hasReplies) {\n await api.editMessage(roomId, messageId, SOFT_DELETE_MARKER);\n } else {\n await api.deleteMessage(roomId, messageId);\n }\n\n const finalMessages = get().messages.map(msg => {\n if (msg._id === messageId) {\n const { isOptimistic, ...rest } = msg;\n return rest as Message;\n }\n return msg;\n });\n set({ messages: finalMessages });\n\n sharedRefs.messageCache.set(roomId, finalMessages);\n } catch (e) {\n set({ messages: originalMessages });\n setChatError((e as Error)?.message || 'Failed to delete message');\n throw new Error((e as Error)?.message || 'Failed to delete message');\n }\n },\n\n pinMessage: async messageId => {\n const { api } = sharedRefs;\n if (!api) throw new Error('Store not initialized');\n const roomId = getCurrentRoomId();\n if (!roomId) throw new Error('No room selected');\n\n const { messages } = get();\n const originalMessages = messages;\n\n set({\n messages: messages.map(msg => (msg._id === messageId ? { ...msg, pinned: true } : msg)),\n });\n\n try {\n await api.pinMessage(roomId, messageId);\n } catch (e) {\n set({ messages: originalMessages });\n setChatError((e as Error)?.message || 'Failed to pin message');\n throw new Error((e as Error)?.message || 'Failed to pin message');\n }\n },\n\n unpinMessage: async messageId => {\n const { api } = sharedRefs;\n if (!api) throw new Error('Store not initialized');\n const roomId = getCurrentRoomId();\n if (!roomId) throw new Error('No room selected');\n\n const { messages } = get();\n const originalMessages = messages;\n\n set({\n messages: messages.map(msg => (msg._id === messageId ? { ...msg, pinned: false } : msg)),\n });\n\n try {\n await api.unpinMessage(roomId, messageId);\n } catch (e) {\n set({ messages: originalMessages });\n setChatError((e as Error)?.message || 'Failed to unpin message');\n throw new Error((e as Error)?.message || 'Failed to unpin message');\n }\n },\n\n toggleReaction: async (messageId, emoji) => {\n const { api } = sharedRefs;\n const roomId = getCurrentRoomId();\n const currentUser = getCurrentUser();\n if (!api || !roomId || !currentUser) return;\n\n const { messages } = get();\n const idx = messages.findIndex(m => m._id === messageId);\n if (idx < 0) return;\n\n const msg = messages[idx];\n const currentUserId = currentUser._id;\n const userIdArr = msg.reactions?.[emoji]?.userIds || [];\n const already = userIdArr.includes(currentUserId);\n\n const next = [...messages];\n const nextMsg: Message = { ...msg, reactions: { ...(msg.reactions || {}) } };\n\n if (already) {\n const filteredIds = userIdArr.filter(id => id !== currentUserId);\n if (filteredIds.length === 0) {\n const { [emoji]: _omit, ...rest } = nextMsg.reactions!;\n nextMsg.reactions = rest;\n } else {\n nextMsg.reactions![emoji] = { userIds: filteredIds };\n }\n } else {\n nextMsg.reactions![emoji] = { userIds: [...userIdArr, currentUserId] };\n }\n next[idx] = nextMsg;\n set({ messages: next });\n\n try {\n if (already) await api.removeReaction(roomId, messageId, emoji);\n else await api.addReaction(roomId, messageId, emoji);\n\n if (currentUserId) saveLastChatActivity(currentUserId);\n } catch (e) {\n set({ messages });\n setChatError((e as Error)?.message || 'Failed to toggle reaction');\n throw new Error((e as Error)?.message || 'Failed to toggle reaction');\n }\n },\n\n getAllMessages: async (roomId, maxMessages = 500) => {\n const { api } = sharedRefs;\n if (!api) throw new Error('API not initialized');\n\n const allMessages: Message[] = [];\n let beforeCursor: string | undefined;\n const batchSize = 100;\n const maxBatches = Math.ceil(maxMessages / batchSize);\n let batchCount = 0;\n\n while (batchCount < maxBatches) {\n batchCount += 1;\n // eslint-disable-next-line no-await-in-loop\n const batch = await api.getChannelMessages(roomId, batchSize, beforeCursor);\n\n if (batch.length === 0) break;\n\n allMessages.push(...batch);\n\n if (allMessages.length >= maxMessages) break;\n if (batch.length < batchSize) break;\n\n beforeCursor = batch[batch.length - 1]._id;\n }\n\n return allMessages.slice(0, maxMessages);\n },\n\n preloadRoomMessages: async roomId => {\n const { api } = sharedRefs;\n if (!api) return;\n if (sharedRefs.messageCache.get(roomId)) return;\n\n try {\n const msgs = await api.getChannelMessages(roomId, 100);\n sharedRefs.messageCache.set(roomId, msgs);\n } catch (e: unknown) {\n // Best-effort: preloading failures are non-critical, but log for diagnostics\n console.warn('Failed to preload room messages:', e);\n }\n },\n\n fetchOriginalMessage: async (channelId, messageId) => {\n const { api } = sharedRefs;\n if (!api) return null;\n\n const cached = sharedRefs.forwardedMessageCache.get(messageId);\n if (cached) return cached;\n\n try {\n const raw = await api.fetchMessage(channelId, messageId);\n if (!raw) return null;\n\n const author = await api.getUser(raw.author);\n const autumnUrl = api.getBaseUrl().replace(/\\/api$/i, '/autumn');\n const rawContent = raw.content || '';\n const content = raw.attachments?.length\n ? cleanAttachmentUrls(rawContent, raw.attachments)\n : rawContent;\n\n const attachments = transformAttachments(raw.attachments, autumnUrl);\n const files = transformFileAttachments(raw.attachments, autumnUrl, channelId, raw.author);\n\n const authorId = raw.author || 'unknown';\n if (author && !memberStore.getState().membersById[authorId]) {\n const enriched = sharedRefs.corvaUserService.enrichUser({\n _id: authorId,\n username: author.username || 'Unknown User',\n name: author.name,\n isBot: author.isBot,\n });\n memberStore.getState().addMemberToCache(enriched);\n }\n\n const result = enrichWithCorvaData({\n _id: raw._id,\n rid: channelId,\n msg: content,\n ts: raw.created_at || new Date().toISOString(),\n u: {\n _id: authorId,\n username: author?.username || 'Unknown User',\n name: author?.name,\n },\n _updatedAt: raw.edited || raw.created_at || new Date().toISOString(),\n ...(raw.edited && { editedAt: raw.edited }),\n attachments,\n files,\n });\n\n if (sharedRefs.forwardedMessageCache.size >= 200) {\n const oldest = sharedRefs.forwardedMessageCache.keys().next().value;\n if (oldest) sharedRefs.forwardedMessageCache.delete(oldest);\n }\n sharedRefs.forwardedMessageCache.set(messageId, result);\n return result;\n } catch (e: unknown) {\n // 404: original deleted; 403: forwarded from a channel this user cannot read. Both render as unavailable.\n const expected = e instanceof HttpError && (e.status === 404 || e.status === 403);\n if (!expected) console.error('Failed to fetch original message:', e);\n return null;\n }\n },\n}));\n\nexport const resetMessageStore = () => messageStore.setState(getInitialState());\n","import type { Message } from '../../types/message';\nimport type { RoomType } from '../../types/room';\nimport type { Subscription } from '../../types/subscription';\nimport type { ReadyChannelData, ChannelUnread } from '../../types/socket';\nimport type { RevoltAPIInstance } from '../../api/RevoltAPI';\nimport {\n notificationStore,\n messageStore,\n authStore,\n memberStore,\n uiStore,\n roomStore,\n} from '../stores';\nimport { addMessage } from '../utils/messageOperations';\nimport { SOFT_DELETE_MARKER, createSoftDeletedMessage } from '../../utils/isSoftDeletedMessage';\nimport { enrichWithCorvaData } from '../../utils/parseCorvaSystemMessage';\nimport { CHANNEL_TYPES } from '../../constants/constants';\nimport { getChatHost } from '../../platform/host';\nimport { getUserDisplayName } from '../../utils/getUserDisplayName';\nimport { sharedRefs } from '../sharedRefs';\n\nimport type { MessageCache } from './messageCache';\nimport type { TypingManager } from './typingManager';\nimport { createRoomTaskQueue } from './roomTaskQueue';\n\nexport interface SocketEventHandlersConfig {\n api: RevoltAPIInstance;\n messageCache: MessageCache;\n typingManager: TypingManager;\n loadMessages: (roomId: string, roomType: RoomType) => Promise<void>;\n simulateTyping: (userKey: string, isTyping: boolean, displayName?: string) => void;\n}\n\nexport const createSocketEventHandlers = (config: SocketEventHandlersConfig) => {\n const { api, messageCache, typingManager, loadMessages, simulateTyping } = config;\n\n const getRoom = () => roomStore.getState();\n const getHidden = () => roomStore.getState();\n\n const scheduleAck = (channelId: string, messageId: string) =>\n sharedRefs.ackChannel?.(channelId, messageId);\n const enqueueRoomTask = createRoomTaskQueue();\n\n // A later acceptance is a reconnect.\n let hasAuthenticated = false;\n\n return {\n onConnected: () => {},\n\n onAuthenticated: () => {\n const isReconnect = hasAuthenticated;\n hasAuthenticated = true;\n authStore.setState({ isConnected: true, hasEverConnected: true, connectionGaveUp: false });\n\n // Missed events never arrive: drop caches and refetch the open room.\n if (isReconnect) {\n messageCache.clear();\n const { currentRoom } = getRoom();\n if (currentRoom) loadMessages(currentRoom._id, currentRoom.t).catch(console.error);\n }\n },\n\n onDisconnected: () => {\n authStore.setState({ isConnected: false });\n },\n\n onReady: (channels: ReadyChannelData[], channelUnreads?: ChannelUnread[]) => {\n if (!authStore.getState().user?._id) return;\n\n const channelLastMsg = new Map<string, string>();\n channels.forEach(ch => {\n if (ch.last_message_id) {\n channelLastMsg.set(ch._id, ch.last_message_id);\n }\n });\n\n const applyUnreads = (ackedMap: Map<string, string>) => {\n const currentState = getRoom();\n const subs = currentState.subscriptions.map(sub => {\n const lastMsg = channelLastMsg.get(sub.rid) || sub.last_message_id;\n const lastAcked = ackedMap.get(sub.rid);\n // Hydrate the per-channel last-acked baseline. `isUnread(sub)` will\n // derive the dot/marker from this vs `last_message_id`.\n let acked = lastAcked ?? lastMsg ?? sub.last_acked_message_id;\n\n // ---- TEMP (DRA-6042) ------------------------------------------------------\n // QA Stoat fails to persist acks (RabbitMQ publish in acker.rs), so Ready hands\n // back a stale pointer and rooms this session already read flip to unread on\n // reconnect. Never regress below an id this page session acked. Only ids that\n // went through the scheduler count; the load-time \"seeded as read\" value does\n // not, so genuinely unread rooms still show. Does not survive a reload.\n // Remove this block and `sessionAcked` in ackScheduler once the backend is fixed.\n const sessionAcked = sharedRefs.ackChannel?.sessionAcked(sub.rid);\n if (sessionAcked && (acked ?? '0') < sessionAcked) acked = sessionAcked;\n // ---- /TEMP ----------------------------------------------------------------\n\n return {\n ...sub,\n last_message_id: lastMsg ?? sub.last_message_id,\n last_acked_message_id: acked,\n };\n });\n roomStore.getState().setSubscriptions(subs);\n roomStore.setState({ unreadsHydrated: true });\n };\n\n if (channelUnreads) {\n const ackedMap = new Map<string, string>();\n channelUnreads.forEach(entry => {\n if (entry?._id?.channel && entry.last_id) {\n ackedMap.set(entry._id.channel, entry.last_id);\n }\n });\n applyUnreads(ackedMap);\n } else {\n api\n .getUnreads()\n .then(applyUnreads)\n .catch(() => {});\n }\n },\n\n onChannelAck: (channelId: string, messageId: string) => {\n const state = getRoom();\n // Advance-only: a late ack event from another session must not regress\n // the pointer past what this session has already read.\n const updatedSubs = state.subscriptions.map(sub =>\n sub.rid === channelId && (sub.last_acked_message_id ?? '0') < messageId\n ? { ...sub, last_acked_message_id: messageId }\n : sub\n );\n roomStore.getState().setSubscriptions(updatedSubs);\n },\n\n onMessage: (message: Message) => {\n const state = getRoom();\n const current = state.currentRoom;\n\n // Update pinned field on the actual message if this is a pin/unpin system message\n if (message.t === 'message_pinned' && message.pinnedMessageId) {\n const msgStore = messageStore.getState();\n msgStore.setMessages(\n msgStore.messages.map(msg =>\n msg._id === message.pinnedMessageId ? { ...msg, pinned: true } : msg\n )\n );\n } else if (message.t === 'message_unpinned' && message.unpinnedMessageId) {\n const msgStore = messageStore.getState();\n msgStore.setMessages(\n msgStore.messages.map(msg =>\n msg._id === message.unpinnedMessageId ? { ...msg, pinned: false } : msg\n )\n );\n }\n\n const currentUser = authStore.getState().user;\n const isOwnMsg = !!(currentUser && message.u._id === currentUser._id);\n const isViewingThisRoom = !!(\n current &&\n current._id === message.rid &&\n uiStore.getState().isChatVisible\n );\n\n // Advance last_message_id first so all branches (including the\n // alreadyExists early return) see consistent sub state. For own\n // messages, also bump last_acked_message_id so the user never sees\n // their own send as unread.\n const subIdx = state.subscriptions.findIndex(s => s.rid === message.rid);\n if (subIdx >= 0) {\n const sub = state.subscriptions[subIdx];\n if ((sub.last_message_id ?? '') < message._id) {\n const advancedSubs = [...state.subscriptions];\n advancedSubs[subIdx] = {\n ...sub,\n last_message_id: message._id,\n last_acked_message_id: isOwnMsg ? message._id : sub.last_acked_message_id,\n };\n roomStore.getState().setSubscriptions(advancedSubs);\n }\n }\n\n // Keep server-side last_acked aligned with the latest message we've\n // seen. For own messages this covers cases where the send-flow ack was\n // dropped or the send originated from another tab/device.\n // A hidden tab renders but is not read; the watcher acks it when shown.\n if (isOwnMsg || (isViewingThisRoom && !getChatHost().appState.isHidden())) {\n scheduleAck(message.rid, message._id);\n }\n\n if (!isViewingThisRoom) {\n // If this is a hidden DM receiving a new message, unhide it\n const messageSub = state.subscriptions.find(s => s.rid === message.rid);\n if (messageSub?.t === 'd' && getHidden().isRoomHidden(message.rid)) {\n getHidden().unhideRoom(message.rid);\n }\n\n // Re-open closed DMs so they reappear in the sidebar.\n const subs = getRoom().subscriptions.map(s =>\n s.rid === message.rid && s.t === 'd' && !s.open ? { ...s, open: true } : s\n );\n roomStore.getState().setSubscriptions(subs);\n\n if (!isOwnMsg) {\n const subscription = subs.find(s => s.rid === message.rid);\n const senderMember = memberStore.getState().membersById[message.u._id];\n const senderDisplayName = senderMember\n ? getUserDisplayName(senderMember)\n : message.u.username;\n const roomDisplayName =\n subscription?.t === 'd'\n ? subscription.dmUsername || 'Direct Message'\n : subscription?.name || 'Channel';\n\n getChatHost().notifier?.showIncomingMessage?.({\n message,\n subscription,\n currentUser: authStore.getState().user,\n settings: notificationStore.getState().notificationSettings,\n senderDisplayName,\n roomDisplayName,\n });\n }\n\n messageCache.markDirty(message.rid);\n return;\n }\n\n const currentMessages = messageStore.getState().messages;\n const isThreadReply = Array.isArray(message.replies) && message.replies.length > 0;\n const parentId: string | undefined = isThreadReply\n ? (message.replies as string[])[0]\n : undefined;\n const alreadyExists = currentMessages.some(m => m._id === message._id);\n\n if (alreadyExists) {\n if (isThreadReply && parentId) {\n const maybeUpdateParent = currentMessages.map(m =>\n m._id === parentId &&\n (!m.tlm || new Date(m.tlm).getTime() < new Date(message.ts).getTime())\n ? { ...m, tlm: message.ts }\n : m\n );\n messageStore.getState().setMessages(maybeUpdateParent);\n }\n return;\n }\n\n // Dedup own optimistic sends: the echo carries the nonce we sent, and the\n // optimistic copy is still in the list until the POST resolves\n // (last_message_id was already bumped above).\n if (isOwnMsg && message.nonce && currentMessages.some(m => m.nonce === message.nonce)) {\n return;\n }\n const isSystemMessage = message.t !== undefined;\n const isChatClosed = !uiStore.getState().isChatVisible;\n\n if (!isOwnMsg && !isSystemMessage && (getChatHost().appState.isInactive() || isChatClosed)) {\n const subscription = state.subscriptions.find(s => s.rid === message.rid);\n const senderMember = memberStore.getState().membersById[message.u._id];\n const senderDisplayName = senderMember\n ? getUserDisplayName(senderMember)\n : message.u.username;\n const roomDisplayName =\n subscription?.t === 'd'\n ? subscription.dmUsername || 'Direct Message'\n : subscription?.name || 'Channel';\n\n getChatHost().notifier?.showIncomingMessage?.({\n message,\n subscription,\n currentUser: authStore.getState().user,\n settings: notificationStore.getState().notificationSettings,\n senderDisplayName,\n roomDisplayName,\n });\n }\n\n if (isThreadReply && parentId) {\n const bumpedParents = currentMessages.map(m => {\n if (m._id === parentId) {\n return {\n ...m,\n tcount: (m.tcount || 0) + 1,\n tlm: message.ts,\n };\n }\n return m;\n });\n messageStore.getState().setMessages(addMessage(bumpedParents, message));\n } else {\n messageStore.getState().setMessages(addMessage(currentMessages, message));\n }\n\n // Update message cache - only cache messages for the current room\n if (current) {\n const currentRoomMessages = messageStore\n .getState()\n .messages.filter(msg => msg.rid === current._id);\n messageCache.set(current._id, currentRoomMessages);\n }\n },\n\n onRoomChange: (roomId: string, change: unknown) => {\n try {\n const payload = change as {\n event?: string;\n channel_type?: string;\n name?: string;\n userId?: string;\n op?: 'add' | 'remove';\n messageId?: string;\n emoji?: string;\n };\n\n // Channel creation event\n if (\n payload?.event === 'create' &&\n (payload?.channel_type === CHANNEL_TYPES.GROUP ||\n payload?.channel_type === CHANNEL_TYPES.TEXT_CHANNEL ||\n payload?.channel_type === CHANNEL_TYPES.DIRECT_MESSAGE)\n ) {\n enqueueRoomTask(roomId, async () => {\n const currentSubs = getRoom().subscriptions;\n\n // Determine subscription type\n let subType: RoomType = 'c';\n if (payload.channel_type === CHANNEL_TYPES.GROUP) {\n subType = 'p';\n } else if (payload.channel_type === CHANNEL_TYPES.DIRECT_MESSAGE) {\n subType = 'd';\n }\n\n // Check if subscription already exists (e.g. DM re-created or re-joined)\n const existingSub = currentSubs.find(s => s.rid === roomId);\n\n const sub: Subscription = {\n _id: roomId,\n rid: roomId,\n name: payload.name || (subType === 'd' ? 'Direct Message' : 'Channel'),\n t: subType,\n u: { _id: '', username: '' },\n ts: new Date().toISOString(),\n open: existingSub?.open ?? true,\n alert: existingSub?.alert ?? false,\n last_acked_message_id: existingSub?.last_acked_message_id,\n userMentions: existingSub?.userMentions ?? 0,\n groupMentions: existingSub?.groupMentions ?? 0,\n };\n\n // For DMs, try to fetch recipient info\n if (subType === 'd') {\n try {\n const recipient = await api.getDMRecipient(\n roomId,\n authStore.getState().user?._id || undefined\n );\n if (recipient) {\n sub.dmUserId = recipient._id;\n sub.dmUsername = recipient.username;\n sub.dmAvatarUrl = recipient.avatarUrl;\n }\n } catch (e) {\n console.error('Failed to fetch DM recipient info:', e);\n }\n }\n\n // For group channels, store member IDs so RoomItem can resolve avatars by ID\n if (subType === 'p') {\n if (existingSub?.recipients) {\n sub.recipients = existingSub.recipients;\n } else {\n try {\n const members = await api.getGroupMembers(roomId);\n sub.recipients = members.map(m => m._id);\n } catch {\n // ignore — avatars will fall back to initials\n }\n }\n }\n\n const deduped = [...currentSubs.filter(s => s.rid !== roomId), sub];\n roomStore.getState().setSubscriptions(deduped);\n\n // Mark channel as dirty\n messageCache.markDirty(roomId);\n\n // If this is the currently viewed room, reload messages\n const currentRoomId = getRoom().currentRoom?._id;\n if (currentRoomId === roomId) {\n loadMessages(roomId, sub.t).catch(console.error);\n }\n });\n }\n\n // User leave event (ChannelGroupLeave)\n // Note: Backend sends both ChannelGroupLeave event AND a system message (user_left or user_remove)\n // The system message is handled by handleIncomingMessage, so we just update members here\n // We don't create a message here because the system message will handle it\n if (payload?.event === 'leave') {\n enqueueRoomTask(roomId, async () => {\n const currentUserId = authStore.getState().user?._id;\n if (payload.userId && currentUserId && payload.userId === currentUserId) {\n // If I left the channel\n const sub = getRoom().subscriptions.find(s => s.rid === roomId);\n const isDM = sub?.t === 'd';\n\n if (isDM) {\n // Store in user settings for persistence\n getHidden().hideRoom(roomId);\n }\n\n // For DMs, mark as closed (open: false) instead of removing\n // For channels, remove the subscription entirely\n const updatedSubscriptions = isDM\n ? getRoom().subscriptions.map(s => (s.rid === roomId ? { ...s, open: false } : s))\n : getRoom().subscriptions.filter(s => s.rid !== roomId);\n\n messageStore.getState().setMessages([]);\n memberStore.setState({ members: [] });\n roomStore.getState().setSubscriptions(updatedSubscriptions);\n roomStore.getState().setCurrentRoom(null);\n return;\n }\n\n // Update members list - the system message (user_left or user_remove) will create the message\n const viewing = getRoom().currentRoom?._id === roomId;\n if (viewing && payload.userId) {\n memberStore.getState().removeUserFromMembers(payload.userId);\n }\n });\n }\n\n // Reaction event\n if (payload?.event === 'reaction' && payload.messageId && payload.emoji) {\n // Reactions only touch messages; don't wait behind create/leave.\n enqueueRoomTask(`${roomId}:reaction`, async () => {\n const current = getRoom();\n if (current.currentRoom?._id !== roomId) {\n messageCache.markDirty(roomId);\n return;\n }\n\n let reactingUsername = typingManager.getDisplayName(payload.userId || '');\n if (!reactingUsername && payload.userId) {\n const member = memberStore.getState().membersById[payload.userId];\n if (member) reactingUsername = member.username;\n }\n if (!reactingUsername && payload.userId) {\n try {\n const u = await api.getUser(payload.userId);\n if (u?.username) reactingUsername = u.username;\n } catch {\n // ignore\n }\n }\n if (!reactingUsername && payload.userId) {\n reactingUsername =\n payload.userId.length >= 4 ? `User-${payload.userId.slice(-4)}` : 'user';\n }\n if (!reactingUsername) return;\n\n // Re-read after the await: the room may have changed or a message arrived.\n if (getRoom().currentRoom?._id !== roomId) {\n messageCache.markDirty(roomId);\n return;\n }\n const { messages } = messageStore.getState();\n const idx = messages.findIndex(m => m._id === payload.messageId);\n if (idx < 0) {\n messageCache.markDirty(roomId);\n return;\n }\n\n const next = [...messages];\n const currentMessage = messages[idx];\n const msg = {\n ...currentMessage,\n reactions: { ...(currentMessage.reactions || {}) },\n } as Message;\n const { emoji } = payload;\n if (!emoji) return;\n\n const userIdList = msg.reactions![emoji]?.userIds\n ? [...msg.reactions![emoji]!.userIds!]\n : [];\n if (payload.op === 'add') {\n if (payload.userId && !userIdList.includes(payload.userId)) {\n userIdList.push(payload.userId);\n }\n msg.reactions![emoji] = { userIds: userIdList };\n } else if (payload.op === 'remove') {\n const filteredIds = payload.userId\n ? userIdList.filter(id => id !== payload.userId)\n : userIdList;\n if (filteredIds.length === 0) {\n const { [emoji]: _omit, ...rest } = msg.reactions!;\n msg.reactions = rest;\n } else {\n msg.reactions![emoji] = { userIds: filteredIds };\n }\n }\n next[idx] = msg;\n messageStore.getState().setMessages(next);\n\n // Update message cache\n messageCache.set(roomId, next);\n });\n }\n } catch {\n // ignore socket room change parsing errors\n }\n },\n\n onTyping: (data: { userId?: string; username: string; roomId: string; isTyping: boolean }) => {\n const currentUser = authStore.getState().user;\n const { currentRoom } = getRoom();\n if (currentUser && data.userId === currentUser._id) return;\n\n if (!currentRoom || currentRoom._id !== data.roomId) return;\n\n // Track typing - TypingIndicator will look up display name from membersById\n simulateTyping(data.userId || data.username, data.isTyping);\n },\n\n onMessageUpdate: (\n messageId: string,\n channelId: string,\n data: { content?: string; edited?: string }\n ) => {\n const state = getRoom();\n if (!state.currentRoom || state.currentRoom._id !== channelId) {\n messageCache.markDirty(channelId);\n return;\n }\n\n const updatedMessages = messageStore.getState().messages.map(msg => {\n if (msg._id === messageId) {\n // Only update if content is actually provided\n if (data.content !== undefined) {\n const newContent = data.content;\n\n // Check if this is a soft delete (message edited to deletion marker)\n if (newContent === SOFT_DELETE_MARKER) {\n return createSoftDeletedMessage(msg);\n }\n\n // Only mark as edited if content actually changed\n const contentChanged = newContent !== msg.msg;\n return enrichWithCorvaData({\n ...msg,\n msg: newContent,\n editedAt: contentChanged ? data.edited || new Date().toISOString() : msg.editedAt,\n });\n }\n\n // If only edited timestamp is provided but no content change, don't mark as edited\n // (This handles cases like pin/unpin where edited timestamp might be sent but content didn't change)\n return msg;\n }\n return msg;\n });\n messageStore.getState().setMessages(updatedMessages);\n\n // Update message cache\n messageCache.set(channelId, updatedMessages);\n },\n\n onMessageDelete: (messageId: string, channelId: string) => {\n const state = getRoom();\n if (!state.currentRoom || state.currentRoom._id !== channelId) {\n messageCache.markDirty(channelId);\n return;\n }\n\n // Find the message being deleted\n const currentMessages = messageStore.getState().messages;\n const deletedMessage = currentMessages.find(msg => msg._id === messageId);\n if (!deletedMessage) return;\n\n const isThreadReply =\n Array.isArray(deletedMessage.replies) && deletedMessage.replies.length > 0;\n const parentId = isThreadReply ? (deletedMessage.replies as string[])[0] : undefined;\n\n // Check if this is a parent message with replies\n const hasReplies = deletedMessage.tcount && deletedMessage.tcount > 0;\n\n let updatedMessages: Message[];\n\n if (hasReplies) {\n // Slack-style: Mark as deleted but keep visible\n updatedMessages = currentMessages.map(msg => {\n if (msg._id === messageId) {\n return {\n ...msg,\n deleted: true,\n msg: 'This message was deleted',\n attachments: undefined,\n file: undefined,\n reactions: undefined,\n };\n }\n return msg;\n });\n } else {\n // No replies: fully remove the message\n updatedMessages = currentMessages.filter(msg => msg._id !== messageId);\n\n // If this was a thread reply, decrement the parent's reply count\n if (parentId) {\n updatedMessages = updatedMessages\n .map(msg => {\n if (msg._id === parentId) {\n const newTcount = (msg.tcount || 1) - 1;\n // If parent is deleted and has no more replies, remove it entirely\n if (msg.deleted && newTcount === 0) {\n return null as unknown as Message;\n }\n return {\n ...msg,\n tcount: newTcount,\n };\n }\n return msg;\n })\n .filter((msg): msg is Message => msg !== null && msg !== undefined);\n }\n }\n\n messageStore.getState().setMessages(updatedMessages);\n\n // Update message cache\n messageCache.set(channelId, updatedMessages);\n },\n\n onUserStatusChange: (userId: string, status: string) => {\n const updatedMembers = memberStore\n .getState()\n .members.map(member =>\n member._id === userId\n ? { ...member, status: status as 'online' | 'offline' | 'away' | 'busy' }\n : member\n );\n memberStore.setState({ members: updatedMembers });\n },\n\n onInvalidSession: () => api.notifyUnauthorized('ws:Authenticate'),\n\n onError: (error: unknown) => {\n console.error('🔌 WebSocket error:', error);\n },\n };\n};\n","import type { RevoltAPIInstance } from '../../api/RevoltAPI';\nimport { roomStore } from '../stores/roomStore';\n\nexport interface AckScheduler {\n (channelId: string, messageId: string): void;\n flushAll: () => void;\n clear: () => void;\n /** Newest id this page session acked for the channel (TEMP, see applyUnreads). */\n sessionAcked: (channelId: string) => string | undefined;\n}\n\n// Mirrors Stoat's `channel.ack()` debounce (1.5s debounce, 4s flush window)\n// from javascript-client-sdk/src/classes/Channel.ts. Optimistically advances\n// the local `last_acked_message_id` so the unread dot clears immediately, then\n// debounces the HTTP PUT.\nconst REJECTED_RETRY_DELAY_MS = 60_000;\n\nexport function createAckScheduler(api: RevoltAPIInstance): AckScheduler {\n const timeouts = new Map<string, ReturnType<typeof setTimeout>>();\n const limits = new Map<string, number>();\n const pending = new Map<string, string>();\n const accepted = new Map<string, string>();\n const rejected = new Map<string, { messageId: string; until: number }>();\n const inFlight = new Map<string, string>();\n // TEMP (DRA-6042): remove together with the heal block in socketEventHandlers.applyUnreads.\n const sessionAcked = new Map<string, string>();\n\n const send = (channelId: string, keepalive = false) => {\n const msgId = pending.get(channelId);\n const timeout = timeouts.get(channelId);\n if (timeout) clearTimeout(timeout);\n pending.delete(channelId);\n timeouts.delete(channelId);\n limits.delete(channelId);\n if (!msgId) return;\n // Stoat re-runs its AMQP notify when the same id is acked twice (room select\n // followed by the unread watcher after Ready); an accepted ack is final and a\n // rejected one is not worth hammering — the server side has to recover first.\n if (accepted.get(channelId) === msgId) return;\n if (inFlight.get(channelId) === msgId) return;\n const failure = rejected.get(channelId);\n if (failure?.messageId === msgId && Date.now() < failure.until) return;\n // api.ackMessage swallows its own errors with console.error, so no\n // outer catch is needed here.\n inFlight.set(channelId, msgId);\n const request = keepalive\n ? api.ackMessage(channelId, msgId, { keepalive: true })\n : api.ackMessage(channelId, msgId);\n request.then(ok => {\n if (inFlight.get(channelId) === msgId) inFlight.delete(channelId);\n if (ok) {\n accepted.set(channelId, msgId);\n rejected.delete(channelId);\n } else {\n rejected.set(channelId, { messageId: msgId, until: Date.now() + REJECTED_RETRY_DELAY_MS });\n }\n });\n };\n\n const schedule = (channelId: string, messageId: string) => {\n // Optimistic update runs even when the same id is already queued: a\n // reconnect Ready can regress the store to the server's stale pointer while\n // the PUT is still debounced, and the watcher relies on this to re-advance.\n const { subscriptions, setSubscriptions } = roomStore.getState();\n const sub = subscriptions.find(s => s.rid === channelId);\n if (sub && (sub.last_acked_message_id ?? '0') < messageId) {\n setSubscriptions(\n subscriptions.map(s =>\n s.rid === channelId ? { ...s, last_acked_message_id: messageId } : s\n )\n );\n }\n\n // ULIDs compare chronologically; never replace a queued ack with an older\n // one (e.g. a stale selectRoom ack racing an own-message echo ack).\n // TEMP (DRA-6042): remember what this session read, see applyUnreads.\n if ((sessionAcked.get(channelId) ?? '0') < messageId) sessionAcked.set(channelId, messageId);\n\n const queued = pending.get(channelId);\n if (queued && messageId <= queued) return;\n pending.set(channelId, messageId);\n\n const existing = timeouts.get(channelId);\n if (existing) clearTimeout(existing);\n\n const limit = limits.get(channelId);\n if (limit && Date.now() > limit) {\n send(channelId);\n return;\n }\n\n timeouts.set(\n channelId,\n setTimeout(() => send(channelId), 1500)\n );\n if (!limit) limits.set(channelId, Date.now() + 4000);\n };\n\n schedule.flushAll = () => {\n Array.from(pending.keys()).forEach(channelId => send(channelId, true));\n };\n\n schedule.clear = () => {\n timeouts.forEach(t => clearTimeout(t));\n timeouts.clear();\n limits.clear();\n pending.clear();\n accepted.clear();\n rejected.clear();\n inFlight.clear();\n sessionAcked.clear();\n };\n\n schedule.sessionAcked = (channelId: string) => sessionAcked.get(channelId);\n\n return schedule as AckScheduler;\n}\n","import { isUnread } from '../../utils/isUnread';\nimport { getChatHost, type AppStateAdapter } from '../../platform/host';\nimport { sharedRefs } from '../sharedRefs';\nimport { roomStore } from '../stores/roomStore';\nimport { uiStore } from '../stores/uiStore';\n\n// Mirrors Stoat: ack the viewed room whenever it turns unread; a hidden tab catches up when shown.\nconst ackViewedRoomIfUnread = (): void => {\n const { currentRoom, subscriptions } = roomStore.getState();\n if (!currentRoom || !uiStore.getState().isChatVisible || getChatHost().appState.isHidden())\n return;\n const sub = subscriptions.find(s => s.rid === currentRoom._id);\n if (sub?.last_message_id && isUnread(sub)) {\n sharedRefs.ackChannel?.(currentRoom._id, sub.last_message_id);\n }\n};\n\nconst flushPendingAcks = () => sharedRefs.ackChannel?.flushAll();\n\nlet storesSubscribed = false;\nlet watchedAppState: AppStateAdapter | null = null;\nlet stopWatchingAppState: Array<() => void> = [];\n\n// Re-installs against a new host's appState (e.g. configureChat again after a re-login).\nexport const installUnreadWatcher = (): void => {\n const { appState } = getChatHost();\n if (watchedAppState === appState) return;\n\n if (!storesSubscribed) {\n storesSubscribed = true;\n roomStore.subscribe(ackViewedRoomIfUnread);\n uiStore.subscribe(ackViewedRoomIfUnread);\n }\n\n stopWatchingAppState.forEach(stop => stop());\n watchedAppState = appState;\n stopWatchingAppState = [\n appState.subscribe(hidden => {\n if (hidden) flushPendingAcks();\n else ackViewedRoomIfUnread();\n }),\n ];\n const stopTerminate = appState.onTerminate?.(flushPendingAcks);\n if (stopTerminate) stopWatchingAppState.push(stopTerminate);\n};\n","import { getChatHost } from '../platform/host';\nimport { createRevoltAPI } from '../api/RevoltAPI';\nimport { createRevoltSocket } from '../api/RevoltSocket';\n\nimport { createSocketEventHandlers } from './services/socketEventHandlers';\nimport { createAckScheduler } from './services/ackScheduler';\nimport { installUnreadWatcher } from './services/unreadWatcher';\nimport { sharedRefs } from './sharedRefs';\nimport { messageStore } from './stores/messageStore';\nimport { memberStore } from './stores/memberStore';\n\n/**\n * Bootstrap: creates the Revolt API + WebSocket client, wires socket event\n * handlers to the new stores, and populates sharedRefs. Idempotent for the\n * configured apiUrl.\n */\nexport const initChat = (): void => {\n const { apiUrl, wsUrl, platform } = getChatHost();\n installUnreadWatcher();\n if (sharedRefs.serverUrl === apiUrl && sharedRefs.api) return;\n\n if (sharedRefs.socket) {\n try {\n sharedRefs.socket.destroy();\n } catch (e: unknown) {\n console.error('Failed to disconnect existing socket:', e);\n }\n }\n\n sharedRefs.serverUrl = apiUrl;\n sharedRefs.api = createRevoltAPI(apiUrl, platform);\n sharedRefs.ackChannel = createAckScheduler(sharedRefs.api);\n\n const handlers = createSocketEventHandlers({\n api: sharedRefs.api,\n messageCache: sharedRefs.messageCache,\n typingManager: sharedRefs.typingManager,\n loadMessages: (roomId, roomType) => messageStore.getState().loadMessages(roomId, roomType),\n simulateTyping: (userKey, isTyping, displayName) =>\n memberStore.getState().simulateTyping(userKey, isTyping, displayName),\n });\n\n sharedRefs.socket = createRevoltSocket({ apiUrl, wsUrl, platform }, handlers, (userId: string) =>\n memberStore.getState().getMemberById(userId)\n );\n};\n","import { createStore } from 'zustand/vanilla';\n\ntype ChatToastData = {\n title: string;\n content?: string;\n};\n\ntype ChatToastStore = {\n toastsById: Record<string, ChatToastData>;\n\n setToast: (toastId: string, data: ChatToastData) => void;\n removeToast: (toastId: string) => void;\n};\n\n// The @corva/ui notification host can't update an already-created toast, so\n// grouped toasts re-render their counter in place by subscribing to this store.\nexport const chatToastStore = createStore<ChatToastStore>()(set => ({\n toastsById: {},\n\n setToast: (toastId, data) =>\n set(state => ({ toastsById: { ...state.toastsById, [toastId]: data } })),\n removeToast: toastId =>\n set(state => {\n const { [toastId]: _omit, ...rest } = state.toastsById;\n return { toastsById: rest };\n }),\n}));\n","import type { CorvaUser } from '../../types/corvaIntegration';\nimport { initChat } from '../init';\nimport { sharedRefs } from '../sharedRefs';\nimport { authStore } from '../stores/authStore';\n\nimport { SessionManager } from './sessionManager';\n\nconst REAUTH_COOLDOWN_MS = 30_000;\nconst FAILED_LOGIN_COOLDOWN_MS = 30_000;\nconst MAX_REAUTH_ROUNDS = 3;\nconst REAUTH_ROUND_WINDOW_MS = 5 * 60_000;\n\nlet inFlight: Promise<boolean> | null = null;\nlet lastCorvaUser: CorvaUser | null = null;\nlet reauthenticating = false;\nlet lastReauthAt = 0;\nlet reauthRounds = 0;\nlet lastFailedLoginAt = 0;\n\n// An accepted session ends the current run of rejections.\nauthStore.subscribe((state, previous) => {\n if (state.isConnected && !previous.isConnected) reauthRounds = 0;\n});\n\n// Re-login for the same Corva user without wiping the stores; the reconnect resyncs the room.\nexport async function handleUnauthorized(): Promise<void> {\n const { user, loginWithCorva, connectionGaveUp } = authStore.getState();\n if (reauthenticating || connectionGaveUp || !user || !lastCorvaUser) return;\n\n const now = Date.now();\n if (now - lastReauthAt < REAUTH_COOLDOWN_MS) return;\n reauthRounds = now - lastReauthAt < REAUTH_ROUND_WINDOW_MS ? reauthRounds + 1 : 1;\n lastReauthAt = now;\n\n if (reauthRounds > MAX_REAUTH_ROUNDS) {\n console.error('Chat session keeps being rejected; giving up until reload');\n sharedRefs.socket?.disconnect();\n authStore.setState({ isConnected: false, connectionGaveUp: true });\n return;\n }\n\n reauthenticating = true;\n try {\n SessionManager.clear();\n await loginWithCorva(lastCorvaUser);\n } finally {\n reauthenticating = false;\n }\n}\n\n// Shared by the background init and the panel hook so they cannot double-login.\nexport function ensureChatSession(corvaUser: CorvaUser): Promise<boolean> {\n lastCorvaUser = corvaUser;\n initChat();\n sharedRefs.api?.setUnauthorizedHandler(() => {\n handleUnauthorized().catch(error => console.error('Chat re-authentication failed', error));\n });\n\n if (authStore.getState().user) return Promise.resolve(true);\n if (inFlight) return inFlight;\n // The hooks re-run on every Redux user identity change.\n if (Date.now() - lastFailedLoginAt < FAILED_LOGIN_COOLDOWN_MS) return Promise.resolve(false);\n\n inFlight = (async () => {\n const { restoreSession, loginWithCorva } = authStore.getState();\n try {\n if (await restoreSession()) return true;\n const { success } = await loginWithCorva(corvaUser);\n if (!success) lastFailedLoginAt = Date.now();\n return success;\n } catch (error) {\n lastFailedLoginAt = Date.now();\n throw error;\n }\n })().finally(() => {\n inFlight = null;\n });\n\n return inFlight;\n}\n"]}
1
+ {"version":3,"sources":["../src/types/alert.ts","../src/types/appComment.ts","../src/types/corvaSystemMessage.ts","../src/constants/constants.ts","../src/utils/alertMessageAsText.ts","../src/utils/buildGroupChannelName.ts","../src/utils/isSystemMessage.ts","../src/utils/canDeleteMessage.ts","../src/utils/canEditMessage.ts","../src/utils/channelToAsset.ts","../src/utils/chatAssetPermissionsSnapshot.ts","../src/utils/isUnread.ts","../src/utils/compareByActivity.ts","../src/utils/compareByName.ts","../src/utils/createLatestWinsQueue.ts","../src/utils/dateLabels.ts","../src/utils/deriveChatAsset.ts","../src/utils/getAssetTypeFromDisplayName.ts","../src/utils/getReactionCount.ts","../src/utils/getRoomDisplayName.ts","../src/utils/getUserDisplayName.ts","../src/utils/getSystemMessageWithCorvaNames.ts","../src/utils/getUserSecondaryText.ts","../src/utils/hasReactions.ts","../src/utils/hasUserReacted.ts","../src/utils/isAlertMessage.ts","../src/utils/isAppCommentMessage.ts","../src/utils/isAskCorvaMessage.ts","../src/utils/isDmGroup.ts","../src/utils/isForwardedMessage.ts","../src/utils/isGeneralRoom.ts","../src/utils/isSoftDeletedMessage.ts","../src/utils/isUserOnline.ts","../src/utils/isVisibleUnread.ts","../src/utils/parseCorvaSystemMessage.ts","../src/utils/searchMessages.ts","../src/utils/searchRooms.ts","../src/utils/searchUsers.ts","../src/utils/sortByRecency.ts","../src/utils/sortChannels.ts","../src/utils/sortDMs.ts","../src/utils/sortMessagesByTime.ts","../src/utils/sortUsersByStatus.ts","../src/utils/stripPlatformMentions.ts","../src/utils/ulidTimestamp.ts","../src/utils/validateChannelName.ts","../src/platform/types.ts","../src/api/core/http.ts","../src/api/modules/auth.ts","../src/api/modules/users.ts","../src/api/socket/transforms/messageTransform.ts","../src/api/modules/messages.ts","../src/api/modules/channels.ts","../src/api/modules/reactions.ts","../src/api/modules/attachments.ts","../src/api/modules/directMessages.ts","../src/api/modules/groups.ts","../src/api/RevoltAPI.ts","../src/api/socket/core/connection.ts","../src/api/socket/services/userCache.ts","../src/api/socket/handlers/messageHandlers.ts","../src/api/socket/handlers/eventRouter.ts","../src/api/socket/services/reconnection.ts","../src/api/RevoltSocket.ts","../src/platform/storage.ts","../src/store/services/sessionManager.ts","../src/store/services/lastRoomTracker.ts","../src/store/services/messageCache.ts","../src/store/services/messageLocator.ts","../src/store/services/typingManager.ts","../src/store/services/roomTaskQueue.ts","../src/store/utils/messageOperations.ts","../src/store/utils/messageHelpers.ts","../src/store/utils/subscriptionOperations.ts","../src/platform/host.ts","../src/utils/isDeepEqual.ts","../src/utils/notificationPause.ts","../src/utils/waitForNextPaint.ts","../src/api/modules/assetChats.ts","../src/services/corvaUserService.ts","../src/store/sharedRefs.ts","../src/store/stores/notificationStore.ts","../src/store/stores/channelContentFilterStore.ts","../src/store/stores/favoriteRoomsStore.ts","../src/store/services/roomSelectionCoordinator.ts","../src/store/stores/memberStore.ts","../src/store/stores/assetStore.ts","../src/store/stores/navigationHistoryStore.ts","../src/store/stores/roomStore.ts","../src/store/stores/uiStore.ts","../src/store/stores/authStore.ts","../src/store/stores/messageStore.ts","../src/store/services/socketEventHandlers.ts","../src/store/services/ackScheduler.ts","../src/store/services/unreadWatcher.ts","../src/store/init.ts","../src/store/stores/chatToastStore.ts","../src/store/services/chatSession.ts"],"names":["suffix","inFlight","me","searchUsers","userCache","url","message","handlers","getDisplayName","response","uploadedFiles","uuid","createStore","members","getInitialState","setChatError","isSystemMessage"],"mappings":"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","file":"index.js","sourcesContent":["export const ALERT_SEVERITY = {\n CRITICAL: 'critical',\n WARNING: 'warning',\n INFO: 'info',\n} as const;\n\nexport type AlertSeverity = (typeof ALERT_SEVERITY)[keyof typeof ALERT_SEVERITY];\n\nexport interface AlertData {\n alertId: string;\n alertDefinitionId?: string;\n severity: AlertSeverity;\n rig?: {\n id: string;\n name: string;\n };\n title: string;\n description: string;\n isTruncated?: boolean;\n details?: string;\n detailsUrl?: string;\n appName?: string;\n assetId?: string;\n assetName?: string;\n}\n","export interface AppCommentAttachment {\n url: string;\n /** Original file name (with extension), used to tell images apart from other file types. */\n name?: string;\n /** File size in bytes, shown next to the name for non-media attachments. */\n size?: number;\n}\n\nexport interface AppCommentData {\n body: string;\n appName?: string;\n authorCorvaId?: number;\n forwarderCorvaId?: number;\n activityType?: string;\n activityId?: string;\n attachments?: AppCommentAttachment[];\n /** @deprecated Use `attachments`. Kept so messages sent before multi-attachment still render. */\n attachmentUrl?: string;\n /** @deprecated Use `attachments`. */\n attachmentName?: string;\n /** @deprecated Use `attachments`. */\n attachmentSize?: number;\n appId?: string;\n dashboardId?: string;\n appUrl?: string;\n /** Structured metadata — depth values in ft, formatted at render time in the viewer's preferred unit. */\n metadata?: { holeDepth?: number; bitDepth?: number; commentDepth?: number };\n settingsSnapshotId?: string;\n isTruncated?: boolean;\n /** Transient: app settings at forward time. Saved to snapshot storage, never sent in the message. */\n settings?: Record<string, unknown>;\n}\n\n/** Single source of truth for reading a comment's files, whichever field the sender populated. */\nexport function getAppCommentAttachments(data: AppCommentData): AppCommentAttachment[] {\n if (data.attachments?.length) return data.attachments.filter(file => !!file?.url);\n\n return data.attachmentUrl\n ? [{ url: data.attachmentUrl, name: data.attachmentName, size: data.attachmentSize }]\n : [];\n}\n\n/** A single file shared to channels as a new message, rather than forwarded with its comment. */\nexport interface SharedFile {\n url: string;\n name: string;\n type?: string;\n /** Worked out from the file name upstream; more reliable than a stored MIME type. */\n kind?: 'image' | 'video' | 'file';\n}\n","export const CORVA_SYS_PREFIX = '$$CORVA::';\n\nexport const CORVA_MESSAGE_TYPES = {\n ALERT: 'alert',\n FEED: 'feed',\n ASK_CORVA: 'ask',\n FORWARD: 'fwd',\n APP_COMMENT: 'cmt',\n} as const;\n\nexport interface ForwardWirePayload {\n cid: string;\n mid: string;\n cn: string;\n priv: boolean;\n n?: string;\n ts?: string; // ISO timestamp of the original message\n}\n\nexport type CorvaSystemMessage =\n | { t: typeof CORVA_MESSAGE_TYPES.ALERT; v: number; d: AlertWirePayload }\n | { t: typeof CORVA_MESSAGE_TYPES.FEED; v: number; d: FeedWirePayload }\n | { t: typeof CORVA_MESSAGE_TYPES.ASK_CORVA; v: number; d: AskCorvaWirePayload }\n | { t: typeof CORVA_MESSAGE_TYPES.FORWARD; v: number; d: ForwardWirePayload }\n | { t: typeof CORVA_MESSAGE_TYPES.APP_COMMENT; v: number; d: AppCommentWirePayload };\n\nexport type WireSeverity = 'c' | 'w' | 'i';\n\nexport interface AlertWirePayload {\n id: string;\n defId?: string;\n sev: WireSeverity;\n ttl: string;\n dsc: string;\n trunc?: boolean;\n app?: string;\n assetId?: string;\n assetName?: string;\n}\n\nexport interface FeedWirePayload {\n id: string;\n ft: string;\n ttl: string;\n dsc?: string;\n assetId?: string;\n usr?: string;\n}\n\nexport interface AskCorvaWirePayload {\n id: string;\n a: string;\n aRef?: string; // conversationId — fetch full answer from AskCorva backend when `a` is empty\n cId?: number; // sharer's company_id — askcorva.history records live under it, not the viewer's\n trunc?: boolean;\n assetId?: number;\n agentName?: string; // human-readable agent display name\n}\n\n/**\n * One attachment on the wire. Keys are single letters like every other field in these payloads:\n * they ride inside the message body, which is truncated at MAX_COMMENT_BODY_LENGTH.\n */\ninterface AttachmentWirePayload {\n /** Attachment URL. */\n u: string;\n /** Original file name, with extension — lets the reader tell media apart from documents. */\n n?: string;\n /** File size in bytes. */\n s?: number;\n}\n\nexport interface AppCommentWirePayload {\n body: string;\n app?: string; // app display name\n usrId?: number; // forwarder corva user ID\n autId?: number; // comment author corva user ID\n at?: string; // activity type (e.g. \"dvd_comment\")\n att?: string; // first attachment URL — kept so pre-multi-attachment clients still render one file\n atts?: AttachmentWirePayload[];\n actId?: string; // activity ID for lazy-fetching full content\n appId?: string; // app definition ID for icon/info fetching\n dashId?: string; // dashboard ID for deep linking\n appUrl?: string; // full app URL with asset context\n meta?: { hd?: number; bd?: number; cd?: number }; // raw depth values in ft for viewer-side unit conversion\n snpId?: string; // settings snapshot ID — replaces dashboard-based settings fetching\n trunc?: boolean; // body was truncated, fetch full content from activity API\n}\n","import type { ChatAssetType, SelectableAssetType } from '../types/asset';\n\n// Lowercase name prefixes the backend uses for system-created asset chats\n// (\"Rig: …\" / \"Fleet: …\" / \"Unit: …\").\nexport const ASSET_CHAT_PREFIXES: Record<ChatAssetType, string> = {\n rig: 'rig: ',\n frac_fleet: 'fleet: ',\n intervention_unit: 'unit: ',\n};\n\n// Human-readable noun per selectable asset type.\nexport const ASSET_NOUN: Record<SelectableAssetType, string> = {\n rig: 'Rig',\n frac_fleet: 'Fleet',\n intervention_unit: 'Unit',\n well: 'Well',\n};\n\n// jsonApi field lists per chat asset type, shared by the list and by-id fetchers.\nexport const ASSET_API_FIELDS: Record<ChatAssetType, string[]> = {\n rig: ['rig.id', 'rig.name'],\n frac_fleet: ['frac_fleet.id', 'frac_fleet.name'],\n intervention_unit: ['intervention_unit.id', 'intervention_unit.name'],\n};\n\n// Mention patterns\nexport const MENTION_REPLACE_PATTERN = /@[a-zA-Z0-9_.+-]*$/;\nexport const MENTION_SPLIT_PATTERN = /(\\B@[a-zA-Z0-9_.+-]+)/g;\n\n// Revolt system/null user ID - used to identify system messages and invalid users\nexport const REVOLT_SYSTEM_USER_ID = '00000000000000000000000000';\n\n// System message text templates\nexport const SYSTEM_MESSAGE_TEXTS = {\n USER_ADDED: (by: string, user: string) => `${by} added ${user} to the channel`,\n USER_REMOVED: (by: string, user: string) => `${user} was removed from this channel by ${by}`,\n USER_LEFT: (user: string) => `${user} left the channel`,\n MESSAGE_PINNED: (user: string) => `${user} pinned a message`,\n MESSAGE_UNPINNED: (user: string) => `${user} unpinned a message`,\n DEFAULT_USER: 'User',\n} as const;\n\n// Revolt channel types\nexport const CHANNEL_TYPES = {\n DIRECT_MESSAGE: 'DirectMessage',\n GROUP: 'Group',\n TEXT_CHANNEL: 'TextChannel',\n SAVED_MESSAGES: 'SavedMessages',\n} as const;\n\nexport const GENERAL_CHAT_NAME = 'General';\nexport const CHANNEL_NAME_MAX_LENGTH = 32;\n\nexport const SIDEBAR_SECTIONS = {\n FAVORITES: 'favorites',\n CHANNELS: 'channels',\n DIRECT: 'direct',\n} as const;\n\nexport type SidebarSectionKey = (typeof SIDEBAR_SECTIONS)[keyof typeof SIDEBAR_SECTIONS];\n\nexport const SIDEBAR_TABS = {\n ALL: 'all',\n UNREAD: 'unread',\n RECENT: 'recent',\n} as const;\n\nexport type SidebarTabKey = (typeof SIDEBAR_TABS)[keyof typeof SIDEBAR_TABS];\n\nexport const ROOM_LIST_ORDER = {\n ALPHABETICAL: 'alphabetical',\n RECENT: 'recent',\n} as const;\n\nexport type RoomListOrder = (typeof ROOM_LIST_ORDER)[keyof typeof ROOM_LIST_ORDER];\n\nexport const DEFAULT_ROOM_LIST_ORDER: RoomListOrder = ROOM_LIST_ORDER.ALPHABETICAL;\n\n// Mirrors the server (Autumn) upper bound so oversized files fail fast with a clear\n// message instead of a slow upload round-trip.\nexport const MAX_ATTACHMENT_SIZE_MB = 500;\nexport const MAX_ATTACHMENT_SIZE_BYTES = MAX_ATTACHMENT_SIZE_MB * 1024 * 1024;\n","import type { Message } from '../types/message';\n\nexport function alertMessageAsText(message: Message): Message {\n const { alert, ...rest } = message;\n return {\n ...rest,\n t: undefined,\n msg: [alert?.title, alert?.description].filter(Boolean).join('\\n'),\n groupable: true,\n };\n}\n","import { CHANNEL_NAME_MAX_LENGTH } from '../constants/constants';\n\n/**\n * Builds a group channel name from an ordered list of display names, fitting\n * within the backend's 32-character limit.\n *\n * Strategy (in order):\n * 1. Full display names joined by \", \"\n * 2. First names only joined by \", \"\n * 3. As many first names as fit + \", and N others\"\n * 4. Single (possibly truncated) first name + \", and N others\"\n */\nexport function buildGroupChannelName(displayNames: string[]): string {\n const fullName = displayNames.join(', ');\n if (fullName.length <= CHANNEL_NAME_MAX_LENGTH) return fullName;\n\n const firstNames = displayNames.map(n => n.split(' ')[0]);\n const firstNamesJoined = firstNames.join(', ');\n if (firstNamesJoined.length <= CHANNEL_NAME_MAX_LENGTH) return firstNamesJoined;\n\n let result = '';\n for (let i = 1; i < firstNames.length; i += 1) {\n const remaining = firstNames.length - i;\n const suffix = `, and ${remaining} other${remaining > 1 ? 's' : ''}`;\n const candidate = firstNames.slice(0, i).join(', ') + suffix;\n if (candidate.length <= CHANNEL_NAME_MAX_LENGTH) {\n result = candidate;\n } else {\n break;\n }\n }\n if (result) return result;\n\n const others = firstNames.length - 1;\n const suffix = `, and ${others} other${others > 1 ? 's' : ''}`;\n return `${(firstNames[0] ?? '').slice(0, CHANNEL_NAME_MAX_LENGTH - suffix.length)}${suffix}`;\n}\n","import type { Message } from '../types/message';\nimport { CORVA_MESSAGE_TYPES } from '../types/corvaSystemMessage';\n\nconst CORVA_TYPES: string[] = Object.values(CORVA_MESSAGE_TYPES);\n\nexport const isSystemMessage = (message: Message): boolean => {\n if (!message.t || message.t === 'message') return false;\n if (CORVA_TYPES.includes(message.t)) return false;\n return true;\n};\n","import type { Message } from '../types/message';\n\nimport { isSystemMessage } from './isSystemMessage';\n\nexport const canDeleteMessage = (message: Message, currentUserId: string): boolean => {\n return message.u._id === currentUserId && !isSystemMessage(message);\n};\n","import type { Message } from '../types/message';\n\nimport { isSystemMessage } from './isSystemMessage';\n\nexport const canEditMessage = (message: Message, currentUserId: string): boolean => {\n return message.u._id === currentUserId && !isSystemMessage(message);\n};\n","import type { AssetChatChannel, ChatAssetType } from '../types/asset';\n\nexport interface ChannelAsset {\n assetId: number;\n assetType: ChatAssetType;\n}\n\nexport function channelToAsset(channel: AssetChatChannel): ChannelAsset | null {\n if (channel.rig_id != null) return { assetId: channel.rig_id, assetType: 'rig' };\n if (channel.frac_fleet_id != null) {\n return { assetId: channel.frac_fleet_id, assetType: 'frac_fleet' };\n }\n if (channel.intervention_unit_id != null) {\n return { assetId: channel.intervention_unit_id, assetType: 'intervention_unit' };\n }\n return null;\n}\n","import type { AssetChatChannel, ChatAssetType } from '../types/asset';\n\nimport { channelToAsset } from './channelToAsset';\n\n// Non-React snapshot of the per-segment chat permissions, written by\n// useChatPermissions once the ability checks resolve. Lets stores and services\n// (room auto-restore, permalinks, notification toasts) gate asset chats the\n// same way the React consumers of useDisallowedAssetChatIds do. While the\n// snapshot is unset (permissions still loading) every asset chat is treated as\n// disallowed, so a socket message cannot surface a chat the user may not see.\nlet allowedAssetTypesSnapshot: ChatAssetType[] | null = null;\n\nexport function setAllowedChatAssetTypes(assetTypes: ChatAssetType[]): void {\n allowedAssetTypesSnapshot = assetTypes;\n}\n\nexport function isChatAssetTypeAllowed(assetType: ChatAssetType): boolean {\n return !!allowedAssetTypesSnapshot?.includes(assetType);\n}\n\nexport function isDisallowedAssetChatRoom(\n roomId: string,\n assetChatChannels: AssetChatChannel[]\n): boolean {\n const channel = assetChatChannels.find(c => c.revolt_channel_id === roomId);\n const asset = channel ? channelToAsset(channel) : null;\n return !!asset && !isChatAssetTypeAllowed(asset.assetType);\n}\n\nexport function resetChatAssetPermissionsSnapshot(): void {\n allowedAssetTypesSnapshot = null;\n}\n","import type { Subscription } from '../types/subscription';\n\n// Channel is unread when there's a newer message than what the user has\n// acknowledged. Revolt message IDs are ULIDs — lexicographic comparison is\n// chronological. Mirrors Stoat's derived `channel.unread`.\nexport function isUnread(\n sub: Pick<Subscription, 'last_message_id' | 'last_acked_message_id'>\n): boolean {\n if (!sub.last_message_id) return false;\n const acked = sub.last_acked_message_id ?? '0';\n return acked < sub.last_message_id;\n}\n","import type { Subscription } from '../types/subscription';\n\nimport { isUnread } from './isUnread';\n\n/**\n * Comparator factory for subscription lists: unread first, then by last activity\n * (last_message_id descending — ULIDs are lexicographically time-sortable), then\n * alphabetically by the name returned from getName.\n */\nexport const compareByActivity =\n (getName: (sub: Subscription) => string) =>\n (a: Subscription, b: Subscription): number => {\n const aUnread = isUnread(a) ? 0 : 1;\n const bUnread = isUnread(b) ? 0 : 1;\n if (aUnread !== bUnread) return aUnread - bUnread;\n\n const aLast = a.last_message_id || '';\n const bLast = b.last_message_id || '';\n if (aLast !== bLast) return aLast > bLast ? -1 : 1;\n\n return getName(a).toLowerCase().localeCompare(getName(b).toLowerCase());\n };\n","import type { Subscription } from '../types/subscription';\n\nexport const compareByName =\n (getName: (sub: Subscription) => string) =>\n (a: Subscription, b: Subscription): number =>\n getName(a).toLowerCase().localeCompare(getName(b).toLowerCase());\n","// One request in flight; anything queued meanwhile collapses to the newest value.\nexport function createLatestWinsQueue<T>(send: (value: T) => Promise<unknown> | void) {\n let inFlight = false;\n let pending: { value: T } | null = null;\n\n const flush = (): void => {\n if (!pending) {\n inFlight = false;\n return;\n }\n const { value } = pending;\n pending = null;\n inFlight = true;\n // Executor runs synchronously; a sync throw becomes a rejection instead of stalling the queue.\n new Promise<unknown>(resolve => resolve(send(value))).catch(() => undefined).then(flush);\n };\n\n return (value: T): void => {\n pending = { value };\n if (!inFlight) flush();\n };\n}\n","export const DATE_SEPARATOR_LABELS = {\n TODAY: 'Today',\n YESTERDAY: 'Yesterday',\n} as const;\n","import type { ChatAssetType } from '../types/asset';\n\nexport interface ChatAssetIdentity {\n assetId: string;\n assetType: ChatAssetType;\n}\n\n// Asset chats are keyed by the parent asset of the dashboard:\n// drilling/drillout -> rig, completion -> frac fleet, intervention -> intervention unit.\nfunction deriveChatAsset(\n segment: string | null | undefined,\n rigId: number | null | undefined,\n fracFleetId: number | null | undefined,\n interventionUnitId: number | null | undefined\n): ChatAssetIdentity | null {\n if ((segment === 'drilling' || segment === 'drillout') && rigId) {\n return { assetId: String(rigId), assetType: 'rig' };\n }\n if (segment === 'intervention' && interventionUnitId) {\n return { assetId: String(interventionUnitId), assetType: 'intervention_unit' };\n }\n if (segment === 'completion' && fracFleetId) {\n return { assetId: String(fracFleetId), assetType: 'frac_fleet' };\n }\n return null;\n}\n\n// A dashboard asset in a segment the user has no chat permission for behaves\n// like a dashboard with no chat asset at all.\nexport function deriveAllowedChatAsset(\n segment: string | null | undefined,\n rigId: number | null | undefined,\n fracFleetId: number | null | undefined,\n interventionUnitId: number | null | undefined,\n allowedAssetTypes: ChatAssetType[]\n): ChatAssetIdentity | null {\n const asset = deriveChatAsset(segment, rigId, fracFleetId, interventionUnitId);\n if (!asset || !allowedAssetTypes.includes(asset.assetType)) {\n return null;\n }\n return asset;\n}\n","import type { ChatAssetType } from '../types/asset';\nimport { ASSET_CHAT_PREFIXES } from '../constants/constants';\n\n/**\n * Infers asset type from room display name. Asset chat names use\n * \"Rig: ...\" / \"Fleet: ...\" / \"Unit: ...\" prefixes.\n * Returns null if the name does not match.\n */\nexport function getAssetTypeFromDisplayName(displayName: string): ChatAssetType | null {\n const lower = displayName.toLowerCase();\n const entry = Object.entries(ASSET_CHAT_PREFIXES).find(([, prefix]) => lower.startsWith(prefix));\n return entry ? (entry[0] as ChatAssetType) : null;\n}\n","import type { Message } from '../types/message';\n\nexport const getReactionCount = (message: Message, emoji: string): number => {\n return message.reactions?.[emoji]?.userIds?.length || 0;\n};\n","import type { Room } from '../types/room';\nimport type { Subscription } from '../types/subscription';\nimport { ASSET_CHAT_PREFIXES } from '../constants/constants';\n\nexport const DIRECT_MESSAGE_PLACEHOLDER = 'Direct Message';\n\n/**\n * Strips the system prefix from asset chat names: \"Rig: AssetName\" /\n * \"Fleet: AssetName\" / \"Unit: AssetName\" display as just \"AssetName\".\n */\nexport function formatAssetChatName(name: string): string {\n const lower = name.toLowerCase();\n const prefix = Object.values(ASSET_CHAT_PREFIXES).find(p => lower.startsWith(p));\n return prefix ? name.slice(prefix.length) : name;\n}\n\nexport const getRoomDisplayName = (room: Room | Subscription): string => {\n if (room.t === 'd' && room.dmUsername && room.dmUsername !== DIRECT_MESSAGE_PLACEHOLDER) {\n return room.dmUsername;\n }\n if ('fname' in room && room.fname) return formatAssetChatName(room.fname);\n if (room.name) return formatAssetChatName(room.name);\n return 'Unknown Room';\n};\n","import type { User } from '../types/user';\n\nexport const getUserDisplayName = (user: Partial<User>): string => {\n return user.displayName || user.name || user.username || 'Unknown User';\n};\n","import type { Message } from '../types/message';\nimport type { User } from '../types/user';\nimport { SYSTEM_MESSAGE_TEXTS } from '../constants/constants';\n\nimport { getUserDisplayName } from './getUserDisplayName';\n\nconst resolveDisplayName = (\n userId: string | undefined,\n getUserById: (userId: string) => User | undefined\n): string | null => {\n if (!userId) return null;\n const user = getUserById(userId);\n return user ? getUserDisplayName(user) : null;\n};\n\nexport const getSystemMessageWithCorvaNames = (\n message: Message,\n getUserById: (userId: string) => User | undefined\n): string => {\n if (message.systemUsers) {\n const { userId, actorId } = message.systemUsers;\n\n // Only enrich when all referenced users resolve; otherwise fall back to\n // the prebaked msg (e.g. after removal, the user is gone from the cache).\n const actorName = actorId ? resolveDisplayName(actorId, getUserById) : null;\n const userName = userId ? resolveDisplayName(userId, getUserById) : null;\n const actorOk = !actorId || actorName !== null;\n const userOk = !userId || userName !== null;\n\n if (!actorOk || !userOk) {\n if (message.msg) return message.msg;\n } else {\n switch (message.t) {\n case 'au':\n return SYSTEM_MESSAGE_TEXTS.USER_ADDED(actorName ?? '', userName ?? '');\n case 'ru':\n return SYSTEM_MESSAGE_TEXTS.USER_REMOVED(actorName ?? '', userName ?? '');\n case 'ul':\n return SYSTEM_MESSAGE_TEXTS.USER_LEFT(userName ?? '');\n case 'message_pinned':\n return SYSTEM_MESSAGE_TEXTS.MESSAGE_PINNED(actorName ?? '');\n case 'message_unpinned':\n return SYSTEM_MESSAGE_TEXTS.MESSAGE_UNPINNED(actorName ?? '');\n default:\n break;\n }\n }\n }\n\n if (message.msg && message.u.username === 'system') {\n return message.msg;\n }\n\n return message.msg || 'System message';\n};\n","import type { User } from '../types/user';\n\n/**\n * Returns a secondary text for a user (typically shown below the display name).\n * Format: \"email | title/role\" or just \"title/role\" or \"@username\"\n */\nexport const getUserSecondaryText = (user: Partial<User>): string | undefined => {\n const titleOrRole = user.title || user.role;\n const { email } = user;\n\n if (email && titleOrRole) {\n return `${email} | ${titleOrRole}`;\n }\n\n if (email) return email;\n if (titleOrRole) return titleOrRole;\n if (user.username) return `@${user.username}`;\n\n return undefined;\n};\n","import type { Message } from '../types/message';\n\nexport const hasReactions = (message: Message): boolean => {\n return !!message.reactions && Object.keys(message.reactions).length > 0;\n};\n","import type { Message } from '../types/message';\n\nexport const hasUserReacted = (\n message: Message,\n emoji: string,\n _username: string,\n currentUserId?: string\n): boolean => {\n if (!currentUserId) return false;\n return message.reactions?.[emoji]?.userIds?.includes(currentUserId) || false;\n};\n","import type { Message } from '../types/message';\nimport { CORVA_MESSAGE_TYPES } from '../types/corvaSystemMessage';\n\nexport function isAlertMessage(message: Message): boolean {\n return message.t === CORVA_MESSAGE_TYPES.ALERT || !!message.alert;\n}\n","import type { Message } from '../types/message';\nimport { CORVA_MESSAGE_TYPES } from '../types/corvaSystemMessage';\n\nexport function isAppCommentMessage(message: Message): boolean {\n return message.t === CORVA_MESSAGE_TYPES.APP_COMMENT || !!message.appComment;\n}\n","import type { Message } from '../types/message';\nimport { CORVA_MESSAGE_TYPES } from '../types/corvaSystemMessage';\n\nexport function isAskCorvaMessage(message: Message): boolean {\n return message.t === CORVA_MESSAGE_TYPES.ASK_CORVA || !!message.askCorva;\n}\n","import type { Subscription } from '../types/subscription';\n\n// Group DMs are private rooms whose name is the comma-joined member list.\nexport const isDmGroup = (sub: Subscription) => sub.t === 'p' && sub.name.includes(', ');\n","import type { Message } from '../types/message';\nimport { CORVA_MESSAGE_TYPES } from '../types/corvaSystemMessage';\n\nexport function isForwardedMessage(message: Message): boolean {\n return message.t === CORVA_MESSAGE_TYPES.FORWARD || !!message.forwardedFrom;\n}\n","import { GENERAL_CHAT_NAME } from '../constants/constants';\n\n/**\n * Identifies the \"General\" room (backend-created channel). Name is \"General\" only.\n */\nexport function isGeneralRoom(room: { name?: string; fname?: string } | null | undefined): boolean {\n if (!room) return false;\n const name = (room.fname || room.name || '').toLowerCase();\n return name === GENERAL_CHAT_NAME.toLowerCase();\n}\n\n/**\n * Find the General room from a list. General is always a channel (t === 'c').\n */\nexport function findGeneralRoom<\n T extends { _id: string; name?: string; fname?: string; t?: string },\n>(rooms: T[]): T | undefined {\n return rooms.find(r => isGeneralRoom(r) && r.t === 'c');\n}\n","import type { Message } from '../types/message';\n\nexport const SOFT_DELETE_MARKER = '[sysmessage: deleted]';\n\nexport const isSoftDeletedMessage = (message: Message): boolean => {\n if (message.deleted) return true;\n return message.msg.startsWith(SOFT_DELETE_MARKER);\n};\n\nexport const createSoftDeletedMessage = (message: Message): Message => {\n return {\n ...message,\n deleted: true,\n msg: SOFT_DELETE_MARKER,\n attachments: undefined,\n file: undefined,\n reactions: undefined,\n };\n};\n","import type { User } from '../types/user';\n\nexport function isUserOnline(user: User): boolean {\n return user.status === 'online' || user.statusConnection === 'online';\n}\n","import type { Subscription } from '../types/subscription';\n\nimport { isUnread } from './isUnread';\n\n// Shared by the panel badge and Mark All As Read so they never disagree.\nexport function isVisibleUnread(\n sub: Subscription,\n isRoomDisallowed: (roomId: string) => boolean\n): boolean {\n return sub.open !== false && !isRoomDisallowed(sub.rid) && isUnread(sub);\n}\n","import type { Message, ForwardedFrom } from '../types/message';\nimport type { AlertData, AlertSeverity } from '../types/alert';\nimport { ALERT_SEVERITY } from '../types/alert';\nimport type { FeedItemData } from '../types/feedItem';\nimport type { AskCorvaData } from '../types/askCorva';\nimport { getAppCommentAttachments, type AppCommentData } from '../types/appComment';\nimport type {\n CorvaSystemMessage,\n AlertWirePayload,\n FeedWirePayload,\n AskCorvaWirePayload,\n ForwardWirePayload,\n AppCommentWirePayload,\n WireSeverity,\n} from '../types/corvaSystemMessage';\nimport { CORVA_SYS_PREFIX, CORVA_MESSAGE_TYPES } from '../types/corvaSystemMessage';\n\nconst WIRE_SEVERITY_MAP: Record<WireSeverity, AlertSeverity> = {\n c: ALERT_SEVERITY.CRITICAL,\n w: ALERT_SEVERITY.WARNING,\n i: ALERT_SEVERITY.INFO,\n};\n\nfunction mapAlertPayload(d: AlertWirePayload): AlertData {\n return {\n alertId: d.id,\n alertDefinitionId: d.defId,\n severity: WIRE_SEVERITY_MAP[d.sev] || ALERT_SEVERITY.INFO,\n title: d.ttl,\n description: d.dsc,\n isTruncated: d.trunc,\n appName: d.app,\n assetId: d.assetId,\n assetName: d.assetName,\n };\n}\n\nfunction mapFeedPayload(d: FeedWirePayload): FeedItemData {\n return {\n feedItemId: d.id,\n feedType: d.ft,\n title: d.ttl,\n description: d.dsc,\n assetId: d.assetId,\n author: d.usr,\n };\n}\n\nfunction mapAskCorvaPayload(d: AskCorvaWirePayload): AskCorvaData {\n return {\n responseId: d.id,\n answer: d.a,\n answerRef: d.aRef,\n companyId: d.cId,\n isTruncated: d.trunc,\n assetId: d.assetId,\n agentName: d.agentName,\n };\n}\n\nfunction mapForwardPayload(d: ForwardWirePayload): ForwardedFrom {\n return {\n channelId: d.cid,\n messageId: d.mid,\n channelName: d.cn,\n isPrivate: d.priv,\n note: d.n || undefined,\n ...(d.ts && { ts: d.ts }),\n };\n}\n\nfunction mapAppCommentPayload(d: AppCommentWirePayload): AppCommentData {\n return {\n body: d.body,\n appName: d.app,\n authorCorvaId: d.autId,\n forwarderCorvaId: d.usrId,\n activityType: d.at,\n attachments: d.atts?.length\n ? d.atts.filter(file => !!file?.u).map(file => ({ url: file.u, name: file.n, size: file.s }))\n : undefined,\n attachmentUrl: d.att,\n activityId: d.actId,\n appId: d.appId,\n dashboardId: d.dashId,\n appUrl: d.appUrl,\n metadata: d.meta\n ? { holeDepth: d.meta.hd, bitDepth: d.meta.bd, commentDepth: d.meta.cd }\n : undefined,\n settingsSnapshotId: d.snpId,\n isTruncated: d.trunc,\n };\n}\n\ninterface ParsedCorvaMessage {\n messageType: string;\n alert?: AlertData;\n feedItem?: FeedItemData;\n askCorva?: AskCorvaData;\n appComment?: AppCommentData;\n forwardedFrom?: ForwardedFrom;\n}\n\n/**\n * Builds the wire-format content string for an AskCorva response.\n */\nexport function buildAskCorvaMessageContent(\n requestId: string,\n answer: string,\n answerRef?: string,\n isTruncated?: boolean,\n assetId?: number,\n agentName?: string,\n companyId?: number\n): string {\n const payload: AskCorvaWirePayload = {\n id: requestId,\n a: answerRef ? '' : answer,\n ...(answerRef && { aRef: answerRef }),\n ...(answerRef && companyId && { cId: companyId }),\n ...(isTruncated && { trunc: true }),\n ...(assetId && { assetId }),\n ...(agentName && { agentName }),\n };\n return `${CORVA_SYS_PREFIX}${JSON.stringify({ t: CORVA_MESSAGE_TYPES.ASK_CORVA, v: 1, d: payload })}`;\n}\n\n/**\n * Builds the wire-format content string for a forwarded message.\n */\nexport function buildForwardMessageContent(\n sourceChannelId: string,\n messageId: string,\n channelName: string,\n isPrivate: boolean,\n note?: string,\n ts?: string\n): string {\n const payload: ForwardWirePayload = {\n cid: sourceChannelId,\n mid: messageId,\n cn: channelName,\n priv: isPrivate,\n ...(note?.trim() && { n: note.trim() }),\n ...(ts && { ts }),\n };\n return `${CORVA_SYS_PREFIX}${JSON.stringify({ t: CORVA_MESSAGE_TYPES.FORWARD, v: 1, d: payload })}`;\n}\n\nconst MAX_COMMENT_BODY_LENGTH = 2000;\n\nconst toDurableUrl = (url: string): string => {\n const queryIndex = url.indexOf('?');\n return queryIndex === -1 ? url : url.slice(0, queryIndex);\n};\n\n/**\n * Builds the wire-format content string for an app comment forwarded to chat.\n * If the body exceeds MAX_COMMENT_BODY_LENGTH and an activityId is provided,\n * the body is truncated and `trunc` flag is set for lazy-fetching.\n */\nexport function buildAppCommentMessageContent(data: AppCommentData): string {\n const rawBody = data.body ?? '';\n const shouldTruncate = rawBody.length > MAX_COMMENT_BODY_LENGTH && !!data.activityId;\n const body = shouldTruncate ? rawBody.slice(0, MAX_COMMENT_BODY_LENGTH) : rawBody;\n const attachments = getAppCommentAttachments(data);\n const [firstAttachment] = attachments;\n\n const payload: AppCommentWirePayload = {\n body,\n ...(data.appName && { app: data.appName }),\n ...(data.authorCorvaId && { autId: data.authorCorvaId }),\n ...(data.forwarderCorvaId && { usrId: data.forwarderCorvaId }),\n ...(data.activityType && { at: data.activityType }),\n ...(firstAttachment && {\n // `att` keeps pre-multi-attachment clients rendering the first file.\n att: toDurableUrl(firstAttachment.url),\n atts: attachments.map(file => ({\n u: toDurableUrl(file.url),\n ...(file.name && { n: file.name }),\n ...(typeof file.size === 'number' && { s: file.size }),\n })),\n }),\n ...(data.activityId && { actId: data.activityId }),\n ...(data.appId && { appId: data.appId }),\n ...(data.dashboardId && { dashId: data.dashboardId }),\n ...(data.appUrl && { appUrl: data.appUrl }),\n ...(data.metadata && {\n meta: {\n ...(data.metadata.holeDepth != null && { hd: data.metadata.holeDepth }),\n ...(data.metadata.bitDepth != null && { bd: data.metadata.bitDepth }),\n ...(data.metadata.commentDepth != null && { cd: data.metadata.commentDepth }),\n },\n }),\n ...(data.settingsSnapshotId && { snpId: data.settingsSnapshotId }),\n ...((data.isTruncated || shouldTruncate) && { trunc: true }),\n };\n return `${CORVA_SYS_PREFIX}${JSON.stringify({ t: CORVA_MESSAGE_TYPES.APP_COMMENT, v: 1, d: payload })}`;\n}\n\n/**\n * Detects the $$CORVA:: prefix in message content\n * and parses the JSON payload into internal types.\n * Returns null if the content is not a Corva system message.\n */\nexport function parseCorvaSystemMessage(content: string): ParsedCorvaMessage | null {\n if (!content.startsWith(CORVA_SYS_PREFIX)) {\n return null;\n }\n\n let parsed: CorvaSystemMessage;\n try {\n parsed = JSON.parse(content.slice(CORVA_SYS_PREFIX.length));\n } catch {\n return null;\n }\n\n if (!parsed || !parsed.t || !parsed.d) {\n return null;\n }\n\n switch (parsed.t) {\n case CORVA_MESSAGE_TYPES.ALERT:\n return {\n messageType: CORVA_MESSAGE_TYPES.ALERT,\n alert: mapAlertPayload(parsed.d),\n };\n\n case CORVA_MESSAGE_TYPES.FEED:\n return {\n messageType: CORVA_MESSAGE_TYPES.FEED,\n feedItem: mapFeedPayload(parsed.d),\n };\n\n case CORVA_MESSAGE_TYPES.ASK_CORVA:\n return {\n messageType: CORVA_MESSAGE_TYPES.ASK_CORVA,\n askCorva: mapAskCorvaPayload(parsed.d),\n };\n\n case CORVA_MESSAGE_TYPES.FORWARD:\n return {\n messageType: CORVA_MESSAGE_TYPES.FORWARD,\n forwardedFrom: mapForwardPayload(parsed.d),\n };\n\n case CORVA_MESSAGE_TYPES.APP_COMMENT:\n return {\n messageType: CORVA_MESSAGE_TYPES.APP_COMMENT,\n appComment: mapAppCommentPayload(parsed.d),\n };\n\n default:\n return null;\n }\n}\n\n/**\n * If the raw message content is a $$CORVA:: message,\n * enriches the Message object with parsed typed data\n * and sets `t` to the appropriate message type.\n * Returns the message unchanged if it's not a Corva\n * system message.\n */\nexport function enrichWithCorvaData(message: Message): Message {\n const parsed = parseCorvaSystemMessage(message.msg);\n if (!parsed) return message;\n\n return {\n ...message,\n msg: parsed.forwardedFrom?.note || '',\n t: parsed.messageType,\n alert: parsed.alert,\n feedItem: parsed.feedItem,\n askCorva: parsed.askCorva,\n appComment: parsed.appComment,\n forwardedFrom: parsed.forwardedFrom,\n groupable: false,\n };\n}\n","import type { Message } from '../types/message';\n\nconst getSearchableText = (message: Message): string => {\n const parts: string[] = [message.msg || ''];\n\n if (message.alert) {\n parts.push(\n message.alert.title || '',\n message.alert.description || '',\n message.alert.details || '',\n message.alert.rig?.name || ''\n );\n }\n\n if (message.appComment) {\n parts.push(message.appComment.body || '');\n // Matches the card's visible link text, e.g. \"See In Treatment Plot\"\n if (message.appComment.appName) parts.push(`See In ${message.appComment.appName}`);\n }\n\n if (message.feedItem) {\n parts.push(message.feedItem.title || '', message.feedItem.description || '');\n }\n\n if (message.askCorva) {\n parts.push(message.askCorva.answer || '');\n }\n\n return parts.join(' ').toLowerCase();\n};\n\nexport const searchMessages = (messages: Message[], query: string): Message[] => {\n const searchTerm = query.trim().toLowerCase();\n if (!searchTerm) return messages;\n\n return messages.filter(message => {\n // Exclude thread replies (messages that are replies to other messages)\n // Only show main messages in search results\n if (message.replies && message.replies.length > 0) {\n return false;\n }\n\n return getSearchableText(message).includes(searchTerm);\n });\n};\n","import type { Room } from '../types/room';\nimport type { Subscription } from '../types/subscription';\n\nimport { getRoomDisplayName } from './getRoomDisplayName';\n\nexport const searchRooms = (\n rooms: (Room | Subscription)[],\n query: string\n): (Room | Subscription)[] => {\n if (!query.trim()) return rooms;\n\n const searchTerm = query.toLowerCase();\n return rooms.filter(room => {\n const displayName = getRoomDisplayName(room).toLowerCase();\n return displayName.includes(searchTerm);\n });\n};\n","import type { User } from '../types/user';\n\nexport const searchUsers = (users: User[], query: string): User[] => {\n if (!query.trim()) return users;\n\n const searchTerm = query.toLowerCase();\n return users.filter(\n user =>\n user.username.toLowerCase().includes(searchTerm) ||\n (user.name && user.name.toLowerCase().includes(searchTerm))\n );\n};\n","import type { Subscription } from '../types/subscription';\n\nconst CROCKFORD_BASE32 = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';\n\n// The first 10 ULID characters encode the creation time in ms.\nfunction ulidTimeMs(ulid: string): number {\n let ms = 0;\n for (const char of ulid.slice(0, 10)) {\n const value = CROCKFORD_BASE32.indexOf(char);\n if (value === -1) return 0;\n ms = ms * 32 + value;\n }\n return ms;\n}\n\n// ISO timestamps and ULIDs only compare once both are milliseconds.\nfunction getRecencyMs(sub: Subscription): number {\n if (sub.lastMessage?.ts) {\n const parsed = Date.parse(sub.lastMessage.ts);\n if (!Number.isNaN(parsed)) return parsed;\n }\n if (sub.last_message_id) return ulidTimeMs(sub.last_message_id);\n const created = sub.ts ? Date.parse(sub.ts) : NaN;\n return Number.isNaN(created) ? 0 : created;\n}\n\nexport const compareByRecencyDesc = (a: Subscription, b: Subscription): number =>\n getRecencyMs(b) - getRecencyMs(a);\n","import type { Subscription } from '../types/subscription';\nimport { ROOM_LIST_ORDER, type RoomListOrder } from '../constants/constants';\n\nimport { compareByName } from './compareByName';\nimport { compareByRecencyDesc } from './sortByRecency';\nimport { getRoomDisplayName } from './getRoomDisplayName';\nimport { isGeneralRoom } from './isGeneralRoom';\n\n/**\n * Sorts channels: pinned first (asset chat if set, else General), then by the\n * chosen order — alphabetically by name or most recent activity first.\n */\nexport function sortChannels(\n channels: Subscription[],\n assetChatId: string | undefined,\n order: RoomListOrder = ROOM_LIST_ORDER.ALPHABETICAL\n): Subscription[] {\n const list = [...channels];\n\n const pinnedIndex = list.findIndex(sub => {\n if (assetChatId && sub.rid === assetChatId) return true;\n if (!assetChatId && isGeneralRoom(sub)) return true;\n return false;\n });\n\n const pinned = pinnedIndex >= 0 ? list.splice(pinnedIndex, 1)[0]! : null;\n const rest = list;\n\n rest.sort(\n order === ROOM_LIST_ORDER.RECENT ? compareByRecencyDesc : compareByName(getRoomDisplayName)\n );\n\n return pinned ? [pinned, ...rest] : rest;\n}\n","import type { Subscription } from '../types/subscription';\nimport { ROOM_LIST_ORDER, type RoomListOrder } from '../constants/constants';\n\nimport { compareByName } from './compareByName';\nimport { compareByRecencyDesc } from './sortByRecency';\n\n/**\n * Returns the display name to use for alphabetical sorting.\n * Regular DMs use dmUsername; group DMs (t === 'p') use the channel name.\n */\nfunction getDisplayName(sub: Subscription): string {\n return (sub.t === 'p' ? sub.name : sub.dmUsername) ?? '';\n}\n\n/**\n * Sorts DMs and group DMs by the chosen order — alphabetically by display name\n * or most recent activity first.\n */\nexport function sortDMs(\n dms: Subscription[],\n order: RoomListOrder = ROOM_LIST_ORDER.ALPHABETICAL\n): Subscription[] {\n return [...dms].sort(\n order === ROOM_LIST_ORDER.RECENT ? compareByRecencyDesc : compareByName(getDisplayName)\n );\n}\n","import type { Message } from '../types/message';\n\nexport const sortMessagesByTime = (messages: Message[]): Message[] => {\n return [...messages].sort((a, b) => new Date(a.ts).getTime() - new Date(b.ts).getTime());\n};\n","import type { User } from '../types/user';\n\nimport { getUserDisplayName } from './getUserDisplayName';\n\nexport const sortUsersByStatus = (users: User[]): User[] => {\n const statusOrder = { online: 0, away: 1, busy: 2, offline: 3 } as const;\n return [...users].sort((a, b) => {\n const aOrder = statusOrder[a.status || 'offline'];\n const bOrder = statusOrder[b.status || 'offline'];\n if (aOrder !== bOrder) return aOrder - bOrder;\n return getUserDisplayName(a).localeCompare(getUserDisplayName(b));\n });\n};\n","/**\n * Converts platform mention markup (@[user:ID|Display Name]) to plain @Display Name.\n */\nexport function stripPlatformMentions(body: string): string {\n return (body ?? '').replace(/@\\[user:\\d+\\|([^\\]]+)\\]/g, '@$1');\n}\n","/**\n * Extract timestamp from Revolt ULID\n * ULIDs contain a timestamp in the first 48 bits\n */\nexport function extractTimestampFromULID(ulid: string): Date {\n if (!ulid || ulid.length < 10) {\n return new Date();\n }\n\n try {\n // ULID uses Crockford Base32 encoding\n // First 10 characters represent 48-bit timestamp in milliseconds\n const timeStr = ulid.substring(0, 10);\n\n // Convert from Base32 to timestamp\n // This is a simplified conversion - for production you'd want a proper ULID library\n const chars = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';\n let timestamp = 0;\n\n const timeChars = timeStr.split('');\n const invalidChar = timeChars.some(char => {\n const value = chars.indexOf(char);\n if (value === -1) {\n return true;\n }\n timestamp = timestamp * 32 + value;\n return false;\n });\n\n if (invalidChar) {\n // Invalid character, return current time\n return new Date();\n }\n\n return new Date(timestamp);\n } catch (error) {\n console.error('Failed to extract timestamp from ULID:', ulid, error);\n return new Date();\n }\n}\n\n/**\n * Get message timestamp from Revolt message\n * Uses _id (ULID) to extract creation time\n */\nexport function getMessageTimestamp(message: { _id: string; nonce?: string }): string {\n const timestamp = extractTimestampFromULID(message._id);\n return timestamp.toISOString();\n}\n","import {\n GENERAL_CHAT_NAME,\n CHANNEL_NAME_MAX_LENGTH,\n ASSET_CHAT_PREFIXES,\n} from '../constants/constants';\n\nexport { CHANNEL_NAME_MAX_LENGTH };\n\nconst RESERVED_NAMES = new Set([GENERAL_CHAT_NAME.toLowerCase()]);\n\n// Prefixes reserved for system-created asset chats (Rig: …, Fleet: …, Unit: …).\n// A user-created channel with these prefixes would be misidentified as an asset room.\nconst RESERVED_PREFIXES = Object.values(ASSET_CHAT_PREFIXES);\n\nexport interface ChannelNameValidation {\n error: string | null;\n isValid: boolean;\n}\n\nexport function validateChannelName(\n name: string,\n existingChannelNames: string[] = []\n): ChannelNameValidation {\n const trimmed = name.trim();\n\n if (!trimmed) return { error: null, isValid: false };\n\n if (trimmed.length > CHANNEL_NAME_MAX_LENGTH) {\n return {\n error: `Channel name must be ${CHANNEL_NAME_MAX_LENGTH} characters or less`,\n isValid: false,\n };\n }\n\n if (trimmed.includes(',')) {\n return { error: 'Channel name cannot contain commas', isValid: false };\n }\n\n const lowerName = trimmed.toLowerCase();\n\n if (RESERVED_NAMES.has(lowerName)) {\n return { error: `\"${trimmed}\" is a reserved name`, isValid: false };\n }\n\n const matchedPrefix = RESERVED_PREFIXES.find(prefix => lowerName.startsWith(prefix));\n if (matchedPrefix) {\n return {\n error: `Channel names starting with \"${matchedPrefix.trimEnd()}\" are reserved for asset chats`,\n isValid: false,\n };\n }\n\n if (existingChannelNames.some(n => n.toLowerCase() === lowerName)) {\n return { error: `A channel named \"${trimmed}\" already exists`, isValid: false };\n }\n\n return { error: null, isValid: true };\n}\n","import type { UploadFile } from '../types/message';\n\n// Method-style signature so a platform's richer event type (DOM MessageEvent, RN WebSocket\n// events) still fits a handler slot typed with the few fields core reads.\ntype Handler<E> = { bivarianceHack(event: E): void }['bivarianceHack'];\n\nexport interface HttpRequestInit {\n method?: string;\n headers?: Record<string, string>;\n body?: unknown;\n keepalive?: boolean;\n}\n\nexport interface HttpResponseLike {\n ok: boolean;\n status: number;\n statusText: string;\n headers: { get(name: string): string | null };\n json(): Promise<unknown>;\n text(): Promise<string>;\n}\n\nexport interface SocketCloseEventLike {\n code: number;\n reason: string;\n wasClean: boolean;\n}\n\nexport const WEBSOCKET_CONNECTING = 0;\nexport const WEBSOCKET_OPEN = 1;\n\nexport interface WebSocketLike {\n readonly readyState: number;\n onopen: Handler<unknown> | null;\n onmessage: Handler<{ data: unknown }> | null;\n onclose: Handler<SocketCloseEventLike> | null;\n onerror: Handler<unknown> | null;\n send(data: string): void;\n close(code?: number): void;\n}\n\n/**\n * Everything core needs from the host platform. Web passes browser APIs; React Native passes its\n * own `fetch`, `WebSocket` and `FormData` handling plus AppState/NetInfo for reconnect hints.\n *\n * Wrap native functions rather than passing them bare (`fetch: (url, init) => fetch(url, init)`):\n * browsers throw \"Illegal invocation\" when `window.fetch` is called on another object.\n */\nexport interface ChatPlatform {\n fetch(url: string, init?: HttpRequestInit): Promise<HttpResponseLike>;\n createWebSocket(url: string): WebSocketLike;\n /** Multipart body for an Autumn upload, with the file under the `file` field. */\n createUploadBody(file: UploadFile): unknown;\n /**\n * Calls `retry` whenever a pending reconnect is worth attempting right away (network came back,\n * app returned to the foreground). Returns an unsubscribe function.\n */\n subscribeReconnectHints?(retry: () => void): () => void;\n}\n","import type { ChatPlatform, HttpRequestInit } from '../../platform/types';\n\nexport interface HttpClientConfig {\n baseUrl: string;\n fetch: ChatPlatform['fetch'];\n getToken: () => string | null;\n onUnauthorized?: (path: string) => void;\n}\n\nconst summarizeBody = (body: unknown): string => {\n if (body === undefined || body === null || body === '') return '';\n const text = typeof body === 'string' ? body : JSON.stringify(body);\n return text.length > 200 ? `${text.slice(0, 200)}…` : text;\n};\n\n// Callers decide whether a failed response is worth logging (a 404 for a deleted\n// forwarded message is not), so the error carries everything they need instead\n// of the client logging every non-2xx itself.\nexport class HttpError extends Error {\n status: number;\n statusText: string;\n body: unknown;\n\n constructor(status: number, statusText: string, body: unknown, method = 'GET', path = '') {\n const summary = summarizeBody(body);\n super(`HTTP ${status} ${method} ${path}${summary ? `: ${summary}` : ''}`);\n this.name = 'HttpError';\n this.status = status;\n this.statusText = statusText;\n this.body = body;\n }\n}\n\nexport function createHttpClient(config: HttpClientConfig) {\n const { baseUrl, getToken, onUnauthorized, fetch } = config;\n\n async function request<T = unknown>(path: string, init: HttpRequestInit = {}): Promise<T> {\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n const token = getToken();\n if (token) {\n headers['x-session-token'] = token;\n }\n\n const resp = await fetch(`${baseUrl}${path}`, {\n ...init,\n headers: { ...headers, ...(init.headers || {}) },\n });\n\n if (!resp.ok) {\n const contentType = resp.headers.get('content-type') || '';\n let errorBody;\n\n try {\n if (contentType.includes('application/json')) {\n errorBody = await resp.json();\n } else {\n errorBody = await resp.text().catch(() => 'No error body');\n }\n } catch (e) {\n errorBody = await resp.text().catch(() => 'No error body');\n }\n\n if (resp.status === 401) onUnauthorized?.(path);\n\n throw new HttpError(resp.status, resp.statusText, errorBody, init.method ?? 'GET', path);\n }\n\n if (resp.status === 204) {\n return undefined as unknown as T;\n }\n\n const ct = resp.headers.get('content-type') || '';\n if (!ct.includes('application/json')) {\n return undefined as unknown as T;\n }\n\n return (await resp.json()) as T;\n }\n\n return { request };\n}\n\nexport type HttpClient = ReturnType<typeof createHttpClient>;\n","import type { HttpClient } from '../core/http';\nimport type { User } from '../../types/user';\nimport type { LoginCredentials } from '../../types/auth';\nimport type { RevoltLoginResponse, RevoltUserResponse } from '../../types/revolt';\n\nexport function createAuthAPI(http: HttpClient, tokenStore: { token: string | null }) {\n async function login(credentials: LoginCredentials): Promise<{ token: string; me: User }> {\n try {\n const data = await http.request<RevoltLoginResponse>('/auth/session/login', {\n method: 'POST',\n body: JSON.stringify({\n email: credentials.username,\n password: credentials.password,\n }),\n });\n\n const token = data?.token;\n if (!token) throw new Error('Login failed - no token received');\n tokenStore.token = token;\n\n try {\n await http.request('/auth/account/');\n } catch (e) {\n console.error('⚠️ Session initialization failed, continuing anyway:', e);\n }\n\n let me: User;\n try {\n const userInfo = await http.request<RevoltUserResponse>('/users/@me');\n me = {\n _id: userInfo._id,\n username: userInfo.username || credentials.username.split('@')[0] || '',\n name: userInfo.display_name || userInfo.username || credentials.username.split('@')[0],\n status: 'online',\n };\n } catch (e) {\n console.error('⚠️ Failed to get /users/@me, using fallback user info:', e);\n me = {\n _id: data.user_id || 'unknown-user-id',\n username: credentials.username.split('@')[0] || 'user',\n name: credentials.username.split('@')[0] || 'User',\n status: 'online',\n };\n }\n\n return { token, me };\n } catch (error: unknown) {\n console.error('Login error:', error);\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Login failed: ${message}`);\n }\n }\n\n async function me(): Promise<User> {\n const userInfo = await http.request<RevoltUserResponse>('/users/@me');\n return {\n _id: userInfo._id,\n username: userInfo.username,\n name: userInfo.display_name || userInfo.username,\n status: 'online',\n };\n }\n\n function setToken(token: string | null) {\n tokenStore.token = token;\n }\n\n function getToken() {\n return tokenStore.token;\n }\n\n return {\n login,\n me,\n setToken,\n getToken,\n };\n}\n","import type { HttpClient } from '../core/http';\nimport type { User } from '../../types/user';\nimport type { RevoltUserResponse } from '../../types/revolt';\nimport { isGeneralRoom } from '../../utils/isGeneralRoom';\n\n// Simple user cache to avoid duplicate API calls\nconst userCache: Record<string, User> = {};\n// In-flight requests for deduplication\nconst pendingRequests: Record<string, Promise<User | null> | undefined> = {};\n\nexport function createUsersAPI(http: HttpClient) {\n async function getUser(userId: string): Promise<User | null> {\n // Check cache first\n if (userCache[userId]) {\n return userCache[userId];\n }\n\n // Deduplicate in-flight requests\n if (pendingRequests[userId]) {\n return pendingRequests[userId];\n }\n\n const request = (async () => {\n try {\n const user = await http.request<RevoltUserResponse>(`/users/${userId}`);\n const result: User = {\n _id: user._id,\n username: user.username,\n name: user.display_name || user.username,\n status: user.online ? 'online' : 'offline',\n isBot: !!user.bot,\n };\n userCache[userId] = result;\n return result;\n } catch (error) {\n console.error('Failed to get user:', error);\n return null;\n } finally {\n delete pendingRequests[userId];\n }\n })();\n\n pendingRequests[userId] = request;\n return request;\n }\n\n // Seed cache from external data (e.g., from store's membersById)\n function seedUserCache(users: User[]): void {\n users.forEach(user => {\n if (user._id && !userCache[user._id]) {\n userCache[user._id] = user;\n }\n });\n }\n\n function clearUserCache(): void {\n Object.keys(userCache).forEach(key => delete userCache[key]);\n Object.keys(pendingRequests).forEach(key => delete pendingRequests[key]);\n }\n\n async function getFriends(): Promise<User[]> {\n try {\n // TODO: Replace with proper batch endpoint or pagination\n // Fetching from General Chat to avoid rate limiting with individual friend requests\n const dms =\n await http.request<Array<{ _id: string; name?: string; channel_type?: string }>>(\n '/users/dms'\n );\n\n const generalChat = dms.find(ch => isGeneralRoom(ch));\n\n if (generalChat?._id) {\n try {\n const response = await http.request<RevoltUserResponse[]>(\n `/channels/${generalChat._id}/members`\n );\n const users = response.map<User>(member => ({\n _id: member._id,\n username: member.username,\n name: member.display_name || member.username,\n status: member.online ? 'online' : 'offline',\n isBot: !!member.bot,\n }));\n // Seed cache with fetched users\n seedUserCache(users);\n return users;\n } catch (e) {\n console.error('Failed to fetch General Chat members:', e);\n }\n }\n\n console.error('General Chat not found or members fetch failed');\n return [];\n } catch (e) {\n console.error('Failed to get friends:', e);\n return [];\n }\n }\n\n async function searchUsers(_query: string): Promise<User[]> {\n try {\n // Get all server users (from General Chat members)\n const allUsers = await getFriends();\n\n const q = _query.trim();\n\n // If no query, return all users\n if (!q) {\n return allUsers;\n }\n\n // Filter locally by username or display name\n const queryLower = q.toLowerCase();\n return allUsers.filter(\n u =>\n u.username?.toLowerCase().includes(queryLower) ||\n u.name?.toLowerCase().includes(queryLower)\n );\n } catch (error) {\n console.error('User search error:', error);\n return [];\n }\n }\n\n return {\n getUser,\n getFriends,\n searchUsers,\n seedUserCache,\n clearUserCache,\n };\n}\n","import type { Message, Attachment } from '../../../types/message';\n\n// Revolt API attachment structure (before transformation)\ninterface RevoltAttachment {\n _id?: string;\n id?: string;\n tag?: string;\n filename?: string;\n metadata?: {\n type?: string;\n width?: number;\n height?: number;\n };\n content_type?: string;\n size?: number;\n}\n\nexport function normalizeReplies(\n replies?: Array<{ id: string; mention?: boolean }> | string[]\n): string[] | undefined {\n if (!replies) return undefined;\n if (Array.isArray(replies) && replies.length > 0 && typeof replies[0] === 'object') {\n const arr = replies as Array<{ id?: string }>;\n return arr.map(r => r.id).filter((id): id is string => Boolean(id));\n }\n return replies as string[];\n}\n\nexport function cleanAttachmentUrls(content: string, attachments: RevoltAttachment[]): string {\n let cleaned = content;\n\n attachments.forEach(att => {\n const id = att?._id || att?.id;\n if (id) {\n const urlPattern = new RegExp(`https?://[^\\\\s]*${id}[^\\\\s]*`, 'gi');\n cleaned = cleaned.replace(urlPattern, '').trim();\n }\n });\n\n return cleaned;\n}\n\nexport function transformAttachments(\n attachments: RevoltAttachment[] | undefined,\n autumnUrl: string\n): Attachment[] | undefined {\n if (!Array.isArray(attachments) || attachments.length === 0) {\n return undefined;\n }\n\n return attachments\n .map(att => {\n const id = att?._id || att?.id;\n const filename = att?.filename || 'file';\n if (id) {\n return {\n image_url: `${autumnUrl}/attachments/${id}/${encodeURIComponent(filename)}`,\n title: filename,\n } as Attachment;\n }\n return undefined;\n })\n .filter((att): att is Attachment => att !== undefined);\n}\n\nexport function transformFileAttachments(\n attachments: RevoltAttachment[] | undefined,\n autumnUrl: string,\n channelId: string,\n authorId: string\n) {\n if (!Array.isArray(attachments) || attachments.length === 0) {\n return undefined;\n }\n\n const files = attachments\n .map(att => {\n const id = att._id || att.id;\n if (!id) return null;\n\n return {\n _id: id,\n name: att.filename || 'file',\n type: att.content_type || att.metadata?.type || 'application/octet-stream',\n size: att.size || 0,\n rid: channelId,\n userId: authorId || 'unknown',\n url: `${autumnUrl}/attachments/${id}/${encodeURIComponent(att.filename || 'file')}`,\n };\n })\n .filter((f): f is NonNullable<typeof f> => f !== null);\n\n return files.length > 0 ? files : undefined;\n}\n\nexport function createSystemMessage(\n id: string,\n channelId: string,\n messageText: string,\n timestamp: string,\n systemType: string,\n systemUsers?: { userId?: string; actorId?: string },\n extraFields?: Partial<Message>\n): Message {\n return {\n _id: id,\n rid: channelId,\n msg: messageText,\n ts: timestamp,\n u: { _id: 'system', username: 'system' },\n _updatedAt: timestamp,\n replies: undefined,\n t: systemType,\n systemUsers,\n ...extraFields,\n };\n}\n","import type { HttpClient } from '../core/http';\nimport type { Message } from '../../types/message';\nimport type { RevoltMessage, RevoltUserResponse } from '../../types/revolt';\nimport type { User } from '../../types/user';\nimport { getMessageTimestamp } from '../../utils/ulidTimestamp';\nimport {\n buildForwardMessageContent,\n enrichWithCorvaData,\n} from '../../utils/parseCorvaSystemMessage';\nimport { SOFT_DELETE_MARKER } from '../../utils/isSoftDeletedMessage';\nimport { REVOLT_SYSTEM_USER_ID, SYSTEM_MESSAGE_TEXTS } from '../../constants/constants';\nimport {\n transformFileAttachments,\n createSystemMessage,\n} from '../socket/transforms/messageTransform';\n\nexport function createMessagesAPI(\n http: HttpClient,\n autumnUrl: string,\n getUserFn: (userId: string) => Promise<User | null>\n) {\n async function getChannelMessages(\n channelId: string,\n limit = 100,\n before?: string,\n nearby?: string\n ): Promise<Message[]> {\n try {\n // Built by hand: React Native's URLSearchParams is only partly implemented.\n const params = [`limit=${limit}`];\n if (nearby) {\n params.push(`nearby=${encodeURIComponent(nearby)}`);\n } else if (before) {\n params.push(`before=${encodeURIComponent(before)}`);\n }\n const url = `/channels/${channelId}/messages?${params.join('&')}`;\n const response = await http.request<RevoltMessage[] | { messages: RevoltMessage[] }>(url);\n const messages: RevoltMessage[] = Array.isArray(response)\n ? response\n : response.messages || [];\n\n // Collect all user IDs we might need to resolve\n const userIds = Array.from(\n new Set<string>(\n messages\n .flatMap(msg => {\n const ids: unknown[] = [];\n if (msg.system?.type === 'user_added') {\n ids.push(msg.system.id, msg.system.by);\n }\n if (msg.system?.type === 'user_remove' && msg.system.by) {\n ids.push(msg.system.id, msg.system.by);\n }\n if (msg.system?.type === 'user_left') {\n ids.push(msg.system.id);\n }\n ids.push(msg.author);\n const { reactions } = msg;\n if (reactions && typeof reactions === 'object') {\n if (Array.isArray(reactions)) {\n reactions.forEach(r => {\n if (r && typeof r.user_id === 'string') ids.push(r.user_id);\n });\n } else {\n Object.values(reactions).forEach(v => {\n if (Array.isArray(v)) {\n v.forEach(u => {\n if (typeof u === 'string') ids.push(u);\n });\n }\n });\n }\n }\n return ids;\n })\n .filter((id: unknown): id is string => typeof id === 'string' && id.length > 0)\n )\n );\n\n // Use cached getUser function instead of direct HTTP calls\n const userCache: Record<string, RevoltUserResponse> = {};\n await Promise.all(\n userIds\n .filter(userId => userId && userId !== REVOLT_SYSTEM_USER_ID)\n .map(async userId => {\n const user = await getUserFn(userId);\n if (user) {\n userCache[userId] = {\n _id: user._id,\n username: user.username || '',\n display_name: user.name,\n online: user.status === 'online',\n } as RevoltUserResponse;\n }\n })\n );\n\n const convertedMessages = messages\n .map(msg => {\n if (msg.system?.type === 'user_added') {\n const addedUser = userCache[String(msg.system.id)];\n const addedBy = userCache[String(msg.system.by)];\n return createSystemMessage(\n msg._id,\n channelId,\n SYSTEM_MESSAGE_TEXTS.USER_ADDED(\n addedBy?.username || SYSTEM_MESSAGE_TEXTS.DEFAULT_USER,\n addedUser?.username || SYSTEM_MESSAGE_TEXTS.DEFAULT_USER\n ),\n getMessageTimestamp(msg),\n 'au',\n { userId: String(msg.system.id), actorId: String(msg.system.by) }\n );\n }\n\n if (msg.system?.type === 'user_remove' && msg.system.by) {\n const removedUser = userCache[String(msg.system.id)];\n const removedBy = userCache[String(msg.system.by)];\n return createSystemMessage(\n msg._id,\n channelId,\n SYSTEM_MESSAGE_TEXTS.USER_REMOVED(\n removedBy?.username || SYSTEM_MESSAGE_TEXTS.DEFAULT_USER,\n removedUser?.username || SYSTEM_MESSAGE_TEXTS.DEFAULT_USER\n ),\n getMessageTimestamp(msg),\n 'ru',\n { userId: String(msg.system.id), actorId: String(msg.system.by) }\n );\n }\n\n if (msg.system?.type === 'user_left') {\n const leftUser = userCache[String(msg.system.id)];\n return createSystemMessage(\n msg._id,\n channelId,\n SYSTEM_MESSAGE_TEXTS.USER_LEFT(\n leftUser?.username || SYSTEM_MESSAGE_TEXTS.DEFAULT_USER\n ),\n getMessageTimestamp(msg),\n 'ul',\n { userId: String(msg.system.id) }\n );\n }\n\n if (msg.system?.type === 'message_pinned') {\n const pinnedBy = userCache[String(msg.system.by)];\n return createSystemMessage(\n msg._id,\n channelId,\n SYSTEM_MESSAGE_TEXTS.MESSAGE_PINNED(\n pinnedBy?.username || SYSTEM_MESSAGE_TEXTS.DEFAULT_USER\n ),\n getMessageTimestamp(msg),\n 'message_pinned',\n { actorId: String(msg.system.by) },\n { pinnedMessageId: msg.system.id }\n );\n }\n\n if (msg.system?.type === 'message_unpinned') {\n const unpinnedBy = userCache[String(msg.system.by)];\n return createSystemMessage(\n msg._id,\n channelId,\n SYSTEM_MESSAGE_TEXTS.MESSAGE_UNPINNED(\n unpinnedBy?.username || SYSTEM_MESSAGE_TEXTS.DEFAULT_USER\n ),\n getMessageTimestamp(msg),\n 'message_unpinned',\n { actorId: String(msg.system.by) },\n { unpinnedMessageId: msg.system.id }\n );\n }\n\n const author = userCache[String(msg.author)];\n const messageContent = msg.content || '';\n\n let cleanContent = messageContent;\n\n if (Array.isArray(msg.attachments) && msg.attachments.length > 0) {\n msg.attachments.forEach(att => {\n const id = att?._id || att?.id;\n if (id) {\n const urlPattern = new RegExp(`https?://[^\\\\s]*${id}[^\\\\s]*`, 'gi');\n cleanContent = cleanContent.replace(urlPattern, '').trim();\n }\n });\n }\n\n const attachments = Array.isArray(msg.attachments)\n ? msg.attachments.map(att => {\n const attId = att?._id || att?.id;\n const filename = att?.filename || 'file';\n const url = attId ? `${autumnUrl}/attachments/${attId}` : undefined;\n return {\n image_url: url,\n title: filename,\n };\n })\n : undefined;\n\n const files = transformFileAttachments(msg.attachments, autumnUrl, channelId, msg.author);\n\n let reactions: Record<string, { userIds: string[]; usernames?: string[] }> | undefined;\n if (msg.reactions) {\n reactions = {};\n if (Array.isArray(msg.reactions)) {\n msg.reactions.forEach(r => {\n const emoji = r?.emoji;\n const uid: string | undefined = r?.user_id;\n if (!emoji || !uid) return;\n if (!reactions![emoji]) {\n reactions![emoji] = { userIds: [] };\n }\n if (!reactions![emoji].userIds.includes(uid)) {\n reactions![emoji].userIds.push(uid);\n }\n });\n } else if (typeof msg.reactions === 'object') {\n Object.entries(msg.reactions).forEach(([emoji, users]) => {\n const ids: string[] = Array.isArray(users)\n ? users.filter((u): u is string => typeof u === 'string')\n : [];\n reactions![emoji] = { userIds: ids };\n });\n }\n }\n\n const isSoftDeleted = msg.content === SOFT_DELETE_MARKER;\n\n return enrichWithCorvaData({\n _id: msg._id,\n nonce: msg.nonce,\n rid: channelId,\n msg: isSoftDeleted ? SOFT_DELETE_MARKER : cleanContent,\n ts: getMessageTimestamp(msg),\n u: {\n _id: msg.author || 'unknown',\n username:\n author?.username ||\n (typeof msg.author === 'string' && msg.author.length >= 4\n ? `User-${msg.author.slice(-4)}`\n : 'user'),\n },\n _updatedAt: msg.edited || getMessageTimestamp(msg),\n editedAt: msg.edited,\n replies: msg.replies || undefined,\n attachments: isSoftDeleted ? undefined : attachments,\n files: isSoftDeleted ? undefined : files,\n reactions: isSoftDeleted ? undefined : reactions,\n deleted: isSoftDeleted || undefined,\n pinned: msg.pinned || undefined,\n });\n })\n .filter(msg => {\n if (msg.t || msg.deleted) return true;\n return msg.msg.trim() !== '' || (msg.attachments && msg.attachments.length > 0);\n });\n\n const messagesWithThreadCounts = convertedMessages.map(msg => {\n const replyCount = convertedMessages.filter(\n otherMsg => otherMsg.replies && otherMsg.replies.includes(msg._id)\n ).length;\n\n if (replyCount > 0) {\n return { ...msg, tcount: replyCount };\n }\n return msg;\n });\n\n return messagesWithThreadCounts;\n } catch (error: unknown) {\n console.error('Get channel messages error:', error);\n return [];\n }\n }\n\n async function sendMessage(\n channelId: string,\n text: string,\n threadId?: string,\n attachmentIds?: string[],\n nonce?: string\n ) {\n try {\n const response = await http.request(`/channels/${channelId}/messages`, {\n method: 'POST',\n body: JSON.stringify({\n content: text,\n nonce,\n replies: threadId ? [{ id: threadId, mention: false }] : undefined,\n ...(attachmentIds && attachmentIds.length > 0 ? { attachments: attachmentIds } : {}),\n }),\n });\n return response;\n } catch (error: unknown) {\n console.error('Send message error:', error);\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to send message: ${message}`);\n }\n }\n\n async function editMessage(channelId: string, messageId: string, content: string): Promise<void> {\n await http.request(`/channels/${channelId}/messages/${messageId}`, {\n method: 'PATCH',\n body: JSON.stringify({ content }),\n });\n }\n\n async function deleteMessage(channelId: string, messageId: string): Promise<void> {\n await http.request(`/channels/${channelId}/messages/${messageId}`, {\n method: 'DELETE',\n });\n }\n\n async function pinMessage(channelId: string, messageId: string): Promise<void> {\n await http.request(`/channels/${channelId}/messages/${messageId}/pin`, {\n method: 'POST',\n });\n }\n\n async function unpinMessage(channelId: string, messageId: string): Promise<void> {\n await http.request(`/channels/${channelId}/messages/${messageId}/pin`, {\n method: 'DELETE',\n });\n }\n\n async function fetchMessage(channelId: string, messageId: string): Promise<RevoltMessage> {\n const response = await http.request<RevoltMessage>(\n `/channels/${channelId}/messages/${messageId}`\n );\n return response;\n }\n\n async function forwardMessage(\n targetChannelId: string,\n sourceChannelId: string,\n messageId: string,\n channelName: string,\n isPrivate: boolean,\n customMessage?: string,\n attachmentIds?: string[],\n sourceTs?: string\n ): Promise<unknown> {\n const content = buildForwardMessageContent(\n sourceChannelId,\n messageId,\n channelName,\n isPrivate,\n customMessage,\n sourceTs\n );\n return sendMessage(targetChannelId, content, undefined, attachmentIds);\n }\n\n return {\n getChannelMessages,\n sendMessage,\n editMessage,\n deleteMessage,\n pinMessage,\n unpinMessage,\n fetchMessage,\n forwardMessage,\n };\n}\n","import type { HttpClient } from '../core/http';\nimport type { Room } from '../../types/room';\nimport type { RevoltChannel } from '../../types/revolt';\nimport { CHANNEL_TYPES } from '../../constants/constants';\nimport { isGeneralRoom } from '../../utils/isGeneralRoom';\n\ninterface FetchServerResponse {\n _id: string;\n channels?: RevoltChannel[];\n}\n\nexport function createChannelsAPI(http: HttpClient) {\n async function getChannel(channelId: string): Promise<RevoltChannel> {\n return http.request<RevoltChannel>(`/channels/${channelId}`);\n }\n\n type RevoltUnread = {\n _id: { channel: string };\n last_id?: string;\n };\n\n async function getUnreads(): Promise<Map<string, string>> {\n const ackedMap = new Map<string, string>();\n try {\n const unreads = await http.request<RevoltUnread[]>('/sync/unreads');\n unreads.forEach(entry => {\n if (entry?._id?.channel && entry.last_id) {\n ackedMap.set(entry._id.channel, entry.last_id);\n }\n });\n } catch (e) {\n console.error('Failed to fetch unreads:', e);\n }\n return ackedMap;\n }\n\n async function ackMessage(\n channelId: string,\n messageId: string,\n options: { keepalive?: boolean } = {}\n ): Promise<boolean> {\n try {\n await http.request(`/channels/${channelId}/ack/${messageId}`, {\n method: 'PUT',\n keepalive: options.keepalive,\n });\n return true;\n } catch (error) {\n console.error('Ack message error:', error);\n return false;\n }\n }\n\n async function getRooms(serverId?: string | null): Promise<Room[]> {\n try {\n const channelMap = new Map<string, RevoltChannel>();\n\n // Fetch server channels (e.g. General) when server ID is available\n if (serverId) {\n try {\n const server = await http.request<FetchServerResponse>(\n `/servers/${serverId}?include_channels=true`\n );\n const channelsPayload = server?.channels;\n if (Array.isArray(channelsPayload) && channelsPayload.length > 0) {\n channelsPayload.forEach(channel => {\n if (channel?._id && channel.channel_type === CHANNEL_TYPES.TEXT_CHANNEL) {\n channelMap.set(channel._id, channel);\n }\n });\n }\n } catch (e) {\n console.error('Failed to fetch channels:', e);\n }\n }\n\n // Fetch DMs, group channels, and text channels from /users/dms\n try {\n const dms = await http.request<RevoltChannel[]>('/users/dms');\n if (Array.isArray(dms)) {\n dms.forEach(channel => {\n if (channel?._id) {\n channelMap.set(channel._id, channel);\n }\n });\n }\n } catch (e) {\n console.error('Failed to fetch DMs:', e);\n }\n\n // Convert channels to rooms - NO additional API calls needed!\n const rooms: Room[] = [];\n\n channelMap.forEach(channel => {\n let roomType: Room['t'] = 'c';\n let name = channel.name || 'Unnamed Channel';\n\n // Every account has a nameless SavedMessages channel in /users/dms; nothing to show for it.\n if (channel.channel_type === CHANNEL_TYPES.SAVED_MESSAGES) return;\n if (!channel.name && channel.channel_type !== CHANNEL_TYPES.DIRECT_MESSAGE) return;\n\n if (channel.channel_type === CHANNEL_TYPES.GROUP) {\n roomType = 'p';\n } else if (channel.channel_type === CHANNEL_TYPES.DIRECT_MESSAGE) {\n roomType = 'd';\n name = 'Direct Message'; // Will be enriched lazily with recipient name\n } else if (channel.channel_type === CHANNEL_TYPES.TEXT_CHANNEL) {\n roomType = 'c';\n }\n\n rooms.push({\n _id: channel._id,\n name,\n t: roomType,\n default: false,\n fname: name,\n topic: channel.description || '',\n description: channel.description || '',\n ro: false,\n sysMes: true,\n last_message_id: channel.last_message_id,\n // Store recipients array for lazy loading DM usernames\n recipients: channel.recipients,\n ...(channel.owner\n ? {\n u: {\n _id: channel.owner,\n username: '', // Username not needed - ChannelSettingsDialog uses getMemberById(_id) instead\n },\n }\n : {}),\n });\n });\n\n // Sort: General chat first, then alphabetically\n return [...rooms].sort((a, b) => {\n const byGeneral = (isGeneralRoom(a) ? 0 : 1) - (isGeneralRoom(b) ? 0 : 1);\n if (byGeneral) return byGeneral;\n const nameA = (a.name || '').toLowerCase();\n const nameB = (b.name || '').toLowerCase();\n if (nameA < nameB) return -1;\n return nameA > nameB ? 1 : 0;\n });\n } catch (error) {\n console.error('❌ Failed to get rooms:', error);\n return [];\n }\n }\n\n async function leaveChannel(\n channelId: string,\n leaveSilently: boolean | null = null\n ): Promise<void> {\n try {\n const qs = leaveSilently === null ? 'leave_silently=null' : `leave_silently=${leaveSilently}`;\n await http.request(`/channels/${channelId}?${qs}`, { method: 'DELETE' });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to leave channel: ${message}`);\n }\n }\n\n async function updateChannel(\n channelId: string,\n updates: { name?: string; description?: string }\n ): Promise<RevoltChannel> {\n try {\n return await http.request<RevoltChannel>(`/channels/${channelId}`, {\n method: 'PATCH',\n body: JSON.stringify(updates),\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to update channel: ${message}`);\n }\n }\n\n return {\n getChannel,\n getRooms,\n leaveChannel,\n ackMessage,\n getUnreads,\n updateChannel,\n };\n}\n","import type { HttpClient } from '../core/http';\n\nexport function createReactionsAPI(http: HttpClient) {\n async function addReaction(channelId: string, messageId: string, emoji: string): Promise<void> {\n const encoded = encodeURIComponent(emoji);\n await http.request(`/channels/${channelId}/messages/${messageId}/reactions/${encoded}`, {\n method: 'PUT',\n });\n }\n\n async function removeReaction(\n channelId: string,\n messageId: string,\n emoji: string\n ): Promise<void> {\n const encoded = encodeURIComponent(emoji);\n await http.request(`/channels/${channelId}/messages/${messageId}/reactions/${encoded}`, {\n method: 'DELETE',\n });\n }\n\n return {\n addReaction,\n removeReaction,\n };\n}\n","import type { ChatPlatform } from '../../platform/types';\nimport type { UploadFile } from '../../types/message';\nimport { MAX_ATTACHMENT_SIZE_MB } from '../../constants/constants';\n\nexport function createAttachmentsAPI(\n autumnUrl: string,\n getToken: () => string | null,\n platform: Pick<ChatPlatform, 'fetch' | 'createUploadBody'>\n) {\n async function uploadAttachment(file: UploadFile): Promise<{ id?: string; url?: string }> {\n try {\n const form = platform.createUploadBody(file);\n const token = getToken();\n const resp = await platform.fetch(`${autumnUrl}/attachments`, {\n method: 'POST',\n headers: token ? { 'x-session-token': token } : undefined,\n body: form,\n });\n\n if (!resp.ok) {\n const errorText = await resp.text();\n console.error('Upload failed:', resp.status, errorText);\n\n if (resp.status === 413) {\n throw new Error(\n `File is too large. Maximum size is ${MAX_ATTACHMENT_SIZE_MB} MB. Your file: ${(file.size / (1024 * 1024)).toFixed(1)} MB`\n );\n } else if (resp.status === 415) {\n throw new Error(`File type \"${file.type}\" is not supported by the server.`);\n } else if (resp.status === 401 || resp.status === 403) {\n throw new Error(`Authentication failed. Please try logging out and back in.`);\n } else {\n throw new Error(`Upload failed (${resp.status}): ${errorText || resp.statusText}`);\n }\n }\n\n let data;\n try {\n const responseText = await resp.text();\n data = responseText ? JSON.parse(responseText) : {};\n } catch (parseError) {\n console.error('Failed to parse JSON response:', parseError);\n data = {};\n }\n\n const id = data?.id || data?._id || data?.attachment?._id;\n if (!id) {\n console.error('No attachment ID in response');\n return {};\n }\n\n const filename = file && file.name ? encodeURIComponent(file.name) : 'file';\n const primaryUrl = `${autumnUrl}/attachments/${id}/${filename}`;\n\n return { id, url: primaryUrl };\n } catch (e) {\n console.error('Upload attachment failed:', e);\n throw e;\n }\n }\n\n return {\n uploadAttachment,\n };\n}\n","import type { HttpClient } from '../core/http';\nimport type { User } from '../../types/user';\nimport type { RevoltChannel } from '../../types/revolt';\nimport type { Message } from '../../types/message';\n\nexport function createDirectMessagesAPI(\n http: HttpClient,\n getUserFn: (id: string) => Promise<User | null>,\n getMessagesFn: (channelId: string, limit: number) => Promise<Message[]>\n) {\n async function getOrCreateDMFromUser(userId: string): Promise<{ _id: string }> {\n return http.request<{ _id: string }>(`/users/${userId}/dm`);\n }\n\n async function getDMRecipient(\n dmChannelId: string,\n currentUserId?: string,\n cachedChannel?: RevoltChannel\n ): Promise<User | null> {\n try {\n // Use cached channel if provided to avoid duplicate API call\n const chan = cachedChannel || (await http.request<RevoltChannel>(`/channels/${dmChannelId}`));\n let recipientId: string | undefined;\n\n if (Array.isArray(chan?.recipients) && chan.recipients.length > 0) {\n recipientId =\n chan.recipients.find((id: string) => id !== currentUserId) || chan.recipients[0];\n } else if (typeof (chan as RevoltChannel & { user?: string })?.user === 'string') {\n const { user } = chan as RevoltChannel & { user?: string };\n recipientId = user !== currentUserId ? user : undefined;\n }\n\n if (recipientId) {\n return getUserFn(recipientId);\n }\n\n const messages = await getMessagesFn(dmChannelId, 5);\n const other = messages.find(\n m => m.u?._id && m.u._id !== 'system' && m.u._id !== currentUserId\n );\n if (other?.u?._id) return getUserFn(other.u._id);\n return null;\n } catch {\n return null;\n }\n }\n\n return {\n getOrCreateDMFromUser,\n getDMRecipient,\n };\n}\n","import type { HttpClient } from '../core/http';\nimport type { User } from '../../types/user';\nimport type { RevoltUserResponse } from '../../types/revolt';\n\nexport function createGroupsAPI(http: HttpClient) {\n async function createGroup(name: string, recipientIds: string[]): Promise<{ _id: string }> {\n try {\n const response = await http.request<{ _id: string }>(`/channels/create`, {\n method: 'POST',\n body: JSON.stringify({ name, users: recipientIds }),\n });\n return response;\n } catch (error: unknown) {\n console.error('Failed to create group:', error);\n throw error;\n }\n }\n\n async function addUserToGroup(groupId: string, userId: string): Promise<boolean> {\n try {\n await http.request(`/channels/${groupId}/recipients/${userId}`, {\n method: 'PUT',\n });\n return true;\n } catch (error: unknown) {\n console.error('❌ Failed to add user to group:', error);\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to add user to group: ${message}`);\n }\n }\n\n async function removeUserFromGroup(groupId: string, userId: string): Promise<boolean> {\n try {\n await http.request(`/channels/${groupId}/recipients/${userId}`, {\n method: 'DELETE',\n });\n return true;\n } catch (error: unknown) {\n console.error('❌ Failed to remove user from group:', error);\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to remove user from group: ${message}`);\n }\n }\n\n async function getGroupMembers(groupId: string): Promise<User[]> {\n try {\n const response = await http.request<RevoltUserResponse[]>(`/channels/${groupId}/members`);\n return response.map(member => ({\n _id: member._id,\n username: member.username,\n name: member.display_name || member.username,\n status: member.online ? 'online' : 'offline',\n isBot: !!member.bot,\n }));\n } catch (error: unknown) {\n console.error('❌ Failed to get group members:', error);\n return [];\n }\n }\n\n async function getServerMembers(serverId: string): Promise<User[]> {\n try {\n const response = await http.request<{\n members: Array<{ _id: { user: string } }>;\n users: RevoltUserResponse[];\n }>(`/servers/${serverId}/members`);\n\n const users = response?.users || [];\n return users.map(member => ({\n _id: member._id,\n username: member.username,\n name: member.display_name || member.username,\n status: member.online ? 'online' : 'offline',\n isBot: !!member.bot,\n }));\n } catch (error: unknown) {\n console.error('Failed to get server members:', error);\n return [];\n }\n }\n\n return {\n createGroup,\n addUserToGroup,\n removeUserFromGroup,\n getGroupMembers,\n getServerMembers,\n };\n}\n","import type { ChatPlatform } from '../platform/types';\n\nimport { createHttpClient } from './core/http';\nimport { createAuthAPI } from './modules/auth';\nimport { createUsersAPI } from './modules/users';\nimport { createMessagesAPI } from './modules/messages';\nimport { createChannelsAPI } from './modules/channels';\nimport { createReactionsAPI } from './modules/reactions';\nimport { createAttachmentsAPI } from './modules/attachments';\nimport { createDirectMessagesAPI } from './modules/directMessages';\nimport { createGroupsAPI } from './modules/groups';\n\nexport function createRevoltAPI(baseUrl: string, platform: ChatPlatform) {\n const normalizedBaseUrl = baseUrl.replace(/\\/$/, '');\n const autumnUrl = normalizedBaseUrl.replace(/\\/api$/i, '/autumn');\n const tokenStore = { token: null as string | null };\n const unauthorized = { handler: null as ((source: string) => void) | null };\n\n const http = createHttpClient({\n baseUrl: normalizedBaseUrl,\n fetch: (url, init) => platform.fetch(url, init),\n getToken: () => tokenStore.token,\n onUnauthorized: path => unauthorized.handler?.(path),\n });\n\n const auth = createAuthAPI(http, tokenStore);\n const users = createUsersAPI(http);\n const reactions = createReactionsAPI(http);\n const groups = createGroupsAPI(http);\n const attachments = createAttachmentsAPI(autumnUrl, () => tokenStore.token, platform);\n\n const channels = createChannelsAPI(http);\n\n const messages = createMessagesAPI(http, autumnUrl, users.getUser);\n const directMessages = createDirectMessagesAPI(http, users.getUser, messages.getChannelMessages);\n\n const api = {\n ...auth,\n ...users,\n ...channels,\n ...messages,\n ...reactions,\n ...attachments,\n ...directMessages,\n ...groups,\n getBaseUrl: () => normalizedBaseUrl,\n seedUserCache: users.seedUserCache,\n clearUserCache: users.clearUserCache,\n setUnauthorizedHandler: (handler: ((source: string) => void) | null) => {\n unauthorized.handler = handler;\n },\n notifyUnauthorized: (source: string) => unauthorized.handler?.(source),\n };\n\n return api;\n}\n\nexport type RevoltAPIInstance = ReturnType<typeof createRevoltAPI>;\n","import { Emitter } from '@socket.io/component-emitter';\n\nimport type { ChatPlatform, SocketCloseEventLike, WebSocketLike } from '../../../platform/types';\nimport { WEBSOCKET_CONNECTING, WEBSOCKET_OPEN } from '../../../platform/types';\n\ninterface ConnectionEvents {\n open: () => void;\n message: (data: string) => void;\n close: (event: SocketCloseEventLike) => void;\n error: (error: unknown) => void;\n}\n\nexport class Connection extends Emitter<ConnectionEvents, ConnectionEvents> {\n private ws: WebSocketLike | null = null;\n private serverUrl: string;\n private createWebSocket: ChatPlatform['createWebSocket'];\n\n constructor(serverUrl: string, createWebSocket: ChatPlatform['createWebSocket']) {\n super();\n this.serverUrl = serverUrl;\n this.createWebSocket = createWebSocket;\n }\n\n connect(): Promise<void> {\n // Two live sockets would double every event.\n this.dropSocket();\n\n return new Promise((resolve, reject) => {\n try {\n const ws = this.createWebSocket(this.serverUrl);\n this.ws = ws;\n\n ws.onopen = () => {\n this.emit('open');\n resolve();\n };\n\n ws.onmessage = event => {\n this.emit('message', event.data as string);\n };\n\n ws.onclose = event => {\n this.emit('close', event);\n };\n\n ws.onerror = error => {\n this.emit('error', error);\n reject(error);\n };\n\n setTimeout(() => {\n if (ws.readyState === WEBSOCKET_CONNECTING) {\n // Closing fires onclose, which schedules the next retry.\n ws.close();\n reject(new Error('WebSocket connection timeout'));\n }\n }, 10000);\n } catch (error) {\n reject(error);\n }\n });\n }\n\n private dropSocket(): void {\n const { ws } = this;\n if (!ws) return;\n ws.onopen = null;\n ws.onmessage = null;\n ws.onclose = null;\n ws.onerror = null;\n if (ws.readyState === WEBSOCKET_CONNECTING || ws.readyState === WEBSOCKET_OPEN) {\n ws.close(1000);\n }\n this.ws = null;\n }\n\n send(data: unknown): void {\n if (this.ws?.readyState === WEBSOCKET_OPEN) {\n this.ws.send(JSON.stringify(data));\n }\n }\n\n disconnect(): void {\n if (this.ws) {\n this.ws.close(1000);\n this.ws = null;\n }\n }\n\n isConnected(): boolean {\n return this.ws?.readyState === WEBSOCKET_OPEN;\n }\n}\n","import type { HttpClient } from '../../core/http';\nimport type { RevoltUserResponse } from '../../../types/revolt';\n\nexport function createUserCache(http: HttpClient) {\n const cache: Record<string, string> = {};\n\n function seed(users: Array<{ _id: string; username: string }>): void {\n users.forEach(u => {\n if (u?._id && u.username) {\n cache[u._id] = u.username;\n }\n });\n }\n\n function get(userId: string): string | undefined {\n return cache[userId];\n }\n\n async function fetch(userId: string, sessionToken: string | null): Promise<string | undefined> {\n const cached = cache[userId];\n if (cached) return cached;\n\n if (!sessionToken) return undefined;\n\n try {\n const user = await http.request<RevoltUserResponse>(`/users/${userId}`);\n const { username } = user;\n if (username && user._id) {\n cache[user._id] = username;\n }\n return username;\n } catch (e) {\n console.error(`Failed to fetch user ${userId}:`, e);\n return undefined;\n }\n }\n\n async function fetchMultiple(\n userIds: string[],\n sessionToken: string | null\n ): Promise<Record<string, string>> {\n const result: Record<string, string> = {};\n const toFetch = userIds.filter(id => !cache[id]);\n\n if (toFetch.length === 0) {\n userIds.forEach(id => {\n const username = cache[id];\n if (username) result[id] = username;\n });\n return result;\n }\n\n if (!sessionToken) {\n userIds.forEach(id => {\n const username = cache[id];\n if (username) result[id] = username;\n });\n return result;\n }\n\n await Promise.all(\n toFetch.map(async userId => {\n try {\n const user = await http.request<RevoltUserResponse>(`/users/${userId}`);\n if (user?.username && user._id) {\n cache[user._id] = user.username;\n result[user._id] = user.username;\n }\n } catch (e) {\n console.error(`Failed to fetch user ${userId}:`, e);\n }\n })\n );\n\n userIds.forEach(id => {\n const username = cache[id];\n if (username) result[id] = username;\n });\n\n return result;\n }\n\n function getFallback(userId: string): string {\n return userId.length >= 4 ? `User-${userId.slice(-4)}` : 'user';\n }\n\n return {\n seed,\n get,\n fetch,\n fetchMultiple,\n getFallback,\n };\n}\n\nexport type UserCache = ReturnType<typeof createUserCache>;\n","import type { Message } from '../../../types/message';\nimport type { RevoltIncomingMessagePayload } from '../../../types/revolt';\nimport type { RevoltSocketEventHandlers } from '../../../types/socket';\nimport type { UserCache } from '../services/userCache';\nimport type { User } from '../../../types/user';\nimport {\n cleanAttachmentUrls,\n transformAttachments,\n transformFileAttachments,\n normalizeReplies,\n createSystemMessage,\n} from '../transforms/messageTransform';\nimport { REVOLT_SYSTEM_USER_ID, SYSTEM_MESSAGE_TEXTS } from '../../../constants/constants';\nimport { getUserDisplayName } from '../../../utils/getUserDisplayName';\nimport { enrichWithCorvaData } from '../../../utils/parseCorvaSystemMessage';\n\n// Helper: get display name from membersById cache or fallback to userCache\nasync function getUserDisplayNameOrFetch(\n userId: string,\n getMemberById: ((id: string) => User | undefined) | undefined,\n userCache: UserCache,\n sessionToken: string | null\n): Promise<string> {\n const member = getMemberById?.(userId);\n if (member) {\n return getUserDisplayName(member);\n }\n const usernames = await userCache.fetchMultiple([userId], sessionToken);\n return usernames[userId] || userId.slice(-4);\n}\n\n// Helper: get multiple display names efficiently, batching cache misses\nasync function getMultipleUserDisplayNames(\n userIds: string[],\n getMemberById: ((id: string) => User | undefined) | undefined,\n userCache: UserCache,\n sessionToken: string | null\n): Promise<Record<string, string>> {\n const cachedResults: Record<string, string> = {};\n const toFetch = userIds.filter(userId => {\n const member = getMemberById?.(userId);\n if (member) {\n cachedResults[userId] = getUserDisplayName(member);\n return false;\n }\n return true;\n });\n\n if (toFetch.length === 0) {\n return cachedResults;\n }\n\n const usernames = await userCache.fetchMultiple(toFetch, sessionToken);\n const fetchedResults = toFetch.reduce(\n (acc, userId) => {\n acc[userId] = usernames[userId] || userId.slice(-4);\n return acc;\n },\n {} as Record<string, string>\n );\n\n return { ...cachedResults, ...fetchedResults };\n}\n\nexport async function handleIncomingMessage(\n data: RevoltIncomingMessagePayload,\n userCache: UserCache,\n sessionToken: string | null,\n autumnUrl: string,\n handlers: RevoltSocketEventHandlers,\n getMemberById?: (userId: string) => User | undefined\n): Promise<void> {\n const sys = data.system;\n\n if (sys?.type === 'user_added' && sys.id) {\n const userIds = sys.by ? [sys.id, sys.by] : [sys.id];\n const names = await getMultipleUserDisplayNames(\n userIds,\n getMemberById,\n userCache,\n sessionToken\n );\n const addedName = names[sys.id];\n const byName = sys.by ? names[sys.by] : undefined;\n\n const messageText = byName\n ? `${byName} added ${addedName} to conversation`\n : `${addedName} was added to conversation`;\n\n const message = createSystemMessage(\n data._id,\n data.channel,\n messageText,\n data.created_at || new Date().toISOString(),\n 'au',\n {\n userId: sys.id,\n actorId: sys.by,\n }\n );\n\n handlers.onMessage?.(message);\n return;\n }\n\n if (sys?.type === 'user_joined' && sys.id) {\n const addedName = await getUserDisplayNameOrFetch(\n sys.id,\n getMemberById,\n userCache,\n sessionToken\n );\n\n const message = createSystemMessage(\n data._id,\n data.channel,\n `${addedName} joined the conversation`,\n data.created_at || new Date().toISOString(),\n 'au',\n {\n userId: sys.id,\n }\n );\n\n handlers.onMessage?.(message);\n return;\n }\n\n if (sys?.type === 'user_remove' && sys.id && sys.by) {\n const names = await getMultipleUserDisplayNames(\n [sys.id, sys.by],\n getMemberById,\n userCache,\n sessionToken\n );\n const removedUserName = names[sys.id];\n const removedByName = names[sys.by];\n\n const message = createSystemMessage(\n data._id,\n data.channel,\n SYSTEM_MESSAGE_TEXTS.USER_REMOVED(\n removedByName || SYSTEM_MESSAGE_TEXTS.DEFAULT_USER,\n removedUserName || SYSTEM_MESSAGE_TEXTS.DEFAULT_USER\n ),\n data.created_at || new Date().toISOString(),\n 'ru',\n {\n userId: sys.id,\n actorId: sys.by,\n }\n );\n\n handlers.onMessage?.(message);\n return;\n }\n\n if (sys?.type === 'user_left' && sys.id) {\n const leftUserName = await getUserDisplayNameOrFetch(\n sys.id,\n getMemberById,\n userCache,\n sessionToken\n );\n\n const message = createSystemMessage(\n data._id,\n data.channel,\n SYSTEM_MESSAGE_TEXTS.USER_LEFT(leftUserName || SYSTEM_MESSAGE_TEXTS.DEFAULT_USER),\n data.created_at || new Date().toISOString(),\n 'ul',\n {\n userId: sys.id,\n }\n );\n\n handlers.onMessage?.(message);\n return;\n }\n\n if (sys?.type === 'message_pinned' && sys.id) {\n const pinnedBy = sys.by\n ? await getUserDisplayNameOrFetch(sys.by, getMemberById, userCache, sessionToken)\n : 'User';\n\n const message: Message = {\n ...createSystemMessage(\n data._id,\n data.channel,\n `${pinnedBy} pinned a message`,\n data.created_at || new Date().toISOString(),\n 'message_pinned',\n {\n actorId: sys.by,\n }\n ),\n pinnedMessageId: sys.id,\n };\n\n handlers.onMessage?.(message);\n return;\n }\n\n if (sys?.type === 'message_unpinned' && sys.id) {\n const unpinnedBy = sys.by\n ? await getUserDisplayNameOrFetch(sys.by, getMemberById, userCache, sessionToken)\n : 'User';\n\n const message: Message = {\n ...createSystemMessage(\n data._id,\n data.channel,\n `${unpinnedBy} unpinned a message`,\n data.created_at || new Date().toISOString(),\n 'message_unpinned',\n {\n actorId: sys.by,\n }\n ),\n unpinnedMessageId: sys.id,\n };\n\n handlers.onMessage?.(message);\n return;\n }\n\n let username = data.author ? userCache.get(data.author) : undefined;\n\n if (!username && data.author && sessionToken) {\n username = await userCache.fetch(data.author, sessionToken);\n }\n\n if (!username) {\n if (data.author === REVOLT_SYSTEM_USER_ID) {\n username = 'system';\n } else if (data.author) {\n username = userCache.getFallback(data.author);\n }\n }\n\n const messageContent = data.content || '';\n\n let cleanContent = messageContent;\n if (Array.isArray(data.attachments) && data.attachments.length > 0) {\n cleanContent = cleanAttachmentUrls(messageContent, data.attachments);\n }\n\n const attachments = transformAttachments(data.attachments, autumnUrl);\n\n if (!cleanContent.trim() && !attachments?.length) {\n return;\n }\n const files = transformFileAttachments(\n data.attachments,\n autumnUrl,\n data.channel,\n data.author || 'unknown'\n );\n\n const message: Message = enrichWithCorvaData({\n _id: data._id,\n nonce: data.nonce,\n rid: data.channel,\n msg: cleanContent,\n ts: data.created_at || new Date().toISOString(),\n u: {\n _id: data.author || 'system',\n username: username || 'unknown',\n },\n _updatedAt: data.edited || data.created_at || new Date().toISOString(),\n editedAt: data.edited,\n replies: normalizeReplies(data.replies),\n attachments,\n files,\n });\n\n handlers.onMessage?.(message);\n}\n\nexport async function handleTypingEvent(\n channelId: string,\n userId: string,\n isTyping: boolean,\n userCache: UserCache,\n sessionToken: string | null,\n handlers: RevoltSocketEventHandlers\n): Promise<void> {\n let username = userCache.get(userId);\n\n if (!username && userId && sessionToken) {\n username = await userCache.fetch(userId, sessionToken);\n }\n\n if (!username) {\n username = userCache.getFallback(userId);\n }\n\n handlers.onTyping?.({\n userId: userId || 'unknown',\n username,\n isTyping,\n roomId: channelId,\n });\n}\n","import type { RevoltSocketEventHandlers, ChannelUnread } from '../../../types/socket';\nimport type { UserCache } from '../services/userCache';\nimport type { User } from '../../../types/user';\n\nimport { handleIncomingMessage, handleTypingEvent } from './messageHandlers';\n\ninterface ReadyChannel {\n _id: string;\n channel_type: string;\n last_message_id?: string;\n name?: string;\n}\n\ninterface ReadyEvent {\n type: 'Ready';\n channels: ReadyChannel[];\n channel_unreads?: ChannelUnread[];\n}\n\nexport function createEventRouter(\n userCache: UserCache,\n sessionToken: () => string | null,\n autumnUrl: string,\n handlers: RevoltSocketEventHandlers,\n getMemberById?: (userId: string) => User | undefined\n) {\n async function route(data: string): Promise<void> {\n try {\n const message = JSON.parse(data);\n\n switch (message.type) {\n case 'Authenticated':\n handlers.onAuthenticated?.();\n break;\n\n case 'Ready': {\n const readyEvent = message as ReadyEvent;\n handlers.onReady?.(readyEvent.channels, readyEvent.channel_unreads);\n break;\n }\n\n case 'Message':\n await handleIncomingMessage(\n message,\n userCache,\n sessionToken(),\n autumnUrl,\n handlers,\n getMemberById\n );\n break;\n\n case 'MessageUpdate': {\n const updateData = message as {\n id: string;\n channel: string;\n data?: {\n content?: string;\n edited?: string;\n };\n };\n\n handlers.onMessageUpdate?.(updateData.id, updateData.channel, {\n content: updateData.data?.content,\n edited: updateData.data?.edited,\n });\n break;\n }\n\n case 'MessageDelete': {\n const deleteData = message as {\n id: string;\n channel: string;\n };\n handlers.onMessageDelete?.(deleteData.id, deleteData.channel);\n break;\n }\n\n case 'MessageReact': {\n const emoji = message.emoji_id as string;\n const payload = {\n event: 'reaction',\n op: 'add',\n messageId: message.id as string,\n userId: message.user_id as string,\n emoji,\n };\n handlers.onRoomChange?.(message.channel_id as string, payload);\n break;\n }\n\n case 'MessageUnreact': {\n const emoji = message.emoji_id as string;\n const payload = {\n event: 'reaction',\n op: 'remove',\n messageId: message.id as string,\n userId: message.user_id as string,\n emoji,\n };\n handlers.onRoomChange?.(message.channel_id as string, payload);\n break;\n }\n\n case 'ChannelStartTyping':\n await handleTypingEvent(\n message.id,\n message.user,\n true,\n userCache,\n sessionToken(),\n handlers\n );\n break;\n\n case 'ChannelStopTyping':\n await handleTypingEvent(\n message.id,\n message.user,\n false,\n userCache,\n sessionToken(),\n handlers\n );\n break;\n\n case 'ChannelCreate': {\n const payload = {\n event: 'create',\n channel_type: message.channel_type,\n name: message.name,\n recipients: message.recipients,\n owner: message.owner,\n };\n handlers.onRoomChange?.(message._id, payload);\n break;\n }\n\n case 'ChannelGroupLeave': {\n const payload = { event: 'leave', userId: message.user };\n handlers.onRoomChange?.(message.id, payload);\n break;\n }\n\n case 'ChannelAck': {\n if (message.id && message.message_id) {\n handlers.onChannelAck?.(message.id, message.message_id);\n }\n break;\n }\n\n case 'UserUpdate':\n if (message.data && typeof message.data.online === 'boolean') {\n handlers.onUserStatusChange?.(message.id, message.data.online ? 'online' : 'offline');\n }\n break;\n\n case 'Error':\n if (message.error === 'InvalidSession') handlers.onInvalidSession?.();\n break;\n\n default:\n break;\n }\n } catch (error) {\n console.error('🔌 Error parsing Revolt WebSocket message:', error);\n }\n }\n\n return { route };\n}\n","export interface ReconnectionConfig {\n baseDelay: number;\n maxDelay: number;\n onReconnect: () => void;\n subscribeReconnectHints?: (retry: () => void) => () => void;\n}\n\n// Backoff with jitter and no attempt cap; a platform reconnect hint (back online, app visible)\n// retries at once.\nexport function createReconnectionManager(config: ReconnectionConfig) {\n let attempts = 0;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n let stopped = false;\n\n const clearTimer = () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n const fire = () => {\n clearTimer();\n config.onReconnect();\n };\n\n const retryNow = () => {\n if (timeoutId && !stopped) fire();\n };\n\n const unsubscribeHints = config.subscribeReconnectHints?.(retryNow);\n\n function schedule(): void {\n if (stopped) return;\n clearTimer();\n attempts += 1;\n const exponential = Math.min(config.maxDelay, config.baseDelay * 2 ** (attempts - 1));\n timeoutId = setTimeout(fire, Math.round(exponential * (0.5 + Math.random())));\n }\n\n function reset(): void {\n attempts = 0;\n clearTimer();\n }\n\n function stop(): void {\n stopped = true;\n clearTimer();\n }\n\n function resume(): void {\n stopped = false;\n }\n\n function shouldReconnect(closeCode: number): boolean {\n return !stopped && closeCode !== 1000;\n }\n\n function getAttempts(): number {\n return attempts;\n }\n\n function isScheduled(): boolean {\n return timeoutId !== null;\n }\n\n function dispose(): void {\n stop();\n unsubscribeHints?.();\n }\n\n return {\n schedule,\n reset,\n stop,\n resume,\n shouldReconnect,\n getAttempts,\n isScheduled,\n dispose,\n };\n}\n","import type { ChatPlatform, SocketCloseEventLike } from '../platform/types';\nimport type { RevoltSocketEventHandlers } from '../types/socket';\nimport type { User } from '../types/user';\n\nimport { createHttpClient } from './core/http';\nimport { Connection } from './socket/core/connection';\nimport { createUserCache } from './socket/services/userCache';\nimport { createEventRouter } from './socket/handlers/eventRouter';\nimport { createReconnectionManager } from './socket/services/reconnection';\n\nexport interface RevoltSocketConfig {\n apiUrl: string;\n wsUrl: string;\n platform: ChatPlatform;\n}\n\nexport function createRevoltSocket(\n { apiUrl, wsUrl, platform }: RevoltSocketConfig,\n handlers: RevoltSocketEventHandlers = {},\n getMemberById?: (userId: string) => User | undefined\n) {\n let autumnUrl = apiUrl;\n try {\n const httpBase = apiUrl.replace(/\\/$/, '');\n autumnUrl = httpBase.replace(/\\/api$/i, '/autumn');\n } catch {\n /* keep default */\n }\n\n const state = {\n sessionToken: null as string | null,\n userId: null as string | null,\n handlers,\n };\n\n const http = createHttpClient({\n baseUrl: apiUrl,\n fetch: (url, init) => platform.fetch(url, init),\n getToken: () => state.sessionToken,\n onUnauthorized: () => state.handlers.onInvalidSession?.(),\n });\n\n const connection = new Connection(wsUrl, url => platform.createWebSocket(url));\n\n const reconnection = createReconnectionManager({\n baseDelay: 1000,\n maxDelay: 30000,\n subscribeReconnectHints: platform.subscribeReconnectHints?.bind(platform),\n onReconnect: () => {\n if (state.sessionToken && state.userId) {\n connect(state.sessionToken, state.userId).catch(error => {\n console.error('🔌 Revolt WebSocket reconnect failed:', error);\n // A failure without a close event still needs a retry.\n if (!reconnection.isScheduled()) reconnection.schedule();\n });\n }\n },\n });\n\n const userCache = createUserCache(http);\n const eventRouter = createEventRouter(\n userCache,\n () => state.sessionToken,\n autumnUrl,\n {\n ...handlers,\n // Only an accepted token ends a retry run.\n onAuthenticated: () => {\n reconnection.reset();\n state.handlers.onAuthenticated?.();\n },\n },\n getMemberById\n );\n\n function authenticate(): void {\n if (state.sessionToken) {\n connection.send({\n type: 'Authenticate',\n token: state.sessionToken,\n });\n }\n }\n\n async function connect(sessionToken: string, userId: string): Promise<void> {\n state.sessionToken = sessionToken;\n state.userId = userId;\n reconnection.resume();\n return connection.connect();\n }\n\n connection.on('open', () => {\n authenticate();\n state.handlers.onConnected?.();\n });\n\n connection.on('message', (data: string) => {\n eventRouter.route(data).catch(console.error);\n });\n\n connection.on('close', (event: SocketCloseEventLike) => {\n console.error('🔌 Revolt WebSocket disconnected:', {\n code: event.code,\n reason: event.reason,\n wasClean: event.wasClean,\n attempts: reconnection.getAttempts(),\n });\n state.handlers.onDisconnected?.();\n\n if (reconnection.shouldReconnect(event.code)) {\n reconnection.schedule();\n }\n });\n\n connection.on('error', (error: unknown) => {\n console.error('🔌 Revolt WebSocket error:', error);\n state.handlers.onError?.(error);\n });\n\n function seedUsers(users: Array<{ _id: string; username: string }>): void {\n userCache.seed(users);\n }\n\n function subscribeToRoom(_roomId: string): void {\n // Revolt doesn't require explicit subscription\n }\n\n function sendTyping(roomId: string, isTyping: boolean): void {\n if (isTyping) {\n connection.send({\n type: 'BeginTyping',\n channel: roomId,\n });\n } else {\n connection.send({\n type: 'EndTyping',\n channel: roomId,\n });\n }\n }\n\n function disconnect(): void {\n reconnection.stop();\n connection.disconnect();\n }\n\n function destroy(): void {\n disconnect();\n reconnection.dispose();\n }\n\n function isConnected(): boolean {\n return connection.isConnected();\n }\n\n function setEventHandlers(handlers: RevoltSocketEventHandlers): void {\n state.handlers = handlers;\n }\n\n return {\n connect,\n disconnect,\n destroy,\n isConnected,\n seedUsers,\n subscribeToRoom,\n sendTyping,\n setEventHandlers,\n };\n}\n\nexport type RevoltSocketInstance = ReturnType<typeof createRevoltSocket>;\n","/**\n * Synchronous key-value storage, shaped like `localStorage`. Core reads session and last-room\n * data synchronously; React Native can back this with MMKV, or an in-memory map hydrated from\n * AsyncStorage before chat starts and written through in the background.\n */\nexport interface KeyValueStorage {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\nlet configuredStorage: KeyValueStorage | null = null;\nconst configuredListeners = new Set<() => void>();\n\nexport function configureChatStorage(storage: KeyValueStorage | null): void {\n configuredStorage = storage;\n if (storage) configuredListeners.forEach(listener => listener());\n}\n\nexport function isChatStorageConfigured(): boolean {\n return configuredStorage !== null;\n}\n\n/**\n * Stores are created when core loads, before the host can configure storage; state they read\n * from storage at creation is reloaded through this.\n */\nexport function onChatStorageConfigured(listener: () => void): () => void {\n configuredListeners.add(listener);\n return () => configuredListeners.delete(listener);\n}\n\n/** Throws until configured; callers already treat storage errors as \"storage unavailable\". */\nexport function getChatStorage(): KeyValueStorage {\n if (!configuredStorage) {\n throw new Error('Chat storage is not configured. Call configureChatStorage() first.');\n }\n return configuredStorage;\n}\n\nexport function createMemoryStorage(): KeyValueStorage {\n const items = new Map<string, string>();\n return {\n getItem: key => items.get(key) ?? null,\n setItem: (key, value) => {\n items.set(key, value);\n },\n removeItem: key => {\n items.delete(key);\n },\n };\n}\n","import type { User } from '../../types/user';\nimport type { AssetChatChannel } from '../../types/asset';\nimport { getChatStorage } from '../../platform/storage';\n\nexport const SESSION_STORAGE_KEY = 'revolt_chat_session';\nconst H24 = 24 * 60 * 60 * 1000;\n\nexport interface SessionData {\n user: User;\n token: string;\n serverId?: string;\n revoltUserId?: string;\n assetChatChannels?: AssetChatChannel[];\n chatUsed?: boolean | null;\n attentionSeriesPlayed?: number;\n attentionNextSeriesAt?: number | null;\n}\n\ninterface AttentionBudget {\n attentionSeriesPlayed: number;\n attentionNextSeriesAt: number | null;\n}\n\nexport interface SaveSessionParams {\n user: User;\n token: string;\n serverId?: string;\n assetChatChannels?: AssetChatChannel[];\n chatUsed?: boolean | null;\n}\n\nexport class SessionManager {\n static clear(): void {\n try {\n getChatStorage().removeItem(SESSION_STORAGE_KEY);\n } catch (error) {\n console.error('Failed to clear session:', error);\n }\n }\n\n static save({\n user,\n token,\n serverId,\n assetChatChannels,\n chatUsed = null,\n }: SaveSessionParams): void {\n try {\n const session = {\n user,\n token,\n serverId,\n revoltUserId: user._id,\n assetChatChannels,\n chatUsed,\n timestamp: Date.now(),\n };\n getChatStorage().setItem(SESSION_STORAGE_KEY, JSON.stringify(session));\n } catch (error) {\n console.error('Failed to save session:', error);\n }\n }\n\n static markChatUsed(): void {\n this.patch({ chatUsed: true });\n }\n\n static saveAttentionBudget(budget: AttentionBudget): void {\n this.patch(budget);\n }\n\n static loadAttentionBudget(): AttentionBudget {\n const session = this.load();\n return {\n attentionSeriesPlayed: session?.attentionSeriesPlayed ?? 0,\n attentionNextSeriesAt: session?.attentionNextSeriesAt ?? null,\n };\n }\n\n private static patch(fields: Partial<SessionData>): void {\n try {\n const stored = getChatStorage().getItem(SESSION_STORAGE_KEY);\n if (!stored) return;\n\n getChatStorage().setItem(\n SESSION_STORAGE_KEY,\n JSON.stringify({ ...JSON.parse(stored), ...fields })\n );\n } catch (error) {\n console.error('Failed to update session:', error);\n }\n }\n\n // For storage event payloads; skips load()'s expiry check.\n static parseChatUsed(serialized: string | null): boolean | null {\n try {\n return serialized ? (JSON.parse(serialized).chatUsed ?? null) : null;\n } catch {\n return null;\n }\n }\n\n static load(): SessionData | null {\n try {\n const stored = getChatStorage().getItem(SESSION_STORAGE_KEY);\n if (!stored) return null;\n\n const session = JSON.parse(stored);\n if (Date.now() - session.timestamp > H24) {\n this.clear();\n return null;\n }\n\n return {\n user: session.user,\n token: session.token,\n serverId: session.serverId,\n revoltUserId: session.revoltUserId || session.user?._id,\n assetChatChannels: session.assetChatChannels,\n chatUsed: session.chatUsed ?? null,\n attentionSeriesPlayed: session.attentionSeriesPlayed ?? 0,\n attentionNextSeriesAt: session.attentionNextSeriesAt ?? null,\n };\n } catch (error) {\n console.error('Failed to load session:', error);\n return null;\n }\n }\n}\n","import { getChatStorage } from '../../platform/storage';\n\nconst STORAGE_KEY_PREFIX = 'corva_chat_last_room';\nconst ACTIVITY_KEY_PREFIX = 'corva_chat_last_activity';\nconst DEFAULT_ACTIVITY_THRESHOLD_DAYS = 3;\nconst DAY_MS = 24 * 60 * 60 * 1000;\n\nfunction getStorageKey(userId: string): string {\n return `${STORAGE_KEY_PREFIX}_${userId}`;\n}\n\nfunction getActivityKey(userId: string): string {\n return `${ACTIVITY_KEY_PREFIX}_${userId}`;\n}\n\nexport function saveLastOpenedRoom(roomId: string, userId: string): void {\n try {\n getChatStorage().setItem(getStorageKey(userId), roomId);\n } catch {\n console.error('Failed to save last opened room');\n }\n}\n\nexport function getLastOpenedRoom(userId: string): string | null {\n try {\n return getChatStorage().getItem(getStorageKey(userId));\n } catch {\n return null;\n }\n}\n\nexport function clearLastOpenedRoom(userId: string): void {\n try {\n getChatStorage().removeItem(getStorageKey(userId));\n } catch {\n console.error('Failed to clear last opened room');\n }\n}\n\nexport function saveLastChatActivity(userId: string): void {\n try {\n getChatStorage().setItem(getActivityKey(userId), String(Date.now()));\n } catch {\n console.error('Failed to save last chat activity');\n }\n}\n\nexport function wasRecentlyActive(\n userId: string,\n thresholdDays: number = DEFAULT_ACTIVITY_THRESHOLD_DAYS\n): boolean {\n try {\n const timestamp = getChatStorage().getItem(getActivityKey(userId));\n if (!timestamp) return false;\n\n return Date.now() - Number(timestamp) < thresholdDays * DAY_MS;\n } catch {\n return false;\n }\n}\n","import type { Message } from '../../types/message';\n\nconst MAX_CACHED_ROOMS = 20;\nconst MAX_MESSAGES_PER_ROOM = 500;\n\ninterface CacheEntry {\n messages: Message[];\n lastAccessed: number;\n}\n\nexport function createMessageCache() {\n const cache: Record<string, CacheEntry> = {};\n const dirtyChannels = new Set<string>();\n\n function evictLRU(): void {\n let oldestRoomId: string | null = null;\n let oldestTime = Infinity;\n\n Object.keys(cache).forEach(roomId => {\n const entry = cache[roomId];\n if (entry && entry.lastAccessed < oldestTime) {\n oldestTime = entry.lastAccessed;\n oldestRoomId = roomId;\n }\n });\n\n if (oldestRoomId) {\n delete cache[oldestRoomId];\n }\n }\n\n function get(roomId: string): Message[] | undefined {\n if (dirtyChannels.has(roomId)) {\n return undefined;\n }\n\n const entry = cache[roomId];\n if (!entry) {\n return undefined;\n }\n\n entry.lastAccessed = Date.now();\n return entry.messages;\n }\n\n function set(roomId: string, messages: Message[]): void {\n const trimmedMessages =\n messages.length > MAX_MESSAGES_PER_ROOM ? messages.slice(0, MAX_MESSAGES_PER_ROOM) : messages;\n\n if (!cache[roomId] && Object.keys(cache).length >= MAX_CACHED_ROOMS) {\n evictLRU();\n }\n\n cache[roomId] = {\n messages: trimmedMessages,\n lastAccessed: Date.now(),\n };\n dirtyChannels.delete(roomId);\n }\n\n function markDirty(roomId: string): void {\n dirtyChannels.add(roomId);\n delete cache[roomId];\n }\n\n function isDirty(roomId: string): boolean {\n return dirtyChannels.has(roomId);\n }\n\n function clear(roomId?: string): void {\n if (roomId) {\n delete cache[roomId];\n dirtyChannels.delete(roomId);\n } else {\n Object.keys(cache).forEach(key => delete cache[key]);\n dirtyChannels.clear();\n }\n }\n\n return {\n get,\n set,\n markDirty,\n isDirty,\n clear,\n };\n}\n\nexport type MessageCache = ReturnType<typeof createMessageCache>;\n","import type { Message } from '../../types/message';\n\ninterface PageCursor {\n before?: string;\n around?: string;\n}\n\nexport interface LocatorContext {\n getMessages: () => Message[];\n applyMessages: (messages: Message[]) => void;\n fetchPage: (cursor: PageCursor) => Promise<Message[]>;\n isCancelled: () => boolean;\n maxPages?: number;\n}\n\nconst DEFAULT_MAX_PAGES = 60;\n\nfunction merge(existing: Message[], incoming: Message[]): Message[] {\n if (incoming.length === 0) return existing;\n const seen = new Set(existing.map(m => m._id));\n const additions = incoming.filter(m => !seen.has(m._id));\n if (additions.length === 0) return existing;\n return [...existing, ...additions].sort(\n (a, b) => new Date(b.ts).getTime() - new Date(a.ts).getTime()\n );\n}\n\nexport async function loadUntilFound(targetId: string, ctx: LocatorContext): Promise<boolean> {\n const isLoaded = () => ctx.getMessages().some(m => m._id === targetId);\n if (isLoaded()) return true;\n\n const around = await ctx.fetchPage({ around: targetId });\n if (ctx.isCancelled()) return false;\n if (around.length > 0) ctx.applyMessages(merge(ctx.getMessages(), around));\n if (isLoaded()) return true;\n\n const max = ctx.maxPages ?? DEFAULT_MAX_PAGES;\n for (let i = 0; i < max && !ctx.isCancelled() && !isLoaded(); i += 1) {\n const oldest = ctx.getMessages()[ctx.getMessages().length - 1];\n if (!oldest) break;\n // eslint-disable-next-line no-await-in-loop -- sequential cursor\n const older = await ctx.fetchPage({ before: oldest._id });\n if (ctx.isCancelled()) return false;\n if (older.length === 0) break;\n ctx.applyMessages(merge(ctx.getMessages(), older));\n }\n\n return isLoaded();\n}\n","export function createTypingManager() {\n const timeouts: Record<string, ReturnType<typeof setTimeout>> = {};\n const displayById: Record<string, string> = {};\n\n function getDisplayName(userId: string): string | undefined {\n return displayById[userId];\n }\n\n function setDisplayName(userId: string, displayName: string): void {\n displayById[userId] = displayName;\n }\n\n function getDisplayById(): Record<string, string> {\n return displayById;\n }\n\n function clearUserTimeout(userId: string): void {\n const existing = timeouts[userId];\n if (existing) {\n clearTimeout(existing);\n delete timeouts[userId];\n }\n }\n\n function setUserTimeout(userId: string, callback: () => void, delay: number): void {\n clearUserTimeout(userId);\n timeouts[userId] = setTimeout(() => {\n callback();\n delete timeouts[userId];\n }, delay);\n }\n\n function clearAllTimeouts(): void {\n Object.values(timeouts).forEach(t => clearTimeout(t));\n Object.keys(timeouts).forEach(key => delete timeouts[key]);\n }\n\n function clear(): void {\n clearAllTimeouts();\n Object.keys(displayById).forEach(key => delete displayById[key]);\n }\n\n return {\n getDisplayName,\n setDisplayName,\n getDisplayById,\n clearTimeout: clearUserTimeout,\n setTimeout: setUserTimeout,\n clearAllTimeouts,\n clear,\n };\n}\n\nexport type TypingManager = ReturnType<typeof createTypingManager>;\n","// Chains a room's socket events so awaited API calls cannot apply out of order.\nexport function createRoomTaskQueue() {\n const tails = new Map<string, Promise<void>>();\n\n return (roomId: string, task: () => Promise<void>): Promise<void> => {\n const previous = tails.get(roomId) ?? Promise.resolve();\n const next = previous\n .then(task)\n .catch(error => console.error('Room event handling failed:', error))\n .finally(() => {\n if (tails.get(roomId) === next) tails.delete(roomId);\n });\n tails.set(roomId, next);\n return next;\n };\n}\n","import type { Message } from '../../types/message';\n\nexport const addMessage = (currentMessages: Message[], newMessage: Message): Message[] => {\n const messageExists = currentMessages.some(m => m._id === newMessage._id);\n\n if (messageExists) {\n return currentMessages;\n }\n\n const messageWithValidTimestamp = {\n ...newMessage,\n ts: newMessage.ts || new Date().toISOString(),\n // eslint-disable-next-line no-underscore-dangle\n _updatedAt: newMessage._updatedAt || newMessage.ts || new Date().toISOString(),\n };\n\n // Add and sort messages chronologically\n return [...currentMessages, messageWithValidTimestamp].sort(\n (a, b) => new Date(a.ts).getTime() - new Date(b.ts).getTime()\n );\n};\n\nexport const updateMessageInList = (\n messages: Message[],\n messageId: string,\n updates: Partial<Message>\n): Message[] => {\n return messages.map(msg => (msg._id === messageId ? { ...msg, ...updates } : msg));\n};\n\nexport const removeMessageFromList = (messages: Message[], messageId: string): Message[] => {\n return messages.filter(msg => msg._id !== messageId);\n};\n","import { v4 as uuid } from 'uuid';\n\nimport type { Message, MessageFormData, FileAttachment, UploadFile } from '../../types/message';\nimport type { RevoltMessageResponse, RevoltUploadResponse } from '../../types/revolt';\nimport type { RevoltAPIInstance } from '../../api/RevoltAPI';\n\nimport { addMessage } from './messageOperations';\n\n// Structural rather than `instanceof File`: React Native picks files as plain objects.\nconst isUploadFile = (file: unknown): file is UploadFile =>\n !!file && typeof (file as UploadFile).name === 'string';\n\nexport interface UploadedFile {\n file: UploadFile;\n url: string;\n id?: string;\n}\n\nexport interface UploadAndSendResult {\n response: RevoltMessageResponse;\n uploadedFiles: UploadedFile[];\n}\n\n// Upload file (if any) and send message to API\nexport async function uploadAndSend(\n api: RevoltAPIInstance,\n data: MessageFormData,\n nonce: string\n): Promise<UploadAndSendResult> {\n if (data.uploadedFileIds?.length) {\n const response = (await api.sendMessage(\n data.roomId,\n data.text,\n data.threadId,\n data.uploadedFileIds,\n nonce\n )) as RevoltMessageResponse;\n\n const files = data.files || [];\n const uploadedFiles: UploadedFile[] = data.uploadedFileIds\n .map((id, i) => ({\n file: files[i] as UploadFile,\n url: data.uploadedFileUrls?.[i] || '',\n id,\n }))\n .filter(uf => isUploadFile(uf.file));\n\n return { response, uploadedFiles };\n }\n\n // Fallback: Handle multiple files that need to be uploaded\n const filesToUpload = data.files || (data.file ? [data.file] : []);\n\n // Upload all files in parallel\n const uploadPromises = filesToUpload.filter(isUploadFile).map(async file => {\n const uploaded = (await api.uploadAttachment(file)) as RevoltUploadResponse;\n if (!uploaded || !uploaded.url) {\n throw new Error('Upload failed: No URL returned from server');\n }\n return { file, url: uploaded.url, id: uploaded.id };\n });\n\n const uploadResults = await Promise.allSettled(uploadPromises);\n const uploadedFiles: UploadedFile[] = uploadResults\n .filter(\n (\n result\n ): result is PromiseFulfilledResult<{\n file: UploadFile;\n url: string;\n id: string | undefined;\n }> => result.status === 'fulfilled'\n )\n .map(result => result.value);\n\n if (uploadResults.some(r => r.status === 'rejected') && uploadedFiles.length === 0) {\n throw new Error('All file uploads failed');\n }\n\n const uploadedIds = uploadedFiles.map(f => f.id).filter((id): id is string => Boolean(id));\n\n const response = (await api.sendMessage(\n data.roomId,\n data.text,\n data.threadId,\n uploadedIds.length ? uploadedIds : undefined,\n nonce\n )) as RevoltMessageResponse;\n\n return { response, uploadedFiles };\n}\n\n// Build final message object from API response\nexport function buildFinalMessage(\n response: RevoltMessageResponse,\n data: MessageFormData,\n currentUser: { _id: string; username: string } | null,\n uploadedFiles: UploadedFile[] = []\n): Message {\n const files: FileAttachment[] = uploadedFiles.map(({ file, url, id }) => ({\n _id: id || `file-${uuid()}`,\n name: file.name,\n type: file.type,\n size: file.size,\n rid: data.roomId,\n userId: response.author,\n url,\n }));\n\n return {\n _id: response._id,\n nonce: response.nonce,\n rid: response.channel,\n msg: data.text, // Use original text, not response.content which may include attachment URLs\n ts: new Date().toISOString(),\n u: {\n _id: response.author,\n username: response.user?.username || currentUser?.username || 'You',\n },\n _updatedAt: new Date().toISOString(),\n replies: data.threadId ? [data.threadId] : undefined,\n attachments: uploadedFiles.length\n ? uploadedFiles.map(({ file, url }) => ({ image_url: url, title: file.name || 'file' }))\n : undefined,\n files: files.length ? files : undefined,\n };\n}\n\n// Mark message as failed and rollback thread count if needed\nfunction markMessageFailed(messages: Message[], tempId: string, threadId?: string): Message[] {\n return messages.map(msg => {\n if (msg._id === tempId) {\n return { ...msg, isOptimistic: false, sendFailed: true };\n }\n if (threadId && msg._id === threadId) {\n return { ...msg, tcount: Math.max(0, (msg.tcount || 1) - 1) };\n }\n return msg;\n });\n}\n\n// The echo may have landed first, or the optimistic copy may be gone after a reload.\nexport function settleOptimisticMessage(\n messages: Message[],\n tempId: string,\n finalMessage: Message\n): Message[] {\n const withoutEcho = messages.filter(msg => msg._id !== finalMessage._id);\n return withoutEcho.some(msg => msg._id === tempId)\n ? withoutEcho.map(msg => (msg._id === tempId ? finalMessage : msg))\n : addMessage(withoutEcho, finalMessage);\n}\n\nexport function failOptimisticMessage(\n messages: Message[],\n optimistic: Message,\n threadId?: string\n): Message[] {\n const existing = messages.find(msg => msg._id === optimistic._id);\n if (!existing) {\n return addMessage(messages, { ...optimistic, isOptimistic: false, sendFailed: true });\n }\n // Only a copy still marked optimistic carries the thread-count bump.\n return markMessageFailed(messages, optimistic._id, existing.isOptimistic ? threadId : undefined);\n}\n","import type { Subscription } from '../../types/subscription';\nimport type { User } from '../../types/user';\nimport { DIRECT_MESSAGE_PLACEHOLDER } from '../../utils/getRoomDisplayName';\n\nexport const createGroupSubscription = (\n groupId: string,\n name: string,\n owner: { _id: string; username: string },\n recipientIds: string[]\n): Subscription => ({\n _id: groupId,\n rid: groupId,\n name,\n t: 'p',\n u: owner,\n ts: new Date().toISOString(),\n open: true,\n alert: false,\n userMentions: 0,\n groupMentions: 0,\n recipients: recipientIds,\n});\n\nexport const createDMSubscription = (roomId: string, recipient?: User): Subscription => {\n const displayName = recipient?.username || DIRECT_MESSAGE_PLACEHOLDER;\n\n return {\n _id: roomId,\n rid: roomId,\n name: displayName,\n t: 'd',\n u: { _id: '', username: '' },\n ts: new Date().toISOString(),\n open: true,\n alert: false,\n userMentions: 0,\n groupMentions: 0,\n dmUsername: recipient?.username,\n dmAvatarUrl: recipient?.avatarUrl,\n dmUserId: recipient?._id,\n };\n};\n\nexport const addOrUpdateSubscription = (\n subscriptions: Subscription[],\n newSubscription: Subscription\n): Subscription[] => {\n const index = subscriptions.findIndex(s => s.rid === newSubscription.rid);\n\n if (index >= 0) {\n const updated = [...subscriptions];\n updated[index] = { ...updated[index], ...newSubscription };\n return updated;\n }\n\n return [...subscriptions, newSubscription];\n};\n\nexport const removeSubscription = (\n subscriptions: Subscription[],\n roomId: string\n): Subscription[] => {\n return subscriptions.filter(s => s.rid !== roomId);\n};\n","import type { ChatPlatform } from './types';\nimport type { KeyValueStorage } from './storage';\nimport { configureChatStorage } from './storage';\n\n/** Requests against corva-api. The host adds the base URL, the Corva JWT and query encoding. */\nexport interface CorvaApiAdapter {\n get<T = unknown>(path: string, params?: Record<string, unknown>): Promise<T>;\n post<T = unknown>(path: string, body?: Record<string, unknown>): Promise<T>;\n}\n\nexport interface AppStateAdapter {\n /** Tab hidden (web) or app in the background (React Native). */\n isHidden(): boolean;\n /** Hidden, or visible without focus. Incoming messages alert while inactive. */\n isInactive(): boolean;\n /** Fires on hidden <-> visible changes. Returns an unsubscribe function. */\n subscribe(listener: (hidden: boolean) => void): () => void;\n /** Fires when the page or app is about to go away (web `pagehide`), to flush pending acks. */\n onTerminate?(listener: () => void): () => void;\n}\n\n/** Host-side reactions to chat events; each app decides how (browser notification, push, sound). */\nexport interface ChatNotifier<TContext = unknown> {\n showIncomingMessage?(context: TContext): void;\n onMessageSent?(userId: string): void;\n onLogout?(): void;\n}\n\nexport interface ChatDates {\n /** Epoch ms of tomorrow at `hour`:00 in the user's timezone. */\n startOfTomorrowAt(hour: number, now: number): number;\n}\n\nexport interface ChatHost {\n apiUrl: string;\n wsUrl: string;\n platform: ChatPlatform;\n storage: KeyValueStorage;\n corvaApi: CorvaApiAdapter;\n appState: AppStateAdapter;\n dates: ChatDates;\n notifier?: ChatNotifier;\n}\n\nlet configuredHost: ChatHost | null = null;\n\n/** Call once at app start, before any store is used. */\nexport function configureChat(host: ChatHost): void {\n configuredHost = host;\n configureChatStorage(host.storage);\n}\n\nexport function getChatHost(): ChatHost {\n if (!configuredHost) {\n throw new Error('Chat is not configured. Call configureChat() first.');\n }\n return configuredHost;\n}\n\nexport function resetChatHost(): void {\n configuredHost = null;\n configureChatStorage(null);\n}\n","/** Structural equality for plain JSON-like data (settings objects), in place of lodash `isEqual`. */\nexport function isDeepEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n\n return keysA.every(\n key =>\n Object.prototype.hasOwnProperty.call(b, key) &&\n isDeepEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key])\n );\n}\n","import { getChatHost } from '../platform/host';\n\n// JSON-safe stand-in for \"no end date\" so the value survives the chat_settings round-trip.\nexport const PAUSE_INDEFINITELY = Number.MAX_SAFE_INTEGER;\n\nexport const PAUSE_PRESETS = {\n THIRTY_MIN: '30m',\n ONE_HOUR: '1h',\n FOUR_HOURS: '4h',\n EIGHT_HOURS: '8h',\n UNTIL_TOMORROW: 'tomorrow',\n INDEFINITELY: 'indefinitely',\n} as const;\n\nexport type PausePreset = (typeof PAUSE_PRESETS)[keyof typeof PAUSE_PRESETS];\n\nexport interface PausePresetOption {\n value: PausePreset;\n label: string;\n}\n\nconst DURATION_MS: Partial<Record<PausePreset, number>> = {\n [PAUSE_PRESETS.THIRTY_MIN]: 30 * 60 * 1000,\n [PAUSE_PRESETS.ONE_HOUR]: 60 * 60 * 1000,\n [PAUSE_PRESETS.FOUR_HOURS]: 4 * 60 * 60 * 1000,\n [PAUSE_PRESETS.EIGHT_HOURS]: 8 * 60 * 60 * 1000,\n};\n\nconst PRESET_LABELS: Record<PausePreset, string> = {\n [PAUSE_PRESETS.THIRTY_MIN]: '30 min',\n [PAUSE_PRESETS.ONE_HOUR]: '1 hour',\n [PAUSE_PRESETS.FOUR_HOURS]: '4 hour',\n [PAUSE_PRESETS.EIGHT_HOURS]: '8 hour',\n [PAUSE_PRESETS.UNTIL_TOMORROW]: 'Until Tomorrow',\n [PAUSE_PRESETS.INDEFINITELY]: 'Indefinitely',\n};\n\nconst toOptions = (presets: PausePreset[]): PausePresetOption[] =>\n presets.map(value => ({ value, label: PRESET_LABELS[value] }));\n\nexport const PAUSE_PRESET_OPTIONS = toOptions([\n PAUSE_PRESETS.THIRTY_MIN,\n PAUSE_PRESETS.ONE_HOUR,\n PAUSE_PRESETS.FOUR_HOURS,\n PAUSE_PRESETS.UNTIL_TOMORROW,\n PAUSE_PRESETS.INDEFINITELY,\n]);\n\nexport const MUTE_PRESET_OPTIONS = toOptions([\n PAUSE_PRESETS.THIRTY_MIN,\n PAUSE_PRESETS.ONE_HOUR,\n PAUSE_PRESETS.FOUR_HOURS,\n PAUSE_PRESETS.EIGHT_HOURS,\n PAUSE_PRESETS.UNTIL_TOMORROW,\n PAUSE_PRESETS.INDEFINITELY,\n]);\n\nconst TOMORROW_START_HOUR = 8;\n\nexport function getPauseUntil(preset: PausePreset, now = Date.now()): number {\n if (preset === PAUSE_PRESETS.INDEFINITELY) return PAUSE_INDEFINITELY;\n if (preset === PAUSE_PRESETS.UNTIL_TOMORROW) {\n return getChatHost().dates.startOfTomorrowAt(TOMORROW_START_HOUR, now);\n }\n return now + (DURATION_MS[preset] ?? 0);\n}\n\nexport function isPauseActive(until: number | null | undefined, now = Date.now()): boolean {\n return typeof until === 'number' && until > now;\n}\n\nexport function isValidPausePreset(value: unknown): value is PausePreset {\n return typeof value === 'string' && Object.values(PAUSE_PRESETS).includes(value as PausePreset);\n}\n","export function waitForNextPaint(): Promise<void> {\n if (typeof requestAnimationFrame !== 'function') return Promise.resolve();\n\n return new Promise(resolve => {\n requestAnimationFrame(() => {\n setTimeout(resolve, 0);\n });\n });\n}\n","import { getChatHost } from '../../platform/host';\n\nimport type { ChatAssetType } from '../../types/asset';\n\n/**\n * Asset Chats API Module\n *\n * Fetches or creates a Revolt channel for a specific rig / frac fleet /\n * intervention unit. The backend will return the associated revolt_channel_id.\n */\n\ninterface AssetChatResponse {\n revolt_channel_id: string;\n}\n\nconst ASSET_ID_PARAM: Record<ChatAssetType, string> = {\n rig: 'rig_id',\n frac_fleet: 'frac_fleet_id',\n intervention_unit: 'intervention_unit_id',\n};\n\nexport async function getAssetChatChannel(\n assetId: string,\n assetType: ChatAssetType\n): Promise<string> {\n if (!assetId || Number.isNaN(Number(assetId))) {\n throw new Error('Asset ID is required');\n }\n\n const body = { [ASSET_ID_PARAM[assetType]]: Number(assetId) };\n\n const response = await getChatHost().corvaApi.post<AssetChatResponse>(\n '/v2/integration/revolt_chat_sessions',\n body\n );\n\n if (!response?.revolt_channel_id) {\n throw new Error('No revolt_channel_id returned from asset chat API');\n }\n\n return response.revolt_channel_id;\n}\n","import type { User as RevoltUser } from '../types/user';\nimport type { CorvaUser, CorvaAPIUser } from '../types/corvaIntegration';\n\n// Union type for user data we might have (full CorvaUser or API response)\ntype StoredCorvaUser = CorvaUser | CorvaAPIUser;\n\n/** Extracts common fields from either CorvaUser or CorvaAPIUser */\nexport function getCorvaUserFields(corvaUser: StoredCorvaUser) {\n const isAPIUser = 'attributes' in corvaUser;\n const attrs = isAPIUser ? corvaUser.attributes : corvaUser;\n return {\n firstName: attrs.first_name,\n lastName: attrs.last_name,\n email: attrs.email,\n profilePhoto: attrs.profile_photo,\n title: attrs.title,\n role: 'role' in attrs ? attrs.role : undefined,\n id: isAPIUser ? corvaUser.id : (corvaUser as CorvaUser).id,\n };\n}\n\nexport function createCorvaUserService() {\n const revoltToCorva = new Map<string, StoredCorvaUser>();\n\n return {\n setMapping(revoltUserId: string, corvaUser: StoredCorvaUser) {\n revoltToCorva.set(revoltUserId, corvaUser);\n },\n\n getCorvaUser(revoltUserId: string): StoredCorvaUser | undefined {\n return revoltToCorva.get(revoltUserId);\n },\n\n clear() {\n revoltToCorva.clear();\n },\n\n enrichUser(user: RevoltUser): RevoltUser {\n const corvaUser = revoltToCorva.get(user._id);\n\n if (!corvaUser) {\n return {\n ...user,\n displayName: user.name || user.username || 'Unknown User',\n displayAvatar: user.avatarUrl || undefined,\n email: user.emails?.[0]?.address || undefined,\n };\n }\n\n const fields = getCorvaUserFields(corvaUser);\n const corvaName = `${fields.firstName} ${fields.lastName}`.trim() || fields.email;\n const displayName = corvaName || user.name || user.username || 'Unknown User';\n\n return {\n ...user,\n displayName,\n displayAvatar: fields.profilePhoto || user.avatarUrl || undefined,\n email: fields.email || user.emails?.[0]?.address || undefined,\n title: fields.title || undefined,\n role: fields.role || undefined,\n company: !('attributes' in corvaUser) ? corvaUser.company?.name : undefined,\n };\n },\n };\n}\n\nexport type CorvaUserService = ReturnType<typeof createCorvaUserService>;\n","import type { Message } from '../types/message';\nimport type { RevoltAPIInstance } from '../api/RevoltAPI';\nimport type { RevoltSocketInstance } from '../api/RevoltSocket';\nimport { createCorvaUserService, type CorvaUserService } from '../services/corvaUserService';\n\nimport { createMessageCache, type MessageCache } from './services/messageCache';\nimport { createTypingManager, type TypingManager } from './services/typingManager';\nimport type { AckScheduler } from './services/ackScheduler';\n\nexport interface SharedRefs {\n api?: RevoltAPIInstance;\n socket?: RevoltSocketInstance;\n serverUrl?: string;\n messageCache: MessageCache;\n typingManager: TypingManager;\n corvaUserService: CorvaUserService;\n forwardedMessageCache: Map<string, Message>;\n ackChannel?: AckScheduler;\n}\n\nexport const sharedRefs: SharedRefs = {\n api: undefined,\n socket: undefined,\n serverUrl: undefined,\n messageCache: createMessageCache(),\n typingManager: createTypingManager(),\n corvaUserService: createCorvaUserService(),\n forwardedMessageCache: new Map(),\n ackChannel: undefined,\n};\n","import { createStore } from 'zustand/vanilla';\nimport { isDeepEqual } from '../../utils/isDeepEqual';\n\nimport {\n getPauseUntil,\n isPauseActive,\n PAUSE_INDEFINITELY,\n type PausePreset,\n} from '../../utils/notificationPause';\n\nexport const NOTIFICATION_SETTING_ALL = 'all' as const;\nexport const NOTIFICATION_SETTING_MENTIONS = 'mentions' as const;\nexport const NOTIFICATION_SETTING_NOTHING = 'nothing' as const;\n\nexport type ChannelNotificationSetting =\n | typeof NOTIFICATION_SETTING_ALL\n | typeof NOTIFICATION_SETTING_MENTIONS\n | typeof NOTIFICATION_SETTING_NOTHING;\n\ntype EmailNotificationSetting =\n typeof NOTIFICATION_SETTING_MENTIONS | typeof NOTIFICATION_SETTING_NOTHING;\n\nexport const NOTIFICATION_DESTINATIONS = {\n PLATFORM: 'platform',\n MOBILE: 'mobile',\n EMAIL: 'email',\n} as const;\n\nexport type NotificationDestination =\n (typeof NOTIFICATION_DESTINATIONS)[keyof typeof NOTIFICATION_DESTINATIONS];\n\n// corva-api's unread email digest reads `setting.email` (RevoltChats::ChannelEmailSetting).\ninterface ChannelDestinationSettings {\n platform: ChannelNotificationSetting;\n mobile: ChannelNotificationSetting;\n email: EmailNotificationSetting;\n}\n\nexport interface ChannelNotificationPreference {\n setting: ChannelDestinationSettings;\n // Legacy indefinite mute; timed mutes live in `mutedUntil` (see `isChannelMuted`).\n muted: boolean;\n mutedUntil: number | null;\n mutePreset: PausePreset | null;\n notifyThreadReplies: boolean;\n}\n\nexport interface NotificationSettings {\n channels: Record<string, ChannelNotificationPreference>;\n}\n\n// User-level; the browser permission is checked separately.\nexport interface NotificationPreferences {\n browserNotifications: boolean;\n sound: boolean;\n pausedUntil: number | null;\n pausePreset: PausePreset | null;\n}\n\nexport interface NotificationStore {\n notificationSettings: NotificationSettings;\n preferences: NotificationPreferences;\n setPreferences: (preferences: NotificationPreferences) => void;\n setBrowserNotificationsEnabled: (enabled: boolean) => void;\n setSoundEnabled: (enabled: boolean) => void;\n pauseNotifications: (preset: PausePreset) => void;\n resumeNotifications: () => void;\n setChannelNotificationSetting: (roomId: string, setting: ChannelNotificationSetting) => void;\n setChannelDestinationSetting: {\n (\n roomId: string,\n destination: typeof NOTIFICATION_DESTINATIONS.EMAIL,\n setting: EmailNotificationSetting\n ): void;\n (\n roomId: string,\n destination:\n typeof NOTIFICATION_DESTINATIONS.PLATFORM | typeof NOTIFICATION_DESTINATIONS.MOBILE,\n setting: ChannelNotificationSetting\n ): void;\n (\n roomId: string,\n destination: NotificationDestination,\n setting: ChannelNotificationSetting\n ): void;\n };\n setChannelMuted: (roomId: string, muted: boolean) => void;\n muteChannelFor: (roomId: string, preset: PausePreset | null) => void;\n setChannelThreadReplies: (roomId: string, notify: boolean) => void;\n resetChannelPreference: (roomId: string) => void;\n setNotificationSettings: (settings: NotificationSettings) => void;\n}\n\nexport const DEFAULT_NOTIFICATION_SETTINGS: NotificationSettings = {\n channels: {},\n};\n\nexport const DEFAULT_NOTIFICATION_PREFERENCES: NotificationPreferences = {\n browserNotifications: true,\n sound: true,\n pausedUntil: null,\n pausePreset: null,\n};\n\nconst DEFAULT_CHANNEL_DESTINATION_SETTINGS: ChannelDestinationSettings = {\n platform: NOTIFICATION_SETTING_ALL,\n mobile: NOTIFICATION_SETTING_ALL,\n email: NOTIFICATION_SETTING_MENTIONS,\n};\n\nexport const DEFAULT_CHANNEL_PREFERENCE: ChannelNotificationPreference = {\n setting: DEFAULT_CHANNEL_DESTINATION_SETTINGS,\n muted: false,\n mutedUntil: null,\n mutePreset: null,\n notifyThreadReplies: false,\n};\n\n// Older stored prefs lack the mute fields and hold `setting` as the bare platform value.\nexport type StoredChannelPreference = Partial<\n Omit<ChannelNotificationPreference, 'setting'> & {\n setting: ChannelNotificationSetting | Partial<ChannelDestinationSettings>;\n }\n>;\n\nexport function withChannelPreferenceDefaults(\n pref: StoredChannelPreference | undefined\n): ChannelNotificationPreference {\n const { setting, ...rest } = pref ?? {};\n const destinations =\n typeof setting === 'string'\n ? { ...DEFAULT_CHANNEL_DESTINATION_SETTINGS, platform: setting }\n : { ...DEFAULT_CHANNEL_DESTINATION_SETTINGS, ...setting };\n return { ...DEFAULT_CHANNEL_PREFERENCE, ...rest, setting: destinations };\n}\n\nexport function isDefaultChannelPreference(pref: StoredChannelPreference | undefined): boolean {\n const full = withChannelPreferenceDefaults(pref);\n return (\n isDeepEqual(full.setting, DEFAULT_CHANNEL_DESTINATION_SETTINGS) &&\n full.muted === DEFAULT_CHANNEL_PREFERENCE.muted &&\n full.mutedUntil === DEFAULT_CHANNEL_PREFERENCE.mutedUntil &&\n full.mutePreset === DEFAULT_CHANNEL_PREFERENCE.mutePreset &&\n full.notifyThreadReplies === DEFAULT_CHANNEL_PREFERENCE.notifyThreadReplies\n );\n}\n\nexport function isChannelMuted(\n pref: Pick<ChannelNotificationPreference, 'muted' | 'mutedUntil'> | undefined,\n now = Date.now()\n): boolean {\n if (!pref) return false;\n return pref.muted || isPauseActive(pref.mutedUntil, now);\n}\n\nexport function isNotificationsPaused(\n preferences: Pick<NotificationPreferences, 'pausedUntil'>,\n now = Date.now()\n): boolean {\n return isPauseActive(preferences.pausedUntil, now);\n}\n\nexport const notificationStore = createStore<NotificationStore>()((set, get) => {\n const updateChannelPreference = (\n roomId: string,\n update: Partial<ChannelNotificationPreference>\n ) => {\n const currentSettings = get().notificationSettings;\n const currentPref = withChannelPreferenceDefaults(currentSettings.channels[roomId]);\n set({\n notificationSettings: {\n channels: {\n ...currentSettings.channels,\n [roomId]: { ...currentPref, ...update },\n },\n },\n });\n };\n\n return {\n notificationSettings: DEFAULT_NOTIFICATION_SETTINGS,\n preferences: DEFAULT_NOTIFICATION_PREFERENCES,\n setPreferences: preferences => set({ preferences }),\n setBrowserNotificationsEnabled: enabled =>\n set(state => ({ preferences: { ...state.preferences, browserNotifications: enabled } })),\n setSoundEnabled: enabled =>\n set(state => ({ preferences: { ...state.preferences, sound: enabled } })),\n pauseNotifications: preset =>\n set(state => ({\n preferences: {\n ...state.preferences,\n pausedUntil: getPauseUntil(preset),\n pausePreset: preset,\n },\n })),\n resumeNotifications: () => {\n if (get().preferences.pausedUntil === null) return;\n set(state => ({\n preferences: { ...state.preferences, pausedUntil: null, pausePreset: null },\n }));\n },\n\n setChannelNotificationSetting: (roomId, setting) =>\n get().setChannelDestinationSetting(roomId, NOTIFICATION_DESTINATIONS.PLATFORM, setting),\n setChannelDestinationSetting: (\n roomId: string,\n destination: NotificationDestination,\n setting: ChannelNotificationSetting\n ) => {\n // Email has no \"all\" mode; the popover switch may still send it.\n const value =\n destination === NOTIFICATION_DESTINATIONS.EMAIL && setting === NOTIFICATION_SETTING_ALL\n ? NOTIFICATION_SETTING_MENTIONS\n : setting;\n const current = withChannelPreferenceDefaults(get().notificationSettings.channels[roomId]);\n updateChannelPreference(roomId, { setting: { ...current.setting, [destination]: value } });\n },\n setChannelMuted: (roomId, muted) =>\n updateChannelPreference(roomId, {\n muted,\n mutedUntil: muted ? PAUSE_INDEFINITELY : null,\n mutePreset: null,\n }),\n muteChannelFor: (roomId, preset) => {\n if (preset) {\n updateChannelPreference(roomId, {\n muted: false,\n mutedUntil: getPauseUntil(preset),\n mutePreset: preset,\n });\n return;\n }\n const current = withChannelPreferenceDefaults(get().notificationSettings.channels[roomId]);\n if (!current.muted && current.mutedUntil === null) return;\n updateChannelPreference(roomId, { muted: false, mutedUntil: null, mutePreset: null });\n },\n setChannelThreadReplies: (roomId, notify) =>\n updateChannelPreference(roomId, { notifyThreadReplies: notify }),\n // Explicit defaults: a removed key does not survive the merging user-settings save.\n resetChannelPreference: roomId => updateChannelPreference(roomId, DEFAULT_CHANNEL_PREFERENCE),\n setNotificationSettings: settings => set({ notificationSettings: settings }),\n };\n});\n\nexport const resetNotificationStore = () =>\n notificationStore.setState({\n notificationSettings: DEFAULT_NOTIFICATION_SETTINGS,\n preferences: DEFAULT_NOTIFICATION_PREFERENCES,\n });\n","import { createStore } from 'zustand/vanilla';\n\nexport interface ChannelContentFilter {\n showFeeds: boolean;\n selectedFeeds: string[];\n}\n\nexport interface ChannelContentFilters {\n channels: Record<string, ChannelContentFilter>;\n}\n\nexport interface ChannelContentFilterStore {\n channelContentFilters: ChannelContentFilters;\n setChannelContentFilters: (filters: ChannelContentFilters) => void;\n setChannelShowFeeds: (channelId: string, showFeeds: boolean) => void;\n setChannelSelectedFeeds: (channelId: string, selectedFeeds: string[]) => void;\n}\n\nexport const DEFAULT_CHANNEL_CONTENT_FILTER: ChannelContentFilter = {\n showFeeds: true,\n selectedFeeds: ['alert'],\n};\n\nexport const DEFAULT_CHANNEL_CONTENT_FILTERS: ChannelContentFilters = {\n channels: {},\n};\n\nexport const channelContentFilterStore = createStore<ChannelContentFilterStore>()((set, get) => {\n const updateChannelFilter = (channelId: string, update: Partial<ChannelContentFilter>) => {\n const current = get().channelContentFilters;\n const currentFilter = current.channels[channelId] || DEFAULT_CHANNEL_CONTENT_FILTER;\n set({\n channelContentFilters: {\n channels: {\n ...current.channels,\n [channelId]: { ...currentFilter, ...update },\n },\n },\n });\n };\n\n return {\n channelContentFilters: DEFAULT_CHANNEL_CONTENT_FILTERS,\n\n setChannelContentFilters: filters => set({ channelContentFilters: filters }),\n setChannelShowFeeds: (channelId, showFeeds) => updateChannelFilter(channelId, { showFeeds }),\n setChannelSelectedFeeds: (channelId, selectedFeeds) =>\n updateChannelFilter(channelId, { selectedFeeds }),\n };\n});\n\nexport const resetChannelContentFilterStore = () =>\n channelContentFilterStore.setState({\n channelContentFilters: DEFAULT_CHANNEL_CONTENT_FILTERS,\n });\n","import { createStore } from 'zustand/vanilla';\n\nexport interface FavoriteRoomsSettings {\n favoriteRoomIds: string[];\n}\n\nexport interface FavoriteRoomsStore {\n favoriteRoomsSettings: FavoriteRoomsSettings;\n persistFavoriteRoomsCallback?: (favoriteRoomIds: string[]) => void;\n\n setFavoriteRoomsSettings: (settings: FavoriteRoomsSettings) => void;\n setPersistFavoriteRoomsCallback: (\n callback: ((favoriteRoomIds: string[]) => void) | undefined\n ) => void;\n addFavoriteRoom: (roomId: string) => void;\n removeFavoriteRoom: (roomId: string) => void;\n isRoomFavorite: (roomId: string) => boolean;\n}\n\nexport const DEFAULT_FAVORITE_ROOMS_SETTINGS: FavoriteRoomsSettings = {\n favoriteRoomIds: [],\n};\n\nexport const favoriteRoomsStore = createStore<FavoriteRoomsStore>()((set, get) => ({\n favoriteRoomsSettings: DEFAULT_FAVORITE_ROOMS_SETTINGS,\n persistFavoriteRoomsCallback: undefined,\n\n setFavoriteRoomsSettings: settings => set({ favoriteRoomsSettings: settings }),\n\n setPersistFavoriteRoomsCallback: callback => set({ persistFavoriteRoomsCallback: callback }),\n\n addFavoriteRoom: roomId => {\n const current = get().favoriteRoomsSettings?.favoriteRoomIds || [];\n if (current.includes(roomId)) return;\n const next = [...current, roomId];\n set({ favoriteRoomsSettings: { favoriteRoomIds: next } });\n get().persistFavoriteRoomsCallback?.(next);\n },\n\n removeFavoriteRoom: roomId => {\n const current = get().favoriteRoomsSettings?.favoriteRoomIds || [];\n if (!current.includes(roomId)) return;\n const next = current.filter(id => id !== roomId);\n set({ favoriteRoomsSettings: { favoriteRoomIds: next } });\n get().persistFavoriteRoomsCallback?.(next);\n },\n\n isRoomFavorite: roomId => get().favoriteRoomsSettings?.favoriteRoomIds?.includes(roomId) || false,\n}));\n\nexport const resetFavoriteRoomsStore = () =>\n favoriteRoomsStore.setState({\n favoriteRoomsSettings: DEFAULT_FAVORITE_ROOMS_SETTINGS,\n persistFavoriteRoomsCallback: undefined,\n });\n","import type { Message } from '../../types/message';\nimport { waitForNextPaint } from '../../utils/waitForNextPaint';\nimport { messageStore } from '../stores/messageStore';\nimport type { UIStore } from '../stores/uiStore';\n\ntype RoomSelectionStateUpdate = Partial<Pick<UIStore, 'isLoading' | 'isSwitchingRoom'>>;\n\ninterface PrepareRoomSelectionParams {\n roomId: string;\n currentRoomId?: string;\n isCacheDirty: (roomId: string) => boolean;\n getCachedMessages: (roomId: string) => Message[] | undefined;\n setState: (state: RoomSelectionStateUpdate) => void;\n}\n\ninterface RoomSelectionRequest {\n id: number;\n roomId: string;\n}\n\nlet latestRequestId = 0;\n\nexport function isCurrentRoomSelection(request: RoomSelectionRequest): boolean {\n return latestRequestId === request.id;\n}\n\nexport async function prepareRoomSelection({\n roomId,\n currentRoomId,\n isCacheDirty,\n getCachedMessages,\n setState,\n}: PrepareRoomSelectionParams): Promise<RoomSelectionRequest | null> {\n if (currentRoomId === roomId && !isCacheDirty(roomId)) return null;\n\n const request = {\n id: latestRequestId + 1,\n roomId,\n };\n latestRequestId = request.id;\n\n const isDirty = isCacheDirty(roomId);\n const cachedMessages = !isDirty ? getCachedMessages(roomId) || [] : [];\n\n if (cachedMessages.length > 0) {\n setState({ isSwitchingRoom: true, isLoading: true });\n messageStore.getState().setHasMoreMessages(cachedMessages.length >= 100);\n } else {\n setState({ isSwitchingRoom: true, isLoading: true });\n messageStore.setState({ messages: [], hasMoreMessages: false });\n }\n\n // Cached rooms need one paint before their heavy message render starts.\n await waitForNextPaint();\n\n return isCurrentRoomSelection(request) ? request : null;\n}\n","import { createStore } from 'zustand/vanilla';\n\nimport { getChatHost } from '../../platform/host';\n\nimport type { User } from '../../types/user';\nimport type { RoomType } from '../../types/room';\nimport type { CorvaUser, CorvaAPIUser } from '../../types/corvaIntegration';\nimport { sharedRefs } from '../sharedRefs';\n\nimport { authStore } from './authStore';\nimport { roomStore } from './roomStore';\n\nexport interface MemberStore {\n members: User[];\n membersRoomId: string | null;\n membersById: Record<string, User>;\n typingUsers: string[];\n serverMembersLoaded: boolean;\n serverMembersCache: User[] | null;\n allVisibleUsersCache: User[] | null;\n corvaUserMappings: Record<string, CorvaUser | CorvaAPIUser>;\n\n setMembers: (members: User[], roomId?: string) => void;\n setCorvaUserMapping: (revoltUserId: string, corvaUser: CorvaUser | CorvaAPIUser) => void;\n bulkSetCorvaUserMappings: (\n mappings: Array<{ revoltUserId: string; corvaUser: CorvaUser | CorvaAPIUser }>\n ) => void;\n getCorvaUserFromState: (revoltUserId: string) => CorvaUser | CorvaAPIUser | undefined;\n addMemberToCache: (user: User) => void;\n getMemberById: (userId: string) => User | undefined;\n removeUserFromMembers: (userId: string) => void;\n\n addTypingUser: (userId: string) => void;\n removeTypingUser: (userId: string) => void;\n setTypingUsers: (users: string[]) => void;\n simulateTyping: (userKey: string, isTyping: boolean, displayName?: string) => void;\n\n loadRoomMembers: (roomId: string, roomType: RoomType, isAssetChat?: boolean) => Promise<void>;\n searchUsers: (query: string) => Promise<User[]>;\n getUserByUsername: (username: string) => Promise<User | null>;\n getAllVisibleUsers: () => Promise<User[]>;\n syncCorvaUsers: (companyId?: number) => Promise<boolean>;\n}\n\nconst getInitialState = () => ({\n members: [] as User[],\n membersRoomId: null,\n membersById: {} as Record<string, User>,\n typingUsers: [] as string[],\n serverMembersLoaded: false,\n serverMembersCache: null,\n allVisibleUsersCache: null,\n corvaUserMappings: {} as Record<string, CorvaUser | CorvaAPIUser>,\n});\n\nlet visibleUsersRequest: Promise<User[]> | null = null;\nlet visibleUsersGeneration = 0;\n\n// A fetch that was in flight when the cache was dropped (logout, Corva re-sync) must not write\n// the old list back; bumping the generation makes it a no-op and lets the next caller refetch.\nconst invalidateVisibleUsers = () => {\n visibleUsersGeneration += 1;\n visibleUsersRequest = null;\n};\n\nconst seedSocketUsers = (members: { _id: string; username: string }[]) => {\n sharedRefs.socket?.seedUsers(members);\n sharedRefs.api?.seedUserCache(members);\n};\n\nasync function fetchAllVisibleUsers(): Promise<User[]> {\n const { api } = sharedRefs;\n if (!api) return [];\n\n const generation = visibleUsersGeneration;\n try {\n const { serverId } = authStore.getState();\n const aggregated = serverId ? await api.getServerMembers(serverId) : await api.getFriends();\n if (generation !== visibleUsersGeneration) return [];\n\n const map: Record<string, User> = {};\n aggregated.forEach(u => {\n const { _id } = u || {};\n if (_id && !map[_id]) {\n map[_id] = u;\n }\n });\n\n const { corvaUserService } = sharedRefs;\n const enrichedUsers = Object.values(map).map(u => corvaUserService.enrichUser(u));\n\n api.seedUserCache(enrichedUsers);\n memberStore.setState({ allVisibleUsersCache: enrichedUsers });\n return enrichedUsers;\n } catch {\n return [];\n }\n}\n\nexport const memberStore = createStore<MemberStore>()((set, get) => ({\n ...getInitialState(),\n\n setCorvaUserMapping: (revoltUserId, corvaUser) =>\n set(state => ({\n corvaUserMappings: { ...state.corvaUserMappings, [revoltUserId]: corvaUser },\n })),\n\n bulkSetCorvaUserMappings: mappings =>\n set(state => {\n const newMappings = { ...state.corvaUserMappings };\n mappings.forEach(({ revoltUserId, corvaUser }) => {\n newMappings[revoltUserId] = corvaUser;\n });\n return { corvaUserMappings: newMappings };\n }),\n\n getCorvaUserFromState: revoltUserId => get().corvaUserMappings[revoltUserId],\n\n setMembers: (members, roomId) => {\n const { corvaUserService } = sharedRefs;\n const enrichedMembers = members.map(m => corvaUserService.enrichUser(m));\n\n const { membersById: existingMembersById } = get();\n const { currentRoom } = roomStore.getState();\n const membersById: Record<string, User> = { ...existingMembersById };\n enrichedMembers.forEach(m => {\n membersById[m._id] = m;\n });\n\n const isCurrentRoomMembers = !roomId || currentRoom?._id === roomId;\n\n if (!isCurrentRoomMembers) {\n set({ membersById });\n return;\n }\n\n set({\n members: enrichedMembers,\n membersRoomId: roomId ?? currentRoom?._id ?? null,\n membersById,\n });\n\n if (currentRoom) {\n roomStore.getState().setCurrentRoom({\n ...currentRoom,\n usersCount: enrichedMembers.length,\n });\n }\n },\n\n addMemberToCache: user => {\n const { membersById } = get();\n if (!membersById[user._id]) {\n set({ membersById: { ...membersById, [user._id]: user } });\n }\n },\n\n getMemberById: userId => get().membersById[userId],\n\n removeUserFromMembers: userId =>\n set(state => {\n const members = state.members.filter(m => m._id !== userId);\n const membersById = { ...state.membersById };\n delete membersById[userId];\n return { members, membersById };\n }),\n\n addTypingUser: userId =>\n set(state => {\n if (!state.typingUsers.includes(userId)) {\n return { typingUsers: [...state.typingUsers, userId] };\n }\n return state;\n }),\n\n removeTypingUser: userId =>\n set(state => ({ typingUsers: state.typingUsers.filter(u => u !== userId) })),\n\n setTypingUsers: users => set({ typingUsers: users }),\n\n simulateTyping: (userKey, isTyping, displayName) => {\n const { typingManager } = sharedRefs;\n typingManager.clearTimeout(userKey);\n\n if (isTyping) {\n if (displayName) typingManager.setDisplayName(userKey, displayName);\n const currentTypingUsers = get().typingUsers;\n if (!currentTypingUsers.includes(userKey)) {\n set({ typingUsers: [...currentTypingUsers, userKey] });\n }\n typingManager.setTimeout(\n userKey,\n () => {\n const { typingUsers: current } = get();\n set({ typingUsers: current.filter(u => u !== userKey) });\n },\n 5000\n );\n } else {\n const currentTypingUsers = get().typingUsers;\n set({ typingUsers: currentTypingUsers.filter(u => u !== userKey) });\n }\n },\n\n loadRoomMembers: async (roomId, roomType, isAssetChat = false) => {\n const { api } = sharedRefs;\n if (!api) return;\n\n const { serverId } = authStore.getState();\n\n try {\n const useServerMembers = (isAssetChat || roomType === 'c') && serverId;\n if (useServerMembers) {\n const { serverMembersCache, serverMembersLoaded } = get();\n\n if (serverMembersLoaded && serverMembersCache && serverMembersCache.length > 0) {\n get().setMembers(serverMembersCache, roomId);\n seedSocketUsers(serverMembersCache.map(m => ({ _id: m._id, username: m.username })));\n return;\n }\n\n const members: User[] = await api.getServerMembers(serverId);\n get().setMembers(members, roomId);\n seedSocketUsers(members.map(m => ({ _id: m._id, username: m.username })));\n set({ serverMembersLoaded: true, serverMembersCache: members });\n return;\n }\n\n const channel = await api.getChannel(roomId);\n const channelMembers = channel?.members;\n if (Array.isArray(channelMembers) && channelMembers.length > 0) {\n const members: User[] = channelMembers.map(m => ({\n _id: m._id,\n username: m.username,\n name: m.display_name || m.username,\n status: m.online ? 'online' : 'offline',\n isBot: !!m.bot,\n }));\n get().setMembers(members, roomId);\n seedSocketUsers(members.map(m => ({ _id: m._id, username: m.username })));\n return;\n }\n\n const members: User[] = await api.getGroupMembers(roomId);\n get().setMembers(members, roomId);\n seedSocketUsers(members.map(m => ({ _id: m._id, username: m.username })));\n } catch (e: unknown) {\n console.error('Failed to load room members:', e);\n }\n },\n\n searchUsers: async query => {\n try {\n const allUsers = await get().getAllVisibleUsers();\n const q = query.trim().toLowerCase();\n\n if (!q) return allUsers;\n\n return allUsers.filter(\n u =>\n u.username?.toLowerCase().includes(q) ||\n u.name?.toLowerCase().includes(q) ||\n u.displayName?.toLowerCase().includes(q)\n );\n } catch (e) {\n console.error('Failed to search users:', e);\n return [];\n }\n },\n\n getUserByUsername: async username => {\n const { api } = sharedRefs;\n if (!api) return null;\n\n try {\n const usernameLc = username.toLowerCase();\n\n const allUsers = await get().getAllVisibleUsers();\n const found = allUsers.find(u => u.username?.toLowerCase() === usernameLc);\n if (found) return found;\n\n const users = await api.searchUsers(username);\n const user = users.find(u => u.username?.toLowerCase() === usernameLc);\n\n if (user) return sharedRefs.corvaUserService.enrichUser(user);\n\n return null;\n } catch {\n return null;\n }\n },\n\n getAllVisibleUsers: async () => {\n const cached = get().allVisibleUsersCache;\n if (cached && cached.length > 0) return cached;\n\n if (!visibleUsersRequest) {\n visibleUsersRequest = fetchAllVisibleUsers().finally(() => {\n visibleUsersRequest = null;\n });\n }\n return visibleUsersRequest;\n },\n\n syncCorvaUsers: async companyId => {\n const { api } = sharedRefs;\n if (!api) return false;\n\n try {\n const corvaUsersResponse = await getChatHost().corvaApi.get<{ data?: CorvaAPIUser[] }>(\n '/v2/users',\n {\n company_id: companyId ?? 1,\n per_page: 500,\n fields: [\n 'user.first_name',\n 'user.last_name',\n 'user.email',\n 'user.profile_photo',\n 'user.title',\n 'user.role',\n 'user.company',\n ],\n }\n );\n\n const corvaUsers = corvaUsersResponse?.data || [];\n const allUsers = await get().getAllVisibleUsers();\n const currentMembers = get().members;\n\n const userMap = new Map<string, User>();\n allUsers.forEach(u => userMap.set(u._id, u));\n currentMembers.forEach(u => {\n if (!userMap.has(u._id)) userMap.set(u._id, u);\n });\n const usersToSync = Array.from(userMap.values());\n\n if (usersToSync.length === 0) return false;\n\n const corvaUsersByUsername = new Map<string, CorvaAPIUser>();\n corvaUsers.forEach((corvaUser: CorvaAPIUser) => {\n const email = corvaUser.attributes?.email;\n if (email) {\n const username = email.split('@')[0].toLowerCase();\n corvaUsersByUsername.set(username, corvaUser);\n }\n });\n\n const mappings: Array<{ revoltUserId: string; corvaUser: CorvaAPIUser }> = [];\n usersToSync.forEach(revoltUser => {\n if (!revoltUser.username) return;\n const username = revoltUser.username.toLowerCase();\n const corvaUser = corvaUsersByUsername.get(username);\n if (corvaUser) {\n mappings.push({ revoltUserId: revoltUser._id, corvaUser });\n }\n });\n\n get().bulkSetCorvaUserMappings(mappings);\n mappings.forEach(({ revoltUserId, corvaUser }) => {\n sharedRefs.corvaUserService.setMapping(revoltUserId, corvaUser);\n });\n\n if (mappings.length > 0) {\n const refreshedMembers = get().members;\n const currentRoomId = roomStore.getState().currentRoom?._id;\n get().setMembers(refreshedMembers, currentRoomId);\n set({ allVisibleUsersCache: null });\n invalidateVisibleUsers();\n }\n\n return true;\n } catch (error: unknown) {\n console.error('Failed to sync Corva users:', error);\n return false;\n }\n },\n}));\n\nexport const resetMemberStore = () => {\n invalidateVisibleUsers();\n memberStore.setState(getInitialState());\n};\n","import { createStore } from 'zustand/vanilla';\n\nimport type { ChatAsset, ChatAssetType } from '../../types/asset';\nimport type { Subscription } from '../../types/subscription';\nimport { getAssetChatChannel } from '../../api/modules/assetChats';\nimport { findGeneralRoom } from '../../utils/isGeneralRoom';\nimport { formatAssetChatName } from '../../utils/getRoomDisplayName';\nimport { channelToAsset } from '../../utils/channelToAsset';\nimport { isChatAssetTypeAllowed } from '../../utils/chatAssetPermissionsSnapshot';\nimport { CHANNEL_TYPES } from '../../constants/constants';\nimport { sharedRefs } from '../sharedRefs';\n\nimport { authStore } from './authStore';\nimport { uiStore } from './uiStore';\nimport { roomStore } from './roomStore';\n\n// A locked asset is always a chat asset (rig / frac fleet / intervention unit).\ntype LockedAsset = ChatAsset & { type: ChatAssetType };\n\nconst registerAssetChatChannel = (\n channelId: string,\n assetId: string,\n assetType: ChatAssetType\n): void => {\n const id = Number(assetId);\n if (!Number.isFinite(id)) return;\n authStore.getState().addAssetChatChannel({\n revolt_channel_id: channelId,\n rig_id: assetType === 'rig' ? id : null,\n frac_fleet_id: assetType === 'frac_fleet' ? id : null,\n intervention_unit_id: assetType === 'intervention_unit' ? id : null,\n });\n};\n\nconst openRoomLockedAsset = (): LockedAsset | null => {\n const room = roomStore.getState().currentRoom;\n if (!room?._id) return null;\n const channel = authStore\n .getState()\n .assetChatChannels.find(c => c.revolt_channel_id === room._id);\n const asset = channel ? channelToAsset(channel) : null;\n if (!asset) return null;\n return {\n id: String(asset.assetId),\n type: asset.assetType,\n name: formatAssetChatName(room.name || ''),\n };\n};\n\nexport interface AssetStore {\n currentAssetId: string | null;\n currentAssetType: ChatAssetType | null;\n currentAssetName: string | null;\n currentAssetStatus: string | null;\n assetChatId: string | null;\n assetChatError: string | null;\n knownAssetChatIds: Set<string>;\n // Last dashboard asset the open chat panel synced to; null until the panel\n // has handled one. Lets the panel tell a background-only sync from its own.\n panelSyncedAssetId: string | null;\n isAssetLocked: boolean;\n lockedAsset: LockedAsset | null;\n isAssetSwitching: boolean;\n\n setAssetContext: (\n assetId: string,\n assetType: ChatAssetType,\n assetName?: string,\n assetStatus?: string,\n skipAutoSelect?: boolean\n ) => Promise<void>;\n clearAssetContext: () => void;\n ensureAssetChatSubscription: () => Promise<Subscription | null>;\n toggleAssetLock: () => void;\n relockToAsset: (assetId: string, assetType: ChatAssetType, assetName: string) => Promise<void>;\n}\n\nconst getInitialState = () => ({\n currentAssetId: null,\n currentAssetType: null,\n currentAssetName: null,\n currentAssetStatus: null,\n assetChatId: null,\n assetChatError: null,\n knownAssetChatIds: new Set<string>(),\n panelSyncedAssetId: null,\n isAssetLocked: false,\n lockedAsset: null,\n isAssetSwitching: false,\n});\n\nconst inFlightByAsset = new Map<string, Promise<Subscription | null>>();\n\nexport const assetStore = createStore<AssetStore>()((set, get) => ({\n ...getInitialState(),\n\n setAssetContext: async (assetId, assetType, assetName, assetStatus, skipAutoSelect) => {\n const currentState = get();\n const isSameAsset = currentState.currentAssetId === assetId;\n if (isSameAsset && (currentState.assetChatId || currentState.assetChatError)) return;\n\n const isAssetChanging = !isSameAsset;\n\n uiStore.setState({ isLoading: true });\n set({\n currentAssetId: assetId,\n currentAssetType: assetType,\n currentAssetName: assetName || assetId,\n currentAssetStatus: assetStatus ?? null,\n assetChatError: null,\n ...(isSameAsset ? {} : { assetChatId: null }),\n ...(isAssetChanging && { isAssetSwitching: true }),\n });\n\n // Both the panel and the background init call this; a slower response for a\n // previous asset must not overwrite the current one.\n const isStale = () => get().currentAssetId !== assetId;\n\n try {\n const chatId = await getAssetChatChannel(assetId, assetType);\n if (isStale()) return;\n registerAssetChatChannel(chatId, assetId, assetType);\n\n set({\n assetChatId: chatId,\n knownAssetChatIds: new Set(Array.from(currentState.knownAssetChatIds).concat(chatId)),\n });\n uiStore.setState({ isLoading: false });\n\n if (!skipAutoSelect) {\n await roomStore.getState().selectRoom(chatId);\n }\n } catch (error) {\n if (isStale()) return;\n console.error('Failed to get asset chat channel:', error);\n const errorMessage = `Failed to load chat for ${assetName || assetId}: ${(error as Error)?.message || 'Unknown error'}`;\n set({ assetChatId: null, assetChatError: errorMessage });\n uiStore.setState({ isLoading: false, error: errorMessage });\n } finally {\n if (isAssetChanging && !isStale()) {\n set({ isAssetSwitching: false });\n }\n }\n },\n\n clearAssetContext: () => {\n const previousAssetChatId = get().assetChatId;\n const currentUser = authStore.getState().user;\n\n set({\n currentAssetId: null,\n currentAssetType: null,\n currentAssetName: null,\n currentAssetStatus: null,\n assetChatId: null,\n panelSyncedAssetId: null,\n lockedAsset: null,\n assetChatError: null,\n });\n\n if (\n currentUser &&\n previousAssetChatId &&\n roomStore.getState().currentRoom?._id === previousAssetChatId\n ) {\n const generalChat = findGeneralRoom(roomStore.getState().subscriptions);\n if (generalChat) {\n roomStore.getState().selectRoom(generalChat.rid ?? generalChat._id);\n }\n }\n },\n\n ensureAssetChatSubscription: async () => {\n const { currentAssetId, currentAssetType } = get();\n if (!currentAssetId || !currentAssetType) return null;\n if (!isChatAssetTypeAllowed(currentAssetType)) return null;\n\n const cached = inFlightByAsset.get(currentAssetId);\n if (cached) return cached;\n\n const promise = (async (): Promise<Subscription | null> => {\n try {\n let chatId = get().assetChatId;\n if (!chatId) {\n try {\n chatId = await getAssetChatChannel(currentAssetId, currentAssetType);\n registerAssetChatChannel(chatId, currentAssetId, currentAssetType);\n set({\n assetChatId: chatId,\n knownAssetChatIds: new Set(Array.from(get().knownAssetChatIds).concat(chatId)),\n });\n } catch (e) {\n console.error('Failed to fetch asset chat channel:', e);\n return null;\n }\n }\n\n const existing = roomStore.getState().subscriptions.find(s => s.rid === chatId);\n if (existing) return existing;\n\n const { api } = sharedRefs;\n if (!api) return null;\n let channel;\n try {\n channel = await api.getChannel(chatId);\n } catch (e) {\n console.error('Failed to fetch asset chat subscription channel:', e);\n return null;\n }\n const inferredType: 'c' | 'p' = channel?.channel_type === CHANNEL_TYPES.GROUP ? 'p' : 'c';\n const sub = {\n _id: chatId,\n rid: chatId,\n name: channel?.name || 'Asset Chat',\n t: inferredType,\n u: { _id: '', username: '' },\n ts: new Date().toISOString(),\n open: true,\n alert: false,\n userMentions: 0,\n groupMentions: 0,\n } as unknown as Subscription;\n\n const subs = roomStore.getState().subscriptions;\n const dupe = subs.find(s => s.rid === chatId);\n if (dupe) return dupe;\n roomStore.getState().setSubscriptions([...subs, sub]);\n return sub;\n } finally {\n inFlightByAsset.delete(currentAssetId);\n }\n })();\n\n inFlightByAsset.set(currentAssetId, promise);\n return promise;\n },\n\n toggleAssetLock: () => {\n if (get().isAssetLocked) {\n set({ isAssetLocked: false, lockedAsset: null });\n return;\n }\n\n const roomAsset = openRoomLockedAsset();\n if (roomAsset) {\n set({\n isAssetLocked: true,\n lockedAsset: roomAsset,\n currentAssetId: roomAsset.id,\n currentAssetType: roomAsset.type,\n currentAssetName: roomAsset.name,\n currentAssetStatus: null,\n assetChatId: roomStore.getState().currentRoom?._id ?? get().assetChatId,\n });\n return;\n }\n\n const { currentAssetId, currentAssetType, currentAssetName, currentAssetStatus } = get();\n if (currentAssetId && currentAssetType) {\n const lockedAsset: LockedAsset = {\n id: currentAssetId,\n name: currentAssetName || currentAssetId,\n type: currentAssetType,\n };\n if (currentAssetStatus) {\n lockedAsset.status = currentAssetStatus;\n }\n set({ isAssetLocked: true, lockedAsset });\n }\n },\n\n relockToAsset: async (assetId, assetType, assetName) => {\n await get().setAssetContext(assetId, assetType, assetName);\n\n // Only re-lock once the chat actually switched: if the channel resolution\n // failed, keep the previous locked asset so the chip matches the open room.\n const { assetChatId, currentAssetId } = get();\n if (assetChatId && currentAssetId === assetId) {\n set({ lockedAsset: { id: assetId, name: assetName, type: assetType } });\n }\n },\n}));\n\nexport const resetAssetStore = () => assetStore.setState(getInitialState());\n","import { createStore } from 'zustand/vanilla';\n\nexport interface NavigationEntry {\n roomId: string;\n threadId?: string;\n}\n\nexport interface NavigationHistoryStore {\n entries: NavigationEntry[];\n index: number;\n // Entry the user asked to travel to via back/forward; the UI applies it and\n // `record` clears it once the visible state matches.\n requestedEntry: NavigationEntry | null;\n\n record: (entry: NavigationEntry) => void;\n goBack: () => void;\n goForward: () => void;\n clearRequestedEntry: () => void;\n // Drop every view of a room the user left or hid, so Back can't resurrect it.\n forgetRoom: (roomId: string) => void;\n}\n\nexport const MAX_NAVIGATION_HISTORY = 50;\n\nconst isSameEntry = (a: NavigationEntry | null | undefined, b: NavigationEntry) =>\n !!a && a.roomId === b.roomId && (a.threadId ?? undefined) === (b.threadId ?? undefined);\n\nconst getInitialState = () => ({\n entries: [] as NavigationEntry[],\n index: -1,\n requestedEntry: null as NavigationEntry | null,\n});\n\nexport const navigationHistoryStore = createStore<NavigationHistoryStore>()((set, get) => ({\n ...getInitialState(),\n\n record: entry => {\n const { entries, index, requestedEntry } = get();\n\n if (requestedEntry) {\n if (isSameEntry(requestedEntry, entry)) {\n set({ requestedEntry: null });\n return;\n }\n // Room switch and thread open/close settle in separate renders; states in\n // the target room that don't match yet are transitional, not new history.\n if (requestedEntry.roomId === entry.roomId) return;\n set({ requestedEntry: null });\n }\n\n if (isSameEntry(entries[index], entry)) return;\n\n const next = [...entries.slice(0, index + 1), entry].slice(-MAX_NAVIGATION_HISTORY);\n set({ entries: next, index: next.length - 1 });\n },\n\n goBack: () => {\n const { entries, index } = get();\n if (index <= 0) return;\n set({ index: index - 1, requestedEntry: entries[index - 1] });\n },\n\n goForward: () => {\n const { entries, index } = get();\n if (index >= entries.length - 1) return;\n set({ index: index + 1, requestedEntry: entries[index + 1] });\n },\n\n clearRequestedEntry: () => set({ requestedEntry: null }),\n\n forgetRoom: roomId => {\n const { entries, index, requestedEntry } = get();\n const next: NavigationEntry[] = [];\n let nextIndex = -1;\n entries.forEach((entry, i) => {\n if (entry.roomId === roomId) return;\n if (isSameEntry(next[next.length - 1], entry)) {\n if (i <= index) nextIndex = next.length - 1;\n return;\n }\n next.push(entry);\n if (i <= index) nextIndex = next.length - 1;\n });\n set({\n entries: next,\n index: nextIndex,\n requestedEntry: requestedEntry?.roomId === roomId ? null : requestedEntry,\n });\n },\n}));\n\nexport const selectCanGoBack = (s: NavigationHistoryStore) => s.index > 0;\nexport const selectCanGoForward = (s: NavigationHistoryStore) => s.index < s.entries.length - 1;\n\nexport const resetNavigationHistoryStore = () => navigationHistoryStore.setState(getInitialState());\n","import { createStore } from 'zustand/vanilla';\n\nimport type { Room } from '../../types/room';\nimport type { Subscription } from '../../types/subscription';\nimport type { User } from '../../types/user';\nimport type { RevoltAPIInstance } from '../../api/RevoltAPI';\nimport type { RevoltChannel } from '../../types/revolt';\nimport { DIRECT_MESSAGE_PLACEHOLDER } from '../../utils/getRoomDisplayName';\nimport { isUnread } from '../../utils/isUnread';\nimport { isVisibleUnread } from '../../utils/isVisibleUnread';\nimport { saveLastOpenedRoom, clearLastOpenedRoom } from '../services/lastRoomTracker';\nimport {\n createDMSubscription,\n addOrUpdateSubscription,\n removeSubscription,\n createGroupSubscription,\n} from '../utils/subscriptionOperations';\nimport {\n CHANNEL_TYPES,\n DEFAULT_ROOM_LIST_ORDER,\n type RoomListOrder,\n} from '../../constants/constants';\nimport { isCurrentRoomSelection, prepareRoomSelection } from '../services/roomSelectionCoordinator';\nimport { loadUntilFound } from '../services/messageLocator';\nimport { sharedRefs } from '../sharedRefs';\nimport { getChatHost } from '../../platform/host';\nimport { isDisallowedAssetChatRoom } from '../../utils/chatAssetPermissionsSnapshot';\n\nimport { messageStore } from './messageStore';\nimport { authStore } from './authStore';\nimport { memberStore } from './memberStore';\nimport { uiStore } from './uiStore';\nimport { assetStore } from './assetStore';\nimport { navigationHistoryStore } from './navigationHistoryStore';\n\nconst dmRecipientCache: Record<string, User | null> = {};\n\nexport interface HiddenRoomsSettings {\n hiddenRooms: string[];\n}\n\nexport const DEFAULT_HIDDEN_ROOMS_SETTINGS: HiddenRoomsSettings = { hiddenRooms: [] };\n\nexport interface RoomStore {\n rooms: Room[];\n subscriptions: Subscription[];\n /** True once the initial loadSubscriptions attempt has finished (even on failure). */\n subscriptionsLoaded: boolean;\n /** True once Ready (or /sync/unreads) has replaced the \"seeded as read\" pointers with server truth. */\n unreadsHydrated: boolean;\n currentRoom: Room | null;\n hiddenRoomsSettings: HiddenRoomsSettings;\n persistHiddenRoomsCallback?: (hiddenRooms: string[]) => void;\n roomListOrder: RoomListOrder;\n\n setRooms: (rooms: Room[]) => void;\n setSubscriptions: (subscriptions: Subscription[]) => void;\n setCurrentRoom: (room: Room | null) => void;\n addOrUpdateSubscription: (subscription: Subscription) => void;\n removeSubscriptionById: (roomId: string) => void;\n setRoomListOrder: (order: RoomListOrder) => void;\n markAllAsRead: () => void;\n\n setHiddenRoomsSettings: (settings: HiddenRoomsSettings) => void;\n setPersistHiddenRoomsCallback: (callback: ((hiddenRooms: string[]) => void) | undefined) => void;\n hideRoom: (roomId: string) => void;\n unhideRoom: (roomId: string) => void;\n isRoomHidden: (roomId: string) => boolean;\n\n loadSubscriptions: () => Promise<void>;\n selectRoom: (roomId: string) => Promise<void>;\n navigateToMessage: (\n roomId: string,\n messageId: string,\n options?: { threadId?: string }\n ) => Promise<boolean>;\n enrichDmSubscription: (roomId: string, userId: string) => Promise<void>;\n createDirectMessage: (username: string) => Promise<Room | undefined>;\n createDirectMessageById: (userId: string) => Promise<Room | undefined>;\n createGroupChannel: (name: string, userIds: string[]) => Promise<Room | undefined>;\n addUserToGroup: (groupId: string, userId: string) => Promise<boolean>;\n removeUserFromGroup: (groupId: string, userId: string) => Promise<boolean>;\n getGroupMembers: (groupId: string) => Promise<User[]>;\n leaveCurrentChannel: (leaveSilently?: boolean | null) => Promise<boolean>;\n updateChannel: (\n channelId: string,\n updates: { name?: string; description?: string }\n ) => Promise<RevoltChannel | null>;\n}\n\nconst getInitialState = () => ({\n rooms: [] as Room[],\n subscriptions: [] as Subscription[],\n subscriptionsLoaded: false,\n unreadsHydrated: false,\n currentRoom: null,\n hiddenRoomsSettings: DEFAULT_HIDDEN_ROOMS_SETTINGS,\n persistHiddenRoomsCallback: undefined,\n roomListOrder: DEFAULT_ROOM_LIST_ORDER,\n});\n\nlet isLoadingSubscriptions = false;\n\nconst waitForUIIdle = (): Promise<void> =>\n new Promise<void>(resolve => {\n if (!uiStore.getState().isLoading) {\n resolve();\n return;\n }\n const unsubscribe = uiStore.subscribe(state => {\n if (!state.isLoading) {\n unsubscribe();\n resolve();\n }\n });\n });\n\n// Stoat counts the CORS preflight against the same 20-per-10s \"users\" bucket as the GET, so the\n// sidebar resolving every unknown DM partner at once got 429s that surfaced as \"Failed to fetch\".\n// Interactive lookups stay direct; only this background enrichment is drip-fed.\nconst DM_PARTNER_FETCH_GAP_MS = 1000;\nconst MARK_ALL_READ_ACK_GAP_MS = 250;\nlet dmPartnerFetchChain: Promise<void> = Promise.resolve();\n\nfunction fetchDmPartnerThrottled(api: RevoltAPIInstance, userId: string): Promise<User | null> {\n const run = dmPartnerFetchChain.then(() => api.getUser(userId));\n const gap = () => new Promise<void>(r => setTimeout(r, DM_PARTNER_FETCH_GAP_MS));\n dmPartnerFetchChain = run.then(gap, gap);\n return run;\n}\n\nexport const roomStore = createStore<RoomStore>()((set, get) => ({\n ...getInitialState(),\n\n setRooms: rooms => set({ rooms }),\n setSubscriptions: subscriptions => set({ subscriptions }),\n setCurrentRoom: room => set({ currentRoom: room }),\n\n addOrUpdateSubscription: subscription =>\n set(state => ({\n subscriptions: addOrUpdateSubscription(state.subscriptions, subscription),\n })),\n\n removeSubscriptionById: roomId =>\n set(state => ({ subscriptions: removeSubscription(state.subscriptions, roomId) })),\n setRoomListOrder: order => set({ roomListOrder: order }),\n // Acks are dripped: the scheduler only debounces per channel (DRA-6042 429s).\n markAllAsRead: () => {\n const ack = sharedRefs.ackChannel;\n if (!ack) return;\n const { assetChatChannels } = authStore.getState();\n const toAck = get().subscriptions.filter(sub =>\n isVisibleUnread(sub, rid => isDisallowedAssetChatRoom(rid, assetChatChannels))\n );\n if (toAck.length === 0) return;\n const ackIds = new Set(toAck.map(sub => sub.rid));\n set(state => ({\n subscriptions: state.subscriptions.map(sub =>\n ackIds.has(sub.rid) ? { ...sub, last_acked_message_id: sub.last_message_id } : sub\n ),\n }));\n toAck.forEach((sub, index) => {\n const send = () => ack(sub.rid, sub.last_message_id!);\n if (index === 0) send();\n else setTimeout(send, index * MARK_ALL_READ_ACK_GAP_MS);\n });\n },\n\n setHiddenRoomsSettings: settings => set({ hiddenRoomsSettings: settings }),\n\n setPersistHiddenRoomsCallback: callback => set({ persistHiddenRoomsCallback: callback }),\n\n hideRoom: roomId => {\n const current = get().hiddenRoomsSettings?.hiddenRooms || [];\n if (current.includes(roomId)) return;\n const newHiddenRooms = [...current, roomId];\n set(state => ({\n hiddenRoomsSettings: { hiddenRooms: newHiddenRooms },\n subscriptions: state.subscriptions.map(s =>\n s.rid === roomId && s.t === 'd' ? { ...s, open: false } : s\n ),\n }));\n get().persistHiddenRoomsCallback?.(newHiddenRooms);\n navigationHistoryStore.getState().forgetRoom(roomId);\n },\n\n unhideRoom: roomId => {\n const current = get().hiddenRoomsSettings?.hiddenRooms || [];\n const newHiddenRooms = current.filter(id => id !== roomId);\n set(state => ({\n hiddenRoomsSettings: { hiddenRooms: newHiddenRooms },\n subscriptions: state.subscriptions.map(s =>\n s.rid === roomId && s.t === 'd' ? { ...s, open: true } : s\n ),\n }));\n get().persistHiddenRoomsCallback?.(newHiddenRooms);\n },\n\n isRoomHidden: roomId => get().hiddenRoomsSettings?.hiddenRooms?.includes(roomId) || false,\n\n loadSubscriptions: async () => {\n const { api } = sharedRefs;\n if (!api) return;\n if (isLoadingSubscriptions) return;\n\n isLoadingSubscriptions = true;\n uiStore.setState({ isLoading: true });\n\n try {\n const serverId = authStore.getState().serverId ?? undefined;\n const userId = authStore.getState().user?._id ?? undefined;\n const rooms = await api.getRooms(serverId);\n const { isRoomHidden } = get();\n\n const subs: Subscription[] = rooms.map(room => {\n let dmUserId: string | undefined;\n if (room.t === 'd' && Array.isArray(room.recipients) && room.recipients.length > 0) {\n dmUserId = room.recipients.find(id => id !== userId) || room.recipients[0];\n }\n const cachedRecipient = dmUserId ? dmRecipientCache[room._id] : null;\n const isHidden = room.t === 'd' && isRoomHidden(room._id);\n\n return {\n _id: room._id,\n rid: room._id,\n name: room.name || room._id,\n t: room.t,\n u: room.u || { _id: '', username: '' },\n ts: new Date().toISOString(),\n open: !isHidden,\n alert: false,\n userMentions: 0,\n groupMentions: 0,\n last_message_id: room.last_message_id,\n // Initialize as fully read; Ready event corrects with server truth.\n last_acked_message_id: room.last_message_id,\n dmUsername: cachedRecipient?.username,\n dmAvatarUrl: cachedRecipient?.avatarUrl,\n dmUserId: cachedRecipient?._id || dmUserId,\n recipients: room.recipients,\n };\n });\n\n const existingSubs = get().subscriptions;\n const newSubRids = new Set(subs.map(s => s.rid));\n const synthesizedSubs = existingSubs.filter(s => !newSubRids.has(s.rid));\n\n set({ subscriptions: [...subs, ...synthesizedSubs], rooms });\n uiStore.setState({ isLoading: false });\n } catch (e: unknown) {\n console.error('❌ Failed to load subscriptions:', e);\n uiStore.setState({\n error: (e as Error)?.message || 'Failed to load subscriptions',\n isLoading: false,\n });\n } finally {\n isLoadingSubscriptions = false;\n set({ subscriptionsLoaded: true });\n }\n },\n\n selectRoom: async roomId => {\n const { api, socket, messageCache } = sharedRefs;\n if (!api || !socket) return;\n\n const request = await prepareRoomSelection({\n roomId,\n currentRoomId: get().currentRoom?._id,\n isCacheDirty: rid => messageCache.isDirty(rid),\n getCachedMessages: rid => messageCache.get(rid),\n setState: s => uiStore.setState(s),\n });\n\n if (!request) return;\n\n try {\n const { assetChatId } = assetStore.getState();\n const isAssetChat = !!assetChatId && roomId === assetChatId;\n\n let sub = get().subscriptions.find(s => s.rid === roomId);\n\n // Unhide if hidden DM\n if (sub?.t === 'd' && get().isRoomHidden(roomId)) {\n get().unhideRoom(roomId);\n }\n\n // Lazy-enrich existing DM subscriptions missing recipient info\n if (sub && sub.t === 'd' && !sub.dmUserId) {\n try {\n let recipient = dmRecipientCache[roomId];\n if (recipient === undefined) {\n const meId = authStore.getState().user?._id ?? undefined;\n recipient = await api.getDMRecipient(roomId, meId);\n dmRecipientCache[roomId] = recipient;\n }\n if (recipient) {\n const enrichedSub = {\n ...sub,\n dmUserId: recipient._id,\n dmUsername: recipient.username,\n dmAvatarUrl: recipient.avatarUrl,\n };\n const updatedSubs = get().subscriptions.map(s => (s.rid === roomId ? enrichedSub : s));\n set({ subscriptions: updatedSubs });\n sub = enrichedSub;\n }\n } catch {\n // ignore enrichment failures\n }\n }\n\n // Synthesize subscription if not found\n if (!sub) {\n try {\n const chan = await api.getChannel(roomId);\n let inferredType: Room['t'] = 'c';\n if (chan?.channel_type === CHANNEL_TYPES.DIRECT_MESSAGE) inferredType = 'd';\n else if (chan?.channel_type === CHANNEL_TYPES.GROUP) inferredType = 'p';\n\n if (inferredType === 'd') {\n let recipient: User | undefined = dmRecipientCache[roomId] ?? undefined;\n if (!recipient) {\n try {\n const meId = authStore.getState().user?._id ?? undefined;\n const result = await api.getDMRecipient(roomId, meId);\n recipient = result ?? undefined;\n dmRecipientCache[roomId] = recipient ?? null;\n } catch {\n // ignore\n }\n }\n sub = createDMSubscription(roomId, recipient);\n } else {\n sub = {\n _id: roomId,\n rid: roomId,\n name: chan?.name || 'Channel',\n t: inferredType,\n u: { _id: '', username: '' },\n ts: new Date().toISOString(),\n open: true,\n alert: false,\n userMentions: 0,\n groupMentions: 0,\n } as unknown as Subscription;\n }\n\n const currentSubs = get().subscriptions;\n if (!currentSubs.some(s => s.rid === sub!.rid)) {\n set({ subscriptions: [...currentSubs, sub!] });\n }\n } catch (e) {\n throw new Error((e as Error)?.message || 'Room not found');\n }\n }\n\n const roomFromList = get().rooms.find(r => r._id === roomId);\n const room: Room = {\n _id: sub.rid,\n name: sub.name,\n t: sub.t || 'c',\n msgs: 0,\n usersCount: roomFromList?.usersCount ?? 0,\n ...(roomFromList?.u ? { u: roomFromList.u } : {}),\n ...(roomFromList?.topic ? { topic: roomFromList.topic } : {}),\n ...(roomFromList?.description ? { description: roomFromList.description } : {}),\n ...(roomFromList?.ts ? { ts: roomFromList.ts } : {}),\n ...(roomFromList?.last_message_id ? { last_message_id: roomFromList.last_message_id } : {}),\n };\n\n sharedRefs.typingManager.clearAllTimeouts();\n\n const isDirty = messageCache.isDirty(roomId);\n const cachedMessages = !isDirty ? messageCache.get(roomId) || [] : [];\n const needsLoad = cachedMessages.length === 0 || isDirty;\n\n set({ currentRoom: room });\n // Ack only what is actually unread: re-acking an id the server already holds\n // is pure noise (Stoat re-runs its notify path for a repeated id). Before Ready\n // the pointers are only the \"seeded as read\" placeholders, so ack unconditionally\n // there. A room opened in a hidden tab is acked by the watcher once shown.\n const knownRead = get().unreadsHydrated && !isUnread(sub);\n if (sub.last_message_id && !knownRead && !getChatHost().appState.isHidden()) {\n sharedRefs.ackChannel?.(roomId, sub.last_message_id);\n }\n messageStore.getState().setHasMoreMessages(cachedMessages.length >= 100);\n\n const currentUserIdForRoom = authStore.getState().user?._id;\n if (currentUserIdForRoom) {\n saveLastOpenedRoom(roomId, currentUserIdForRoom);\n }\n\n if (socket?.isConnected()) {\n socket.subscribeToRoom(roomId);\n }\n\n if (sub.t === 'd') {\n const me = authStore.getState().user;\n // dmUserId/dmUsername aren't rehydrated on refresh, but recipients are — derive\n // the partner from there so they don't vanish from the member list.\n const otherId =\n sub.dmUserId || sub.recipients?.find(id => id !== me?._id) || sub.recipients?.[0];\n\n const buildMembers = (other?: User | null): User[] => {\n const list: User[] = me ? [me] : [];\n if (other) list.push(other);\n return list;\n };\n const seed = (list: User[]) =>\n socket?.seedUsers(\n list.filter(m => m.username).map(m => ({ _id: m._id, username: m.username }))\n );\n\n const cachedOther = otherId ? memberStore.getState().getMemberById(otherId) : null;\n const knownOther =\n cachedOther ??\n (otherId && sub.dmUsername\n ? { _id: otherId, username: sub.dmUsername, name: sub.dmUsername }\n : otherId\n ? { _id: otherId, username: '', name: '' }\n : null);\n const initialMembers = buildMembers(knownOther);\n memberStore.getState().setMembers(initialMembers, roomId);\n seed(initialMembers);\n\n // Resolve the partner's name in the background when it isn't known yet.\n if (otherId && !cachedOther?.username && !sub.dmUsername) {\n sharedRefs.api\n ?.getUser(otherId)\n .then(user => {\n if (!user?.username || get().currentRoom?._id !== roomId) return;\n const resolved: User = {\n _id: user._id,\n username: user.username,\n name: user.username,\n };\n const members = buildMembers(resolved);\n memberStore.getState().setMembers(members, roomId);\n seed(members);\n })\n .catch(() => {});\n }\n }\n\n if (sub.t !== 'd' && sub.t !== 'l') {\n memberStore\n .getState()\n .loadRoomMembers(roomId, sub.t, isAssetChat)\n .catch(e => console.error('Failed to load room members in background:', e));\n }\n\n if (needsLoad) {\n await messageStore.getState().loadMessages(roomId, sub.t);\n } else if (get().currentRoom?._id === roomId) {\n messageStore.getState().setMessages(cachedMessages);\n }\n\n if (!isCurrentRoomSelection(request) || get().currentRoom?._id !== roomId) return;\n\n if (!messageCache.isDirty(roomId)) {\n const cachedNow = messageCache.get(roomId);\n if (cachedNow && cachedNow.length > 0 && cachedNow !== messageStore.getState().messages) {\n messageStore.getState().setMessages(cachedNow);\n }\n }\n uiStore.setState({ isLoading: false, isSwitchingRoom: false });\n } catch (e: unknown) {\n if (!isCurrentRoomSelection(request)) return;\n uiStore.setState({\n error: (e as Error)?.message || 'Failed to select room',\n isLoading: false,\n isSwitchingRoom: false,\n });\n }\n },\n\n navigateToMessage: async (roomId, messageId, options) => {\n uiStore.setState({ isNavigatingToMessage: true });\n\n if (get().currentRoom?._id !== roomId) {\n await get().selectRoom(roomId);\n }\n await waitForUIIdle();\n if (get().currentRoom?._id !== roomId || !sharedRefs.api) {\n uiStore.setState({ isNavigatingToMessage: false });\n return false;\n }\n\n const targetId = options?.threadId || messageId;\n const found = await loadUntilFound(targetId, {\n getMessages: () => messageStore.getState().messages,\n applyMessages: messages => {\n if (get().currentRoom?._id !== roomId) return;\n messageStore.getState().setMessages(messages);\n sharedRefs.messageCache.set(roomId, messages);\n },\n fetchPage: async ({ before, around }) => {\n try {\n const limit = around ? 60 : 100;\n const page = await sharedRefs.api!.getChannelMessages(roomId, limit, before, around);\n if (around && page.length < limit) messageStore.getState().setHasMoreMessages(false);\n if (before) messageStore.getState().setHasMoreMessages(page.length >= limit);\n return page;\n } catch {\n return [];\n }\n },\n isCancelled: () => get().currentRoom?._id !== roomId,\n });\n\n if (!found) {\n uiStore.setState({ isNavigatingToMessage: false });\n return false;\n }\n\n uiStore.setState({\n pendingHighlightMessageId: messageId,\n isNavigatingToMessage: false,\n ...(options?.threadId\n ? { pendingThreadId: options.threadId, pendingThreadRoomId: roomId }\n : {}),\n });\n return true;\n },\n\n enrichDmSubscription: async (roomId, userId) => {\n const { api } = sharedRefs;\n if (!api) return;\n\n try {\n const existingMember = memberStore.getState().members.find(m => m._id === userId);\n let user: { _id: string; username: string; avatarUrl?: string } | undefined = existingMember;\n\n if (!user) {\n const visibleUsers = await memberStore.getState().getAllVisibleUsers();\n user = visibleUsers.find(u => u._id === userId);\n }\n\n if (!user) {\n const fetchedUser = await fetchDmPartnerThrottled(api, userId);\n user = fetchedUser ?? undefined;\n }\n\n if (!user?.username) return;\n\n const currentSubs = get().subscriptions;\n const subToUpdate = currentSubs.find(s => s.rid === roomId);\n\n if (subToUpdate?.dmUsername && subToUpdate.dmUsername !== DIRECT_MESSAGE_PLACEHOLDER) return;\n\n const updatedSubs = currentSubs.map(sub => {\n if (sub.rid === roomId && sub.t === 'd') {\n return {\n ...sub,\n dmUserId: user!._id,\n dmUsername: user!.username,\n dmAvatarUrl: user!.avatarUrl,\n };\n }\n return sub;\n });\n\n set({ subscriptions: updatedSubs });\n } catch (error) {\n console.error('[DM enrich error]', error);\n }\n },\n\n createDirectMessage: async username => {\n const { api } = sharedRefs;\n if (!api) return undefined;\n\n try {\n const users = await api.searchUsers(username);\n const target = users.find(u => u.username?.toLowerCase() === username.toLowerCase());\n if (!target) return undefined;\n\n const dm = await api.getOrCreateDMFromUser(target._id);\n if (dm?._id && target) {\n const subscription = createDMSubscription(dm._id, target);\n set(state => ({\n subscriptions: addOrUpdateSubscription(state.subscriptions, subscription),\n }));\n sharedRefs.messageCache.markDirty(dm._id);\n await new Promise(r => setTimeout(r, 50));\n return { _id: dm._id, name: target.username, t: 'd' };\n }\n return undefined;\n } catch (e) {\n uiStore.setState({ error: (e as Error)?.message || 'Failed to create DM' });\n return undefined;\n }\n },\n\n createDirectMessageById: async userId => {\n const { api } = sharedRefs;\n if (!api) return undefined;\n\n try {\n const existingSub = get().subscriptions.find(s => s.t === 'd' && s.dmUserId === userId);\n if (existingSub) {\n return { _id: existingSub._id, name: existingSub.name, t: 'd' };\n }\n\n const [targetUser, dm] = await Promise.all([\n api.getUser(userId),\n api.getOrCreateDMFromUser(userId),\n ]);\n\n if (targetUser && dm?._id) {\n const subscription = createDMSubscription(dm._id, targetUser);\n set(state => ({\n subscriptions: addOrUpdateSubscription(state.subscriptions, subscription),\n }));\n sharedRefs.messageCache.markDirty(dm._id);\n await new Promise(r => setTimeout(r, 50));\n return { _id: dm._id, name: targetUser.username, t: 'd' };\n }\n\n throw new Error('Failed to create DM');\n } catch (e) {\n uiStore.setState({ error: (e as Error)?.message || 'Failed to create DM' });\n return undefined;\n }\n },\n\n createGroupChannel: async (name, userIds) => {\n const { api, socket } = sharedRefs;\n if (!api || !socket) return undefined;\n\n try {\n const created = await api.createGroup(name, userIds);\n const groupId = created?._id;\n if (!groupId) return undefined;\n\n try {\n const members = await api.getGroupMembers(groupId);\n socket?.seedUsers(members.map(m => ({ _id: m._id, username: m.username })));\n } catch {\n // ignore\n }\n\n const currentUser = authStore.getState().user;\n const subscription = createGroupSubscription(\n groupId,\n name,\n { _id: currentUser?._id ?? '', username: currentUser?.username ?? '' },\n userIds\n );\n set(state => ({\n subscriptions: addOrUpdateSubscription(state.subscriptions, subscription),\n }));\n\n return { _id: groupId, name, t: 'p' };\n } catch (e) {\n uiStore.setState({ error: (e as Error)?.message || 'Failed to create group' });\n return undefined;\n }\n },\n\n addUserToGroup: async (groupId, userId) => {\n const { api } = sharedRefs;\n if (!api) throw new Error('Store not initialized');\n\n try {\n const result = await api.addUserToGroup(groupId, userId);\n const members = await api.getGroupMembers(groupId);\n memberStore.getState().setMembers(members, groupId);\n return result;\n } catch (e) {\n uiStore.setState({\n error: (e as Error)?.message || 'Failed to add user to group',\n });\n throw e;\n }\n },\n\n removeUserFromGroup: async (groupId, userId) => {\n const { api } = sharedRefs;\n if (!api) throw new Error('Store not initialized');\n\n try {\n const result = await api.removeUserFromGroup(groupId, userId);\n const members = await api.getGroupMembers(groupId);\n memberStore.getState().setMembers(members, groupId);\n return result;\n } catch (e) {\n uiStore.setState({\n error: (e as Error)?.message || 'Failed to remove user from group',\n });\n throw e;\n }\n },\n\n getGroupMembers: async groupId => {\n const { api } = sharedRefs;\n if (!api) return [];\n\n try {\n const members = await api.getGroupMembers(groupId);\n memberStore.getState().setMembers(members, groupId);\n return members;\n } catch (e) {\n uiStore.setState({\n error: (e as Error)?.message || 'Failed to get group members',\n });\n return [];\n }\n },\n\n updateChannel: async (channelId, updates) => {\n const { api } = sharedRefs;\n if (!api) return null;\n\n try {\n const updatedChannel = await api.updateChannel(channelId, updates);\n\n const currentSubs = get().subscriptions;\n const subIndex = currentSubs.findIndex(s => s.rid === channelId);\n if (subIndex >= 0) {\n const updatedSubs = [...currentSubs];\n updatedSubs[subIndex] = {\n ...updatedSubs[subIndex],\n name: updates.name || updatedSubs[subIndex].name,\n };\n set({ subscriptions: updatedSubs });\n }\n\n const currentRooms = get().rooms;\n const roomIndex = currentRooms.findIndex(r => r._id === channelId);\n if (roomIndex >= 0) {\n const updatedRooms = [...currentRooms];\n updatedRooms[roomIndex] = {\n ...updatedRooms[roomIndex],\n name: updates.name || updatedRooms[roomIndex].name,\n description: updates.description || updatedRooms[roomIndex].description,\n };\n set({ rooms: updatedRooms });\n\n const { currentRoom } = get();\n if (currentRoom?._id === channelId) {\n set({\n currentRoom: {\n ...currentRoom,\n name: updates.name || currentRoom.name,\n description: updates.description || currentRoom.description,\n },\n });\n }\n }\n\n return updatedChannel;\n } catch (e: unknown) {\n console.error('Failed to update channel:', e);\n uiStore.setState({ error: (e as Error)?.message || 'Failed to update channel' });\n return null;\n }\n },\n\n leaveCurrentChannel: async (leaveSilently = null) => {\n const { api } = sharedRefs;\n if (!api) return false;\n\n const room = get().currentRoom;\n if (!room?._id) return false;\n\n try {\n await api.leaveChannel(room._id, leaveSilently);\n const isDM = room.t === 'd';\n\n if (isDM) {\n get().hideRoom(room._id);\n const userId = authStore.getState().user?._id;\n if (userId) clearLastOpenedRoom(userId);\n } else {\n navigationHistoryStore.getState().forgetRoom(room._id);\n }\n\n const updatedSubscriptions = isDM\n ? get().subscriptions.map(s => (s.rid === room._id ? { ...s, open: false } : s))\n : get().subscriptions.filter(s => s.rid !== room._id);\n\n messageStore.getState().setMessages([]);\n memberStore.setState({ members: [] });\n set({ subscriptions: updatedSubscriptions, currentRoom: null });\n return true;\n } catch (e) {\n uiStore.setState({ error: (e as Error)?.message || 'Failed to leave channel' });\n return false;\n }\n },\n}));\n\nexport const resetRoomStore = () => {\n // Room ids outlive a session: after a re-login a shared DM would otherwise keep the previous\n // user's view of who the partner is.\n Object.keys(dmRecipientCache).forEach(roomId => delete dmRecipientCache[roomId]);\n roomStore.setState(getInitialState());\n};\n","import { createStore } from 'zustand/vanilla';\n\nimport type { ViewportDeepLink } from '../../types/viewport';\n\nimport type { User } from '../../types/user';\nimport type { Message } from '../../types/message';\nimport type { AppCommentData, SharedFile } from '../../types/appComment';\nimport type { FilterEntityWindow } from '../../types/filterEntity';\nimport {\n SIDEBAR_TABS,\n type SidebarSectionKey,\n type SidebarTabKey,\n} from '../../constants/constants';\nimport { isChatStorageConfigured, onChatStorageConfigured } from '../../platform/storage';\nimport { SessionManager } from '../services/sessionManager';\nimport { sharedRefs } from '../sharedRefs';\n\nimport { roomStore } from './roomStore';\nimport { assetStore } from './assetStore';\n\n// The window a \"show me\" request asks for, carried into `AppPage`'s `initialSettings` —\n// never into the URL, which `AppPage` reads back via `window.top.location.href`.\nexport interface TracesViewportRequest {\n wellAssetId: number;\n viewport: ViewportDeepLink;\n}\n\ninterface InlineViewState {\n appId: string;\n activityId?: string;\n viewKey: string;\n appUrl?: string;\n settingsSnapshotId?: string;\n tracesViewport?: TracesViewportRequest;\n}\n\nexport interface UIStore {\n isLoading: boolean;\n error: string | null;\n isChatVisible: boolean;\n isSidebarOpen: boolean;\n sidebarTab: SidebarTabKey;\n // Set by the collapsed nav rail, consumed by RoomList to expand + scroll to the section.\n sidebarSectionRequest: SidebarSectionKey | null;\n // Bumped by the rail's Search button; Sidebar focuses its search box on change.\n sidebarSearchFocusTrigger: number;\n isNewMessageOpen: boolean;\n inputFocusTrigger: number;\n pendingThreadId: string | null;\n pendingThreadRoomId: string | null;\n pendingHighlightMessageId: string | null;\n ephemeralMentionUsersByRoom: Record<string, User[]>;\n messageDraftsByRoom: Record<string, string>;\n forwardingMessage: Message | null;\n forwardingComment: AppCommentData | null;\n sharingFile: SharedFile | null;\n inlineViewState: InlineViewState | null;\n isNavigatingToMessage: boolean;\n isSwitchingRoom: boolean;\n // A well/pad selected in the header popover, consumed by MessageList to scroll the chat.\n pendingWellJump: FilterEntityWindow | null;\n attentionSeriesPlayed: number;\n attentionNextSeriesAt: number | null;\n // Set by the notifications toast, consumed by Header.\n channelSettingsRequestedAt: number | null;\n\n setLoading: (loading: boolean) => void;\n setError: (error: string | null) => void;\n clearError: () => void;\n setChatVisible: (visible: boolean) => void;\n setSidebarOpen: (open: boolean) => void;\n setSidebarTab: (tab: SidebarTabKey) => void;\n requestSidebarSection: (section: SidebarSectionKey) => void;\n clearSidebarSectionRequest: () => void;\n requestSidebarSearchFocus: () => void;\n setNewMessageOpen: (open: boolean) => void;\n triggerInputFocus: () => void;\n setPendingThreadId: (threadId: string | null) => void;\n setPendingThreadRoomId: (roomId: string | null) => void;\n setPendingHighlightMessageId: (messageId: string | null) => void;\n setEphemeralMentionUsers: (roomId: string, users: User[]) => void;\n clearEphemeralMentionUsers: (roomId: string) => void;\n getEphemeralMentionUsers: (roomId: string | undefined) => User[];\n setMessageDraft: (draftKey: string, text: string) => void;\n setForwardingMessage: (message: Message | null) => void;\n setForwardingComment: (data: AppCommentData | null) => void;\n setSharingFile: (file: SharedFile | null) => void;\n setInlineViewState: (state: InlineViewState | null) => void;\n setNavigatingToMessage: (navigating: boolean) => void;\n setSwitchingRoom: (switching: boolean) => void;\n setPendingWellJump: (period: FilterEntityWindow | null) => void;\n recordAttentionSeries: (params: { startedAt: number; cooldownMs: number }) => void;\n requestChannelSettings: () => void;\n clearChannelSettingsRequest: () => void;\n}\n\nconst loadAttentionBudget = () =>\n isChatStorageConfigured()\n ? SessionManager.loadAttentionBudget()\n : { attentionSeriesPlayed: 0, attentionNextSeriesAt: null };\n\nconst getInitialState = () => ({\n isLoading: false,\n error: null,\n isChatVisible: false,\n isSidebarOpen: true,\n sidebarTab: SIDEBAR_TABS.ALL as SidebarTabKey,\n sidebarSectionRequest: null as SidebarSectionKey | null,\n sidebarSearchFocusTrigger: 0,\n isNewMessageOpen: false,\n inputFocusTrigger: 0,\n pendingThreadId: null,\n pendingThreadRoomId: null,\n pendingHighlightMessageId: null,\n ephemeralMentionUsersByRoom: {},\n messageDraftsByRoom: {},\n forwardingMessage: null,\n forwardingComment: null,\n sharingFile: null,\n inlineViewState: null,\n isNavigatingToMessage: false,\n isSwitchingRoom: false,\n pendingWellJump: null,\n channelSettingsRequestedAt: null as number | null,\n ...loadAttentionBudget(),\n});\n\nconst EMPTY_USERS: User[] = [];\n\nexport const uiStore = createStore<UIStore>()((set, get) => ({\n ...getInitialState(),\n\n setLoading: loading => set({ isLoading: loading }),\n setError: error => set({ error }),\n clearError: () => set({ error: null }),\n setChatVisible: visible => {\n const prevVisible = get().isChatVisible;\n set({ isChatVisible: visible });\n\n if (visible && !prevVisible) {\n // If an asset chat switch is in flight, don't re-select the stale current\n // room — setAssetContext will land on the new asset chat once its API resolves.\n if (assetStore.getState().isAssetSwitching) return;\n\n const currentRoomId = roomStore.getState().currentRoom?._id;\n if (currentRoomId && sharedRefs.messageCache.isDirty(currentRoomId)) {\n roomStore\n .getState()\n .selectRoom(currentRoomId)\n .catch((e: unknown) => {\n console.error('Failed to refresh room on chat reopen:', e);\n });\n }\n }\n },\n setSidebarOpen: open => set({ isSidebarOpen: open }),\n setSidebarTab: tab => set({ sidebarTab: tab }),\n requestSidebarSection: section =>\n set({ sidebarTab: SIDEBAR_TABS.ALL, sidebarSectionRequest: section, isSidebarOpen: true }),\n clearSidebarSectionRequest: () => set({ sidebarSectionRequest: null }),\n requestSidebarSearchFocus: () =>\n set(state => ({\n isSidebarOpen: true,\n sidebarSearchFocusTrigger: state.sidebarSearchFocusTrigger + 1,\n })),\n setNewMessageOpen: open => set({ isNewMessageOpen: open }),\n triggerInputFocus: () => set(state => ({ inputFocusTrigger: state.inputFocusTrigger + 1 })),\n setPendingThreadId: threadId => set({ pendingThreadId: threadId }),\n setPendingThreadRoomId: roomId => set({ pendingThreadRoomId: roomId }),\n setPendingHighlightMessageId: messageId => set({ pendingHighlightMessageId: messageId }),\n setEphemeralMentionUsers: (roomId, users) =>\n set(state => ({\n ephemeralMentionUsersByRoom: {\n ...state.ephemeralMentionUsersByRoom,\n [roomId]: users,\n },\n })),\n clearEphemeralMentionUsers: roomId =>\n set(state => {\n const { [roomId]: _omit, ...rest } = state.ephemeralMentionUsersByRoom;\n return { ephemeralMentionUsersByRoom: rest };\n }),\n getEphemeralMentionUsers: roomId => {\n if (!roomId) return EMPTY_USERS;\n return get().ephemeralMentionUsersByRoom[roomId] || EMPTY_USERS;\n },\n setMessageDraft: (draftKey, text) =>\n set(state => {\n if (!text) {\n const { [draftKey]: _omit, ...rest } = state.messageDraftsByRoom;\n return { messageDraftsByRoom: rest };\n }\n return { messageDraftsByRoom: { ...state.messageDraftsByRoom, [draftKey]: text } };\n }),\n setForwardingMessage: message => set({ forwardingMessage: message }),\n setForwardingComment: data => set({ forwardingComment: data }),\n setSharingFile: file => set({ sharingFile: file }),\n setInlineViewState: state => set({ inlineViewState: state }),\n setNavigatingToMessage: navigating => set({ isNavigatingToMessage: navigating }),\n setSwitchingRoom: switching => set({ isSwitchingRoom: switching }),\n setPendingWellJump: period => set({ pendingWellJump: period }),\n requestChannelSettings: () => set({ channelSettingsRequestedAt: Date.now() }),\n clearChannelSettingsRequest: () => set({ channelSettingsRequestedAt: null }),\n recordAttentionSeries: ({ startedAt, cooldownMs }) => {\n const budget = {\n attentionSeriesPlayed: get().attentionSeriesPlayed + 1,\n attentionNextSeriesAt: startedAt + cooldownMs,\n };\n SessionManager.saveAttentionBudget(budget);\n set(budget);\n },\n}));\n\nexport const resetUIStore = () => uiStore.setState(getInitialState());\n\nonChatStorageConfigured(() => uiStore.setState(loadAttentionBudget()));\n","import { createStore } from 'zustand/vanilla';\n\nimport { getChatHost } from '../../platform/host';\n\nimport type { User } from '../../types/user';\nimport type { LoginCredentials } from '../../types/auth';\nimport type { AssetChatChannel } from '../../types/asset';\nimport type { CorvaUser, CorvaRevoltAuthResponse } from '../../types/corvaIntegration';\nimport { SessionManager } from '../services/sessionManager';\nimport { sharedRefs } from '../sharedRefs';\n\nimport { resetMessageStore } from './messageStore';\nimport { uiStore, resetUIStore } from './uiStore';\nimport { memberStore, resetMemberStore } from './memberStore';\nimport { roomStore, resetRoomStore } from './roomStore';\nimport { resetAssetStore } from './assetStore';\nimport { resetChatAssetPermissionsSnapshot } from '../../utils/chatAssetPermissionsSnapshot';\nimport { resetNotificationStore } from './notificationStore';\nimport { resetChannelContentFilterStore } from './channelContentFilterStore';\nimport { resetFavoriteRoomsStore } from './favoriteRoomsStore';\nimport { resetNavigationHistoryStore } from './navigationHistoryStore';\n\nexport interface AuthStore {\n user: User | null;\n serverId: string | null;\n isConnected: boolean;\n hasEverConnected: boolean;\n // Repeated re-auth rejections; the socket stays stopped until reload.\n connectionGaveUp: boolean;\n assetChatChannels: AssetChatChannel[];\n // null = unknown\n chatUsed: boolean | null;\n\n setUser: (user: User | null) => void;\n setConnected: (connected: boolean) => void;\n setHasEverConnected: (hasConnected: boolean) => void;\n addAssetChatChannel: (channel: AssetChatChannel) => void;\n markChatUsed: () => void;\n\n login: (\n credentials: LoginCredentials\n ) => Promise<{ success: boolean; user?: User; error?: string }>;\n loginWithCorva: (\n corvaUser: CorvaUser\n ) => Promise<{ success: boolean; user?: User; error?: string }>;\n logout: () => void;\n restoreSession: (expectedRevoltUserId?: string) => Promise<boolean>;\n\n isAuthenticated: () => boolean;\n isSocketConnected: () => boolean;\n}\n\nconst getInitialState = () => ({\n user: null,\n serverId: null,\n isConnected: false,\n hasEverConnected: false,\n connectionGaveUp: false,\n assetChatChannels: [] as AssetChatChannel[],\n chatUsed: null as boolean | null,\n});\n\n// Having used chat is irreversible; a cached or stale server answer must not undo it.\nexport function keepChatUsed(\n current: boolean | null,\n incoming: boolean | null | undefined\n): boolean | null {\n return current === true ? true : (incoming ?? null);\n}\n\nconst setChatError = (message: string | null) => uiStore.setState({ error: message });\nconst setChatLoading = (loading: boolean) => uiStore.setState({ isLoading: loading });\n\nexport const authStore = createStore<AuthStore>()((set, get) => ({\n ...getInitialState(),\n\n setUser: user => set({ user }),\n setConnected: connected => set({ isConnected: connected }),\n setHasEverConnected: hasConnected => set({ hasEverConnected: hasConnected }),\n\n addAssetChatChannel: channel =>\n set(state => ({\n assetChatChannels: [\n ...state.assetChatChannels.filter(c => c.revolt_channel_id !== channel.revolt_channel_id),\n channel,\n ],\n })),\n\n markChatUsed: () => {\n if (get().chatUsed === true) return;\n\n set({ chatUsed: true });\n SessionManager.markChatUsed();\n },\n\n login: async credentials => {\n const { api } = sharedRefs;\n const { socket } = sharedRefs;\n if (!api || !socket) throw new Error('Store not initialized');\n\n setChatLoading(true);\n setChatError(null);\n set({ isConnected: false });\n\n try {\n const resp = await api.login(credentials);\n set({ user: resp.me });\n SessionManager.save({ user: resp.me, token: resp.token, chatUsed: get().chatUsed });\n\n setTimeout(async () => {\n try {\n if (resp.token) {\n await socket.connect(resp.token, resp.me._id);\n }\n } catch (socketError) {\n console.error('⚠️ WebSocket connection failed:', socketError);\n }\n }, 1000);\n\n await roomStore.getState().loadSubscriptions();\n setChatLoading(false);\n\n return { success: true, user: resp.me };\n } catch (e: unknown) {\n const errorMsg = (e as Error)?.message || 'Login failed';\n setChatLoading(false);\n setChatError(errorMsg);\n return { success: false, error: errorMsg };\n }\n },\n\n loginWithCorva: async corvaUser => {\n const { api } = sharedRefs;\n const { socket } = sharedRefs;\n if (!api || !socket) throw new Error('Store not initialized');\n\n setChatLoading(true);\n setChatError(null);\n set({ isConnected: false });\n\n try {\n const revoltSession = await getChatHost().corvaApi.post<CorvaRevoltAuthResponse>(\n '/v2/integration/revolt_chat_sessions',\n {}\n );\n\n if (!revoltSession?.revolt_session_token) {\n throw new Error('No valid session token received from Corva backend');\n }\n\n api.setToken(revoltSession.revolt_session_token);\n const revoltUser = await api.me();\n const assetChatChannels = revoltSession.revolt_chat_channels ?? [];\n const chatUsed = keepChatUsed(get().chatUsed, revoltSession.chat_used);\n set({\n user: revoltUser,\n serverId: revoltSession.revolt_company_server_id || null,\n assetChatChannels,\n chatUsed,\n });\n\n SessionManager.save({\n user: revoltUser,\n token: revoltSession.revolt_session_token,\n serverId: revoltSession.revolt_company_server_id,\n assetChatChannels,\n chatUsed,\n });\n\n setTimeout(async () => {\n try {\n await socket.connect(revoltSession.revolt_session_token, revoltUser._id);\n } catch (socketError) {\n console.error('⚠️ WebSocket connection failed:', socketError);\n }\n }, 1000);\n\n // Map the corva user → revolt user for member lookups\n memberStore.getState().setCorvaUserMapping(revoltUser._id, corvaUser);\n sharedRefs.corvaUserService.setMapping(revoltUser._id, corvaUser);\n\n await roomStore.getState().loadSubscriptions();\n setChatLoading(false);\n\n return { success: true, user: revoltUser };\n } catch (e: unknown) {\n console.error('❌ Corva-Revolt login failed:', e);\n const errorMsg = (e as Error)?.message || 'Corva login failed';\n setChatLoading(false);\n setChatError(errorMsg);\n return { success: false, error: errorMsg };\n }\n },\n\n logout: () => {\n SessionManager.clear();\n\n if (sharedRefs.socket) {\n sharedRefs.socket.disconnect();\n }\n\n if (sharedRefs.api) {\n sharedRefs.api.setToken(null);\n sharedRefs.api.clearUserCache();\n }\n\n set(getInitialState());\n getChatHost().notifier?.onLogout?.();\n resetRoomStore();\n resetAssetStore();\n resetMessageStore();\n resetChatAssetPermissionsSnapshot();\n resetUIStore();\n resetMemberStore();\n resetNotificationStore();\n resetChannelContentFilterStore();\n resetFavoriteRoomsStore();\n resetNavigationHistoryStore();\n\n sharedRefs.messageCache.clear();\n sharedRefs.typingManager.clear();\n sharedRefs.corvaUserService.clear();\n sharedRefs.forwardedMessageCache.clear();\n sharedRefs.ackChannel?.clear();\n },\n\n restoreSession: async expectedRevoltUserId => {\n const { api } = sharedRefs;\n const { socket } = sharedRefs;\n if (!api || !socket) return false;\n\n setChatLoading(true);\n setChatError(null);\n\n try {\n const session = SessionManager.load();\n if (!session) {\n setChatLoading(false);\n return false;\n }\n\n if (expectedRevoltUserId && session.revoltUserId !== expectedRevoltUserId) {\n SessionManager.clear();\n setChatLoading(false);\n return false;\n }\n\n api.setToken(session.token);\n const currentUser = await api.me();\n\n if (session.revoltUserId && currentUser._id !== session.revoltUserId) {\n SessionManager.clear();\n api.setToken(null);\n setChatLoading(false);\n return false;\n }\n\n set({\n user: currentUser,\n serverId: session.serverId || null,\n assetChatChannels: session.assetChatChannels ?? [],\n chatUsed: keepChatUsed(get().chatUsed, session.chatUsed),\n });\n\n setTimeout(async () => {\n try {\n if (session.token) {\n await socket.connect(session.token, currentUser._id);\n }\n } catch (socketError) {\n console.error('⚠️ WebSocket connection failed during session restore:', socketError);\n }\n }, 1000);\n\n await roomStore.getState().loadSubscriptions();\n setChatLoading(false);\n\n return true;\n } catch {\n setChatLoading(false);\n SessionManager.clear();\n api.setToken(null);\n return false;\n }\n },\n\n isAuthenticated: () => !!get().user,\n isSocketConnected: () => !!sharedRefs.socket?.isConnected(),\n}));\n\n/** @public */\nexport const resetAuthStore = () => authStore.setState(getInitialState());\n","import { createStore } from 'zustand/vanilla';\nimport { v4 as uuid } from 'uuid';\n\nimport type { Message, MessageFormData } from '../../types/message';\nimport type { RoomType } from '../../types/room';\nimport {\n cleanAttachmentUrls,\n transformAttachments,\n transformFileAttachments,\n} from '../../api/socket/transforms/messageTransform';\nimport { addMessage, updateMessageInList, removeMessageFromList } from '../utils/messageOperations';\nimport { SOFT_DELETE_MARKER, createSoftDeletedMessage } from '../../utils/isSoftDeletedMessage';\nimport { enrichWithCorvaData } from '../../utils/parseCorvaSystemMessage';\nimport { saveLastChatActivity } from '../services/lastRoomTracker';\nimport { getChatHost } from '../../platform/host';\nimport {\n uploadAndSend,\n buildFinalMessage,\n settleOptimisticMessage,\n failOptimisticMessage,\n} from '../utils/messageHelpers';\nimport { sharedRefs } from '../sharedRefs';\nimport { HttpError } from '../../api/core/http';\n\nimport { authStore } from './authStore';\nimport { uiStore } from './uiStore';\nimport { roomStore } from './roomStore';\nimport { memberStore } from './memberStore';\n\nexport interface MessageStore {\n messages: Message[];\n hasMoreMessages: boolean;\n isLoadingMoreMessages: boolean;\n\n setMessages: (messages: Message[]) => void;\n addMessageToList: (message: Message) => void;\n updateMessage: (messageId: string, updates: Partial<Message>) => void;\n removeMessage: (messageId: string) => void;\n setHasMoreMessages: (hasMore: boolean) => void;\n setLoadingMoreMessages: (loading: boolean) => void;\n\n loadMessages: (roomId: string, roomType: RoomType, count?: number) => Promise<void>;\n loadMoreMessages: () => Promise<void>;\n sendMessage: (data: MessageFormData) => Promise<unknown>;\n retrySendMessage: (tempId: string) => Promise<unknown>;\n dismissFailedMessage: (tempId: string) => void;\n editMessage: (messageId: string, content: string) => Promise<void>;\n deleteMessage: (messageId: string) => Promise<void>;\n pinMessage: (messageId: string) => Promise<void>;\n unpinMessage: (messageId: string) => Promise<void>;\n toggleReaction: (messageId: string, emoji: string) => Promise<void>;\n getAllMessages: (roomId: string, maxMessages?: number) => Promise<Message[]>;\n preloadRoomMessages: (roomId: string) => Promise<void>;\n fetchOriginalMessage: (channelId: string, messageId: string) => Promise<Message | null>;\n}\n\nconst getInitialState = () => ({\n messages: [] as Message[],\n hasMoreMessages: false,\n isLoadingMoreMessages: false,\n});\n\nconst getCurrentRoomId = () => roomStore.getState().currentRoom?._id;\nconst getCurrentUser = () => authStore.getState().user;\nconst setChatError = (message: string) => uiStore.setState({ error: message });\n\n// A room can be loaded several times in quick succession (NewMessageView's\n// existingRoom effect + handleOpenDm + the ChannelCreate socket event). Only the\n// latest fetch per room may apply, and messages sent/echoed while a fetch was in\n// flight must survive it — otherwise the pre-send snapshot wipes the sent message.\nconst loadSeqByRoom = new Map<string, number>();\nconst CLOCK_SKEW_TOLERANCE_MS = 5000;\n\nconst mergeMessagesSentDuringFetch = (\n fetched: Message[],\n local: Message[],\n roomId: string,\n fetchStartedAt: number\n): Message[] => {\n const cutoff = fetchStartedAt - CLOCK_SKEW_TOLERANCE_MS;\n const fetchedNonces = new Set(fetched.map(m => m.nonce).filter(Boolean));\n return local\n .filter(m => {\n if (m.rid !== roomId) return false;\n // An optimistic/failed copy whose server copy came back in the fetch is\n // already represented — keeping it would duplicate the message.\n if (m.isOptimistic || m.sendFailed) return !fetchedNonces.has(m.nonce);\n return new Date(m.ts).getTime() >= cutoff;\n })\n .reduce(addMessage, fetched);\n};\n\n// A send may settle after the user left its room; a dirty cache is left for the next open.\nconst applyToRoom = (roomId: string, update: (messages: Message[]) => Message[]) => {\n if (getCurrentRoomId() === roomId) {\n const next = update(messageStore.getState().messages);\n messageStore.setState({ messages: next });\n sharedRefs.messageCache.set(roomId, next);\n return;\n }\n const cached = sharedRefs.messageCache.get(roomId);\n if (cached) sharedRefs.messageCache.set(roomId, update(cached));\n};\n\nexport const messageStore = createStore<MessageStore>()((set, get) => ({\n ...getInitialState(),\n\n setMessages: messages => set({ messages }),\n addMessageToList: message => set(state => ({ messages: addMessage(state.messages, message) })),\n updateMessage: (messageId, updates) =>\n set(state => ({ messages: updateMessageInList(state.messages, messageId, updates) })),\n removeMessage: messageId =>\n set(state => ({ messages: removeMessageFromList(state.messages, messageId) })),\n setHasMoreMessages: hasMore => set({ hasMoreMessages: hasMore }),\n setLoadingMoreMessages: loading => set({ isLoadingMoreMessages: loading }),\n\n loadMessages: async (roomId, _roomType, count = 100) => {\n const { api } = sharedRefs;\n if (!api) return;\n\n const seq = (loadSeqByRoom.get(roomId) ?? 0) + 1;\n loadSeqByRoom.set(roomId, seq);\n const fetchStartedAt = Date.now();\n\n try {\n const fetched = await api.getChannelMessages(roomId, count);\n if (loadSeqByRoom.get(roomId) !== seq) return;\n\n const hasMoreMessages = fetched.length >= count;\n const isCurrentRoom = getCurrentRoomId() === roomId;\n const msgs = isCurrentRoom\n ? mergeMessagesSentDuringFetch(fetched, get().messages, roomId, fetchStartedAt)\n : fetched;\n\n sharedRefs.messageCache.set(roomId, msgs);\n\n if (isCurrentRoom) {\n set({ messages: msgs, hasMoreMessages });\n }\n } catch (e: unknown) {\n if (loadSeqByRoom.get(roomId) !== seq) return;\n setChatError((e as Error)?.message || 'Failed to load messages');\n }\n },\n\n loadMoreMessages: async () => {\n const { api } = sharedRefs;\n if (!api) return;\n\n const currentRoomId = getCurrentRoomId();\n const { messages, isLoadingMoreMessages, hasMoreMessages } = get();\n\n if (isLoadingMoreMessages || !hasMoreMessages || !currentRoomId) {\n return;\n }\n\n try {\n set({ isLoadingMoreMessages: true });\n\n // Array order is not stable — pick the oldest by ts.\n const oldestMessage = messages.reduce<Message | undefined>((oldest, msg) => {\n if (!oldest) return msg;\n return new Date(msg.ts).getTime() < new Date(oldest.ts).getTime() ? msg : oldest;\n }, undefined);\n if (!oldestMessage) {\n set({ isLoadingMoreMessages: false, hasMoreMessages: false });\n return;\n }\n\n const olderMessages = await api.getChannelMessages(currentRoomId, 100, oldestMessage._id);\n\n if (getCurrentRoomId() !== currentRoomId) {\n set({ isLoadingMoreMessages: false });\n return;\n }\n\n const currentMessages = get().messages;\n const newMessages = [...currentMessages];\n olderMessages.forEach(msg => {\n if (!newMessages.find(m => m._id === msg._id)) {\n newMessages.push(msg);\n }\n });\n\n set({\n messages: newMessages,\n isLoadingMoreMessages: false,\n hasMoreMessages: olderMessages.length >= 100,\n });\n\n sharedRefs.messageCache.set(currentRoomId, newMessages);\n } catch (e: unknown) {\n set({ isLoadingMoreMessages: false });\n setChatError((e as Error)?.message || 'Failed to load more messages');\n }\n },\n\n sendMessage: async data => {\n const { api } = sharedRefs;\n if (!api) return Promise.resolve();\n\n const currentUser = getCurrentUser();\n const tempId = `temp-${uuid()}`;\n\n const optimisticMessage: Message = {\n _id: tempId,\n nonce: tempId,\n rid: data.roomId,\n msg: data.text,\n ts: new Date().toISOString(),\n u: {\n _id: currentUser?._id || 'mock-user-id',\n username: currentUser?.username || 'You',\n },\n _updatedAt: new Date().toISOString(),\n replies: data.threadId ? [data.threadId] : undefined,\n isOptimistic: true,\n retryFormData: data,\n };\n\n const currentMessages = get().messages;\n if (data.threadId) {\n const bumpedParents = currentMessages.map(m =>\n m._id === data.threadId\n ? { ...m, tcount: (m.tcount || 0) + 1, tlm: optimisticMessage.ts }\n : m\n );\n set({ messages: addMessage(bumpedParents, optimisticMessage) });\n } else {\n set({ messages: addMessage(currentMessages, optimisticMessage) });\n }\n\n try {\n const { response, uploadedFiles } = await uploadAndSend(api, data, tempId);\n const finalMessage = buildFinalMessage(response, data, currentUser, uploadedFiles);\n\n applyToRoom(data.roomId, msgs => settleOptimisticMessage(msgs, tempId, finalMessage));\n\n // Ack own send directly — the socket-echo ack is skipped if the socket\n // is down, which would leave the server pointer behind our own message.\n if (response._id) sharedRefs.ackChannel?.(data.roomId, response._id);\n\n if (currentUser?._id) {\n saveLastChatActivity(currentUser._id);\n getChatHost().notifier?.onMessageSent?.(currentUser._id);\n }\n authStore.getState().markChatUsed();\n\n return response;\n } catch (e) {\n applyToRoom(data.roomId, msgs =>\n failOptimisticMessage(msgs, optimisticMessage, data.threadId)\n );\n console.error('❌ Send message error:', (e as Error)?.message || 'Failed to send message');\n setChatError((e as Error)?.message || 'Failed to send message');\n throw e;\n }\n },\n\n retrySendMessage: async tempId => {\n const { api } = sharedRefs;\n if (!api) return Promise.resolve();\n\n const currentUser = getCurrentUser();\n const { messages } = get();\n const failedMessage = messages.find(msg => msg._id === tempId && msg.sendFailed);\n\n if (!failedMessage || !failedMessage.retryFormData) {\n throw new Error('Failed message not found or missing form data');\n }\n\n const data = failedMessage.retryFormData;\n\n let updatedMessages = messages.map(msg =>\n msg._id === tempId ? { ...msg, sendFailed: false, isOptimistic: true } : msg\n );\n\n if (data.threadId) {\n updatedMessages = updatedMessages.map(m =>\n m._id === data.threadId ? { ...m, tcount: (m.tcount || 0) + 1, tlm: failedMessage.ts } : m\n );\n }\n set({ messages: updatedMessages });\n\n try {\n const { response, uploadedFiles } = await uploadAndSend(api, data, tempId);\n const finalMessage = buildFinalMessage(response, data, currentUser, uploadedFiles);\n\n applyToRoom(data.roomId, msgs => settleOptimisticMessage(msgs, tempId, finalMessage));\n\n if (response._id) sharedRefs.ackChannel?.(data.roomId, response._id);\n\n if (currentUser?._id) {\n saveLastChatActivity(currentUser._id);\n getChatHost().notifier?.onMessageSent?.(currentUser._id);\n }\n authStore.getState().markChatUsed();\n\n return response;\n } catch (e) {\n applyToRoom(data.roomId, msgs => failOptimisticMessage(msgs, failedMessage, data.threadId));\n console.error('❌ Retry send message error:', (e as Error)?.message || 'Failed');\n setChatError((e as Error)?.message || 'Failed to retry sending message');\n throw e;\n }\n },\n\n dismissFailedMessage: tempId => {\n const { messages } = get();\n const failedMessage = messages.find(msg => msg._id === tempId && msg.sendFailed);\n if (!failedMessage) return;\n set({ messages: messages.filter(msg => msg._id !== tempId) });\n },\n\n editMessage: async (messageId, content) => {\n const { api } = sharedRefs;\n if (!api) throw new Error('Store not initialized');\n const roomId = getCurrentRoomId();\n if (!roomId) throw new Error('No room selected');\n\n const { messages } = get();\n const originalMessage = messages.find(msg => msg._id === messageId);\n\n const updatedMessages = messages.map(msg => {\n if (msg._id === messageId) {\n return enrichWithCorvaData({\n ...msg,\n msg: content,\n editedAt: new Date().toISOString(),\n isOptimistic: true,\n });\n }\n return msg;\n });\n set({ messages: updatedMessages });\n\n try {\n await api.editMessage(roomId, messageId, content);\n\n const finalMessages = get().messages.map(msg => {\n if (msg._id === messageId) {\n const { isOptimistic, ...rest } = msg;\n return rest as Message;\n }\n return msg;\n });\n set({ messages: finalMessages });\n\n sharedRefs.messageCache.set(roomId, finalMessages);\n } catch (e) {\n if (originalMessage) {\n const rolledBack = get().messages.map(msg =>\n msg._id === messageId ? originalMessage : msg\n );\n set({ messages: rolledBack });\n }\n setChatError((e as Error)?.message || 'Failed to edit message');\n throw new Error((e as Error)?.message || 'Failed to edit message');\n }\n },\n\n deleteMessage: async messageId => {\n const { api } = sharedRefs;\n if (!api) throw new Error('Store not initialized');\n const roomId = getCurrentRoomId();\n if (!roomId) throw new Error('No room selected');\n\n const { messages } = get();\n const originalMessages = [...messages];\n\n const deletedMessage = messages.find(msg => msg._id === messageId);\n if (!deletedMessage) return;\n\n const isThreadReply =\n Array.isArray(deletedMessage.replies) && deletedMessage.replies.length > 0;\n const parentId = isThreadReply ? (deletedMessage.replies as string[])[0] : undefined;\n const hasReplies = deletedMessage.tcount && deletedMessage.tcount > 0;\n\n let optimisticMessages: Message[];\n\n if (hasReplies) {\n optimisticMessages = messages.map(msg => {\n if (msg._id === messageId) {\n return { ...createSoftDeletedMessage(msg), isOptimistic: true };\n }\n return msg;\n });\n } else {\n optimisticMessages = messages.filter(msg => msg._id !== messageId);\n\n if (parentId) {\n optimisticMessages = optimisticMessages\n .map(msg => {\n if (msg._id === parentId) {\n const newTcount = (msg.tcount || 1) - 1;\n if (msg.deleted && newTcount === 0) {\n return null as unknown as Message;\n }\n return { ...msg, tcount: newTcount };\n }\n return msg;\n })\n .filter((msg): msg is Message => msg !== null && msg !== undefined);\n }\n }\n\n set({ messages: optimisticMessages });\n\n try {\n if (hasReplies) {\n await api.editMessage(roomId, messageId, SOFT_DELETE_MARKER);\n } else {\n await api.deleteMessage(roomId, messageId);\n }\n\n const finalMessages = get().messages.map(msg => {\n if (msg._id === messageId) {\n const { isOptimistic, ...rest } = msg;\n return rest as Message;\n }\n return msg;\n });\n set({ messages: finalMessages });\n\n sharedRefs.messageCache.set(roomId, finalMessages);\n } catch (e) {\n set({ messages: originalMessages });\n setChatError((e as Error)?.message || 'Failed to delete message');\n throw new Error((e as Error)?.message || 'Failed to delete message');\n }\n },\n\n pinMessage: async messageId => {\n const { api } = sharedRefs;\n if (!api) throw new Error('Store not initialized');\n const roomId = getCurrentRoomId();\n if (!roomId) throw new Error('No room selected');\n\n const { messages } = get();\n const originalMessages = messages;\n\n set({\n messages: messages.map(msg => (msg._id === messageId ? { ...msg, pinned: true } : msg)),\n });\n\n try {\n await api.pinMessage(roomId, messageId);\n } catch (e) {\n set({ messages: originalMessages });\n setChatError((e as Error)?.message || 'Failed to pin message');\n throw new Error((e as Error)?.message || 'Failed to pin message');\n }\n },\n\n unpinMessage: async messageId => {\n const { api } = sharedRefs;\n if (!api) throw new Error('Store not initialized');\n const roomId = getCurrentRoomId();\n if (!roomId) throw new Error('No room selected');\n\n const { messages } = get();\n const originalMessages = messages;\n\n set({\n messages: messages.map(msg => (msg._id === messageId ? { ...msg, pinned: false } : msg)),\n });\n\n try {\n await api.unpinMessage(roomId, messageId);\n } catch (e) {\n set({ messages: originalMessages });\n setChatError((e as Error)?.message || 'Failed to unpin message');\n throw new Error((e as Error)?.message || 'Failed to unpin message');\n }\n },\n\n toggleReaction: async (messageId, emoji) => {\n const { api } = sharedRefs;\n const roomId = getCurrentRoomId();\n const currentUser = getCurrentUser();\n if (!api || !roomId || !currentUser) return;\n\n const { messages } = get();\n const idx = messages.findIndex(m => m._id === messageId);\n if (idx < 0) return;\n\n const msg = messages[idx];\n const currentUserId = currentUser._id;\n const userIdArr = msg.reactions?.[emoji]?.userIds || [];\n const already = userIdArr.includes(currentUserId);\n\n const next = [...messages];\n const nextMsg: Message = { ...msg, reactions: { ...(msg.reactions || {}) } };\n\n if (already) {\n const filteredIds = userIdArr.filter(id => id !== currentUserId);\n if (filteredIds.length === 0) {\n const { [emoji]: _omit, ...rest } = nextMsg.reactions!;\n nextMsg.reactions = rest;\n } else {\n nextMsg.reactions![emoji] = { userIds: filteredIds };\n }\n } else {\n nextMsg.reactions![emoji] = { userIds: [...userIdArr, currentUserId] };\n }\n next[idx] = nextMsg;\n set({ messages: next });\n\n try {\n if (already) await api.removeReaction(roomId, messageId, emoji);\n else await api.addReaction(roomId, messageId, emoji);\n\n if (currentUserId) saveLastChatActivity(currentUserId);\n } catch (e) {\n set({ messages });\n setChatError((e as Error)?.message || 'Failed to toggle reaction');\n throw new Error((e as Error)?.message || 'Failed to toggle reaction');\n }\n },\n\n getAllMessages: async (roomId, maxMessages = 500) => {\n const { api } = sharedRefs;\n if (!api) throw new Error('API not initialized');\n\n const allMessages: Message[] = [];\n let beforeCursor: string | undefined;\n const batchSize = 100;\n const maxBatches = Math.ceil(maxMessages / batchSize);\n let batchCount = 0;\n\n while (batchCount < maxBatches) {\n batchCount += 1;\n // eslint-disable-next-line no-await-in-loop\n const batch = await api.getChannelMessages(roomId, batchSize, beforeCursor);\n\n if (batch.length === 0) break;\n\n allMessages.push(...batch);\n\n if (allMessages.length >= maxMessages) break;\n if (batch.length < batchSize) break;\n\n beforeCursor = batch[batch.length - 1]._id;\n }\n\n return allMessages.slice(0, maxMessages);\n },\n\n preloadRoomMessages: async roomId => {\n const { api } = sharedRefs;\n if (!api) return;\n if (sharedRefs.messageCache.get(roomId)) return;\n\n try {\n const msgs = await api.getChannelMessages(roomId, 100);\n sharedRefs.messageCache.set(roomId, msgs);\n } catch (e: unknown) {\n // Best-effort: preloading failures are non-critical, but log for diagnostics\n console.warn('Failed to preload room messages:', e);\n }\n },\n\n fetchOriginalMessage: async (channelId, messageId) => {\n const { api } = sharedRefs;\n if (!api) return null;\n\n const cached = sharedRefs.forwardedMessageCache.get(messageId);\n if (cached) return cached;\n\n try {\n const raw = await api.fetchMessage(channelId, messageId);\n if (!raw) return null;\n\n const author = await api.getUser(raw.author);\n const autumnUrl = api.getBaseUrl().replace(/\\/api$/i, '/autumn');\n const rawContent = raw.content || '';\n const content = raw.attachments?.length\n ? cleanAttachmentUrls(rawContent, raw.attachments)\n : rawContent;\n\n const attachments = transformAttachments(raw.attachments, autumnUrl);\n const files = transformFileAttachments(raw.attachments, autumnUrl, channelId, raw.author);\n\n const authorId = raw.author || 'unknown';\n if (author && !memberStore.getState().membersById[authorId]) {\n const enriched = sharedRefs.corvaUserService.enrichUser({\n _id: authorId,\n username: author.username || 'Unknown User',\n name: author.name,\n isBot: author.isBot,\n });\n memberStore.getState().addMemberToCache(enriched);\n }\n\n const result = enrichWithCorvaData({\n _id: raw._id,\n rid: channelId,\n msg: content,\n ts: raw.created_at || new Date().toISOString(),\n u: {\n _id: authorId,\n username: author?.username || 'Unknown User',\n name: author?.name,\n },\n _updatedAt: raw.edited || raw.created_at || new Date().toISOString(),\n ...(raw.edited && { editedAt: raw.edited }),\n attachments,\n files,\n });\n\n if (sharedRefs.forwardedMessageCache.size >= 200) {\n const oldest = sharedRefs.forwardedMessageCache.keys().next().value;\n if (oldest) sharedRefs.forwardedMessageCache.delete(oldest);\n }\n sharedRefs.forwardedMessageCache.set(messageId, result);\n return result;\n } catch (e: unknown) {\n // 404: original deleted; 403: forwarded from a channel this user cannot read. Both render as unavailable.\n const expected = e instanceof HttpError && (e.status === 404 || e.status === 403);\n if (!expected) console.error('Failed to fetch original message:', e);\n return null;\n }\n },\n}));\n\nexport const resetMessageStore = () => messageStore.setState(getInitialState());\n","import type { Message } from '../../types/message';\nimport type { RoomType } from '../../types/room';\nimport type { Subscription } from '../../types/subscription';\nimport type { ReadyChannelData, ChannelUnread } from '../../types/socket';\nimport type { RevoltAPIInstance } from '../../api/RevoltAPI';\nimport {\n notificationStore,\n messageStore,\n authStore,\n memberStore,\n uiStore,\n roomStore,\n} from '../stores';\nimport { addMessage } from '../utils/messageOperations';\nimport { SOFT_DELETE_MARKER, createSoftDeletedMessage } from '../../utils/isSoftDeletedMessage';\nimport { enrichWithCorvaData } from '../../utils/parseCorvaSystemMessage';\nimport { CHANNEL_TYPES } from '../../constants/constants';\nimport { getChatHost } from '../../platform/host';\nimport { getUserDisplayName } from '../../utils/getUserDisplayName';\nimport { sharedRefs } from '../sharedRefs';\n\nimport type { MessageCache } from './messageCache';\nimport type { TypingManager } from './typingManager';\nimport { createRoomTaskQueue } from './roomTaskQueue';\n\nexport interface SocketEventHandlersConfig {\n api: RevoltAPIInstance;\n messageCache: MessageCache;\n typingManager: TypingManager;\n loadMessages: (roomId: string, roomType: RoomType) => Promise<void>;\n simulateTyping: (userKey: string, isTyping: boolean, displayName?: string) => void;\n}\n\nexport const createSocketEventHandlers = (config: SocketEventHandlersConfig) => {\n const { api, messageCache, typingManager, loadMessages, simulateTyping } = config;\n\n const getRoom = () => roomStore.getState();\n const getHidden = () => roomStore.getState();\n\n const scheduleAck = (channelId: string, messageId: string) =>\n sharedRefs.ackChannel?.(channelId, messageId);\n const enqueueRoomTask = createRoomTaskQueue();\n\n // A later acceptance is a reconnect.\n let hasAuthenticated = false;\n\n return {\n onConnected: () => {},\n\n onAuthenticated: () => {\n const isReconnect = hasAuthenticated;\n hasAuthenticated = true;\n authStore.setState({ isConnected: true, hasEverConnected: true, connectionGaveUp: false });\n\n // Missed events never arrive: drop caches and refetch the open room.\n if (isReconnect) {\n messageCache.clear();\n const { currentRoom } = getRoom();\n if (currentRoom) loadMessages(currentRoom._id, currentRoom.t).catch(console.error);\n }\n },\n\n onDisconnected: () => {\n authStore.setState({ isConnected: false });\n },\n\n onReady: (channels: ReadyChannelData[], channelUnreads?: ChannelUnread[]) => {\n if (!authStore.getState().user?._id) return;\n\n const channelLastMsg = new Map<string, string>();\n channels.forEach(ch => {\n if (ch.last_message_id) {\n channelLastMsg.set(ch._id, ch.last_message_id);\n }\n });\n\n const applyUnreads = (ackedMap: Map<string, string>) => {\n const currentState = getRoom();\n const subs = currentState.subscriptions.map(sub => {\n const lastMsg = channelLastMsg.get(sub.rid) || sub.last_message_id;\n const lastAcked = ackedMap.get(sub.rid);\n // Hydrate the per-channel last-acked baseline. `isUnread(sub)` will\n // derive the dot/marker from this vs `last_message_id`.\n let acked = lastAcked ?? lastMsg ?? sub.last_acked_message_id;\n\n // ---- TEMP (DRA-6042) ------------------------------------------------------\n // QA Stoat fails to persist acks (RabbitMQ publish in acker.rs), so Ready hands\n // back a stale pointer and rooms this session already read flip to unread on\n // reconnect. Never regress below an id this page session acked. Only ids that\n // went through the scheduler count; the load-time \"seeded as read\" value does\n // not, so genuinely unread rooms still show. Does not survive a reload.\n // Remove this block and `sessionAcked` in ackScheduler once the backend is fixed.\n const sessionAcked = sharedRefs.ackChannel?.sessionAcked(sub.rid);\n if (sessionAcked && (acked ?? '0') < sessionAcked) acked = sessionAcked;\n // ---- /TEMP ----------------------------------------------------------------\n\n return {\n ...sub,\n last_message_id: lastMsg ?? sub.last_message_id,\n last_acked_message_id: acked,\n };\n });\n roomStore.getState().setSubscriptions(subs);\n roomStore.setState({ unreadsHydrated: true });\n };\n\n if (channelUnreads) {\n const ackedMap = new Map<string, string>();\n channelUnreads.forEach(entry => {\n if (entry?._id?.channel && entry.last_id) {\n ackedMap.set(entry._id.channel, entry.last_id);\n }\n });\n applyUnreads(ackedMap);\n } else {\n api\n .getUnreads()\n .then(applyUnreads)\n .catch(() => {});\n }\n },\n\n onChannelAck: (channelId: string, messageId: string) => {\n const state = getRoom();\n // Advance-only: a late ack event from another session must not regress\n // the pointer past what this session has already read.\n const updatedSubs = state.subscriptions.map(sub =>\n sub.rid === channelId && (sub.last_acked_message_id ?? '0') < messageId\n ? { ...sub, last_acked_message_id: messageId }\n : sub\n );\n roomStore.getState().setSubscriptions(updatedSubs);\n },\n\n onMessage: (message: Message) => {\n const state = getRoom();\n const current = state.currentRoom;\n\n // Update pinned field on the actual message if this is a pin/unpin system message\n if (message.t === 'message_pinned' && message.pinnedMessageId) {\n const msgStore = messageStore.getState();\n msgStore.setMessages(\n msgStore.messages.map(msg =>\n msg._id === message.pinnedMessageId ? { ...msg, pinned: true } : msg\n )\n );\n } else if (message.t === 'message_unpinned' && message.unpinnedMessageId) {\n const msgStore = messageStore.getState();\n msgStore.setMessages(\n msgStore.messages.map(msg =>\n msg._id === message.unpinnedMessageId ? { ...msg, pinned: false } : msg\n )\n );\n }\n\n const currentUser = authStore.getState().user;\n const isOwnMsg = !!(currentUser && message.u._id === currentUser._id);\n const isViewingThisRoom = !!(\n current &&\n current._id === message.rid &&\n uiStore.getState().isChatVisible\n );\n\n // Advance last_message_id first so all branches (including the\n // alreadyExists early return) see consistent sub state. For own\n // messages, also bump last_acked_message_id so the user never sees\n // their own send as unread.\n const subIdx = state.subscriptions.findIndex(s => s.rid === message.rid);\n if (subIdx >= 0) {\n const sub = state.subscriptions[subIdx];\n if ((sub.last_message_id ?? '') < message._id) {\n const advancedSubs = [...state.subscriptions];\n advancedSubs[subIdx] = {\n ...sub,\n last_message_id: message._id,\n last_acked_message_id: isOwnMsg ? message._id : sub.last_acked_message_id,\n };\n roomStore.getState().setSubscriptions(advancedSubs);\n }\n }\n\n // Keep server-side last_acked aligned with the latest message we've\n // seen. For own messages this covers cases where the send-flow ack was\n // dropped or the send originated from another tab/device.\n // A hidden tab renders but is not read; the watcher acks it when shown.\n if (isOwnMsg || (isViewingThisRoom && !getChatHost().appState.isHidden())) {\n scheduleAck(message.rid, message._id);\n }\n\n if (!isViewingThisRoom) {\n // If this is a hidden DM receiving a new message, unhide it\n const messageSub = state.subscriptions.find(s => s.rid === message.rid);\n if (messageSub?.t === 'd' && getHidden().isRoomHidden(message.rid)) {\n getHidden().unhideRoom(message.rid);\n }\n\n // Re-open closed DMs so they reappear in the sidebar.\n const subs = getRoom().subscriptions.map(s =>\n s.rid === message.rid && s.t === 'd' && !s.open ? { ...s, open: true } : s\n );\n roomStore.getState().setSubscriptions(subs);\n\n if (!isOwnMsg) {\n const subscription = subs.find(s => s.rid === message.rid);\n const senderMember = memberStore.getState().membersById[message.u._id];\n const senderDisplayName = senderMember\n ? getUserDisplayName(senderMember)\n : message.u.username;\n const roomDisplayName =\n subscription?.t === 'd'\n ? subscription.dmUsername || 'Direct Message'\n : subscription?.name || 'Channel';\n\n getChatHost().notifier?.showIncomingMessage?.({\n message,\n subscription,\n currentUser: authStore.getState().user,\n settings: notificationStore.getState().notificationSettings,\n senderDisplayName,\n roomDisplayName,\n });\n }\n\n messageCache.markDirty(message.rid);\n return;\n }\n\n const currentMessages = messageStore.getState().messages;\n const isThreadReply = Array.isArray(message.replies) && message.replies.length > 0;\n const parentId: string | undefined = isThreadReply\n ? (message.replies as string[])[0]\n : undefined;\n const alreadyExists = currentMessages.some(m => m._id === message._id);\n\n if (alreadyExists) {\n if (isThreadReply && parentId) {\n const maybeUpdateParent = currentMessages.map(m =>\n m._id === parentId &&\n (!m.tlm || new Date(m.tlm).getTime() < new Date(message.ts).getTime())\n ? { ...m, tlm: message.ts }\n : m\n );\n messageStore.getState().setMessages(maybeUpdateParent);\n }\n return;\n }\n\n // Dedup own optimistic sends: the echo carries the nonce we sent, and the\n // optimistic copy is still in the list until the POST resolves\n // (last_message_id was already bumped above).\n if (isOwnMsg && message.nonce && currentMessages.some(m => m.nonce === message.nonce)) {\n return;\n }\n const isSystemMessage = message.t !== undefined;\n const isChatClosed = !uiStore.getState().isChatVisible;\n\n if (!isOwnMsg && !isSystemMessage && (getChatHost().appState.isInactive() || isChatClosed)) {\n const subscription = state.subscriptions.find(s => s.rid === message.rid);\n const senderMember = memberStore.getState().membersById[message.u._id];\n const senderDisplayName = senderMember\n ? getUserDisplayName(senderMember)\n : message.u.username;\n const roomDisplayName =\n subscription?.t === 'd'\n ? subscription.dmUsername || 'Direct Message'\n : subscription?.name || 'Channel';\n\n getChatHost().notifier?.showIncomingMessage?.({\n message,\n subscription,\n currentUser: authStore.getState().user,\n settings: notificationStore.getState().notificationSettings,\n senderDisplayName,\n roomDisplayName,\n });\n }\n\n if (isThreadReply && parentId) {\n const bumpedParents = currentMessages.map(m => {\n if (m._id === parentId) {\n return {\n ...m,\n tcount: (m.tcount || 0) + 1,\n tlm: message.ts,\n };\n }\n return m;\n });\n messageStore.getState().setMessages(addMessage(bumpedParents, message));\n } else {\n messageStore.getState().setMessages(addMessage(currentMessages, message));\n }\n\n // Update message cache - only cache messages for the current room\n if (current) {\n const currentRoomMessages = messageStore\n .getState()\n .messages.filter(msg => msg.rid === current._id);\n messageCache.set(current._id, currentRoomMessages);\n }\n },\n\n onRoomChange: (roomId: string, change: unknown) => {\n try {\n const payload = change as {\n event?: string;\n channel_type?: string;\n name?: string;\n userId?: string;\n op?: 'add' | 'remove';\n messageId?: string;\n emoji?: string;\n };\n\n // Channel creation event\n if (\n payload?.event === 'create' &&\n (payload?.channel_type === CHANNEL_TYPES.GROUP ||\n payload?.channel_type === CHANNEL_TYPES.TEXT_CHANNEL ||\n payload?.channel_type === CHANNEL_TYPES.DIRECT_MESSAGE)\n ) {\n enqueueRoomTask(roomId, async () => {\n const currentSubs = getRoom().subscriptions;\n\n // Determine subscription type\n let subType: RoomType = 'c';\n if (payload.channel_type === CHANNEL_TYPES.GROUP) {\n subType = 'p';\n } else if (payload.channel_type === CHANNEL_TYPES.DIRECT_MESSAGE) {\n subType = 'd';\n }\n\n // Check if subscription already exists (e.g. DM re-created or re-joined)\n const existingSub = currentSubs.find(s => s.rid === roomId);\n\n const sub: Subscription = {\n _id: roomId,\n rid: roomId,\n name: payload.name || (subType === 'd' ? 'Direct Message' : 'Channel'),\n t: subType,\n u: { _id: '', username: '' },\n ts: new Date().toISOString(),\n open: existingSub?.open ?? true,\n alert: existingSub?.alert ?? false,\n last_acked_message_id: existingSub?.last_acked_message_id,\n userMentions: existingSub?.userMentions ?? 0,\n groupMentions: existingSub?.groupMentions ?? 0,\n };\n\n // For DMs, try to fetch recipient info\n if (subType === 'd') {\n try {\n const recipient = await api.getDMRecipient(\n roomId,\n authStore.getState().user?._id || undefined\n );\n if (recipient) {\n sub.dmUserId = recipient._id;\n sub.dmUsername = recipient.username;\n sub.dmAvatarUrl = recipient.avatarUrl;\n }\n } catch (e) {\n console.error('Failed to fetch DM recipient info:', e);\n }\n }\n\n // For group channels, store member IDs so RoomItem can resolve avatars by ID\n if (subType === 'p') {\n if (existingSub?.recipients) {\n sub.recipients = existingSub.recipients;\n } else {\n try {\n const members = await api.getGroupMembers(roomId);\n sub.recipients = members.map(m => m._id);\n } catch {\n // ignore — avatars will fall back to initials\n }\n }\n }\n\n const deduped = [...currentSubs.filter(s => s.rid !== roomId), sub];\n roomStore.getState().setSubscriptions(deduped);\n\n // Mark channel as dirty\n messageCache.markDirty(roomId);\n\n // If this is the currently viewed room, reload messages\n const currentRoomId = getRoom().currentRoom?._id;\n if (currentRoomId === roomId) {\n loadMessages(roomId, sub.t).catch(console.error);\n }\n });\n }\n\n // User leave event (ChannelGroupLeave)\n // Note: Backend sends both ChannelGroupLeave event AND a system message (user_left or user_remove)\n // The system message is handled by handleIncomingMessage, so we just update members here\n // We don't create a message here because the system message will handle it\n if (payload?.event === 'leave') {\n enqueueRoomTask(roomId, async () => {\n const currentUserId = authStore.getState().user?._id;\n if (payload.userId && currentUserId && payload.userId === currentUserId) {\n // If I left the channel\n const sub = getRoom().subscriptions.find(s => s.rid === roomId);\n const isDM = sub?.t === 'd';\n\n if (isDM) {\n // Store in user settings for persistence\n getHidden().hideRoom(roomId);\n }\n\n // For DMs, mark as closed (open: false) instead of removing\n // For channels, remove the subscription entirely\n const updatedSubscriptions = isDM\n ? getRoom().subscriptions.map(s => (s.rid === roomId ? { ...s, open: false } : s))\n : getRoom().subscriptions.filter(s => s.rid !== roomId);\n\n messageStore.getState().setMessages([]);\n memberStore.setState({ members: [] });\n roomStore.getState().setSubscriptions(updatedSubscriptions);\n roomStore.getState().setCurrentRoom(null);\n return;\n }\n\n // Update members list - the system message (user_left or user_remove) will create the message\n const viewing = getRoom().currentRoom?._id === roomId;\n if (viewing && payload.userId) {\n memberStore.getState().removeUserFromMembers(payload.userId);\n }\n });\n }\n\n // Reaction event\n if (payload?.event === 'reaction' && payload.messageId && payload.emoji) {\n // Reactions only touch messages; don't wait behind create/leave.\n enqueueRoomTask(`${roomId}:reaction`, async () => {\n const current = getRoom();\n if (current.currentRoom?._id !== roomId) {\n messageCache.markDirty(roomId);\n return;\n }\n\n let reactingUsername = typingManager.getDisplayName(payload.userId || '');\n if (!reactingUsername && payload.userId) {\n const member = memberStore.getState().membersById[payload.userId];\n if (member) reactingUsername = member.username;\n }\n if (!reactingUsername && payload.userId) {\n try {\n const u = await api.getUser(payload.userId);\n if (u?.username) reactingUsername = u.username;\n } catch {\n // ignore\n }\n }\n if (!reactingUsername && payload.userId) {\n reactingUsername =\n payload.userId.length >= 4 ? `User-${payload.userId.slice(-4)}` : 'user';\n }\n if (!reactingUsername) return;\n\n // Re-read after the await: the room may have changed or a message arrived.\n if (getRoom().currentRoom?._id !== roomId) {\n messageCache.markDirty(roomId);\n return;\n }\n const { messages } = messageStore.getState();\n const idx = messages.findIndex(m => m._id === payload.messageId);\n if (idx < 0) {\n messageCache.markDirty(roomId);\n return;\n }\n\n const next = [...messages];\n const currentMessage = messages[idx];\n const msg = {\n ...currentMessage,\n reactions: { ...(currentMessage.reactions || {}) },\n } as Message;\n const { emoji } = payload;\n if (!emoji) return;\n\n const userIdList = msg.reactions![emoji]?.userIds\n ? [...msg.reactions![emoji]!.userIds!]\n : [];\n if (payload.op === 'add') {\n if (payload.userId && !userIdList.includes(payload.userId)) {\n userIdList.push(payload.userId);\n }\n msg.reactions![emoji] = { userIds: userIdList };\n } else if (payload.op === 'remove') {\n const filteredIds = payload.userId\n ? userIdList.filter(id => id !== payload.userId)\n : userIdList;\n if (filteredIds.length === 0) {\n const { [emoji]: _omit, ...rest } = msg.reactions!;\n msg.reactions = rest;\n } else {\n msg.reactions![emoji] = { userIds: filteredIds };\n }\n }\n next[idx] = msg;\n messageStore.getState().setMessages(next);\n\n // Update message cache\n messageCache.set(roomId, next);\n });\n }\n } catch {\n // ignore socket room change parsing errors\n }\n },\n\n onTyping: (data: { userId?: string; username: string; roomId: string; isTyping: boolean }) => {\n const currentUser = authStore.getState().user;\n const { currentRoom } = getRoom();\n if (currentUser && data.userId === currentUser._id) return;\n\n if (!currentRoom || currentRoom._id !== data.roomId) return;\n\n // Track typing - TypingIndicator will look up display name from membersById\n simulateTyping(data.userId || data.username, data.isTyping);\n },\n\n onMessageUpdate: (\n messageId: string,\n channelId: string,\n data: { content?: string; edited?: string }\n ) => {\n const state = getRoom();\n if (!state.currentRoom || state.currentRoom._id !== channelId) {\n messageCache.markDirty(channelId);\n return;\n }\n\n const updatedMessages = messageStore.getState().messages.map(msg => {\n if (msg._id === messageId) {\n // Only update if content is actually provided\n if (data.content !== undefined) {\n const newContent = data.content;\n\n // Check if this is a soft delete (message edited to deletion marker)\n if (newContent === SOFT_DELETE_MARKER) {\n return createSoftDeletedMessage(msg);\n }\n\n // Only mark as edited if content actually changed\n const contentChanged = newContent !== msg.msg;\n return enrichWithCorvaData({\n ...msg,\n msg: newContent,\n editedAt: contentChanged ? data.edited || new Date().toISOString() : msg.editedAt,\n });\n }\n\n // If only edited timestamp is provided but no content change, don't mark as edited\n // (This handles cases like pin/unpin where edited timestamp might be sent but content didn't change)\n return msg;\n }\n return msg;\n });\n messageStore.getState().setMessages(updatedMessages);\n\n // Update message cache\n messageCache.set(channelId, updatedMessages);\n },\n\n onMessageDelete: (messageId: string, channelId: string) => {\n const state = getRoom();\n if (!state.currentRoom || state.currentRoom._id !== channelId) {\n messageCache.markDirty(channelId);\n return;\n }\n\n // Find the message being deleted\n const currentMessages = messageStore.getState().messages;\n const deletedMessage = currentMessages.find(msg => msg._id === messageId);\n if (!deletedMessage) return;\n\n const isThreadReply =\n Array.isArray(deletedMessage.replies) && deletedMessage.replies.length > 0;\n const parentId = isThreadReply ? (deletedMessage.replies as string[])[0] : undefined;\n\n // Check if this is a parent message with replies\n const hasReplies = deletedMessage.tcount && deletedMessage.tcount > 0;\n\n let updatedMessages: Message[];\n\n if (hasReplies) {\n // Slack-style: Mark as deleted but keep visible\n updatedMessages = currentMessages.map(msg => {\n if (msg._id === messageId) {\n return {\n ...msg,\n deleted: true,\n msg: 'This message was deleted',\n attachments: undefined,\n file: undefined,\n reactions: undefined,\n };\n }\n return msg;\n });\n } else {\n // No replies: fully remove the message\n updatedMessages = currentMessages.filter(msg => msg._id !== messageId);\n\n // If this was a thread reply, decrement the parent's reply count\n if (parentId) {\n updatedMessages = updatedMessages\n .map(msg => {\n if (msg._id === parentId) {\n const newTcount = (msg.tcount || 1) - 1;\n // If parent is deleted and has no more replies, remove it entirely\n if (msg.deleted && newTcount === 0) {\n return null as unknown as Message;\n }\n return {\n ...msg,\n tcount: newTcount,\n };\n }\n return msg;\n })\n .filter((msg): msg is Message => msg !== null && msg !== undefined);\n }\n }\n\n messageStore.getState().setMessages(updatedMessages);\n\n // Update message cache\n messageCache.set(channelId, updatedMessages);\n },\n\n onUserStatusChange: (userId: string, status: string) => {\n const updatedMembers = memberStore\n .getState()\n .members.map(member =>\n member._id === userId\n ? { ...member, status: status as 'online' | 'offline' | 'away' | 'busy' }\n : member\n );\n memberStore.setState({ members: updatedMembers });\n },\n\n onInvalidSession: () => api.notifyUnauthorized('ws:Authenticate'),\n\n onError: (error: unknown) => {\n console.error('🔌 WebSocket error:', error);\n },\n };\n};\n","import type { RevoltAPIInstance } from '../../api/RevoltAPI';\nimport { roomStore } from '../stores/roomStore';\n\nexport interface AckScheduler {\n (channelId: string, messageId: string): void;\n flushAll: () => void;\n clear: () => void;\n /** Newest id this page session acked for the channel (TEMP, see applyUnreads). */\n sessionAcked: (channelId: string) => string | undefined;\n}\n\n// Mirrors Stoat's `channel.ack()` debounce (1.5s debounce, 4s flush window)\n// from javascript-client-sdk/src/classes/Channel.ts. Optimistically advances\n// the local `last_acked_message_id` so the unread dot clears immediately, then\n// debounces the HTTP PUT.\nconst REJECTED_RETRY_DELAY_MS = 60_000;\n\nexport function createAckScheduler(api: RevoltAPIInstance): AckScheduler {\n const timeouts = new Map<string, ReturnType<typeof setTimeout>>();\n const limits = new Map<string, number>();\n const pending = new Map<string, string>();\n const accepted = new Map<string, string>();\n const rejected = new Map<string, { messageId: string; until: number }>();\n const inFlight = new Map<string, string>();\n // TEMP (DRA-6042): remove together with the heal block in socketEventHandlers.applyUnreads.\n const sessionAcked = new Map<string, string>();\n\n const send = (channelId: string, keepalive = false) => {\n const msgId = pending.get(channelId);\n const timeout = timeouts.get(channelId);\n if (timeout) clearTimeout(timeout);\n pending.delete(channelId);\n timeouts.delete(channelId);\n limits.delete(channelId);\n if (!msgId) return;\n // Stoat re-runs its AMQP notify when the same id is acked twice (room select\n // followed by the unread watcher after Ready); an accepted ack is final and a\n // rejected one is not worth hammering — the server side has to recover first.\n if (accepted.get(channelId) === msgId) return;\n if (inFlight.get(channelId) === msgId) return;\n const failure = rejected.get(channelId);\n if (failure?.messageId === msgId && Date.now() < failure.until) return;\n // api.ackMessage swallows its own errors with console.error, so no\n // outer catch is needed here.\n inFlight.set(channelId, msgId);\n const request = keepalive\n ? api.ackMessage(channelId, msgId, { keepalive: true })\n : api.ackMessage(channelId, msgId);\n request.then(ok => {\n if (inFlight.get(channelId) === msgId) inFlight.delete(channelId);\n if (ok) {\n accepted.set(channelId, msgId);\n rejected.delete(channelId);\n } else {\n rejected.set(channelId, { messageId: msgId, until: Date.now() + REJECTED_RETRY_DELAY_MS });\n }\n });\n };\n\n const schedule = (channelId: string, messageId: string) => {\n // Optimistic update runs even when the same id is already queued: a\n // reconnect Ready can regress the store to the server's stale pointer while\n // the PUT is still debounced, and the watcher relies on this to re-advance.\n const { subscriptions, setSubscriptions } = roomStore.getState();\n const sub = subscriptions.find(s => s.rid === channelId);\n if (sub && (sub.last_acked_message_id ?? '0') < messageId) {\n setSubscriptions(\n subscriptions.map(s =>\n s.rid === channelId ? { ...s, last_acked_message_id: messageId } : s\n )\n );\n }\n\n // ULIDs compare chronologically; never replace a queued ack with an older\n // one (e.g. a stale selectRoom ack racing an own-message echo ack).\n // TEMP (DRA-6042): remember what this session read, see applyUnreads.\n if ((sessionAcked.get(channelId) ?? '0') < messageId) sessionAcked.set(channelId, messageId);\n\n const queued = pending.get(channelId);\n if (queued && messageId <= queued) return;\n pending.set(channelId, messageId);\n\n const existing = timeouts.get(channelId);\n if (existing) clearTimeout(existing);\n\n const limit = limits.get(channelId);\n if (limit && Date.now() > limit) {\n send(channelId);\n return;\n }\n\n timeouts.set(\n channelId,\n setTimeout(() => send(channelId), 1500)\n );\n if (!limit) limits.set(channelId, Date.now() + 4000);\n };\n\n schedule.flushAll = () => {\n Array.from(pending.keys()).forEach(channelId => send(channelId, true));\n };\n\n schedule.clear = () => {\n timeouts.forEach(t => clearTimeout(t));\n timeouts.clear();\n limits.clear();\n pending.clear();\n accepted.clear();\n rejected.clear();\n inFlight.clear();\n sessionAcked.clear();\n };\n\n schedule.sessionAcked = (channelId: string) => sessionAcked.get(channelId);\n\n return schedule as AckScheduler;\n}\n","import { isUnread } from '../../utils/isUnread';\nimport { getChatHost, type AppStateAdapter } from '../../platform/host';\nimport { sharedRefs } from '../sharedRefs';\nimport { roomStore } from '../stores/roomStore';\nimport { uiStore } from '../stores/uiStore';\n\n// Mirrors Stoat: ack the viewed room whenever it turns unread; a hidden tab catches up when shown.\nconst ackViewedRoomIfUnread = (): void => {\n const { currentRoom, subscriptions } = roomStore.getState();\n if (!currentRoom || !uiStore.getState().isChatVisible || getChatHost().appState.isHidden())\n return;\n const sub = subscriptions.find(s => s.rid === currentRoom._id);\n if (sub?.last_message_id && isUnread(sub)) {\n sharedRefs.ackChannel?.(currentRoom._id, sub.last_message_id);\n }\n};\n\nconst flushPendingAcks = () => sharedRefs.ackChannel?.flushAll();\n\nlet storesSubscribed = false;\nlet watchedAppState: AppStateAdapter | null = null;\nlet stopWatchingAppState: Array<() => void> = [];\n\n// Re-installs against a new host's appState (e.g. configureChat again after a re-login).\nexport const installUnreadWatcher = (): void => {\n const { appState } = getChatHost();\n if (watchedAppState === appState) return;\n\n if (!storesSubscribed) {\n storesSubscribed = true;\n roomStore.subscribe(ackViewedRoomIfUnread);\n uiStore.subscribe(ackViewedRoomIfUnread);\n }\n\n stopWatchingAppState.forEach(stop => stop());\n watchedAppState = appState;\n stopWatchingAppState = [\n appState.subscribe(hidden => {\n if (hidden) flushPendingAcks();\n else ackViewedRoomIfUnread();\n }),\n ];\n const stopTerminate = appState.onTerminate?.(flushPendingAcks);\n if (stopTerminate) stopWatchingAppState.push(stopTerminate);\n};\n","import { getChatHost } from '../platform/host';\nimport { createRevoltAPI } from '../api/RevoltAPI';\nimport { createRevoltSocket } from '../api/RevoltSocket';\n\nimport { createSocketEventHandlers } from './services/socketEventHandlers';\nimport { createAckScheduler } from './services/ackScheduler';\nimport { installUnreadWatcher } from './services/unreadWatcher';\nimport { sharedRefs } from './sharedRefs';\nimport { messageStore } from './stores/messageStore';\nimport { memberStore } from './stores/memberStore';\n\n/**\n * Bootstrap: creates the Revolt API + WebSocket client, wires socket event\n * handlers to the new stores, and populates sharedRefs. Idempotent for the\n * configured apiUrl.\n */\nexport const initChat = (): void => {\n const { apiUrl, wsUrl, platform } = getChatHost();\n installUnreadWatcher();\n if (sharedRefs.serverUrl === apiUrl && sharedRefs.api) return;\n\n if (sharedRefs.socket) {\n try {\n sharedRefs.socket.destroy();\n } catch (e: unknown) {\n console.error('Failed to disconnect existing socket:', e);\n }\n }\n\n sharedRefs.serverUrl = apiUrl;\n sharedRefs.api = createRevoltAPI(apiUrl, platform);\n sharedRefs.ackChannel = createAckScheduler(sharedRefs.api);\n\n const handlers = createSocketEventHandlers({\n api: sharedRefs.api,\n messageCache: sharedRefs.messageCache,\n typingManager: sharedRefs.typingManager,\n loadMessages: (roomId, roomType) => messageStore.getState().loadMessages(roomId, roomType),\n simulateTyping: (userKey, isTyping, displayName) =>\n memberStore.getState().simulateTyping(userKey, isTyping, displayName),\n });\n\n sharedRefs.socket = createRevoltSocket({ apiUrl, wsUrl, platform }, handlers, (userId: string) =>\n memberStore.getState().getMemberById(userId)\n );\n};\n","import { createStore } from 'zustand/vanilla';\n\ntype ChatToastData = {\n title: string;\n content?: string;\n};\n\ntype ChatToastStore = {\n toastsById: Record<string, ChatToastData>;\n\n setToast: (toastId: string, data: ChatToastData) => void;\n removeToast: (toastId: string) => void;\n};\n\n// The @corva/ui notification host can't update an already-created toast, so\n// grouped toasts re-render their counter in place by subscribing to this store.\nexport const chatToastStore = createStore<ChatToastStore>()(set => ({\n toastsById: {},\n\n setToast: (toastId, data) =>\n set(state => ({ toastsById: { ...state.toastsById, [toastId]: data } })),\n removeToast: toastId =>\n set(state => {\n const { [toastId]: _omit, ...rest } = state.toastsById;\n return { toastsById: rest };\n }),\n}));\n","import type { CorvaUser } from '../../types/corvaIntegration';\nimport { initChat } from '../init';\nimport { sharedRefs } from '../sharedRefs';\nimport { authStore } from '../stores/authStore';\n\nimport { SessionManager } from './sessionManager';\n\nconst REAUTH_COOLDOWN_MS = 30_000;\nconst FAILED_LOGIN_COOLDOWN_MS = 30_000;\nconst MAX_REAUTH_ROUNDS = 3;\nconst REAUTH_ROUND_WINDOW_MS = 5 * 60_000;\n\nlet inFlight: Promise<boolean> | null = null;\nlet lastCorvaUser: CorvaUser | null = null;\nlet reauthenticating = false;\nlet lastReauthAt = 0;\nlet reauthRounds = 0;\nlet lastFailedLoginAt = 0;\n\n// An accepted session ends the current run of rejections.\nauthStore.subscribe((state, previous) => {\n if (state.isConnected && !previous.isConnected) reauthRounds = 0;\n});\n\n// Re-login for the same Corva user without wiping the stores; the reconnect resyncs the room.\nexport async function handleUnauthorized(): Promise<void> {\n const { user, loginWithCorva, connectionGaveUp } = authStore.getState();\n if (reauthenticating || connectionGaveUp || !user || !lastCorvaUser) return;\n\n const now = Date.now();\n if (now - lastReauthAt < REAUTH_COOLDOWN_MS) return;\n reauthRounds = now - lastReauthAt < REAUTH_ROUND_WINDOW_MS ? reauthRounds + 1 : 1;\n lastReauthAt = now;\n\n if (reauthRounds > MAX_REAUTH_ROUNDS) {\n console.error('Chat session keeps being rejected; giving up until reload');\n sharedRefs.socket?.disconnect();\n authStore.setState({ isConnected: false, connectionGaveUp: true });\n return;\n }\n\n reauthenticating = true;\n try {\n SessionManager.clear();\n await loginWithCorva(lastCorvaUser);\n } finally {\n reauthenticating = false;\n }\n}\n\n// Shared by the background init and the panel hook so they cannot double-login.\nexport function ensureChatSession(corvaUser: CorvaUser): Promise<boolean> {\n lastCorvaUser = corvaUser;\n initChat();\n sharedRefs.api?.setUnauthorizedHandler(() => {\n handleUnauthorized().catch(error => console.error('Chat re-authentication failed', error));\n });\n\n if (authStore.getState().user) return Promise.resolve(true);\n if (inFlight) return inFlight;\n // The hooks re-run on every Redux user identity change.\n if (Date.now() - lastFailedLoginAt < FAILED_LOGIN_COOLDOWN_MS) return Promise.resolve(false);\n\n inFlight = (async () => {\n const { restoreSession, loginWithCorva } = authStore.getState();\n try {\n if (await restoreSession()) return true;\n const { success } = await loginWithCorva(corvaUser);\n if (!success) lastFailedLoginAt = Date.now();\n return success;\n } catch (error) {\n lastFailedLoginAt = Date.now();\n throw error;\n }\n })().finally(() => {\n inFlight = null;\n });\n\n return inFlight;\n}\n"]}