@poolse/react-native 2.0.9 → 2.0.11
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.cjs +65 -28
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -1
- package/dist/index.d.ts +8 -1
- package/dist/index.js +65 -28
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/theme/default.ts","../src/theme/PoolseTheme.tsx","../src/primitives/userColor.ts","../src/primitives/Avatar.tsx","../src/primitives/icons-data.ts","../src/primitives/PoolseIcon.tsx","../src/MemberList.tsx","../src/internal/useDismissableSheet.ts","../src/GroupDetailsSheet.tsx","../src/ChatHeader.tsx","../src/ConversationList.tsx","../src/internal/uploadContext.tsx","../src/AttachmentPicker.tsx","../src/UploadQueueStrip.tsx","../src/MessageComposer.tsx","../src/MentionInput.tsx","../src/MessageList.tsx","../src/EditableMessageBubble.tsx","../src/MessageActions.tsx","../src/AttachmentPreview.tsx","../src/ImageMosaic.tsx","../src/MessageBubble.tsx","../src/Reactions.tsx","../src/MessageRow.tsx","../src/ThreadView.tsx","../src/UserName.tsx","../src/TypingIndicator.tsx","../src/ConversationView.tsx","../src/internal/UserPickerSheet.tsx","../src/PoolseInbox.tsx","../src/primitives/PoolseLogo.tsx","../src/primitives/index.ts","../src/lifecycle/useAppStateLifecycle.tsx"],"names":["createContext","useMemo","useContext","jsxs","View","jsx","Image","Text","StyleSheet","SvgXml","useMembers","usePresence","styles","ActivityIndicator","FlatList","Fragment","useUser","Pressable","useRef","Animated","PanResponder","useConversation","useWindowDimensions","Modal","useMe","useState","useConversations","useAttachmentUpload","useCallback","res","ImagePicker","DocumentPicker","ScrollView","forwardRef","MessageComposer","useImperativeHandle","TextInput","useAttachmentUrl","formatBytes","Dimensions","radii","useReactions","useThread","KeyboardAvoidingView","Platform","useEffect","Easing","useMessages","useTyping","PoolseInbox","Svg","Path","Circle","G","usePoolse","AppState"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { PoolseRNTheme, ThemeShadows } from './types.js';\n\n// Values mirror the --poolse-* CSS variables in @poolse/react-ui's\n// styles.css :root block. If the brand changes there, change here.\n\nconst lightColors = {\n brand: '#ff5436',\n brandStrong: '#d63415',\n brandSoft: '#ffe9e2',\n onBrand: '#fbf7f4',\n paper: '#fbf7f4',\n surface: '#ffffff',\n surface2: '#f4eee9',\n ink: '#1c1a19',\n ink2: '#6b6560',\n ink3: '#9a938c',\n border: '#eae3dc',\n presence: '#16c172',\n success: '#16a34a',\n warning: '#e08c16',\n error: '#e5484d',\n info: '#3b82f6',\n selfBubble: '#ff5436',\n selfBubbleText: '#fbf7f4',\n otherBubble: '#ffffff',\n otherBubbleText: '#1c1a19',\n unreadPill: '#ff5436',\n unreadPillText: '#fbf7f4',\n};\n\nconst darkColors = {\n brand: '#ff6a4d',\n brandStrong: '#ff8366',\n brandSoft: '#2c1712',\n onBrand: '#fbf7f4',\n paper: '#0e0d10',\n surface: '#16141a',\n surface2: '#201d25',\n ink: '#f6f2ee',\n ink2: '#a8a29b',\n ink3: '#766f68',\n border: '#2a2630',\n presence: '#22d37a',\n success: '#34d399',\n warning: '#fbbf24',\n error: '#f87171',\n info: '#60a5fa',\n selfBubble: '#ff6a4d',\n selfBubbleText: '#fbf7f4',\n otherBubble: '#16141a',\n otherBubbleText: '#f6f2ee',\n unreadPill: '#ff6a4d',\n unreadPillText: '#fbf7f4',\n};\n\nconst type = {\n // RN can't use Bricolage/Hanken/JetBrains without expo-font setup,\n // so we default to the platform sans-serif. Devs override via the\n // theme prop if they ship custom fonts.\n fontDisplay: 'System',\n fontBody: 'System',\n fontMono: 'Menlo',\n bodySize: 15,\n lineHeight: 22,\n weightRegular: '400' as const,\n weightMedium: '500' as const,\n weightSemibold: '600' as const,\n weightBold: '700' as const,\n};\n\nconst radii = {\n sm: 8,\n md: 12,\n lg: 16,\n xl: 24,\n pill: 999,\n bubble: 16,\n};\n\nconst spacing = {\n xs: 4,\n sm: 8,\n md: 12,\n lg: 16,\n xl: 24,\n};\n\nconst lightShadows: ThemeShadows = {\n sm: {\n shadowColor: '#1c1a19',\n shadowOpacity: 0.08,\n shadowOffset: { width: 0, height: 1 },\n shadowRadius: 2,\n elevation: 1,\n },\n md: {\n shadowColor: '#1c1a19',\n shadowOpacity: 0.18,\n shadowOffset: { width: 0, height: 10 },\n shadowRadius: 30,\n elevation: 6,\n },\n lg: {\n shadowColor: '#1c1a19',\n shadowOpacity: 0.28,\n shadowOffset: { width: 0, height: 24 },\n shadowRadius: 60,\n elevation: 12,\n },\n};\n\nconst darkShadows: ThemeShadows = {\n sm: {\n shadowColor: '#000000',\n shadowOpacity: 0.4,\n shadowOffset: { width: 0, height: 1 },\n shadowRadius: 2,\n elevation: 1,\n },\n md: {\n shadowColor: '#000000',\n shadowOpacity: 0.55,\n shadowOffset: { width: 0, height: 10 },\n shadowRadius: 30,\n elevation: 6,\n },\n lg: {\n shadowColor: '#000000',\n shadowOpacity: 0.7,\n shadowOffset: { width: 0, height: 24 },\n shadowRadius: 60,\n elevation: 12,\n },\n};\n\nexport const defaultLightTheme: PoolseRNTheme = {\n mode: 'light',\n colors: lightColors,\n type,\n radii,\n spacing,\n shadows: lightShadows,\n};\n\nexport const defaultDarkTheme: PoolseRNTheme = {\n mode: 'dark',\n colors: darkColors,\n type,\n radii,\n spacing,\n shadows: darkShadows,\n};\n","import { createContext, useContext, useMemo, type ReactNode } from 'react';\n\nimport { defaultDarkTheme, defaultLightTheme } from './default.js';\nimport type { PoolseRNTheme, PoolseRNThemeOverrides, ThemeMode } from './types.js';\n\nconst ThemeContext = createContext<PoolseRNTheme | null>(null);\n\nexport interface PoolseThemeProps {\n /**\n * Light or dark base palette. Overrides are merged on top of the\n * chosen base. Defaults to `light` if omitted.\n */\n mode?: ThemeMode;\n /**\n * Partial overrides — only the fields you set replace the defaults.\n * Nested groups (`colors`, `type`, `radii`, `spacing`, `shadows`)\n * deep-merge, so `{ colors: { brand: '#000' } }` keeps every other\n * color from the base theme.\n */\n theme?: PoolseRNThemeOverrides;\n children: ReactNode;\n}\n\nexport function PoolseTheme({ mode, theme, children }: PoolseThemeProps) {\n const resolved = useMemo(() => {\n const base = (mode ?? theme?.mode) === 'dark' ? defaultDarkTheme : defaultLightTheme;\n if (!theme) return base;\n return {\n mode: theme.mode ?? base.mode,\n colors: { ...base.colors, ...theme.colors },\n type: { ...base.type, ...theme.type },\n radii: { ...base.radii, ...theme.radii },\n spacing: { ...base.spacing, ...theme.spacing },\n shadows: {\n sm: { ...base.shadows.sm, ...theme.shadows?.sm },\n md: { ...base.shadows.md, ...theme.shadows?.md },\n lg: { ...base.shadows.lg, ...theme.shadows?.lg },\n },\n } satisfies PoolseRNTheme;\n }, [mode, theme]);\n\n return <ThemeContext.Provider value={resolved}>{children}</ThemeContext.Provider>;\n}\n\n/**\n * Read the active poolse theme. Falls back to `defaultLightTheme`\n * if no `<PoolseTheme>` ancestor is mounted, so components render\n * sensibly even without explicit wiring.\n */\nexport function usePoolseTheme(): PoolseRNTheme {\n return useContext(ThemeContext) ?? defaultLightTheme;\n}\n","// Mirror of @poolse/react-ui's userColor — deterministic per-user\n// color from the same 8-hue palette.\n\nconst PALETTE = [\n '#6366f1', // indigo\n '#10b981', // emerald\n '#f59e0b', // amber\n '#ec4899', // rose\n '#0ea5e9', // sky\n '#8b5cf6', // violet\n '#14b8a6', // teal\n '#d946ef', // fuchsia\n];\n\nexport function userColor(id: string): string {\n let h = 0;\n for (let i = 0; i < id.length; i++) {\n h = (h * 31 + id.charCodeAt(i)) | 0;\n }\n return PALETTE[Math.abs(h) % PALETTE.length]!;\n}\n","import { Image, StyleSheet, Text, View } from 'react-native';\n\nimport { usePoolseTheme } from '../theme/PoolseTheme.js';\nimport { userColor } from './userColor.js';\n\nexport interface AvatarProps {\n /** URL to a profile image. Falls back to initials when omitted. */\n src?: string | null;\n /** Used for initials. */\n name?: string | null;\n /** Stable color seed (typically the user's external_id). */\n seed?: string | null;\n /** Show a green presence dot in the bottom-right corner. */\n online?: boolean;\n /** Size variant. `md` → 40px, `sm` → 28px, `lg` → 56px. */\n size?: 'sm' | 'md' | 'lg';\n}\n\nconst SIZES = { sm: 28, md: 40, lg: 56 } as const;\n\nexport function Avatar({ src, name, seed, online, size = 'md' }: AvatarProps) {\n const theme = usePoolseTheme();\n const dim = SIZES[size];\n const initials = computeInitials(name);\n const tint = seed ? userColor(seed) : theme.colors.brand;\n const fontSize = size === 'sm' ? 11 : size === 'lg' ? 22 : 15;\n\n return (\n <View\n style={[\n styles.root,\n {\n width: dim,\n height: dim,\n borderRadius: dim / 2,\n backgroundColor: tint,\n },\n ]}\n accessibilityRole=\"image\"\n accessibilityLabel={name ?? 'avatar'}\n >\n {src ? (\n <Image\n source={{ uri: src }}\n style={{ width: dim, height: dim, borderRadius: dim / 2 }}\n accessible={false}\n />\n ) : (\n <Text\n style={{\n color: theme.colors.onBrand,\n fontSize,\n fontWeight: '600',\n fontFamily: theme.type.fontBody,\n }}\n >\n {initials}\n </Text>\n )}\n {online ? (\n <View\n style={[\n styles.presence,\n {\n backgroundColor: theme.colors.presence,\n borderColor: theme.colors.surface,\n width: dim * 0.32,\n height: dim * 0.32,\n borderRadius: dim * 0.16,\n },\n ]}\n />\n ) : null}\n </View>\n );\n}\n\nfunction computeInitials(name: string | null | undefined): string {\n if (!name) return '?';\n const parts = name.trim().split(/\\s+/).slice(0, 2);\n return (\n parts\n .map((p) => p.charAt(0).toUpperCase())\n .join('')\n .slice(0, 2) || '?'\n );\n}\n\nconst styles = StyleSheet.create({\n root: {\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'visible',\n },\n presence: {\n position: 'absolute',\n bottom: 0,\n right: 0,\n borderWidth: 2,\n },\n});\n","// AUTO-GENERATED from poolse-brand-kit/icons/. Do not edit by hand.\n// Run scripts/build-icons.py from the brand kit if the source SVGs change.\n\nexport interface IconDef {\n vb: string;\n d: string;\n}\n\nexport const ICONS = {\n attachment: {\n vb: '0 0 24 24',\n d: '<path d=\"M20 11.6 11.4 20.2a5 5 0 0 1-7.1-7.1l8.7-8.7a3.3 3.3 0 0 1 4.7 4.7l-8.6 8.6a1.65 1.65 0 0 1-2.36-2.32l7.86-7.86\"/>',\n },\n bell: {\n vb: '0 0 24 24',\n d: '<path d=\"M6 9.2a6 6 0 0 1 12 0c0 4.8 1.4 6.3 1.9 6.8H4.1C4.6 15.5 6 14 6 9.2Z\"/><path d=\"M9.6 19.8a2.5 2.5 0 0 0 4.8 0\"/>',\n },\n 'check-double': {\n vb: '0 0 24 24',\n d: '<path d=\"M2.5 12.8 6.9 17 15.4 7.6\"/><path d=\"M11.4 16.4 12.3 17.2 21 7.6\"/>',\n },\n check: {\n vb: '0 0 24 24',\n d: '<path d=\"M4.5 12.6 9.4 17.4 19.5 6.6\"/>',\n },\n 'chevron-down': {\n vb: '0 0 24 24',\n d: '<path d=\"M5 9 12 16 19 9\"/>',\n },\n 'chevron-right': {\n vb: '0 0 24 24',\n d: '<path d=\"M9 5 16 12 9 19\"/>',\n },\n close: {\n vb: '0 0 24 24',\n d: '<path d=\"M6 6 18 18M18 6 6 18\"/>',\n },\n code: {\n vb: '0 0 24 24',\n d: '<path d=\"M9 7.5 4.5 12 9 16.5\"/><path d=\"M15 7.5 19.5 12 15 16.5\"/><path d=\"M13.2 5 10.8 19\"/>',\n },\n compose: {\n vb: '0 0 24 24',\n d: '<path d=\"M11.5 4H6a2.5 2.5 0 0 0-2.5 2.5V18A2.5 2.5 0 0 0 6 20.5h11.5A2.5 2.5 0 0 0 20 18v-5.5\"/><path d=\"M18.4 2.7a2.05 2.05 0 0 1 2.9 2.9L12 15l-4 1 1-4 9.4-9.3Z\"/>',\n },\n copy: {\n vb: '0 0 24 24',\n d: '<rect x=\"8.4\" y=\"8.4\" width=\"11.2\" height=\"11.2\" rx=\"2.3\"/><path d=\"M5.6 15.6H5A1.6 1.6 0 0 1 3.4 14V5A1.6 1.6 0 0 1 5 3.4h9A1.6 1.6 0 0 1 15.6 5v.6\"/>',\n },\n download: {\n vb: '0 0 24 24',\n d: '<path d=\"M12 3.2v11.6\"/><path d=\"M7.4 10.2 12 14.8 16.6 10.2\"/><path d=\"M4 19.6h16\"/>',\n },\n edit: {\n vb: '0 0 24 24',\n d: '<path d=\"M16.7 3.3a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4 12.7-12.7Z\"/>',\n },\n emoji: {\n vb: '0 0 24 24',\n d: '<circle cx=\"12\" cy=\"12\" r=\"8.6\"/><circle cx=\"9\" cy=\"10\" r=\"1\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"15\" cy=\"10\" r=\"1\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M8.4 14.2a4.6 4.6 0 0 0 7.2 0\"/>',\n },\n heart: {\n vb: '0 0 24 24',\n d: '<path d=\"M12 20.3 4.4 12.9a4.6 4.6 0 1 1 6.5-6.5l1.1 1.1 1.1-1.1a4.6 4.6 0 1 1 6.5 6.5L12 20.3Z\"/>',\n },\n image: {\n vb: '0 0 24 24',\n d: '<rect x=\"3.2\" y=\"4.2\" width=\"17.6\" height=\"15.6\" rx=\"2.6\"/><circle cx=\"8.6\" cy=\"9.4\" r=\"1.7\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M20.8 15.8 16 11 6 19.8\"/>',\n },\n info: {\n vb: '0 0 24 24',\n d: '<circle cx=\"12\" cy=\"12\" r=\"8.6\"/><path d=\"M12 11v5.2\"/><circle cx=\"12\" cy=\"7.7\" r=\"1\" fill=\"currentColor\" stroke=\"none\"/>',\n },\n key: {\n vb: '0 0 24 24',\n d: '<circle cx=\"8\" cy=\"8\" r=\"4.4\"/><path d=\"M11.1 11.1 20 20\"/><path d=\"M16.6 16.6 18.6 14.6M14 14l2-2\"/>',\n },\n link: {\n vb: '0 0 24 24',\n d: '<path d=\"M10.2 13.8a3.5 3.5 0 0 0 5 0l3-3a3.5 3.5 0 0 0-5-5l-1.2 1.2\"/><path d=\"M13.8 10.2a3.5 3.5 0 0 0-5 0l-3 3a3.5 3.5 0 0 0 5 5l1.2-1.2\"/>',\n },\n lock: {\n vb: '0 0 24 24',\n d: '<rect x=\"4.6\" y=\"10.4\" width=\"14.8\" height=\"9.8\" rx=\"2.2\"/><path d=\"M8 10.4V7a4 4 0 0 1 8 0v3.4\"/>',\n },\n message: {\n vb: '0 0 24 24',\n d: '<path d=\"M20.5 11.4c0 4.5-3.9 8.1-8.5 8.1a9 9 0 0 1-3.7-.78L3.5 20.5l1.8-4.6A7.9 7.9 0 0 1 3.5 11.4C3.5 6.9 7.4 3.3 12 3.3s8.5 3.6 8.5 8.1Z\"/>',\n },\n messages: {\n vb: '0 0 24 24',\n d: '<path d=\"M14 9.2a4.7 4.7 0 0 1-4.7 4.7H6.8L3.5 16.4v-2.9A4.7 4.7 0 0 1 6.8 4.5h2.5A4.7 4.7 0 0 1 14 9.2Z\"/><path d=\"M9.4 13.6A4.7 4.7 0 0 0 13.6 16h3.6l3.3 2.5v-2.9a4.7 4.7 0 0 0-2.4-4.1\"/>',\n },\n mic: {\n vb: '0 0 24 24',\n d: '<rect x=\"9\" y=\"2.6\" width=\"6\" height=\"11.2\" rx=\"3\"/><path d=\"M5.6 11.2a6.4 6.4 0 0 0 12.8 0\"/><path d=\"M12 17.6v3.4\"/><path d=\"M8.6 21h6.8\"/>',\n },\n 'more-h': {\n vb: '0 0 24 24',\n d: '<circle cx=\"5.4\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"12\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"18.6\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/>',\n },\n 'more-v': {\n vb: '0 0 24 24',\n d: '<circle cx=\"12\" cy=\"5.4\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"12\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"12\" cy=\"18.6\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/>',\n },\n pin: {\n vb: '0 0 24 24',\n d: '<path d=\"M9 3.4h6v1.8l-1 5.6 3 3.2H7l3-3.2-1-5.6V3.4Z\"/><path d=\"M12 17v3.6\"/>',\n },\n plus: {\n vb: '0 0 24 24',\n d: '<path d=\"M12 5v14M5 12h14\"/>',\n },\n presence: {\n vb: '0 0 24 24',\n d: '<circle cx=\"12\" cy=\"12\" r=\"9\" fill=\"currentColor\" opacity=\"0.18\" stroke=\"none\"/><circle cx=\"12\" cy=\"12\" r=\"5\" fill=\"currentColor\" stroke=\"none\"/>',\n },\n pulse: {\n vb: '0 0 24 24',\n d: '<path d=\"M3 13h4.6l2.2-4.6 3.4 9 2.2-4.4H21\"/>',\n },\n reply: {\n vb: '0 0 24 24',\n d: '<path d=\"M9 7 4 12l5 5\"/><path d=\"M4 12h9.5a6.5 6.5 0 0 1 6.5 6.5V20\"/>',\n },\n search: {\n vb: '0 0 24 24',\n d: '<circle cx=\"11\" cy=\"11\" r=\"6.8\"/><path d=\"M20.8 20.8 16 16\"/>',\n },\n 'send-fill': {\n vb: '0 0 24 24',\n d: '<path fill=\"currentColor\" stroke=\"none\" d=\"M21.7 2.3a1 1 0 0 1 .25 1L15.3 21.8a1 1 0 0 1-1.86.06L10.6 14.2 3 11.4a1 1 0 0 1 .06-1.9L20.7 2.05a1 1 0 0 1 1 .25Z\"/>',\n },\n send: {\n vb: '0 0 24 24',\n d: '<path d=\"M21.4 2.6 11 13\"/><path d=\"M21.4 2.6 14.8 21.5a.6.6 0 0 1-1.1.05L11 14l-7.5-2.7a.6.6 0 0 1 .05-1.1L21.4 2.6Z\"/>',\n },\n settings: {\n vb: '0 0 24 24',\n d: '<circle cx=\"12\" cy=\"12\" r=\"3.1\"/><path d=\"M12 2.6V5M12 19v2.4M4.2 4.2 5.9 5.9M18.1 18.1l1.7 1.7M2.6 12H5M19 12h2.4M4.2 19.8 5.9 18.1M18.1 5.9l1.7-1.7\"/>',\n },\n sliders: {\n vb: '0 0 24 24',\n d: '<path d=\"M4 7h9M17 7h3\"/><circle cx=\"15\" cy=\"7\" r=\"2.1\"/><path d=\"M4 17h3M11 17h9\"/><circle cx=\"9\" cy=\"17\" r=\"2.1\"/>',\n },\n 'thumbs-up': {\n vb: '0 0 24 24',\n d: '<path d=\"M7 10.4V20H4.2V10.4Z\"/><path d=\"M7 10.4 11 3.2a2 2 0 0 1 1.9 2.2L12.4 9H18a2 2 0 0 1 2 2.4l-1.1 6A2 2 0 0 1 16.9 20H7\"/>',\n },\n trash: {\n vb: '0 0 24 24',\n d: '<path d=\"M4 7h16\"/><path d=\"M9.2 7V5.2A1.8 1.8 0 0 1 11 3.4h2a1.8 1.8 0 0 1 1.8 1.8V7\"/><path d=\"M6.2 7 7.2 19A1.9 1.9 0 0 0 9.1 20.7h5.8A1.9 1.9 0 0 0 16.8 19L17.8 7\"/><path d=\"M10.3 11v5M13.7 11v5\"/>',\n },\n typing: {\n vb: '0 0 24 24',\n d: '<circle cx=\"6\" cy=\"12\" r=\"1.7\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"12\" cy=\"12\" r=\"1.7\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"18\" cy=\"12\" r=\"1.7\" fill=\"currentColor\" stroke=\"none\"/>',\n },\n 'user-plus': {\n vb: '0 0 24 24',\n d: '<circle cx=\"9\" cy=\"8\" r=\"3.8\"/><path d=\"M3 20a6 6 0 0 1 12 0\"/><path d=\"M18 8v6M15 11h6\"/>',\n },\n user: {\n vb: '0 0 24 24',\n d: '<circle cx=\"12\" cy=\"8\" r=\"4\"/><path d=\"M4.6 20a7.4 7.4 0 0 1 14.8 0\"/>',\n },\n users: {\n vb: '0 0 24 24',\n d: '<circle cx=\"9\" cy=\"8\" r=\"3.6\"/><path d=\"M2.6 20a6.4 6.4 0 0 1 12.8 0\"/><path d=\"M15.8 4.7a3.6 3.6 0 0 1 0 6.6\"/><path d=\"M17.6 20a6.4 6.4 0 0 0-3.1-5.5\"/>',\n },\n webhook: {\n vb: '0 0 24 24',\n d: '<circle cx=\"6\" cy=\"6\" r=\"2.6\"/><circle cx=\"18\" cy=\"9\" r=\"2.6\"/><circle cx=\"9.5\" cy=\"18\" r=\"2.6\"/><path d=\"M7.9 7.9 12 12l3.7-1.5\"/><path d=\"M11.6 12.7 9.8 16\"/>',\n },\n} as const satisfies Record<string, IconDef>;\n\nexport type IconName = keyof typeof ICONS;\n","import { SvgXml } from 'react-native-svg';\n\nimport { usePoolseTheme } from '../theme/PoolseTheme.js';\nimport { ICONS, type IconName } from './icons-data.js';\n\nexport type { IconName };\n\nexport interface PoolseIconProps {\n /** Icon name — see {@link IconName} for the full list. */\n name: IconName;\n /** Width + height in pixels. Defaults to `20` (matches a body-line). */\n size?: number;\n /** Stroke color. Defaults to the theme's `ink` color. */\n color?: string;\n /** Accessibility label. Defaults to the icon name. */\n label?: string | null;\n}\n\nexport function PoolseIcon({ name, size = 20, color, label }: PoolseIconProps) {\n const theme = usePoolseTheme();\n const def = ICONS[name];\n if (!def) return null;\n const stroke = color ?? theme.colors.ink;\n const xml = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"${def.vb}\" fill=\"none\" stroke=\"${stroke}\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${def.d}</svg>`;\n const a11y =\n label === null\n ? { accessibilityRole: 'none' as const }\n : { accessibilityRole: 'image' as const, accessibilityLabel: label ?? name };\n return <SvgXml xml={xml} width={size} height={size} {...a11y} />;\n}\n","import type { MemberRole, Membership, Uuid } from '@poolse/sdk';\nimport { useMembers, usePresence, useUser } from '@poolse/react';\nimport { type ReactNode } from 'react';\nimport { ActivityIndicator, FlatList, Pressable, StyleSheet, Text, View } from 'react-native';\n\nimport { Avatar } from './primitives/Avatar.js';\nimport { PoolseIcon } from './primitives/PoolseIcon.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport interface MemberListProps {\n conversationId: Uuid;\n labelFor?: (externalId: string) => string;\n avatarFor?: (externalId: string) => string | null;\n onlineExternalIds?: Set<string>;\n canRemove?: (m: Membership) => boolean;\n renderItem?: (m: Membership) => ReactNode;\n emptyState?: ReactNode | string;\n}\n\nexport function MemberList({\n conversationId,\n labelFor,\n avatarFor,\n onlineExternalIds,\n canRemove,\n renderItem,\n emptyState,\n}: MemberListProps) {\n const theme = usePoolseTheme();\n const { members, loading, error, removeMember } = useMembers(conversationId);\n const { online: presenceOnline } = usePresence(\n onlineExternalIds === undefined ? conversationId : '',\n );\n const effectiveOnline = onlineExternalIds ?? presenceOnline;\n\n if (loading && members.length === 0) {\n return (\n <View style={[styles.placeholder, { backgroundColor: theme.colors.paper }]}>\n <ActivityIndicator color={theme.colors.brand} />\n </View>\n );\n }\n\n if (error) {\n return (\n <View style={[styles.placeholder, { backgroundColor: theme.colors.paper }]}>\n <Text style={{ color: theme.colors.error, fontFamily: theme.type.fontBody }}>\n Failed to load members.\n </Text>\n {error.message ? (\n <Text style={[styles.errorDetail, { color: theme.colors.ink3 }]}>{error.message}</Text>\n ) : null}\n </View>\n );\n }\n\n if (members.length === 0) {\n return (\n <View style={[styles.placeholder, { backgroundColor: theme.colors.paper }]}>\n {typeof emptyState === 'string' || emptyState == null ? (\n <Text style={{ color: theme.colors.ink3, fontFamily: theme.type.fontBody }}>\n {(emptyState as string) ?? 'No members.'}\n </Text>\n ) : (\n emptyState\n )}\n </View>\n );\n }\n\n return (\n <FlatList\n data={members}\n keyExtractor={(m) => m.user_id}\n style={{ backgroundColor: theme.colors.paper }}\n renderItem={({ item }) => {\n if (renderItem) return <>{renderItem(item)}</>;\n const isOnline = effectiveOnline.has(item.external_id);\n const showRemove = canRemove?.(item) ?? false;\n return (\n <MemberRow\n externalId={item.external_id}\n role={item.role}\n online={isOnline}\n {...(labelFor ? { labelFor } : {})}\n {...(avatarFor ? { avatarFor } : {})}\n {...(showRemove ? { onRemove: () => removeMember(item.external_id) } : {})}\n />\n );\n }}\n />\n );\n}\n\nfunction MemberRow({\n externalId,\n role,\n online,\n labelFor,\n avatarFor,\n onRemove,\n}: {\n externalId: string;\n role: MemberRole;\n online: boolean;\n labelFor?: (externalId: string) => string;\n avatarFor?: (externalId: string) => string | null;\n onRemove?: () => void;\n}) {\n const theme = usePoolseTheme();\n // Priority: explicit prop > SDK userResolver > externalId fallback.\n // The previous version used `labelFor?.(id) ?? id` and skipped the\n // resolver entirely when labelFor wasn't passed, defeating the\n // PoolseConfig.userResolver contract for consumers who configured\n // one and expected names + avatars to flow through automatically.\n const resolved = useUser(externalId);\n const name =\n labelFor?.(externalId) ?? resolved.profile?.displayName ?? externalId;\n const avatarUrl =\n avatarFor?.(externalId) ?? resolved.profile?.avatarUrl ?? null;\n return (\n <View style={styles.row}>\n <Avatar src={avatarUrl} name={name} seed={externalId} online={online} size=\"md\" />\n <View style={styles.body}>\n <Text\n style={[styles.name, { color: theme.colors.ink, fontFamily: theme.type.fontBody }]}\n numberOfLines={1}\n >\n {name}\n </Text>\n <Text style={[styles.role, { color: theme.colors.ink3 }]}>{role}</Text>\n </View>\n {onRemove ? (\n <Pressable onPress={onRemove} hitSlop={8} style={styles.removeBtn}>\n <PoolseIcon name=\"close\" size={16} color={theme.colors.ink2} />\n </Pressable>\n ) : null}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n placeholder: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n padding: 24,\n },\n errorDetail: {\n marginTop: 6,\n fontSize: 11,\n },\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 12,\n paddingVertical: 8,\n gap: 10,\n },\n body: {\n flex: 1,\n gap: 1,\n },\n name: {\n fontSize: 14,\n fontWeight: '500',\n },\n role: {\n fontSize: 11,\n textTransform: 'capitalize',\n },\n removeBtn: {\n padding: 6,\n },\n});\n","import { useMemo, useRef } from 'react';\nimport { Animated, PanResponder } from 'react-native';\n\ninterface Options {\n /** Called once the dismiss animation completes. */\n onClose: () => void;\n /**\n * Sheet height in pixels — used as the off-screen target when\n * animating dismissal. Pass `Dimensions.get('window').height * 0.85`\n * for a standard 85% bottom sheet.\n */\n sheetHeight: number;\n /**\n * Fraction of sheetHeight the user must drag past to commit\n * dismissal on release. Defaults to 0.22. Quick flicks (high\n * vertical velocity) also commit regardless of distance.\n */\n dismissThreshold?: number;\n}\n\n/**\n * Adds a pull-down-to-dismiss gesture to a bottom sheet. Returns an\n * Animated `translateY` to apply to the sheet's outer wrapper +\n * `panHandlers` to spread on whichever sub-view captures the drag\n * (typically the drag-pill area at the top, OR the whole sheet if\n * you want anywhere-drag to work).\n *\n * Only claims the gesture on clear downward motion; horizontal /\n * upward drags pass through to children (so a FlatList inside the\n * sheet can still scroll normally).\n */\nexport function useDismissableSheet({ onClose, sheetHeight, dismissThreshold = 0.22 }: Options) {\n const translateY = useRef(new Animated.Value(0)).current;\n\n const panResponder = useMemo(\n () =>\n PanResponder.create({\n onMoveShouldSetPanResponder: (_, g) => {\n // Only claim on clear downward intent. Lets the FlatList\n // inside the sheet handle vertical scrolls upward.\n return g.dy > 6 && g.dy > Math.abs(g.dx);\n },\n onPanResponderMove: (_, g) => {\n // Only follow downward drag (positive dy). Upward goes\n // back to 0 — sheet can't be pulled UP past its anchor.\n translateY.setValue(Math.max(0, g.dy));\n },\n onPanResponderRelease: (_, g) => {\n const committed = g.dy > sheetHeight * dismissThreshold || g.vy > 0.6;\n if (committed) {\n // Animate the sheet off-screen, THEN fire onClose. Without\n // this the modal's own slide-out + our reset would fight.\n Animated.timing(translateY, {\n toValue: sheetHeight,\n duration: 180,\n useNativeDriver: true,\n }).start(() => {\n translateY.setValue(0);\n onClose();\n });\n } else {\n Animated.spring(translateY, {\n toValue: 0,\n useNativeDriver: true,\n speed: 22,\n bounciness: 4,\n }).start();\n }\n },\n onPanResponderTerminate: () => {\n Animated.spring(translateY, {\n toValue: 0,\n useNativeDriver: true,\n speed: 22,\n bounciness: 4,\n }).start();\n },\n }),\n [onClose, sheetHeight, dismissThreshold, translateY],\n );\n\n return { translateY, panHandlers: panResponder.panHandlers };\n}\n","import type { Uuid } from '@poolse/sdk';\nimport { useConversation, useMembers } from '@poolse/react';\nimport {\n Animated,\n Modal,\n Pressable,\n StyleSheet,\n Text,\n useWindowDimensions,\n View,\n} from 'react-native';\n\nimport { Avatar } from './primitives/Avatar.js';\nimport { MemberList } from './MemberList.js';\nimport { PoolseIcon } from './primitives/PoolseIcon.js';\nimport { useDismissableSheet } from './internal/useDismissableSheet.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport interface GroupDetailsSheetProps {\n visible: boolean;\n onClose: () => void;\n conversationId: Uuid;\n /** Resolve external_id → display name. Same shape as MemberList. */\n labelFor?: (externalId: string) => string;\n /** Resolve external_id → avatar URL. Same shape as MemberList. */\n avatarFor?: (externalId: string) => string | null;\n /**\n * Predicate for the per-row remove button. Defaults to \"never show\"\n * — wire it on the parent for owners/admins. Receives the\n * Membership row so you can scope to roles or exclude self.\n */\n canRemoveMember?: (m: { user_id: string; external_id: string; role: string }) => boolean;\n}\n\n/**\n * Bottom-sheet (85% of screen) that opens when the user taps the\n * group chat header. Shows group name + member count at the top,\n * then a scrollable roster with avatars, display names (resolved\n * through `labelFor` / `userResolver`), role badges, and live\n * presence dots (driven by `MemberList` internally).\n */\nexport function GroupDetailsSheet({\n visible,\n onClose,\n conversationId,\n labelFor,\n avatarFor,\n canRemoveMember,\n}: GroupDetailsSheetProps) {\n const theme = usePoolseTheme();\n const { conversation } = useConversation(conversationId);\n const { members } = useMembers(conversationId);\n const { height: screenHeight } = useWindowDimensions();\n const { translateY, panHandlers } = useDismissableSheet({\n onClose,\n sheetHeight: screenHeight * 0.85,\n });\n\n const title = conversation?.name ?? 'Conversation';\n const subtitle = `${members.length} ${members.length === 1 ? 'member' : 'members'}`;\n\n return (\n <Modal\n visible={visible}\n transparent\n animationType=\"slide\"\n onRequestClose={onClose}\n statusBarTranslucent\n >\n <View style={styles.modalRoot}>\n <Pressable\n style={styles.backdrop}\n onPress={onClose}\n accessibilityLabel=\"Close group details\"\n />\n\n <Animated.View\n style={[\n styles.sheet,\n {\n backgroundColor: theme.colors.paper,\n borderTopLeftRadius: theme.radii.xl,\n borderTopRightRadius: theme.radii.xl,\n transform: [{ translateY }],\n },\n theme.shadows.lg,\n ]}\n >\n {/* Pan handlers spread on the drag-pill region so list\n scrolling underneath isn't affected. */}\n <View {...panHandlers} style={styles.dragHandle}>\n <View style={[styles.dragPill, { backgroundColor: theme.colors.ink3 }]} />\n </View>\n\n <View style={styles.headerRow}>\n <Pressable\n onPress={onClose}\n hitSlop={16}\n style={[styles.closeBtn, { backgroundColor: theme.colors.surface2 }]}\n accessibilityLabel=\"Close\"\n >\n <PoolseIcon name=\"close\" size={18} color={theme.colors.ink} />\n </Pressable>\n <Text\n style={[\n styles.headerTitle,\n { color: theme.colors.ink, fontFamily: theme.type.fontDisplay },\n ]}\n >\n Group details\n </Text>\n </View>\n\n <View style={styles.summary}>\n <Avatar src={null} name={title} seed={conversationId} size=\"lg\" />\n <Text\n style={[\n styles.title,\n { color: theme.colors.ink, fontFamily: theme.type.fontDisplay },\n ]}\n numberOfLines={1}\n >\n {title}\n </Text>\n <Text style={[styles.subtitle, { color: theme.colors.ink3 }]}>{subtitle}</Text>\n </View>\n\n <View style={[styles.divider, { backgroundColor: theme.colors.border }]} />\n\n <View style={styles.sectionLabelRow}>\n <Text\n style={[\n styles.sectionLabel,\n { color: theme.colors.ink2, fontFamily: theme.type.fontBody },\n ]}\n >\n Members\n </Text>\n </View>\n\n <View style={{ flex: 1 }}>\n <MemberList\n conversationId={conversationId}\n {...(labelFor ? { labelFor } : {})}\n {...(avatarFor ? { avatarFor } : {})}\n {...(canRemoveMember ? { canRemove: canRemoveMember } : {})}\n emptyState=\"No members yet.\"\n />\n </View>\n </Animated.View>\n </View>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n modalRoot: {\n flex: 1,\n justifyContent: 'flex-end',\n },\n backdrop: {\n ...StyleSheet.absoluteFillObject,\n backgroundColor: 'rgba(0,0,0,0.4)',\n },\n sheet: {\n height: '85%',\n overflow: 'hidden',\n },\n dragHandle: {\n alignItems: 'center',\n paddingTop: 8,\n paddingBottom: 4,\n },\n dragPill: {\n width: 36,\n height: 4,\n borderRadius: 2,\n opacity: 0.4,\n },\n headerRow: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 12,\n paddingTop: 4,\n paddingBottom: 12,\n gap: 10,\n },\n closeBtn: {\n width: 32,\n height: 32,\n borderRadius: 16,\n alignItems: 'center',\n justifyContent: 'center',\n },\n headerTitle: {\n fontSize: 16,\n fontWeight: '600',\n },\n summary: {\n alignItems: 'center',\n paddingHorizontal: 16,\n paddingBottom: 16,\n gap: 8,\n },\n title: {\n fontSize: 20,\n fontWeight: '700',\n },\n subtitle: {\n fontSize: 13,\n },\n divider: {\n height: StyleSheet.hairlineWidth,\n },\n sectionLabelRow: {\n paddingHorizontal: 16,\n paddingTop: 14,\n paddingBottom: 6,\n },\n sectionLabel: {\n fontSize: 11,\n fontWeight: '700',\n letterSpacing: 0.5,\n textTransform: 'uppercase',\n },\n});\n","import type { Uuid } from '@poolse/sdk';\nimport { useConversation, useMe, useMembers, usePresence, useUser } from '@poolse/react';\nimport { useState } from 'react';\nimport { Pressable, StyleSheet, Text, View } from 'react-native';\n\nimport { Avatar } from './primitives/Avatar.js';\nimport { GroupDetailsSheet } from './GroupDetailsSheet.js';\nimport { PoolseIcon } from './primitives/PoolseIcon.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport interface ChatHeaderProps {\n conversationId: Uuid;\n /**\n * Override the title resolver — useful when you want to derive the\n * direct-chat name from your own user directory instead of going\n * through the SDK's `userResolver`. When omitted, falls back to:\n * * direct → the other member's display name (via `useUser`)\n * * group → `conversation.name`\n */\n labelFor?: (externalId: string) => string;\n /** Optional avatar URL resolver for the other party (direct only). */\n avatarFor?: (externalId: string) => string | null;\n /** Right-side icon button — typically opens a member-list sheet. */\n onMembersPress?: () => void;\n /**\n * Tap handler for the whole header. Behavior:\n * * Direct chat → calls this if provided, otherwise no-op.\n * * Group chat → calls this if provided. If omitted, the header\n * opens a built-in group-details sheet showing the member\n * roster with live presence.\n */\n onPress?: () => void;\n /**\n * When provided, renders a back arrow on the LEFT of the header\n * that calls this handler on tap. Used by `<PoolseInbox>` to\n * navigate back to the conversation list; safe to wire from your\n * own navigator too.\n */\n onBack?: () => void;\n}\n\n/**\n * Top-of-chat header bar.\n * * 1:1 direct → other user's display name + avatar + presence dot.\n * * Group → conversation name + \"N members\" + group-tile avatar.\n *\n * Sits above `<MessageList>` inside `<ConversationView>` by default;\n * pass `header={false}` to `<ConversationView>` if you mount your own.\n */\nexport function ChatHeader({\n conversationId,\n labelFor,\n avatarFor,\n onMembersPress,\n onPress,\n onBack,\n}: ChatHeaderProps) {\n const theme = usePoolseTheme();\n const { conversation } = useConversation(conversationId);\n const { members } = useMembers(conversationId);\n const { me } = useMe();\n const { online } = usePresence(conversationId);\n const [detailsOpen, setDetailsOpen] = useState(false);\n\n const isDirect = conversation?.type === 'direct';\n const otherMember = isDirect ? members.find((m) => m.user_id !== me?.id) : null;\n const otherExtId = otherMember?.external_id ?? null;\n // useUser is safe with null — short-circuits to no-op state. Keeps the\n // hook unconditional regardless of conversation type.\n const otherUser = useUser(otherExtId);\n\n if (!conversation) {\n return (\n <View\n style={[\n styles.root,\n {\n backgroundColor: theme.colors.surface,\n borderBottomColor: theme.colors.border,\n },\n ]}\n />\n );\n }\n\n const fallbackName = otherExtId ?? '';\n const directName =\n otherUser.profile?.displayName ??\n (otherExtId ? (labelFor?.(otherExtId) ?? fallbackName) : 'Direct');\n const title = isDirect ? directName : (conversation.name ?? 'Conversation');\n\n const isOnline = isDirect && otherExtId ? online.has(otherExtId) : false;\n const subtitle = isDirect\n ? isOnline\n ? 'Online'\n : null\n : `${members.length} ${members.length === 1 ? 'member' : 'members'}`;\n\n const avatarUrl =\n isDirect && otherExtId\n ? (avatarFor?.(otherExtId) ?? otherUser.profile?.avatarUrl ?? null)\n : null;\n const avatarSeed = isDirect ? (otherExtId ?? conversationId) : conversationId;\n\n // For groups, default tap = open the built-in details sheet.\n // For directs (or when caller supplied onPress), call onPress.\n // A View wrapper is used only when there's no tap target at all\n // (direct chat with no onPress) so we don't render a no-op\n // Pressable that swallows touches.\n const isGroup = !isDirect;\n const headerOnPress = onPress ?? (isGroup ? () => setDetailsOpen(true) : undefined);\n const Wrapper: typeof View | typeof Pressable = headerOnPress ? Pressable : View;\n\n return (\n <>\n <Wrapper\n {...(headerOnPress ? { onPress: headerOnPress } : {})}\n style={[\n styles.root,\n {\n backgroundColor: theme.colors.surface,\n borderBottomColor: theme.colors.border,\n },\n ]}\n >\n {onBack ? (\n <Pressable onPress={onBack} hitSlop={12} style={styles.backBtn} accessibilityLabel=\"Back\">\n <PoolseIcon name=\"reply\" size={20} color={theme.colors.ink} />\n </Pressable>\n ) : null}\n <Avatar src={avatarUrl} name={title} seed={avatarSeed} online={isOnline} size=\"md\" />\n <View style={styles.titleCol}>\n <Text\n style={[styles.title, { color: theme.colors.ink, fontFamily: theme.type.fontDisplay }]}\n numberOfLines={1}\n >\n {title}\n </Text>\n {subtitle ? (\n <Text style={[styles.subtitle, { color: theme.colors.ink3 }]} numberOfLines={1}>\n {subtitle}\n </Text>\n ) : null}\n </View>\n {onMembersPress ? (\n <Pressable\n onPress={onMembersPress}\n hitSlop={12}\n style={styles.actionBtn}\n accessibilityLabel=\"Show members\"\n >\n <PoolseIcon name=\"users\" size={20} color={theme.colors.ink2} />\n </Pressable>\n ) : null}\n </Wrapper>\n\n {isGroup ? (\n <GroupDetailsSheet\n visible={detailsOpen}\n onClose={() => setDetailsOpen(false)}\n conversationId={conversationId}\n {...(labelFor ? { labelFor } : {})}\n {...(avatarFor ? { avatarFor } : {})}\n />\n ) : null}\n </>\n );\n}\n\nconst styles = StyleSheet.create({\n root: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 14,\n paddingVertical: 10,\n borderBottomWidth: StyleSheet.hairlineWidth,\n gap: 12,\n },\n titleCol: {\n flex: 1,\n gap: 2,\n },\n title: {\n fontSize: 16,\n fontWeight: '600',\n },\n subtitle: {\n fontSize: 12,\n fontWeight: '500',\n },\n actionBtn: {\n width: 36,\n height: 36,\n borderRadius: 18,\n alignItems: 'center',\n justifyContent: 'center',\n },\n backBtn: {\n width: 36,\n height: 36,\n alignItems: 'center',\n justifyContent: 'center',\n marginLeft: -6,\n },\n});\n","import type { Conversation, Uuid } from '@poolse/sdk';\nimport { useConversations } from '@poolse/react';\nimport { type ReactNode } from 'react';\nimport { ActivityIndicator, FlatList, Pressable, StyleSheet, Text, View } from 'react-native';\n\nimport { Avatar } from './primitives/Avatar.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport interface ConversationListProps {\n selectedId?: string | null;\n onSelect?: (conv: Conversation) => void;\n /** Optional override for each row's rendering. */\n renderItem?: (conv: Conversation, selected: boolean) => ReactNode;\n /** Custom empty state when there are no conversations. */\n emptyState?: ReactNode | string;\n /** Controlled-mode: skip `useConversations()` and render from these. */\n conversations?: Conversation[];\n loading?: boolean;\n error?: Error | null;\n /** Per-conversation unread counts rendered as a Pulse Coral pill. */\n unreadCounts?: Record<Uuid, number>;\n}\n\nexport function ConversationList({\n selectedId,\n onSelect,\n renderItem,\n emptyState,\n conversations: controlled,\n loading: controlledLoading,\n error: controlledError,\n unreadCounts,\n}: ConversationListProps) {\n const theme = usePoolseTheme();\n const auto = useConversations();\n const isControlled = controlled !== undefined;\n const conversations = isControlled ? controlled : auto.conversations;\n const loading = isControlled ? (controlledLoading ?? false) : auto.loading;\n const error = isControlled ? (controlledError ?? null) : auto.error;\n const counts = unreadCounts ?? (isControlled ? undefined : auto.unreadCounts);\n\n if (loading && conversations.length === 0) {\n return (\n <View style={[styles.placeholder, { backgroundColor: theme.colors.paper }]}>\n <ActivityIndicator color={theme.colors.brand} />\n </View>\n );\n }\n\n if (error) {\n return (\n <View style={[styles.placeholder, { backgroundColor: theme.colors.paper }]}>\n <Text style={{ color: theme.colors.error, fontFamily: theme.type.fontBody }}>\n Failed to load conversations.\n </Text>\n </View>\n );\n }\n\n if (conversations.length === 0) {\n return (\n <View style={[styles.placeholder, { backgroundColor: theme.colors.paper }]}>\n {typeof emptyState === 'string' || emptyState == null ? (\n <Text style={{ color: theme.colors.ink3, fontFamily: theme.type.fontBody }}>\n {(emptyState as string) ?? 'No conversations yet.'}\n </Text>\n ) : (\n emptyState\n )}\n </View>\n );\n }\n\n return (\n <FlatList\n data={conversations}\n keyExtractor={(c) => c.id}\n style={{ backgroundColor: theme.colors.paper }}\n renderItem={({ item }) => {\n const selected = selectedId === item.id;\n if (renderItem) {\n return <>{renderItem(item, selected)}</>;\n }\n const unread = counts?.[item.id] ?? 0;\n return (\n <Pressable\n onPress={() => onSelect?.(item)}\n style={[\n styles.row,\n {\n backgroundColor: selected ? theme.colors.surface2 : 'transparent',\n },\n ]}\n >\n <Avatar src={null} name={item.name ?? null} seed={item.id} size=\"md\" />\n <View style={styles.body}>\n <Text\n style={[styles.name, { color: theme.colors.ink, fontFamily: theme.type.fontBody }]}\n numberOfLines={1}\n >\n {item.name ?? 'Untitled conversation'}\n </Text>\n {item.last_message_at ? (\n <Text style={[styles.preview, { color: theme.colors.ink3 }]} numberOfLines={1}>\n {formatRelative(item.last_message_at)}\n </Text>\n ) : null}\n </View>\n {unread > 0 ? (\n <View style={[styles.unreadPill, { backgroundColor: theme.colors.unreadPill }]}>\n <Text style={[styles.unreadText, { color: theme.colors.unreadPillText }]}>\n {unread > 99 ? '99+' : String(unread)}\n </Text>\n </View>\n ) : null}\n </Pressable>\n );\n }}\n />\n );\n}\n\nfunction formatRelative(iso: string): string {\n try {\n const d = new Date(iso);\n const now = Date.now();\n const diff = now - d.getTime();\n if (diff < 60_000) return 'just now';\n if (diff < 3600_000) return `${Math.floor(diff / 60_000)}m`;\n if (diff < 86_400_000) return `${Math.floor(diff / 3600_000)}h`;\n return `${Math.floor(diff / 86_400_000)}d`;\n } catch {\n return '';\n }\n}\n\nconst styles = StyleSheet.create({\n placeholder: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n padding: 24,\n },\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 12,\n paddingVertical: 10,\n gap: 10,\n },\n body: {\n flex: 1,\n gap: 2,\n },\n name: {\n fontSize: 15,\n fontWeight: '600',\n },\n preview: {\n fontSize: 12,\n },\n unreadPill: {\n minWidth: 22,\n height: 22,\n borderRadius: 11,\n paddingHorizontal: 6,\n alignItems: 'center',\n justifyContent: 'center',\n },\n unreadText: {\n fontSize: 11,\n fontWeight: '700',\n },\n});\n","import { createContext, useCallback, useContext, useRef, type ReactNode } from 'react';\nimport { useAttachmentUpload } from '@poolse/react';\n\ntype UploadState = ReturnType<typeof useAttachmentUpload>;\n\n/**\n * Shared upload-queue value. The SDK's `useAttachmentUpload` creates\n * a private queue per call site — without a provider, each component\n * (picker / composer / strip) ends up with its own queue and uploads\n * never reach the send-with-attachment_ids path.\n *\n * `setPreview` / `getPreview` are an RN-only side channel: the SDK\n * strips the original local file URI when it converts to a Blob, but\n * the queue strip needs the URI to render an Image thumbnail. The\n * picker stashes it here keyed by filename so the strip can read it\n * back during render.\n */\ninterface UploadContextValue {\n upload: UploadState;\n setPreview: (filename: string, uri: string) => void;\n getPreview: (filename: string) => string | null;\n}\n\nconst UploadCtx = createContext<UploadContextValue | null>(null);\n\nexport function UploadProvider({ children }: { children: ReactNode }) {\n const upload = useAttachmentUpload();\n const previews = useRef<Map<string, string>>(new Map());\n\n const setPreview = useCallback((filename: string, uri: string) => {\n previews.current.set(filename, uri);\n }, []);\n\n const getPreview = useCallback((filename: string) => {\n return previews.current.get(filename) ?? null;\n }, []);\n\n return (\n <UploadCtx.Provider value={{ upload, setPreview, getPreview }}>{children}</UploadCtx.Provider>\n );\n}\n\n/**\n * Read the shared upload state. Falls back to a component-local\n * `useAttachmentUpload` when no provider is mounted so the component\n * still functions standalone (but loses preview thumbnails since\n * setPreview won't propagate).\n */\nexport function useSharedUpload(): UploadState {\n const fromCtx = useContext(UploadCtx);\n const fallback = useAttachmentUpload();\n return fromCtx?.upload ?? fallback;\n}\n\n/**\n * Preview-URI side channel for the queue strip's thumbnails. No-op\n * when no provider is mounted (strip falls back to icon placeholder).\n */\nexport function useUploadPreview() {\n const ctx = useContext(UploadCtx);\n return {\n setPreview: ctx?.setPreview ?? (() => undefined),\n getPreview: ctx?.getPreview ?? (() => null),\n };\n}\n","import { Modal, Pressable, StyleSheet, Text, View } from 'react-native';\n// Static imports — Metro's bundle graph can only trace literal\n// `import` / `require` calls. The earlier `new Function('m', 'return\n// import(m)')(name)` trick bypassed Metro entirely, so the picker\n// modules were never bundled even when the consumer installed them.\n//\n// Trade-off: if a consumer mounts <AttachmentPicker> without these\n// modules installed, the bundle fails at build time with a clear\n// \"module not found\" rather than the silent runtime warning we had\n// before. Consumers who don't want attachments at all should pass\n// `attachments={false}` to <ConversationView> so this file is never\n// rendered (and tree-shaking can drop the imports in production\n// builds with a real bundler — Metro doesn't tree-shake but the\n// imports add ~12kb total which is acceptable).\nimport * as ImagePicker from 'expo-image-picker';\nimport * as DocumentPicker from 'expo-document-picker';\n\nimport { PoolseIcon } from './primitives/PoolseIcon.js';\nimport { useSharedUpload, useUploadPreview } from './internal/uploadContext.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport interface AttachmentPickerProps {\n visible: boolean;\n onClose: () => void;\n /**\n * Optional adapter that produces upload inputs from a picked file.\n * Override to plug in custom storage / transcoding. Default reads\n * from `expo-image-picker` / `expo-document-picker`.\n */\n onPickInputs?: (kind: 'image' | 'document') => Promise<\n {\n body: { uri: string; name: string; type: string } | Blob | unknown;\n contentType: string;\n byteSize: number;\n filename?: string;\n }[]\n >;\n}\n\n/**\n * Picker sheet wrapping `expo-image-picker` and `expo-document-picker`.\n * Both must be installed (`npx expo install expo-image-picker\n * expo-document-picker`) when this component is mounted — they're\n * declared as optional peers because consumers who pass\n * `attachments={false}` to ConversationView never render this file.\n */\nexport function AttachmentPicker({ visible, onClose, onPickInputs }: AttachmentPickerProps) {\n const theme = usePoolseTheme();\n // Shared queue (via UploadProvider) so the composer sees these\n // uploads and can include them in the next send. Falls back to a\n // local queue when the picker is mounted outside ConversationView.\n const upload = useSharedUpload();\n const { setPreview } = useUploadPreview();\n\n const pickFromKind = async (kind: 'image' | 'document') => {\n try {\n const adapter = onPickInputs ?? defaultAdapter;\n const inputs = await adapter(kind);\n for (const input of inputs) {\n // Stash the original local URI on the shared context so the\n // UploadQueueStrip can render a real thumbnail. The SDK only\n // sees the Blob from here on out.\n const previewUri = (input as { _previewUri?: string })._previewUri ?? null;\n if (previewUri && input.filename) {\n setPreview(input.filename, previewUri);\n }\n void upload.upload(input as never);\n }\n } catch (err) {\n console.warn('[poolse/picker]', err);\n } finally {\n onClose();\n }\n };\n\n return (\n <Modal visible={visible} transparent animationType=\"slide\" onRequestClose={onClose}>\n <Pressable style={styles.backdrop} onPress={onClose}>\n <View\n style={[\n styles.sheet,\n {\n backgroundColor: theme.colors.surface,\n borderTopLeftRadius: theme.radii.lg,\n borderTopRightRadius: theme.radii.lg,\n },\n theme.shadows.lg,\n ]}\n >\n <Pressable style={styles.item} onPress={() => pickFromKind('image')}>\n <PoolseIcon name=\"attachment\" size={20} color={theme.colors.ink2} />\n <Text style={[styles.itemText, { color: theme.colors.ink }]}>Photo or video</Text>\n </Pressable>\n <Pressable style={styles.item} onPress={() => pickFromKind('document')}>\n <PoolseIcon name=\"attachment\" size={20} color={theme.colors.ink2} />\n <Text style={[styles.itemText, { color: theme.colors.ink }]}>File</Text>\n </Pressable>\n <Pressable style={styles.cancel} onPress={onClose}>\n <Text style={[styles.itemText, { color: theme.colors.brand }]}>Cancel</Text>\n </Pressable>\n </View>\n </Pressable>\n </Modal>\n );\n}\n\n// RN gives us a local file URI. The SDK's upload PUTs the `body` raw\n// to a presigned S3/R2 URL — those only accept raw bytes, NOT\n// multipart. If we passed the `{ uri, name, type }` object directly,\n// fetch would serialize it as multipart and the bucket would reject\n// the upload silently. So we read the URI as a Blob first (same shape\n// that `<input type=\"file\">` would give on web) and pass that.\nasync function uriToBlob(uri: string): Promise<Blob> {\n const res = await fetch(uri);\n if (!res.ok && res.status !== 0) {\n throw new Error(`failed to read picked file (HTTP ${res.status})`);\n }\n return res.blob();\n}\n\nasync function defaultAdapter(kind: 'image' | 'document') {\n if (kind === 'image') {\n const res = await ImagePicker.launchImageLibraryAsync({\n mediaTypes: 'images',\n quality: 0.85,\n });\n if (res.canceled) return [];\n return Promise.all(\n res.assets.map(async (asset) => {\n const blob = await uriToBlob(asset.uri);\n const contentType = asset.mimeType ?? blob.type ?? 'image/jpeg';\n // _previewUri is read by the picker before passing the input\n // to the SDK; the SDK ignores unknown fields.\n return {\n body: blob,\n contentType,\n byteSize: asset.fileSize ?? blob.size,\n filename: asset.fileName ?? `image-${Date.now()}.jpg`,\n _previewUri: asset.uri,\n };\n }),\n );\n }\n const res = await DocumentPicker.getDocumentAsync({\n copyToCacheDirectory: true,\n multiple: true,\n });\n if (res.canceled) return [];\n return Promise.all(\n res.assets.map(async (asset) => {\n const blob = await uriToBlob(asset.uri);\n const contentType = asset.mimeType ?? blob.type ?? 'application/octet-stream';\n return {\n body: blob,\n contentType,\n byteSize: asset.size ?? blob.size,\n filename: asset.name,\n _previewUri: asset.uri,\n };\n }),\n );\n}\n\nconst styles = StyleSheet.create({\n backdrop: {\n flex: 1,\n backgroundColor: 'rgba(0,0,0,0.35)',\n justifyContent: 'flex-end',\n },\n sheet: {\n paddingVertical: 8,\n paddingBottom: 24,\n },\n item: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 20,\n paddingVertical: 14,\n gap: 14,\n },\n cancel: {\n paddingHorizontal: 20,\n paddingVertical: 14,\n alignItems: 'center',\n marginTop: 4,\n },\n itemText: {\n fontSize: 15,\n fontWeight: '500',\n },\n});\n","import { Image, Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';\n\nimport { PoolseIcon } from './primitives/PoolseIcon.js';\nimport { useSharedUpload, useUploadPreview } from './internal/uploadContext.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\n/**\n * Horizontal scrolling preview row of pending / in-flight / ready\n * uploads. Image attachments render as 64×64 thumbnails sourced from\n * the original local file URI; file attachments render as a row card\n * with icon + name + size. A small × overlay on each tile lets the\n * user drop the upload before send.\n *\n * Reads queue state from the shared `<UploadProvider>` (mounted by\n * `<ConversationView>`), so the composer's \"ready attachment ids\"\n * pickup and the strip's display always agree.\n */\nexport function UploadQueueStrip() {\n const theme = usePoolseTheme();\n const upload = useSharedUpload();\n const { getPreview } = useUploadPreview();\n\n if (upload.queue.length === 0) return null;\n\n return (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={styles.scroll}\n // overflow:visible (+ explicit paddingTop on the contentContainer)\n // so the X close button can sit at -6/-6 outside the tile without\n // being clipped by the scroll bounds.\n style={[styles.scrollStyle, { marginBottom: 8 }]}\n >\n {upload.queue.map((item) => {\n const isError = item.status === 'error';\n const isUploading = item.status === 'uploading' || item.status === 'pending';\n const isImage = (item.contentType ?? '').startsWith('image/');\n const previewUri = getPreview(item.filename);\n const canTerminate = isUploading || item.status === 'ready' || isError;\n\n const handleClose = () => {\n if (item.status === 'ready' || isError) upload.remove(item.localId);\n else upload.cancel(item.localId);\n };\n\n return (\n <View key={item.localId} style={styles.tileWrap}>\n {isImage && previewUri ? (\n <ImageTile uri={previewUri} uploading={isUploading} error={isError} />\n ) : (\n <FileTile\n filename={item.filename}\n size={item.byteSize}\n uploading={isUploading}\n error={isError}\n />\n )}\n\n {canTerminate ? (\n <Pressable\n onPress={handleClose}\n hitSlop={8}\n style={[styles.closeBtn, { backgroundColor: theme.colors.ink }]}\n accessibilityLabel={isError ? 'Remove failed upload' : 'Cancel upload'}\n >\n <PoolseIcon name=\"close\" size={11} color={theme.colors.onBrand} />\n </Pressable>\n ) : null}\n\n {isUploading ? (\n <View style={styles.progressOverlay}>\n <View style={[styles.spinner, { borderColor: theme.colors.onBrand }]} />\n </View>\n ) : null}\n\n {isError ? (\n <View style={[styles.errorOverlay, { backgroundColor: 'rgba(229,72,77,0.85)' }]}>\n <Text style={[styles.errorText, { color: '#fff' }]}>Failed</Text>\n </View>\n ) : null}\n </View>\n );\n })}\n </ScrollView>\n );\n}\n\nfunction ImageTile({ uri, uploading, error }: { uri: string; uploading: boolean; error: boolean }) {\n const theme = usePoolseTheme();\n return (\n <Image\n source={{ uri }}\n style={[\n styles.imageTile,\n {\n backgroundColor: theme.colors.surface2,\n borderColor: error ? theme.colors.error : 'transparent',\n opacity: uploading ? 0.65 : 1,\n },\n ]}\n resizeMode=\"cover\"\n />\n );\n}\n\nfunction FileTile({\n filename,\n size,\n uploading,\n error,\n}: {\n filename: string;\n size: number;\n uploading: boolean;\n error: boolean;\n}) {\n const theme = usePoolseTheme();\n return (\n <View\n style={[\n styles.fileTile,\n {\n backgroundColor: theme.colors.surface2,\n borderColor: error\n ? theme.colors.error\n : uploading\n ? theme.colors.brand\n : theme.colors.border,\n },\n ]}\n >\n <View style={[styles.fileIconBox, { backgroundColor: theme.colors.brandSoft }]}>\n <PoolseIcon name=\"attachment\" size={18} color={theme.colors.brand} />\n </View>\n <View style={styles.fileInfo}>\n <Text\n style={[styles.fileName, { color: theme.colors.ink, fontFamily: theme.type.fontBody }]}\n numberOfLines={1}\n >\n {filename}\n </Text>\n <Text style={[styles.fileSize, { color: theme.colors.ink3 }]}>{formatBytes(size)}</Text>\n </View>\n </View>\n );\n}\n\nfunction formatBytes(n: number): string {\n if (!n || n < 0) return '';\n if (n < 1024) return `${n} B`;\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB`;\n if (n < 1024 * 1024 * 1024) return `${(n / 1024 / 1024).toFixed(1)} MB`;\n return `${(n / 1024 / 1024 / 1024).toFixed(1)} GB`;\n}\n\nconst TILE = 64;\n\nconst styles = StyleSheet.create({\n scrollStyle: {\n overflow: 'visible',\n },\n scroll: {\n paddingHorizontal: 8,\n // paddingTop creates room for the X to overflow the tile without\n // being clipped on Android (where overflow:visible isn't enough).\n paddingTop: 8,\n gap: 10,\n flexDirection: 'row',\n },\n tileWrap: {\n position: 'relative',\n overflow: 'visible',\n },\n imageTile: {\n width: TILE,\n height: TILE,\n borderRadius: 10,\n borderWidth: 1.5,\n },\n fileTile: {\n height: TILE,\n minWidth: 200,\n maxWidth: 260,\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 10,\n paddingRight: 28,\n borderRadius: 10,\n borderWidth: 1,\n gap: 10,\n },\n fileIconBox: {\n width: 36,\n height: 36,\n borderRadius: 8,\n alignItems: 'center',\n justifyContent: 'center',\n },\n fileInfo: {\n flex: 1,\n gap: 2,\n },\n fileName: {\n fontSize: 13,\n fontWeight: '600',\n },\n fileSize: {\n fontSize: 11,\n },\n closeBtn: {\n // Outside the tile (top-right corner overflowing). Parent\n // scroll container + tileWrap set overflow:visible and the\n // scroll contentContainer has paddingTop:8 so the overflow\n // isn't clipped on Android.\n position: 'absolute',\n top: -6,\n right: -6,\n width: 22,\n height: 22,\n borderRadius: 11,\n alignItems: 'center',\n justifyContent: 'center',\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 1 },\n shadowOpacity: 0.3,\n shadowRadius: 2,\n elevation: 3,\n },\n progressOverlay: {\n ...StyleSheet.absoluteFillObject,\n alignItems: 'center',\n justifyContent: 'center',\n pointerEvents: 'none',\n },\n spinner: {\n width: 24,\n height: 24,\n borderRadius: 12,\n borderWidth: 2.5,\n borderTopColor: 'transparent',\n // RN can't loop a rotation purely in StyleSheet, but the static\n // 3/4-circle still reads as \"in progress.\" A real Animated.View\n // rotation lands in a follow-up.\n },\n errorOverlay: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n paddingVertical: 3,\n alignItems: 'center',\n },\n errorText: {\n fontSize: 10,\n fontWeight: '700',\n },\n});\n","import { forwardRef, useImperativeHandle, useRef, useState } from 'react';\nimport { Pressable, StyleSheet, Text, TextInput, View } from 'react-native';\nimport type { AttachmentUploadInput, Message, Uuid } from '@poolse/sdk';\nimport { useUser } from '@poolse/react';\n\nimport { PoolseIcon } from './primitives/PoolseIcon.js';\nimport { UploadQueueStrip } from './UploadQueueStrip.js';\nimport { useSharedUpload } from './internal/uploadContext.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport interface MessageComposerProps {\n /**\n * Called when the user taps Send. Second arg carries\n * `quoted_message_id` (when replying) and `attachment_ids`\n * (resolved from the composer's upload queue). Awaited so the\n * composer disables until the send round-trips.\n */\n onSend: (\n body: string,\n opts?: { quoted_message_id?: Uuid; attachment_ids?: Uuid[] },\n ) => Promise<unknown> | void;\n /** Called on every keystroke. Hook to `useTyping().signalTyping`. */\n onTyping?: () => void;\n placeholder?: string;\n disabled?: boolean;\n /** Renders a quote chip above the input; cleared by the caller in `onSend`. */\n replyingTo?: Message | null;\n /** User tapped (x) on the quote chip. */\n onCancelReply?: () => void;\n /** Display label for the quoted sender, keyed by `external_id`. */\n labelFor?: (externalId: string) => string;\n /** Show the paperclip + queue strip. Defaults true. */\n attachments?: boolean;\n /** Tap on the paperclip — wire to `<AttachmentPicker>` from the same package. */\n onAttachPress?: () => void;\n /**\n * Distance from the top of the screen to the top of the\n * KeyboardAvoidingView — typically the height of any navigation\n * header sitting above the chat. Pass this when the iOS keyboard\n * suggestions strip ends up covering the composer (a sign the\n * computed offset is wrong). Defaults to 0; on Android it's\n * ignored.\n */\n keyboardOffset?: number;\n}\n\n/**\n * Imperative handle for parents that want to add files to the\n * composer's upload queue externally (drag/drop on a wrapper,\n * deep-link, attachment shortcut).\n */\nexport interface MessageComposerHandle {\n /** Enqueue ready-to-upload inputs. The picker component is the usual caller; this is the escape hatch. */\n addFiles: (inputs: AttachmentUploadInput[]) => void;\n focus: () => void;\n clear: () => void;\n}\n\nexport const MessageComposer = forwardRef<MessageComposerHandle, MessageComposerProps>(\n function MessageComposer(\n {\n onSend,\n onTyping,\n placeholder = 'Type a message…',\n disabled = false,\n replyingTo,\n onCancelReply,\n labelFor,\n attachments = true,\n onAttachPress,\n keyboardOffset: _keyboardOffset = 0,\n },\n ref,\n ) {\n const theme = usePoolseTheme();\n const inputRef = useRef<TextInput>(null);\n const [value, setValue] = useState('');\n const [sending, setSending] = useState(false);\n const upload = useSharedUpload();\n\n useImperativeHandle(\n ref,\n () => ({\n addFiles: (inputs) => {\n if (!attachments) return;\n for (const input of inputs) {\n void upload.upload(input);\n }\n },\n focus: () => inputRef.current?.focus(),\n clear: () => setValue(''),\n }),\n [attachments, upload],\n );\n\n const readyAttachmentIds = upload.queue\n .filter((item) => item.status === 'ready' && item.attachment)\n .map((item) => item.attachment!.id);\n const isUploading = upload.queue.some(\n (item) => item.status === 'uploading' || item.status === 'pending',\n );\n\n const submitDisabled =\n disabled ||\n sending ||\n isUploading ||\n (value.trim().length === 0 && readyAttachmentIds.length === 0);\n\n const handleSend = async () => {\n if (submitDisabled) return;\n setSending(true);\n try {\n await onSend(value.trim(), {\n ...(replyingTo ? { quoted_message_id: replyingTo.id } : {}),\n ...(readyAttachmentIds.length > 0 ? { attachment_ids: readyAttachmentIds } : {}),\n });\n setValue('');\n upload.reset();\n } finally {\n setSending(false);\n }\n };\n\n // No KeyboardAvoidingView here — ConversationView wraps the whole\n // chat surface in a single KAV so the list + composer shift up\n // together. Wrapping only the composer inside a flex:1 parent\n // with no headroom pushed it below the visible area on iPhone\n // home-indicator devices.\n return (\n <View\n style={[\n styles.wrap,\n {\n backgroundColor: theme.colors.surface,\n borderTopColor: theme.colors.border,\n },\n ]}\n >\n {replyingTo ? (\n <ReplyChip\n message={replyingTo}\n {...(labelFor ? { labelFor } : {})}\n {...(onCancelReply ? { onCancel: onCancelReply } : {})}\n />\n ) : null}\n\n {attachments ? <UploadQueueStrip /> : null}\n\n <View style={styles.row}>\n {attachments && onAttachPress ? (\n <Pressable\n onPress={onAttachPress}\n hitSlop={8}\n style={styles.iconBtn}\n accessibilityLabel=\"Attach file\"\n >\n <PoolseIcon name=\"attachment\" size={22} color={theme.colors.ink2} />\n </Pressable>\n ) : null}\n\n <TextInput\n ref={inputRef}\n value={value}\n onChangeText={(text) => {\n setValue(text);\n onTyping?.();\n }}\n placeholder={placeholder}\n placeholderTextColor={theme.colors.ink3}\n multiline\n editable={!disabled}\n style={[\n styles.input,\n {\n color: theme.colors.ink,\n backgroundColor: theme.colors.surface2,\n borderRadius: theme.radii.lg,\n fontFamily: theme.type.fontBody,\n fontSize: theme.type.bodySize,\n },\n ]}\n />\n\n <Pressable\n onPress={handleSend}\n disabled={submitDisabled}\n style={[\n styles.sendBtn,\n {\n backgroundColor: submitDisabled ? theme.colors.ink3 : theme.colors.brand,\n opacity: submitDisabled ? 0.6 : 1,\n },\n ]}\n accessibilityLabel=\"Send message\"\n >\n <PoolseIcon name=\"send\" size={18} color={theme.colors.onBrand} />\n </Pressable>\n </View>\n </View>\n );\n },\n);\n\nfunction ReplyChip({\n message,\n labelFor,\n onCancel,\n}: {\n message: Message;\n labelFor?: (externalId: string) => string;\n onCancel?: () => void;\n}) {\n const theme = usePoolseTheme();\n // Priority: explicit prop > SDK userResolver > externalId fallback.\n const resolved = useUser(message.sender_external_id);\n const senderName = message.sender_external_id\n ? (labelFor?.(message.sender_external_id) ??\n resolved.profile?.displayName ??\n message.sender_external_id)\n : 'Unknown';\n return (\n <View\n style={[\n styles.replyChip,\n {\n backgroundColor: theme.colors.surface2,\n borderLeftColor: theme.colors.brand,\n },\n ]}\n >\n <View style={{ flex: 1 }}>\n <Text style={[styles.replyName, { color: theme.colors.brand }]}>\n Replying to {senderName}\n </Text>\n <Text style={[styles.replyBody, { color: theme.colors.ink2 }]} numberOfLines={1}>\n {message.body ?? '…'}\n </Text>\n </View>\n {onCancel ? (\n <Pressable onPress={onCancel} hitSlop={8} style={styles.replyCancel}>\n <PoolseIcon name=\"close\" size={16} color={theme.colors.ink2} />\n </Pressable>\n ) : null}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n wrap: {\n borderTopWidth: StyleSheet.hairlineWidth,\n paddingTop: 8,\n paddingBottom: 10,\n paddingHorizontal: 12,\n // Note: no safe-area inset here on purpose. Wrap your chat\n // surface in <SafeAreaView> (or <SafeAreaView edges={['bottom']}>)\n // at the app root so the home-indicator clearance is handled\n // once. Doing it here too produces double padding.\n },\n row: {\n flexDirection: 'row',\n alignItems: 'flex-end',\n gap: 8,\n },\n iconBtn: {\n padding: 8,\n justifyContent: 'center',\n alignItems: 'center',\n },\n input: {\n flex: 1,\n minHeight: 40,\n maxHeight: 120,\n paddingHorizontal: 12,\n paddingTop: 10,\n paddingBottom: 10,\n },\n sendBtn: {\n width: 40,\n height: 40,\n borderRadius: 20,\n justifyContent: 'center',\n alignItems: 'center',\n },\n replyChip: {\n flexDirection: 'row',\n alignItems: 'center',\n borderLeftWidth: 3,\n paddingLeft: 10,\n paddingRight: 6,\n paddingVertical: 6,\n marginBottom: 8,\n borderRadius: 6,\n },\n replyName: {\n fontSize: 11,\n fontWeight: '600',\n marginBottom: 2,\n },\n replyBody: {\n fontSize: 12,\n },\n replyCancel: {\n padding: 6,\n },\n});\n","import type { Membership, Uuid } from '@poolse/sdk';\nimport { useMembers } from '@poolse/react';\nimport { useMemo, useState } from 'react';\nimport { FlatList, Modal, Pressable, StyleSheet, Text, View } from 'react-native';\n\nimport { Avatar } from './primitives/Avatar.js';\nimport { MessageComposer, type MessageComposerProps } from './MessageComposer.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport interface MentionInputProps extends Omit<MessageComposerProps, 'onSend'> {\n conversationId: Uuid;\n /** Same callback as MessageComposer.onSend, plus optional mention user_ids. */\n onSend: (\n body: string,\n opts?: {\n quoted_message_id?: Uuid;\n attachment_ids?: Uuid[];\n mentions?: Uuid[];\n },\n ) => Promise<unknown> | void;\n}\n\n/**\n * Composer with an inline `@`-trigger that opens a modal sheet of\n * conversation members. Selecting a member inserts their\n * `external_id` into the text, and the wire `mentions` array (sent\n * to the backend) carries the corresponding internal `user_id`s.\n */\nexport function MentionInput({ conversationId, onSend, ...composerProps }: MentionInputProps) {\n const theme = usePoolseTheme();\n const { members } = useMembers(conversationId);\n const [pickerOpen, setPickerOpen] = useState(false);\n const [pickerQuery, _setPickerQuery] = useState('');\n const [pendingMentionUuids, setPendingMentionUuids] = useState<Uuid[]>([]);\n const [text, setText] = useState('');\n\n const filteredMembers = useMemo(() => {\n if (!pickerQuery) return members;\n const q = pickerQuery.toLowerCase();\n return members.filter((m) => m.external_id.toLowerCase().includes(q));\n }, [members, pickerQuery]);\n\n const handleSend: MessageComposerProps['onSend'] = async (body, opts) => {\n await onSend(body, {\n ...opts,\n ...(pendingMentionUuids.length > 0 ? { mentions: pendingMentionUuids } : {}),\n });\n setPendingMentionUuids([]);\n setText('');\n };\n\n return (\n <>\n <MessageComposer\n {...composerProps}\n onSend={handleSend}\n onTyping={() => {\n composerProps.onTyping?.();\n // Watch for an `@` token to open the picker.\n const lastChar = text.slice(-1);\n if (lastChar === '@') setPickerOpen(true);\n }}\n />\n\n <Modal\n visible={pickerOpen}\n transparent\n animationType=\"slide\"\n onRequestClose={() => setPickerOpen(false)}\n >\n <Pressable style={styles.backdrop} onPress={() => setPickerOpen(false)}>\n <View\n style={[\n styles.sheet,\n {\n backgroundColor: theme.colors.surface,\n borderTopLeftRadius: theme.radii.lg,\n borderTopRightRadius: theme.radii.lg,\n },\n ]}\n >\n <Text\n style={[styles.title, { color: theme.colors.ink, fontFamily: theme.type.fontBody }]}\n >\n Mention a member\n </Text>\n <FlatList\n data={filteredMembers}\n keyExtractor={(m) => m.user_id}\n renderItem={({ item }) => (\n <MentionRow\n member={item}\n onPress={() => {\n setPendingMentionUuids((prev) => [...prev, item.user_id]);\n setText((prev) => `${prev}${item.external_id} `);\n setPickerOpen(false);\n }}\n />\n )}\n />\n </View>\n </Pressable>\n </Modal>\n </>\n );\n}\n\nfunction MentionRow({ member, onPress }: { member: Membership; onPress: () => void }) {\n const theme = usePoolseTheme();\n return (\n <Pressable onPress={onPress} style={styles.row}>\n <Avatar src={null} name={member.external_id} seed={member.external_id} size=\"sm\" />\n <Text style={[styles.rowText, { color: theme.colors.ink, fontFamily: theme.type.fontBody }]}>\n {member.external_id}\n </Text>\n </Pressable>\n );\n}\n\nconst styles = StyleSheet.create({\n backdrop: {\n flex: 1,\n backgroundColor: 'rgba(0,0,0,0.35)',\n justifyContent: 'flex-end',\n },\n sheet: {\n maxHeight: '60%',\n paddingVertical: 12,\n },\n title: {\n fontSize: 14,\n fontWeight: '600',\n paddingHorizontal: 16,\n paddingBottom: 8,\n },\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 16,\n paddingVertical: 10,\n gap: 10,\n },\n rowText: {\n fontSize: 14,\n },\n});\n","import type { Message } from '@poolse/sdk';\nimport {\n ActivityIndicator,\n FlatList,\n type ListRenderItem,\n StyleSheet,\n Text,\n View,\n} from 'react-native';\nimport { useCallback, type ReactElement } from 'react';\n\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport interface MessageListProps {\n messages: Message[];\n loading?: boolean;\n hasMore?: boolean;\n onLoadMore?: () => void;\n renderItem: (msg: Message, index: number) => ReactElement;\n /** Slot rendered above the latest message (typically the typing indicator). */\n ListHeader?: ReactElement | null;\n /** Slot rendered below the oldest message (rare — typically nothing). */\n ListFooter?: ReactElement | null;\n /** Custom empty state when there are no messages. */\n emptyState?: ReactElement | string;\n}\n\n/**\n * Inverted FlatList wrapper for chat history. Newest message at the\n * bottom (visually), oldest at the top. Calls `onLoadMore` when the\n * user scrolls near the top edge and `hasMore` is true.\n *\n * Pagination is owned by `useMessages` (hand it `messages` +\n * `hasMore` + `loadMore`); this component just renders + scrolls.\n */\nexport function MessageList({\n messages,\n loading = false,\n hasMore = false,\n onLoadMore,\n renderItem,\n ListHeader = null,\n ListFooter = null,\n emptyState,\n}: MessageListProps) {\n const theme = usePoolseTheme();\n\n // FlatList is inverted, so the newest item is index 0 (rendered at\n // the bottom visually). React's `messages` is newest-last per the\n // SDK convention; we reverse for FlatList.\n const data = [...messages].reverse();\n\n const handleRender: ListRenderItem<Message> = useCallback(\n ({ item, index }) => renderItem(item, messages.length - 1 - index),\n [renderItem, messages.length],\n );\n\n if (loading && messages.length === 0) {\n return (\n <View style={[styles.placeholder, { backgroundColor: theme.colors.paper }]}>\n <ActivityIndicator color={theme.colors.brand} />\n </View>\n );\n }\n\n if (messages.length === 0) {\n return (\n <View style={[styles.placeholder, { backgroundColor: theme.colors.paper }]}>\n {typeof emptyState === 'string' ? (\n <Text style={{ color: theme.colors.ink3, fontFamily: theme.type.fontBody }}>\n {emptyState}\n </Text>\n ) : (\n (emptyState ?? null)\n )}\n </View>\n );\n }\n\n return (\n <FlatList\n inverted\n data={data}\n keyExtractor={(item) => item.id}\n renderItem={handleRender}\n onEndReached={hasMore ? onLoadMore : undefined}\n onEndReachedThreshold={0.3}\n // `inverted` flips ListHeader / ListFooter visually too — the\n // header lands at the bottom and footer at the top. We swap\n // them in props so the caller-facing semantics match the\n // visual reality.\n ListHeaderComponent={ListFooter}\n ListFooterComponent={\n <View>\n {hasMore && loading ? (\n <ActivityIndicator color={theme.colors.ink3} style={{ marginVertical: 8 }} />\n ) : null}\n {ListHeader}\n </View>\n }\n style={{ backgroundColor: theme.colors.paper }}\n contentContainerStyle={{ paddingVertical: 8 }}\n />\n );\n}\n\nconst styles = StyleSheet.create({\n placeholder: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n padding: 24,\n },\n});\n","import type { Message } from '@poolse/sdk';\nimport { useState } from 'react';\nimport { Pressable, StyleSheet, Text, TextInput, View } from 'react-native';\n\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport interface EditableMessageBubbleProps {\n message: Message;\n currentUserId: string | null;\n onCancel: () => void;\n onSave: (body: string) => Promise<unknown> | void;\n}\n\nexport function EditableMessageBubble({\n message,\n currentUserId,\n onCancel,\n onSave,\n}: EditableMessageBubbleProps) {\n const theme = usePoolseTheme();\n const isSelf = currentUserId !== null && message.sender_id === currentUserId;\n const [value, setValue] = useState(message.body ?? '');\n const [saving, setSaving] = useState(false);\n\n const submit = async () => {\n if (saving || !value.trim()) return;\n setSaving(true);\n try {\n await onSave(value.trim());\n } finally {\n setSaving(false);\n }\n };\n\n const bg = isSelf ? theme.colors.selfBubble : theme.colors.otherBubble;\n const ink = isSelf ? theme.colors.selfBubbleText : theme.colors.otherBubbleText;\n\n return (\n <View\n style={[\n styles.wrap,\n {\n alignSelf: isSelf ? 'flex-end' : 'flex-start',\n maxWidth: '80%',\n },\n ]}\n >\n <View\n style={[\n styles.bubble,\n {\n backgroundColor: bg,\n borderRadius: theme.radii.bubble,\n paddingHorizontal: theme.spacing.md,\n paddingVertical: theme.spacing.sm,\n },\n theme.shadows.sm,\n ]}\n >\n <TextInput\n value={value}\n onChangeText={setValue}\n multiline\n autoFocus\n style={{\n color: ink,\n fontFamily: theme.type.fontBody,\n fontSize: theme.type.bodySize,\n minHeight: 24,\n }}\n />\n <View style={styles.actions}>\n <Pressable onPress={onCancel} hitSlop={6}>\n <Text style={[styles.btn, { color: ink, opacity: 0.7 }]}>Cancel</Text>\n </Pressable>\n <Pressable onPress={submit} disabled={saving} hitSlop={6}>\n <Text style={[styles.btn, { color: ink, fontWeight: '700' }]}>\n {saving ? 'Saving…' : 'Save'}\n </Text>\n </Pressable>\n </View>\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n wrap: {\n marginBottom: 4,\n },\n bubble: {},\n actions: {\n flexDirection: 'row',\n justifyContent: 'flex-end',\n gap: 12,\n marginTop: 6,\n },\n btn: {\n fontSize: 13,\n },\n});\n","import { Modal, Pressable, StyleSheet, Text, View } from 'react-native';\n\nimport { PoolseIcon, type IconName } from './primitives/PoolseIcon.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nconst DEFAULT_REACTION_EMOJIS = ['👍', '❤️', '😂', '🎉', '🙏', '🔥'];\n\nexport interface MessageActionsProps {\n visible: boolean;\n onClose: () => void;\n isSelf: boolean;\n /**\n * Quick-reaction emoji row rendered at the top of the sheet. Tap\n * one to fire `onPickReaction(emoji)` and immediately close. When\n * omitted (or `onPickReaction` is omitted) the row is hidden.\n */\n emojis?: string[];\n onPickReaction?: (emoji: string) => void;\n onReply?: () => void;\n onReplyInThread?: () => void;\n onQuote?: () => void;\n onEdit?: () => void;\n onDelete?: () => void;\n onCopy?: () => void;\n}\n\n/**\n * Long-press action menu — modal bottom sheet. Renders a row of\n * quick-react emojis at the top (one tap reacts + closes) plus the\n * action items below. Matches WhatsApp / iMessage's \"long-press\n * shows everything inline\" pattern.\n */\nexport function MessageActions({\n visible,\n onClose,\n isSelf,\n emojis = DEFAULT_REACTION_EMOJIS,\n onPickReaction,\n onReply,\n onReplyInThread,\n onQuote,\n onEdit,\n onDelete,\n onCopy,\n}: MessageActionsProps) {\n const theme = usePoolseTheme();\n const items: Array<{ label: string; icon: IconName; onPress: () => void; danger?: boolean }> = [];\n if (onReply) items.push({ label: 'Reply', icon: 'reply', onPress: onReply });\n if (onQuote) items.push({ label: 'Quote reply', icon: 'reply', onPress: onQuote });\n if (onReplyInThread)\n items.push({ label: 'Reply in thread', icon: 'messages', onPress: onReplyInThread });\n if (onCopy) items.push({ label: 'Copy text', icon: 'copy', onPress: onCopy });\n if (isSelf && onEdit) items.push({ label: 'Edit', icon: 'edit', onPress: onEdit });\n if (isSelf && onDelete)\n items.push({ label: 'Delete', icon: 'trash', onPress: onDelete, danger: true });\n\n const showEmojiRow = !!onPickReaction && emojis.length > 0;\n\n return (\n <Modal visible={visible} transparent animationType=\"fade\" onRequestClose={onClose}>\n <Pressable style={styles.backdrop} onPress={onClose}>\n <View\n style={[\n styles.sheet,\n {\n backgroundColor: theme.colors.surface,\n borderTopLeftRadius: theme.radii.lg,\n borderTopRightRadius: theme.radii.lg,\n },\n theme.shadows.lg,\n ]}\n >\n {showEmojiRow ? (\n <View style={[styles.emojiRow, { borderBottomColor: theme.colors.border }]}>\n {emojis.map((emoji) => (\n <Pressable\n key={emoji}\n onPress={() => {\n onPickReaction(emoji);\n onClose();\n }}\n style={styles.emojiBtn}\n hitSlop={6}\n accessibilityLabel={`React with ${emoji}`}\n >\n <Text style={styles.emoji}>{emoji}</Text>\n </Pressable>\n ))}\n </View>\n ) : null}\n\n {items.map((item) => (\n <Pressable key={item.label} onPress={item.onPress} style={styles.item}>\n <PoolseIcon\n name={item.icon}\n size={18}\n color={item.danger ? theme.colors.error : theme.colors.ink2}\n />\n <Text\n style={[\n styles.itemText,\n {\n color: item.danger ? theme.colors.error : theme.colors.ink,\n fontFamily: theme.type.fontBody,\n },\n ]}\n >\n {item.label}\n </Text>\n </Pressable>\n ))}\n </View>\n </Pressable>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n backdrop: {\n flex: 1,\n backgroundColor: 'rgba(0,0,0,0.35)',\n justifyContent: 'flex-end',\n },\n sheet: {\n paddingTop: 8,\n paddingBottom: 24,\n },\n emojiRow: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-around',\n paddingHorizontal: 12,\n paddingVertical: 10,\n borderBottomWidth: StyleSheet.hairlineWidth,\n marginBottom: 6,\n },\n emojiBtn: {\n paddingHorizontal: 6,\n paddingVertical: 6,\n borderRadius: 999,\n alignItems: 'center',\n justifyContent: 'center',\n },\n emoji: {\n fontSize: 30,\n lineHeight: 36,\n },\n item: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 20,\n paddingVertical: 14,\n gap: 14,\n },\n itemText: {\n fontSize: 15,\n fontWeight: '500',\n },\n});\n","import type { Attachment } from '@poolse/sdk';\nimport { useAttachmentUrl } from '@poolse/react';\nimport { Image, Pressable, StyleSheet, Text, View } from 'react-native';\n\nimport { PoolseIcon } from './primitives/PoolseIcon.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport interface AttachmentPreviewProps {\n attachment: Attachment;\n /** Optional tap handler. For images defaults to opening the source URL. */\n onPress?: () => void;\n /** Render at this max width. Defaults to 280. */\n maxWidth?: number;\n}\n\nexport function AttachmentPreview({ attachment, onPress, maxWidth = 280 }: AttachmentPreviewProps) {\n const theme = usePoolseTheme();\n const isImage = (attachment.content_type ?? '').startsWith('image/');\n const { url } = useAttachmentUrl(attachment.id);\n\n if (isImage) {\n return (\n <Pressable onPress={onPress} disabled={!onPress}>\n {url ? (\n <Image\n source={{ uri: url }}\n style={{\n width: maxWidth,\n height: 200,\n borderRadius: theme.radii.md,\n backgroundColor: theme.colors.surface2,\n }}\n resizeMode=\"cover\"\n accessible\n accessibilityLabel={attachment.original_filename ?? 'attachment image'}\n />\n ) : (\n <View\n style={[\n styles.imagePlaceholder,\n {\n width: maxWidth,\n height: 200,\n borderRadius: theme.radii.md,\n backgroundColor: theme.colors.surface2,\n },\n ]}\n />\n )}\n </Pressable>\n );\n }\n\n return (\n <Pressable\n onPress={onPress}\n disabled={!onPress}\n style={[\n styles.fileCard,\n {\n backgroundColor: theme.colors.surface2,\n borderColor: theme.colors.border,\n borderRadius: theme.radii.md,\n },\n ]}\n >\n <PoolseIcon name=\"attachment\" size={18} color={theme.colors.ink2} />\n <View style={{ flex: 1, marginLeft: 8 }}>\n <Text\n style={[styles.fileName, { color: theme.colors.ink, fontFamily: theme.type.fontBody }]}\n numberOfLines={1}\n >\n {attachment.original_filename ?? 'file'}\n </Text>\n <Text style={[styles.fileSize, { color: theme.colors.ink3 }]}>\n {formatBytes(attachment.byte_size)}\n </Text>\n </View>\n </Pressable>\n );\n}\n\nfunction formatBytes(n: number): string {\n if (n < 1024) return `${n} B`;\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB`;\n if (n < 1024 * 1024 * 1024) return `${(n / 1024 / 1024).toFixed(1)} MB`;\n return `${(n / 1024 / 1024 / 1024).toFixed(1)} GB`;\n}\n\nconst styles = StyleSheet.create({\n imagePlaceholder: {},\n fileCard: {\n flexDirection: 'row',\n alignItems: 'center',\n padding: 8,\n borderWidth: StyleSheet.hairlineWidth,\n },\n fileName: {\n fontSize: 13,\n fontWeight: '500',\n },\n fileSize: {\n fontSize: 11,\n },\n});\n","import type { Attachment } from '@poolse/sdk';\nimport { useAttachmentUrl } from '@poolse/react';\nimport { useState } from 'react';\nimport { Dimensions, Image, Modal, Pressable, StyleSheet, Text, View } from 'react-native';\n\nimport { PoolseIcon } from './primitives/PoolseIcon.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport interface ImageMosaicProps {\n images: Attachment[];\n /**\n * Pixel ceiling on the mosaic's width. The mosaic itself fills its\n * parent (`width: '100%'`) and caps at this value, so it always\n * fits inside whatever the bubble's actual content area is at\n * render time — no more hardcoded 280px overflowing on small\n * screens or inside narrow bubbles.\n */\n maxWidth?: number;\n radius?: number;\n}\n\n/**\n * WhatsApp-style multi-image grid for inside the message bubble.\n * Uses flex-based widths (with `%` and `aspectRatio`) so the layout\n * scales to whatever the bubble's content area is — no fixed pixel\n * positioning that can overflow when the bubble is narrower than\n * the configured max.\n *\n * * n = 1 → single tile, 16:10 aspect.\n * * n = 2 → row of 2 squares.\n * * n = 3 → 16:9 hero on top + row of 2 squares below.\n * * n ≥ 4 → 2×2 grid with \"+N more\" overlay on the 4th tile.\n */\nexport function ImageMosaic({ images, maxWidth, radius }: ImageMosaicProps) {\n const theme = usePoolseTheme();\n const r = radius ?? theme.radii.md;\n const [viewerIndex, setViewerIndex] = useState<number | null>(null);\n\n if (images.length === 0) return null;\n\n const visible = images.slice(0, 4);\n const overflow = images.length > 4 ? images.length - 4 : 0;\n const n = visible.length as 1 | 2 | 3 | 4;\n\n return (\n <>\n <View\n style={[\n styles.root,\n {\n borderRadius: r,\n ...(maxWidth ? { maxWidth } : {}),\n },\n ]}\n >\n {n === 1 ? (\n <Tile\n attachment={visible[0]!}\n style={styles.tileFull}\n onPress={() => setViewerIndex(0)}\n overlay={null}\n />\n ) : null}\n\n {n === 2 ? (\n <View style={styles.rowEven}>\n <Tile\n attachment={visible[0]!}\n style={styles.tileHalfSquare}\n onPress={() => setViewerIndex(0)}\n overlay={null}\n />\n <Tile\n attachment={visible[1]!}\n style={styles.tileHalfSquare}\n onPress={() => setViewerIndex(1)}\n overlay={null}\n />\n </View>\n ) : null}\n\n {n === 3 ? (\n <>\n <Tile\n attachment={visible[0]!}\n style={styles.tileHero}\n onPress={() => setViewerIndex(0)}\n overlay={null}\n />\n <View style={[styles.rowEven, { marginTop: 2 }]}>\n <Tile\n attachment={visible[1]!}\n style={styles.tileHalfSquare}\n onPress={() => setViewerIndex(1)}\n overlay={null}\n />\n <Tile\n attachment={visible[2]!}\n style={styles.tileHalfSquare}\n onPress={() => setViewerIndex(2)}\n overlay={null}\n />\n </View>\n </>\n ) : null}\n\n {n === 4 ? (\n <>\n <View style={styles.rowEven}>\n <Tile\n attachment={visible[0]!}\n style={styles.tileHalfSquare}\n onPress={() => setViewerIndex(0)}\n overlay={null}\n />\n <Tile\n attachment={visible[1]!}\n style={styles.tileHalfSquare}\n onPress={() => setViewerIndex(1)}\n overlay={null}\n />\n </View>\n <View style={[styles.rowEven, { marginTop: 2 }]}>\n <Tile\n attachment={visible[2]!}\n style={styles.tileHalfSquare}\n onPress={() => setViewerIndex(2)}\n overlay={null}\n />\n <Tile\n attachment={visible[3]!}\n style={styles.tileHalfSquare}\n onPress={() => setViewerIndex(3)}\n overlay={overflow > 0 ? `+${overflow}` : null}\n />\n </View>\n </>\n ) : null}\n </View>\n\n <Modal\n visible={viewerIndex !== null}\n transparent\n animationType=\"fade\"\n onRequestClose={() => setViewerIndex(null)}\n >\n {viewerIndex !== null ? (\n <FullScreenViewer\n attachment={images[viewerIndex]!}\n onClose={() => setViewerIndex(null)}\n />\n ) : null}\n </Modal>\n </>\n );\n}\n\nfunction Tile({\n attachment,\n style,\n overlay,\n onPress,\n}: {\n attachment: Attachment;\n style: object;\n overlay: string | null;\n onPress: () => void;\n}) {\n const theme = usePoolseTheme();\n const { url } = useAttachmentUrl(attachment.id);\n return (\n <Pressable onPress={onPress} style={[styles.tileBase, style]}>\n {url ? (\n <Image\n source={{ uri: url }}\n style={[styles.tileImage, { backgroundColor: theme.colors.surface2 }]}\n resizeMode=\"cover\"\n accessible\n accessibilityLabel={attachment.original_filename ?? 'image'}\n />\n ) : (\n <View style={[styles.tileImage, { backgroundColor: theme.colors.surface2 }]} />\n )}\n {overlay ? (\n <View style={styles.overflow}>\n <Text style={styles.overflowText}>{overlay}</Text>\n </View>\n ) : null}\n </Pressable>\n );\n}\n\nfunction FullScreenViewer({\n attachment,\n onClose,\n}: {\n attachment: Attachment;\n onClose: () => void;\n}) {\n const { url } = useAttachmentUrl(attachment.id);\n const { width, height } = Dimensions.get('window');\n return (\n <Pressable style={styles.viewer} onPress={onClose}>\n {url ? (\n <Image\n source={{ uri: url }}\n style={{ width, height }}\n resizeMode=\"contain\"\n accessible\n accessibilityLabel={attachment.original_filename ?? 'image'}\n />\n ) : null}\n <Pressable\n onPress={onClose}\n hitSlop={12}\n style={styles.closeBtn}\n accessibilityLabel=\"Close viewer\"\n >\n <PoolseIcon name=\"close\" size={20} color=\"#ffffff\" />\n </Pressable>\n </Pressable>\n );\n}\n\nconst styles = StyleSheet.create({\n root: {\n width: '100%',\n overflow: 'hidden',\n marginBottom: 4,\n },\n rowEven: {\n flexDirection: 'row',\n gap: 2,\n },\n tileBase: {\n overflow: 'hidden',\n },\n // n=1: full bleed at the bubble's available width, 16:10 aspect.\n tileFull: {\n width: '100%',\n aspectRatio: 16 / 10,\n },\n // n=2 / n=4 (per row): two equal squares side-by-side.\n tileHalfSquare: {\n flex: 1,\n aspectRatio: 1,\n },\n // n=3 hero: full-bleed top tile, 16:9.\n tileHero: {\n width: '100%',\n aspectRatio: 16 / 9,\n },\n tileImage: {\n width: '100%',\n height: '100%',\n },\n overflow: {\n position: 'absolute',\n inset: 0,\n backgroundColor: 'rgba(0,0,0,0.55)',\n alignItems: 'center',\n justifyContent: 'center',\n },\n overflowText: {\n color: '#ffffff',\n fontWeight: '700',\n fontSize: 22,\n },\n viewer: {\n flex: 1,\n backgroundColor: '#000000',\n alignItems: 'center',\n justifyContent: 'center',\n },\n closeBtn: {\n position: 'absolute',\n top: 48,\n right: 16,\n padding: 8,\n backgroundColor: 'rgba(0,0,0,0.5)',\n borderRadius: 20,\n },\n});\n","import type { Message, QuotedMessagePreview, Uuid } from '@poolse/sdk';\nimport { useUser } from '@poolse/react';\nimport { useState, type ReactNode } from 'react';\nimport { Pressable, StyleSheet, Text, useWindowDimensions, View } from 'react-native';\n\nimport { AttachmentPreview } from './AttachmentPreview.js';\nimport { ImageMosaic } from './ImageMosaic.js';\nimport { PoolseIcon } from './primitives/PoolseIcon.js';\nimport { userColor } from './primitives/userColor.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport type BubbleGroupPosition = 'first' | 'middle' | 'last' | 'standalone';\n\nexport interface MessageBubbleProps {\n message: Message;\n /** Used to decide left/right alignment, color, and read-receipt visibility. */\n currentUserId: string | null;\n /** `'sent'` → single tick, `'read'` → double tick (theme.colors.brand). */\n readState?: 'sent' | 'read';\n /** Label resolver keyed by `external_id` — falls back to the externalId itself. */\n labelFor?: (externalId: string) => string;\n /** Quoted-card tap handler. Typically used to scroll the list to the original message. */\n onQuotedClick?: (quotedMessageId: Uuid) => void;\n /** Position in a same-sender cluster — drives tail-corner rendering. */\n groupPosition?: BubbleGroupPosition;\n /** Truncate at this many chars and show a \"Read more\" toggle. Defaults to 0 (off). */\n maxBodyLength?: number;\n /** Show a colored sender label above other-side bubbles. Only meaningful in group chats. */\n showSenderName?: boolean;\n /** Slot for an actions trigger — typically a chevron rendered by `<MessageRow>`. */\n actionsTrigger?: ReactNode;\n /** Render in-bubble attachments (images, file cards). Defaults to true. */\n showAttachments?: boolean;\n}\n\nexport function MessageBubble({\n message,\n currentUserId,\n readState,\n labelFor,\n onQuotedClick,\n groupPosition = 'standalone',\n maxBodyLength = 0,\n showSenderName = false,\n actionsTrigger,\n showAttachments = true,\n}: MessageBubbleProps) {\n const theme = usePoolseTheme();\n const { width: screenWidth } = useWindowDimensions();\n const isSelf = currentUserId !== null && message.sender_id === currentUserId;\n const [expanded, setExpanded] = useState(false);\n\n // Pixel-based bubble cap pinned to screen width, not to a\n // percentage of an ambiguously-sized parent. Was '88%' on the\n // wrap which resolves to 88% of the bubbleCol — and bubbleCol's\n // width changes with the row's padding, so bumping row padding\n // shrunk multi-line bubbles disproportionately. With a fixed\n // pixel maxWidth + alignSelf:flex-end, single-line and multi-line\n // both hit the same right edge regardless of nesting.\n const bubbleMaxWidth = Math.floor(screenWidth * 0.78);\n // Image / file preview width is bubble width minus the 28px\n // horizontal padding. Use flex '100%' style with a numeric ceiling\n // so the mosaic adapts to the actual rendered bubble.\n const contentMaxWidth = bubbleMaxWidth - 28;\n\n const sender = useUser(!isSelf ? message.sender_external_id : null);\n const senderFallbackName = message.sender_external_id ?? 'Unknown';\n const senderLabel =\n sender.profile?.displayName ??\n (message.sender_external_id\n ? (labelFor?.(message.sender_external_id) ?? senderFallbackName)\n : senderFallbackName);\n const senderTint = userColor(message.sender_external_id ?? message.sender_id ?? message.id);\n\n const tailCorner = groupPosition === 'last' || groupPosition === 'standalone';\n const bubbleColor = isSelf ? theme.colors.selfBubble : theme.colors.otherBubble;\n const textColor = isSelf ? theme.colors.selfBubbleText : theme.colors.otherBubbleText;\n\n const radii = {\n topLeft: theme.radii.bubble,\n topRight: theme.radii.bubble,\n bottomLeft: theme.radii.bubble,\n bottomRight: theme.radii.bubble,\n };\n if (tailCorner) {\n if (isSelf) radii.bottomRight = 4;\n else radii.bottomLeft = 4;\n }\n\n const body = message.body ?? '';\n const truncated =\n maxBodyLength > 0 && body.length > maxBodyLength && !expanded\n ? body.slice(0, maxBodyLength) + '…'\n : body;\n\n const time = formatTime(message.inserted_at);\n const isDeleted = !!message.deleted_at;\n const isEdited = !!message.edited_at && !isDeleted;\n\n const images = (message.attachments ?? []).filter((a) => isImageContentType(a.content_type));\n const files = (message.attachments ?? []).filter((a) => !isImageContentType(a.content_type));\n const renderAttachments = showAttachments && (images.length > 0 || files.length > 0);\n\n return (\n <View\n style={[\n styles.wrap,\n {\n alignSelf: isSelf ? 'flex-end' : 'flex-start',\n // Pixel maxWidth (not percentage) so single-line and\n // multi-line bubbles land at the same right edge — was\n // 88% of the bubbleCol which produced inconsistent right\n // padding when the row padding changed.\n maxWidth: bubbleMaxWidth,\n },\n ]}\n >\n <View\n style={[\n styles.bubble,\n {\n backgroundColor: bubbleColor,\n borderColor: isSelf ? 'transparent' : theme.colors.border,\n borderWidth: isSelf ? 0 : StyleSheet.hairlineWidth,\n borderTopLeftRadius: radii.topLeft,\n borderTopRightRadius: radii.topRight,\n borderBottomLeftRadius: radii.bottomLeft,\n borderBottomRightRadius: radii.bottomRight,\n // Slightly more breathing room — 14/10 reads tighter and\n // matches the iMessage / WhatsApp bubble density.\n paddingHorizontal: 14,\n paddingVertical: 10,\n // Floor the bubble at a width that always fits the meta row\n // (\"edited HH:MM ✓✓\" → ~110px). Without this, short bodies\n // like \"ok\" produce a bubble too narrow for the meta to lay\n // out, and `edited` or the time gets clipped.\n minWidth: isSelf && isEdited ? 130 : 90,\n },\n theme.shadows.sm,\n ]}\n >\n {showSenderName &&\n !isSelf &&\n (groupPosition === 'first' || groupPosition === 'standalone') ? (\n <Text style={[styles.senderName, { color: senderTint, fontFamily: theme.type.fontBody }]}>\n {senderLabel}\n </Text>\n ) : null}\n\n {message.quoted_message ? (\n <QuotedCard\n quoted={message.quoted_message}\n isSelf={isSelf}\n {...(labelFor ? { labelFor } : {})}\n {...(onQuotedClick ? { onPress: () => onQuotedClick(message.quoted_message!.id) } : {})}\n />\n ) : null}\n\n {renderAttachments && images.length > 0 ? (\n <ImageMosaic images={images} maxWidth={contentMaxWidth} />\n ) : null}\n\n {renderAttachments && files.length > 0 ? (\n <View style={{ gap: theme.spacing.xs, marginBottom: theme.spacing.xs }}>\n {files.map((att) => (\n <AttachmentPreview key={att.id} attachment={att} maxWidth={contentMaxWidth} />\n ))}\n </View>\n ) : null}\n\n {body.length > 0 ? (\n <Text\n style={[\n styles.body,\n {\n color: isDeleted ? theme.colors.ink3 : textColor,\n fontFamily: theme.type.fontBody,\n fontSize: theme.type.bodySize,\n lineHeight: theme.type.lineHeight,\n fontStyle: isDeleted ? 'italic' : 'normal',\n },\n ]}\n >\n {isDeleted ? 'Message deleted' : truncated}\n </Text>\n ) : null}\n\n {maxBodyLength > 0 && body.length > maxBodyLength ? (\n <Pressable onPress={() => setExpanded((e) => !e)}>\n <Text\n style={[\n styles.readMore,\n { color: isSelf ? theme.colors.onBrand : theme.colors.brand },\n ]}\n >\n {expanded ? 'Show less' : 'Read more'}\n </Text>\n </Pressable>\n ) : null}\n\n <View style={styles.metaRow}>\n {isEdited ? (\n <Text\n style={[\n styles.editedTag,\n {\n color: isSelf ? theme.colors.onBrand : theme.colors.ink3,\n opacity: 0.7,\n },\n ]}\n >\n edited\n </Text>\n ) : null}\n <Text\n style={[\n styles.meta,\n {\n color: isSelf ? theme.colors.onBrand : theme.colors.ink3,\n opacity: isSelf ? 0.85 : 1,\n },\n ]}\n >\n {time}\n </Text>\n {isSelf && readState ? (\n <View style={styles.readTick}>\n <PoolseIcon\n name={readState === 'read' ? 'check-double' : 'check'}\n size={13}\n color={theme.colors.onBrand}\n />\n </View>\n ) : null}\n </View>\n\n {actionsTrigger ? <View style={styles.actionsSlot}>{actionsTrigger}</View> : null}\n </View>\n </View>\n );\n}\n\nfunction QuotedCard({\n quoted,\n isSelf,\n labelFor,\n onPress,\n}: {\n quoted: QuotedMessagePreview;\n isSelf: boolean;\n labelFor?: (externalId: string) => string;\n onPress?: () => void;\n}) {\n const theme = usePoolseTheme();\n // Priority: explicit prop > SDK userResolver > externalId fallback.\n const resolved = useUser(quoted.sender_external_id);\n const senderName = quoted.sender_external_id\n ? (labelFor?.(quoted.sender_external_id) ??\n resolved.profile?.displayName ??\n quoted.sender_external_id)\n : 'Unknown';\n const bg = isSelf ? 'rgba(255,255,255,0.18)' : theme.colors.surface2;\n const accent = isSelf ? theme.colors.onBrand : theme.colors.brand;\n const txt = isSelf ? theme.colors.onBrand : theme.colors.ink;\n return (\n <Pressable\n onPress={onPress}\n disabled={!onPress}\n style={[\n styles.quoted,\n {\n backgroundColor: bg,\n borderLeftColor: accent,\n },\n ]}\n >\n <Text style={[styles.quotedSender, { color: accent }]}>{senderName}</Text>\n <Text style={[styles.quotedBody, { color: txt }]} numberOfLines={2}>\n {quoted.body ?? '…'}\n </Text>\n </Pressable>\n );\n}\n\nfunction isImageContentType(ct: string | null | undefined): boolean {\n if (!ct) return false;\n return ct.startsWith('image/');\n}\n\n// HH:MM if same calendar day, \"Yesterday HH:MM\" if yesterday, \"Mon DD\"\n// if older than a week, otherwise weekday abbreviation. Matches the\n// WhatsApp / iMessage convention — short enough to fit in the meta\n// row, long enough to be useful at a glance.\nfunction formatTime(iso: string): string {\n try {\n const d = new Date(iso);\n const now = new Date();\n const sameDay = isSameDay(d, now);\n const time = d.toLocaleTimeString([], { hour: 'numeric', minute: '2-digit' });\n if (sameDay) return time;\n\n const yesterday = new Date(now);\n yesterday.setDate(now.getDate() - 1);\n if (isSameDay(d, yesterday)) return `Yesterday ${time}`;\n\n const diffMs = now.getTime() - d.getTime();\n const diffDays = Math.floor(diffMs / 86_400_000);\n if (diffDays < 7) {\n return `${d.toLocaleDateString([], { weekday: 'short' })} ${time}`;\n }\n return d.toLocaleDateString([], { month: 'short', day: 'numeric' });\n } catch {\n return '';\n }\n}\n\nfunction isSameDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\nconst styles = StyleSheet.create({\n wrap: {\n marginBottom: 2,\n },\n bubble: {\n position: 'relative',\n },\n senderName: {\n fontSize: 12,\n fontWeight: '600',\n marginBottom: 2,\n },\n body: {\n flexShrink: 1,\n },\n readMore: {\n fontSize: 12,\n fontWeight: '600',\n marginTop: 4,\n },\n metaRow: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'flex-end',\n marginTop: 6,\n gap: 5,\n flexShrink: 0,\n },\n meta: {\n fontSize: 11,\n fontVariant: ['tabular-nums'],\n includeFontPadding: false,\n },\n editedTag: {\n fontSize: 10,\n fontStyle: 'italic',\n letterSpacing: 0.1,\n },\n readTick: {\n marginLeft: 2,\n marginTop: 1,\n },\n actionsSlot: {\n position: 'absolute',\n top: 4,\n right: 4,\n },\n quoted: {\n borderLeftWidth: 3,\n paddingLeft: 8,\n paddingVertical: 4,\n paddingRight: 6,\n marginBottom: 6,\n borderRadius: 4,\n },\n quotedSender: {\n fontSize: 12,\n fontWeight: '600',\n marginBottom: 2,\n },\n quotedBody: {\n fontSize: 12,\n opacity: 0.85,\n },\n});\n","import type { Uuid } from '@poolse/sdk';\nimport { useReactions } from '@poolse/react';\nimport { Modal, Pressable, StyleSheet, Text, View } from 'react-native';\n\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nconst DEFAULT_EMOJIS = ['👍', '❤️', '😂', '🎉', '🙏', '🔥'];\n\nexport interface ReactionStripProps {\n messageId: Uuid;\n conversationId: Uuid;\n meId: string | null;\n /** Seed map from a known message (e.g. `useMessages`). */\n initialReactions?: Record<string, Uuid[]>;\n}\n\nexport function ReactionStrip({\n messageId,\n conversationId,\n meId,\n initialReactions,\n}: ReactionStripProps) {\n const theme = usePoolseTheme();\n const { reactions, addReaction, removeReaction } = useReactions(messageId, {\n conversationId,\n currentUserId: meId,\n ...(initialReactions ? { initialReactions } : {}),\n });\n const entries = Object.entries(reactions);\n if (entries.length === 0) return null;\n\n return (\n <View style={styles.strip}>\n {entries.map(([emoji, userIds]) => {\n const userArr = Array.isArray(userIds) ? userIds : [];\n const meReacted = meId !== null && userArr.includes(meId);\n return (\n <Pressable\n key={emoji}\n onPress={() => (meReacted ? removeReaction(emoji) : addReaction(emoji))}\n style={[\n styles.chip,\n {\n backgroundColor: meReacted ? theme.colors.brandSoft : theme.colors.surface2,\n borderColor: meReacted ? theme.colors.brand : theme.colors.border,\n },\n ]}\n >\n <Text style={styles.emoji}>{emoji}</Text>\n <Text style={[styles.count, { color: theme.colors.ink2 }]}>{userArr.length}</Text>\n </Pressable>\n );\n })}\n </View>\n );\n}\n\nexport interface ReactionPickerProps {\n visible: boolean;\n onClose: () => void;\n onPick: (emoji: string) => void;\n /** Override the default 6-emoji set. */\n emojis?: string[];\n}\n\nexport function ReactionPicker({\n visible,\n onClose,\n onPick,\n emojis = DEFAULT_EMOJIS,\n}: ReactionPickerProps) {\n const theme = usePoolseTheme();\n return (\n <Modal visible={visible} transparent animationType=\"fade\" onRequestClose={onClose}>\n <Pressable style={styles.backdrop} onPress={onClose}>\n <View\n style={[\n styles.sheet,\n {\n backgroundColor: theme.colors.surface,\n borderRadius: theme.radii.lg,\n },\n theme.shadows.lg,\n ]}\n >\n {emojis.map((emoji) => (\n <Pressable\n key={emoji}\n style={styles.emojiBtn}\n onPress={() => {\n onPick(emoji);\n onClose();\n }}\n >\n <Text style={styles.bigEmoji}>{emoji}</Text>\n </Pressable>\n ))}\n </View>\n </Pressable>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n strip: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: 4,\n marginTop: 2,\n },\n chip: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 9,\n paddingVertical: 4,\n borderRadius: 14,\n borderWidth: 1,\n gap: 5,\n minHeight: 26,\n // Subtle elevation so chips lift off the surface\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 1 },\n shadowOpacity: 0.06,\n shadowRadius: 2,\n elevation: 1,\n },\n emoji: {\n fontSize: 15,\n lineHeight: 18,\n },\n count: {\n fontSize: 12,\n fontWeight: '600',\n fontVariant: ['tabular-nums'],\n },\n backdrop: {\n flex: 1,\n backgroundColor: 'rgba(0,0,0,0.4)',\n justifyContent: 'center',\n alignItems: 'center',\n paddingHorizontal: 24,\n },\n sheet: {\n flexDirection: 'row',\n paddingHorizontal: 12,\n paddingVertical: 12,\n gap: 4,\n alignItems: 'center',\n },\n emojiBtn: {\n paddingHorizontal: 8,\n paddingVertical: 6,\n borderRadius: 999,\n alignItems: 'center',\n justifyContent: 'center',\n },\n bigEmoji: {\n fontSize: 32,\n lineHeight: 38,\n },\n});\n","import { Animated, PanResponder, Pressable, StyleSheet, Text, View } from 'react-native';\nimport type { Message, Uuid } from '@poolse/sdk';\nimport { useMemo, useRef, useState } from 'react';\n\nimport { Avatar } from './primitives/Avatar.js';\nimport { EditableMessageBubble } from './EditableMessageBubble.js';\nimport { MessageActions } from './MessageActions.js';\nimport { MessageBubble, type BubbleGroupPosition } from './MessageBubble.js';\nimport { PoolseIcon } from './primitives/PoolseIcon.js';\nimport { ReactionStrip } from './Reactions.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\nimport { useReactions, useUser } from '@poolse/react';\n\n// Swipe-to-reply triggers at this much horizontal pull. iOS / WhatsApp\n// use 50–60px; the lower bound feels lighter for one-handed thumb use.\nconst SWIPE_REPLY_THRESHOLD = 50;\n\nexport interface MessageRowProps {\n msg: Message;\n meId: string | null;\n\n // Feature toggles — same set as ConversationView's, but per-row.\n reactions?: boolean;\n attachments?: boolean;\n actions?: boolean;\n /** Pass false in ThreadView since nested threads aren't a thing in v1. */\n threads?: boolean;\n /** WhatsApp-style quote-reply. Defaults true on ConversationView. */\n quotations?: boolean;\n\n readState?: 'sent' | 'read';\n\n editing?: boolean;\n onStartEdit?: () => void;\n onCancelEdit?: () => void;\n onSaveEdit?: (body: string) => Promise<unknown> | void;\n onDelete?: () => void;\n onOpenThread?: () => void;\n onQuote?: () => void;\n labelFor?: (externalId: string) => string;\n onQuotedClick?: (quotedMessageId: Uuid) => void;\n groupPosition?: BubbleGroupPosition;\n maxBodyLength?: number;\n /** Show a colored sender label above other-side bubbles. */\n showSenderName?: boolean;\n /** Render an avatar to the LEFT of other-side bubbles. */\n showAvatar?: boolean;\n /** Avatar resolver — same signature as `<MemberList avatarFor>`. */\n avatarFor?: (externalId: string) => string | null;\n}\n\nexport function MessageRow({\n msg,\n meId,\n reactions = true,\n attachments = true,\n actions = true,\n threads = true,\n quotations = true,\n readState,\n editing = false,\n onStartEdit,\n onCancelEdit,\n onSaveEdit,\n onDelete,\n onOpenThread,\n onQuote,\n labelFor,\n onQuotedClick,\n groupPosition = 'standalone',\n maxBodyLength = 0,\n showSenderName = false,\n showAvatar = false,\n avatarFor,\n}: MessageRowProps) {\n const theme = usePoolseTheme();\n const isSelf = meId !== null && msg.sender_id === meId;\n const [actionsOpen, setActionsOpen] = useState(false);\n\n // Per-row useReactions subscription so the long-press → React picker\n // and the inline ReactionStrip share the same realtime state. Adds\n // one realtime listener per visible row, which is fine — they're\n // server-filtered by messageId and the FlatList only mounts rows in\n // view. Initial seed comes from msg.reactions so the strip renders\n // immediately without waiting for the first echo.\n const reactionsApi = useReactions(msg.id, {\n conversationId: msg.conversation_id,\n currentUserId: meId,\n ...(msg.reactions ? { initialReactions: msg.reactions } : {}),\n });\n\n // Swipe-to-reply state. The bubble's translateX is driven by a pan\n // gesture; when the user releases past SWIPE_REPLY_THRESHOLD we fire\n // onQuote (which the parent wires to setReplyingTo on the composer).\n // Animation runs on the JS thread because we need to read the value\n // synchronously on release — native driver would prevent that.\n const translateX = useRef(new Animated.Value(0)).current;\n const swipeEnabled = quotations && !!onQuote && !editing;\n\n const panResponder = useMemo(\n () =>\n PanResponder.create({\n // Tap / long-press still go to the inner Pressable.\n onStartShouldSetPanResponder: () => false,\n onStartShouldSetPanResponderCapture: () => false,\n // Capture-phase claim: we intercept the gesture BEFORE the\n // child Pressable as soon as the move shows clear horizontal\n // intent. Without capture-phase, the Pressable's touch handling\n // wins first and the pan never starts (this is why self-bubble\n // left swipes felt totally dead — the Pressable was attached\n // to a touch that started with the user's finger over the\n // bubble center, and we never got a turn).\n onMoveShouldSetPanResponder: () => false,\n onMoveShouldSetPanResponderCapture: (_, g) => {\n if (!swipeEnabled) return false;\n // 4px is plenty to disambiguate from an accidental jitter\n // during a tap. `dx > dy` (not `dx > dy * 2`) so a slightly\n // diagonal pull still counts as horizontal — the user isn't\n // going to hold their finger to a perfect axis.\n return Math.abs(g.dx) > 4 && Math.abs(g.dx) > Math.abs(g.dy);\n },\n // Don't surrender the gesture mid-swipe (e.g. parent FlatList\n // asking for it back) — once we're translating the bubble we\n // hold on until release.\n onPanResponderTerminationRequest: () => false,\n // 1:1 finger-follow up to the threshold, then square-root\n // damping past it so the bubble never slides off-screen.\n // Matches iMessage / WhatsApp — feels weightless during the\n // committed range and stiffens once you've already triggered.\n onPanResponderMove: (_, g) => {\n const dx = isSelf ? Math.min(0, g.dx) : Math.max(0, g.dx);\n const abs = Math.abs(dx);\n let translated: number;\n if (abs <= SWIPE_REPLY_THRESHOLD) {\n translated = dx;\n } else {\n const excess = abs - SWIPE_REPLY_THRESHOLD;\n const dampened = SWIPE_REPLY_THRESHOLD + Math.sqrt(excess * 6);\n translated = dx < 0 ? -dampened : dampened;\n }\n translateX.setValue(translated);\n },\n onPanResponderRelease: (_, g) => {\n const past = Math.abs(g.dx) >= SWIPE_REPLY_THRESHOLD;\n if (past && onQuote) onQuote();\n Animated.spring(translateX, {\n toValue: 0,\n useNativeDriver: false,\n speed: 28,\n bounciness: 4,\n }).start();\n },\n onPanResponderTerminate: () => {\n Animated.spring(translateX, {\n toValue: 0,\n useNativeDriver: false,\n speed: 28,\n bounciness: 4,\n }).start();\n },\n }),\n [swipeEnabled, isSelf, onQuote, translateX],\n );\n\n // Reply icon fades + scales in as the bubble drags past ~half the\n // threshold. Sits on the SAME side the swipe is coming FROM (so\n // it's revealed behind the bubble as the bubble slides away).\n const replyIconOpacity = translateX.interpolate({\n inputRange: isSelf\n ? [-SWIPE_REPLY_THRESHOLD, -SWIPE_REPLY_THRESHOLD / 2, 0]\n : [0, SWIPE_REPLY_THRESHOLD / 2, SWIPE_REPLY_THRESHOLD],\n outputRange: isSelf ? [1, 0.3, 0] : [0, 0.3, 1],\n extrapolate: 'clamp',\n });\n const replyIconScale = translateX.interpolate({\n inputRange: isSelf ? [-SWIPE_REPLY_THRESHOLD, 0] : [0, SWIPE_REPLY_THRESHOLD],\n outputRange: isSelf ? [1, 0.5] : [0.5, 1],\n extrapolate: 'clamp',\n });\n\n const showAvatarSlot = showAvatar && !isSelf;\n const showAvatarRender =\n showAvatarSlot && (groupPosition === 'last' || groupPosition === 'standalone');\n // Resolve avatar / label with the same priority as MessageBubble /\n // ChatHeader: explicit prop > SDK userResolver > externalId fallback.\n // Without the useUser fallback, omitting `avatarFor` / `labelFor` on\n // <ConversationView> bypassed the resolver at the row level even\n // when `PoolseConfig.userResolver` was configured.\n const rowSender = useUser(showAvatarSlot ? msg.sender_external_id : null);\n const avatarUrl = msg.sender_external_id\n ? (avatarFor?.(msg.sender_external_id) ?? rowSender.profile?.avatarUrl ?? null)\n : null;\n const senderLabel = msg.sender_external_id\n ? (labelFor?.(msg.sender_external_id) ??\n rowSender.profile?.displayName ??\n msg.sender_external_id)\n : null;\n\n return (\n <View style={[styles.row, { alignSelf: isSelf ? 'flex-end' : 'flex-start' }]}>\n {showAvatarSlot ? (\n <View style={styles.avatarSlot}>\n {showAvatarRender ? (\n <Avatar\n src={avatarUrl ?? null}\n name={senderLabel}\n seed={msg.sender_external_id ?? null}\n size=\"sm\"\n />\n ) : null}\n </View>\n ) : null}\n\n <View style={styles.bubbleCol}>\n {swipeEnabled ? (\n <Animated.View\n pointerEvents=\"none\"\n style={[\n styles.replyHint,\n isSelf ? styles.replyHintRight : styles.replyHintLeft,\n {\n opacity: replyIconOpacity,\n transform: [{ scale: replyIconScale }],\n backgroundColor: theme.colors.surface2,\n },\n ]}\n >\n <PoolseIcon name=\"reply\" size={16} color={theme.colors.brand} />\n </Animated.View>\n ) : null}\n\n <Animated.View\n {...(swipeEnabled ? panResponder.panHandlers : {})}\n style={{ transform: [{ translateX }] }}\n >\n <Pressable\n onLongPress={() => {\n if (!actions) return;\n setActionsOpen(true);\n }}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Message actions\"\n >\n {editing ? (\n <EditableMessageBubble\n message={msg}\n currentUserId={meId}\n onCancel={onCancelEdit ?? (() => undefined)}\n onSave={onSaveEdit ?? (() => undefined)}\n />\n ) : (\n <MessageBubble\n message={msg}\n currentUserId={meId}\n {...(readState ? { readState } : {})}\n {...(labelFor ? { labelFor } : {})}\n {...(onQuotedClick ? { onQuotedClick } : {})}\n groupPosition={groupPosition}\n maxBodyLength={maxBodyLength}\n showSenderName={showSenderName}\n showAttachments={attachments}\n actionsTrigger={\n actions ? (\n <Pressable onPress={() => setActionsOpen(true)} hitSlop={8}>\n <PoolseIcon\n name=\"chevron-down\"\n size={14}\n color={isSelf ? theme.colors.onBrand : theme.colors.ink3}\n />\n </Pressable>\n ) : null\n }\n />\n )}\n </Pressable>\n </Animated.View>\n\n {threads && (msg.reply_count ?? 0) > 0 && onOpenThread ? (\n <Pressable onPress={onOpenThread} style={styles.threadPill}>\n <Text style={[styles.threadPillText, { color: theme.colors.brand }]}>\n 💬 {msg.reply_count} {msg.reply_count === 1 ? 'reply' : 'replies'}\n </Text>\n </Pressable>\n ) : null}\n\n {reactions ? (\n <View style={[styles.reactionsRow, { alignSelf: isSelf ? 'flex-end' : 'flex-start' }]}>\n <ReactionStrip\n messageId={msg.id}\n conversationId={msg.conversation_id}\n meId={meId}\n {...(msg.reactions ? { initialReactions: msg.reactions } : {})}\n />\n </View>\n ) : null}\n </View>\n\n {actions && actionsOpen ? (\n <MessageActions\n visible={actionsOpen}\n onClose={() => setActionsOpen(false)}\n isSelf={isSelf}\n {...(reactions\n ? {\n // Inline quick-react row at the top of the sheet —\n // one tap = react + close, no second modal needed.\n onPickReaction: (emoji: string) => {\n void reactionsApi.addReaction(emoji);\n },\n }\n : {})}\n {...(onStartEdit\n ? {\n onEdit: () => {\n setActionsOpen(false);\n onStartEdit();\n },\n }\n : {})}\n {...(onDelete\n ? {\n onDelete: () => {\n setActionsOpen(false);\n onDelete();\n },\n }\n : {})}\n {...(onOpenThread\n ? {\n onReplyInThread: () => {\n setActionsOpen(false);\n onOpenThread();\n },\n }\n : {})}\n {...(quotations && onQuote\n ? {\n onQuote: () => {\n setActionsOpen(false);\n onQuote();\n },\n }\n : {})}\n />\n ) : null}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n row: {\n flexDirection: 'row',\n alignItems: 'flex-end',\n // Tighter vertical rhythm — was 2px each side (4px between rows)\n // plus the bubble's 4px marginBottom = 8px. Now 1+1+2 = 4px,\n // closer to iMessage / WhatsApp density.\n marginVertical: 1,\n // 10px on each side — tight enough to use the available width\n // for content, loose enough to keep bubbles off the screen edge\n // on every device.\n paddingHorizontal: 10,\n maxWidth: '95%',\n },\n avatarSlot: {\n width: 36,\n marginRight: 6,\n },\n bubbleCol: {\n flexShrink: 1,\n position: 'relative',\n },\n replyHint: {\n position: 'absolute',\n top: '50%',\n marginTop: -16,\n width: 32,\n height: 32,\n borderRadius: 16,\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: -1,\n },\n replyHintLeft: {\n left: -44,\n },\n replyHintRight: {\n right: -44,\n },\n threadPill: {\n alignSelf: 'flex-start',\n marginTop: 2,\n paddingHorizontal: 8,\n paddingVertical: 3,\n },\n threadPillText: {\n fontSize: 11,\n fontWeight: '600',\n },\n reactionsRow: {\n marginTop: 2,\n },\n});\n","import type { Message, Uuid } from '@poolse/sdk';\nimport { useMe, useThread } from '@poolse/react';\nimport { useCallback, useMemo, useState, type ReactElement } from 'react';\nimport {\n Animated,\n KeyboardAvoidingView,\n Modal,\n Platform,\n Pressable,\n StyleSheet,\n Text,\n useWindowDimensions,\n View,\n} from 'react-native';\n\nimport { AttachmentPicker } from './AttachmentPicker.js';\nimport { MessageComposer } from './MessageComposer.js';\nimport { MessageList } from './MessageList.js';\nimport { MessageRow } from './MessageRow.js';\nimport { PoolseIcon } from './primitives/PoolseIcon.js';\nimport { UploadProvider } from './internal/uploadContext.js';\nimport { useDismissableSheet } from './internal/useDismissableSheet.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport interface ThreadViewProps {\n visible: boolean;\n onClose: () => void;\n conversationId: Uuid;\n rootMessage: Message;\n labelFor?: (externalId: string) => string;\n avatarFor?: (externalId: string) => string | null;\n}\n\n// Sheet covers the bottom 88% of the screen. The remaining 12% is the\n// pull-down gutter (also the keyboardVerticalOffset for iOS).\nconst SHEET_HEIGHT_FRACTION = 0.88;\n\n/**\n * Bottom-sheet modal for thread replies. Pull the drag handle / header\n * down to dismiss; tap the backdrop or close button too. The composer\n * inside the sheet supports attachments (paperclip → picker, shared\n * upload queue) and the reply rows support reactions, swipe-to-reply,\n * long-press actions, edit, delete — same surface as ConversationView.\n *\n * Keyboard handling: inside a Modal the OS doesn't auto-resize the\n * sheet's children, so the composer needs its own KeyboardAvoidingView\n * with `keyboardVerticalOffset` set to the distance between the screen\n * top and the sheet top (the gutter above the sheet).\n */\nexport function ThreadView({\n visible,\n onClose,\n conversationId,\n rootMessage,\n labelFor,\n avatarFor,\n}: ThreadViewProps) {\n return (\n <Modal\n visible={visible}\n transparent\n animationType=\"slide\"\n onRequestClose={onClose}\n statusBarTranslucent\n >\n {/* Each open of the thread gets its own UploadProvider so the\n composer's queue is isolated from the parent ConversationView's\n composer queue. */}\n <UploadProvider>\n <ThreadSheet\n onClose={onClose}\n conversationId={conversationId}\n rootMessage={rootMessage}\n {...(labelFor ? { labelFor } : {})}\n {...(avatarFor ? { avatarFor } : {})}\n />\n </UploadProvider>\n </Modal>\n );\n}\n\nfunction ThreadSheet({\n onClose,\n conversationId,\n rootMessage,\n labelFor,\n avatarFor,\n}: {\n onClose: () => void;\n conversationId: Uuid;\n rootMessage: Message;\n labelFor?: (externalId: string) => string;\n avatarFor?: (externalId: string) => string | null;\n}) {\n const theme = usePoolseTheme();\n const { me } = useMe();\n const meId = me?.id ?? null;\n const {\n replies,\n sendReply,\n edit,\n delete: deleteReply,\n loadMore,\n hasMore,\n } = useThread(conversationId, rootMessage.id);\n const { height: screenHeight } = useWindowDimensions();\n const sheetHeight = Math.round(screenHeight * SHEET_HEIGHT_FRACTION);\n const gutter = screenHeight - sheetHeight;\n const { translateY, panHandlers } = useDismissableSheet({ onClose, sheetHeight });\n\n const [pickerOpen, setPickerOpen] = useState(false);\n const [editingId, setEditingId] = useState<string | null>(null);\n\n const renderReply = useCallback(\n (msg: Message): ReactElement => (\n <MessageRow\n msg={msg}\n meId={meId}\n // Reactions + actions on by default; nested threads off (you\n // can't thread inside a thread in v1).\n reactions\n attachments\n actions\n threads={false}\n // Quote-to-reply doesn't make sense inside a single-root thread.\n quotations={false}\n editing={editingId === msg.id}\n onStartEdit={() => setEditingId(msg.id)}\n onCancelEdit={() => setEditingId(null)}\n onSaveEdit={async (body) => {\n await edit(msg.id, body);\n setEditingId(null);\n }}\n onDelete={() => {\n void deleteReply(msg.id);\n }}\n {...(labelFor ? { labelFor } : {})}\n {...(avatarFor ? { avatarFor } : {})}\n />\n ),\n [meId, editingId, edit, deleteReply, labelFor, avatarFor],\n );\n\n const rootRow = useMemo(\n () => (\n <MessageRow\n msg={rootMessage}\n meId={meId}\n reactions\n attachments\n actions={false}\n threads={false}\n quotations={false}\n {...(labelFor ? { labelFor } : {})}\n {...(avatarFor ? { avatarFor } : {})}\n />\n ),\n [rootMessage, meId, labelFor, avatarFor],\n );\n\n return (\n <View style={styles.modalRoot}>\n <Pressable style={styles.backdrop} onPress={onClose} accessibilityLabel=\"Close thread\" />\n\n <Animated.View\n style={[\n styles.sheet,\n {\n height: sheetHeight,\n backgroundColor: theme.colors.paper,\n borderTopLeftRadius: theme.radii.xl,\n borderTopRightRadius: theme.radii.xl,\n transform: [{ translateY }],\n },\n theme.shadows.lg,\n ]}\n >\n {/* Wrap the header + drag pill in the pan handler so users can\n pull from a comfortable 60-pt-tall strip — the bare 16-pt\n pill on its own was nearly invisible to fingers. */}\n <View {...panHandlers}>\n <View style={styles.dragHandle}>\n <View style={[styles.dragPill, { backgroundColor: theme.colors.ink3 }]} />\n </View>\n\n <View style={[styles.header, { borderBottomColor: theme.colors.border }]}>\n <Pressable\n onPress={onClose}\n hitSlop={16}\n style={[styles.closeBtn, { backgroundColor: theme.colors.surface2 }]}\n accessibilityLabel=\"Close thread\"\n >\n <PoolseIcon name=\"close\" size={18} color={theme.colors.ink} />\n </Pressable>\n <Text\n style={[\n styles.title,\n { color: theme.colors.ink, fontFamily: theme.type.fontDisplay },\n ]}\n >\n Thread\n </Text>\n </View>\n </View>\n\n {/* KAV scope: just the scrolling area + composer. Keyboard pushes\n the composer up by the keyboard height minus the gutter\n (since the gutter is already \"free\" space above the sheet\n top). On Android we use `height` behavior — works inside a\n Modal because the modal window itself responds to adjustResize. */}\n <KeyboardAvoidingView\n style={styles.kavBody}\n behavior={Platform.OS === 'ios' ? 'padding' : 'height'}\n keyboardVerticalOffset={Platform.OS === 'ios' ? gutter : 0}\n >\n <View style={[styles.rootPreview, { backgroundColor: theme.colors.surface2 }]}>\n {rootRow}\n </View>\n\n <View style={styles.listWrap}>\n <MessageList\n messages={replies}\n hasMore={hasMore}\n onLoadMore={loadMore}\n renderItem={renderReply}\n />\n </View>\n\n <MessageComposer\n onSend={async (body, opts) => {\n await sendReply({ body, ...opts });\n }}\n placeholder=\"Reply to thread…\"\n attachments\n onAttachPress={() => setPickerOpen(true)}\n />\n </KeyboardAvoidingView>\n\n <AttachmentPicker visible={pickerOpen} onClose={() => setPickerOpen(false)} />\n </Animated.View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n modalRoot: {\n flex: 1,\n justifyContent: 'flex-end',\n },\n backdrop: {\n ...StyleSheet.absoluteFillObject,\n backgroundColor: 'rgba(0,0,0,0.4)',\n },\n sheet: {\n overflow: 'hidden',\n },\n dragHandle: {\n alignItems: 'center',\n paddingTop: 8,\n paddingBottom: 4,\n },\n dragPill: {\n width: 36,\n height: 4,\n borderRadius: 2,\n opacity: 0.4,\n },\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 12,\n paddingTop: 6,\n paddingBottom: 10,\n borderBottomWidth: StyleSheet.hairlineWidth,\n gap: 10,\n },\n closeBtn: {\n width: 32,\n height: 32,\n borderRadius: 16,\n alignItems: 'center',\n justifyContent: 'center',\n },\n title: {\n fontSize: 16,\n fontWeight: '600',\n },\n rootPreview: {\n paddingVertical: 8,\n paddingHorizontal: 8,\n },\n kavBody: {\n flex: 1,\n },\n listWrap: {\n flex: 1,\n },\n});\n","import { Text } from 'react-native';\nimport { useUser } from '@poolse/react';\n\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport interface UserNameProps {\n /** The user's external_id. Pass null to render the fallback. */\n externalId: string | null | undefined;\n /** Optional fallback when the resolver returns nothing. Defaults to the externalId itself. */\n fallback?: string;\n /** Caller-supplied label override; if it returns a string, it wins. */\n labelFor?: (externalId: string) => string;\n}\n\n/**\n * Display name for a user, looked up via the SDK's `userResolver`\n * with caller-overridable + fallback fallbacks. Renders a `<Text>`.\n */\nexport function UserName({ externalId, fallback, labelFor }: UserNameProps) {\n const theme = usePoolseTheme();\n const name = useDisplayName(externalId, labelFor) ?? fallback ?? externalId ?? '';\n return <Text style={{ color: theme.colors.ink, fontFamily: theme.type.fontBody }}>{name}</Text>;\n}\n\n/**\n * Resolves a user's display name via the 3-tier chain:\n * 1. `labelFor(externalId)` — caller-supplied override\n * 2. SDK `userResolver` (memoized via `useUser`)\n * 3. The externalId itself (so something always renders)\n */\nexport function useDisplayName(\n externalId: string | null | undefined,\n labelFor?: (externalId: string) => string,\n): string {\n const resolved = useUser(externalId ?? null);\n if (!externalId) return '';\n if (labelFor) {\n const override = labelFor(externalId);\n if (override) return override;\n }\n return resolved.profile?.displayName ?? externalId;\n}\n","import { useEffect, useRef } from 'react';\nimport { Animated, StyleSheet, Text, View, Easing } from 'react-native';\n\nimport { useDisplayName } from './UserName.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport interface TypingIndicatorProps {\n /** Set of `external_id`s currently typing — what `useTyping` returns. */\n typing: Set<string>;\n /**\n * Resolves an `external_id` to a display label. Defaults to the\n * SDK's `userResolver` (and falls back to the external_id itself\n * when the resolver isn't configured).\n */\n labelFor?: (externalId: string) => string;\n}\n\n/**\n * Three animated dots + an inline \"X is typing\" label. Renders a\n * zero-height row when nobody is typing so the list doesn't jump.\n */\nexport function TypingIndicator({ typing, labelFor }: TypingIndicatorProps) {\n const ids = Array.from(typing);\n const isTyping = ids.length > 0;\n\n if (!isTyping) return <View style={{ height: 0 }} />;\n\n return (\n <View style={styles.row}>\n <TypingDots />\n <TypingLabel ids={ids} {...(labelFor ? { labelFor } : {})} />\n </View>\n );\n}\n\nfunction TypingDots() {\n const theme = usePoolseTheme();\n const a = useRef(new Animated.Value(0)).current;\n const b = useRef(new Animated.Value(0)).current;\n const c = useRef(new Animated.Value(0)).current;\n\n useEffect(() => {\n const loop = (val: Animated.Value, delay: number) =>\n Animated.loop(\n Animated.sequence([\n Animated.delay(delay),\n Animated.timing(val, {\n toValue: 1,\n duration: 400,\n easing: Easing.inOut(Easing.ease),\n useNativeDriver: true,\n }),\n Animated.timing(val, {\n toValue: 0,\n duration: 400,\n easing: Easing.inOut(Easing.ease),\n useNativeDriver: true,\n }),\n ]),\n );\n const animations = [loop(a, 0), loop(b, 150), loop(c, 300)];\n animations.forEach((anim) => anim.start());\n return () => animations.forEach((anim) => anim.stop());\n }, [a, b, c]);\n\n const dot = (val: Animated.Value) => ({\n width: 6,\n height: 6,\n borderRadius: 3,\n backgroundColor: theme.colors.ink3,\n marginHorizontal: 2,\n transform: [\n {\n translateY: val.interpolate({ inputRange: [0, 1], outputRange: [0, -3] }),\n },\n ],\n opacity: val.interpolate({ inputRange: [0, 1], outputRange: [0.5, 1] }),\n });\n\n return (\n <View style={styles.dotsWrap}>\n <Animated.View style={dot(a)} />\n <Animated.View style={dot(b)} />\n <Animated.View style={dot(c)} />\n </View>\n );\n}\n\nfunction TypingLabel({\n ids,\n labelFor,\n}: {\n ids: string[];\n labelFor?: (externalId: string) => string;\n}) {\n const theme = usePoolseTheme();\n const id1 = ids[0] ?? null;\n const id2 = ids[1] ?? null;\n const name1 = useDisplayName(id1, labelFor);\n const name2 = useDisplayName(id2, labelFor);\n\n const text =\n ids.length === 1\n ? `${name1} is typing`\n : ids.length === 2\n ? `${name1} and ${name2} are typing`\n : `${ids.length} people are typing`;\n\n return (\n <Text style={[styles.label, { color: theme.colors.ink2, fontFamily: theme.type.fontBody }]}>\n {text}\n </Text>\n );\n}\n\nconst styles = StyleSheet.create({\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 12,\n paddingVertical: 6,\n },\n dotsWrap: {\n flexDirection: 'row',\n alignItems: 'flex-end',\n marginRight: 8,\n height: 12,\n },\n label: {\n fontSize: 12,\n },\n});\n","import type { Message, Uuid } from '@poolse/sdk';\nimport { useMe, useMembers, useMessages, useTyping } from '@poolse/react';\nimport { useCallback, useEffect, useMemo, useRef, useState, type ReactElement } from 'react';\nimport { KeyboardAvoidingView, Platform, StyleSheet, View } from 'react-native';\n\nimport { AttachmentPicker } from './AttachmentPicker.js';\nimport { ChatHeader } from './ChatHeader.js';\nimport { MentionInput } from './MentionInput.js';\nimport { MessageComposer } from './MessageComposer.js';\nimport { MessageList } from './MessageList.js';\nimport { MessageRow } from './MessageRow.js';\nimport { ThreadView } from './ThreadView.js';\nimport { TypingIndicator } from './TypingIndicator.js';\nimport { UploadProvider } from './internal/uploadContext.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport interface ConversationViewProps {\n conversationId: Uuid;\n emptyState?: ReactElement | string;\n renderMessage?: (msg: Message, currentUserId: string | null) => ReactElement;\n labelFor?: (externalId: string) => string;\n avatarFor?: (externalId: string) => string | null;\n\n /**\n * Renders the default `<ChatHeader>` at the top of the chat surface.\n * * `true` (default) — auto chat header (other user / group name).\n * * `false` — no header (you supply your own above).\n * * `ReactElement` — custom header node, rendered as-is.\n */\n header?: boolean | ReactElement;\n /** Tap on the header's members icon — typically opens a sheet. */\n onHeaderMembersPress?: () => void;\n /** Tap on the header itself — typically opens a conversation profile. */\n onHeaderPress?: () => void;\n\n // Feature toggles — all default ON, identical names + defaults to web.\n reactions?: boolean;\n mentions?: boolean;\n attachments?: boolean;\n actions?: boolean;\n threads?: boolean;\n quotations?: boolean;\n readReceipts?: boolean;\n maxBodyLength?: number;\n\n /** Show sender labels in group chats. `auto` (default), `always`, `never`. */\n senderLabels?: 'auto' | 'always' | 'never';\n /** Show avatars to the left of other-side bubbles in group chats. Same semantics. */\n avatars?: 'auto' | 'always' | 'never';\n\n /**\n * Fires when auto-mark-read commits a new server-side read cursor.\n * Receives the conversation id + the message id that was marked\n * as the last-read. Wire this to `useConversations().markConversationRead(convId, msgId)`\n * so the sidebar / list view's unread badge clears immediately\n * instead of waiting for the next conversations refetch.\n */\n onMarkedRead?: (conversationId: string, messageId: string) => void;\n /**\n * Fires after every successful message send. Wire to the parent's\n * `useConversations().refetch()` so the conversation list shows\n * the fresh `last_message_preview` / `last_message_at` for the\n * conversation you just sent into. `useConversations` creates\n * isolated state per call site, so ConversationView can't refresh\n * a parent hook's state on its own.\n */\n onSent?: (conversationId: string) => void;\n /**\n * keyboardVerticalOffset passed to the internal KeyboardAvoidingView.\n * On iOS this MUST equal the distance from the screen top to the\n * KAV's top (status bar + safe-area-top + any nav header above\n * the chat). `<PoolseInbox>` computes this for you. Standalone\n * consumers pass it manually.\n */\n keyboardOffset?: number;\n}\n\nexport function ConversationView({\n conversationId,\n emptyState,\n renderMessage,\n labelFor,\n avatarFor,\n header = true,\n onHeaderMembersPress,\n onHeaderPress,\n reactions = true,\n mentions = true,\n attachments = true,\n actions = true,\n threads = true,\n quotations = true,\n readReceipts = true,\n maxBodyLength = 200,\n senderLabels = 'auto',\n avatars = 'auto',\n onMarkedRead,\n onSent,\n keyboardOffset = 0,\n}: ConversationViewProps) {\n const theme = usePoolseTheme();\n const { me } = useMe();\n const meId = me?.id ?? null;\n\n const {\n messages,\n loading,\n hasMore,\n loadMore,\n send,\n edit,\n delete: deleteMsg,\n markReadUpTo,\n } = useMessages(conversationId);\n const { typing, signalTyping } = useTyping(conversationId);\n\n const wantsMembers = mentions || senderLabels === 'auto' || avatars === 'auto';\n const { members } = useMembers(wantsMembers ? conversationId : '');\n const isGroupChat = members.length > 2;\n const showSenderLabels = senderLabels === 'always' || (senderLabels === 'auto' && isGroupChat);\n const showAvatars = avatars === 'always' || (avatars === 'auto' && isGroupChat);\n\n const [replyingTo, setReplyingTo] = useState<Message | null>(null);\n const [editingId, setEditingId] = useState<string | null>(null);\n const [threadRoot, setThreadRoot] = useState<Message | null>(null);\n const [pickerOpen, setPickerOpen] = useState(false);\n\n // messageId → sequence map for read-receipt comparison. Membership\n // only carries `last_read_message_id` (UUID); to know whether\n // member X read message Y we have to translate the read message's\n // id into its sequence and compare against Y's sequence. UUIDs\n // aren't chronological so we have to do this lookup explicitly.\n const sequenceByMessageId = useMemo(() => {\n const m = new Map<string, number>();\n for (const msg of messages) {\n if (typeof msg.sequence === 'number') m.set(msg.id, msg.sequence);\n }\n return m;\n }, [messages]);\n\n // Auto-mark-read: advance the read cursor whenever a confirmed\n // message lands at the tail. Skip optimistic temp messages\n // (no `sequence` yet — server hasn't seen the id) to avoid\n // 404s when send-then-immediately-mark races the round-trip.\n // Wrapping in try/catch lets us survive any other transient\n // membership-write failures without breaking the chat.\n const lastMarkedRef = useRef<string | null>(null);\n useEffect(() => {\n if (!readReceipts) return;\n if (messages.length === 0) return;\n const latest = messages[messages.length - 1];\n if (!latest || !latest.id) return;\n if (latest.id === lastMarkedRef.current) return;\n // Optimistic temp messages don't have a server-assigned sequence.\n // Marking them would 404 (server hasn't processed the send yet);\n // wait for the realtime confirmation to land, which replaces the\n // temp with a real message carrying a real sequence.\n if (typeof latest.sequence !== 'number' || latest.sequence <= 0) return;\n lastMarkedRef.current = latest.id;\n void markReadUpTo(latest.id).catch(() => {\n // Reset so we retry on the next message arrival.\n lastMarkedRef.current = null;\n });\n onMarkedRead?.(conversationId, latest.id);\n }, [messages, meId, readReceipts, markReadUpTo, onMarkedRead, conversationId]);\n\n const renderItem = useCallback(\n (msg: Message): ReactElement => {\n if (renderMessage) return <>{renderMessage(msg, meId)}</>;\n const readState: 'sent' | 'read' | undefined =\n readReceipts && meId !== null && msg.sender_id === meId\n ? readStateForMessage(msg, members, meId, sequenceByMessageId)\n : undefined;\n return (\n <MessageRow\n msg={msg}\n meId={meId}\n reactions={reactions}\n attachments={attachments}\n actions={actions}\n threads={threads}\n quotations={quotations}\n {...(readState ? { readState } : {})}\n editing={editingId === msg.id}\n onStartEdit={() => setEditingId(msg.id)}\n onCancelEdit={() => setEditingId(null)}\n onSaveEdit={async (body) => {\n await edit(msg.id, body);\n setEditingId(null);\n }}\n onDelete={() => deleteMsg(msg.id)}\n {...(threads ? { onOpenThread: () => setThreadRoot(msg) } : {})}\n {...(quotations ? { onQuote: () => setReplyingTo(msg) } : {})}\n {...(labelFor ? { labelFor } : {})}\n {...(avatarFor ? { avatarFor } : {})}\n showSenderName={showSenderLabels}\n showAvatar={showAvatars}\n maxBodyLength={maxBodyLength}\n />\n );\n },\n [\n renderMessage,\n meId,\n readReceipts,\n members,\n reactions,\n attachments,\n actions,\n threads,\n quotations,\n editingId,\n edit,\n deleteMsg,\n labelFor,\n avatarFor,\n showSenderLabels,\n showAvatars,\n maxBodyLength,\n sequenceByMessageId,\n ],\n );\n\n const composerProps = useMemo(\n () => ({\n onSend: async (\n body: string,\n opts?: { quoted_message_id?: Uuid; attachment_ids?: Uuid[]; mentions?: Uuid[] },\n ) => {\n await send({ body, ...opts });\n setReplyingTo(null);\n // Tell the parent so it can refresh ITS useConversations\n // state. useConversations creates isolated state per call\n // site, so a refetch from here wouldn't update PoolseInbox's\n // list — only the parent's own hook instance can.\n onSent?.(conversationId);\n },\n onTyping: signalTyping,\n ...(attachments ? { onAttachPress: () => setPickerOpen(true) } : {}),\n ...(replyingTo ? { replyingTo } : {}),\n onCancelReply: () => setReplyingTo(null),\n ...(labelFor ? { labelFor } : {}),\n attachments,\n keyboardOffset,\n }),\n [send, signalTyping, attachments, replyingTo, labelFor, keyboardOffset, onSent, conversationId],\n );\n\n const headerNode =\n header === false ? null : header === true ? (\n <ChatHeader\n conversationId={conversationId}\n {...(labelFor ? { labelFor } : {})}\n {...(avatarFor ? { avatarFor } : {})}\n {...(onHeaderMembersPress ? { onMembersPress: onHeaderMembersPress } : {})}\n {...(onHeaderPress ? { onPress: onHeaderPress } : {})}\n />\n ) : (\n header\n );\n\n return (\n <UploadProvider>\n <KeyboardAvoidingView\n // iOS uses `padding` (the height behavior is documented as\n // only working on absolute-positioned children and is\n // basically a no-op inside flex:1 chains like ours).\n // Padding mode REQUIRES the right keyboardVerticalOffset —\n // the distance from the screen top to the KAV's top.\n // PoolseInbox computes this from the safe-area top + its own\n // ChatHeader height and passes it through; standalone\n // consumers must pass it themselves.\n //\n // Android uses `height` — works there because the layout\n // recomputes from the Android window resize.\n style={[styles.root, { backgroundColor: theme.colors.paper }]}\n behavior={Platform.OS === 'ios' ? 'padding' : 'height'}\n keyboardVerticalOffset={keyboardOffset}\n >\n {headerNode}\n <View style={styles.listWrap}>\n <MessageList\n messages={messages}\n loading={loading}\n hasMore={hasMore}\n onLoadMore={loadMore}\n renderItem={renderItem}\n ListHeader={<TypingIndicator typing={typing} {...(labelFor ? { labelFor } : {})} />}\n {...(emptyState !== undefined ? { emptyState } : {})}\n />\n </View>\n\n {mentions ? (\n <MentionInput conversationId={conversationId} {...composerProps} />\n ) : (\n <MessageComposer {...composerProps} />\n )}\n\n {attachments ? (\n <AttachmentPicker visible={pickerOpen} onClose={() => setPickerOpen(false)} />\n ) : null}\n\n {threads && threadRoot ? (\n <ThreadView\n visible\n onClose={() => setThreadRoot(null)}\n conversationId={conversationId}\n rootMessage={threadRoot}\n {...(labelFor ? { labelFor } : {})}\n />\n ) : null}\n </KeyboardAvoidingView>\n </UploadProvider>\n );\n}\n\nfunction readStateForMessage(\n msg: Message,\n members: ReadonlyArray<{ user_id: string; last_read_message_id: string | null }>,\n meId: string,\n sequenceByMessageId: Map<string, number>,\n): 'sent' | 'read' {\n const otherMembers = members.filter((m) => m.user_id !== meId);\n if (otherMembers.length === 0) return 'sent';\n if (typeof msg.sequence !== 'number') return 'sent';\n const mySeq = msg.sequence;\n const anyRead = otherMembers.some((m) => {\n if (!m.last_read_message_id) return false;\n const readSeq = sequenceByMessageId.get(m.last_read_message_id);\n if (readSeq === undefined) return false;\n return readSeq >= mySeq;\n });\n return anyRead ? 'read' : 'sent';\n}\n\nconst styles = StyleSheet.create({\n root: {\n flex: 1,\n },\n listWrap: {\n flex: 1,\n },\n});\n","import { useMemo, useState } from 'react';\nimport {\n Animated,\n FlatList,\n Image,\n Modal,\n Pressable,\n StyleSheet,\n Text,\n TextInput,\n useWindowDimensions,\n View,\n} from 'react-native';\n\nimport { Avatar } from '../primitives/Avatar.js';\nimport { PoolseIcon } from '../primitives/PoolseIcon.js';\nimport { useDismissableSheet } from './useDismissableSheet.js';\nimport { usePoolseTheme } from '../theme/PoolseTheme.js';\n\nexport interface InboxUser {\n /** The user's external_id (the same id you mint JWTs with). */\n externalId: string;\n /** Display name shown in the picker row. */\n name: string;\n /** Optional avatar URL — falls back to initials if missing. */\n avatarUrl?: string | null;\n /** Optional secondary line (email, role, handle…). */\n subtitle?: string;\n}\n\nexport interface UserPickerSheetProps {\n visible: boolean;\n onClose: () => void;\n users: InboxUser[];\n /** External_ids to hide (usually the caller's own id). */\n excludeIds?: string[];\n /**\n * `single` → direct-chat mode; tap a row, fires onPickDirect, closes.\n * `group` → multi-select with a group-name input + Create button.\n */\n mode: 'single' | 'group';\n onPickDirect?: (externalId: string) => void;\n onCreateGroup?: (name: string, memberExternalIds: string[]) => void;\n /** Optional header slot — title defaults to \"New chat\" / \"New group\". */\n title?: string;\n /** Search input shown when user count ≥ 8. Override to force on/off. */\n searchable?: boolean;\n}\n\n/**\n * Bottom-sheet picker for selecting one or many users from the\n * tenant's user directory. Used by `<PoolseInbox>` for the\n * built-in \"New chat\" / \"New group\" flows. Exported standalone so\n * devs can drive it from their own UI (e.g. a \"Forward to…\" sheet).\n */\nexport function UserPickerSheet({\n visible,\n onClose,\n users,\n excludeIds,\n mode,\n onPickDirect,\n onCreateGroup,\n title,\n searchable,\n}: UserPickerSheetProps) {\n const theme = usePoolseTheme();\n const [query, setQuery] = useState('');\n const [selectedIds, setSelectedIds] = useState<string[]>([]);\n const [groupName, setGroupName] = useState('');\n const { height: screenHeight } = useWindowDimensions();\n const { translateY, panHandlers } = useDismissableSheet({\n onClose: () => {\n // Reset selection state on dismiss so it doesn't survive\n // across opens.\n setQuery('');\n setSelectedIds([]);\n setGroupName('');\n onClose();\n },\n sheetHeight: screenHeight * 0.85,\n });\n\n const excludeSet = useMemo(() => new Set(excludeIds ?? []), [excludeIds]);\n const filtered = useMemo(() => {\n const q = query.trim().toLowerCase();\n return users.filter((u) => {\n if (excludeSet.has(u.externalId)) return false;\n if (!q) return true;\n return (\n u.name.toLowerCase().includes(q) ||\n (u.subtitle ?? '').toLowerCase().includes(q) ||\n u.externalId.toLowerCase().includes(q)\n );\n });\n }, [users, query, excludeSet]);\n\n const showSearch = searchable ?? users.length >= 8;\n const isGroup = mode === 'group';\n const heading = title ?? (isGroup ? 'New group' : 'New chat');\n\n const reset = () => {\n setQuery('');\n setSelectedIds([]);\n setGroupName('');\n };\n\n const handleClose = () => {\n reset();\n onClose();\n };\n\n const toggle = (externalId: string) => {\n setSelectedIds((prev) =>\n prev.includes(externalId) ? prev.filter((id) => id !== externalId) : [...prev, externalId],\n );\n };\n\n const canCreate = isGroup && selectedIds.length > 0 && groupName.trim().length > 0;\n\n const handleCreate = () => {\n if (!canCreate) return;\n onCreateGroup?.(groupName.trim(), selectedIds);\n reset();\n onClose();\n };\n\n return (\n <Modal\n visible={visible}\n transparent\n animationType=\"slide\"\n onRequestClose={handleClose}\n statusBarTranslucent\n >\n <View style={styles.modalRoot}>\n <Pressable style={styles.backdrop} onPress={handleClose} />\n\n <Animated.View\n style={[\n styles.sheet,\n {\n backgroundColor: theme.colors.paper,\n borderTopLeftRadius: theme.radii.xl,\n borderTopRightRadius: theme.radii.xl,\n transform: [{ translateY }],\n },\n theme.shadows.lg,\n ]}\n >\n <View {...panHandlers} style={styles.dragHandle}>\n <View style={[styles.dragPill, { backgroundColor: theme.colors.ink3 }]} />\n </View>\n\n <View style={styles.header}>\n <Pressable\n onPress={handleClose}\n hitSlop={16}\n style={[styles.closeBtn, { backgroundColor: theme.colors.surface2 }]}\n accessibilityLabel=\"Close picker\"\n >\n <PoolseIcon name=\"close\" size={18} color={theme.colors.ink} />\n </Pressable>\n <Text\n style={[\n styles.title,\n { color: theme.colors.ink, fontFamily: theme.type.fontDisplay },\n ]}\n numberOfLines={1}\n >\n {heading}\n </Text>\n {isGroup ? (\n <Pressable\n onPress={handleCreate}\n disabled={!canCreate}\n hitSlop={6}\n style={[\n styles.createBtn,\n {\n backgroundColor: canCreate ? theme.colors.brand : theme.colors.surface2,\n opacity: canCreate ? 1 : 0.6,\n },\n ]}\n >\n <Text\n style={{\n color: canCreate ? theme.colors.onBrand : theme.colors.ink3,\n fontWeight: '700',\n fontSize: 13,\n }}\n >\n Create{selectedIds.length > 0 ? ` (${selectedIds.length})` : ''}\n </Text>\n </Pressable>\n ) : null}\n </View>\n\n {isGroup ? (\n <TextInput\n placeholder=\"Group name\"\n placeholderTextColor={theme.colors.ink3}\n value={groupName}\n onChangeText={setGroupName}\n style={[\n styles.groupNameInput,\n {\n color: theme.colors.ink,\n backgroundColor: theme.colors.surface2,\n borderRadius: theme.radii.md,\n fontFamily: theme.type.fontBody,\n fontSize: theme.type.bodySize,\n },\n ]}\n />\n ) : null}\n\n {showSearch ? (\n <TextInput\n placeholder=\"Search…\"\n placeholderTextColor={theme.colors.ink3}\n value={query}\n onChangeText={setQuery}\n style={[\n styles.searchInput,\n {\n color: theme.colors.ink,\n backgroundColor: theme.colors.surface2,\n borderRadius: theme.radii.md,\n fontFamily: theme.type.fontBody,\n fontSize: 14,\n },\n ]}\n />\n ) : null}\n\n <FlatList\n data={filtered}\n keyExtractor={(u) => u.externalId}\n ListEmptyComponent={\n <View style={styles.empty}>\n <Text style={[styles.emptyText, { color: theme.colors.ink3 }]}>\n {query ? 'No matches.' : 'No users to show.'}\n </Text>\n </View>\n }\n renderItem={({ item }) => (\n <UserRow\n user={item}\n selected={selectedIds.includes(item.externalId)}\n isGroup={isGroup}\n onPress={() => {\n if (isGroup) toggle(item.externalId);\n else {\n onPickDirect?.(item.externalId);\n reset();\n onClose();\n }\n }}\n />\n )}\n />\n </Animated.View>\n </View>\n </Modal>\n );\n}\n\nfunction UserRow({\n user,\n selected,\n isGroup,\n onPress,\n}: {\n user: InboxUser;\n selected: boolean;\n isGroup: boolean;\n onPress: () => void;\n}) {\n const theme = usePoolseTheme();\n return (\n <Pressable\n onPress={onPress}\n style={[\n styles.row,\n {\n backgroundColor: selected ? theme.colors.brandSoft : 'transparent',\n },\n ]}\n >\n {user.avatarUrl ? (\n <Image source={{ uri: user.avatarUrl }} style={styles.avatarImg} />\n ) : (\n <Avatar src={null} name={user.name} seed={user.externalId} size=\"md\" />\n )}\n <View style={styles.body}>\n <Text\n style={[styles.name, { color: theme.colors.ink, fontFamily: theme.type.fontBody }]}\n numberOfLines={1}\n >\n {user.name}\n </Text>\n {user.subtitle ? (\n <Text style={[styles.subtitle, { color: theme.colors.ink3 }]} numberOfLines={1}>\n {user.subtitle}\n </Text>\n ) : null}\n </View>\n {isGroup ? (\n <View\n style={[\n styles.checkbox,\n {\n borderColor: selected ? theme.colors.brand : theme.colors.border,\n backgroundColor: selected ? theme.colors.brand : 'transparent',\n },\n ]}\n >\n {selected ? <PoolseIcon name=\"check\" size={14} color={theme.colors.onBrand} /> : null}\n </View>\n ) : null}\n </Pressable>\n );\n}\n\nconst styles = StyleSheet.create({\n modalRoot: {\n flex: 1,\n justifyContent: 'flex-end',\n },\n backdrop: {\n ...StyleSheet.absoluteFillObject,\n backgroundColor: 'rgba(0,0,0,0.4)',\n },\n sheet: {\n height: '85%',\n overflow: 'hidden',\n },\n dragHandle: {\n alignItems: 'center',\n paddingTop: 8,\n paddingBottom: 4,\n },\n dragPill: {\n width: 36,\n height: 4,\n borderRadius: 2,\n opacity: 0.4,\n },\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 12,\n paddingTop: 4,\n paddingBottom: 12,\n gap: 10,\n },\n closeBtn: {\n width: 32,\n height: 32,\n borderRadius: 16,\n alignItems: 'center',\n justifyContent: 'center',\n },\n title: {\n fontSize: 17,\n fontWeight: '700',\n flex: 1,\n },\n createBtn: {\n paddingHorizontal: 14,\n paddingVertical: 7,\n borderRadius: 999,\n },\n groupNameInput: {\n marginHorizontal: 16,\n marginBottom: 8,\n paddingHorizontal: 12,\n paddingVertical: 10,\n fontWeight: '600',\n },\n searchInput: {\n marginHorizontal: 16,\n marginBottom: 8,\n paddingHorizontal: 12,\n paddingVertical: 8,\n },\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 16,\n paddingVertical: 10,\n gap: 12,\n },\n avatarImg: {\n width: 40,\n height: 40,\n borderRadius: 20,\n },\n body: {\n flex: 1,\n gap: 2,\n },\n name: {\n fontSize: 15,\n fontWeight: '600',\n },\n subtitle: {\n fontSize: 12,\n },\n checkbox: {\n width: 22,\n height: 22,\n borderRadius: 11,\n borderWidth: 1.5,\n alignItems: 'center',\n justifyContent: 'center',\n },\n empty: {\n paddingVertical: 40,\n alignItems: 'center',\n },\n emptyText: {\n fontSize: 13,\n },\n});\n","import type { Conversation, Uuid } from '@poolse/sdk';\nimport { useConversations, useMe, useUser } from '@poolse/react';\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport {\n Animated,\n Easing,\n Image,\n PanResponder,\n Pressable,\n StyleSheet,\n Text,\n useWindowDimensions,\n View,\n} from 'react-native';\n\nimport { ChatHeader } from './ChatHeader.js';\nimport { ConversationList } from './ConversationList.js';\nimport { ConversationView } from './ConversationView.js';\nimport { PoolseIcon } from './primitives/PoolseIcon.js';\nimport { Avatar } from './primitives/Avatar.js';\nimport { UserPickerSheet, type InboxUser } from './internal/UserPickerSheet.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport type { InboxUser } from './internal/UserPickerSheet.js';\n\n// Height of the ChatHeader we render above ConversationView in the\n// detail pane. Hardcoded because ChatHeader has fixed vertical\n// padding (10 + 36 content + 10 ≈ 56). If you change ChatHeader's\n// padding, bump this constant.\nconst CHAT_HEADER_HEIGHT = 56;\n\nexport interface PoolseInboxProps {\n /** Header title above the conversation list. Defaults to \"Chats\". */\n title?: string;\n\n /**\n * The tenant's user directory. When provided, the inbox shows\n * \"New chat\" + \"New group\" buttons in the header. Omit if you\n * don't want the built-in picker UI (e.g. you start chats from\n * elsewhere via the imperative `openDirect()` API).\n */\n users?: InboxUser[];\n\n /** Display-name resolver for sender labels / chat header titles. */\n labelFor?: (externalId: string) => string;\n /** Avatar URL resolver. */\n avatarFor?: (externalId: string) => string | null;\n\n /**\n * Right-side slot in the header — typical use is a logout / settings\n * button. Rendered after the New-chat / New-group buttons.\n */\n renderRightAction?: () => ReactNode;\n\n /**\n * Custom row renderer for the conversation list. Receives the\n * conversation + the caller's external_id (resolved via `useMe`)\n * so you can branch on direct-vs-group display.\n */\n renderConversationRow?: (\n conv: Conversation,\n callerExternalId: string | null,\n selected: boolean,\n ) => ReactNode;\n\n /** Custom empty state when the list is empty. */\n emptyState?: ReactNode | string;\n\n /** Forwarded to `<ConversationView>` — set if you have a nav header above. */\n keyboardOffset?: number;\n}\n\nexport interface PoolseInboxHandle {\n /** Open a known conversation (e.g. from a deep link / push tap). */\n open: (conversationId: Uuid) => void;\n /**\n * Open (or create) a direct conversation with the given external_id.\n * The backend dedupes per pair — returns the existing conversation\n * if one already exists. Use this from a \"Message\" button on your\n * user profile screens.\n */\n openDirect: (externalId: string) => Promise<void>;\n /** Open (or create) a group conversation. */\n openGroup: (name: string, memberExternalIds: string[]) => Promise<void>;\n /** Open the built-in \"new chat\" picker programmatically. */\n promptNewChat: () => void;\n /** Open the built-in \"new group\" picker programmatically. */\n promptNewGroup: () => void;\n /** Pop back to the conversation list. */\n close: () => void;\n}\n\n/**\n * Drop-in inbox screen: scrollable list of conversations + chat\n * detail, with an iOS-style slide animation between them. Manages\n * its own navigation stack (no react-navigation needed). Picker\n * sheets for \"New chat\" / \"New group\" appear when `users` is\n * provided; otherwise the dev wires those flows themselves and\n * uses the imperative ref to open conversations.\n *\n * For the \"Message\" button on a user profile screen, hold a ref to\n * the inbox and call `inboxRef.current?.openDirect(externalId)`.\n */\nexport const PoolseInbox = forwardRef<PoolseInboxHandle, PoolseInboxProps>(\n function PoolseInbox(props, ref) {\n const {\n title = 'Chats',\n users,\n labelFor,\n avatarFor,\n renderRightAction,\n renderConversationRow,\n emptyState,\n keyboardOffset = 0,\n } = props;\n\n const theme = usePoolseTheme();\n const { width: screenWidth } = useWindowDimensions();\n const { me } = useMe();\n const {\n conversations,\n create,\n unreadCounts,\n markConversationRead,\n refetch: refetchConversations,\n } = useConversations();\n const meExternalId = me?.external_id ?? null;\n // KAV.frame.y is measured relative to the SafeAreaView's\n // coordinate space (the SafeAreaView already absorbs the\n // safe-area-top inset). So the only chrome we need to compensate\n // for in keyboardVerticalOffset is our own ChatHeader above the\n // KAV. Adding insets.top on top double-counts and pushes the\n // composer way too far above the keyboard.\n const detailKeyboardOffset = CHAT_HEADER_HEIGHT;\n\n const [activeId, setActiveId] = useState<Uuid | null>(null);\n const [userPickerOpen, setUserPickerOpen] = useState(false);\n const [groupPickerOpen, setGroupPickerOpen] = useState(false);\n\n const slide = useRef(new Animated.Value(0)).current;\n // Flipped to true while the user is dragging the detail pane via\n // the edge-swipe gesture so the activeId-driven timing animation\n // doesn't fight the finger.\n const draggingRef = useRef(false);\n useEffect(() => {\n if (draggingRef.current) return;\n Animated.timing(slide, {\n toValue: activeId ? 1 : 0,\n duration: 280,\n easing: Easing.out(Easing.cubic),\n useNativeDriver: true,\n }).start();\n }, [activeId, slide]);\n\n const listTransform = slide.interpolate({\n inputRange: [0, 1],\n outputRange: [0, -Math.round(screenWidth * 0.25)],\n });\n const detailTransform = slide.interpolate({\n inputRange: [0, 1],\n outputRange: [screenWidth, 0],\n });\n\n // ── Edge-swipe-to-dismiss ────────────────────────────────────────\n // A thin invisible strip pinned to the screen's left edge owns a\n // PanResponder that drags the detail pane back to the right. Only\n // arms when:\n // - the detail pane is currently shown (activeId != null), AND\n // - the gesture starts within EDGE_WIDTH of the left screen edge,\n // AND\n // - the first movement is horizontal-dominant + rightward.\n // Those gates keep the strip from eating bubble swipes, vertical\n // scrolls, or back-button taps in the ChatHeader.\n const EDGE_WIDTH = 24;\n const DISMISS_VX_THRESHOLD = 0.4;\n const activeIdRef = useRef(activeId);\n useEffect(() => {\n activeIdRef.current = activeId;\n }, [activeId]);\n const panResponder = useMemo(() => {\n // Commit-vs-snap threshold scales with the screen so the gesture\n // feels right on phone widths AND tablets.\n const dismissDxThreshold = screenWidth * 0.35;\n return PanResponder.create({\n // Never claim the touch on start — that would swallow taps on\n // the back button in the ChatHeader strip.\n onStartShouldSetPanResponder: () => false,\n onStartShouldSetPanResponderCapture: () => false,\n onMoveShouldSetPanResponder: (_e, gs) => {\n if (!activeIdRef.current) return false;\n if (gs.x0 > EDGE_WIDTH) return false;\n return gs.dx > 6 && Math.abs(gs.dx) > Math.abs(gs.dy);\n },\n onMoveShouldSetPanResponderCapture: (_e, gs) => {\n if (!activeIdRef.current) return false;\n if (gs.x0 > EDGE_WIDTH) return false;\n return gs.dx > 6 && Math.abs(gs.dx) > Math.abs(gs.dy);\n },\n onPanResponderGrant: () => {\n draggingRef.current = true;\n slide.stopAnimation();\n },\n onPanResponderMove: (_e, gs) => {\n // Map finger displacement to slide: dx=0 → slide=1\n // (detail fully on); dx=screenWidth → slide=0 (off).\n const dx = Math.max(0, gs.dx);\n const progress = Math.min(1, dx / screenWidth);\n slide.setValue(1 - progress);\n },\n onPanResponderRelease: (_e, gs) => {\n draggingRef.current = false;\n const past = gs.dx > dismissDxThreshold || gs.vx > DISMISS_VX_THRESHOLD;\n if (past) {\n // Let the activeId-effect drive the close animation from\n // wherever the finger left the pane — Animated.timing\n // starts from the current value, so the motion is\n // continuous.\n setActiveId(null);\n } else {\n Animated.timing(slide, {\n toValue: 1,\n duration: 220,\n easing: Easing.out(Easing.cubic),\n useNativeDriver: true,\n }).start();\n }\n },\n onPanResponderTerminate: () => {\n // Another responder took over (rare — scroll, dialog).\n // Snap back to \"open\" so the pane doesn't get stuck.\n draggingRef.current = false;\n Animated.timing(slide, {\n toValue: 1,\n duration: 220,\n easing: Easing.out(Easing.cubic),\n useNativeDriver: true,\n }).start();\n },\n onPanResponderTerminationRequest: () => false,\n });\n }, [slide, screenWidth]);\n\n const openDirect = useCallback(\n async (externalId: string) => {\n const conv = await create({\n type: 'direct',\n member_external_ids: [externalId],\n });\n setActiveId(conv.id);\n },\n [create],\n );\n\n const openGroup = useCallback(\n async (name: string, memberExternalIds: string[]) => {\n const conv = await create({\n type: 'group',\n name,\n member_external_ids: memberExternalIds,\n });\n setActiveId(conv.id);\n },\n [create],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n open: setActiveId,\n openDirect,\n openGroup,\n promptNewChat: () => setUserPickerOpen(true),\n promptNewGroup: () => setGroupPickerOpen(true),\n close: () => setActiveId(null),\n }),\n [openDirect, openGroup],\n );\n\n const renderRow = useCallback(\n (conv: Conversation, selected: boolean) => {\n if (renderConversationRow) {\n return <>{renderConversationRow(conv, meExternalId, selected)}</>;\n }\n // Live unread count from useConversations — updates immediately\n // when markConversationRead fires, instead of waiting for the\n // next list refetch. Falls back to the server snapshot on the\n // conversation row when the live map doesn't have an entry yet.\n const unread = unreadCounts?.[conv.id] ?? conv.unread_count ?? 0;\n return (\n <DefaultConversationRow\n conv={conv}\n selected={selected}\n meExternalId={meExternalId}\n unread={unread}\n {...(labelFor ? { labelFor } : {})}\n {...(avatarFor ? { avatarFor } : {})}\n onPress={() => setActiveId(conv.id)}\n />\n );\n },\n [renderConversationRow, meExternalId, labelFor, avatarFor, unreadCounts],\n );\n\n return (\n <View style={[styles.root, { backgroundColor: theme.colors.paper }]}>\n {/* LIST PANE */}\n <Animated.View\n style={[StyleSheet.absoluteFillObject, { transform: [{ translateX: listTransform }] }]}\n pointerEvents={activeId ? 'none' : 'auto'}\n >\n <View\n style={[\n styles.listHeader,\n {\n backgroundColor: theme.colors.surface,\n borderBottomColor: theme.colors.border,\n },\n ]}\n >\n <Text\n style={[\n styles.listTitle,\n { color: theme.colors.ink, fontFamily: theme.type.fontDisplay },\n ]}\n >\n {title}\n </Text>\n <View style={styles.headerActions}>\n {users ? (\n <>\n <HeaderIconButton\n icon=\"compose\"\n onPress={() => setUserPickerOpen(true)}\n label=\"New chat\"\n />\n <HeaderIconButton\n icon=\"users\"\n onPress={() => setGroupPickerOpen(true)}\n label=\"New group\"\n />\n </>\n ) : null}\n {renderRightAction?.()}\n </View>\n </View>\n\n <ConversationList\n conversations={conversations}\n renderItem={renderRow}\n {...(emptyState !== undefined ? { emptyState } : {})}\n />\n </Animated.View>\n\n {/* DETAIL PANE — our own ChatHeader (with onBack wired) above\n a ConversationView with header={false} so they don't stack.\n PanResponder lives on this wrapper (not a separate overlay\n strip) so taps fall straight through to the back button /\n attachment / send buttons — the strip approach would have\n stolen the leftmost slice of those tap targets. The gate in\n onMoveShouldSetPanResponderCapture restricts gestures to\n the left edge + horizontal-dominant + rightward, so vertical\n scrolling, swipe-to-reply on bubbles (which lives further\n inside), and button taps stay unaffected. */}\n <Animated.View\n style={[StyleSheet.absoluteFillObject, { transform: [{ translateX: detailTransform }] }]}\n pointerEvents={activeId ? 'auto' : 'none'}\n {...panResponder.panHandlers}\n >\n {activeId ? (\n <View style={{ flex: 1 }}>\n <ChatHeader\n conversationId={activeId}\n onBack={() => setActiveId(null)}\n {...(labelFor ? { labelFor } : {})}\n {...(avatarFor ? { avatarFor } : {})}\n />\n <ConversationView\n key={activeId}\n conversationId={activeId}\n header={false}\n // Caller override wins; else use safe-area-top + our\n // ChatHeader height as the iOS keyboardVerticalOffset.\n keyboardOffset={keyboardOffset || detailKeyboardOffset}\n onMarkedRead={(convId) => {\n // Optimistic local clear so the badge disappears\n // immediately — server-side cursor was advanced\n // by ConversationView's markReadUpTo.\n markConversationRead(convId);\n }}\n onSent={() => {\n // useConversations is per-call-site state — only\n // OUR refetch updates the list's preview / timestamps.\n void refetchConversations();\n }}\n {...(labelFor ? { labelFor } : {})}\n {...(avatarFor ? { avatarFor } : {})}\n />\n </View>\n ) : null}\n </Animated.View>\n\n {/* Pickers */}\n {users ? (\n <UserPickerSheet\n visible={userPickerOpen}\n onClose={() => setUserPickerOpen(false)}\n users={users}\n excludeIds={meExternalId ? [meExternalId] : []}\n mode=\"single\"\n onPickDirect={(externalId) => {\n void openDirect(externalId);\n }}\n />\n ) : null}\n\n {users ? (\n <UserPickerSheet\n visible={groupPickerOpen}\n onClose={() => setGroupPickerOpen(false)}\n users={users}\n excludeIds={meExternalId ? [meExternalId] : []}\n mode=\"group\"\n onCreateGroup={(name, ids) => {\n void openGroup(name, ids);\n }}\n />\n ) : null}\n </View>\n );\n },\n);\n\nfunction HeaderIconButton({\n icon,\n onPress,\n label,\n}: {\n icon: 'compose' | 'users';\n onPress: () => void;\n label: string;\n}) {\n const theme = usePoolseTheme();\n return (\n <Pressable\n onPress={onPress}\n hitSlop={10}\n accessibilityLabel={label}\n style={({ pressed }) => [\n styles.iconBtn,\n {\n backgroundColor: pressed ? theme.colors.surface2 : 'transparent',\n },\n ]}\n >\n <PoolseIcon name={icon} size={20} color={theme.colors.ink} />\n </Pressable>\n );\n}\n\nfunction DefaultConversationRow({\n conv,\n selected,\n meExternalId,\n unread,\n labelFor,\n avatarFor,\n onPress,\n}: {\n conv: Conversation;\n selected: boolean;\n meExternalId: string | null;\n unread: number;\n labelFor?: (externalId: string) => string;\n avatarFor?: (externalId: string) => string | null;\n onPress: () => void;\n}) {\n const theme = usePoolseTheme();\n\n // For directs, derive display from the OTHER member's external_id\n // (added to Conversation.member_external_ids by the backend). For\n // groups, use the conversation's own name + a group avatar tile.\n const isDirect = conv.type === 'direct';\n const otherExtId =\n isDirect && meExternalId\n ? (conv.member_external_ids ?? []).find((x) => x !== meExternalId)\n : null;\n\n // Priority: explicit prop > SDK userResolver > externalId fallback.\n // Inbox rows are typically the first place an avatar / name shows up\n // for a conversation, so the resolver must run here too — not only\n // inside ConversationView's bubbles.\n const resolvedOther = useUser(isDirect ? (otherExtId ?? null) : null);\n const title = isDirect\n ? otherExtId\n ? (labelFor?.(otherExtId) ?? resolvedOther.profile?.displayName ?? otherExtId)\n : 'Direct chat'\n : (conv.name ?? 'Untitled group');\n\n const avatarUrl =\n isDirect && otherExtId\n ? (avatarFor?.(otherExtId) ?? resolvedOther.profile?.avatarUrl ?? null)\n : null;\n const avatarSeed = isDirect ? (otherExtId ?? conv.id) : conv.id;\n\n return (\n <Pressable\n onPress={onPress}\n style={[\n styles.row,\n {\n backgroundColor: selected ? theme.colors.surface2 : 'transparent',\n borderBottomColor: theme.colors.border,\n },\n ]}\n >\n {avatarUrl ? (\n <Image source={{ uri: avatarUrl }} style={styles.rowAvatar} />\n ) : (\n <Avatar src={null} name={title} seed={avatarSeed} size=\"md\" />\n )}\n <View style={styles.rowBody}>\n <Text\n style={[styles.rowTitle, { color: theme.colors.ink, fontFamily: theme.type.fontBody }]}\n numberOfLines={1}\n >\n {title}\n </Text>\n <Text style={[styles.rowSubtitle, { color: theme.colors.ink3 }]} numberOfLines={1}>\n {conv.last_message_preview ??\n (isDirect ? (otherExtId ?? '') : `${(conv.member_external_ids ?? []).length} members`)}\n </Text>\n </View>\n {unread > 0 ? (\n <View style={[styles.unreadPill, { backgroundColor: theme.colors.unreadPill }]}>\n <Text style={[styles.unreadText, { color: theme.colors.unreadPillText }]}>\n {unread > 99 ? '99+' : String(unread)}\n </Text>\n </View>\n ) : null}\n </Pressable>\n );\n}\n\nconst styles = StyleSheet.create({\n root: {\n flex: 1,\n overflow: 'hidden',\n },\n listHeader: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 14,\n paddingVertical: 10,\n borderBottomWidth: StyleSheet.hairlineWidth,\n gap: 12,\n },\n listTitle: {\n flex: 1,\n fontSize: 20,\n fontWeight: '700',\n },\n headerActions: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 4,\n },\n iconBtn: {\n width: 36,\n height: 36,\n borderRadius: 18,\n alignItems: 'center',\n justifyContent: 'center',\n },\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 14,\n paddingVertical: 12,\n borderBottomWidth: StyleSheet.hairlineWidth,\n gap: 12,\n },\n rowAvatar: {\n width: 44,\n height: 44,\n borderRadius: 22,\n },\n rowBody: {\n flex: 1,\n gap: 2,\n },\n rowTitle: {\n fontSize: 15,\n fontWeight: '600',\n },\n rowSubtitle: {\n fontSize: 12,\n },\n unreadPill: {\n minWidth: 22,\n height: 22,\n borderRadius: 11,\n paddingHorizontal: 7,\n alignItems: 'center',\n justifyContent: 'center',\n },\n unreadText: {\n fontSize: 11,\n fontWeight: '700',\n },\n});\n","import { Svg, Path, Circle, G } from 'react-native-svg';\n\nimport { usePoolseTheme } from '../theme/PoolseTheme.js';\n\nexport type PoolseLogoVariant = 'lockup' | 'mark' | 'wordmark' | 'mono';\n\nexport interface PoolseLogoProps {\n variant?: PoolseLogoVariant;\n /** Height in pixels — width is computed from the variant's aspect ratio. */\n size?: number;\n /** Mono variant accepts a color override; otherwise the theme drives fills. */\n color?: string;\n label?: string | null;\n}\n\nconst TILE_PATH = 'M50 4 C20 4 4 20 4 50 C4 80 20 96 50 96 C80 96 96 80 96 50 C96 20 80 4 50 4 Z';\nconst PULSE_PATH = 'M16 55 H34 L40 55 L47 30 L54 73 L60 55 H72';\nconst WORDMARK_P_PATH =\n 'M62 -169V258V528H194L196 378L214 376Q223 432 246.0 469.0Q269 506 305.5 524.0Q342 542 389 542Q459 542 509.5 508.0Q560 474 587.0 411.0Q614 348 614 260Q614 182 590.5 120.0Q567 58 519.5 22.0Q472 -14 399 -14Q350 -14 316.0 3.5Q282 21 258.5 55.0Q235 89 219 140H200Q206 113 211.0 85.0Q216 57 219.5 31.0Q223 5 223 -19V-169ZM340 113Q373 113 396.5 131.0Q420 149 433.0 182.0Q446 215 446 259Q446 306 432.5 339.5Q419 373 394.0 391.5Q369 410 336 410Q305 410 283.5 396.5Q262 383 248.5 361.5Q235 340 229.0 316.0Q223 292 223 271V249Q223 230 228.0 211.0Q233 192 243.0 174.5Q253 157 267.0 143.0Q281 129 299.5 121.0Q318 113 340 113Z';\nconst WORDMARK_O_PATH =\n 'M305 -14Q225 -14 163.5 17.0Q102 48 67.0 110.0Q32 172 32 265Q32 358 67.0 419.5Q102 481 164.0 511.5Q226 542 306 542Q386 542 448.0 511.0Q510 480 545.0 418.5Q580 357 580 264Q580 169 544.0 107.0Q508 45 445.5 15.5Q383 -14 305 -14ZM310 103Q346 103 370.0 119.5Q394 136 406.0 170.0Q418 204 418 254Q418 307 405.0 343.5Q392 380 366.5 399.5Q341 419 301 419Q267 419 242.5 402.5Q218 386 206.0 352.0Q194 318 194 267Q194 185 224.5 144.0Q255 103 310 103Z';\nconst WORDMARK_L_PATH = 'M62 0V720H220V0Z';\nconst WORDMARK_S_PATH =\n 'M278 -14Q225 -14 182.0 -4.5Q139 5 107.0 23.0Q75 41 54.5 66.5Q34 92 26 123L146 176Q153 159 170.5 141.5Q188 124 217.5 113.0Q247 102 289 102Q329 102 351.5 113.5Q374 125 374 147Q374 163 361.5 172.5Q349 182 324.0 189.5Q299 197 262 204Q224 212 185.0 222.5Q146 233 112.0 251.5Q78 270 57.5 300.5Q37 331 37 378Q37 427 63.0 463.5Q89 500 140.5 521.0Q192 542 266 542Q332 542 382.0 525.0Q432 508 465.5 476.5Q499 445 512 401L383 355Q378 377 362.5 393.0Q347 409 323.5 417.5Q300 426 268 426Q229 426 207.5 414.0Q186 402 186 382Q186 366 200.5 355.5Q215 345 242.0 338.0Q269 331 306 323Q345 315 383.5 304.5Q422 294 453.5 276.5Q485 259 503.5 230.5Q522 202 522 157Q522 104 494.0 65.5Q466 27 411.5 6.5Q357 -14 278 -14Z';\nconst WORDMARK_E_PATH =\n 'M313 -14Q247 -14 195.0 3.5Q143 21 106.5 55.0Q70 89 51.0 139.0Q32 189 32 254Q32 317 50.5 370.0Q69 423 103.5 461.5Q138 500 188.5 521.0Q239 542 302 542Q366 542 414.5 521.5Q463 501 494.5 461.0Q526 421 541.0 363.5Q556 306 551 232L138 229V313L459 316L402 277Q409 327 396.0 358.5Q383 390 358.0 404.5Q333 419 304 419Q269 419 242.5 400.0Q216 381 201.0 345.0Q186 309 186 257Q186 175 221.5 138.0Q257 101 312 101Q339 101 357.0 108.5Q375 116 386.5 127.5Q398 139 404.5 153.0Q411 167 415 180L555 150Q547 113 529.5 83.0Q512 53 482.5 31.0Q453 9 411.5 -2.5Q370 -14 313 -14Z';\n\nconst VARIANT_VB: Record<\n PoolseLogoVariant,\n { vb: [number, number, number, number]; aspect: number }\n> = {\n lockup: { vb: [0, 0, 454, 100], aspect: 4.54 },\n mark: { vb: [0, 0, 100, 100], aspect: 1 },\n wordmark: { vb: [0, 0, 350, 100], aspect: 3.5 },\n mono: { vb: [0, 0, 454, 100], aspect: 4.54 },\n};\n\nexport function PoolseLogo({ variant = 'lockup', size = 28, color, label }: PoolseLogoProps) {\n const theme = usePoolseTheme();\n const mono = variant === 'mono';\n const monoColor = color ?? theme.colors.ink;\n\n const tileFill = mono ? 'none' : theme.colors.brand;\n const tileStroke = mono ? monoColor : 'transparent';\n const tileStrokeWidth = mono ? 5 : 0;\n const pulseStroke = mono ? monoColor : theme.colors.onBrand;\n const pulseDotFill = mono ? monoColor : theme.colors.onBrand;\n const inkFill = mono ? monoColor : theme.colors.ink;\n const oFill = mono ? monoColor : theme.colors.brand;\n\n const { vb, aspect } = VARIANT_VB[variant];\n const width = size * aspect;\n const showMark = variant === 'lockup' || variant === 'mark' || variant === 'mono';\n const showWordmark = variant === 'lockup' || variant === 'wordmark' || variant === 'mono';\n const wordmarkOffsetX = variant === 'wordmark' ? 0 : 126;\n\n const a11y = label === null ? {} : { accessibilityLabel: label ?? 'poolse' };\n return (\n <Svg viewBox={vb.join(' ')} width={width} height={size} {...a11y}>\n {showMark ? (\n <>\n <Path d={TILE_PATH} fill={tileFill} stroke={tileStroke} strokeWidth={tileStrokeWidth} />\n <Path\n d={PULSE_PATH}\n fill=\"none\"\n stroke={pulseStroke}\n strokeWidth={9}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <Circle cx={72} cy={55} r={6.2} fill={pulseDotFill} />\n </>\n ) : null}\n {showWordmark ? (\n <G transform={`translate(${wordmarkOffsetX},85.0) scale(0.097222 -0.097222)`}>\n <Path d={WORDMARK_P_PATH} fill={inkFill} transform=\"translate(0,0)\" />\n <Path d={WORDMARK_O_PATH} fill={oFill} transform=\"translate(658,0)\" />\n <Path d={WORDMARK_O_PATH} fill={oFill} transform=\"translate(1280,0)\" />\n <Path d={WORDMARK_L_PATH} fill={inkFill} transform=\"translate(1902,0)\" />\n <Path d={WORDMARK_S_PATH} fill={inkFill} transform=\"translate(2195,0)\" />\n <Path d={WORDMARK_E_PATH} fill={inkFill} transform=\"translate(2754,0)\" />\n </G>\n ) : null}\n </Svg>\n );\n}\n","export { PoolseIcon, type PoolseIconProps, type IconName } from './PoolseIcon.js';\nexport { PoolseLogo, type PoolseLogoProps, type PoolseLogoVariant } from './PoolseLogo.js';\nexport { Avatar, type AvatarProps } from './Avatar.js';\nexport { userColor } from './userColor.js';\n\n// Re-exported as a namespace for the public API surface.\nimport { PoolseIcon } from './PoolseIcon.js';\nimport { PoolseLogo } from './PoolseLogo.js';\nimport { Avatar } from './Avatar.js';\n\nexport const primitives = { PoolseIcon, PoolseLogo, Avatar };\n","import { useEffect } from 'react';\nimport { AppState, type AppStateStatus } from 'react-native';\nimport { usePoolse } from '@poolse/react';\n\n/**\n * Closes the SDK WebSocket cleanly when the app backgrounds and\n * reopens it when the app comes back to the foreground. Designed\n * to pair with push-notification delivery on the dev's backend —\n * iOS / Android suspend sockets aggressively, so we don't fight\n * the OS; we let the push wake the app and resync on resume.\n *\n * Mount once near the root of your app:\n *\n * <PoolseProvider config={config}>\n * <AppShell />\n * </PoolseProvider>\n *\n * function AppShell() {\n * useAppStateLifecycle();\n * return ...;\n * }\n */\nexport function useAppStateLifecycle() {\n const poolse = usePoolse();\n\n useEffect(() => {\n let prev: AppStateStatus = AppState.currentState;\n const sub = AppState.addEventListener('change', (next) => {\n const wasActive = prev === 'active';\n const isActive = next === 'active';\n\n if (wasActive && !isActive) {\n // Going to background — close the WS cleanly. The SDK's\n // realtime layer reopens lazily on the next subscription\n // call, so there's nothing to clean up state-side.\n try {\n poolse.realtime?.disconnect?.();\n } catch {\n // Older SDK builds may not expose disconnect; harmless.\n }\n } else if (!wasActive && isActive) {\n // Returning to foreground — the next hook render that\n // touches `realtime.conversation(...)` will reopen the\n // socket. `useMessages`/`useTyping`/`usePresence` all\n // refetch their starting snapshot on remount, so the active\n // conversation lands fresh.\n try {\n poolse.realtime?.connect?.();\n } catch {\n // Same compat note as above.\n }\n }\n\n prev = next;\n });\n\n return () => sub.remove();\n }, [poolse]);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/theme/default.ts","../src/theme/PoolseTheme.tsx","../src/primitives/userColor.ts","../src/primitives/Avatar.tsx","../src/primitives/icons-data.ts","../src/primitives/PoolseIcon.tsx","../src/MemberList.tsx","../src/internal/useDismissableSheet.ts","../src/GroupDetailsSheet.tsx","../src/ChatHeader.tsx","../src/ConversationList.tsx","../src/internal/uploadContext.tsx","../src/AttachmentPicker.tsx","../src/UploadQueueStrip.tsx","../src/MessageComposer.tsx","../src/MentionInput.tsx","../src/MessageList.tsx","../src/EditableMessageBubble.tsx","../src/MessageActions.tsx","../src/AttachmentPreview.tsx","../src/ImageMosaic.tsx","../src/MessageBubble.tsx","../src/Reactions.tsx","../src/MessageRow.tsx","../src/ThreadView.tsx","../src/UserName.tsx","../src/TypingIndicator.tsx","../src/ConversationView.tsx","../src/internal/UserPickerSheet.tsx","../src/PoolseInbox.tsx","../src/primitives/PoolseLogo.tsx","../src/primitives/index.ts","../src/lifecycle/useAppStateLifecycle.tsx"],"names":["createContext","useMemo","useContext","jsxs","View","jsx","Image","Text","StyleSheet","SvgXml","useMembers","usePresence","styles","ActivityIndicator","FlatList","Fragment","useUser","Pressable","useRef","Animated","PanResponder","useConversation","useWindowDimensions","Modal","useMe","useState","useConversations","useAttachmentUpload","useCallback","res","ImagePicker","DocumentPicker","ScrollView","forwardRef","MessageComposer","useImperativeHandle","TextInput","useAttachmentUrl","formatBytes","Dimensions","radii","useReactions","useThread","KeyboardAvoidingView","Platform","useEffect","Easing","useMessages","useTyping","PoolseInbox","Svg","Path","Circle","G","usePoolse","AppState"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { PoolseRNTheme, ThemeShadows } from './types.js';\n\n// Values mirror the --poolse-* CSS variables in @poolse/react-ui's\n// styles.css :root block. If the brand changes there, change here.\n\nconst lightColors = {\n brand: '#ff5436',\n brandStrong: '#d63415',\n brandSoft: '#ffe9e2',\n onBrand: '#fbf7f4',\n paper: '#fbf7f4',\n surface: '#ffffff',\n surface2: '#f4eee9',\n ink: '#1c1a19',\n ink2: '#6b6560',\n ink3: '#9a938c',\n border: '#eae3dc',\n presence: '#16c172',\n success: '#16a34a',\n warning: '#e08c16',\n error: '#e5484d',\n info: '#3b82f6',\n selfBubble: '#ff5436',\n selfBubbleText: '#fbf7f4',\n otherBubble: '#ffffff',\n otherBubbleText: '#1c1a19',\n unreadPill: '#ff5436',\n unreadPillText: '#fbf7f4',\n};\n\nconst darkColors = {\n brand: '#ff6a4d',\n brandStrong: '#ff8366',\n brandSoft: '#2c1712',\n onBrand: '#fbf7f4',\n paper: '#0e0d10',\n surface: '#16141a',\n surface2: '#201d25',\n ink: '#f6f2ee',\n ink2: '#a8a29b',\n ink3: '#766f68',\n border: '#2a2630',\n presence: '#22d37a',\n success: '#34d399',\n warning: '#fbbf24',\n error: '#f87171',\n info: '#60a5fa',\n selfBubble: '#ff6a4d',\n selfBubbleText: '#fbf7f4',\n otherBubble: '#16141a',\n otherBubbleText: '#f6f2ee',\n unreadPill: '#ff6a4d',\n unreadPillText: '#fbf7f4',\n};\n\nconst type = {\n // RN can't use Bricolage/Hanken/JetBrains without expo-font setup,\n // so we default to the platform sans-serif. Devs override via the\n // theme prop if they ship custom fonts.\n fontDisplay: 'System',\n fontBody: 'System',\n fontMono: 'Menlo',\n bodySize: 15,\n lineHeight: 22,\n weightRegular: '400' as const,\n weightMedium: '500' as const,\n weightSemibold: '600' as const,\n weightBold: '700' as const,\n};\n\nconst radii = {\n sm: 8,\n md: 12,\n lg: 16,\n xl: 24,\n pill: 999,\n bubble: 16,\n};\n\nconst spacing = {\n xs: 4,\n sm: 8,\n md: 12,\n lg: 16,\n xl: 24,\n};\n\nconst lightShadows: ThemeShadows = {\n sm: {\n shadowColor: '#1c1a19',\n shadowOpacity: 0.08,\n shadowOffset: { width: 0, height: 1 },\n shadowRadius: 2,\n elevation: 1,\n },\n md: {\n shadowColor: '#1c1a19',\n shadowOpacity: 0.18,\n shadowOffset: { width: 0, height: 10 },\n shadowRadius: 30,\n elevation: 6,\n },\n lg: {\n shadowColor: '#1c1a19',\n shadowOpacity: 0.28,\n shadowOffset: { width: 0, height: 24 },\n shadowRadius: 60,\n elevation: 12,\n },\n};\n\nconst darkShadows: ThemeShadows = {\n sm: {\n shadowColor: '#000000',\n shadowOpacity: 0.4,\n shadowOffset: { width: 0, height: 1 },\n shadowRadius: 2,\n elevation: 1,\n },\n md: {\n shadowColor: '#000000',\n shadowOpacity: 0.55,\n shadowOffset: { width: 0, height: 10 },\n shadowRadius: 30,\n elevation: 6,\n },\n lg: {\n shadowColor: '#000000',\n shadowOpacity: 0.7,\n shadowOffset: { width: 0, height: 24 },\n shadowRadius: 60,\n elevation: 12,\n },\n};\n\nexport const defaultLightTheme: PoolseRNTheme = {\n mode: 'light',\n colors: lightColors,\n type,\n radii,\n spacing,\n shadows: lightShadows,\n};\n\nexport const defaultDarkTheme: PoolseRNTheme = {\n mode: 'dark',\n colors: darkColors,\n type,\n radii,\n spacing,\n shadows: darkShadows,\n};\n","import { createContext, useContext, useMemo, type ReactNode } from 'react';\n\nimport { defaultDarkTheme, defaultLightTheme } from './default.js';\nimport type { PoolseRNTheme, PoolseRNThemeOverrides, ThemeMode } from './types.js';\n\nconst ThemeContext = createContext<PoolseRNTheme | null>(null);\n\nexport interface PoolseThemeProps {\n /**\n * Light or dark base palette. Overrides are merged on top of the\n * chosen base. Defaults to `light` if omitted.\n */\n mode?: ThemeMode;\n /**\n * Partial overrides — only the fields you set replace the defaults.\n * Nested groups (`colors`, `type`, `radii`, `spacing`, `shadows`)\n * deep-merge, so `{ colors: { brand: '#000' } }` keeps every other\n * color from the base theme.\n */\n theme?: PoolseRNThemeOverrides;\n children: ReactNode;\n}\n\nexport function PoolseTheme({ mode, theme, children }: PoolseThemeProps) {\n const resolved = useMemo(() => {\n const base = (mode ?? theme?.mode) === 'dark' ? defaultDarkTheme : defaultLightTheme;\n if (!theme) return base;\n return {\n mode: theme.mode ?? base.mode,\n colors: { ...base.colors, ...theme.colors },\n type: { ...base.type, ...theme.type },\n radii: { ...base.radii, ...theme.radii },\n spacing: { ...base.spacing, ...theme.spacing },\n shadows: {\n sm: { ...base.shadows.sm, ...theme.shadows?.sm },\n md: { ...base.shadows.md, ...theme.shadows?.md },\n lg: { ...base.shadows.lg, ...theme.shadows?.lg },\n },\n } satisfies PoolseRNTheme;\n }, [mode, theme]);\n\n return <ThemeContext.Provider value={resolved}>{children}</ThemeContext.Provider>;\n}\n\n/**\n * Read the active poolse theme. Falls back to `defaultLightTheme`\n * if no `<PoolseTheme>` ancestor is mounted, so components render\n * sensibly even without explicit wiring.\n */\nexport function usePoolseTheme(): PoolseRNTheme {\n return useContext(ThemeContext) ?? defaultLightTheme;\n}\n","// Mirror of @poolse/react-ui's userColor — deterministic per-user\n// color from the same 8-hue palette.\n\nconst PALETTE = [\n '#6366f1', // indigo\n '#10b981', // emerald\n '#f59e0b', // amber\n '#ec4899', // rose\n '#0ea5e9', // sky\n '#8b5cf6', // violet\n '#14b8a6', // teal\n '#d946ef', // fuchsia\n];\n\nexport function userColor(id: string): string {\n let h = 0;\n for (let i = 0; i < id.length; i++) {\n h = (h * 31 + id.charCodeAt(i)) | 0;\n }\n return PALETTE[Math.abs(h) % PALETTE.length]!;\n}\n","import { Image, StyleSheet, Text, View } from 'react-native';\n\nimport { usePoolseTheme } from '../theme/PoolseTheme.js';\nimport { userColor } from './userColor.js';\n\nexport interface AvatarProps {\n /** URL to a profile image. Falls back to initials when omitted. */\n src?: string | null;\n /** Used for initials. */\n name?: string | null;\n /** Stable color seed (typically the user's external_id). */\n seed?: string | null;\n /** Show a green presence dot in the bottom-right corner. */\n online?: boolean;\n /** Size variant. `md` → 40px, `sm` → 28px, `lg` → 56px. */\n size?: 'sm' | 'md' | 'lg';\n}\n\nconst SIZES = { sm: 28, md: 40, lg: 56 } as const;\n\nexport function Avatar({ src, name, seed, online, size = 'md' }: AvatarProps) {\n const theme = usePoolseTheme();\n const dim = SIZES[size];\n const initials = computeInitials(name);\n const tint = seed ? userColor(seed) : theme.colors.brand;\n const fontSize = size === 'sm' ? 11 : size === 'lg' ? 22 : 15;\n\n return (\n <View\n style={[\n styles.root,\n {\n width: dim,\n height: dim,\n borderRadius: dim / 2,\n backgroundColor: tint,\n },\n ]}\n accessibilityRole=\"image\"\n accessibilityLabel={name ?? 'avatar'}\n >\n {src ? (\n <Image\n source={{ uri: src }}\n style={{ width: dim, height: dim, borderRadius: dim / 2 }}\n accessible={false}\n />\n ) : (\n <Text\n style={{\n color: theme.colors.onBrand,\n fontSize,\n fontWeight: '600',\n fontFamily: theme.type.fontBody,\n }}\n >\n {initials}\n </Text>\n )}\n {online ? (\n <View\n style={[\n styles.presence,\n {\n backgroundColor: theme.colors.presence,\n borderColor: theme.colors.surface,\n width: dim * 0.32,\n height: dim * 0.32,\n borderRadius: dim * 0.16,\n },\n ]}\n />\n ) : null}\n </View>\n );\n}\n\nfunction computeInitials(name: string | null | undefined): string {\n if (!name) return '?';\n const parts = name.trim().split(/\\s+/).slice(0, 2);\n return (\n parts\n .map((p) => p.charAt(0).toUpperCase())\n .join('')\n .slice(0, 2) || '?'\n );\n}\n\nconst styles = StyleSheet.create({\n root: {\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'visible',\n },\n presence: {\n position: 'absolute',\n bottom: 0,\n right: 0,\n borderWidth: 2,\n },\n});\n","// AUTO-GENERATED from poolse-brand-kit/icons/. Do not edit by hand.\n// Run scripts/build-icons.py from the brand kit if the source SVGs change.\n\nexport interface IconDef {\n vb: string;\n d: string;\n}\n\nexport const ICONS = {\n attachment: {\n vb: '0 0 24 24',\n d: '<path d=\"M20 11.6 11.4 20.2a5 5 0 0 1-7.1-7.1l8.7-8.7a3.3 3.3 0 0 1 4.7 4.7l-8.6 8.6a1.65 1.65 0 0 1-2.36-2.32l7.86-7.86\"/>',\n },\n bell: {\n vb: '0 0 24 24',\n d: '<path d=\"M6 9.2a6 6 0 0 1 12 0c0 4.8 1.4 6.3 1.9 6.8H4.1C4.6 15.5 6 14 6 9.2Z\"/><path d=\"M9.6 19.8a2.5 2.5 0 0 0 4.8 0\"/>',\n },\n 'check-double': {\n vb: '0 0 24 24',\n d: '<path d=\"M2.5 12.8 6.9 17 15.4 7.6\"/><path d=\"M11.4 16.4 12.3 17.2 21 7.6\"/>',\n },\n check: {\n vb: '0 0 24 24',\n d: '<path d=\"M4.5 12.6 9.4 17.4 19.5 6.6\"/>',\n },\n 'chevron-down': {\n vb: '0 0 24 24',\n d: '<path d=\"M5 9 12 16 19 9\"/>',\n },\n 'chevron-right': {\n vb: '0 0 24 24',\n d: '<path d=\"M9 5 16 12 9 19\"/>',\n },\n close: {\n vb: '0 0 24 24',\n d: '<path d=\"M6 6 18 18M18 6 6 18\"/>',\n },\n code: {\n vb: '0 0 24 24',\n d: '<path d=\"M9 7.5 4.5 12 9 16.5\"/><path d=\"M15 7.5 19.5 12 15 16.5\"/><path d=\"M13.2 5 10.8 19\"/>',\n },\n compose: {\n vb: '0 0 24 24',\n d: '<path d=\"M11.5 4H6a2.5 2.5 0 0 0-2.5 2.5V18A2.5 2.5 0 0 0 6 20.5h11.5A2.5 2.5 0 0 0 20 18v-5.5\"/><path d=\"M18.4 2.7a2.05 2.05 0 0 1 2.9 2.9L12 15l-4 1 1-4 9.4-9.3Z\"/>',\n },\n copy: {\n vb: '0 0 24 24',\n d: '<rect x=\"8.4\" y=\"8.4\" width=\"11.2\" height=\"11.2\" rx=\"2.3\"/><path d=\"M5.6 15.6H5A1.6 1.6 0 0 1 3.4 14V5A1.6 1.6 0 0 1 5 3.4h9A1.6 1.6 0 0 1 15.6 5v.6\"/>',\n },\n download: {\n vb: '0 0 24 24',\n d: '<path d=\"M12 3.2v11.6\"/><path d=\"M7.4 10.2 12 14.8 16.6 10.2\"/><path d=\"M4 19.6h16\"/>',\n },\n edit: {\n vb: '0 0 24 24',\n d: '<path d=\"M16.7 3.3a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4 12.7-12.7Z\"/>',\n },\n emoji: {\n vb: '0 0 24 24',\n d: '<circle cx=\"12\" cy=\"12\" r=\"8.6\"/><circle cx=\"9\" cy=\"10\" r=\"1\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"15\" cy=\"10\" r=\"1\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M8.4 14.2a4.6 4.6 0 0 0 7.2 0\"/>',\n },\n heart: {\n vb: '0 0 24 24',\n d: '<path d=\"M12 20.3 4.4 12.9a4.6 4.6 0 1 1 6.5-6.5l1.1 1.1 1.1-1.1a4.6 4.6 0 1 1 6.5 6.5L12 20.3Z\"/>',\n },\n image: {\n vb: '0 0 24 24',\n d: '<rect x=\"3.2\" y=\"4.2\" width=\"17.6\" height=\"15.6\" rx=\"2.6\"/><circle cx=\"8.6\" cy=\"9.4\" r=\"1.7\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M20.8 15.8 16 11 6 19.8\"/>',\n },\n info: {\n vb: '0 0 24 24',\n d: '<circle cx=\"12\" cy=\"12\" r=\"8.6\"/><path d=\"M12 11v5.2\"/><circle cx=\"12\" cy=\"7.7\" r=\"1\" fill=\"currentColor\" stroke=\"none\"/>',\n },\n key: {\n vb: '0 0 24 24',\n d: '<circle cx=\"8\" cy=\"8\" r=\"4.4\"/><path d=\"M11.1 11.1 20 20\"/><path d=\"M16.6 16.6 18.6 14.6M14 14l2-2\"/>',\n },\n link: {\n vb: '0 0 24 24',\n d: '<path d=\"M10.2 13.8a3.5 3.5 0 0 0 5 0l3-3a3.5 3.5 0 0 0-5-5l-1.2 1.2\"/><path d=\"M13.8 10.2a3.5 3.5 0 0 0-5 0l-3 3a3.5 3.5 0 0 0 5 5l1.2-1.2\"/>',\n },\n lock: {\n vb: '0 0 24 24',\n d: '<rect x=\"4.6\" y=\"10.4\" width=\"14.8\" height=\"9.8\" rx=\"2.2\"/><path d=\"M8 10.4V7a4 4 0 0 1 8 0v3.4\"/>',\n },\n message: {\n vb: '0 0 24 24',\n d: '<path d=\"M20.5 11.4c0 4.5-3.9 8.1-8.5 8.1a9 9 0 0 1-3.7-.78L3.5 20.5l1.8-4.6A7.9 7.9 0 0 1 3.5 11.4C3.5 6.9 7.4 3.3 12 3.3s8.5 3.6 8.5 8.1Z\"/>',\n },\n messages: {\n vb: '0 0 24 24',\n d: '<path d=\"M14 9.2a4.7 4.7 0 0 1-4.7 4.7H6.8L3.5 16.4v-2.9A4.7 4.7 0 0 1 6.8 4.5h2.5A4.7 4.7 0 0 1 14 9.2Z\"/><path d=\"M9.4 13.6A4.7 4.7 0 0 0 13.6 16h3.6l3.3 2.5v-2.9a4.7 4.7 0 0 0-2.4-4.1\"/>',\n },\n mic: {\n vb: '0 0 24 24',\n d: '<rect x=\"9\" y=\"2.6\" width=\"6\" height=\"11.2\" rx=\"3\"/><path d=\"M5.6 11.2a6.4 6.4 0 0 0 12.8 0\"/><path d=\"M12 17.6v3.4\"/><path d=\"M8.6 21h6.8\"/>',\n },\n 'more-h': {\n vb: '0 0 24 24',\n d: '<circle cx=\"5.4\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"12\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"18.6\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/>',\n },\n 'more-v': {\n vb: '0 0 24 24',\n d: '<circle cx=\"12\" cy=\"5.4\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"12\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"12\" cy=\"18.6\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/>',\n },\n pin: {\n vb: '0 0 24 24',\n d: '<path d=\"M9 3.4h6v1.8l-1 5.6 3 3.2H7l3-3.2-1-5.6V3.4Z\"/><path d=\"M12 17v3.6\"/>',\n },\n plus: {\n vb: '0 0 24 24',\n d: '<path d=\"M12 5v14M5 12h14\"/>',\n },\n presence: {\n vb: '0 0 24 24',\n d: '<circle cx=\"12\" cy=\"12\" r=\"9\" fill=\"currentColor\" opacity=\"0.18\" stroke=\"none\"/><circle cx=\"12\" cy=\"12\" r=\"5\" fill=\"currentColor\" stroke=\"none\"/>',\n },\n pulse: {\n vb: '0 0 24 24',\n d: '<path d=\"M3 13h4.6l2.2-4.6 3.4 9 2.2-4.4H21\"/>',\n },\n reply: {\n vb: '0 0 24 24',\n d: '<path d=\"M9 7 4 12l5 5\"/><path d=\"M4 12h9.5a6.5 6.5 0 0 1 6.5 6.5V20\"/>',\n },\n search: {\n vb: '0 0 24 24',\n d: '<circle cx=\"11\" cy=\"11\" r=\"6.8\"/><path d=\"M20.8 20.8 16 16\"/>',\n },\n 'send-fill': {\n vb: '0 0 24 24',\n d: '<path fill=\"currentColor\" stroke=\"none\" d=\"M21.7 2.3a1 1 0 0 1 .25 1L15.3 21.8a1 1 0 0 1-1.86.06L10.6 14.2 3 11.4a1 1 0 0 1 .06-1.9L20.7 2.05a1 1 0 0 1 1 .25Z\"/>',\n },\n send: {\n vb: '0 0 24 24',\n d: '<path d=\"M21.4 2.6 11 13\"/><path d=\"M21.4 2.6 14.8 21.5a.6.6 0 0 1-1.1.05L11 14l-7.5-2.7a.6.6 0 0 1 .05-1.1L21.4 2.6Z\"/>',\n },\n settings: {\n vb: '0 0 24 24',\n d: '<circle cx=\"12\" cy=\"12\" r=\"3.1\"/><path d=\"M12 2.6V5M12 19v2.4M4.2 4.2 5.9 5.9M18.1 18.1l1.7 1.7M2.6 12H5M19 12h2.4M4.2 19.8 5.9 18.1M18.1 5.9l1.7-1.7\"/>',\n },\n sliders: {\n vb: '0 0 24 24',\n d: '<path d=\"M4 7h9M17 7h3\"/><circle cx=\"15\" cy=\"7\" r=\"2.1\"/><path d=\"M4 17h3M11 17h9\"/><circle cx=\"9\" cy=\"17\" r=\"2.1\"/>',\n },\n 'thumbs-up': {\n vb: '0 0 24 24',\n d: '<path d=\"M7 10.4V20H4.2V10.4Z\"/><path d=\"M7 10.4 11 3.2a2 2 0 0 1 1.9 2.2L12.4 9H18a2 2 0 0 1 2 2.4l-1.1 6A2 2 0 0 1 16.9 20H7\"/>',\n },\n trash: {\n vb: '0 0 24 24',\n d: '<path d=\"M4 7h16\"/><path d=\"M9.2 7V5.2A1.8 1.8 0 0 1 11 3.4h2a1.8 1.8 0 0 1 1.8 1.8V7\"/><path d=\"M6.2 7 7.2 19A1.9 1.9 0 0 0 9.1 20.7h5.8A1.9 1.9 0 0 0 16.8 19L17.8 7\"/><path d=\"M10.3 11v5M13.7 11v5\"/>',\n },\n typing: {\n vb: '0 0 24 24',\n d: '<circle cx=\"6\" cy=\"12\" r=\"1.7\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"12\" cy=\"12\" r=\"1.7\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"18\" cy=\"12\" r=\"1.7\" fill=\"currentColor\" stroke=\"none\"/>',\n },\n 'user-plus': {\n vb: '0 0 24 24',\n d: '<circle cx=\"9\" cy=\"8\" r=\"3.8\"/><path d=\"M3 20a6 6 0 0 1 12 0\"/><path d=\"M18 8v6M15 11h6\"/>',\n },\n user: {\n vb: '0 0 24 24',\n d: '<circle cx=\"12\" cy=\"8\" r=\"4\"/><path d=\"M4.6 20a7.4 7.4 0 0 1 14.8 0\"/>',\n },\n users: {\n vb: '0 0 24 24',\n d: '<circle cx=\"9\" cy=\"8\" r=\"3.6\"/><path d=\"M2.6 20a6.4 6.4 0 0 1 12.8 0\"/><path d=\"M15.8 4.7a3.6 3.6 0 0 1 0 6.6\"/><path d=\"M17.6 20a6.4 6.4 0 0 0-3.1-5.5\"/>',\n },\n webhook: {\n vb: '0 0 24 24',\n d: '<circle cx=\"6\" cy=\"6\" r=\"2.6\"/><circle cx=\"18\" cy=\"9\" r=\"2.6\"/><circle cx=\"9.5\" cy=\"18\" r=\"2.6\"/><path d=\"M7.9 7.9 12 12l3.7-1.5\"/><path d=\"M11.6 12.7 9.8 16\"/>',\n },\n} as const satisfies Record<string, IconDef>;\n\nexport type IconName = keyof typeof ICONS;\n","import { SvgXml } from 'react-native-svg';\n\nimport { usePoolseTheme } from '../theme/PoolseTheme.js';\nimport { ICONS, type IconName } from './icons-data.js';\n\nexport type { IconName };\n\nexport interface PoolseIconProps {\n /** Icon name — see {@link IconName} for the full list. */\n name: IconName;\n /** Width + height in pixels. Defaults to `20` (matches a body-line). */\n size?: number;\n /** Stroke color. Defaults to the theme's `ink` color. */\n color?: string;\n /** Accessibility label. Defaults to the icon name. */\n label?: string | null;\n}\n\nexport function PoolseIcon({ name, size = 20, color, label }: PoolseIconProps) {\n const theme = usePoolseTheme();\n const def = ICONS[name];\n if (!def) return null;\n const stroke = color ?? theme.colors.ink;\n const xml = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"${def.vb}\" fill=\"none\" stroke=\"${stroke}\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${def.d}</svg>`;\n const a11y =\n label === null\n ? { accessibilityRole: 'none' as const }\n : { accessibilityRole: 'image' as const, accessibilityLabel: label ?? name };\n return <SvgXml xml={xml} width={size} height={size} {...a11y} />;\n}\n","import type { MemberRole, Membership, Uuid } from '@poolse/sdk';\nimport { useMembers, usePresence, useUser } from '@poolse/react';\nimport { type ReactNode } from 'react';\nimport { ActivityIndicator, FlatList, Pressable, StyleSheet, Text, View } from 'react-native';\n\nimport { Avatar } from './primitives/Avatar.js';\nimport { PoolseIcon } from './primitives/PoolseIcon.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport interface MemberListProps {\n conversationId: Uuid;\n labelFor?: (externalId: string) => string;\n avatarFor?: (externalId: string) => string | null;\n onlineExternalIds?: Set<string>;\n canRemove?: (m: Membership) => boolean;\n renderItem?: (m: Membership) => ReactNode;\n emptyState?: ReactNode | string;\n}\n\nexport function MemberList({\n conversationId,\n labelFor,\n avatarFor,\n onlineExternalIds,\n canRemove,\n renderItem,\n emptyState,\n}: MemberListProps) {\n const theme = usePoolseTheme();\n const { members, loading, error, removeMember } = useMembers(conversationId);\n const { online: presenceOnline } = usePresence(\n onlineExternalIds === undefined ? conversationId : '',\n );\n const effectiveOnline = onlineExternalIds ?? presenceOnline;\n\n if (loading && members.length === 0) {\n return (\n <View style={[styles.placeholder, { backgroundColor: theme.colors.paper }]}>\n <ActivityIndicator color={theme.colors.brand} />\n </View>\n );\n }\n\n if (error) {\n return (\n <View style={[styles.placeholder, { backgroundColor: theme.colors.paper }]}>\n <Text style={{ color: theme.colors.error, fontFamily: theme.type.fontBody }}>\n Failed to load members.\n </Text>\n {error.message ? (\n <Text style={[styles.errorDetail, { color: theme.colors.ink3 }]}>{error.message}</Text>\n ) : null}\n </View>\n );\n }\n\n if (members.length === 0) {\n return (\n <View style={[styles.placeholder, { backgroundColor: theme.colors.paper }]}>\n {typeof emptyState === 'string' || emptyState == null ? (\n <Text style={{ color: theme.colors.ink3, fontFamily: theme.type.fontBody }}>\n {(emptyState as string) ?? 'No members.'}\n </Text>\n ) : (\n emptyState\n )}\n </View>\n );\n }\n\n return (\n <FlatList\n data={members}\n keyExtractor={(m) => m.user_id}\n style={{ backgroundColor: theme.colors.paper }}\n renderItem={({ item }) => {\n if (renderItem) return <>{renderItem(item)}</>;\n const isOnline = effectiveOnline.has(item.external_id);\n const showRemove = canRemove?.(item) ?? false;\n return (\n <MemberRow\n externalId={item.external_id}\n role={item.role}\n online={isOnline}\n {...(labelFor ? { labelFor } : {})}\n {...(avatarFor ? { avatarFor } : {})}\n {...(showRemove ? { onRemove: () => removeMember(item.external_id) } : {})}\n />\n );\n }}\n />\n );\n}\n\nfunction MemberRow({\n externalId,\n role,\n online,\n labelFor,\n avatarFor,\n onRemove,\n}: {\n externalId: string;\n role: MemberRole;\n online: boolean;\n labelFor?: (externalId: string) => string;\n avatarFor?: (externalId: string) => string | null;\n onRemove?: () => void;\n}) {\n const theme = usePoolseTheme();\n // Priority: explicit prop > SDK userResolver > externalId fallback.\n // The previous version used `labelFor?.(id) ?? id` and skipped the\n // resolver entirely when labelFor wasn't passed, defeating the\n // PoolseConfig.userResolver contract for consumers who configured\n // one and expected names + avatars to flow through automatically.\n const resolved = useUser(externalId);\n const name =\n labelFor?.(externalId) ?? resolved.profile?.displayName ?? externalId;\n const avatarUrl =\n avatarFor?.(externalId) ?? resolved.profile?.avatarUrl ?? null;\n return (\n <View style={styles.row}>\n <Avatar src={avatarUrl} name={name} seed={externalId} online={online} size=\"md\" />\n <View style={styles.body}>\n <Text\n style={[styles.name, { color: theme.colors.ink, fontFamily: theme.type.fontBody }]}\n numberOfLines={1}\n >\n {name}\n </Text>\n <Text style={[styles.role, { color: theme.colors.ink3 }]}>{role}</Text>\n </View>\n {onRemove ? (\n <Pressable onPress={onRemove} hitSlop={8} style={styles.removeBtn}>\n <PoolseIcon name=\"close\" size={16} color={theme.colors.ink2} />\n </Pressable>\n ) : null}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n placeholder: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n padding: 24,\n },\n errorDetail: {\n marginTop: 6,\n fontSize: 11,\n },\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 12,\n paddingVertical: 8,\n gap: 10,\n },\n body: {\n flex: 1,\n gap: 1,\n },\n name: {\n fontSize: 14,\n fontWeight: '500',\n },\n role: {\n fontSize: 11,\n textTransform: 'capitalize',\n },\n removeBtn: {\n padding: 6,\n },\n});\n","import { useMemo, useRef } from 'react';\nimport { Animated, PanResponder } from 'react-native';\n\ninterface Options {\n /** Called once the dismiss animation completes. */\n onClose: () => void;\n /**\n * Sheet height in pixels — used as the off-screen target when\n * animating dismissal. Pass `Dimensions.get('window').height * 0.85`\n * for a standard 85% bottom sheet.\n */\n sheetHeight: number;\n /**\n * Fraction of sheetHeight the user must drag past to commit\n * dismissal on release. Defaults to 0.22. Quick flicks (high\n * vertical velocity) also commit regardless of distance.\n */\n dismissThreshold?: number;\n}\n\n/**\n * Adds a pull-down-to-dismiss gesture to a bottom sheet. Returns an\n * Animated `translateY` to apply to the sheet's outer wrapper +\n * `panHandlers` to spread on whichever sub-view captures the drag\n * (typically the drag-pill area at the top, OR the whole sheet if\n * you want anywhere-drag to work).\n *\n * Only claims the gesture on clear downward motion; horizontal /\n * upward drags pass through to children (so a FlatList inside the\n * sheet can still scroll normally).\n */\nexport function useDismissableSheet({ onClose, sheetHeight, dismissThreshold = 0.22 }: Options) {\n const translateY = useRef(new Animated.Value(0)).current;\n\n const panResponder = useMemo(\n () =>\n PanResponder.create({\n onMoveShouldSetPanResponder: (_, g) => {\n // Only claim on clear downward intent. Lets the FlatList\n // inside the sheet handle vertical scrolls upward.\n return g.dy > 6 && g.dy > Math.abs(g.dx);\n },\n onPanResponderMove: (_, g) => {\n // Only follow downward drag (positive dy). Upward goes\n // back to 0 — sheet can't be pulled UP past its anchor.\n translateY.setValue(Math.max(0, g.dy));\n },\n onPanResponderRelease: (_, g) => {\n const committed = g.dy > sheetHeight * dismissThreshold || g.vy > 0.6;\n if (committed) {\n // Animate the sheet off-screen, THEN fire onClose. Without\n // this the modal's own slide-out + our reset would fight.\n Animated.timing(translateY, {\n toValue: sheetHeight,\n duration: 180,\n useNativeDriver: true,\n }).start(() => {\n translateY.setValue(0);\n onClose();\n });\n } else {\n Animated.spring(translateY, {\n toValue: 0,\n useNativeDriver: true,\n speed: 22,\n bounciness: 4,\n }).start();\n }\n },\n onPanResponderTerminate: () => {\n Animated.spring(translateY, {\n toValue: 0,\n useNativeDriver: true,\n speed: 22,\n bounciness: 4,\n }).start();\n },\n }),\n [onClose, sheetHeight, dismissThreshold, translateY],\n );\n\n return { translateY, panHandlers: panResponder.panHandlers };\n}\n","import type { Uuid } from '@poolse/sdk';\nimport { useConversation, useMembers } from '@poolse/react';\nimport {\n Animated,\n Modal,\n Pressable,\n StyleSheet,\n Text,\n useWindowDimensions,\n View,\n} from 'react-native';\n\nimport { Avatar } from './primitives/Avatar.js';\nimport { MemberList } from './MemberList.js';\nimport { PoolseIcon } from './primitives/PoolseIcon.js';\nimport { useDismissableSheet } from './internal/useDismissableSheet.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport interface GroupDetailsSheetProps {\n visible: boolean;\n onClose: () => void;\n conversationId: Uuid;\n /** Resolve external_id → display name. Same shape as MemberList. */\n labelFor?: (externalId: string) => string;\n /** Resolve external_id → avatar URL. Same shape as MemberList. */\n avatarFor?: (externalId: string) => string | null;\n /**\n * Predicate for the per-row remove button. Defaults to \"never show\"\n * — wire it on the parent for owners/admins. Receives the\n * Membership row so you can scope to roles or exclude self.\n */\n canRemoveMember?: (m: { user_id: string; external_id: string; role: string }) => boolean;\n}\n\n/**\n * Bottom-sheet (85% of screen) that opens when the user taps the\n * group chat header. Shows group name + member count at the top,\n * then a scrollable roster with avatars, display names (resolved\n * through `labelFor` / `userResolver`), role badges, and live\n * presence dots (driven by `MemberList` internally).\n */\nexport function GroupDetailsSheet({\n visible,\n onClose,\n conversationId,\n labelFor,\n avatarFor,\n canRemoveMember,\n}: GroupDetailsSheetProps) {\n const theme = usePoolseTheme();\n const { conversation } = useConversation(conversationId);\n const { members } = useMembers(conversationId);\n const { height: screenHeight } = useWindowDimensions();\n const { translateY, panHandlers } = useDismissableSheet({\n onClose,\n sheetHeight: screenHeight * 0.85,\n });\n\n const title = conversation?.name ?? 'Conversation';\n const subtitle = `${members.length} ${members.length === 1 ? 'member' : 'members'}`;\n\n return (\n <Modal\n visible={visible}\n transparent\n animationType=\"slide\"\n onRequestClose={onClose}\n statusBarTranslucent\n >\n <View style={styles.modalRoot}>\n <Pressable\n style={styles.backdrop}\n onPress={onClose}\n accessibilityLabel=\"Close group details\"\n />\n\n <Animated.View\n style={[\n styles.sheet,\n {\n backgroundColor: theme.colors.paper,\n borderTopLeftRadius: theme.radii.xl,\n borderTopRightRadius: theme.radii.xl,\n transform: [{ translateY }],\n },\n theme.shadows.lg,\n ]}\n >\n {/* Pan handlers spread on the drag-pill region so list\n scrolling underneath isn't affected. */}\n <View {...panHandlers} style={styles.dragHandle}>\n <View style={[styles.dragPill, { backgroundColor: theme.colors.ink3 }]} />\n </View>\n\n <View style={styles.headerRow}>\n <Pressable\n onPress={onClose}\n hitSlop={16}\n style={[styles.closeBtn, { backgroundColor: theme.colors.surface2 }]}\n accessibilityLabel=\"Close\"\n >\n <PoolseIcon name=\"close\" size={18} color={theme.colors.ink} />\n </Pressable>\n <Text\n style={[\n styles.headerTitle,\n { color: theme.colors.ink, fontFamily: theme.type.fontDisplay },\n ]}\n >\n Group details\n </Text>\n </View>\n\n <View style={styles.summary}>\n <Avatar src={null} name={title} seed={conversationId} size=\"lg\" />\n <Text\n style={[\n styles.title,\n { color: theme.colors.ink, fontFamily: theme.type.fontDisplay },\n ]}\n numberOfLines={1}\n >\n {title}\n </Text>\n <Text style={[styles.subtitle, { color: theme.colors.ink3 }]}>{subtitle}</Text>\n </View>\n\n <View style={[styles.divider, { backgroundColor: theme.colors.border }]} />\n\n <View style={styles.sectionLabelRow}>\n <Text\n style={[\n styles.sectionLabel,\n { color: theme.colors.ink2, fontFamily: theme.type.fontBody },\n ]}\n >\n Members\n </Text>\n </View>\n\n <View style={{ flex: 1 }}>\n <MemberList\n conversationId={conversationId}\n {...(labelFor ? { labelFor } : {})}\n {...(avatarFor ? { avatarFor } : {})}\n {...(canRemoveMember ? { canRemove: canRemoveMember } : {})}\n emptyState=\"No members yet.\"\n />\n </View>\n </Animated.View>\n </View>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n modalRoot: {\n flex: 1,\n justifyContent: 'flex-end',\n },\n backdrop: {\n ...StyleSheet.absoluteFillObject,\n backgroundColor: 'rgba(0,0,0,0.4)',\n },\n sheet: {\n height: '85%',\n overflow: 'hidden',\n },\n dragHandle: {\n alignItems: 'center',\n paddingTop: 8,\n paddingBottom: 4,\n },\n dragPill: {\n width: 36,\n height: 4,\n borderRadius: 2,\n opacity: 0.4,\n },\n headerRow: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 12,\n paddingTop: 4,\n paddingBottom: 12,\n gap: 10,\n },\n closeBtn: {\n width: 32,\n height: 32,\n borderRadius: 16,\n alignItems: 'center',\n justifyContent: 'center',\n },\n headerTitle: {\n fontSize: 16,\n fontWeight: '600',\n },\n summary: {\n alignItems: 'center',\n paddingHorizontal: 16,\n paddingBottom: 16,\n gap: 8,\n },\n title: {\n fontSize: 20,\n fontWeight: '700',\n },\n subtitle: {\n fontSize: 13,\n },\n divider: {\n height: StyleSheet.hairlineWidth,\n },\n sectionLabelRow: {\n paddingHorizontal: 16,\n paddingTop: 14,\n paddingBottom: 6,\n },\n sectionLabel: {\n fontSize: 11,\n fontWeight: '700',\n letterSpacing: 0.5,\n textTransform: 'uppercase',\n },\n});\n","import type { Uuid } from '@poolse/sdk';\nimport { useConversation, useMe, useMembers, usePresence, useUser } from '@poolse/react';\nimport { useState } from 'react';\nimport { Pressable, StyleSheet, Text, View } from 'react-native';\n\nimport { Avatar } from './primitives/Avatar.js';\nimport { GroupDetailsSheet } from './GroupDetailsSheet.js';\nimport { PoolseIcon } from './primitives/PoolseIcon.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport interface ChatHeaderProps {\n conversationId: Uuid;\n /**\n * Override the title resolver — useful when you want to derive the\n * direct-chat name from your own user directory instead of going\n * through the SDK's `userResolver`. When omitted, falls back to:\n * * direct → the other member's display name (via `useUser`)\n * * group → `conversation.name`\n */\n labelFor?: (externalId: string) => string;\n /** Optional avatar URL resolver for the other party (direct only). */\n avatarFor?: (externalId: string) => string | null;\n /** Right-side icon button — typically opens a member-list sheet. */\n onMembersPress?: () => void;\n /**\n * Tap handler for the whole header. Behavior:\n * * Direct chat → calls this if provided, otherwise no-op.\n * * Group chat → calls this if provided. If omitted, the header\n * opens a built-in group-details sheet showing the member\n * roster with live presence.\n */\n onPress?: () => void;\n /**\n * When provided, renders a back arrow on the LEFT of the header\n * that calls this handler on tap. Used by `<PoolseInbox>` to\n * navigate back to the conversation list; safe to wire from your\n * own navigator too.\n */\n onBack?: () => void;\n}\n\n/**\n * Top-of-chat header bar.\n * * 1:1 direct → other user's display name + avatar + presence dot.\n * * Group → conversation name + \"N members\" + group-tile avatar.\n *\n * Sits above `<MessageList>` inside `<ConversationView>` by default;\n * pass `header={false}` to `<ConversationView>` if you mount your own.\n */\nexport function ChatHeader({\n conversationId,\n labelFor,\n avatarFor,\n onMembersPress,\n onPress,\n onBack,\n}: ChatHeaderProps) {\n const theme = usePoolseTheme();\n const { conversation } = useConversation(conversationId);\n const { members } = useMembers(conversationId);\n const { me } = useMe();\n const { online } = usePresence(conversationId);\n const [detailsOpen, setDetailsOpen] = useState(false);\n\n const isDirect = conversation?.type === 'direct';\n const otherMember = isDirect ? members.find((m) => m.user_id !== me?.id) : null;\n const otherExtId = otherMember?.external_id ?? null;\n // useUser is safe with null — short-circuits to no-op state. Keeps the\n // hook unconditional regardless of conversation type.\n const otherUser = useUser(otherExtId);\n\n if (!conversation) {\n return (\n <View\n style={[\n styles.root,\n {\n backgroundColor: theme.colors.surface,\n borderBottomColor: theme.colors.border,\n },\n ]}\n />\n );\n }\n\n const fallbackName = otherExtId ?? '';\n const directName =\n otherUser.profile?.displayName ??\n (otherExtId ? (labelFor?.(otherExtId) ?? fallbackName) : 'Direct');\n const title = isDirect ? directName : (conversation.name ?? 'Conversation');\n\n const isOnline = isDirect && otherExtId ? online.has(otherExtId) : false;\n const subtitle = isDirect\n ? isOnline\n ? 'Online'\n : null\n : `${members.length} ${members.length === 1 ? 'member' : 'members'}`;\n\n const avatarUrl =\n isDirect && otherExtId\n ? (avatarFor?.(otherExtId) ?? otherUser.profile?.avatarUrl ?? null)\n : null;\n const avatarSeed = isDirect ? (otherExtId ?? conversationId) : conversationId;\n\n // For groups, default tap = open the built-in details sheet.\n // For directs (or when caller supplied onPress), call onPress.\n // A View wrapper is used only when there's no tap target at all\n // (direct chat with no onPress) so we don't render a no-op\n // Pressable that swallows touches.\n const isGroup = !isDirect;\n const headerOnPress = onPress ?? (isGroup ? () => setDetailsOpen(true) : undefined);\n const Wrapper: typeof View | typeof Pressable = headerOnPress ? Pressable : View;\n\n return (\n <>\n <Wrapper\n {...(headerOnPress ? { onPress: headerOnPress } : {})}\n style={[\n styles.root,\n {\n backgroundColor: theme.colors.surface,\n borderBottomColor: theme.colors.border,\n },\n ]}\n >\n {onBack ? (\n <Pressable onPress={onBack} hitSlop={12} style={styles.backBtn} accessibilityLabel=\"Back\">\n <PoolseIcon name=\"reply\" size={20} color={theme.colors.ink} />\n </Pressable>\n ) : null}\n <Avatar src={avatarUrl} name={title} seed={avatarSeed} online={isOnline} size=\"md\" />\n <View style={styles.titleCol}>\n <Text\n style={[styles.title, { color: theme.colors.ink, fontFamily: theme.type.fontDisplay }]}\n numberOfLines={1}\n >\n {title}\n </Text>\n {subtitle ? (\n <Text style={[styles.subtitle, { color: theme.colors.ink3 }]} numberOfLines={1}>\n {subtitle}\n </Text>\n ) : null}\n </View>\n {onMembersPress ? (\n <Pressable\n onPress={onMembersPress}\n hitSlop={12}\n style={styles.actionBtn}\n accessibilityLabel=\"Show members\"\n >\n <PoolseIcon name=\"users\" size={20} color={theme.colors.ink2} />\n </Pressable>\n ) : null}\n </Wrapper>\n\n {isGroup ? (\n <GroupDetailsSheet\n visible={detailsOpen}\n onClose={() => setDetailsOpen(false)}\n conversationId={conversationId}\n {...(labelFor ? { labelFor } : {})}\n {...(avatarFor ? { avatarFor } : {})}\n />\n ) : null}\n </>\n );\n}\n\nconst styles = StyleSheet.create({\n root: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 14,\n paddingVertical: 10,\n borderBottomWidth: StyleSheet.hairlineWidth,\n gap: 12,\n },\n titleCol: {\n flex: 1,\n gap: 2,\n },\n title: {\n fontSize: 16,\n fontWeight: '600',\n },\n subtitle: {\n fontSize: 12,\n fontWeight: '500',\n },\n actionBtn: {\n width: 36,\n height: 36,\n borderRadius: 18,\n alignItems: 'center',\n justifyContent: 'center',\n },\n backBtn: {\n width: 36,\n height: 36,\n alignItems: 'center',\n justifyContent: 'center',\n marginLeft: -6,\n },\n});\n","import type { Conversation, Uuid } from '@poolse/sdk';\nimport { useConversations, useMe, useUser } from '@poolse/react';\nimport { type ReactNode } from 'react';\nimport { ActivityIndicator, FlatList, Image, Pressable, StyleSheet, Text, View } from 'react-native';\n\nimport { Avatar } from './primitives/Avatar.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport interface ConversationListProps {\n selectedId?: string | null;\n onSelect?: (conv: Conversation) => void;\n /** Optional override for each row's rendering. */\n renderItem?: (conv: Conversation, selected: boolean) => ReactNode;\n /** Custom empty state when there are no conversations. */\n emptyState?: ReactNode | string;\n /** Controlled-mode: skip `useConversations()` and render from these. */\n conversations?: Conversation[];\n loading?: boolean;\n error?: Error | null;\n /** Per-conversation unread counts rendered as a Pulse Coral pill. */\n unreadCounts?: Record<Uuid, number>;\n /**\n * Explicit overrides for direct-chat names + avatars, keyed by the\n * OTHER member's external_id. When omitted, the row falls back to\n * `PoolseConfig.userResolver` and finally to the external_id.\n */\n labelFor?: (externalId: string) => string;\n avatarFor?: (externalId: string) => string | null;\n}\n\nexport function ConversationList({\n selectedId,\n onSelect,\n renderItem,\n emptyState,\n conversations: controlled,\n loading: controlledLoading,\n error: controlledError,\n unreadCounts,\n labelFor,\n avatarFor,\n}: ConversationListProps) {\n const theme = usePoolseTheme();\n const auto = useConversations();\n const { me } = useMe();\n const meExternalId = me?.external_id ?? null;\n const isControlled = controlled !== undefined;\n const conversations = isControlled ? controlled : auto.conversations;\n const loading = isControlled ? (controlledLoading ?? false) : auto.loading;\n const error = isControlled ? (controlledError ?? null) : auto.error;\n const counts = unreadCounts ?? (isControlled ? undefined : auto.unreadCounts);\n\n if (loading && conversations.length === 0) {\n return (\n <View style={[styles.placeholder, { backgroundColor: theme.colors.paper }]}>\n <ActivityIndicator color={theme.colors.brand} />\n </View>\n );\n }\n\n if (error) {\n return (\n <View style={[styles.placeholder, { backgroundColor: theme.colors.paper }]}>\n <Text style={{ color: theme.colors.error, fontFamily: theme.type.fontBody }}>\n Failed to load conversations.\n </Text>\n </View>\n );\n }\n\n if (conversations.length === 0) {\n return (\n <View style={[styles.placeholder, { backgroundColor: theme.colors.paper }]}>\n {typeof emptyState === 'string' || emptyState == null ? (\n <Text style={{ color: theme.colors.ink3, fontFamily: theme.type.fontBody }}>\n {(emptyState as string) ?? 'No conversations yet.'}\n </Text>\n ) : (\n emptyState\n )}\n </View>\n );\n }\n\n return (\n <FlatList\n data={conversations}\n keyExtractor={(c) => c.id}\n style={{ backgroundColor: theme.colors.paper }}\n renderItem={({ item }) => {\n const selected = selectedId === item.id;\n if (renderItem) {\n return <>{renderItem(item, selected)}</>;\n }\n return (\n <ConversationRow\n conv={item}\n selected={selected}\n meExternalId={meExternalId}\n unread={counts?.[item.id] ?? 0}\n {...(labelFor ? { labelFor } : {})}\n {...(avatarFor ? { avatarFor } : {})}\n {...(onSelect ? { onSelect } : {})}\n />\n );\n }}\n />\n );\n}\n\nfunction ConversationRow({\n conv,\n selected,\n meExternalId,\n unread,\n labelFor,\n avatarFor,\n onSelect,\n}: {\n conv: Conversation;\n selected: boolean;\n meExternalId: string | null;\n unread: number;\n labelFor?: (externalId: string) => string;\n avatarFor?: (externalId: string) => string | null;\n onSelect?: (conv: Conversation) => void;\n}) {\n const theme = usePoolseTheme();\n\n // For direct conversations the row title + avatar come from the OTHER\n // member, NOT the conversation itself (which has `name: null` for\n // directs). Find the counterparty's external_id and resolve via the\n // standard priority: explicit prop > userResolver > external_id.\n const isDirect = conv.type === 'direct';\n const otherExtId =\n isDirect && meExternalId\n ? (conv.member_external_ids ?? []).find((x) => x !== meExternalId) ?? null\n : null;\n const resolvedOther = useUser(isDirect ? otherExtId : null);\n\n const title = isDirect\n ? otherExtId\n ? (labelFor?.(otherExtId) ?? resolvedOther.profile?.displayName ?? otherExtId)\n : 'Direct chat'\n : (conv.name ?? 'Untitled conversation');\n const avatarUrl =\n isDirect && otherExtId\n ? (avatarFor?.(otherExtId) ?? resolvedOther.profile?.avatarUrl ?? null)\n : null;\n const avatarSeed = isDirect ? (otherExtId ?? conv.id) : conv.id;\n\n return (\n <Pressable\n onPress={() => onSelect?.(conv)}\n style={[\n styles.row,\n {\n backgroundColor: selected ? theme.colors.surface2 : 'transparent',\n },\n ]}\n >\n {avatarUrl ? (\n <Image source={{ uri: avatarUrl }} style={styles.rowAvatar} />\n ) : (\n <Avatar src={null} name={title} seed={avatarSeed} size=\"md\" />\n )}\n <View style={styles.body}>\n <Text\n style={[styles.name, { color: theme.colors.ink, fontFamily: theme.type.fontBody }]}\n numberOfLines={1}\n >\n {title}\n </Text>\n {conv.last_message_preview ? (\n <Text style={[styles.preview, { color: theme.colors.ink3 }]} numberOfLines={1}>\n {conv.last_message_preview}\n </Text>\n ) : conv.last_message_at ? (\n <Text style={[styles.preview, { color: theme.colors.ink3 }]} numberOfLines={1}>\n {formatRelative(conv.last_message_at)}\n </Text>\n ) : null}\n </View>\n {unread > 0 ? (\n <View style={[styles.unreadPill, { backgroundColor: theme.colors.unreadPill }]}>\n <Text style={[styles.unreadText, { color: theme.colors.unreadPillText }]}>\n {unread > 99 ? '99+' : String(unread)}\n </Text>\n </View>\n ) : null}\n </Pressable>\n );\n}\n\nfunction formatRelative(iso: string): string {\n try {\n const d = new Date(iso);\n const now = Date.now();\n const diff = now - d.getTime();\n if (diff < 60_000) return 'just now';\n if (diff < 3600_000) return `${Math.floor(diff / 60_000)}m`;\n if (diff < 86_400_000) return `${Math.floor(diff / 3600_000)}h`;\n return `${Math.floor(diff / 86_400_000)}d`;\n } catch {\n return '';\n }\n}\n\nconst styles = StyleSheet.create({\n placeholder: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n padding: 24,\n },\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 12,\n paddingVertical: 10,\n gap: 10,\n },\n rowAvatar: {\n width: 40,\n height: 40,\n borderRadius: 20,\n },\n body: {\n flex: 1,\n gap: 2,\n },\n name: {\n fontSize: 15,\n fontWeight: '600',\n },\n preview: {\n fontSize: 12,\n },\n unreadPill: {\n minWidth: 22,\n height: 22,\n borderRadius: 11,\n paddingHorizontal: 6,\n alignItems: 'center',\n justifyContent: 'center',\n },\n unreadText: {\n fontSize: 11,\n fontWeight: '700',\n },\n});\n","import { createContext, useCallback, useContext, useRef, type ReactNode } from 'react';\nimport { useAttachmentUpload } from '@poolse/react';\n\ntype UploadState = ReturnType<typeof useAttachmentUpload>;\n\n/**\n * Shared upload-queue value. The SDK's `useAttachmentUpload` creates\n * a private queue per call site — without a provider, each component\n * (picker / composer / strip) ends up with its own queue and uploads\n * never reach the send-with-attachment_ids path.\n *\n * `setPreview` / `getPreview` are an RN-only side channel: the SDK\n * strips the original local file URI when it converts to a Blob, but\n * the queue strip needs the URI to render an Image thumbnail. The\n * picker stashes it here keyed by filename so the strip can read it\n * back during render.\n */\ninterface UploadContextValue {\n upload: UploadState;\n setPreview: (filename: string, uri: string) => void;\n getPreview: (filename: string) => string | null;\n}\n\nconst UploadCtx = createContext<UploadContextValue | null>(null);\n\nexport function UploadProvider({ children }: { children: ReactNode }) {\n const upload = useAttachmentUpload();\n const previews = useRef<Map<string, string>>(new Map());\n\n const setPreview = useCallback((filename: string, uri: string) => {\n previews.current.set(filename, uri);\n }, []);\n\n const getPreview = useCallback((filename: string) => {\n return previews.current.get(filename) ?? null;\n }, []);\n\n return (\n <UploadCtx.Provider value={{ upload, setPreview, getPreview }}>{children}</UploadCtx.Provider>\n );\n}\n\n/**\n * Read the shared upload state. Falls back to a component-local\n * `useAttachmentUpload` when no provider is mounted so the component\n * still functions standalone (but loses preview thumbnails since\n * setPreview won't propagate).\n */\nexport function useSharedUpload(): UploadState {\n const fromCtx = useContext(UploadCtx);\n const fallback = useAttachmentUpload();\n return fromCtx?.upload ?? fallback;\n}\n\n/**\n * Preview-URI side channel for the queue strip's thumbnails. No-op\n * when no provider is mounted (strip falls back to icon placeholder).\n */\nexport function useUploadPreview() {\n const ctx = useContext(UploadCtx);\n return {\n setPreview: ctx?.setPreview ?? (() => undefined),\n getPreview: ctx?.getPreview ?? (() => null),\n };\n}\n","import { Modal, Pressable, StyleSheet, Text, View } from 'react-native';\n// Static imports — Metro's bundle graph can only trace literal\n// `import` / `require` calls. The earlier `new Function('m', 'return\n// import(m)')(name)` trick bypassed Metro entirely, so the picker\n// modules were never bundled even when the consumer installed them.\n//\n// Trade-off: if a consumer mounts <AttachmentPicker> without these\n// modules installed, the bundle fails at build time with a clear\n// \"module not found\" rather than the silent runtime warning we had\n// before. Consumers who don't want attachments at all should pass\n// `attachments={false}` to <ConversationView> so this file is never\n// rendered (and tree-shaking can drop the imports in production\n// builds with a real bundler — Metro doesn't tree-shake but the\n// imports add ~12kb total which is acceptable).\nimport * as ImagePicker from 'expo-image-picker';\nimport * as DocumentPicker from 'expo-document-picker';\n\nimport { PoolseIcon } from './primitives/PoolseIcon.js';\nimport { useSharedUpload, useUploadPreview } from './internal/uploadContext.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport interface AttachmentPickerProps {\n visible: boolean;\n onClose: () => void;\n /**\n * Optional adapter that produces upload inputs from a picked file.\n * Override to plug in custom storage / transcoding. Default reads\n * from `expo-image-picker` / `expo-document-picker`.\n */\n onPickInputs?: (kind: 'image' | 'document') => Promise<\n {\n body: { uri: string; name: string; type: string } | Blob | unknown;\n contentType: string;\n byteSize: number;\n filename?: string;\n }[]\n >;\n}\n\n/**\n * Picker sheet wrapping `expo-image-picker` and `expo-document-picker`.\n * Both must be installed (`npx expo install expo-image-picker\n * expo-document-picker`) when this component is mounted — they're\n * declared as optional peers because consumers who pass\n * `attachments={false}` to ConversationView never render this file.\n */\nexport function AttachmentPicker({ visible, onClose, onPickInputs }: AttachmentPickerProps) {\n const theme = usePoolseTheme();\n // Shared queue (via UploadProvider) so the composer sees these\n // uploads and can include them in the next send. Falls back to a\n // local queue when the picker is mounted outside ConversationView.\n const upload = useSharedUpload();\n const { setPreview } = useUploadPreview();\n\n const pickFromKind = async (kind: 'image' | 'document') => {\n try {\n const adapter = onPickInputs ?? defaultAdapter;\n const inputs = await adapter(kind);\n for (const input of inputs) {\n // Stash the original local URI on the shared context so the\n // UploadQueueStrip can render a real thumbnail. The SDK only\n // sees the Blob from here on out.\n const previewUri = (input as { _previewUri?: string })._previewUri ?? null;\n if (previewUri && input.filename) {\n setPreview(input.filename, previewUri);\n }\n void upload.upload(input as never);\n }\n } catch (err) {\n console.warn('[poolse/picker]', err);\n } finally {\n onClose();\n }\n };\n\n return (\n <Modal visible={visible} transparent animationType=\"slide\" onRequestClose={onClose}>\n <Pressable style={styles.backdrop} onPress={onClose}>\n <View\n style={[\n styles.sheet,\n {\n backgroundColor: theme.colors.surface,\n borderTopLeftRadius: theme.radii.lg,\n borderTopRightRadius: theme.radii.lg,\n },\n theme.shadows.lg,\n ]}\n >\n <Pressable style={styles.item} onPress={() => pickFromKind('image')}>\n <PoolseIcon name=\"attachment\" size={20} color={theme.colors.ink2} />\n <Text style={[styles.itemText, { color: theme.colors.ink }]}>Photo or video</Text>\n </Pressable>\n <Pressable style={styles.item} onPress={() => pickFromKind('document')}>\n <PoolseIcon name=\"attachment\" size={20} color={theme.colors.ink2} />\n <Text style={[styles.itemText, { color: theme.colors.ink }]}>File</Text>\n </Pressable>\n <Pressable style={styles.cancel} onPress={onClose}>\n <Text style={[styles.itemText, { color: theme.colors.brand }]}>Cancel</Text>\n </Pressable>\n </View>\n </Pressable>\n </Modal>\n );\n}\n\n// RN gives us a local file URI. The SDK's upload PUTs the `body` raw\n// to a presigned S3/R2 URL — those only accept raw bytes, NOT\n// multipart. If we passed the `{ uri, name, type }` object directly,\n// fetch would serialize it as multipart and the bucket would reject\n// the upload silently. So we read the URI as a Blob first (same shape\n// that `<input type=\"file\">` would give on web) and pass that.\nasync function uriToBlob(uri: string): Promise<Blob> {\n const res = await fetch(uri);\n if (!res.ok && res.status !== 0) {\n throw new Error(`failed to read picked file (HTTP ${res.status})`);\n }\n return res.blob();\n}\n\nasync function defaultAdapter(kind: 'image' | 'document') {\n if (kind === 'image') {\n const res = await ImagePicker.launchImageLibraryAsync({\n mediaTypes: 'images',\n quality: 0.85,\n });\n if (res.canceled) return [];\n return Promise.all(\n res.assets.map(async (asset) => {\n const blob = await uriToBlob(asset.uri);\n const contentType = asset.mimeType ?? blob.type ?? 'image/jpeg';\n // _previewUri is read by the picker before passing the input\n // to the SDK; the SDK ignores unknown fields.\n return {\n body: blob,\n contentType,\n byteSize: asset.fileSize ?? blob.size,\n filename: asset.fileName ?? `image-${Date.now()}.jpg`,\n _previewUri: asset.uri,\n };\n }),\n );\n }\n const res = await DocumentPicker.getDocumentAsync({\n copyToCacheDirectory: true,\n multiple: true,\n });\n if (res.canceled) return [];\n return Promise.all(\n res.assets.map(async (asset) => {\n const blob = await uriToBlob(asset.uri);\n const contentType = asset.mimeType ?? blob.type ?? 'application/octet-stream';\n return {\n body: blob,\n contentType,\n byteSize: asset.size ?? blob.size,\n filename: asset.name,\n _previewUri: asset.uri,\n };\n }),\n );\n}\n\nconst styles = StyleSheet.create({\n backdrop: {\n flex: 1,\n backgroundColor: 'rgba(0,0,0,0.35)',\n justifyContent: 'flex-end',\n },\n sheet: {\n paddingVertical: 8,\n paddingBottom: 24,\n },\n item: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 20,\n paddingVertical: 14,\n gap: 14,\n },\n cancel: {\n paddingHorizontal: 20,\n paddingVertical: 14,\n alignItems: 'center',\n marginTop: 4,\n },\n itemText: {\n fontSize: 15,\n fontWeight: '500',\n },\n});\n","import { Image, Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';\n\nimport { PoolseIcon } from './primitives/PoolseIcon.js';\nimport { useSharedUpload, useUploadPreview } from './internal/uploadContext.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\n/**\n * Horizontal scrolling preview row of pending / in-flight / ready\n * uploads. Image attachments render as 64×64 thumbnails sourced from\n * the original local file URI; file attachments render as a row card\n * with icon + name + size. A small × overlay on each tile lets the\n * user drop the upload before send.\n *\n * Reads queue state from the shared `<UploadProvider>` (mounted by\n * `<ConversationView>`), so the composer's \"ready attachment ids\"\n * pickup and the strip's display always agree.\n */\nexport function UploadQueueStrip() {\n const theme = usePoolseTheme();\n const upload = useSharedUpload();\n const { getPreview } = useUploadPreview();\n\n if (upload.queue.length === 0) return null;\n\n return (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={styles.scroll}\n // overflow:visible (+ explicit paddingTop on the contentContainer)\n // so the X close button can sit at -6/-6 outside the tile without\n // being clipped by the scroll bounds.\n style={[styles.scrollStyle, { marginBottom: 8 }]}\n >\n {upload.queue.map((item) => {\n const isError = item.status === 'error';\n const isUploading = item.status === 'uploading' || item.status === 'pending';\n const isImage = (item.contentType ?? '').startsWith('image/');\n const previewUri = getPreview(item.filename);\n const canTerminate = isUploading || item.status === 'ready' || isError;\n\n const handleClose = () => {\n if (item.status === 'ready' || isError) upload.remove(item.localId);\n else upload.cancel(item.localId);\n };\n\n return (\n <View key={item.localId} style={styles.tileWrap}>\n {isImage && previewUri ? (\n <ImageTile uri={previewUri} uploading={isUploading} error={isError} />\n ) : (\n <FileTile\n filename={item.filename}\n size={item.byteSize}\n uploading={isUploading}\n error={isError}\n />\n )}\n\n {canTerminate ? (\n <Pressable\n onPress={handleClose}\n hitSlop={8}\n style={[styles.closeBtn, { backgroundColor: theme.colors.ink }]}\n accessibilityLabel={isError ? 'Remove failed upload' : 'Cancel upload'}\n >\n <PoolseIcon name=\"close\" size={11} color={theme.colors.onBrand} />\n </Pressable>\n ) : null}\n\n {isUploading ? (\n <View style={styles.progressOverlay}>\n <View style={[styles.spinner, { borderColor: theme.colors.onBrand }]} />\n </View>\n ) : null}\n\n {isError ? (\n <View style={[styles.errorOverlay, { backgroundColor: 'rgba(229,72,77,0.85)' }]}>\n <Text style={[styles.errorText, { color: '#fff' }]}>Failed</Text>\n </View>\n ) : null}\n </View>\n );\n })}\n </ScrollView>\n );\n}\n\nfunction ImageTile({ uri, uploading, error }: { uri: string; uploading: boolean; error: boolean }) {\n const theme = usePoolseTheme();\n return (\n <Image\n source={{ uri }}\n style={[\n styles.imageTile,\n {\n backgroundColor: theme.colors.surface2,\n borderColor: error ? theme.colors.error : 'transparent',\n opacity: uploading ? 0.65 : 1,\n },\n ]}\n resizeMode=\"cover\"\n />\n );\n}\n\nfunction FileTile({\n filename,\n size,\n uploading,\n error,\n}: {\n filename: string;\n size: number;\n uploading: boolean;\n error: boolean;\n}) {\n const theme = usePoolseTheme();\n return (\n <View\n style={[\n styles.fileTile,\n {\n backgroundColor: theme.colors.surface2,\n borderColor: error\n ? theme.colors.error\n : uploading\n ? theme.colors.brand\n : theme.colors.border,\n },\n ]}\n >\n <View style={[styles.fileIconBox, { backgroundColor: theme.colors.brandSoft }]}>\n <PoolseIcon name=\"attachment\" size={18} color={theme.colors.brand} />\n </View>\n <View style={styles.fileInfo}>\n <Text\n style={[styles.fileName, { color: theme.colors.ink, fontFamily: theme.type.fontBody }]}\n numberOfLines={1}\n >\n {filename}\n </Text>\n <Text style={[styles.fileSize, { color: theme.colors.ink3 }]}>{formatBytes(size)}</Text>\n </View>\n </View>\n );\n}\n\nfunction formatBytes(n: number): string {\n if (!n || n < 0) return '';\n if (n < 1024) return `${n} B`;\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB`;\n if (n < 1024 * 1024 * 1024) return `${(n / 1024 / 1024).toFixed(1)} MB`;\n return `${(n / 1024 / 1024 / 1024).toFixed(1)} GB`;\n}\n\nconst TILE = 64;\n\nconst styles = StyleSheet.create({\n scrollStyle: {\n overflow: 'visible',\n },\n scroll: {\n paddingHorizontal: 8,\n // paddingTop creates room for the X to overflow the tile without\n // being clipped on Android (where overflow:visible isn't enough).\n paddingTop: 8,\n gap: 10,\n flexDirection: 'row',\n },\n tileWrap: {\n position: 'relative',\n overflow: 'visible',\n },\n imageTile: {\n width: TILE,\n height: TILE,\n borderRadius: 10,\n borderWidth: 1.5,\n },\n fileTile: {\n height: TILE,\n minWidth: 200,\n maxWidth: 260,\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 10,\n paddingRight: 28,\n borderRadius: 10,\n borderWidth: 1,\n gap: 10,\n },\n fileIconBox: {\n width: 36,\n height: 36,\n borderRadius: 8,\n alignItems: 'center',\n justifyContent: 'center',\n },\n fileInfo: {\n flex: 1,\n gap: 2,\n },\n fileName: {\n fontSize: 13,\n fontWeight: '600',\n },\n fileSize: {\n fontSize: 11,\n },\n closeBtn: {\n // Outside the tile (top-right corner overflowing). Parent\n // scroll container + tileWrap set overflow:visible and the\n // scroll contentContainer has paddingTop:8 so the overflow\n // isn't clipped on Android.\n position: 'absolute',\n top: -6,\n right: -6,\n width: 22,\n height: 22,\n borderRadius: 11,\n alignItems: 'center',\n justifyContent: 'center',\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 1 },\n shadowOpacity: 0.3,\n shadowRadius: 2,\n elevation: 3,\n },\n progressOverlay: {\n ...StyleSheet.absoluteFillObject,\n alignItems: 'center',\n justifyContent: 'center',\n pointerEvents: 'none',\n },\n spinner: {\n width: 24,\n height: 24,\n borderRadius: 12,\n borderWidth: 2.5,\n borderTopColor: 'transparent',\n // RN can't loop a rotation purely in StyleSheet, but the static\n // 3/4-circle still reads as \"in progress.\" A real Animated.View\n // rotation lands in a follow-up.\n },\n errorOverlay: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n paddingVertical: 3,\n alignItems: 'center',\n },\n errorText: {\n fontSize: 10,\n fontWeight: '700',\n },\n});\n","import { forwardRef, useImperativeHandle, useRef, useState } from 'react';\nimport { Pressable, StyleSheet, Text, TextInput, View } from 'react-native';\nimport type { AttachmentUploadInput, Message, Uuid } from '@poolse/sdk';\nimport { useUser } from '@poolse/react';\n\nimport { PoolseIcon } from './primitives/PoolseIcon.js';\nimport { UploadQueueStrip } from './UploadQueueStrip.js';\nimport { useSharedUpload } from './internal/uploadContext.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport interface MessageComposerProps {\n /**\n * Called when the user taps Send. Second arg carries\n * `quoted_message_id` (when replying) and `attachment_ids`\n * (resolved from the composer's upload queue). Awaited so the\n * composer disables until the send round-trips.\n */\n onSend: (\n body: string,\n opts?: { quoted_message_id?: Uuid; attachment_ids?: Uuid[] },\n ) => Promise<unknown> | void;\n /** Called on every keystroke. Hook to `useTyping().signalTyping`. */\n onTyping?: () => void;\n placeholder?: string;\n disabled?: boolean;\n /** Renders a quote chip above the input; cleared by the caller in `onSend`. */\n replyingTo?: Message | null;\n /** User tapped (x) on the quote chip. */\n onCancelReply?: () => void;\n /** Display label for the quoted sender, keyed by `external_id`. */\n labelFor?: (externalId: string) => string;\n /** Show the paperclip + queue strip. Defaults true. */\n attachments?: boolean;\n /** Tap on the paperclip — wire to `<AttachmentPicker>` from the same package. */\n onAttachPress?: () => void;\n /**\n * Distance from the top of the screen to the top of the\n * KeyboardAvoidingView — typically the height of any navigation\n * header sitting above the chat. Pass this when the iOS keyboard\n * suggestions strip ends up covering the composer (a sign the\n * computed offset is wrong). Defaults to 0; on Android it's\n * ignored.\n */\n keyboardOffset?: number;\n}\n\n/**\n * Imperative handle for parents that want to add files to the\n * composer's upload queue externally (drag/drop on a wrapper,\n * deep-link, attachment shortcut).\n */\nexport interface MessageComposerHandle {\n /** Enqueue ready-to-upload inputs. The picker component is the usual caller; this is the escape hatch. */\n addFiles: (inputs: AttachmentUploadInput[]) => void;\n focus: () => void;\n clear: () => void;\n}\n\nexport const MessageComposer = forwardRef<MessageComposerHandle, MessageComposerProps>(\n function MessageComposer(\n {\n onSend,\n onTyping,\n placeholder = 'Type a message…',\n disabled = false,\n replyingTo,\n onCancelReply,\n labelFor,\n attachments = true,\n onAttachPress,\n keyboardOffset: _keyboardOffset = 0,\n },\n ref,\n ) {\n const theme = usePoolseTheme();\n const inputRef = useRef<TextInput>(null);\n const [value, setValue] = useState('');\n const [sending, setSending] = useState(false);\n const upload = useSharedUpload();\n\n useImperativeHandle(\n ref,\n () => ({\n addFiles: (inputs) => {\n if (!attachments) return;\n for (const input of inputs) {\n void upload.upload(input);\n }\n },\n focus: () => inputRef.current?.focus(),\n clear: () => setValue(''),\n }),\n [attachments, upload],\n );\n\n const readyAttachmentIds = upload.queue\n .filter((item) => item.status === 'ready' && item.attachment)\n .map((item) => item.attachment!.id);\n const isUploading = upload.queue.some(\n (item) => item.status === 'uploading' || item.status === 'pending',\n );\n\n const submitDisabled =\n disabled ||\n sending ||\n isUploading ||\n (value.trim().length === 0 && readyAttachmentIds.length === 0);\n\n const handleSend = async () => {\n if (submitDisabled) return;\n setSending(true);\n try {\n await onSend(value.trim(), {\n ...(replyingTo ? { quoted_message_id: replyingTo.id } : {}),\n ...(readyAttachmentIds.length > 0 ? { attachment_ids: readyAttachmentIds } : {}),\n });\n setValue('');\n upload.reset();\n } finally {\n setSending(false);\n }\n };\n\n // No KeyboardAvoidingView here — ConversationView wraps the whole\n // chat surface in a single KAV so the list + composer shift up\n // together. Wrapping only the composer inside a flex:1 parent\n // with no headroom pushed it below the visible area on iPhone\n // home-indicator devices.\n return (\n <View\n style={[\n styles.wrap,\n {\n backgroundColor: theme.colors.surface,\n borderTopColor: theme.colors.border,\n },\n ]}\n >\n {replyingTo ? (\n <ReplyChip\n message={replyingTo}\n {...(labelFor ? { labelFor } : {})}\n {...(onCancelReply ? { onCancel: onCancelReply } : {})}\n />\n ) : null}\n\n {attachments ? <UploadQueueStrip /> : null}\n\n <View style={styles.row}>\n {attachments && onAttachPress ? (\n <Pressable\n onPress={onAttachPress}\n hitSlop={8}\n style={styles.iconBtn}\n accessibilityLabel=\"Attach file\"\n >\n <PoolseIcon name=\"attachment\" size={22} color={theme.colors.ink2} />\n </Pressable>\n ) : null}\n\n <TextInput\n ref={inputRef}\n value={value}\n onChangeText={(text) => {\n setValue(text);\n onTyping?.();\n }}\n placeholder={placeholder}\n placeholderTextColor={theme.colors.ink3}\n multiline\n editable={!disabled}\n style={[\n styles.input,\n {\n color: theme.colors.ink,\n backgroundColor: theme.colors.surface2,\n borderRadius: theme.radii.lg,\n fontFamily: theme.type.fontBody,\n fontSize: theme.type.bodySize,\n },\n ]}\n />\n\n <Pressable\n onPress={handleSend}\n disabled={submitDisabled}\n style={[\n styles.sendBtn,\n {\n backgroundColor: submitDisabled ? theme.colors.ink3 : theme.colors.brand,\n opacity: submitDisabled ? 0.6 : 1,\n },\n ]}\n accessibilityLabel=\"Send message\"\n >\n <PoolseIcon name=\"send\" size={18} color={theme.colors.onBrand} />\n </Pressable>\n </View>\n </View>\n );\n },\n);\n\nfunction ReplyChip({\n message,\n labelFor,\n onCancel,\n}: {\n message: Message;\n labelFor?: (externalId: string) => string;\n onCancel?: () => void;\n}) {\n const theme = usePoolseTheme();\n // Priority: explicit prop > SDK userResolver > externalId fallback.\n const resolved = useUser(message.sender_external_id);\n const senderName = message.sender_external_id\n ? (labelFor?.(message.sender_external_id) ??\n resolved.profile?.displayName ??\n message.sender_external_id)\n : 'Unknown';\n return (\n <View\n style={[\n styles.replyChip,\n {\n backgroundColor: theme.colors.surface2,\n borderLeftColor: theme.colors.brand,\n },\n ]}\n >\n <View style={{ flex: 1 }}>\n <Text style={[styles.replyName, { color: theme.colors.brand }]}>\n Replying to {senderName}\n </Text>\n <Text style={[styles.replyBody, { color: theme.colors.ink2 }]} numberOfLines={1}>\n {message.body ?? '…'}\n </Text>\n </View>\n {onCancel ? (\n <Pressable onPress={onCancel} hitSlop={8} style={styles.replyCancel}>\n <PoolseIcon name=\"close\" size={16} color={theme.colors.ink2} />\n </Pressable>\n ) : null}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n wrap: {\n borderTopWidth: StyleSheet.hairlineWidth,\n paddingTop: 8,\n paddingBottom: 10,\n paddingHorizontal: 12,\n // Note: no safe-area inset here on purpose. Wrap your chat\n // surface in <SafeAreaView> (or <SafeAreaView edges={['bottom']}>)\n // at the app root so the home-indicator clearance is handled\n // once. Doing it here too produces double padding.\n },\n row: {\n flexDirection: 'row',\n alignItems: 'flex-end',\n gap: 8,\n },\n iconBtn: {\n padding: 8,\n justifyContent: 'center',\n alignItems: 'center',\n },\n input: {\n flex: 1,\n minHeight: 40,\n maxHeight: 120,\n paddingHorizontal: 12,\n paddingTop: 10,\n paddingBottom: 10,\n },\n sendBtn: {\n width: 40,\n height: 40,\n borderRadius: 20,\n justifyContent: 'center',\n alignItems: 'center',\n },\n replyChip: {\n flexDirection: 'row',\n alignItems: 'center',\n borderLeftWidth: 3,\n paddingLeft: 10,\n paddingRight: 6,\n paddingVertical: 6,\n marginBottom: 8,\n borderRadius: 6,\n },\n replyName: {\n fontSize: 11,\n fontWeight: '600',\n marginBottom: 2,\n },\n replyBody: {\n fontSize: 12,\n },\n replyCancel: {\n padding: 6,\n },\n});\n","import type { Membership, Uuid } from '@poolse/sdk';\nimport { useMembers } from '@poolse/react';\nimport { useMemo, useState } from 'react';\nimport { FlatList, Modal, Pressable, StyleSheet, Text, View } from 'react-native';\n\nimport { Avatar } from './primitives/Avatar.js';\nimport { MessageComposer, type MessageComposerProps } from './MessageComposer.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport interface MentionInputProps extends Omit<MessageComposerProps, 'onSend'> {\n conversationId: Uuid;\n /** Same callback as MessageComposer.onSend, plus optional mention user_ids. */\n onSend: (\n body: string,\n opts?: {\n quoted_message_id?: Uuid;\n attachment_ids?: Uuid[];\n mentions?: Uuid[];\n },\n ) => Promise<unknown> | void;\n}\n\n/**\n * Composer with an inline `@`-trigger that opens a modal sheet of\n * conversation members. Selecting a member inserts their\n * `external_id` into the text, and the wire `mentions` array (sent\n * to the backend) carries the corresponding internal `user_id`s.\n */\nexport function MentionInput({ conversationId, onSend, ...composerProps }: MentionInputProps) {\n const theme = usePoolseTheme();\n const { members } = useMembers(conversationId);\n const [pickerOpen, setPickerOpen] = useState(false);\n const [pickerQuery, _setPickerQuery] = useState('');\n const [pendingMentionUuids, setPendingMentionUuids] = useState<Uuid[]>([]);\n const [text, setText] = useState('');\n\n const filteredMembers = useMemo(() => {\n if (!pickerQuery) return members;\n const q = pickerQuery.toLowerCase();\n return members.filter((m) => m.external_id.toLowerCase().includes(q));\n }, [members, pickerQuery]);\n\n const handleSend: MessageComposerProps['onSend'] = async (body, opts) => {\n await onSend(body, {\n ...opts,\n ...(pendingMentionUuids.length > 0 ? { mentions: pendingMentionUuids } : {}),\n });\n setPendingMentionUuids([]);\n setText('');\n };\n\n return (\n <>\n <MessageComposer\n {...composerProps}\n onSend={handleSend}\n onTyping={() => {\n composerProps.onTyping?.();\n // Watch for an `@` token to open the picker.\n const lastChar = text.slice(-1);\n if (lastChar === '@') setPickerOpen(true);\n }}\n />\n\n <Modal\n visible={pickerOpen}\n transparent\n animationType=\"slide\"\n onRequestClose={() => setPickerOpen(false)}\n >\n <Pressable style={styles.backdrop} onPress={() => setPickerOpen(false)}>\n <View\n style={[\n styles.sheet,\n {\n backgroundColor: theme.colors.surface,\n borderTopLeftRadius: theme.radii.lg,\n borderTopRightRadius: theme.radii.lg,\n },\n ]}\n >\n <Text\n style={[styles.title, { color: theme.colors.ink, fontFamily: theme.type.fontBody }]}\n >\n Mention a member\n </Text>\n <FlatList\n data={filteredMembers}\n keyExtractor={(m) => m.user_id}\n renderItem={({ item }) => (\n <MentionRow\n member={item}\n onPress={() => {\n setPendingMentionUuids((prev) => [...prev, item.user_id]);\n setText((prev) => `${prev}${item.external_id} `);\n setPickerOpen(false);\n }}\n />\n )}\n />\n </View>\n </Pressable>\n </Modal>\n </>\n );\n}\n\nfunction MentionRow({ member, onPress }: { member: Membership; onPress: () => void }) {\n const theme = usePoolseTheme();\n return (\n <Pressable onPress={onPress} style={styles.row}>\n <Avatar src={null} name={member.external_id} seed={member.external_id} size=\"sm\" />\n <Text style={[styles.rowText, { color: theme.colors.ink, fontFamily: theme.type.fontBody }]}>\n {member.external_id}\n </Text>\n </Pressable>\n );\n}\n\nconst styles = StyleSheet.create({\n backdrop: {\n flex: 1,\n backgroundColor: 'rgba(0,0,0,0.35)',\n justifyContent: 'flex-end',\n },\n sheet: {\n maxHeight: '60%',\n paddingVertical: 12,\n },\n title: {\n fontSize: 14,\n fontWeight: '600',\n paddingHorizontal: 16,\n paddingBottom: 8,\n },\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 16,\n paddingVertical: 10,\n gap: 10,\n },\n rowText: {\n fontSize: 14,\n },\n});\n","import type { Message } from '@poolse/sdk';\nimport {\n ActivityIndicator,\n FlatList,\n type ListRenderItem,\n StyleSheet,\n Text,\n View,\n} from 'react-native';\nimport { useCallback, type ReactElement } from 'react';\n\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport interface MessageListProps {\n messages: Message[];\n loading?: boolean;\n hasMore?: boolean;\n onLoadMore?: () => void;\n renderItem: (msg: Message, index: number) => ReactElement;\n /** Slot rendered above the latest message (typically the typing indicator). */\n ListHeader?: ReactElement | null;\n /** Slot rendered below the oldest message (rare — typically nothing). */\n ListFooter?: ReactElement | null;\n /** Custom empty state when there are no messages. */\n emptyState?: ReactElement | string;\n}\n\n/**\n * Inverted FlatList wrapper for chat history. Newest message at the\n * bottom (visually), oldest at the top. Calls `onLoadMore` when the\n * user scrolls near the top edge and `hasMore` is true.\n *\n * Pagination is owned by `useMessages` (hand it `messages` +\n * `hasMore` + `loadMore`); this component just renders + scrolls.\n */\nexport function MessageList({\n messages,\n loading = false,\n hasMore = false,\n onLoadMore,\n renderItem,\n ListHeader = null,\n ListFooter = null,\n emptyState,\n}: MessageListProps) {\n const theme = usePoolseTheme();\n\n // FlatList is inverted, so the newest item is index 0 (rendered at\n // the bottom visually). React's `messages` is newest-last per the\n // SDK convention; we reverse for FlatList.\n const data = [...messages].reverse();\n\n const handleRender: ListRenderItem<Message> = useCallback(\n ({ item, index }) => renderItem(item, messages.length - 1 - index),\n [renderItem, messages.length],\n );\n\n if (loading && messages.length === 0) {\n return (\n <View style={[styles.placeholder, { backgroundColor: theme.colors.paper }]}>\n <ActivityIndicator color={theme.colors.brand} />\n </View>\n );\n }\n\n if (messages.length === 0) {\n return (\n <View style={[styles.placeholder, { backgroundColor: theme.colors.paper }]}>\n {typeof emptyState === 'string' ? (\n <Text style={{ color: theme.colors.ink3, fontFamily: theme.type.fontBody }}>\n {emptyState}\n </Text>\n ) : (\n (emptyState ?? null)\n )}\n </View>\n );\n }\n\n return (\n <FlatList\n inverted\n data={data}\n keyExtractor={(item) => item.id}\n renderItem={handleRender}\n onEndReached={hasMore ? onLoadMore : undefined}\n onEndReachedThreshold={0.3}\n // `inverted` flips the list, so FlatList's ListHeaderComponent\n // renders at the bottom of the screen (above the latest message,\n // next to the composer) and ListFooterComponent renders at the\n // top (above the oldest message). That matches our prop names.\n ListHeaderComponent={ListHeader}\n ListFooterComponent={\n <View>\n {hasMore && loading ? (\n <ActivityIndicator color={theme.colors.ink3} style={{ marginVertical: 8 }} />\n ) : null}\n {ListFooter}\n </View>\n }\n style={{ backgroundColor: theme.colors.paper }}\n contentContainerStyle={{ paddingVertical: 8 }}\n />\n );\n}\n\nconst styles = StyleSheet.create({\n placeholder: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n padding: 24,\n },\n});\n","import type { Message } from '@poolse/sdk';\nimport { useState } from 'react';\nimport { Pressable, StyleSheet, Text, TextInput, View } from 'react-native';\n\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport interface EditableMessageBubbleProps {\n message: Message;\n currentUserId: string | null;\n onCancel: () => void;\n onSave: (body: string) => Promise<unknown> | void;\n}\n\nexport function EditableMessageBubble({\n message,\n currentUserId,\n onCancel,\n onSave,\n}: EditableMessageBubbleProps) {\n const theme = usePoolseTheme();\n const isSelf = currentUserId !== null && message.sender_id === currentUserId;\n const [value, setValue] = useState(message.body ?? '');\n const [saving, setSaving] = useState(false);\n\n const submit = async () => {\n if (saving || !value.trim()) return;\n setSaving(true);\n try {\n await onSave(value.trim());\n } finally {\n setSaving(false);\n }\n };\n\n const bg = isSelf ? theme.colors.selfBubble : theme.colors.otherBubble;\n const ink = isSelf ? theme.colors.selfBubbleText : theme.colors.otherBubbleText;\n\n return (\n <View\n style={[\n styles.wrap,\n {\n alignSelf: isSelf ? 'flex-end' : 'flex-start',\n maxWidth: '80%',\n },\n ]}\n >\n <View\n style={[\n styles.bubble,\n {\n backgroundColor: bg,\n borderRadius: theme.radii.bubble,\n paddingHorizontal: theme.spacing.md,\n paddingVertical: theme.spacing.sm,\n },\n theme.shadows.sm,\n ]}\n >\n <TextInput\n value={value}\n onChangeText={setValue}\n multiline\n autoFocus\n style={{\n color: ink,\n fontFamily: theme.type.fontBody,\n fontSize: theme.type.bodySize,\n minHeight: 24,\n }}\n />\n <View style={styles.actions}>\n <Pressable onPress={onCancel} hitSlop={6}>\n <Text style={[styles.btn, { color: ink, opacity: 0.7 }]}>Cancel</Text>\n </Pressable>\n <Pressable onPress={submit} disabled={saving} hitSlop={6}>\n <Text style={[styles.btn, { color: ink, fontWeight: '700' }]}>\n {saving ? 'Saving…' : 'Save'}\n </Text>\n </Pressable>\n </View>\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n wrap: {\n marginBottom: 4,\n },\n bubble: {},\n actions: {\n flexDirection: 'row',\n justifyContent: 'flex-end',\n gap: 12,\n marginTop: 6,\n },\n btn: {\n fontSize: 13,\n },\n});\n","import { Modal, Pressable, StyleSheet, Text, View } from 'react-native';\n\nimport { PoolseIcon, type IconName } from './primitives/PoolseIcon.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nconst DEFAULT_REACTION_EMOJIS = ['👍', '❤️', '😂', '🎉', '🙏', '🔥'];\n\nexport interface MessageActionsProps {\n visible: boolean;\n onClose: () => void;\n isSelf: boolean;\n /**\n * Quick-reaction emoji row rendered at the top of the sheet. Tap\n * one to fire `onPickReaction(emoji)` and immediately close. When\n * omitted (or `onPickReaction` is omitted) the row is hidden.\n */\n emojis?: string[];\n onPickReaction?: (emoji: string) => void;\n onReply?: () => void;\n onReplyInThread?: () => void;\n onQuote?: () => void;\n onEdit?: () => void;\n onDelete?: () => void;\n onCopy?: () => void;\n}\n\n/**\n * Long-press action menu — modal bottom sheet. Renders a row of\n * quick-react emojis at the top (one tap reacts + closes) plus the\n * action items below. Matches WhatsApp / iMessage's \"long-press\n * shows everything inline\" pattern.\n */\nexport function MessageActions({\n visible,\n onClose,\n isSelf,\n emojis = DEFAULT_REACTION_EMOJIS,\n onPickReaction,\n onReply,\n onReplyInThread,\n onQuote,\n onEdit,\n onDelete,\n onCopy,\n}: MessageActionsProps) {\n const theme = usePoolseTheme();\n const items: Array<{ label: string; icon: IconName; onPress: () => void; danger?: boolean }> = [];\n if (onReply) items.push({ label: 'Reply', icon: 'reply', onPress: onReply });\n if (onQuote) items.push({ label: 'Quote reply', icon: 'reply', onPress: onQuote });\n if (onReplyInThread)\n items.push({ label: 'Reply in thread', icon: 'messages', onPress: onReplyInThread });\n if (onCopy) items.push({ label: 'Copy text', icon: 'copy', onPress: onCopy });\n if (isSelf && onEdit) items.push({ label: 'Edit', icon: 'edit', onPress: onEdit });\n if (isSelf && onDelete)\n items.push({ label: 'Delete', icon: 'trash', onPress: onDelete, danger: true });\n\n const showEmojiRow = !!onPickReaction && emojis.length > 0;\n\n return (\n <Modal visible={visible} transparent animationType=\"fade\" onRequestClose={onClose}>\n <Pressable style={styles.backdrop} onPress={onClose}>\n <View\n style={[\n styles.sheet,\n {\n backgroundColor: theme.colors.surface,\n borderTopLeftRadius: theme.radii.lg,\n borderTopRightRadius: theme.radii.lg,\n },\n theme.shadows.lg,\n ]}\n >\n {showEmojiRow ? (\n <View style={[styles.emojiRow, { borderBottomColor: theme.colors.border }]}>\n {emojis.map((emoji) => (\n <Pressable\n key={emoji}\n onPress={() => {\n onPickReaction(emoji);\n onClose();\n }}\n style={styles.emojiBtn}\n hitSlop={6}\n accessibilityLabel={`React with ${emoji}`}\n >\n <Text style={styles.emoji}>{emoji}</Text>\n </Pressable>\n ))}\n </View>\n ) : null}\n\n {items.map((item) => (\n <Pressable key={item.label} onPress={item.onPress} style={styles.item}>\n <PoolseIcon\n name={item.icon}\n size={18}\n color={item.danger ? theme.colors.error : theme.colors.ink2}\n />\n <Text\n style={[\n styles.itemText,\n {\n color: item.danger ? theme.colors.error : theme.colors.ink,\n fontFamily: theme.type.fontBody,\n },\n ]}\n >\n {item.label}\n </Text>\n </Pressable>\n ))}\n </View>\n </Pressable>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n backdrop: {\n flex: 1,\n backgroundColor: 'rgba(0,0,0,0.35)',\n justifyContent: 'flex-end',\n },\n sheet: {\n paddingTop: 8,\n paddingBottom: 24,\n },\n emojiRow: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-around',\n paddingHorizontal: 12,\n paddingVertical: 10,\n borderBottomWidth: StyleSheet.hairlineWidth,\n marginBottom: 6,\n },\n emojiBtn: {\n paddingHorizontal: 6,\n paddingVertical: 6,\n borderRadius: 999,\n alignItems: 'center',\n justifyContent: 'center',\n },\n emoji: {\n fontSize: 30,\n lineHeight: 36,\n },\n item: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 20,\n paddingVertical: 14,\n gap: 14,\n },\n itemText: {\n fontSize: 15,\n fontWeight: '500',\n },\n});\n","import type { Attachment } from '@poolse/sdk';\nimport { useAttachmentUrl } from '@poolse/react';\nimport { Image, Pressable, StyleSheet, Text, View } from 'react-native';\n\nimport { PoolseIcon } from './primitives/PoolseIcon.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport interface AttachmentPreviewProps {\n attachment: Attachment;\n /** Optional tap handler. For images defaults to opening the source URL. */\n onPress?: () => void;\n /** Render at this max width. Defaults to 280. */\n maxWidth?: number;\n}\n\nexport function AttachmentPreview({ attachment, onPress, maxWidth = 280 }: AttachmentPreviewProps) {\n const theme = usePoolseTheme();\n const isImage = (attachment.content_type ?? '').startsWith('image/');\n const { url } = useAttachmentUrl(attachment.id);\n\n if (isImage) {\n return (\n <Pressable onPress={onPress} disabled={!onPress}>\n {url ? (\n <Image\n source={{ uri: url }}\n style={{\n width: maxWidth,\n height: 200,\n borderRadius: theme.radii.md,\n backgroundColor: theme.colors.surface2,\n }}\n resizeMode=\"cover\"\n accessible\n accessibilityLabel={attachment.original_filename ?? 'attachment image'}\n />\n ) : (\n <View\n style={[\n styles.imagePlaceholder,\n {\n width: maxWidth,\n height: 200,\n borderRadius: theme.radii.md,\n backgroundColor: theme.colors.surface2,\n },\n ]}\n />\n )}\n </Pressable>\n );\n }\n\n return (\n <Pressable\n onPress={onPress}\n disabled={!onPress}\n style={[\n styles.fileCard,\n {\n backgroundColor: theme.colors.surface2,\n borderColor: theme.colors.border,\n borderRadius: theme.radii.md,\n },\n ]}\n >\n <PoolseIcon name=\"attachment\" size={18} color={theme.colors.ink2} />\n <View style={{ flex: 1, marginLeft: 8 }}>\n <Text\n style={[styles.fileName, { color: theme.colors.ink, fontFamily: theme.type.fontBody }]}\n numberOfLines={1}\n >\n {attachment.original_filename ?? 'file'}\n </Text>\n <Text style={[styles.fileSize, { color: theme.colors.ink3 }]}>\n {formatBytes(attachment.byte_size)}\n </Text>\n </View>\n </Pressable>\n );\n}\n\nfunction formatBytes(n: number): string {\n if (n < 1024) return `${n} B`;\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB`;\n if (n < 1024 * 1024 * 1024) return `${(n / 1024 / 1024).toFixed(1)} MB`;\n return `${(n / 1024 / 1024 / 1024).toFixed(1)} GB`;\n}\n\nconst styles = StyleSheet.create({\n imagePlaceholder: {},\n fileCard: {\n flexDirection: 'row',\n alignItems: 'center',\n padding: 8,\n borderWidth: StyleSheet.hairlineWidth,\n },\n fileName: {\n fontSize: 13,\n fontWeight: '500',\n },\n fileSize: {\n fontSize: 11,\n },\n});\n","import type { Attachment } from '@poolse/sdk';\nimport { useAttachmentUrl } from '@poolse/react';\nimport { useState } from 'react';\nimport { Dimensions, Image, Modal, Pressable, StyleSheet, Text, View } from 'react-native';\n\nimport { PoolseIcon } from './primitives/PoolseIcon.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport interface ImageMosaicProps {\n images: Attachment[];\n /**\n * Pixel ceiling on the mosaic's width. The mosaic itself fills its\n * parent (`width: '100%'`) and caps at this value, so it always\n * fits inside whatever the bubble's actual content area is at\n * render time — no more hardcoded 280px overflowing on small\n * screens or inside narrow bubbles.\n */\n maxWidth?: number;\n radius?: number;\n}\n\n/**\n * WhatsApp-style multi-image grid for inside the message bubble.\n * Uses flex-based widths (with `%` and `aspectRatio`) so the layout\n * scales to whatever the bubble's content area is — no fixed pixel\n * positioning that can overflow when the bubble is narrower than\n * the configured max.\n *\n * * n = 1 → single tile, 16:10 aspect.\n * * n = 2 → row of 2 squares.\n * * n = 3 → 16:9 hero on top + row of 2 squares below.\n * * n ≥ 4 → 2×2 grid with \"+N more\" overlay on the 4th tile.\n */\nexport function ImageMosaic({ images, maxWidth, radius }: ImageMosaicProps) {\n const theme = usePoolseTheme();\n const r = radius ?? theme.radii.md;\n const [viewerIndex, setViewerIndex] = useState<number | null>(null);\n\n if (images.length === 0) return null;\n\n const visible = images.slice(0, 4);\n const overflow = images.length > 4 ? images.length - 4 : 0;\n const n = visible.length as 1 | 2 | 3 | 4;\n\n return (\n <>\n <View\n style={[\n styles.root,\n {\n borderRadius: r,\n ...(maxWidth ? { maxWidth } : {}),\n },\n ]}\n >\n {n === 1 ? (\n <Tile\n attachment={visible[0]!}\n style={styles.tileFull}\n onPress={() => setViewerIndex(0)}\n overlay={null}\n />\n ) : null}\n\n {n === 2 ? (\n <View style={styles.rowEven}>\n <Tile\n attachment={visible[0]!}\n style={styles.tileHalfSquare}\n onPress={() => setViewerIndex(0)}\n overlay={null}\n />\n <Tile\n attachment={visible[1]!}\n style={styles.tileHalfSquare}\n onPress={() => setViewerIndex(1)}\n overlay={null}\n />\n </View>\n ) : null}\n\n {n === 3 ? (\n <>\n <Tile\n attachment={visible[0]!}\n style={styles.tileHero}\n onPress={() => setViewerIndex(0)}\n overlay={null}\n />\n <View style={[styles.rowEven, { marginTop: 2 }]}>\n <Tile\n attachment={visible[1]!}\n style={styles.tileHalfSquare}\n onPress={() => setViewerIndex(1)}\n overlay={null}\n />\n <Tile\n attachment={visible[2]!}\n style={styles.tileHalfSquare}\n onPress={() => setViewerIndex(2)}\n overlay={null}\n />\n </View>\n </>\n ) : null}\n\n {n === 4 ? (\n <>\n <View style={styles.rowEven}>\n <Tile\n attachment={visible[0]!}\n style={styles.tileHalfSquare}\n onPress={() => setViewerIndex(0)}\n overlay={null}\n />\n <Tile\n attachment={visible[1]!}\n style={styles.tileHalfSquare}\n onPress={() => setViewerIndex(1)}\n overlay={null}\n />\n </View>\n <View style={[styles.rowEven, { marginTop: 2 }]}>\n <Tile\n attachment={visible[2]!}\n style={styles.tileHalfSquare}\n onPress={() => setViewerIndex(2)}\n overlay={null}\n />\n <Tile\n attachment={visible[3]!}\n style={styles.tileHalfSquare}\n onPress={() => setViewerIndex(3)}\n overlay={overflow > 0 ? `+${overflow}` : null}\n />\n </View>\n </>\n ) : null}\n </View>\n\n <Modal\n visible={viewerIndex !== null}\n transparent\n animationType=\"fade\"\n onRequestClose={() => setViewerIndex(null)}\n >\n {viewerIndex !== null ? (\n <FullScreenViewer\n attachment={images[viewerIndex]!}\n onClose={() => setViewerIndex(null)}\n />\n ) : null}\n </Modal>\n </>\n );\n}\n\nfunction Tile({\n attachment,\n style,\n overlay,\n onPress,\n}: {\n attachment: Attachment;\n style: object;\n overlay: string | null;\n onPress: () => void;\n}) {\n const theme = usePoolseTheme();\n const { url } = useAttachmentUrl(attachment.id);\n return (\n <Pressable onPress={onPress} style={[styles.tileBase, style]}>\n {url ? (\n <Image\n source={{ uri: url }}\n style={[styles.tileImage, { backgroundColor: theme.colors.surface2 }]}\n resizeMode=\"cover\"\n accessible\n accessibilityLabel={attachment.original_filename ?? 'image'}\n />\n ) : (\n <View style={[styles.tileImage, { backgroundColor: theme.colors.surface2 }]} />\n )}\n {overlay ? (\n <View style={styles.overflow}>\n <Text style={styles.overflowText}>{overlay}</Text>\n </View>\n ) : null}\n </Pressable>\n );\n}\n\nfunction FullScreenViewer({\n attachment,\n onClose,\n}: {\n attachment: Attachment;\n onClose: () => void;\n}) {\n const { url } = useAttachmentUrl(attachment.id);\n const { width, height } = Dimensions.get('window');\n return (\n <Pressable style={styles.viewer} onPress={onClose}>\n {url ? (\n <Image\n source={{ uri: url }}\n style={{ width, height }}\n resizeMode=\"contain\"\n accessible\n accessibilityLabel={attachment.original_filename ?? 'image'}\n />\n ) : null}\n <Pressable\n onPress={onClose}\n hitSlop={12}\n style={styles.closeBtn}\n accessibilityLabel=\"Close viewer\"\n >\n <PoolseIcon name=\"close\" size={20} color=\"#ffffff\" />\n </Pressable>\n </Pressable>\n );\n}\n\nconst styles = StyleSheet.create({\n root: {\n width: '100%',\n overflow: 'hidden',\n marginBottom: 4,\n },\n rowEven: {\n flexDirection: 'row',\n gap: 2,\n },\n tileBase: {\n overflow: 'hidden',\n },\n // n=1: full bleed at the bubble's available width, 16:10 aspect.\n tileFull: {\n width: '100%',\n aspectRatio: 16 / 10,\n },\n // n=2 / n=4 (per row): two equal squares side-by-side.\n tileHalfSquare: {\n flex: 1,\n aspectRatio: 1,\n },\n // n=3 hero: full-bleed top tile, 16:9.\n tileHero: {\n width: '100%',\n aspectRatio: 16 / 9,\n },\n tileImage: {\n width: '100%',\n height: '100%',\n },\n overflow: {\n position: 'absolute',\n inset: 0,\n backgroundColor: 'rgba(0,0,0,0.55)',\n alignItems: 'center',\n justifyContent: 'center',\n },\n overflowText: {\n color: '#ffffff',\n fontWeight: '700',\n fontSize: 22,\n },\n viewer: {\n flex: 1,\n backgroundColor: '#000000',\n alignItems: 'center',\n justifyContent: 'center',\n },\n closeBtn: {\n position: 'absolute',\n top: 48,\n right: 16,\n padding: 8,\n backgroundColor: 'rgba(0,0,0,0.5)',\n borderRadius: 20,\n },\n});\n","import type { Message, QuotedMessagePreview, Uuid } from '@poolse/sdk';\nimport { useUser } from '@poolse/react';\nimport { useState, type ReactNode } from 'react';\nimport { Pressable, StyleSheet, Text, useWindowDimensions, View } from 'react-native';\n\nimport { AttachmentPreview } from './AttachmentPreview.js';\nimport { ImageMosaic } from './ImageMosaic.js';\nimport { PoolseIcon } from './primitives/PoolseIcon.js';\nimport { userColor } from './primitives/userColor.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport type BubbleGroupPosition = 'first' | 'middle' | 'last' | 'standalone';\n\nexport interface MessageBubbleProps {\n message: Message;\n /** Used to decide left/right alignment, color, and read-receipt visibility. */\n currentUserId: string | null;\n /** `'sent'` → single tick, `'read'` → double tick (theme.colors.brand). */\n readState?: 'sent' | 'read';\n /** Label resolver keyed by `external_id` — falls back to the externalId itself. */\n labelFor?: (externalId: string) => string;\n /** Quoted-card tap handler. Typically used to scroll the list to the original message. */\n onQuotedClick?: (quotedMessageId: Uuid) => void;\n /** Position in a same-sender cluster — drives tail-corner rendering. */\n groupPosition?: BubbleGroupPosition;\n /** Truncate at this many chars and show a \"Read more\" toggle. Defaults to 0 (off). */\n maxBodyLength?: number;\n /** Show a colored sender label above other-side bubbles. Only meaningful in group chats. */\n showSenderName?: boolean;\n /** Slot for an actions trigger — typically a chevron rendered by `<MessageRow>`. */\n actionsTrigger?: ReactNode;\n /** Render in-bubble attachments (images, file cards). Defaults to true. */\n showAttachments?: boolean;\n}\n\nexport function MessageBubble({\n message,\n currentUserId,\n readState,\n labelFor,\n onQuotedClick,\n groupPosition = 'standalone',\n maxBodyLength = 0,\n showSenderName = false,\n actionsTrigger,\n showAttachments = true,\n}: MessageBubbleProps) {\n const theme = usePoolseTheme();\n const { width: screenWidth } = useWindowDimensions();\n const isSelf = currentUserId !== null && message.sender_id === currentUserId;\n const [expanded, setExpanded] = useState(false);\n\n // Pixel-based bubble cap pinned to screen width, not to a\n // percentage of an ambiguously-sized parent. Was '88%' on the\n // wrap which resolves to 88% of the bubbleCol — and bubbleCol's\n // width changes with the row's padding, so bumping row padding\n // shrunk multi-line bubbles disproportionately. With a fixed\n // pixel maxWidth + alignSelf:flex-end, single-line and multi-line\n // both hit the same right edge regardless of nesting.\n const bubbleMaxWidth = Math.floor(screenWidth * 0.78);\n // Image / file preview width is bubble width minus the 28px\n // horizontal padding. Use flex '100%' style with a numeric ceiling\n // so the mosaic adapts to the actual rendered bubble.\n const contentMaxWidth = bubbleMaxWidth - 28;\n\n const sender = useUser(!isSelf ? message.sender_external_id : null);\n const senderFallbackName = message.sender_external_id ?? 'Unknown';\n const senderLabel =\n sender.profile?.displayName ??\n (message.sender_external_id\n ? (labelFor?.(message.sender_external_id) ?? senderFallbackName)\n : senderFallbackName);\n const senderTint = userColor(message.sender_external_id ?? message.sender_id ?? message.id);\n\n const tailCorner = groupPosition === 'last' || groupPosition === 'standalone';\n const bubbleColor = isSelf ? theme.colors.selfBubble : theme.colors.otherBubble;\n const textColor = isSelf ? theme.colors.selfBubbleText : theme.colors.otherBubbleText;\n\n const radii = {\n topLeft: theme.radii.bubble,\n topRight: theme.radii.bubble,\n bottomLeft: theme.radii.bubble,\n bottomRight: theme.radii.bubble,\n };\n if (tailCorner) {\n if (isSelf) radii.bottomRight = 4;\n else radii.bottomLeft = 4;\n }\n\n const body = message.body ?? '';\n const truncated =\n maxBodyLength > 0 && body.length > maxBodyLength && !expanded\n ? body.slice(0, maxBodyLength) + '…'\n : body;\n\n const time = formatTime(message.inserted_at);\n const isDeleted = !!message.deleted_at;\n const isEdited = !!message.edited_at && !isDeleted;\n\n const images = (message.attachments ?? []).filter((a) => isImageContentType(a.content_type));\n const files = (message.attachments ?? []).filter((a) => !isImageContentType(a.content_type));\n const renderAttachments = showAttachments && (images.length > 0 || files.length > 0);\n\n return (\n <View\n style={[\n styles.wrap,\n {\n alignSelf: isSelf ? 'flex-end' : 'flex-start',\n // Pixel maxWidth (not percentage) so single-line and\n // multi-line bubbles land at the same right edge — was\n // 88% of the bubbleCol which produced inconsistent right\n // padding when the row padding changed.\n maxWidth: bubbleMaxWidth,\n },\n ]}\n >\n <View\n style={[\n styles.bubble,\n {\n backgroundColor: bubbleColor,\n borderColor: isSelf ? 'transparent' : theme.colors.border,\n borderWidth: isSelf ? 0 : StyleSheet.hairlineWidth,\n borderTopLeftRadius: radii.topLeft,\n borderTopRightRadius: radii.topRight,\n borderBottomLeftRadius: radii.bottomLeft,\n borderBottomRightRadius: radii.bottomRight,\n // Slightly more breathing room — 14/10 reads tighter and\n // matches the iMessage / WhatsApp bubble density.\n paddingHorizontal: 14,\n paddingVertical: 10,\n // Floor the bubble at a width that always fits the meta row\n // (\"edited HH:MM ✓✓\" → ~110px). Without this, short bodies\n // like \"ok\" produce a bubble too narrow for the meta to lay\n // out, and `edited` or the time gets clipped.\n minWidth: isSelf && isEdited ? 130 : 90,\n },\n theme.shadows.sm,\n ]}\n >\n {showSenderName &&\n !isSelf &&\n (groupPosition === 'first' || groupPosition === 'standalone') ? (\n <Text style={[styles.senderName, { color: senderTint, fontFamily: theme.type.fontBody }]}>\n {senderLabel}\n </Text>\n ) : null}\n\n {message.quoted_message ? (\n <QuotedCard\n quoted={message.quoted_message}\n isSelf={isSelf}\n {...(labelFor ? { labelFor } : {})}\n {...(onQuotedClick ? { onPress: () => onQuotedClick(message.quoted_message!.id) } : {})}\n />\n ) : null}\n\n {renderAttachments && images.length > 0 ? (\n <ImageMosaic images={images} maxWidth={contentMaxWidth} />\n ) : null}\n\n {renderAttachments && files.length > 0 ? (\n <View style={{ gap: theme.spacing.xs, marginBottom: theme.spacing.xs }}>\n {files.map((att) => (\n <AttachmentPreview key={att.id} attachment={att} maxWidth={contentMaxWidth} />\n ))}\n </View>\n ) : null}\n\n {body.length > 0 ? (\n <Text\n style={[\n styles.body,\n {\n color: isDeleted ? theme.colors.ink3 : textColor,\n fontFamily: theme.type.fontBody,\n fontSize: theme.type.bodySize,\n lineHeight: theme.type.lineHeight,\n fontStyle: isDeleted ? 'italic' : 'normal',\n },\n ]}\n >\n {isDeleted ? 'Message deleted' : truncated}\n </Text>\n ) : null}\n\n {maxBodyLength > 0 && body.length > maxBodyLength ? (\n <Pressable onPress={() => setExpanded((e) => !e)}>\n <Text\n style={[\n styles.readMore,\n { color: isSelf ? theme.colors.onBrand : theme.colors.brand },\n ]}\n >\n {expanded ? 'Show less' : 'Read more'}\n </Text>\n </Pressable>\n ) : null}\n\n <View style={styles.metaRow}>\n {isEdited ? (\n <Text\n style={[\n styles.editedTag,\n {\n color: isSelf ? theme.colors.onBrand : theme.colors.ink3,\n opacity: 0.7,\n },\n ]}\n >\n edited\n </Text>\n ) : null}\n <Text\n style={[\n styles.meta,\n {\n color: isSelf ? theme.colors.onBrand : theme.colors.ink3,\n opacity: isSelf ? 0.85 : 1,\n },\n ]}\n >\n {time}\n </Text>\n {isSelf && readState ? (\n <View style={styles.readTick}>\n <PoolseIcon\n name={readState === 'read' ? 'check-double' : 'check'}\n size={13}\n color={theme.colors.onBrand}\n />\n </View>\n ) : null}\n </View>\n\n {actionsTrigger ? <View style={styles.actionsSlot}>{actionsTrigger}</View> : null}\n </View>\n </View>\n );\n}\n\nfunction QuotedCard({\n quoted,\n isSelf,\n labelFor,\n onPress,\n}: {\n quoted: QuotedMessagePreview;\n isSelf: boolean;\n labelFor?: (externalId: string) => string;\n onPress?: () => void;\n}) {\n const theme = usePoolseTheme();\n // Priority: explicit prop > SDK userResolver > externalId fallback.\n const resolved = useUser(quoted.sender_external_id);\n const senderName = quoted.sender_external_id\n ? (labelFor?.(quoted.sender_external_id) ??\n resolved.profile?.displayName ??\n quoted.sender_external_id)\n : 'Unknown';\n const bg = isSelf ? 'rgba(255,255,255,0.18)' : theme.colors.surface2;\n const accent = isSelf ? theme.colors.onBrand : theme.colors.brand;\n const txt = isSelf ? theme.colors.onBrand : theme.colors.ink;\n return (\n <Pressable\n onPress={onPress}\n disabled={!onPress}\n style={[\n styles.quoted,\n {\n backgroundColor: bg,\n borderLeftColor: accent,\n },\n ]}\n >\n <Text style={[styles.quotedSender, { color: accent }]}>{senderName}</Text>\n <Text style={[styles.quotedBody, { color: txt }]} numberOfLines={2}>\n {quoted.body ?? '…'}\n </Text>\n </Pressable>\n );\n}\n\nfunction isImageContentType(ct: string | null | undefined): boolean {\n if (!ct) return false;\n return ct.startsWith('image/');\n}\n\n// HH:MM if same calendar day, \"Yesterday HH:MM\" if yesterday, \"Mon DD\"\n// if older than a week, otherwise weekday abbreviation. Matches the\n// WhatsApp / iMessage convention — short enough to fit in the meta\n// row, long enough to be useful at a glance.\nfunction formatTime(iso: string): string {\n try {\n const d = new Date(iso);\n const now = new Date();\n const sameDay = isSameDay(d, now);\n const time = d.toLocaleTimeString([], { hour: 'numeric', minute: '2-digit' });\n if (sameDay) return time;\n\n const yesterday = new Date(now);\n yesterday.setDate(now.getDate() - 1);\n if (isSameDay(d, yesterday)) return `Yesterday ${time}`;\n\n const diffMs = now.getTime() - d.getTime();\n const diffDays = Math.floor(diffMs / 86_400_000);\n if (diffDays < 7) {\n return `${d.toLocaleDateString([], { weekday: 'short' })} ${time}`;\n }\n return d.toLocaleDateString([], { month: 'short', day: 'numeric' });\n } catch {\n return '';\n }\n}\n\nfunction isSameDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\nconst styles = StyleSheet.create({\n wrap: {\n marginBottom: 2,\n },\n bubble: {\n position: 'relative',\n },\n senderName: {\n fontSize: 12,\n fontWeight: '600',\n marginBottom: 2,\n },\n body: {\n flexShrink: 1,\n },\n readMore: {\n fontSize: 12,\n fontWeight: '600',\n marginTop: 4,\n },\n metaRow: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'flex-end',\n marginTop: 6,\n gap: 5,\n flexShrink: 0,\n },\n meta: {\n fontSize: 11,\n fontVariant: ['tabular-nums'],\n includeFontPadding: false,\n },\n editedTag: {\n fontSize: 10,\n fontStyle: 'italic',\n letterSpacing: 0.1,\n },\n readTick: {\n marginLeft: 2,\n marginTop: 1,\n },\n actionsSlot: {\n position: 'absolute',\n top: 4,\n right: 4,\n },\n quoted: {\n borderLeftWidth: 3,\n paddingLeft: 8,\n paddingVertical: 4,\n paddingRight: 6,\n marginBottom: 6,\n borderRadius: 4,\n },\n quotedSender: {\n fontSize: 12,\n fontWeight: '600',\n marginBottom: 2,\n },\n quotedBody: {\n fontSize: 12,\n opacity: 0.85,\n },\n});\n","import type { Uuid } from '@poolse/sdk';\nimport { useReactions } from '@poolse/react';\nimport { Modal, Pressable, StyleSheet, Text, View } from 'react-native';\n\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nconst DEFAULT_EMOJIS = ['👍', '❤️', '😂', '🎉', '🙏', '🔥'];\n\nexport interface ReactionStripProps {\n messageId: Uuid;\n conversationId: Uuid;\n meId: string | null;\n /** Seed map from a known message (e.g. `useMessages`). */\n initialReactions?: Record<string, Uuid[]>;\n}\n\nexport function ReactionStrip({\n messageId,\n conversationId,\n meId,\n initialReactions,\n}: ReactionStripProps) {\n const theme = usePoolseTheme();\n const { reactions, addReaction, removeReaction } = useReactions(messageId, {\n conversationId,\n currentUserId: meId,\n ...(initialReactions ? { initialReactions } : {}),\n });\n const entries = Object.entries(reactions);\n if (entries.length === 0) return null;\n\n return (\n <View style={styles.strip}>\n {entries.map(([emoji, userIds]) => {\n const userArr = Array.isArray(userIds) ? userIds : [];\n const meReacted = meId !== null && userArr.includes(meId);\n return (\n <Pressable\n key={emoji}\n onPress={() => (meReacted ? removeReaction(emoji) : addReaction(emoji))}\n style={[\n styles.chip,\n {\n backgroundColor: meReacted ? theme.colors.brandSoft : theme.colors.surface2,\n borderColor: meReacted ? theme.colors.brand : theme.colors.border,\n },\n ]}\n >\n <Text style={styles.emoji}>{emoji}</Text>\n <Text style={[styles.count, { color: theme.colors.ink2 }]}>{userArr.length}</Text>\n </Pressable>\n );\n })}\n </View>\n );\n}\n\nexport interface ReactionPickerProps {\n visible: boolean;\n onClose: () => void;\n onPick: (emoji: string) => void;\n /** Override the default 6-emoji set. */\n emojis?: string[];\n}\n\nexport function ReactionPicker({\n visible,\n onClose,\n onPick,\n emojis = DEFAULT_EMOJIS,\n}: ReactionPickerProps) {\n const theme = usePoolseTheme();\n return (\n <Modal visible={visible} transparent animationType=\"fade\" onRequestClose={onClose}>\n <Pressable style={styles.backdrop} onPress={onClose}>\n <View\n style={[\n styles.sheet,\n {\n backgroundColor: theme.colors.surface,\n borderRadius: theme.radii.lg,\n },\n theme.shadows.lg,\n ]}\n >\n {emojis.map((emoji) => (\n <Pressable\n key={emoji}\n style={styles.emojiBtn}\n onPress={() => {\n onPick(emoji);\n onClose();\n }}\n >\n <Text style={styles.bigEmoji}>{emoji}</Text>\n </Pressable>\n ))}\n </View>\n </Pressable>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n strip: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: 4,\n marginTop: 2,\n },\n chip: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 9,\n paddingVertical: 4,\n borderRadius: 14,\n borderWidth: 1,\n gap: 5,\n minHeight: 26,\n // Subtle elevation so chips lift off the surface\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 1 },\n shadowOpacity: 0.06,\n shadowRadius: 2,\n elevation: 1,\n },\n emoji: {\n fontSize: 15,\n lineHeight: 18,\n },\n count: {\n fontSize: 12,\n fontWeight: '600',\n fontVariant: ['tabular-nums'],\n },\n backdrop: {\n flex: 1,\n backgroundColor: 'rgba(0,0,0,0.4)',\n justifyContent: 'center',\n alignItems: 'center',\n paddingHorizontal: 24,\n },\n sheet: {\n flexDirection: 'row',\n paddingHorizontal: 12,\n paddingVertical: 12,\n gap: 4,\n alignItems: 'center',\n },\n emojiBtn: {\n paddingHorizontal: 8,\n paddingVertical: 6,\n borderRadius: 999,\n alignItems: 'center',\n justifyContent: 'center',\n },\n bigEmoji: {\n fontSize: 32,\n lineHeight: 38,\n },\n});\n","import { Animated, PanResponder, Pressable, StyleSheet, Text, View } from 'react-native';\nimport type { Message, Uuid } from '@poolse/sdk';\nimport { useMemo, useRef, useState } from 'react';\n\nimport { Avatar } from './primitives/Avatar.js';\nimport { EditableMessageBubble } from './EditableMessageBubble.js';\nimport { MessageActions } from './MessageActions.js';\nimport { MessageBubble, type BubbleGroupPosition } from './MessageBubble.js';\nimport { PoolseIcon } from './primitives/PoolseIcon.js';\nimport { ReactionStrip } from './Reactions.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\nimport { useReactions, useUser } from '@poolse/react';\n\n// Swipe-to-reply triggers at this much horizontal pull. iOS / WhatsApp\n// use 50–60px; the lower bound feels lighter for one-handed thumb use.\nconst SWIPE_REPLY_THRESHOLD = 50;\n\nexport interface MessageRowProps {\n msg: Message;\n meId: string | null;\n\n // Feature toggles — same set as ConversationView's, but per-row.\n reactions?: boolean;\n attachments?: boolean;\n actions?: boolean;\n /** Pass false in ThreadView since nested threads aren't a thing in v1. */\n threads?: boolean;\n /** WhatsApp-style quote-reply. Defaults true on ConversationView. */\n quotations?: boolean;\n\n readState?: 'sent' | 'read';\n\n editing?: boolean;\n onStartEdit?: () => void;\n onCancelEdit?: () => void;\n onSaveEdit?: (body: string) => Promise<unknown> | void;\n onDelete?: () => void;\n onOpenThread?: () => void;\n onQuote?: () => void;\n labelFor?: (externalId: string) => string;\n onQuotedClick?: (quotedMessageId: Uuid) => void;\n groupPosition?: BubbleGroupPosition;\n maxBodyLength?: number;\n /** Show a colored sender label above other-side bubbles. */\n showSenderName?: boolean;\n /** Render an avatar to the LEFT of other-side bubbles. */\n showAvatar?: boolean;\n /** Avatar resolver — same signature as `<MemberList avatarFor>`. */\n avatarFor?: (externalId: string) => string | null;\n}\n\nexport function MessageRow({\n msg,\n meId,\n reactions = true,\n attachments = true,\n actions = true,\n threads = true,\n quotations = true,\n readState,\n editing = false,\n onStartEdit,\n onCancelEdit,\n onSaveEdit,\n onDelete,\n onOpenThread,\n onQuote,\n labelFor,\n onQuotedClick,\n groupPosition = 'standalone',\n maxBodyLength = 0,\n showSenderName = false,\n showAvatar = false,\n avatarFor,\n}: MessageRowProps) {\n const theme = usePoolseTheme();\n const isSelf = meId !== null && msg.sender_id === meId;\n const [actionsOpen, setActionsOpen] = useState(false);\n\n // Per-row useReactions subscription so the long-press → React picker\n // and the inline ReactionStrip share the same realtime state. Adds\n // one realtime listener per visible row, which is fine — they're\n // server-filtered by messageId and the FlatList only mounts rows in\n // view. Initial seed comes from msg.reactions so the strip renders\n // immediately without waiting for the first echo.\n const reactionsApi = useReactions(msg.id, {\n conversationId: msg.conversation_id,\n currentUserId: meId,\n ...(msg.reactions ? { initialReactions: msg.reactions } : {}),\n });\n\n // Swipe-to-reply state. The bubble's translateX is driven by a pan\n // gesture; when the user releases past SWIPE_REPLY_THRESHOLD we fire\n // onQuote (which the parent wires to setReplyingTo on the composer).\n // Animation runs on the JS thread because we need to read the value\n // synchronously on release — native driver would prevent that.\n const translateX = useRef(new Animated.Value(0)).current;\n const swipeEnabled = quotations && !!onQuote && !editing;\n\n const panResponder = useMemo(\n () =>\n PanResponder.create({\n // Tap / long-press still go to the inner Pressable.\n onStartShouldSetPanResponder: () => false,\n onStartShouldSetPanResponderCapture: () => false,\n // Capture-phase claim: we intercept the gesture BEFORE the\n // child Pressable as soon as the move shows clear horizontal\n // intent. Without capture-phase, the Pressable's touch handling\n // wins first and the pan never starts (this is why self-bubble\n // left swipes felt totally dead — the Pressable was attached\n // to a touch that started with the user's finger over the\n // bubble center, and we never got a turn).\n onMoveShouldSetPanResponder: () => false,\n onMoveShouldSetPanResponderCapture: (_, g) => {\n if (!swipeEnabled) return false;\n // 4px is plenty to disambiguate from an accidental jitter\n // during a tap. `dx > dy` (not `dx > dy * 2`) so a slightly\n // diagonal pull still counts as horizontal — the user isn't\n // going to hold their finger to a perfect axis.\n return Math.abs(g.dx) > 4 && Math.abs(g.dx) > Math.abs(g.dy);\n },\n // Don't surrender the gesture mid-swipe (e.g. parent FlatList\n // asking for it back) — once we're translating the bubble we\n // hold on until release.\n onPanResponderTerminationRequest: () => false,\n // 1:1 finger-follow up to the threshold, then square-root\n // damping past it so the bubble never slides off-screen.\n // Matches iMessage / WhatsApp — feels weightless during the\n // committed range and stiffens once you've already triggered.\n onPanResponderMove: (_, g) => {\n const dx = isSelf ? Math.min(0, g.dx) : Math.max(0, g.dx);\n const abs = Math.abs(dx);\n let translated: number;\n if (abs <= SWIPE_REPLY_THRESHOLD) {\n translated = dx;\n } else {\n const excess = abs - SWIPE_REPLY_THRESHOLD;\n const dampened = SWIPE_REPLY_THRESHOLD + Math.sqrt(excess * 6);\n translated = dx < 0 ? -dampened : dampened;\n }\n translateX.setValue(translated);\n },\n onPanResponderRelease: (_, g) => {\n const past = Math.abs(g.dx) >= SWIPE_REPLY_THRESHOLD;\n if (past && onQuote) onQuote();\n Animated.spring(translateX, {\n toValue: 0,\n useNativeDriver: false,\n speed: 28,\n bounciness: 4,\n }).start();\n },\n onPanResponderTerminate: () => {\n Animated.spring(translateX, {\n toValue: 0,\n useNativeDriver: false,\n speed: 28,\n bounciness: 4,\n }).start();\n },\n }),\n [swipeEnabled, isSelf, onQuote, translateX],\n );\n\n // Reply icon fades + scales in as the bubble drags past ~half the\n // threshold. Sits on the SAME side the swipe is coming FROM (so\n // it's revealed behind the bubble as the bubble slides away).\n const replyIconOpacity = translateX.interpolate({\n inputRange: isSelf\n ? [-SWIPE_REPLY_THRESHOLD, -SWIPE_REPLY_THRESHOLD / 2, 0]\n : [0, SWIPE_REPLY_THRESHOLD / 2, SWIPE_REPLY_THRESHOLD],\n outputRange: isSelf ? [1, 0.3, 0] : [0, 0.3, 1],\n extrapolate: 'clamp',\n });\n const replyIconScale = translateX.interpolate({\n inputRange: isSelf ? [-SWIPE_REPLY_THRESHOLD, 0] : [0, SWIPE_REPLY_THRESHOLD],\n outputRange: isSelf ? [1, 0.5] : [0.5, 1],\n extrapolate: 'clamp',\n });\n\n const showAvatarSlot = showAvatar && !isSelf;\n const showAvatarRender =\n showAvatarSlot && (groupPosition === 'last' || groupPosition === 'standalone');\n // Resolve avatar / label with the same priority as MessageBubble /\n // ChatHeader: explicit prop > SDK userResolver > externalId fallback.\n // Without the useUser fallback, omitting `avatarFor` / `labelFor` on\n // <ConversationView> bypassed the resolver at the row level even\n // when `PoolseConfig.userResolver` was configured.\n const rowSender = useUser(showAvatarSlot ? msg.sender_external_id : null);\n const avatarUrl = msg.sender_external_id\n ? (avatarFor?.(msg.sender_external_id) ?? rowSender.profile?.avatarUrl ?? null)\n : null;\n const senderLabel = msg.sender_external_id\n ? (labelFor?.(msg.sender_external_id) ??\n rowSender.profile?.displayName ??\n msg.sender_external_id)\n : null;\n\n return (\n <View style={[styles.row, { alignSelf: isSelf ? 'flex-end' : 'flex-start' }]}>\n {showAvatarSlot ? (\n <View style={styles.avatarSlot}>\n {showAvatarRender ? (\n <Avatar\n src={avatarUrl ?? null}\n name={senderLabel}\n seed={msg.sender_external_id ?? null}\n size=\"sm\"\n />\n ) : null}\n </View>\n ) : null}\n\n <View style={styles.bubbleCol}>\n {swipeEnabled ? (\n <Animated.View\n pointerEvents=\"none\"\n style={[\n styles.replyHint,\n isSelf ? styles.replyHintRight : styles.replyHintLeft,\n {\n opacity: replyIconOpacity,\n transform: [{ scale: replyIconScale }],\n backgroundColor: theme.colors.surface2,\n },\n ]}\n >\n <PoolseIcon name=\"reply\" size={16} color={theme.colors.brand} />\n </Animated.View>\n ) : null}\n\n <Animated.View\n {...(swipeEnabled ? panResponder.panHandlers : {})}\n style={{ transform: [{ translateX }] }}\n >\n <Pressable\n onLongPress={() => {\n if (!actions) return;\n setActionsOpen(true);\n }}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Message actions\"\n >\n {editing ? (\n <EditableMessageBubble\n message={msg}\n currentUserId={meId}\n onCancel={onCancelEdit ?? (() => undefined)}\n onSave={onSaveEdit ?? (() => undefined)}\n />\n ) : (\n <MessageBubble\n message={msg}\n currentUserId={meId}\n {...(readState ? { readState } : {})}\n {...(labelFor ? { labelFor } : {})}\n {...(onQuotedClick ? { onQuotedClick } : {})}\n groupPosition={groupPosition}\n maxBodyLength={maxBodyLength}\n showSenderName={showSenderName}\n showAttachments={attachments}\n actionsTrigger={\n actions ? (\n <Pressable onPress={() => setActionsOpen(true)} hitSlop={8}>\n <PoolseIcon\n name=\"chevron-down\"\n size={14}\n color={isSelf ? theme.colors.onBrand : theme.colors.ink3}\n />\n </Pressable>\n ) : null\n }\n />\n )}\n </Pressable>\n </Animated.View>\n\n {threads && (msg.reply_count ?? 0) > 0 && onOpenThread ? (\n <Pressable onPress={onOpenThread} style={styles.threadPill}>\n <Text style={[styles.threadPillText, { color: theme.colors.brand }]}>\n 💬 {msg.reply_count} {msg.reply_count === 1 ? 'reply' : 'replies'}\n </Text>\n </Pressable>\n ) : null}\n\n {reactions ? (\n <View style={[styles.reactionsRow, { alignSelf: isSelf ? 'flex-end' : 'flex-start' }]}>\n <ReactionStrip\n messageId={msg.id}\n conversationId={msg.conversation_id}\n meId={meId}\n {...(msg.reactions ? { initialReactions: msg.reactions } : {})}\n />\n </View>\n ) : null}\n </View>\n\n {actions && actionsOpen ? (\n <MessageActions\n visible={actionsOpen}\n onClose={() => setActionsOpen(false)}\n isSelf={isSelf}\n {...(reactions\n ? {\n // Inline quick-react row at the top of the sheet —\n // one tap = react + close, no second modal needed.\n onPickReaction: (emoji: string) => {\n void reactionsApi.addReaction(emoji);\n },\n }\n : {})}\n {...(onStartEdit\n ? {\n onEdit: () => {\n setActionsOpen(false);\n onStartEdit();\n },\n }\n : {})}\n {...(onDelete\n ? {\n onDelete: () => {\n setActionsOpen(false);\n onDelete();\n },\n }\n : {})}\n {...(onOpenThread\n ? {\n onReplyInThread: () => {\n setActionsOpen(false);\n onOpenThread();\n },\n }\n : {})}\n {...(quotations && onQuote\n ? {\n onQuote: () => {\n setActionsOpen(false);\n onQuote();\n },\n }\n : {})}\n />\n ) : null}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n row: {\n flexDirection: 'row',\n alignItems: 'flex-end',\n // Tighter vertical rhythm — was 2px each side (4px between rows)\n // plus the bubble's 4px marginBottom = 8px. Now 1+1+2 = 4px,\n // closer to iMessage / WhatsApp density.\n marginVertical: 1,\n // 10px on each side — tight enough to use the available width\n // for content, loose enough to keep bubbles off the screen edge\n // on every device.\n paddingHorizontal: 10,\n maxWidth: '95%',\n },\n avatarSlot: {\n width: 36,\n marginRight: 6,\n },\n bubbleCol: {\n flexShrink: 1,\n position: 'relative',\n },\n replyHint: {\n position: 'absolute',\n top: '50%',\n marginTop: -16,\n width: 32,\n height: 32,\n borderRadius: 16,\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: -1,\n },\n replyHintLeft: {\n left: -44,\n },\n replyHintRight: {\n right: -44,\n },\n threadPill: {\n alignSelf: 'flex-start',\n marginTop: 2,\n paddingHorizontal: 8,\n paddingVertical: 3,\n },\n threadPillText: {\n fontSize: 11,\n fontWeight: '600',\n },\n reactionsRow: {\n marginTop: 2,\n },\n});\n","import type { Message, Uuid } from '@poolse/sdk';\nimport { useMe, useThread } from '@poolse/react';\nimport { useCallback, useMemo, useState, type ReactElement } from 'react';\nimport {\n Animated,\n KeyboardAvoidingView,\n Modal,\n Platform,\n Pressable,\n StyleSheet,\n Text,\n useWindowDimensions,\n View,\n} from 'react-native';\n\nimport { AttachmentPicker } from './AttachmentPicker.js';\nimport { MessageComposer } from './MessageComposer.js';\nimport { MessageList } from './MessageList.js';\nimport { MessageRow } from './MessageRow.js';\nimport { PoolseIcon } from './primitives/PoolseIcon.js';\nimport { UploadProvider } from './internal/uploadContext.js';\nimport { useDismissableSheet } from './internal/useDismissableSheet.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport interface ThreadViewProps {\n visible: boolean;\n onClose: () => void;\n conversationId: Uuid;\n rootMessage: Message;\n labelFor?: (externalId: string) => string;\n avatarFor?: (externalId: string) => string | null;\n}\n\n// Sheet covers the bottom 88% of the screen. The remaining 12% is the\n// pull-down gutter (also the keyboardVerticalOffset for iOS).\nconst SHEET_HEIGHT_FRACTION = 0.88;\n\n/**\n * Bottom-sheet modal for thread replies. Pull the drag handle / header\n * down to dismiss; tap the backdrop or close button too. The composer\n * inside the sheet supports attachments (paperclip → picker, shared\n * upload queue) and the reply rows support reactions, swipe-to-reply,\n * long-press actions, edit, delete — same surface as ConversationView.\n *\n * Keyboard handling: inside a Modal the OS doesn't auto-resize the\n * sheet's children, so the composer needs its own KeyboardAvoidingView\n * with `keyboardVerticalOffset` set to the distance between the screen\n * top and the sheet top (the gutter above the sheet).\n */\nexport function ThreadView({\n visible,\n onClose,\n conversationId,\n rootMessage,\n labelFor,\n avatarFor,\n}: ThreadViewProps) {\n return (\n <Modal\n visible={visible}\n transparent\n animationType=\"slide\"\n onRequestClose={onClose}\n statusBarTranslucent\n >\n {/* Each open of the thread gets its own UploadProvider so the\n composer's queue is isolated from the parent ConversationView's\n composer queue. */}\n <UploadProvider>\n <ThreadSheet\n onClose={onClose}\n conversationId={conversationId}\n rootMessage={rootMessage}\n {...(labelFor ? { labelFor } : {})}\n {...(avatarFor ? { avatarFor } : {})}\n />\n </UploadProvider>\n </Modal>\n );\n}\n\nfunction ThreadSheet({\n onClose,\n conversationId,\n rootMessage,\n labelFor,\n avatarFor,\n}: {\n onClose: () => void;\n conversationId: Uuid;\n rootMessage: Message;\n labelFor?: (externalId: string) => string;\n avatarFor?: (externalId: string) => string | null;\n}) {\n const theme = usePoolseTheme();\n const { me } = useMe();\n const meId = me?.id ?? null;\n const {\n replies,\n sendReply,\n edit,\n delete: deleteReply,\n loadMore,\n hasMore,\n } = useThread(conversationId, rootMessage.id);\n const { height: screenHeight } = useWindowDimensions();\n const sheetHeight = Math.round(screenHeight * SHEET_HEIGHT_FRACTION);\n const gutter = screenHeight - sheetHeight;\n const { translateY, panHandlers } = useDismissableSheet({ onClose, sheetHeight });\n\n const [pickerOpen, setPickerOpen] = useState(false);\n const [editingId, setEditingId] = useState<string | null>(null);\n\n const renderReply = useCallback(\n (msg: Message): ReactElement => (\n <MessageRow\n msg={msg}\n meId={meId}\n // Reactions + actions on by default; nested threads off (you\n // can't thread inside a thread in v1).\n reactions\n attachments\n actions\n threads={false}\n // Quote-to-reply doesn't make sense inside a single-root thread.\n quotations={false}\n editing={editingId === msg.id}\n onStartEdit={() => setEditingId(msg.id)}\n onCancelEdit={() => setEditingId(null)}\n onSaveEdit={async (body) => {\n await edit(msg.id, body);\n setEditingId(null);\n }}\n onDelete={() => {\n void deleteReply(msg.id);\n }}\n {...(labelFor ? { labelFor } : {})}\n {...(avatarFor ? { avatarFor } : {})}\n />\n ),\n [meId, editingId, edit, deleteReply, labelFor, avatarFor],\n );\n\n const rootRow = useMemo(\n () => (\n <MessageRow\n msg={rootMessage}\n meId={meId}\n reactions\n attachments\n actions={false}\n threads={false}\n quotations={false}\n {...(labelFor ? { labelFor } : {})}\n {...(avatarFor ? { avatarFor } : {})}\n />\n ),\n [rootMessage, meId, labelFor, avatarFor],\n );\n\n return (\n <View style={styles.modalRoot}>\n <Pressable style={styles.backdrop} onPress={onClose} accessibilityLabel=\"Close thread\" />\n\n <Animated.View\n style={[\n styles.sheet,\n {\n height: sheetHeight,\n backgroundColor: theme.colors.paper,\n borderTopLeftRadius: theme.radii.xl,\n borderTopRightRadius: theme.radii.xl,\n transform: [{ translateY }],\n },\n theme.shadows.lg,\n ]}\n >\n {/* Wrap the header + drag pill in the pan handler so users can\n pull from a comfortable 60-pt-tall strip — the bare 16-pt\n pill on its own was nearly invisible to fingers. */}\n <View {...panHandlers}>\n <View style={styles.dragHandle}>\n <View style={[styles.dragPill, { backgroundColor: theme.colors.ink3 }]} />\n </View>\n\n <View style={[styles.header, { borderBottomColor: theme.colors.border }]}>\n <Pressable\n onPress={onClose}\n hitSlop={16}\n style={[styles.closeBtn, { backgroundColor: theme.colors.surface2 }]}\n accessibilityLabel=\"Close thread\"\n >\n <PoolseIcon name=\"close\" size={18} color={theme.colors.ink} />\n </Pressable>\n <Text\n style={[\n styles.title,\n { color: theme.colors.ink, fontFamily: theme.type.fontDisplay },\n ]}\n >\n Thread\n </Text>\n </View>\n </View>\n\n {/* KAV scope: just the scrolling area + composer. Keyboard pushes\n the composer up by the keyboard height minus the gutter\n (since the gutter is already \"free\" space above the sheet\n top). On Android we use `height` behavior — works inside a\n Modal because the modal window itself responds to adjustResize. */}\n <KeyboardAvoidingView\n style={styles.kavBody}\n behavior={Platform.OS === 'ios' ? 'padding' : 'height'}\n keyboardVerticalOffset={Platform.OS === 'ios' ? gutter : 0}\n >\n <View style={[styles.rootPreview, { backgroundColor: theme.colors.surface2 }]}>\n {rootRow}\n </View>\n\n <View style={styles.listWrap}>\n <MessageList\n messages={replies}\n hasMore={hasMore}\n onLoadMore={loadMore}\n renderItem={renderReply}\n />\n </View>\n\n <MessageComposer\n onSend={async (body, opts) => {\n await sendReply({ body, ...opts });\n }}\n placeholder=\"Reply to thread…\"\n attachments\n onAttachPress={() => setPickerOpen(true)}\n />\n </KeyboardAvoidingView>\n\n <AttachmentPicker visible={pickerOpen} onClose={() => setPickerOpen(false)} />\n </Animated.View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n modalRoot: {\n flex: 1,\n justifyContent: 'flex-end',\n },\n backdrop: {\n ...StyleSheet.absoluteFillObject,\n backgroundColor: 'rgba(0,0,0,0.4)',\n },\n sheet: {\n overflow: 'hidden',\n },\n dragHandle: {\n alignItems: 'center',\n paddingTop: 8,\n paddingBottom: 4,\n },\n dragPill: {\n width: 36,\n height: 4,\n borderRadius: 2,\n opacity: 0.4,\n },\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 12,\n paddingTop: 6,\n paddingBottom: 10,\n borderBottomWidth: StyleSheet.hairlineWidth,\n gap: 10,\n },\n closeBtn: {\n width: 32,\n height: 32,\n borderRadius: 16,\n alignItems: 'center',\n justifyContent: 'center',\n },\n title: {\n fontSize: 16,\n fontWeight: '600',\n },\n rootPreview: {\n paddingVertical: 8,\n paddingHorizontal: 8,\n },\n kavBody: {\n flex: 1,\n },\n listWrap: {\n flex: 1,\n },\n});\n","import { Text } from 'react-native';\nimport { useUser } from '@poolse/react';\n\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport interface UserNameProps {\n /** The user's external_id. Pass null to render the fallback. */\n externalId: string | null | undefined;\n /** Optional fallback when the resolver returns nothing. Defaults to the externalId itself. */\n fallback?: string;\n /** Caller-supplied label override; if it returns a string, it wins. */\n labelFor?: (externalId: string) => string;\n}\n\n/**\n * Display name for a user, looked up via the SDK's `userResolver`\n * with caller-overridable + fallback fallbacks. Renders a `<Text>`.\n */\nexport function UserName({ externalId, fallback, labelFor }: UserNameProps) {\n const theme = usePoolseTheme();\n const name = useDisplayName(externalId, labelFor) ?? fallback ?? externalId ?? '';\n return <Text style={{ color: theme.colors.ink, fontFamily: theme.type.fontBody }}>{name}</Text>;\n}\n\n/**\n * Resolves a user's display name via the 3-tier chain:\n * 1. `labelFor(externalId)` — caller-supplied override\n * 2. SDK `userResolver` (memoized via `useUser`)\n * 3. The externalId itself (so something always renders)\n */\nexport function useDisplayName(\n externalId: string | null | undefined,\n labelFor?: (externalId: string) => string,\n): string {\n const resolved = useUser(externalId ?? null);\n if (!externalId) return '';\n if (labelFor) {\n const override = labelFor(externalId);\n if (override) return override;\n }\n return resolved.profile?.displayName ?? externalId;\n}\n","import { useEffect, useRef } from 'react';\nimport { Animated, StyleSheet, Text, View, Easing } from 'react-native';\n\nimport { useDisplayName } from './UserName.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport interface TypingIndicatorProps {\n /** Set of `external_id`s currently typing — what `useTyping` returns. */\n typing: Set<string>;\n /**\n * Resolves an `external_id` to a display label. Defaults to the\n * SDK's `userResolver` (and falls back to the external_id itself\n * when the resolver isn't configured).\n */\n labelFor?: (externalId: string) => string;\n}\n\n/**\n * Three animated dots + an inline \"X is typing\" label. Renders a\n * zero-height row when nobody is typing so the list doesn't jump.\n */\nexport function TypingIndicator({ typing, labelFor }: TypingIndicatorProps) {\n const ids = Array.from(typing);\n const isTyping = ids.length > 0;\n\n if (!isTyping) return <View style={{ height: 0 }} />;\n\n return (\n <View style={styles.row}>\n <TypingDots />\n <TypingLabel ids={ids} {...(labelFor ? { labelFor } : {})} />\n </View>\n );\n}\n\nfunction TypingDots() {\n const theme = usePoolseTheme();\n const a = useRef(new Animated.Value(0)).current;\n const b = useRef(new Animated.Value(0)).current;\n const c = useRef(new Animated.Value(0)).current;\n\n useEffect(() => {\n const loop = (val: Animated.Value, delay: number) =>\n Animated.loop(\n Animated.sequence([\n Animated.delay(delay),\n Animated.timing(val, {\n toValue: 1,\n duration: 400,\n easing: Easing.inOut(Easing.ease),\n useNativeDriver: true,\n }),\n Animated.timing(val, {\n toValue: 0,\n duration: 400,\n easing: Easing.inOut(Easing.ease),\n useNativeDriver: true,\n }),\n ]),\n );\n const animations = [loop(a, 0), loop(b, 150), loop(c, 300)];\n animations.forEach((anim) => anim.start());\n return () => animations.forEach((anim) => anim.stop());\n }, [a, b, c]);\n\n const dot = (val: Animated.Value) => ({\n width: 6,\n height: 6,\n borderRadius: 3,\n backgroundColor: theme.colors.ink3,\n marginHorizontal: 2,\n transform: [\n {\n translateY: val.interpolate({ inputRange: [0, 1], outputRange: [0, -3] }),\n },\n ],\n opacity: val.interpolate({ inputRange: [0, 1], outputRange: [0.5, 1] }),\n });\n\n return (\n <View style={styles.dotsWrap}>\n <Animated.View style={dot(a)} />\n <Animated.View style={dot(b)} />\n <Animated.View style={dot(c)} />\n </View>\n );\n}\n\nfunction TypingLabel({\n ids,\n labelFor,\n}: {\n ids: string[];\n labelFor?: (externalId: string) => string;\n}) {\n const theme = usePoolseTheme();\n const id1 = ids[0] ?? null;\n const id2 = ids[1] ?? null;\n const name1 = useDisplayName(id1, labelFor);\n const name2 = useDisplayName(id2, labelFor);\n\n const text =\n ids.length === 1\n ? `${name1} is typing`\n : ids.length === 2\n ? `${name1} and ${name2} are typing`\n : `${ids.length} people are typing`;\n\n return (\n <Text style={[styles.label, { color: theme.colors.ink2, fontFamily: theme.type.fontBody }]}>\n {text}\n </Text>\n );\n}\n\nconst styles = StyleSheet.create({\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 12,\n paddingVertical: 6,\n },\n dotsWrap: {\n flexDirection: 'row',\n alignItems: 'flex-end',\n marginRight: 8,\n height: 12,\n },\n label: {\n fontSize: 12,\n },\n});\n","import type { Message, Uuid } from '@poolse/sdk';\nimport { useMe, useMembers, useMessages, useTyping } from '@poolse/react';\nimport { useCallback, useEffect, useMemo, useRef, useState, type ReactElement } from 'react';\nimport { KeyboardAvoidingView, Platform, StyleSheet, View } from 'react-native';\n\nimport { AttachmentPicker } from './AttachmentPicker.js';\nimport { ChatHeader } from './ChatHeader.js';\nimport { MentionInput } from './MentionInput.js';\nimport { MessageComposer } from './MessageComposer.js';\nimport { MessageList } from './MessageList.js';\nimport { MessageRow } from './MessageRow.js';\nimport { ThreadView } from './ThreadView.js';\nimport { TypingIndicator } from './TypingIndicator.js';\nimport { UploadProvider } from './internal/uploadContext.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport interface ConversationViewProps {\n conversationId: Uuid;\n emptyState?: ReactElement | string;\n renderMessage?: (msg: Message, currentUserId: string | null) => ReactElement;\n labelFor?: (externalId: string) => string;\n avatarFor?: (externalId: string) => string | null;\n\n /**\n * Renders the default `<ChatHeader>` at the top of the chat surface.\n * * `true` (default) — auto chat header (other user / group name).\n * * `false` — no header (you supply your own above).\n * * `ReactElement` — custom header node, rendered as-is.\n */\n header?: boolean | ReactElement;\n /** Tap on the header's members icon — typically opens a sheet. */\n onHeaderMembersPress?: () => void;\n /** Tap on the header itself — typically opens a conversation profile. */\n onHeaderPress?: () => void;\n\n // Feature toggles — all default ON, identical names + defaults to web.\n reactions?: boolean;\n mentions?: boolean;\n attachments?: boolean;\n actions?: boolean;\n threads?: boolean;\n quotations?: boolean;\n readReceipts?: boolean;\n maxBodyLength?: number;\n\n /** Show sender labels in group chats. `auto` (default), `always`, `never`. */\n senderLabels?: 'auto' | 'always' | 'never';\n /** Show avatars to the left of other-side bubbles in group chats. Same semantics. */\n avatars?: 'auto' | 'always' | 'never';\n\n /**\n * Fires when auto-mark-read commits a new server-side read cursor.\n * Receives the conversation id + the message id that was marked\n * as the last-read. Wire this to `useConversations().markConversationRead(convId, msgId)`\n * so the sidebar / list view's unread badge clears immediately\n * instead of waiting for the next conversations refetch.\n */\n onMarkedRead?: (conversationId: string, messageId: string) => void;\n /**\n * Fires after every successful message send. Wire to the parent's\n * `useConversations().refetch()` so the conversation list shows\n * the fresh `last_message_preview` / `last_message_at` for the\n * conversation you just sent into. `useConversations` creates\n * isolated state per call site, so ConversationView can't refresh\n * a parent hook's state on its own.\n */\n onSent?: (conversationId: string) => void;\n /**\n * keyboardVerticalOffset passed to the internal KeyboardAvoidingView.\n * On iOS this MUST equal the distance from the screen top to the\n * KAV's top (status bar + safe-area-top + any nav header above\n * the chat). `<PoolseInbox>` computes this for you. Standalone\n * consumers pass it manually.\n */\n keyboardOffset?: number;\n}\n\nexport function ConversationView({\n conversationId,\n emptyState,\n renderMessage,\n labelFor,\n avatarFor,\n header = true,\n onHeaderMembersPress,\n onHeaderPress,\n reactions = true,\n mentions = true,\n attachments = true,\n actions = true,\n threads = true,\n quotations = true,\n readReceipts = true,\n maxBodyLength = 200,\n senderLabels = 'auto',\n avatars = 'auto',\n onMarkedRead,\n onSent,\n keyboardOffset = 0,\n}: ConversationViewProps) {\n const theme = usePoolseTheme();\n const { me } = useMe();\n const meId = me?.id ?? null;\n\n const {\n messages,\n loading,\n hasMore,\n loadMore,\n send,\n edit,\n delete: deleteMsg,\n markReadUpTo,\n } = useMessages(conversationId);\n const { typing, signalTyping } = useTyping(conversationId);\n\n const wantsMembers = mentions || senderLabels === 'auto' || avatars === 'auto';\n const { members } = useMembers(wantsMembers ? conversationId : '');\n const isGroupChat = members.length > 2;\n const showSenderLabels = senderLabels === 'always' || (senderLabels === 'auto' && isGroupChat);\n const showAvatars = avatars === 'always' || (avatars === 'auto' && isGroupChat);\n\n const [replyingTo, setReplyingTo] = useState<Message | null>(null);\n const [editingId, setEditingId] = useState<string | null>(null);\n const [threadRoot, setThreadRoot] = useState<Message | null>(null);\n const [pickerOpen, setPickerOpen] = useState(false);\n\n // messageId → sequence map for read-receipt comparison. Membership\n // only carries `last_read_message_id` (UUID); to know whether\n // member X read message Y we have to translate the read message's\n // id into its sequence and compare against Y's sequence. UUIDs\n // aren't chronological so we have to do this lookup explicitly.\n const sequenceByMessageId = useMemo(() => {\n const m = new Map<string, number>();\n for (const msg of messages) {\n if (typeof msg.sequence === 'number') m.set(msg.id, msg.sequence);\n }\n return m;\n }, [messages]);\n\n // Auto-mark-read: advance the read cursor whenever a confirmed\n // message lands at the tail. Skip optimistic temp messages\n // (no `sequence` yet — server hasn't seen the id) to avoid\n // 404s when send-then-immediately-mark races the round-trip.\n // Wrapping in try/catch lets us survive any other transient\n // membership-write failures without breaking the chat.\n const lastMarkedRef = useRef<string | null>(null);\n useEffect(() => {\n if (!readReceipts) return;\n if (messages.length === 0) return;\n const latest = messages[messages.length - 1];\n if (!latest || !latest.id) return;\n if (latest.id === lastMarkedRef.current) return;\n // Optimistic temp messages don't have a server-assigned sequence.\n // Marking them would 404 (server hasn't processed the send yet);\n // wait for the realtime confirmation to land, which replaces the\n // temp with a real message carrying a real sequence.\n if (typeof latest.sequence !== 'number' || latest.sequence <= 0) return;\n lastMarkedRef.current = latest.id;\n void markReadUpTo(latest.id).catch(() => {\n // Reset so we retry on the next message arrival.\n lastMarkedRef.current = null;\n });\n onMarkedRead?.(conversationId, latest.id);\n }, [messages, meId, readReceipts, markReadUpTo, onMarkedRead, conversationId]);\n\n const renderItem = useCallback(\n (msg: Message): ReactElement => {\n if (renderMessage) return <>{renderMessage(msg, meId)}</>;\n const readState: 'sent' | 'read' | undefined =\n readReceipts && meId !== null && msg.sender_id === meId\n ? readStateForMessage(msg, members, meId, sequenceByMessageId)\n : undefined;\n return (\n <MessageRow\n msg={msg}\n meId={meId}\n reactions={reactions}\n attachments={attachments}\n actions={actions}\n threads={threads}\n quotations={quotations}\n {...(readState ? { readState } : {})}\n editing={editingId === msg.id}\n onStartEdit={() => setEditingId(msg.id)}\n onCancelEdit={() => setEditingId(null)}\n onSaveEdit={async (body) => {\n await edit(msg.id, body);\n setEditingId(null);\n }}\n onDelete={() => deleteMsg(msg.id)}\n {...(threads ? { onOpenThread: () => setThreadRoot(msg) } : {})}\n {...(quotations ? { onQuote: () => setReplyingTo(msg) } : {})}\n {...(labelFor ? { labelFor } : {})}\n {...(avatarFor ? { avatarFor } : {})}\n showSenderName={showSenderLabels}\n showAvatar={showAvatars}\n maxBodyLength={maxBodyLength}\n />\n );\n },\n [\n renderMessage,\n meId,\n readReceipts,\n members,\n reactions,\n attachments,\n actions,\n threads,\n quotations,\n editingId,\n edit,\n deleteMsg,\n labelFor,\n avatarFor,\n showSenderLabels,\n showAvatars,\n maxBodyLength,\n sequenceByMessageId,\n ],\n );\n\n const composerProps = useMemo(\n () => ({\n onSend: async (\n body: string,\n opts?: { quoted_message_id?: Uuid; attachment_ids?: Uuid[]; mentions?: Uuid[] },\n ) => {\n await send({ body, ...opts });\n setReplyingTo(null);\n // Tell the parent so it can refresh ITS useConversations\n // state. useConversations creates isolated state per call\n // site, so a refetch from here wouldn't update PoolseInbox's\n // list — only the parent's own hook instance can.\n onSent?.(conversationId);\n },\n onTyping: signalTyping,\n ...(attachments ? { onAttachPress: () => setPickerOpen(true) } : {}),\n ...(replyingTo ? { replyingTo } : {}),\n onCancelReply: () => setReplyingTo(null),\n ...(labelFor ? { labelFor } : {}),\n attachments,\n keyboardOffset,\n }),\n [send, signalTyping, attachments, replyingTo, labelFor, keyboardOffset, onSent, conversationId],\n );\n\n const headerNode =\n header === false ? null : header === true ? (\n <ChatHeader\n conversationId={conversationId}\n {...(labelFor ? { labelFor } : {})}\n {...(avatarFor ? { avatarFor } : {})}\n {...(onHeaderMembersPress ? { onMembersPress: onHeaderMembersPress } : {})}\n {...(onHeaderPress ? { onPress: onHeaderPress } : {})}\n />\n ) : (\n header\n );\n\n return (\n <UploadProvider>\n <KeyboardAvoidingView\n // iOS uses `padding` (the height behavior is documented as\n // only working on absolute-positioned children and is\n // basically a no-op inside flex:1 chains like ours).\n // Padding mode REQUIRES the right keyboardVerticalOffset —\n // the distance from the screen top to the KAV's top.\n // PoolseInbox computes this from the safe-area top + its own\n // ChatHeader height and passes it through; standalone\n // consumers must pass it themselves.\n //\n // Android uses `height` — works there because the layout\n // recomputes from the Android window resize.\n style={[styles.root, { backgroundColor: theme.colors.paper }]}\n behavior={Platform.OS === 'ios' ? 'padding' : 'height'}\n keyboardVerticalOffset={keyboardOffset}\n >\n {headerNode}\n <View style={styles.listWrap}>\n <MessageList\n messages={messages}\n loading={loading}\n hasMore={hasMore}\n onLoadMore={loadMore}\n renderItem={renderItem}\n ListHeader={<TypingIndicator typing={typing} {...(labelFor ? { labelFor } : {})} />}\n {...(emptyState !== undefined ? { emptyState } : {})}\n />\n </View>\n\n {mentions ? (\n <MentionInput conversationId={conversationId} {...composerProps} />\n ) : (\n <MessageComposer {...composerProps} />\n )}\n\n {attachments ? (\n <AttachmentPicker visible={pickerOpen} onClose={() => setPickerOpen(false)} />\n ) : null}\n\n {threads && threadRoot ? (\n <ThreadView\n visible\n onClose={() => setThreadRoot(null)}\n conversationId={conversationId}\n rootMessage={threadRoot}\n {...(labelFor ? { labelFor } : {})}\n />\n ) : null}\n </KeyboardAvoidingView>\n </UploadProvider>\n );\n}\n\nfunction readStateForMessage(\n msg: Message,\n members: ReadonlyArray<{ user_id: string; last_read_message_id: string | null }>,\n meId: string,\n sequenceByMessageId: Map<string, number>,\n): 'sent' | 'read' {\n const otherMembers = members.filter((m) => m.user_id !== meId);\n if (otherMembers.length === 0) return 'sent';\n if (typeof msg.sequence !== 'number') return 'sent';\n const mySeq = msg.sequence;\n const anyRead = otherMembers.some((m) => {\n if (!m.last_read_message_id) return false;\n const readSeq = sequenceByMessageId.get(m.last_read_message_id);\n if (readSeq === undefined) return false;\n return readSeq >= mySeq;\n });\n return anyRead ? 'read' : 'sent';\n}\n\nconst styles = StyleSheet.create({\n root: {\n flex: 1,\n },\n listWrap: {\n flex: 1,\n },\n});\n","import { useMemo, useState } from 'react';\nimport {\n Animated,\n FlatList,\n Image,\n Modal,\n Pressable,\n StyleSheet,\n Text,\n TextInput,\n useWindowDimensions,\n View,\n} from 'react-native';\n\nimport { Avatar } from '../primitives/Avatar.js';\nimport { PoolseIcon } from '../primitives/PoolseIcon.js';\nimport { useDismissableSheet } from './useDismissableSheet.js';\nimport { usePoolseTheme } from '../theme/PoolseTheme.js';\n\nexport interface InboxUser {\n /** The user's external_id (the same id you mint JWTs with). */\n externalId: string;\n /** Display name shown in the picker row. */\n name: string;\n /** Optional avatar URL — falls back to initials if missing. */\n avatarUrl?: string | null;\n /** Optional secondary line (email, role, handle…). */\n subtitle?: string;\n}\n\nexport interface UserPickerSheetProps {\n visible: boolean;\n onClose: () => void;\n users: InboxUser[];\n /** External_ids to hide (usually the caller's own id). */\n excludeIds?: string[];\n /**\n * `single` → direct-chat mode; tap a row, fires onPickDirect, closes.\n * `group` → multi-select with a group-name input + Create button.\n */\n mode: 'single' | 'group';\n onPickDirect?: (externalId: string) => void;\n onCreateGroup?: (name: string, memberExternalIds: string[]) => void;\n /** Optional header slot — title defaults to \"New chat\" / \"New group\". */\n title?: string;\n /** Search input shown when user count ≥ 8. Override to force on/off. */\n searchable?: boolean;\n}\n\n/**\n * Bottom-sheet picker for selecting one or many users from the\n * tenant's user directory. Used by `<PoolseInbox>` for the\n * built-in \"New chat\" / \"New group\" flows. Exported standalone so\n * devs can drive it from their own UI (e.g. a \"Forward to…\" sheet).\n */\nexport function UserPickerSheet({\n visible,\n onClose,\n users,\n excludeIds,\n mode,\n onPickDirect,\n onCreateGroup,\n title,\n searchable,\n}: UserPickerSheetProps) {\n const theme = usePoolseTheme();\n const [query, setQuery] = useState('');\n const [selectedIds, setSelectedIds] = useState<string[]>([]);\n const [groupName, setGroupName] = useState('');\n const { height: screenHeight } = useWindowDimensions();\n const { translateY, panHandlers } = useDismissableSheet({\n onClose: () => {\n // Reset selection state on dismiss so it doesn't survive\n // across opens.\n setQuery('');\n setSelectedIds([]);\n setGroupName('');\n onClose();\n },\n sheetHeight: screenHeight * 0.85,\n });\n\n const excludeSet = useMemo(() => new Set(excludeIds ?? []), [excludeIds]);\n const filtered = useMemo(() => {\n const q = query.trim().toLowerCase();\n return users.filter((u) => {\n if (excludeSet.has(u.externalId)) return false;\n if (!q) return true;\n return (\n u.name.toLowerCase().includes(q) ||\n (u.subtitle ?? '').toLowerCase().includes(q) ||\n u.externalId.toLowerCase().includes(q)\n );\n });\n }, [users, query, excludeSet]);\n\n const showSearch = searchable ?? users.length >= 8;\n const isGroup = mode === 'group';\n const heading = title ?? (isGroup ? 'New group' : 'New chat');\n\n const reset = () => {\n setQuery('');\n setSelectedIds([]);\n setGroupName('');\n };\n\n const handleClose = () => {\n reset();\n onClose();\n };\n\n const toggle = (externalId: string) => {\n setSelectedIds((prev) =>\n prev.includes(externalId) ? prev.filter((id) => id !== externalId) : [...prev, externalId],\n );\n };\n\n const canCreate = isGroup && selectedIds.length > 0 && groupName.trim().length > 0;\n\n const handleCreate = () => {\n if (!canCreate) return;\n onCreateGroup?.(groupName.trim(), selectedIds);\n reset();\n onClose();\n };\n\n return (\n <Modal\n visible={visible}\n transparent\n animationType=\"slide\"\n onRequestClose={handleClose}\n statusBarTranslucent\n >\n <View style={styles.modalRoot}>\n <Pressable style={styles.backdrop} onPress={handleClose} />\n\n <Animated.View\n style={[\n styles.sheet,\n {\n backgroundColor: theme.colors.paper,\n borderTopLeftRadius: theme.radii.xl,\n borderTopRightRadius: theme.radii.xl,\n transform: [{ translateY }],\n },\n theme.shadows.lg,\n ]}\n >\n <View {...panHandlers} style={styles.dragHandle}>\n <View style={[styles.dragPill, { backgroundColor: theme.colors.ink3 }]} />\n </View>\n\n <View style={styles.header}>\n <Pressable\n onPress={handleClose}\n hitSlop={16}\n style={[styles.closeBtn, { backgroundColor: theme.colors.surface2 }]}\n accessibilityLabel=\"Close picker\"\n >\n <PoolseIcon name=\"close\" size={18} color={theme.colors.ink} />\n </Pressable>\n <Text\n style={[\n styles.title,\n { color: theme.colors.ink, fontFamily: theme.type.fontDisplay },\n ]}\n numberOfLines={1}\n >\n {heading}\n </Text>\n {isGroup ? (\n <Pressable\n onPress={handleCreate}\n disabled={!canCreate}\n hitSlop={6}\n style={[\n styles.createBtn,\n {\n backgroundColor: canCreate ? theme.colors.brand : theme.colors.surface2,\n opacity: canCreate ? 1 : 0.6,\n },\n ]}\n >\n <Text\n style={{\n color: canCreate ? theme.colors.onBrand : theme.colors.ink3,\n fontWeight: '700',\n fontSize: 13,\n }}\n >\n Create{selectedIds.length > 0 ? ` (${selectedIds.length})` : ''}\n </Text>\n </Pressable>\n ) : null}\n </View>\n\n {isGroup ? (\n <TextInput\n placeholder=\"Group name\"\n placeholderTextColor={theme.colors.ink3}\n value={groupName}\n onChangeText={setGroupName}\n style={[\n styles.groupNameInput,\n {\n color: theme.colors.ink,\n backgroundColor: theme.colors.surface2,\n borderRadius: theme.radii.md,\n fontFamily: theme.type.fontBody,\n fontSize: theme.type.bodySize,\n },\n ]}\n />\n ) : null}\n\n {showSearch ? (\n <TextInput\n placeholder=\"Search…\"\n placeholderTextColor={theme.colors.ink3}\n value={query}\n onChangeText={setQuery}\n style={[\n styles.searchInput,\n {\n color: theme.colors.ink,\n backgroundColor: theme.colors.surface2,\n borderRadius: theme.radii.md,\n fontFamily: theme.type.fontBody,\n fontSize: 14,\n },\n ]}\n />\n ) : null}\n\n <FlatList\n data={filtered}\n keyExtractor={(u) => u.externalId}\n ListEmptyComponent={\n <View style={styles.empty}>\n <Text style={[styles.emptyText, { color: theme.colors.ink3 }]}>\n {query ? 'No matches.' : 'No users to show.'}\n </Text>\n </View>\n }\n renderItem={({ item }) => (\n <UserRow\n user={item}\n selected={selectedIds.includes(item.externalId)}\n isGroup={isGroup}\n onPress={() => {\n if (isGroup) toggle(item.externalId);\n else {\n onPickDirect?.(item.externalId);\n reset();\n onClose();\n }\n }}\n />\n )}\n />\n </Animated.View>\n </View>\n </Modal>\n );\n}\n\nfunction UserRow({\n user,\n selected,\n isGroup,\n onPress,\n}: {\n user: InboxUser;\n selected: boolean;\n isGroup: boolean;\n onPress: () => void;\n}) {\n const theme = usePoolseTheme();\n return (\n <Pressable\n onPress={onPress}\n style={[\n styles.row,\n {\n backgroundColor: selected ? theme.colors.brandSoft : 'transparent',\n },\n ]}\n >\n {user.avatarUrl ? (\n <Image source={{ uri: user.avatarUrl }} style={styles.avatarImg} />\n ) : (\n <Avatar src={null} name={user.name} seed={user.externalId} size=\"md\" />\n )}\n <View style={styles.body}>\n <Text\n style={[styles.name, { color: theme.colors.ink, fontFamily: theme.type.fontBody }]}\n numberOfLines={1}\n >\n {user.name}\n </Text>\n {user.subtitle ? (\n <Text style={[styles.subtitle, { color: theme.colors.ink3 }]} numberOfLines={1}>\n {user.subtitle}\n </Text>\n ) : null}\n </View>\n {isGroup ? (\n <View\n style={[\n styles.checkbox,\n {\n borderColor: selected ? theme.colors.brand : theme.colors.border,\n backgroundColor: selected ? theme.colors.brand : 'transparent',\n },\n ]}\n >\n {selected ? <PoolseIcon name=\"check\" size={14} color={theme.colors.onBrand} /> : null}\n </View>\n ) : null}\n </Pressable>\n );\n}\n\nconst styles = StyleSheet.create({\n modalRoot: {\n flex: 1,\n justifyContent: 'flex-end',\n },\n backdrop: {\n ...StyleSheet.absoluteFillObject,\n backgroundColor: 'rgba(0,0,0,0.4)',\n },\n sheet: {\n height: '85%',\n overflow: 'hidden',\n },\n dragHandle: {\n alignItems: 'center',\n paddingTop: 8,\n paddingBottom: 4,\n },\n dragPill: {\n width: 36,\n height: 4,\n borderRadius: 2,\n opacity: 0.4,\n },\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 12,\n paddingTop: 4,\n paddingBottom: 12,\n gap: 10,\n },\n closeBtn: {\n width: 32,\n height: 32,\n borderRadius: 16,\n alignItems: 'center',\n justifyContent: 'center',\n },\n title: {\n fontSize: 17,\n fontWeight: '700',\n flex: 1,\n },\n createBtn: {\n paddingHorizontal: 14,\n paddingVertical: 7,\n borderRadius: 999,\n },\n groupNameInput: {\n marginHorizontal: 16,\n marginBottom: 8,\n paddingHorizontal: 12,\n paddingVertical: 10,\n fontWeight: '600',\n },\n searchInput: {\n marginHorizontal: 16,\n marginBottom: 8,\n paddingHorizontal: 12,\n paddingVertical: 8,\n },\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 16,\n paddingVertical: 10,\n gap: 12,\n },\n avatarImg: {\n width: 40,\n height: 40,\n borderRadius: 20,\n },\n body: {\n flex: 1,\n gap: 2,\n },\n name: {\n fontSize: 15,\n fontWeight: '600',\n },\n subtitle: {\n fontSize: 12,\n },\n checkbox: {\n width: 22,\n height: 22,\n borderRadius: 11,\n borderWidth: 1.5,\n alignItems: 'center',\n justifyContent: 'center',\n },\n empty: {\n paddingVertical: 40,\n alignItems: 'center',\n },\n emptyText: {\n fontSize: 13,\n },\n});\n","import type { Conversation, Uuid } from '@poolse/sdk';\nimport { useConversations, useMe, useUser } from '@poolse/react';\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport {\n Animated,\n Easing,\n Image,\n PanResponder,\n Pressable,\n StyleSheet,\n Text,\n useWindowDimensions,\n View,\n} from 'react-native';\n\nimport { ChatHeader } from './ChatHeader.js';\nimport { ConversationList } from './ConversationList.js';\nimport { ConversationView } from './ConversationView.js';\nimport { PoolseIcon } from './primitives/PoolseIcon.js';\nimport { Avatar } from './primitives/Avatar.js';\nimport { UserPickerSheet, type InboxUser } from './internal/UserPickerSheet.js';\nimport { usePoolseTheme } from './theme/PoolseTheme.js';\n\nexport type { InboxUser } from './internal/UserPickerSheet.js';\n\n// Height of the ChatHeader we render above ConversationView in the\n// detail pane. Hardcoded because ChatHeader has fixed vertical\n// padding (10 + 36 content + 10 ≈ 56). If you change ChatHeader's\n// padding, bump this constant.\nconst CHAT_HEADER_HEIGHT = 56;\n\nexport interface PoolseInboxProps {\n /** Header title above the conversation list. Defaults to \"Chats\". */\n title?: string;\n\n /**\n * The tenant's user directory. When provided, the inbox shows\n * \"New chat\" + \"New group\" buttons in the header. Omit if you\n * don't want the built-in picker UI (e.g. you start chats from\n * elsewhere via the imperative `openDirect()` API).\n */\n users?: InboxUser[];\n\n /** Display-name resolver for sender labels / chat header titles. */\n labelFor?: (externalId: string) => string;\n /** Avatar URL resolver. */\n avatarFor?: (externalId: string) => string | null;\n\n /**\n * Right-side slot in the header — typical use is a logout / settings\n * button. Rendered after the New-chat / New-group buttons.\n */\n renderRightAction?: () => ReactNode;\n\n /**\n * Custom row renderer for the conversation list. Receives the\n * conversation + the caller's external_id (resolved via `useMe`)\n * so you can branch on direct-vs-group display.\n */\n renderConversationRow?: (\n conv: Conversation,\n callerExternalId: string | null,\n selected: boolean,\n ) => ReactNode;\n\n /** Custom empty state when the list is empty. */\n emptyState?: ReactNode | string;\n\n /** Forwarded to `<ConversationView>` — set if you have a nav header above. */\n keyboardOffset?: number;\n}\n\nexport interface PoolseInboxHandle {\n /** Open a known conversation (e.g. from a deep link / push tap). */\n open: (conversationId: Uuid) => void;\n /**\n * Open (or create) a direct conversation with the given external_id.\n * The backend dedupes per pair — returns the existing conversation\n * if one already exists. Use this from a \"Message\" button on your\n * user profile screens.\n */\n openDirect: (externalId: string) => Promise<void>;\n /** Open (or create) a group conversation. */\n openGroup: (name: string, memberExternalIds: string[]) => Promise<void>;\n /** Open the built-in \"new chat\" picker programmatically. */\n promptNewChat: () => void;\n /** Open the built-in \"new group\" picker programmatically. */\n promptNewGroup: () => void;\n /** Pop back to the conversation list. */\n close: () => void;\n}\n\n/**\n * Drop-in inbox screen: scrollable list of conversations + chat\n * detail, with an iOS-style slide animation between them. Manages\n * its own navigation stack (no react-navigation needed). Picker\n * sheets for \"New chat\" / \"New group\" appear when `users` is\n * provided; otherwise the dev wires those flows themselves and\n * uses the imperative ref to open conversations.\n *\n * For the \"Message\" button on a user profile screen, hold a ref to\n * the inbox and call `inboxRef.current?.openDirect(externalId)`.\n */\nexport const PoolseInbox = forwardRef<PoolseInboxHandle, PoolseInboxProps>(\n function PoolseInbox(props, ref) {\n const {\n title = 'Chats',\n users,\n labelFor,\n avatarFor,\n renderRightAction,\n renderConversationRow,\n emptyState,\n keyboardOffset = 0,\n } = props;\n\n const theme = usePoolseTheme();\n const { width: screenWidth } = useWindowDimensions();\n const { me } = useMe();\n const {\n conversations,\n create,\n unreadCounts,\n markConversationRead,\n refetch: refetchConversations,\n } = useConversations();\n const meExternalId = me?.external_id ?? null;\n // KAV.frame.y is measured relative to the SafeAreaView's\n // coordinate space (the SafeAreaView already absorbs the\n // safe-area-top inset). So the only chrome we need to compensate\n // for in keyboardVerticalOffset is our own ChatHeader above the\n // KAV. Adding insets.top on top double-counts and pushes the\n // composer way too far above the keyboard.\n const detailKeyboardOffset = CHAT_HEADER_HEIGHT;\n\n const [activeId, setActiveId] = useState<Uuid | null>(null);\n const [userPickerOpen, setUserPickerOpen] = useState(false);\n const [groupPickerOpen, setGroupPickerOpen] = useState(false);\n\n const slide = useRef(new Animated.Value(0)).current;\n // Flipped to true while the user is dragging the detail pane via\n // the edge-swipe gesture so the activeId-driven timing animation\n // doesn't fight the finger.\n const draggingRef = useRef(false);\n useEffect(() => {\n if (draggingRef.current) return;\n Animated.timing(slide, {\n toValue: activeId ? 1 : 0,\n duration: 280,\n easing: Easing.out(Easing.cubic),\n useNativeDriver: true,\n }).start();\n }, [activeId, slide]);\n\n const listTransform = slide.interpolate({\n inputRange: [0, 1],\n outputRange: [0, -Math.round(screenWidth * 0.25)],\n });\n const detailTransform = slide.interpolate({\n inputRange: [0, 1],\n outputRange: [screenWidth, 0],\n });\n\n // ── Edge-swipe-to-dismiss ────────────────────────────────────────\n // A thin invisible strip pinned to the screen's left edge owns a\n // PanResponder that drags the detail pane back to the right. Only\n // arms when:\n // - the detail pane is currently shown (activeId != null), AND\n // - the gesture starts within EDGE_WIDTH of the left screen edge,\n // AND\n // - the first movement is horizontal-dominant + rightward.\n // Those gates keep the strip from eating bubble swipes, vertical\n // scrolls, or back-button taps in the ChatHeader.\n const EDGE_WIDTH = 24;\n const DISMISS_VX_THRESHOLD = 0.4;\n const activeIdRef = useRef(activeId);\n useEffect(() => {\n activeIdRef.current = activeId;\n }, [activeId]);\n const panResponder = useMemo(() => {\n // Commit-vs-snap threshold scales with the screen so the gesture\n // feels right on phone widths AND tablets.\n const dismissDxThreshold = screenWidth * 0.35;\n return PanResponder.create({\n // Never claim the touch on start — that would swallow taps on\n // the back button in the ChatHeader strip.\n onStartShouldSetPanResponder: () => false,\n onStartShouldSetPanResponderCapture: () => false,\n onMoveShouldSetPanResponder: (_e, gs) => {\n if (!activeIdRef.current) return false;\n if (gs.x0 > EDGE_WIDTH) return false;\n return gs.dx > 6 && Math.abs(gs.dx) > Math.abs(gs.dy);\n },\n onMoveShouldSetPanResponderCapture: (_e, gs) => {\n if (!activeIdRef.current) return false;\n if (gs.x0 > EDGE_WIDTH) return false;\n return gs.dx > 6 && Math.abs(gs.dx) > Math.abs(gs.dy);\n },\n onPanResponderGrant: () => {\n draggingRef.current = true;\n slide.stopAnimation();\n },\n onPanResponderMove: (_e, gs) => {\n // Map finger displacement to slide: dx=0 → slide=1\n // (detail fully on); dx=screenWidth → slide=0 (off).\n const dx = Math.max(0, gs.dx);\n const progress = Math.min(1, dx / screenWidth);\n slide.setValue(1 - progress);\n },\n onPanResponderRelease: (_e, gs) => {\n draggingRef.current = false;\n const past = gs.dx > dismissDxThreshold || gs.vx > DISMISS_VX_THRESHOLD;\n if (past) {\n // Let the activeId-effect drive the close animation from\n // wherever the finger left the pane — Animated.timing\n // starts from the current value, so the motion is\n // continuous.\n setActiveId(null);\n } else {\n Animated.timing(slide, {\n toValue: 1,\n duration: 220,\n easing: Easing.out(Easing.cubic),\n useNativeDriver: true,\n }).start();\n }\n },\n onPanResponderTerminate: () => {\n // Another responder took over (rare — scroll, dialog).\n // Snap back to \"open\" so the pane doesn't get stuck.\n draggingRef.current = false;\n Animated.timing(slide, {\n toValue: 1,\n duration: 220,\n easing: Easing.out(Easing.cubic),\n useNativeDriver: true,\n }).start();\n },\n onPanResponderTerminationRequest: () => false,\n });\n }, [slide, screenWidth]);\n\n const openDirect = useCallback(\n async (externalId: string) => {\n const conv = await create({\n type: 'direct',\n member_external_ids: [externalId],\n });\n setActiveId(conv.id);\n },\n [create],\n );\n\n const openGroup = useCallback(\n async (name: string, memberExternalIds: string[]) => {\n const conv = await create({\n type: 'group',\n name,\n member_external_ids: memberExternalIds,\n });\n setActiveId(conv.id);\n },\n [create],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n open: setActiveId,\n openDirect,\n openGroup,\n promptNewChat: () => setUserPickerOpen(true),\n promptNewGroup: () => setGroupPickerOpen(true),\n close: () => setActiveId(null),\n }),\n [openDirect, openGroup],\n );\n\n const renderRow = useCallback(\n (conv: Conversation, selected: boolean) => {\n if (renderConversationRow) {\n return <>{renderConversationRow(conv, meExternalId, selected)}</>;\n }\n // Live unread count from useConversations — updates immediately\n // when markConversationRead fires, instead of waiting for the\n // next list refetch. Falls back to the server snapshot on the\n // conversation row when the live map doesn't have an entry yet.\n const unread = unreadCounts?.[conv.id] ?? conv.unread_count ?? 0;\n return (\n <DefaultConversationRow\n conv={conv}\n selected={selected}\n meExternalId={meExternalId}\n unread={unread}\n {...(labelFor ? { labelFor } : {})}\n {...(avatarFor ? { avatarFor } : {})}\n onPress={() => setActiveId(conv.id)}\n />\n );\n },\n [renderConversationRow, meExternalId, labelFor, avatarFor, unreadCounts],\n );\n\n return (\n <View style={[styles.root, { backgroundColor: theme.colors.paper }]}>\n {/* LIST PANE */}\n <Animated.View\n style={[StyleSheet.absoluteFillObject, { transform: [{ translateX: listTransform }] }]}\n pointerEvents={activeId ? 'none' : 'auto'}\n >\n <View\n style={[\n styles.listHeader,\n {\n backgroundColor: theme.colors.surface,\n borderBottomColor: theme.colors.border,\n },\n ]}\n >\n <Text\n style={[\n styles.listTitle,\n { color: theme.colors.ink, fontFamily: theme.type.fontDisplay },\n ]}\n >\n {title}\n </Text>\n <View style={styles.headerActions}>\n {users ? (\n <>\n <HeaderIconButton\n icon=\"compose\"\n onPress={() => setUserPickerOpen(true)}\n label=\"New chat\"\n />\n <HeaderIconButton\n icon=\"users\"\n onPress={() => setGroupPickerOpen(true)}\n label=\"New group\"\n />\n </>\n ) : null}\n {renderRightAction?.()}\n </View>\n </View>\n\n <ConversationList\n conversations={conversations}\n renderItem={renderRow}\n {...(emptyState !== undefined ? { emptyState } : {})}\n />\n </Animated.View>\n\n {/* DETAIL PANE — our own ChatHeader (with onBack wired) above\n a ConversationView with header={false} so they don't stack.\n PanResponder lives on this wrapper (not a separate overlay\n strip) so taps fall straight through to the back button /\n attachment / send buttons — the strip approach would have\n stolen the leftmost slice of those tap targets. The gate in\n onMoveShouldSetPanResponderCapture restricts gestures to\n the left edge + horizontal-dominant + rightward, so vertical\n scrolling, swipe-to-reply on bubbles (which lives further\n inside), and button taps stay unaffected. */}\n <Animated.View\n style={[StyleSheet.absoluteFillObject, { transform: [{ translateX: detailTransform }] }]}\n pointerEvents={activeId ? 'auto' : 'none'}\n {...panResponder.panHandlers}\n >\n {activeId ? (\n <View style={{ flex: 1 }}>\n <ChatHeader\n conversationId={activeId}\n onBack={() => setActiveId(null)}\n {...(labelFor ? { labelFor } : {})}\n {...(avatarFor ? { avatarFor } : {})}\n />\n <ConversationView\n key={activeId}\n conversationId={activeId}\n header={false}\n // Caller override wins; else use safe-area-top + our\n // ChatHeader height as the iOS keyboardVerticalOffset.\n keyboardOffset={keyboardOffset || detailKeyboardOffset}\n onMarkedRead={(convId) => {\n // Optimistic local clear so the badge disappears\n // immediately — server-side cursor was advanced\n // by ConversationView's markReadUpTo.\n markConversationRead(convId);\n }}\n onSent={() => {\n // useConversations is per-call-site state — only\n // OUR refetch updates the list's preview / timestamps.\n void refetchConversations();\n }}\n {...(labelFor ? { labelFor } : {})}\n {...(avatarFor ? { avatarFor } : {})}\n />\n </View>\n ) : null}\n </Animated.View>\n\n {/* Pickers */}\n {users ? (\n <UserPickerSheet\n visible={userPickerOpen}\n onClose={() => setUserPickerOpen(false)}\n users={users}\n excludeIds={meExternalId ? [meExternalId] : []}\n mode=\"single\"\n onPickDirect={(externalId) => {\n void openDirect(externalId);\n }}\n />\n ) : null}\n\n {users ? (\n <UserPickerSheet\n visible={groupPickerOpen}\n onClose={() => setGroupPickerOpen(false)}\n users={users}\n excludeIds={meExternalId ? [meExternalId] : []}\n mode=\"group\"\n onCreateGroup={(name, ids) => {\n void openGroup(name, ids);\n }}\n />\n ) : null}\n </View>\n );\n },\n);\n\nfunction HeaderIconButton({\n icon,\n onPress,\n label,\n}: {\n icon: 'compose' | 'users';\n onPress: () => void;\n label: string;\n}) {\n const theme = usePoolseTheme();\n return (\n <Pressable\n onPress={onPress}\n hitSlop={10}\n accessibilityLabel={label}\n style={({ pressed }) => [\n styles.iconBtn,\n {\n backgroundColor: pressed ? theme.colors.surface2 : 'transparent',\n },\n ]}\n >\n <PoolseIcon name={icon} size={20} color={theme.colors.ink} />\n </Pressable>\n );\n}\n\nfunction DefaultConversationRow({\n conv,\n selected,\n meExternalId,\n unread,\n labelFor,\n avatarFor,\n onPress,\n}: {\n conv: Conversation;\n selected: boolean;\n meExternalId: string | null;\n unread: number;\n labelFor?: (externalId: string) => string;\n avatarFor?: (externalId: string) => string | null;\n onPress: () => void;\n}) {\n const theme = usePoolseTheme();\n\n // For directs, derive display from the OTHER member's external_id\n // (added to Conversation.member_external_ids by the backend). For\n // groups, use the conversation's own name + a group avatar tile.\n const isDirect = conv.type === 'direct';\n const otherExtId =\n isDirect && meExternalId\n ? (conv.member_external_ids ?? []).find((x) => x !== meExternalId)\n : null;\n\n // Priority: explicit prop > SDK userResolver > externalId fallback.\n // Inbox rows are typically the first place an avatar / name shows up\n // for a conversation, so the resolver must run here too — not only\n // inside ConversationView's bubbles.\n const resolvedOther = useUser(isDirect ? (otherExtId ?? null) : null);\n const title = isDirect\n ? otherExtId\n ? (labelFor?.(otherExtId) ?? resolvedOther.profile?.displayName ?? otherExtId)\n : 'Direct chat'\n : (conv.name ?? 'Untitled group');\n\n const avatarUrl =\n isDirect && otherExtId\n ? (avatarFor?.(otherExtId) ?? resolvedOther.profile?.avatarUrl ?? null)\n : null;\n const avatarSeed = isDirect ? (otherExtId ?? conv.id) : conv.id;\n\n return (\n <Pressable\n onPress={onPress}\n style={[\n styles.row,\n {\n backgroundColor: selected ? theme.colors.surface2 : 'transparent',\n borderBottomColor: theme.colors.border,\n },\n ]}\n >\n {avatarUrl ? (\n <Image source={{ uri: avatarUrl }} style={styles.rowAvatar} />\n ) : (\n <Avatar src={null} name={title} seed={avatarSeed} size=\"md\" />\n )}\n <View style={styles.rowBody}>\n <Text\n style={[styles.rowTitle, { color: theme.colors.ink, fontFamily: theme.type.fontBody }]}\n numberOfLines={1}\n >\n {title}\n </Text>\n <Text style={[styles.rowSubtitle, { color: theme.colors.ink3 }]} numberOfLines={1}>\n {conv.last_message_preview ??\n (isDirect ? (otherExtId ?? '') : `${(conv.member_external_ids ?? []).length} members`)}\n </Text>\n </View>\n {unread > 0 ? (\n <View style={[styles.unreadPill, { backgroundColor: theme.colors.unreadPill }]}>\n <Text style={[styles.unreadText, { color: theme.colors.unreadPillText }]}>\n {unread > 99 ? '99+' : String(unread)}\n </Text>\n </View>\n ) : null}\n </Pressable>\n );\n}\n\nconst styles = StyleSheet.create({\n root: {\n flex: 1,\n overflow: 'hidden',\n },\n listHeader: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 14,\n paddingVertical: 10,\n borderBottomWidth: StyleSheet.hairlineWidth,\n gap: 12,\n },\n listTitle: {\n flex: 1,\n fontSize: 20,\n fontWeight: '700',\n },\n headerActions: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 4,\n },\n iconBtn: {\n width: 36,\n height: 36,\n borderRadius: 18,\n alignItems: 'center',\n justifyContent: 'center',\n },\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 14,\n paddingVertical: 12,\n borderBottomWidth: StyleSheet.hairlineWidth,\n gap: 12,\n },\n rowAvatar: {\n width: 44,\n height: 44,\n borderRadius: 22,\n },\n rowBody: {\n flex: 1,\n gap: 2,\n },\n rowTitle: {\n fontSize: 15,\n fontWeight: '600',\n },\n rowSubtitle: {\n fontSize: 12,\n },\n unreadPill: {\n minWidth: 22,\n height: 22,\n borderRadius: 11,\n paddingHorizontal: 7,\n alignItems: 'center',\n justifyContent: 'center',\n },\n unreadText: {\n fontSize: 11,\n fontWeight: '700',\n },\n});\n","import { Svg, Path, Circle, G } from 'react-native-svg';\n\nimport { usePoolseTheme } from '../theme/PoolseTheme.js';\n\nexport type PoolseLogoVariant = 'lockup' | 'mark' | 'wordmark' | 'mono';\n\nexport interface PoolseLogoProps {\n variant?: PoolseLogoVariant;\n /** Height in pixels — width is computed from the variant's aspect ratio. */\n size?: number;\n /** Mono variant accepts a color override; otherwise the theme drives fills. */\n color?: string;\n label?: string | null;\n}\n\nconst TILE_PATH = 'M50 4 C20 4 4 20 4 50 C4 80 20 96 50 96 C80 96 96 80 96 50 C96 20 80 4 50 4 Z';\nconst PULSE_PATH = 'M16 55 H34 L40 55 L47 30 L54 73 L60 55 H72';\nconst WORDMARK_P_PATH =\n 'M62 -169V258V528H194L196 378L214 376Q223 432 246.0 469.0Q269 506 305.5 524.0Q342 542 389 542Q459 542 509.5 508.0Q560 474 587.0 411.0Q614 348 614 260Q614 182 590.5 120.0Q567 58 519.5 22.0Q472 -14 399 -14Q350 -14 316.0 3.5Q282 21 258.5 55.0Q235 89 219 140H200Q206 113 211.0 85.0Q216 57 219.5 31.0Q223 5 223 -19V-169ZM340 113Q373 113 396.5 131.0Q420 149 433.0 182.0Q446 215 446 259Q446 306 432.5 339.5Q419 373 394.0 391.5Q369 410 336 410Q305 410 283.5 396.5Q262 383 248.5 361.5Q235 340 229.0 316.0Q223 292 223 271V249Q223 230 228.0 211.0Q233 192 243.0 174.5Q253 157 267.0 143.0Q281 129 299.5 121.0Q318 113 340 113Z';\nconst WORDMARK_O_PATH =\n 'M305 -14Q225 -14 163.5 17.0Q102 48 67.0 110.0Q32 172 32 265Q32 358 67.0 419.5Q102 481 164.0 511.5Q226 542 306 542Q386 542 448.0 511.0Q510 480 545.0 418.5Q580 357 580 264Q580 169 544.0 107.0Q508 45 445.5 15.5Q383 -14 305 -14ZM310 103Q346 103 370.0 119.5Q394 136 406.0 170.0Q418 204 418 254Q418 307 405.0 343.5Q392 380 366.5 399.5Q341 419 301 419Q267 419 242.5 402.5Q218 386 206.0 352.0Q194 318 194 267Q194 185 224.5 144.0Q255 103 310 103Z';\nconst WORDMARK_L_PATH = 'M62 0V720H220V0Z';\nconst WORDMARK_S_PATH =\n 'M278 -14Q225 -14 182.0 -4.5Q139 5 107.0 23.0Q75 41 54.5 66.5Q34 92 26 123L146 176Q153 159 170.5 141.5Q188 124 217.5 113.0Q247 102 289 102Q329 102 351.5 113.5Q374 125 374 147Q374 163 361.5 172.5Q349 182 324.0 189.5Q299 197 262 204Q224 212 185.0 222.5Q146 233 112.0 251.5Q78 270 57.5 300.5Q37 331 37 378Q37 427 63.0 463.5Q89 500 140.5 521.0Q192 542 266 542Q332 542 382.0 525.0Q432 508 465.5 476.5Q499 445 512 401L383 355Q378 377 362.5 393.0Q347 409 323.5 417.5Q300 426 268 426Q229 426 207.5 414.0Q186 402 186 382Q186 366 200.5 355.5Q215 345 242.0 338.0Q269 331 306 323Q345 315 383.5 304.5Q422 294 453.5 276.5Q485 259 503.5 230.5Q522 202 522 157Q522 104 494.0 65.5Q466 27 411.5 6.5Q357 -14 278 -14Z';\nconst WORDMARK_E_PATH =\n 'M313 -14Q247 -14 195.0 3.5Q143 21 106.5 55.0Q70 89 51.0 139.0Q32 189 32 254Q32 317 50.5 370.0Q69 423 103.5 461.5Q138 500 188.5 521.0Q239 542 302 542Q366 542 414.5 521.5Q463 501 494.5 461.0Q526 421 541.0 363.5Q556 306 551 232L138 229V313L459 316L402 277Q409 327 396.0 358.5Q383 390 358.0 404.5Q333 419 304 419Q269 419 242.5 400.0Q216 381 201.0 345.0Q186 309 186 257Q186 175 221.5 138.0Q257 101 312 101Q339 101 357.0 108.5Q375 116 386.5 127.5Q398 139 404.5 153.0Q411 167 415 180L555 150Q547 113 529.5 83.0Q512 53 482.5 31.0Q453 9 411.5 -2.5Q370 -14 313 -14Z';\n\nconst VARIANT_VB: Record<\n PoolseLogoVariant,\n { vb: [number, number, number, number]; aspect: number }\n> = {\n lockup: { vb: [0, 0, 454, 100], aspect: 4.54 },\n mark: { vb: [0, 0, 100, 100], aspect: 1 },\n wordmark: { vb: [0, 0, 350, 100], aspect: 3.5 },\n mono: { vb: [0, 0, 454, 100], aspect: 4.54 },\n};\n\nexport function PoolseLogo({ variant = 'lockup', size = 28, color, label }: PoolseLogoProps) {\n const theme = usePoolseTheme();\n const mono = variant === 'mono';\n const monoColor = color ?? theme.colors.ink;\n\n const tileFill = mono ? 'none' : theme.colors.brand;\n const tileStroke = mono ? monoColor : 'transparent';\n const tileStrokeWidth = mono ? 5 : 0;\n const pulseStroke = mono ? monoColor : theme.colors.onBrand;\n const pulseDotFill = mono ? monoColor : theme.colors.onBrand;\n const inkFill = mono ? monoColor : theme.colors.ink;\n const oFill = mono ? monoColor : theme.colors.brand;\n\n const { vb, aspect } = VARIANT_VB[variant];\n const width = size * aspect;\n const showMark = variant === 'lockup' || variant === 'mark' || variant === 'mono';\n const showWordmark = variant === 'lockup' || variant === 'wordmark' || variant === 'mono';\n const wordmarkOffsetX = variant === 'wordmark' ? 0 : 126;\n\n const a11y = label === null ? {} : { accessibilityLabel: label ?? 'poolse' };\n return (\n <Svg viewBox={vb.join(' ')} width={width} height={size} {...a11y}>\n {showMark ? (\n <>\n <Path d={TILE_PATH} fill={tileFill} stroke={tileStroke} strokeWidth={tileStrokeWidth} />\n <Path\n d={PULSE_PATH}\n fill=\"none\"\n stroke={pulseStroke}\n strokeWidth={9}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <Circle cx={72} cy={55} r={6.2} fill={pulseDotFill} />\n </>\n ) : null}\n {showWordmark ? (\n <G transform={`translate(${wordmarkOffsetX},85.0) scale(0.097222 -0.097222)`}>\n <Path d={WORDMARK_P_PATH} fill={inkFill} transform=\"translate(0,0)\" />\n <Path d={WORDMARK_O_PATH} fill={oFill} transform=\"translate(658,0)\" />\n <Path d={WORDMARK_O_PATH} fill={oFill} transform=\"translate(1280,0)\" />\n <Path d={WORDMARK_L_PATH} fill={inkFill} transform=\"translate(1902,0)\" />\n <Path d={WORDMARK_S_PATH} fill={inkFill} transform=\"translate(2195,0)\" />\n <Path d={WORDMARK_E_PATH} fill={inkFill} transform=\"translate(2754,0)\" />\n </G>\n ) : null}\n </Svg>\n );\n}\n","export { PoolseIcon, type PoolseIconProps, type IconName } from './PoolseIcon.js';\nexport { PoolseLogo, type PoolseLogoProps, type PoolseLogoVariant } from './PoolseLogo.js';\nexport { Avatar, type AvatarProps } from './Avatar.js';\nexport { userColor } from './userColor.js';\n\n// Re-exported as a namespace for the public API surface.\nimport { PoolseIcon } from './PoolseIcon.js';\nimport { PoolseLogo } from './PoolseLogo.js';\nimport { Avatar } from './Avatar.js';\n\nexport const primitives = { PoolseIcon, PoolseLogo, Avatar };\n","import { useEffect } from 'react';\nimport { AppState, type AppStateStatus } from 'react-native';\nimport { usePoolse } from '@poolse/react';\n\n/**\n * Closes the SDK WebSocket cleanly when the app backgrounds and\n * reopens it when the app comes back to the foreground. Designed\n * to pair with push-notification delivery on the dev's backend —\n * iOS / Android suspend sockets aggressively, so we don't fight\n * the OS; we let the push wake the app and resync on resume.\n *\n * Mount once near the root of your app:\n *\n * <PoolseProvider config={config}>\n * <AppShell />\n * </PoolseProvider>\n *\n * function AppShell() {\n * useAppStateLifecycle();\n * return ...;\n * }\n */\nexport function useAppStateLifecycle() {\n const poolse = usePoolse();\n\n useEffect(() => {\n let prev: AppStateStatus = AppState.currentState;\n const sub = AppState.addEventListener('change', (next) => {\n const wasActive = prev === 'active';\n const isActive = next === 'active';\n\n if (wasActive && !isActive) {\n // Going to background — close the WS cleanly. The SDK's\n // realtime layer reopens lazily on the next subscription\n // call, so there's nothing to clean up state-side.\n try {\n poolse.realtime?.disconnect?.();\n } catch {\n // Older SDK builds may not expose disconnect; harmless.\n }\n } else if (!wasActive && isActive) {\n // Returning to foreground — the next hook render that\n // touches `realtime.conversation(...)` will reopen the\n // socket. `useMessages`/`useTyping`/`usePresence` all\n // refetch their starting snapshot on remount, so the active\n // conversation lands fresh.\n try {\n poolse.realtime?.connect?.();\n } catch {\n // Same compat note as above.\n }\n }\n\n prev = next;\n });\n\n return () => sub.remove();\n }, [poolse]);\n}\n"]}
|