@samirify/messenger 0.1.3 → 0.1.4

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.
@@ -278,6 +278,113 @@ function MessageBubble({ message }) {
278
278
  }
279
279
  );
280
280
  }
281
+ function AttachImageIcon({
282
+ color,
283
+ size = 22,
284
+ style
285
+ }) {
286
+ const frame = size * 0.82;
287
+ const mountain = size * 0.28;
288
+ const sun = Math.max(3, size * 0.16);
289
+ return /* @__PURE__ */ jsxRuntime.jsx(
290
+ reactNative.View,
291
+ {
292
+ style: [
293
+ {
294
+ width: size,
295
+ height: size,
296
+ alignItems: "center",
297
+ justifyContent: "center"
298
+ },
299
+ style
300
+ ],
301
+ accessibilityElementsHidden: true,
302
+ importantForAccessibility: "no-hide-descendants",
303
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
304
+ reactNative.View,
305
+ {
306
+ style: {
307
+ width: frame,
308
+ height: frame * 0.78,
309
+ borderWidth: 1.75,
310
+ borderColor: color,
311
+ borderRadius: 3,
312
+ overflow: "hidden",
313
+ justifyContent: "flex-end"
314
+ },
315
+ children: [
316
+ /* @__PURE__ */ jsxRuntime.jsx(
317
+ reactNative.View,
318
+ {
319
+ style: {
320
+ position: "absolute",
321
+ top: size * 0.12,
322
+ left: size * 0.14,
323
+ width: sun,
324
+ height: sun,
325
+ borderRadius: sun / 2,
326
+ backgroundColor: color
327
+ }
328
+ }
329
+ ),
330
+ /* @__PURE__ */ jsxRuntime.jsx(
331
+ reactNative.View,
332
+ {
333
+ style: {
334
+ alignSelf: "flex-start",
335
+ marginLeft: size * 0.08,
336
+ width: 0,
337
+ height: 0,
338
+ borderStyle: "solid",
339
+ borderLeftWidth: mountain * 0.55,
340
+ borderRightWidth: mountain * 0.55,
341
+ borderBottomWidth: mountain,
342
+ borderLeftColor: "transparent",
343
+ borderRightColor: "transparent",
344
+ borderBottomColor: color,
345
+ opacity: 0.9
346
+ }
347
+ }
348
+ )
349
+ ]
350
+ }
351
+ )
352
+ }
353
+ );
354
+ }
355
+ function SendChevronIcon({
356
+ color,
357
+ size = 14
358
+ }) {
359
+ return /* @__PURE__ */ jsxRuntime.jsx(
360
+ reactNative.View,
361
+ {
362
+ style: {
363
+ width: size,
364
+ height: size,
365
+ alignItems: "center",
366
+ justifyContent: "center"
367
+ },
368
+ children: /* @__PURE__ */ jsxRuntime.jsx(
369
+ reactNative.View,
370
+ {
371
+ style: {
372
+ width: 0,
373
+ height: 0,
374
+ marginLeft: size * 0.12,
375
+ borderStyle: "solid",
376
+ borderTopWidth: size * 0.38,
377
+ borderBottomWidth: size * 0.38,
378
+ borderLeftWidth: size * 0.55,
379
+ borderTopColor: "transparent",
380
+ borderBottomColor: "transparent",
381
+ borderLeftColor: color
382
+ }
383
+ }
384
+ )
385
+ }
386
+ );
387
+ }
281
388
  function Composer({
282
389
  sending,
283
390
  onSend
@@ -298,12 +405,13 @@ function Composer({
298
405
  await onSend(text, null);
299
406
  setBody("");
300
407
  }
408
+ const canSend = Boolean(body.trim()) && !sending;
301
409
  return /* @__PURE__ */ jsxRuntime.jsxs(
302
410
  reactNative.View,
303
411
  {
304
412
  style: {
305
413
  flexDirection: isRtl ? "row-reverse" : "row",
306
- alignItems: "flex-end",
414
+ alignItems: "center",
307
415
  gap: 8,
308
416
  paddingHorizontal: 12,
309
417
  paddingVertical: 10,
@@ -312,7 +420,25 @@ function Composer({
312
420
  paddingBottom: reactNative.Platform.OS === "ios" ? 28 : 12
313
421
  },
314
422
  children: [
315
- /* @__PURE__ */ jsxRuntime.jsx(reactNative.TouchableOpacity, { onPress: onPick, hitSlop: 8, disabled: sending, children: /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: { fontSize: 22, color: accentColor }, children: "\u25A3" }) }),
423
+ /* @__PURE__ */ jsxRuntime.jsx(
424
+ reactNative.TouchableOpacity,
425
+ {
426
+ onPress: onPick,
427
+ hitSlop: 10,
428
+ disabled: sending,
429
+ accessibilityRole: "button",
430
+ accessibilityLabel: "Attach image",
431
+ style: {
432
+ width: 40,
433
+ height: 40,
434
+ borderRadius: 20,
435
+ alignItems: "center",
436
+ justifyContent: "center",
437
+ opacity: sending ? 0.45 : 1
438
+ },
439
+ children: /* @__PURE__ */ jsxRuntime.jsx(AttachImageIcon, { color: accentColor, size: 22 })
440
+ }
441
+ ),
316
442
  /* @__PURE__ */ jsxRuntime.jsx(
317
443
  reactNative.TextInput,
318
444
  {
@@ -327,11 +453,12 @@ function Composer({
327
453
  style: {
328
454
  flex: 1,
329
455
  maxHeight: 100,
456
+ minHeight: 40,
330
457
  borderWidth: 1,
331
458
  borderColor: colors.border,
332
- borderRadius: 16,
459
+ borderRadius: 20,
333
460
  paddingHorizontal: 14,
334
- paddingVertical: 10,
461
+ paddingVertical: reactNative.Platform.OS === "ios" ? 10 : 8,
335
462
  color: colors.text,
336
463
  fontFamily: fonts.body,
337
464
  textAlign: isRtl ? "right" : "left",
@@ -343,26 +470,18 @@ function Composer({
343
470
  reactNative.TouchableOpacity,
344
471
  {
345
472
  onPress: onPressSend,
346
- disabled: sending || !body.trim(),
473
+ disabled: !canSend,
474
+ accessibilityRole: "button",
475
+ accessibilityLabel: "Send message",
347
476
  style: {
348
477
  width: 40,
349
478
  height: 40,
350
479
  borderRadius: 20,
351
- backgroundColor: body.trim() ? accentColor : colors.surfaceSecondary,
480
+ backgroundColor: canSend ? accentColor : colors.surfaceSecondary,
352
481
  alignItems: "center",
353
482
  justifyContent: "center"
354
483
  },
355
- children: sending ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.ActivityIndicator, { color: "#FFF", size: "small" }) : /* @__PURE__ */ jsxRuntime.jsx(
356
- reactNative.Text,
357
- {
358
- style: {
359
- color: body.trim() ? "#FFF" : colors.textMuted,
360
- fontSize: 16,
361
- fontWeight: "700"
362
- },
363
- children: "\u27A4"
364
- }
365
- )
484
+ children: sending ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.ActivityIndicator, { color: "#FFF", size: "small" }) : /* @__PURE__ */ jsxRuntime.jsx(SendChevronIcon, { color: canSend ? "#FFF" : colors.textMuted, size: 14 })
366
485
  }
367
486
  )
368
487
  ]
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/native/InboxScreen.tsx","../../src/native/MessageBubble.tsx","../../src/native/Composer.tsx","../../src/native/ThreadScreen.tsx"],"names":["useMessengerConfig","jsx","Fragment","jsxs","View","Text","MessengerI18n","TouchableOpacity","useThreads","useOpenThread","ScrollView","RefreshControl","ActivityIndicator","Image","useState","Platform","TextInput","FeatureOff","useRef","useThread","useSendMessage","KeyboardAvoidingView","FlatList"],"mappings":"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","file":"index.cjs","sourcesContent":["import React from \"react\";\nimport {\n View,\n Text,\n TouchableOpacity,\n ActivityIndicator,\n ScrollView,\n RefreshControl,\n} from \"react-native\";\nimport { useMessengerConfig } from \"../provider\";\nimport { useThreads } from \"../hooks/useThreads\";\nimport { useOpenThread } from \"../hooks/useOpenThread\";\nimport { MessengerI18n } from \"../i18nKeys\";\nimport type { MessageThread } from \"../types\";\n\nfunction FeatureOff() {\n const { t, theme, navigation, onFeatureOff } = useMessengerConfig();\n if (onFeatureOff) return <>{onFeatureOff()}</>;\n const { colors, accentColor } = theme;\n return (\n <View\n style={{\n flex: 1,\n backgroundColor: colors.background,\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 24,\n }}\n >\n <Text style={{ color: colors.textMuted, textAlign: \"center\" }}>\n {t(MessengerI18n.off.key, MessengerI18n.off.fallback)}\n </Text>\n <TouchableOpacity onPress={navigation.goBack} style={{ marginTop: 16 }}>\n <Text style={{ color: accentColor }}>\n {t(MessengerI18n.back.key, MessengerI18n.back.fallback)}\n </Text>\n </TouchableOpacity>\n </View>\n );\n}\n\nfunction ThreadRow({ thread }: { thread: MessageThread }) {\n const { user, t, isRtl, theme, navigation } = useMessengerConfig();\n const { colors, accentColor, fonts } = theme;\n const unread = Number(thread.unread_count ?? 0);\n\n return (\n <TouchableOpacity\n onPress={() => navigation.openThread(thread.id)}\n activeOpacity={0.8}\n >\n <View\n style={{\n marginBottom: 10,\n padding: 14,\n borderRadius: 14,\n backgroundColor: colors.surface,\n borderWidth: 1,\n borderColor: colors.border,\n }}\n >\n <View\n style={{\n flexDirection: isRtl ? \"row-reverse\" : \"row\",\n alignItems: \"center\",\n gap: 12,\n }}\n >\n <View style={{ flex: 1 }}>\n <Text\n style={{\n color: colors.text,\n fontFamily: fonts.displaySemiBold,\n fontWeight: \"600\",\n fontSize: 16,\n }}\n >\n {user?.role === \"admin\"\n ? thread.client_name ??\n t(MessengerI18n.client.key, MessengerI18n.client.fallback)\n : t(\n MessengerI18n.yourCoach.key,\n MessengerI18n.yourCoach.fallback\n )}\n </Text>\n <Text\n style={{\n color: colors.textSecondary,\n fontFamily: fonts.body,\n fontSize: 13,\n marginTop: 4,\n }}\n numberOfLines={1}\n >\n {thread.last_body ||\n (thread.last_image_url\n ? t(MessengerI18n.photo.key, MessengerI18n.photo.fallback)\n : t(\n MessengerI18n.noMessages.key,\n MessengerI18n.noMessages.fallback\n ))}\n </Text>\n </View>\n {unread > 0 && (\n <View\n style={{\n minWidth: 22,\n height: 22,\n borderRadius: 11,\n backgroundColor: accentColor,\n alignItems: \"center\",\n justifyContent: \"center\",\n paddingHorizontal: 6,\n }}\n >\n <Text\n style={{\n color: \"#FFF\",\n fontSize: 11,\n fontFamily: fonts.bodySemiBold,\n fontWeight: \"600\",\n }}\n >\n {unread}\n </Text>\n </View>\n )}\n </View>\n </View>\n </TouchableOpacity>\n );\n}\n\nexport function InboxScreen() {\n const { enabled, user, t, isRtl, theme, navigation } = useMessengerConfig();\n const { colors, accentColor, fonts } = theme;\n const threadsQuery = useThreads();\n const openThread = useOpenThread();\n\n if (!enabled) return <FeatureOff />;\n\n const threads = threadsQuery.data ?? [];\n const loading = threadsQuery.isLoading && threads.length === 0;\n\n return (\n <View style={{ flex: 1, backgroundColor: colors.background }}>\n <View\n style={{\n paddingTop: 56,\n paddingHorizontal: 16,\n paddingBottom: 12,\n flexDirection: isRtl ? \"row-reverse\" : \"row\",\n alignItems: \"center\",\n gap: 12,\n }}\n >\n <TouchableOpacity onPress={navigation.goBack} hitSlop={12}>\n <Text style={{ fontSize: 22, color: colors.text }}>\n {isRtl ? \"→\" : \"←\"}\n </Text>\n </TouchableOpacity>\n <Text\n style={{\n color: colors.text,\n fontSize: 22,\n fontFamily: fonts.displayBold,\n fontWeight: \"700\",\n flex: 1,\n }}\n >\n {t(MessengerI18n.inbox.key, MessengerI18n.inbox.fallback)}\n </Text>\n </View>\n\n <ScrollView\n contentContainerStyle={{ paddingHorizontal: 16, paddingBottom: 32 }}\n refreshControl={\n <RefreshControl\n refreshing={threadsQuery.isRefetching}\n onRefresh={() => void threadsQuery.refetch()}\n tintColor={accentColor}\n />\n }\n >\n {user?.role === \"client\" && threads.length === 0 && (\n <TouchableOpacity\n onPress={() => openThread.mutate(undefined)}\n disabled={openThread.isPending}\n style={{\n marginBottom: 14,\n paddingVertical: 14,\n borderRadius: 12,\n backgroundColor: accentColor,\n alignItems: \"center\",\n }}\n >\n {openThread.isPending ? (\n <ActivityIndicator color=\"#FFF\" />\n ) : (\n <Text\n style={{\n color: \"#FFF\",\n fontFamily: fonts.bodySemiBold,\n fontWeight: \"600\",\n }}\n >\n {t(\n MessengerI18n.messageCoach.key,\n MessengerI18n.messageCoach.fallback\n )}\n </Text>\n )}\n </TouchableOpacity>\n )}\n\n {loading ? (\n <ActivityIndicator color={accentColor} style={{ marginTop: 40 }} />\n ) : threads.length === 0 ? (\n <View\n style={{\n alignItems: \"center\",\n paddingVertical: 40,\n borderRadius: 14,\n backgroundColor: colors.surface,\n borderWidth: 1,\n borderColor: colors.border,\n }}\n >\n <Text style={{ fontSize: 28, color: colors.textMuted }}>···</Text>\n <Text\n style={{\n color: colors.textMuted,\n marginTop: 12,\n fontFamily: fonts.body,\n textAlign: \"center\",\n }}\n >\n {t(MessengerI18n.empty.key, MessengerI18n.empty.fallback)}\n </Text>\n </View>\n ) : (\n threads.map((th: MessageThread) => (\n <ThreadRow key={th.id} thread={th} />\n ))\n )}\n </ScrollView>\n </View>\n );\n}\n","import React from \"react\";\nimport { View, Text, Image } from \"react-native\";\nimport type { ChatMessage } from \"../types\";\nimport { useMessengerConfig } from \"../provider\";\n\nexport function MessageBubble({ message }: { message: ChatMessage }) {\n const { user, isRtl, theme } = useMessengerConfig();\n const { colors, accentColor, fonts } = theme;\n const mine = message.sender_user_id === user?.id;\n\n return (\n <View\n style={{\n alignSelf: mine\n ? isRtl\n ? \"flex-start\"\n : \"flex-end\"\n : isRtl\n ? \"flex-end\"\n : \"flex-start\",\n maxWidth: \"80%\",\n marginBottom: 10,\n backgroundColor: mine ? accentColor : colors.surfaceSecondary,\n borderRadius: 16,\n paddingHorizontal: 12,\n paddingVertical: 10,\n }}\n >\n {message.image_url ? (\n <Image\n source={{ uri: message.image_url }}\n style={{\n width: 180,\n height: 180,\n borderRadius: 10,\n marginBottom: message.body ? 8 : 0,\n }}\n />\n ) : null}\n {message.body ? (\n <Text\n style={{\n color: mine ? \"#FFF\" : colors.text,\n fontFamily: fonts.body,\n fontSize: 15,\n }}\n >\n {message.body}\n </Text>\n ) : null}\n </View>\n );\n}\n","import React, { useState } from \"react\";\nimport {\n View,\n Text,\n TextInput,\n TouchableOpacity,\n ActivityIndicator,\n Platform,\n} from \"react-native\";\nimport { useMessengerConfig } from \"../provider\";\nimport { MessengerI18n } from \"../i18nKeys\";\nimport type { PickedImage } from \"../types\";\n\nexport function Composer({\n sending,\n onSend,\n}: {\n sending: boolean;\n onSend: (body: string, image?: PickedImage | null) => void | Promise<void>;\n}) {\n const { t, isRtl, theme, pickImage } = useMessengerConfig();\n const { colors, accentColor, fonts } = theme;\n const [body, setBody] = useState(\"\");\n\n async function onPick() {\n const image = await pickImage();\n if (image) {\n await onSend(body, image);\n setBody(\"\");\n }\n }\n\n async function onPressSend() {\n if (!body.trim() || sending) return;\n const text = body;\n await onSend(text, null);\n setBody(\"\");\n }\n\n return (\n <View\n style={{\n flexDirection: isRtl ? \"row-reverse\" : \"row\",\n alignItems: \"flex-end\",\n gap: 8,\n paddingHorizontal: 12,\n paddingVertical: 10,\n borderTopWidth: 1,\n borderTopColor: colors.border,\n paddingBottom: Platform.OS === \"ios\" ? 28 : 12,\n }}\n >\n <TouchableOpacity onPress={onPick} hitSlop={8} disabled={sending}>\n <Text style={{ fontSize: 22, color: accentColor }}>▣</Text>\n </TouchableOpacity>\n <TextInput\n value={body}\n onChangeText={setBody}\n placeholder={t(\n MessengerI18n.typeMessage.key,\n MessengerI18n.typeMessage.fallback\n )}\n placeholderTextColor={colors.textMuted}\n multiline\n style={{\n flex: 1,\n maxHeight: 100,\n borderWidth: 1,\n borderColor: colors.border,\n borderRadius: 16,\n paddingHorizontal: 14,\n paddingVertical: 10,\n color: colors.text,\n fontFamily: fonts.body,\n textAlign: isRtl ? \"right\" : \"left\",\n backgroundColor: colors.surface,\n }}\n />\n <TouchableOpacity\n onPress={onPressSend}\n disabled={sending || !body.trim()}\n style={{\n width: 40,\n height: 40,\n borderRadius: 20,\n backgroundColor: body.trim()\n ? accentColor\n : colors.surfaceSecondary,\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {sending ? (\n <ActivityIndicator color=\"#FFF\" size=\"small\" />\n ) : (\n <Text\n style={{\n color: body.trim() ? \"#FFF\" : colors.textMuted,\n fontSize: 16,\n fontWeight: \"700\",\n }}\n >\n ➤\n </Text>\n )}\n </TouchableOpacity>\n </View>\n );\n}\n","import React, { useRef } from \"react\";\nimport {\n View,\n Text,\n TouchableOpacity,\n ActivityIndicator,\n FlatList,\n KeyboardAvoidingView,\n Platform,\n} from \"react-native\";\nimport { useMessengerConfig } from \"../provider\";\nimport { useThread } from \"../hooks/useThread\";\nimport { useSendMessage } from \"../hooks/useSendMessage\";\nimport { MessageBubble } from \"./MessageBubble\";\nimport { Composer } from \"./Composer\";\nimport { MessengerI18n } from \"../i18nKeys\";\nimport type { ChatMessage, PickedImage } from \"../types\";\n\nfunction FeatureOff() {\n const { t, theme, onFeatureOff } = useMessengerConfig();\n if (onFeatureOff) return <>{onFeatureOff()}</>;\n return (\n <View\n style={{\n flex: 1,\n backgroundColor: theme.colors.background,\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <Text style={{ color: theme.colors.textMuted }}>\n {t(MessengerI18n.off.key, MessengerI18n.off.fallback)}\n </Text>\n </View>\n );\n}\n\nexport function ThreadScreen({ threadId }: { threadId: number }) {\n const { enabled, t, isRtl, theme, navigation } = useMessengerConfig();\n const { colors, accentColor, fonts } = theme;\n const listRef = useRef<FlatList<ChatMessage> | null>(null);\n const threadQuery = useThread(threadId);\n const sendMutation = useSendMessage(threadId);\n\n if (!enabled) return <FeatureOff />;\n\n const messages = threadQuery.data?.messages ?? [];\n const loading = threadQuery.isLoading && messages.length === 0;\n\n async function handleSend(body: string, image?: PickedImage | null) {\n if ((!body.trim() && !image) || sendMutation.isPending) return;\n await sendMutation.mutateAsync({ body, image });\n setTimeout(() => listRef.current?.scrollToEnd({ animated: true }), 100);\n }\n\n return (\n <KeyboardAvoidingView\n style={{ flex: 1, backgroundColor: colors.background }}\n behavior={Platform.OS === \"ios\" ? \"padding\" : undefined}\n keyboardVerticalOffset={0}\n >\n <View\n style={{\n paddingTop: 56,\n paddingHorizontal: 16,\n paddingBottom: 12,\n flexDirection: isRtl ? \"row-reverse\" : \"row\",\n alignItems: \"center\",\n gap: 12,\n borderBottomWidth: 1,\n borderBottomColor: colors.border,\n }}\n >\n <TouchableOpacity onPress={navigation.goBack} hitSlop={12}>\n <Text style={{ fontSize: 22, color: colors.text }}>\n {isRtl ? \"→\" : \"←\"}\n </Text>\n </TouchableOpacity>\n <Text\n style={{\n color: colors.text,\n fontSize: 18,\n fontFamily: fonts.displayBold,\n fontWeight: \"700\",\n flex: 1,\n }}\n >\n {t(MessengerI18n.chat.key, MessengerI18n.chat.fallback)}\n </Text>\n </View>\n\n {loading ? (\n <ActivityIndicator color={accentColor} style={{ marginTop: 40 }} />\n ) : (\n <FlatList\n ref={listRef}\n data={messages}\n keyExtractor={(m: ChatMessage) => String(m.id)}\n contentContainerStyle={{ padding: 16, paddingBottom: 8 }}\n onContentSizeChange={() =>\n listRef.current?.scrollToEnd({ animated: false })\n }\n ListEmptyComponent={\n <Text\n style={{\n color: colors.textMuted,\n textAlign: \"center\",\n marginTop: 40,\n fontFamily: fonts.body,\n }}\n >\n {t(\n MessengerI18n.startConversation.key,\n MessengerI18n.startConversation.fallback\n )}\n </Text>\n }\n renderItem={({ item }: { item: ChatMessage }) => (\n <MessageBubble message={item} />\n )}\n />\n )}\n\n <Composer sending={sendMutation.isPending} onSend={handleSend} />\n </KeyboardAvoidingView>\n );\n}\n"]}
1
+ {"version":3,"sources":["../../src/native/InboxScreen.tsx","../../src/native/MessageBubble.tsx","../../src/native/icons.tsx","../../src/native/Composer.tsx","../../src/native/ThreadScreen.tsx"],"names":["useMessengerConfig","jsx","Fragment","jsxs","View","Text","MessengerI18n","TouchableOpacity","useThreads","useOpenThread","ScrollView","RefreshControl","ActivityIndicator","Image","useState","Platform","TextInput","FeatureOff","useRef","useThread","useSendMessage","KeyboardAvoidingView","FlatList"],"mappings":"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","file":"index.cjs","sourcesContent":["import React from \"react\";\nimport {\n View,\n Text,\n TouchableOpacity,\n ActivityIndicator,\n ScrollView,\n RefreshControl,\n} from \"react-native\";\nimport { useMessengerConfig } from \"../provider\";\nimport { useThreads } from \"../hooks/useThreads\";\nimport { useOpenThread } from \"../hooks/useOpenThread\";\nimport { MessengerI18n } from \"../i18nKeys\";\nimport type { MessageThread } from \"../types\";\n\nfunction FeatureOff() {\n const { t, theme, navigation, onFeatureOff } = useMessengerConfig();\n if (onFeatureOff) return <>{onFeatureOff()}</>;\n const { colors, accentColor } = theme;\n return (\n <View\n style={{\n flex: 1,\n backgroundColor: colors.background,\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 24,\n }}\n >\n <Text style={{ color: colors.textMuted, textAlign: \"center\" }}>\n {t(MessengerI18n.off.key, MessengerI18n.off.fallback)}\n </Text>\n <TouchableOpacity onPress={navigation.goBack} style={{ marginTop: 16 }}>\n <Text style={{ color: accentColor }}>\n {t(MessengerI18n.back.key, MessengerI18n.back.fallback)}\n </Text>\n </TouchableOpacity>\n </View>\n );\n}\n\nfunction ThreadRow({ thread }: { thread: MessageThread }) {\n const { user, t, isRtl, theme, navigation } = useMessengerConfig();\n const { colors, accentColor, fonts } = theme;\n const unread = Number(thread.unread_count ?? 0);\n\n return (\n <TouchableOpacity\n onPress={() => navigation.openThread(thread.id)}\n activeOpacity={0.8}\n >\n <View\n style={{\n marginBottom: 10,\n padding: 14,\n borderRadius: 14,\n backgroundColor: colors.surface,\n borderWidth: 1,\n borderColor: colors.border,\n }}\n >\n <View\n style={{\n flexDirection: isRtl ? \"row-reverse\" : \"row\",\n alignItems: \"center\",\n gap: 12,\n }}\n >\n <View style={{ flex: 1 }}>\n <Text\n style={{\n color: colors.text,\n fontFamily: fonts.displaySemiBold,\n fontWeight: \"600\",\n fontSize: 16,\n }}\n >\n {user?.role === \"admin\"\n ? thread.client_name ??\n t(MessengerI18n.client.key, MessengerI18n.client.fallback)\n : t(\n MessengerI18n.yourCoach.key,\n MessengerI18n.yourCoach.fallback\n )}\n </Text>\n <Text\n style={{\n color: colors.textSecondary,\n fontFamily: fonts.body,\n fontSize: 13,\n marginTop: 4,\n }}\n numberOfLines={1}\n >\n {thread.last_body ||\n (thread.last_image_url\n ? t(MessengerI18n.photo.key, MessengerI18n.photo.fallback)\n : t(\n MessengerI18n.noMessages.key,\n MessengerI18n.noMessages.fallback\n ))}\n </Text>\n </View>\n {unread > 0 && (\n <View\n style={{\n minWidth: 22,\n height: 22,\n borderRadius: 11,\n backgroundColor: accentColor,\n alignItems: \"center\",\n justifyContent: \"center\",\n paddingHorizontal: 6,\n }}\n >\n <Text\n style={{\n color: \"#FFF\",\n fontSize: 11,\n fontFamily: fonts.bodySemiBold,\n fontWeight: \"600\",\n }}\n >\n {unread}\n </Text>\n </View>\n )}\n </View>\n </View>\n </TouchableOpacity>\n );\n}\n\nexport function InboxScreen() {\n const { enabled, user, t, isRtl, theme, navigation } = useMessengerConfig();\n const { colors, accentColor, fonts } = theme;\n const threadsQuery = useThreads();\n const openThread = useOpenThread();\n\n if (!enabled) return <FeatureOff />;\n\n const threads = threadsQuery.data ?? [];\n const loading = threadsQuery.isLoading && threads.length === 0;\n\n return (\n <View style={{ flex: 1, backgroundColor: colors.background }}>\n <View\n style={{\n paddingTop: 56,\n paddingHorizontal: 16,\n paddingBottom: 12,\n flexDirection: isRtl ? \"row-reverse\" : \"row\",\n alignItems: \"center\",\n gap: 12,\n }}\n >\n <TouchableOpacity onPress={navigation.goBack} hitSlop={12}>\n <Text style={{ fontSize: 22, color: colors.text }}>\n {isRtl ? \"→\" : \"←\"}\n </Text>\n </TouchableOpacity>\n <Text\n style={{\n color: colors.text,\n fontSize: 22,\n fontFamily: fonts.displayBold,\n fontWeight: \"700\",\n flex: 1,\n }}\n >\n {t(MessengerI18n.inbox.key, MessengerI18n.inbox.fallback)}\n </Text>\n </View>\n\n <ScrollView\n contentContainerStyle={{ paddingHorizontal: 16, paddingBottom: 32 }}\n refreshControl={\n <RefreshControl\n refreshing={threadsQuery.isRefetching}\n onRefresh={() => void threadsQuery.refetch()}\n tintColor={accentColor}\n />\n }\n >\n {user?.role === \"client\" && threads.length === 0 && (\n <TouchableOpacity\n onPress={() => openThread.mutate(undefined)}\n disabled={openThread.isPending}\n style={{\n marginBottom: 14,\n paddingVertical: 14,\n borderRadius: 12,\n backgroundColor: accentColor,\n alignItems: \"center\",\n }}\n >\n {openThread.isPending ? (\n <ActivityIndicator color=\"#FFF\" />\n ) : (\n <Text\n style={{\n color: \"#FFF\",\n fontFamily: fonts.bodySemiBold,\n fontWeight: \"600\",\n }}\n >\n {t(\n MessengerI18n.messageCoach.key,\n MessengerI18n.messageCoach.fallback\n )}\n </Text>\n )}\n </TouchableOpacity>\n )}\n\n {loading ? (\n <ActivityIndicator color={accentColor} style={{ marginTop: 40 }} />\n ) : threads.length === 0 ? (\n <View\n style={{\n alignItems: \"center\",\n paddingVertical: 40,\n borderRadius: 14,\n backgroundColor: colors.surface,\n borderWidth: 1,\n borderColor: colors.border,\n }}\n >\n <Text style={{ fontSize: 28, color: colors.textMuted }}>···</Text>\n <Text\n style={{\n color: colors.textMuted,\n marginTop: 12,\n fontFamily: fonts.body,\n textAlign: \"center\",\n }}\n >\n {t(MessengerI18n.empty.key, MessengerI18n.empty.fallback)}\n </Text>\n </View>\n ) : (\n threads.map((th: MessageThread) => (\n <ThreadRow key={th.id} thread={th} />\n ))\n )}\n </ScrollView>\n </View>\n );\n}\n","import React from \"react\";\nimport { View, Text, Image } from \"react-native\";\nimport type { ChatMessage } from \"../types\";\nimport { useMessengerConfig } from \"../provider\";\n\nexport function MessageBubble({ message }: { message: ChatMessage }) {\n const { user, isRtl, theme } = useMessengerConfig();\n const { colors, accentColor, fonts } = theme;\n const mine = message.sender_user_id === user?.id;\n\n return (\n <View\n style={{\n alignSelf: mine\n ? isRtl\n ? \"flex-start\"\n : \"flex-end\"\n : isRtl\n ? \"flex-end\"\n : \"flex-start\",\n maxWidth: \"80%\",\n marginBottom: 10,\n backgroundColor: mine ? accentColor : colors.surfaceSecondary,\n borderRadius: 16,\n paddingHorizontal: 12,\n paddingVertical: 10,\n }}\n >\n {message.image_url ? (\n <Image\n source={{ uri: message.image_url }}\n style={{\n width: 180,\n height: 180,\n borderRadius: 10,\n marginBottom: message.body ? 8 : 0,\n }}\n />\n ) : null}\n {message.body ? (\n <Text\n style={{\n color: mine ? \"#FFF\" : colors.text,\n fontFamily: fonts.body,\n fontSize: 15,\n }}\n >\n {message.body}\n </Text>\n ) : null}\n </View>\n );\n}\n","import React from \"react\";\nimport { View, type StyleProp, type ViewStyle } from \"react-native\";\n\n/** Landscape image glyph — no emoji / unicode font dependency. */\nexport function AttachImageIcon({\n color,\n size = 22,\n style,\n}: {\n color: string;\n size?: number;\n style?: StyleProp<ViewStyle>;\n}) {\n const frame = size * 0.82;\n const mountain = size * 0.28;\n const sun = Math.max(3, size * 0.16);\n\n return (\n <View\n style={[\n {\n width: size,\n height: size,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n style,\n ]}\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n >\n <View\n style={{\n width: frame,\n height: frame * 0.78,\n borderWidth: 1.75,\n borderColor: color,\n borderRadius: 3,\n overflow: \"hidden\",\n justifyContent: \"flex-end\",\n }}\n >\n <View\n style={{\n position: \"absolute\",\n top: size * 0.12,\n left: size * 0.14,\n width: sun,\n height: sun,\n borderRadius: sun / 2,\n backgroundColor: color,\n }}\n />\n <View\n style={{\n alignSelf: \"flex-start\",\n marginLeft: size * 0.08,\n width: 0,\n height: 0,\n borderStyle: \"solid\",\n borderLeftWidth: mountain * 0.55,\n borderRightWidth: mountain * 0.55,\n borderBottomWidth: mountain,\n borderLeftColor: \"transparent\",\n borderRightColor: \"transparent\",\n borderBottomColor: color,\n opacity: 0.9,\n }}\n />\n </View>\n </View>\n );\n}\n\n/** Send chevron drawn with Views so it aligns in the circular button. */\nexport function SendChevronIcon({\n color,\n size = 14,\n}: {\n color: string;\n size?: number;\n}) {\n return (\n <View\n style={{\n width: size,\n height: size,\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <View\n style={{\n width: 0,\n height: 0,\n marginLeft: size * 0.12,\n borderStyle: \"solid\",\n borderTopWidth: size * 0.38,\n borderBottomWidth: size * 0.38,\n borderLeftWidth: size * 0.55,\n borderTopColor: \"transparent\",\n borderBottomColor: \"transparent\",\n borderLeftColor: color,\n }}\n />\n </View>\n );\n}\n","import React, { useState } from \"react\";\nimport {\n View,\n TextInput,\n TouchableOpacity,\n ActivityIndicator,\n Platform,\n} from \"react-native\";\nimport { useMessengerConfig } from \"../provider\";\nimport { MessengerI18n } from \"../i18nKeys\";\nimport type { PickedImage } from \"../types\";\nimport { AttachImageIcon, SendChevronIcon } from \"./icons\";\n\nexport function Composer({\n sending,\n onSend,\n}: {\n sending: boolean;\n onSend: (body: string, image?: PickedImage | null) => void | Promise<void>;\n}) {\n const { t, isRtl, theme, pickImage } = useMessengerConfig();\n const { colors, accentColor, fonts } = theme;\n const [body, setBody] = useState(\"\");\n\n async function onPick() {\n const image = await pickImage();\n if (image) {\n await onSend(body, image);\n setBody(\"\");\n }\n }\n\n async function onPressSend() {\n if (!body.trim() || sending) return;\n const text = body;\n await onSend(text, null);\n setBody(\"\");\n }\n\n const canSend = Boolean(body.trim()) && !sending;\n\n return (\n <View\n style={{\n flexDirection: isRtl ? \"row-reverse\" : \"row\",\n alignItems: \"center\",\n gap: 8,\n paddingHorizontal: 12,\n paddingVertical: 10,\n borderTopWidth: 1,\n borderTopColor: colors.border,\n paddingBottom: Platform.OS === \"ios\" ? 28 : 12,\n }}\n >\n <TouchableOpacity\n onPress={onPick}\n hitSlop={10}\n disabled={sending}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Attach image\"\n style={{\n width: 40,\n height: 40,\n borderRadius: 20,\n alignItems: \"center\",\n justifyContent: \"center\",\n opacity: sending ? 0.45 : 1,\n }}\n >\n <AttachImageIcon color={accentColor} size={22} />\n </TouchableOpacity>\n <TextInput\n value={body}\n onChangeText={setBody}\n placeholder={t(\n MessengerI18n.typeMessage.key,\n MessengerI18n.typeMessage.fallback\n )}\n placeholderTextColor={colors.textMuted}\n multiline\n style={{\n flex: 1,\n maxHeight: 100,\n minHeight: 40,\n borderWidth: 1,\n borderColor: colors.border,\n borderRadius: 20,\n paddingHorizontal: 14,\n paddingVertical: Platform.OS === \"ios\" ? 10 : 8,\n color: colors.text,\n fontFamily: fonts.body,\n textAlign: isRtl ? \"right\" : \"left\",\n backgroundColor: colors.surface,\n }}\n />\n <TouchableOpacity\n onPress={onPressSend}\n disabled={!canSend}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Send message\"\n style={{\n width: 40,\n height: 40,\n borderRadius: 20,\n backgroundColor: canSend ? accentColor : colors.surfaceSecondary,\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {sending ? (\n <ActivityIndicator color=\"#FFF\" size=\"small\" />\n ) : (\n <SendChevronIcon color={canSend ? \"#FFF\" : colors.textMuted} size={14} />\n )}\n </TouchableOpacity>\n </View>\n );\n}\n","import React, { useRef } from \"react\";\nimport {\n View,\n Text,\n TouchableOpacity,\n ActivityIndicator,\n FlatList,\n KeyboardAvoidingView,\n Platform,\n} from \"react-native\";\nimport { useMessengerConfig } from \"../provider\";\nimport { useThread } from \"../hooks/useThread\";\nimport { useSendMessage } from \"../hooks/useSendMessage\";\nimport { MessageBubble } from \"./MessageBubble\";\nimport { Composer } from \"./Composer\";\nimport { MessengerI18n } from \"../i18nKeys\";\nimport type { ChatMessage, PickedImage } from \"../types\";\n\nfunction FeatureOff() {\n const { t, theme, onFeatureOff } = useMessengerConfig();\n if (onFeatureOff) return <>{onFeatureOff()}</>;\n return (\n <View\n style={{\n flex: 1,\n backgroundColor: theme.colors.background,\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <Text style={{ color: theme.colors.textMuted }}>\n {t(MessengerI18n.off.key, MessengerI18n.off.fallback)}\n </Text>\n </View>\n );\n}\n\nexport function ThreadScreen({ threadId }: { threadId: number }) {\n const { enabled, t, isRtl, theme, navigation } = useMessengerConfig();\n const { colors, accentColor, fonts } = theme;\n const listRef = useRef<FlatList<ChatMessage> | null>(null);\n const threadQuery = useThread(threadId);\n const sendMutation = useSendMessage(threadId);\n\n if (!enabled) return <FeatureOff />;\n\n const messages = threadQuery.data?.messages ?? [];\n const loading = threadQuery.isLoading && messages.length === 0;\n\n async function handleSend(body: string, image?: PickedImage | null) {\n if ((!body.trim() && !image) || sendMutation.isPending) return;\n await sendMutation.mutateAsync({ body, image });\n setTimeout(() => listRef.current?.scrollToEnd({ animated: true }), 100);\n }\n\n return (\n <KeyboardAvoidingView\n style={{ flex: 1, backgroundColor: colors.background }}\n behavior={Platform.OS === \"ios\" ? \"padding\" : undefined}\n keyboardVerticalOffset={0}\n >\n <View\n style={{\n paddingTop: 56,\n paddingHorizontal: 16,\n paddingBottom: 12,\n flexDirection: isRtl ? \"row-reverse\" : \"row\",\n alignItems: \"center\",\n gap: 12,\n borderBottomWidth: 1,\n borderBottomColor: colors.border,\n }}\n >\n <TouchableOpacity onPress={navigation.goBack} hitSlop={12}>\n <Text style={{ fontSize: 22, color: colors.text }}>\n {isRtl ? \"→\" : \"←\"}\n </Text>\n </TouchableOpacity>\n <Text\n style={{\n color: colors.text,\n fontSize: 18,\n fontFamily: fonts.displayBold,\n fontWeight: \"700\",\n flex: 1,\n }}\n >\n {t(MessengerI18n.chat.key, MessengerI18n.chat.fallback)}\n </Text>\n </View>\n\n {loading ? (\n <ActivityIndicator color={accentColor} style={{ marginTop: 40 }} />\n ) : (\n <FlatList\n ref={listRef}\n data={messages}\n keyExtractor={(m: ChatMessage) => String(m.id)}\n contentContainerStyle={{ padding: 16, paddingBottom: 8 }}\n onContentSizeChange={() =>\n listRef.current?.scrollToEnd({ animated: false })\n }\n ListEmptyComponent={\n <Text\n style={{\n color: colors.textMuted,\n textAlign: \"center\",\n marginTop: 40,\n fontFamily: fonts.body,\n }}\n >\n {t(\n MessengerI18n.startConversation.key,\n MessengerI18n.startConversation.fallback\n )}\n </Text>\n }\n renderItem={({ item }: { item: ChatMessage }) => (\n <MessageBubble message={item} />\n )}\n />\n )}\n\n <Composer sending={sendMutation.isPending} onSend={handleSend} />\n </KeyboardAvoidingView>\n );\n}\n"]}
@@ -276,6 +276,113 @@ function MessageBubble({ message }) {
276
276
  }
277
277
  );
278
278
  }
279
+ function AttachImageIcon({
280
+ color,
281
+ size = 22,
282
+ style
283
+ }) {
284
+ const frame = size * 0.82;
285
+ const mountain = size * 0.28;
286
+ const sun = Math.max(3, size * 0.16);
287
+ return /* @__PURE__ */ jsx(
288
+ View,
289
+ {
290
+ style: [
291
+ {
292
+ width: size,
293
+ height: size,
294
+ alignItems: "center",
295
+ justifyContent: "center"
296
+ },
297
+ style
298
+ ],
299
+ accessibilityElementsHidden: true,
300
+ importantForAccessibility: "no-hide-descendants",
301
+ children: /* @__PURE__ */ jsxs(
302
+ View,
303
+ {
304
+ style: {
305
+ width: frame,
306
+ height: frame * 0.78,
307
+ borderWidth: 1.75,
308
+ borderColor: color,
309
+ borderRadius: 3,
310
+ overflow: "hidden",
311
+ justifyContent: "flex-end"
312
+ },
313
+ children: [
314
+ /* @__PURE__ */ jsx(
315
+ View,
316
+ {
317
+ style: {
318
+ position: "absolute",
319
+ top: size * 0.12,
320
+ left: size * 0.14,
321
+ width: sun,
322
+ height: sun,
323
+ borderRadius: sun / 2,
324
+ backgroundColor: color
325
+ }
326
+ }
327
+ ),
328
+ /* @__PURE__ */ jsx(
329
+ View,
330
+ {
331
+ style: {
332
+ alignSelf: "flex-start",
333
+ marginLeft: size * 0.08,
334
+ width: 0,
335
+ height: 0,
336
+ borderStyle: "solid",
337
+ borderLeftWidth: mountain * 0.55,
338
+ borderRightWidth: mountain * 0.55,
339
+ borderBottomWidth: mountain,
340
+ borderLeftColor: "transparent",
341
+ borderRightColor: "transparent",
342
+ borderBottomColor: color,
343
+ opacity: 0.9
344
+ }
345
+ }
346
+ )
347
+ ]
348
+ }
349
+ )
350
+ }
351
+ );
352
+ }
353
+ function SendChevronIcon({
354
+ color,
355
+ size = 14
356
+ }) {
357
+ return /* @__PURE__ */ jsx(
358
+ View,
359
+ {
360
+ style: {
361
+ width: size,
362
+ height: size,
363
+ alignItems: "center",
364
+ justifyContent: "center"
365
+ },
366
+ children: /* @__PURE__ */ jsx(
367
+ View,
368
+ {
369
+ style: {
370
+ width: 0,
371
+ height: 0,
372
+ marginLeft: size * 0.12,
373
+ borderStyle: "solid",
374
+ borderTopWidth: size * 0.38,
375
+ borderBottomWidth: size * 0.38,
376
+ borderLeftWidth: size * 0.55,
377
+ borderTopColor: "transparent",
378
+ borderBottomColor: "transparent",
379
+ borderLeftColor: color
380
+ }
381
+ }
382
+ )
383
+ }
384
+ );
385
+ }
279
386
  function Composer({
280
387
  sending,
281
388
  onSend
@@ -296,12 +403,13 @@ function Composer({
296
403
  await onSend(text, null);
297
404
  setBody("");
298
405
  }
406
+ const canSend = Boolean(body.trim()) && !sending;
299
407
  return /* @__PURE__ */ jsxs(
300
408
  View,
301
409
  {
302
410
  style: {
303
411
  flexDirection: isRtl ? "row-reverse" : "row",
304
- alignItems: "flex-end",
412
+ alignItems: "center",
305
413
  gap: 8,
306
414
  paddingHorizontal: 12,
307
415
  paddingVertical: 10,
@@ -310,7 +418,25 @@ function Composer({
310
418
  paddingBottom: Platform.OS === "ios" ? 28 : 12
311
419
  },
312
420
  children: [
313
- /* @__PURE__ */ jsx(TouchableOpacity, { onPress: onPick, hitSlop: 8, disabled: sending, children: /* @__PURE__ */ jsx(Text, { style: { fontSize: 22, color: accentColor }, children: "\u25A3" }) }),
421
+ /* @__PURE__ */ jsx(
422
+ TouchableOpacity,
423
+ {
424
+ onPress: onPick,
425
+ hitSlop: 10,
426
+ disabled: sending,
427
+ accessibilityRole: "button",
428
+ accessibilityLabel: "Attach image",
429
+ style: {
430
+ width: 40,
431
+ height: 40,
432
+ borderRadius: 20,
433
+ alignItems: "center",
434
+ justifyContent: "center",
435
+ opacity: sending ? 0.45 : 1
436
+ },
437
+ children: /* @__PURE__ */ jsx(AttachImageIcon, { color: accentColor, size: 22 })
438
+ }
439
+ ),
314
440
  /* @__PURE__ */ jsx(
315
441
  TextInput,
316
442
  {
@@ -325,11 +451,12 @@ function Composer({
325
451
  style: {
326
452
  flex: 1,
327
453
  maxHeight: 100,
454
+ minHeight: 40,
328
455
  borderWidth: 1,
329
456
  borderColor: colors.border,
330
- borderRadius: 16,
457
+ borderRadius: 20,
331
458
  paddingHorizontal: 14,
332
- paddingVertical: 10,
459
+ paddingVertical: Platform.OS === "ios" ? 10 : 8,
333
460
  color: colors.text,
334
461
  fontFamily: fonts.body,
335
462
  textAlign: isRtl ? "right" : "left",
@@ -341,26 +468,18 @@ function Composer({
341
468
  TouchableOpacity,
342
469
  {
343
470
  onPress: onPressSend,
344
- disabled: sending || !body.trim(),
471
+ disabled: !canSend,
472
+ accessibilityRole: "button",
473
+ accessibilityLabel: "Send message",
345
474
  style: {
346
475
  width: 40,
347
476
  height: 40,
348
477
  borderRadius: 20,
349
- backgroundColor: body.trim() ? accentColor : colors.surfaceSecondary,
478
+ backgroundColor: canSend ? accentColor : colors.surfaceSecondary,
350
479
  alignItems: "center",
351
480
  justifyContent: "center"
352
481
  },
353
- children: sending ? /* @__PURE__ */ jsx(ActivityIndicator, { color: "#FFF", size: "small" }) : /* @__PURE__ */ jsx(
354
- Text,
355
- {
356
- style: {
357
- color: body.trim() ? "#FFF" : colors.textMuted,
358
- fontSize: 16,
359
- fontWeight: "700"
360
- },
361
- children: "\u27A4"
362
- }
363
- )
482
+ children: sending ? /* @__PURE__ */ jsx(ActivityIndicator, { color: "#FFF", size: "small" }) : /* @__PURE__ */ jsx(SendChevronIcon, { color: canSend ? "#FFF" : colors.textMuted, size: 14 })
364
483
  }
365
484
  )
366
485
  ]
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/native/InboxScreen.tsx","../../src/native/MessageBubble.tsx","../../src/native/Composer.tsx","../../src/native/ThreadScreen.tsx"],"names":["jsxs","View","jsx","Text","TouchableOpacity","ActivityIndicator","FeatureOff","Fragment","Platform"],"mappings":"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","file":"index.js","sourcesContent":["import React from \"react\";\nimport {\n View,\n Text,\n TouchableOpacity,\n ActivityIndicator,\n ScrollView,\n RefreshControl,\n} from \"react-native\";\nimport { useMessengerConfig } from \"../provider\";\nimport { useThreads } from \"../hooks/useThreads\";\nimport { useOpenThread } from \"../hooks/useOpenThread\";\nimport { MessengerI18n } from \"../i18nKeys\";\nimport type { MessageThread } from \"../types\";\n\nfunction FeatureOff() {\n const { t, theme, navigation, onFeatureOff } = useMessengerConfig();\n if (onFeatureOff) return <>{onFeatureOff()}</>;\n const { colors, accentColor } = theme;\n return (\n <View\n style={{\n flex: 1,\n backgroundColor: colors.background,\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 24,\n }}\n >\n <Text style={{ color: colors.textMuted, textAlign: \"center\" }}>\n {t(MessengerI18n.off.key, MessengerI18n.off.fallback)}\n </Text>\n <TouchableOpacity onPress={navigation.goBack} style={{ marginTop: 16 }}>\n <Text style={{ color: accentColor }}>\n {t(MessengerI18n.back.key, MessengerI18n.back.fallback)}\n </Text>\n </TouchableOpacity>\n </View>\n );\n}\n\nfunction ThreadRow({ thread }: { thread: MessageThread }) {\n const { user, t, isRtl, theme, navigation } = useMessengerConfig();\n const { colors, accentColor, fonts } = theme;\n const unread = Number(thread.unread_count ?? 0);\n\n return (\n <TouchableOpacity\n onPress={() => navigation.openThread(thread.id)}\n activeOpacity={0.8}\n >\n <View\n style={{\n marginBottom: 10,\n padding: 14,\n borderRadius: 14,\n backgroundColor: colors.surface,\n borderWidth: 1,\n borderColor: colors.border,\n }}\n >\n <View\n style={{\n flexDirection: isRtl ? \"row-reverse\" : \"row\",\n alignItems: \"center\",\n gap: 12,\n }}\n >\n <View style={{ flex: 1 }}>\n <Text\n style={{\n color: colors.text,\n fontFamily: fonts.displaySemiBold,\n fontWeight: \"600\",\n fontSize: 16,\n }}\n >\n {user?.role === \"admin\"\n ? thread.client_name ??\n t(MessengerI18n.client.key, MessengerI18n.client.fallback)\n : t(\n MessengerI18n.yourCoach.key,\n MessengerI18n.yourCoach.fallback\n )}\n </Text>\n <Text\n style={{\n color: colors.textSecondary,\n fontFamily: fonts.body,\n fontSize: 13,\n marginTop: 4,\n }}\n numberOfLines={1}\n >\n {thread.last_body ||\n (thread.last_image_url\n ? t(MessengerI18n.photo.key, MessengerI18n.photo.fallback)\n : t(\n MessengerI18n.noMessages.key,\n MessengerI18n.noMessages.fallback\n ))}\n </Text>\n </View>\n {unread > 0 && (\n <View\n style={{\n minWidth: 22,\n height: 22,\n borderRadius: 11,\n backgroundColor: accentColor,\n alignItems: \"center\",\n justifyContent: \"center\",\n paddingHorizontal: 6,\n }}\n >\n <Text\n style={{\n color: \"#FFF\",\n fontSize: 11,\n fontFamily: fonts.bodySemiBold,\n fontWeight: \"600\",\n }}\n >\n {unread}\n </Text>\n </View>\n )}\n </View>\n </View>\n </TouchableOpacity>\n );\n}\n\nexport function InboxScreen() {\n const { enabled, user, t, isRtl, theme, navigation } = useMessengerConfig();\n const { colors, accentColor, fonts } = theme;\n const threadsQuery = useThreads();\n const openThread = useOpenThread();\n\n if (!enabled) return <FeatureOff />;\n\n const threads = threadsQuery.data ?? [];\n const loading = threadsQuery.isLoading && threads.length === 0;\n\n return (\n <View style={{ flex: 1, backgroundColor: colors.background }}>\n <View\n style={{\n paddingTop: 56,\n paddingHorizontal: 16,\n paddingBottom: 12,\n flexDirection: isRtl ? \"row-reverse\" : \"row\",\n alignItems: \"center\",\n gap: 12,\n }}\n >\n <TouchableOpacity onPress={navigation.goBack} hitSlop={12}>\n <Text style={{ fontSize: 22, color: colors.text }}>\n {isRtl ? \"→\" : \"←\"}\n </Text>\n </TouchableOpacity>\n <Text\n style={{\n color: colors.text,\n fontSize: 22,\n fontFamily: fonts.displayBold,\n fontWeight: \"700\",\n flex: 1,\n }}\n >\n {t(MessengerI18n.inbox.key, MessengerI18n.inbox.fallback)}\n </Text>\n </View>\n\n <ScrollView\n contentContainerStyle={{ paddingHorizontal: 16, paddingBottom: 32 }}\n refreshControl={\n <RefreshControl\n refreshing={threadsQuery.isRefetching}\n onRefresh={() => void threadsQuery.refetch()}\n tintColor={accentColor}\n />\n }\n >\n {user?.role === \"client\" && threads.length === 0 && (\n <TouchableOpacity\n onPress={() => openThread.mutate(undefined)}\n disabled={openThread.isPending}\n style={{\n marginBottom: 14,\n paddingVertical: 14,\n borderRadius: 12,\n backgroundColor: accentColor,\n alignItems: \"center\",\n }}\n >\n {openThread.isPending ? (\n <ActivityIndicator color=\"#FFF\" />\n ) : (\n <Text\n style={{\n color: \"#FFF\",\n fontFamily: fonts.bodySemiBold,\n fontWeight: \"600\",\n }}\n >\n {t(\n MessengerI18n.messageCoach.key,\n MessengerI18n.messageCoach.fallback\n )}\n </Text>\n )}\n </TouchableOpacity>\n )}\n\n {loading ? (\n <ActivityIndicator color={accentColor} style={{ marginTop: 40 }} />\n ) : threads.length === 0 ? (\n <View\n style={{\n alignItems: \"center\",\n paddingVertical: 40,\n borderRadius: 14,\n backgroundColor: colors.surface,\n borderWidth: 1,\n borderColor: colors.border,\n }}\n >\n <Text style={{ fontSize: 28, color: colors.textMuted }}>···</Text>\n <Text\n style={{\n color: colors.textMuted,\n marginTop: 12,\n fontFamily: fonts.body,\n textAlign: \"center\",\n }}\n >\n {t(MessengerI18n.empty.key, MessengerI18n.empty.fallback)}\n </Text>\n </View>\n ) : (\n threads.map((th: MessageThread) => (\n <ThreadRow key={th.id} thread={th} />\n ))\n )}\n </ScrollView>\n </View>\n );\n}\n","import React from \"react\";\nimport { View, Text, Image } from \"react-native\";\nimport type { ChatMessage } from \"../types\";\nimport { useMessengerConfig } from \"../provider\";\n\nexport function MessageBubble({ message }: { message: ChatMessage }) {\n const { user, isRtl, theme } = useMessengerConfig();\n const { colors, accentColor, fonts } = theme;\n const mine = message.sender_user_id === user?.id;\n\n return (\n <View\n style={{\n alignSelf: mine\n ? isRtl\n ? \"flex-start\"\n : \"flex-end\"\n : isRtl\n ? \"flex-end\"\n : \"flex-start\",\n maxWidth: \"80%\",\n marginBottom: 10,\n backgroundColor: mine ? accentColor : colors.surfaceSecondary,\n borderRadius: 16,\n paddingHorizontal: 12,\n paddingVertical: 10,\n }}\n >\n {message.image_url ? (\n <Image\n source={{ uri: message.image_url }}\n style={{\n width: 180,\n height: 180,\n borderRadius: 10,\n marginBottom: message.body ? 8 : 0,\n }}\n />\n ) : null}\n {message.body ? (\n <Text\n style={{\n color: mine ? \"#FFF\" : colors.text,\n fontFamily: fonts.body,\n fontSize: 15,\n }}\n >\n {message.body}\n </Text>\n ) : null}\n </View>\n );\n}\n","import React, { useState } from \"react\";\nimport {\n View,\n Text,\n TextInput,\n TouchableOpacity,\n ActivityIndicator,\n Platform,\n} from \"react-native\";\nimport { useMessengerConfig } from \"../provider\";\nimport { MessengerI18n } from \"../i18nKeys\";\nimport type { PickedImage } from \"../types\";\n\nexport function Composer({\n sending,\n onSend,\n}: {\n sending: boolean;\n onSend: (body: string, image?: PickedImage | null) => void | Promise<void>;\n}) {\n const { t, isRtl, theme, pickImage } = useMessengerConfig();\n const { colors, accentColor, fonts } = theme;\n const [body, setBody] = useState(\"\");\n\n async function onPick() {\n const image = await pickImage();\n if (image) {\n await onSend(body, image);\n setBody(\"\");\n }\n }\n\n async function onPressSend() {\n if (!body.trim() || sending) return;\n const text = body;\n await onSend(text, null);\n setBody(\"\");\n }\n\n return (\n <View\n style={{\n flexDirection: isRtl ? \"row-reverse\" : \"row\",\n alignItems: \"flex-end\",\n gap: 8,\n paddingHorizontal: 12,\n paddingVertical: 10,\n borderTopWidth: 1,\n borderTopColor: colors.border,\n paddingBottom: Platform.OS === \"ios\" ? 28 : 12,\n }}\n >\n <TouchableOpacity onPress={onPick} hitSlop={8} disabled={sending}>\n <Text style={{ fontSize: 22, color: accentColor }}>▣</Text>\n </TouchableOpacity>\n <TextInput\n value={body}\n onChangeText={setBody}\n placeholder={t(\n MessengerI18n.typeMessage.key,\n MessengerI18n.typeMessage.fallback\n )}\n placeholderTextColor={colors.textMuted}\n multiline\n style={{\n flex: 1,\n maxHeight: 100,\n borderWidth: 1,\n borderColor: colors.border,\n borderRadius: 16,\n paddingHorizontal: 14,\n paddingVertical: 10,\n color: colors.text,\n fontFamily: fonts.body,\n textAlign: isRtl ? \"right\" : \"left\",\n backgroundColor: colors.surface,\n }}\n />\n <TouchableOpacity\n onPress={onPressSend}\n disabled={sending || !body.trim()}\n style={{\n width: 40,\n height: 40,\n borderRadius: 20,\n backgroundColor: body.trim()\n ? accentColor\n : colors.surfaceSecondary,\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {sending ? (\n <ActivityIndicator color=\"#FFF\" size=\"small\" />\n ) : (\n <Text\n style={{\n color: body.trim() ? \"#FFF\" : colors.textMuted,\n fontSize: 16,\n fontWeight: \"700\",\n }}\n >\n ➤\n </Text>\n )}\n </TouchableOpacity>\n </View>\n );\n}\n","import React, { useRef } from \"react\";\nimport {\n View,\n Text,\n TouchableOpacity,\n ActivityIndicator,\n FlatList,\n KeyboardAvoidingView,\n Platform,\n} from \"react-native\";\nimport { useMessengerConfig } from \"../provider\";\nimport { useThread } from \"../hooks/useThread\";\nimport { useSendMessage } from \"../hooks/useSendMessage\";\nimport { MessageBubble } from \"./MessageBubble\";\nimport { Composer } from \"./Composer\";\nimport { MessengerI18n } from \"../i18nKeys\";\nimport type { ChatMessage, PickedImage } from \"../types\";\n\nfunction FeatureOff() {\n const { t, theme, onFeatureOff } = useMessengerConfig();\n if (onFeatureOff) return <>{onFeatureOff()}</>;\n return (\n <View\n style={{\n flex: 1,\n backgroundColor: theme.colors.background,\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <Text style={{ color: theme.colors.textMuted }}>\n {t(MessengerI18n.off.key, MessengerI18n.off.fallback)}\n </Text>\n </View>\n );\n}\n\nexport function ThreadScreen({ threadId }: { threadId: number }) {\n const { enabled, t, isRtl, theme, navigation } = useMessengerConfig();\n const { colors, accentColor, fonts } = theme;\n const listRef = useRef<FlatList<ChatMessage> | null>(null);\n const threadQuery = useThread(threadId);\n const sendMutation = useSendMessage(threadId);\n\n if (!enabled) return <FeatureOff />;\n\n const messages = threadQuery.data?.messages ?? [];\n const loading = threadQuery.isLoading && messages.length === 0;\n\n async function handleSend(body: string, image?: PickedImage | null) {\n if ((!body.trim() && !image) || sendMutation.isPending) return;\n await sendMutation.mutateAsync({ body, image });\n setTimeout(() => listRef.current?.scrollToEnd({ animated: true }), 100);\n }\n\n return (\n <KeyboardAvoidingView\n style={{ flex: 1, backgroundColor: colors.background }}\n behavior={Platform.OS === \"ios\" ? \"padding\" : undefined}\n keyboardVerticalOffset={0}\n >\n <View\n style={{\n paddingTop: 56,\n paddingHorizontal: 16,\n paddingBottom: 12,\n flexDirection: isRtl ? \"row-reverse\" : \"row\",\n alignItems: \"center\",\n gap: 12,\n borderBottomWidth: 1,\n borderBottomColor: colors.border,\n }}\n >\n <TouchableOpacity onPress={navigation.goBack} hitSlop={12}>\n <Text style={{ fontSize: 22, color: colors.text }}>\n {isRtl ? \"→\" : \"←\"}\n </Text>\n </TouchableOpacity>\n <Text\n style={{\n color: colors.text,\n fontSize: 18,\n fontFamily: fonts.displayBold,\n fontWeight: \"700\",\n flex: 1,\n }}\n >\n {t(MessengerI18n.chat.key, MessengerI18n.chat.fallback)}\n </Text>\n </View>\n\n {loading ? (\n <ActivityIndicator color={accentColor} style={{ marginTop: 40 }} />\n ) : (\n <FlatList\n ref={listRef}\n data={messages}\n keyExtractor={(m: ChatMessage) => String(m.id)}\n contentContainerStyle={{ padding: 16, paddingBottom: 8 }}\n onContentSizeChange={() =>\n listRef.current?.scrollToEnd({ animated: false })\n }\n ListEmptyComponent={\n <Text\n style={{\n color: colors.textMuted,\n textAlign: \"center\",\n marginTop: 40,\n fontFamily: fonts.body,\n }}\n >\n {t(\n MessengerI18n.startConversation.key,\n MessengerI18n.startConversation.fallback\n )}\n </Text>\n }\n renderItem={({ item }: { item: ChatMessage }) => (\n <MessageBubble message={item} />\n )}\n />\n )}\n\n <Composer sending={sendMutation.isPending} onSend={handleSend} />\n </KeyboardAvoidingView>\n );\n}\n"]}
1
+ {"version":3,"sources":["../../src/native/InboxScreen.tsx","../../src/native/MessageBubble.tsx","../../src/native/icons.tsx","../../src/native/Composer.tsx","../../src/native/ThreadScreen.tsx"],"names":["jsxs","View","jsx","Text","TouchableOpacity","ActivityIndicator","FeatureOff","Fragment","Platform"],"mappings":"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","file":"index.js","sourcesContent":["import React from \"react\";\nimport {\n View,\n Text,\n TouchableOpacity,\n ActivityIndicator,\n ScrollView,\n RefreshControl,\n} from \"react-native\";\nimport { useMessengerConfig } from \"../provider\";\nimport { useThreads } from \"../hooks/useThreads\";\nimport { useOpenThread } from \"../hooks/useOpenThread\";\nimport { MessengerI18n } from \"../i18nKeys\";\nimport type { MessageThread } from \"../types\";\n\nfunction FeatureOff() {\n const { t, theme, navigation, onFeatureOff } = useMessengerConfig();\n if (onFeatureOff) return <>{onFeatureOff()}</>;\n const { colors, accentColor } = theme;\n return (\n <View\n style={{\n flex: 1,\n backgroundColor: colors.background,\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 24,\n }}\n >\n <Text style={{ color: colors.textMuted, textAlign: \"center\" }}>\n {t(MessengerI18n.off.key, MessengerI18n.off.fallback)}\n </Text>\n <TouchableOpacity onPress={navigation.goBack} style={{ marginTop: 16 }}>\n <Text style={{ color: accentColor }}>\n {t(MessengerI18n.back.key, MessengerI18n.back.fallback)}\n </Text>\n </TouchableOpacity>\n </View>\n );\n}\n\nfunction ThreadRow({ thread }: { thread: MessageThread }) {\n const { user, t, isRtl, theme, navigation } = useMessengerConfig();\n const { colors, accentColor, fonts } = theme;\n const unread = Number(thread.unread_count ?? 0);\n\n return (\n <TouchableOpacity\n onPress={() => navigation.openThread(thread.id)}\n activeOpacity={0.8}\n >\n <View\n style={{\n marginBottom: 10,\n padding: 14,\n borderRadius: 14,\n backgroundColor: colors.surface,\n borderWidth: 1,\n borderColor: colors.border,\n }}\n >\n <View\n style={{\n flexDirection: isRtl ? \"row-reverse\" : \"row\",\n alignItems: \"center\",\n gap: 12,\n }}\n >\n <View style={{ flex: 1 }}>\n <Text\n style={{\n color: colors.text,\n fontFamily: fonts.displaySemiBold,\n fontWeight: \"600\",\n fontSize: 16,\n }}\n >\n {user?.role === \"admin\"\n ? thread.client_name ??\n t(MessengerI18n.client.key, MessengerI18n.client.fallback)\n : t(\n MessengerI18n.yourCoach.key,\n MessengerI18n.yourCoach.fallback\n )}\n </Text>\n <Text\n style={{\n color: colors.textSecondary,\n fontFamily: fonts.body,\n fontSize: 13,\n marginTop: 4,\n }}\n numberOfLines={1}\n >\n {thread.last_body ||\n (thread.last_image_url\n ? t(MessengerI18n.photo.key, MessengerI18n.photo.fallback)\n : t(\n MessengerI18n.noMessages.key,\n MessengerI18n.noMessages.fallback\n ))}\n </Text>\n </View>\n {unread > 0 && (\n <View\n style={{\n minWidth: 22,\n height: 22,\n borderRadius: 11,\n backgroundColor: accentColor,\n alignItems: \"center\",\n justifyContent: \"center\",\n paddingHorizontal: 6,\n }}\n >\n <Text\n style={{\n color: \"#FFF\",\n fontSize: 11,\n fontFamily: fonts.bodySemiBold,\n fontWeight: \"600\",\n }}\n >\n {unread}\n </Text>\n </View>\n )}\n </View>\n </View>\n </TouchableOpacity>\n );\n}\n\nexport function InboxScreen() {\n const { enabled, user, t, isRtl, theme, navigation } = useMessengerConfig();\n const { colors, accentColor, fonts } = theme;\n const threadsQuery = useThreads();\n const openThread = useOpenThread();\n\n if (!enabled) return <FeatureOff />;\n\n const threads = threadsQuery.data ?? [];\n const loading = threadsQuery.isLoading && threads.length === 0;\n\n return (\n <View style={{ flex: 1, backgroundColor: colors.background }}>\n <View\n style={{\n paddingTop: 56,\n paddingHorizontal: 16,\n paddingBottom: 12,\n flexDirection: isRtl ? \"row-reverse\" : \"row\",\n alignItems: \"center\",\n gap: 12,\n }}\n >\n <TouchableOpacity onPress={navigation.goBack} hitSlop={12}>\n <Text style={{ fontSize: 22, color: colors.text }}>\n {isRtl ? \"→\" : \"←\"}\n </Text>\n </TouchableOpacity>\n <Text\n style={{\n color: colors.text,\n fontSize: 22,\n fontFamily: fonts.displayBold,\n fontWeight: \"700\",\n flex: 1,\n }}\n >\n {t(MessengerI18n.inbox.key, MessengerI18n.inbox.fallback)}\n </Text>\n </View>\n\n <ScrollView\n contentContainerStyle={{ paddingHorizontal: 16, paddingBottom: 32 }}\n refreshControl={\n <RefreshControl\n refreshing={threadsQuery.isRefetching}\n onRefresh={() => void threadsQuery.refetch()}\n tintColor={accentColor}\n />\n }\n >\n {user?.role === \"client\" && threads.length === 0 && (\n <TouchableOpacity\n onPress={() => openThread.mutate(undefined)}\n disabled={openThread.isPending}\n style={{\n marginBottom: 14,\n paddingVertical: 14,\n borderRadius: 12,\n backgroundColor: accentColor,\n alignItems: \"center\",\n }}\n >\n {openThread.isPending ? (\n <ActivityIndicator color=\"#FFF\" />\n ) : (\n <Text\n style={{\n color: \"#FFF\",\n fontFamily: fonts.bodySemiBold,\n fontWeight: \"600\",\n }}\n >\n {t(\n MessengerI18n.messageCoach.key,\n MessengerI18n.messageCoach.fallback\n )}\n </Text>\n )}\n </TouchableOpacity>\n )}\n\n {loading ? (\n <ActivityIndicator color={accentColor} style={{ marginTop: 40 }} />\n ) : threads.length === 0 ? (\n <View\n style={{\n alignItems: \"center\",\n paddingVertical: 40,\n borderRadius: 14,\n backgroundColor: colors.surface,\n borderWidth: 1,\n borderColor: colors.border,\n }}\n >\n <Text style={{ fontSize: 28, color: colors.textMuted }}>···</Text>\n <Text\n style={{\n color: colors.textMuted,\n marginTop: 12,\n fontFamily: fonts.body,\n textAlign: \"center\",\n }}\n >\n {t(MessengerI18n.empty.key, MessengerI18n.empty.fallback)}\n </Text>\n </View>\n ) : (\n threads.map((th: MessageThread) => (\n <ThreadRow key={th.id} thread={th} />\n ))\n )}\n </ScrollView>\n </View>\n );\n}\n","import React from \"react\";\nimport { View, Text, Image } from \"react-native\";\nimport type { ChatMessage } from \"../types\";\nimport { useMessengerConfig } from \"../provider\";\n\nexport function MessageBubble({ message }: { message: ChatMessage }) {\n const { user, isRtl, theme } = useMessengerConfig();\n const { colors, accentColor, fonts } = theme;\n const mine = message.sender_user_id === user?.id;\n\n return (\n <View\n style={{\n alignSelf: mine\n ? isRtl\n ? \"flex-start\"\n : \"flex-end\"\n : isRtl\n ? \"flex-end\"\n : \"flex-start\",\n maxWidth: \"80%\",\n marginBottom: 10,\n backgroundColor: mine ? accentColor : colors.surfaceSecondary,\n borderRadius: 16,\n paddingHorizontal: 12,\n paddingVertical: 10,\n }}\n >\n {message.image_url ? (\n <Image\n source={{ uri: message.image_url }}\n style={{\n width: 180,\n height: 180,\n borderRadius: 10,\n marginBottom: message.body ? 8 : 0,\n }}\n />\n ) : null}\n {message.body ? (\n <Text\n style={{\n color: mine ? \"#FFF\" : colors.text,\n fontFamily: fonts.body,\n fontSize: 15,\n }}\n >\n {message.body}\n </Text>\n ) : null}\n </View>\n );\n}\n","import React from \"react\";\nimport { View, type StyleProp, type ViewStyle } from \"react-native\";\n\n/** Landscape image glyph — no emoji / unicode font dependency. */\nexport function AttachImageIcon({\n color,\n size = 22,\n style,\n}: {\n color: string;\n size?: number;\n style?: StyleProp<ViewStyle>;\n}) {\n const frame = size * 0.82;\n const mountain = size * 0.28;\n const sun = Math.max(3, size * 0.16);\n\n return (\n <View\n style={[\n {\n width: size,\n height: size,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n style,\n ]}\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n >\n <View\n style={{\n width: frame,\n height: frame * 0.78,\n borderWidth: 1.75,\n borderColor: color,\n borderRadius: 3,\n overflow: \"hidden\",\n justifyContent: \"flex-end\",\n }}\n >\n <View\n style={{\n position: \"absolute\",\n top: size * 0.12,\n left: size * 0.14,\n width: sun,\n height: sun,\n borderRadius: sun / 2,\n backgroundColor: color,\n }}\n />\n <View\n style={{\n alignSelf: \"flex-start\",\n marginLeft: size * 0.08,\n width: 0,\n height: 0,\n borderStyle: \"solid\",\n borderLeftWidth: mountain * 0.55,\n borderRightWidth: mountain * 0.55,\n borderBottomWidth: mountain,\n borderLeftColor: \"transparent\",\n borderRightColor: \"transparent\",\n borderBottomColor: color,\n opacity: 0.9,\n }}\n />\n </View>\n </View>\n );\n}\n\n/** Send chevron drawn with Views so it aligns in the circular button. */\nexport function SendChevronIcon({\n color,\n size = 14,\n}: {\n color: string;\n size?: number;\n}) {\n return (\n <View\n style={{\n width: size,\n height: size,\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <View\n style={{\n width: 0,\n height: 0,\n marginLeft: size * 0.12,\n borderStyle: \"solid\",\n borderTopWidth: size * 0.38,\n borderBottomWidth: size * 0.38,\n borderLeftWidth: size * 0.55,\n borderTopColor: \"transparent\",\n borderBottomColor: \"transparent\",\n borderLeftColor: color,\n }}\n />\n </View>\n );\n}\n","import React, { useState } from \"react\";\nimport {\n View,\n TextInput,\n TouchableOpacity,\n ActivityIndicator,\n Platform,\n} from \"react-native\";\nimport { useMessengerConfig } from \"../provider\";\nimport { MessengerI18n } from \"../i18nKeys\";\nimport type { PickedImage } from \"../types\";\nimport { AttachImageIcon, SendChevronIcon } from \"./icons\";\n\nexport function Composer({\n sending,\n onSend,\n}: {\n sending: boolean;\n onSend: (body: string, image?: PickedImage | null) => void | Promise<void>;\n}) {\n const { t, isRtl, theme, pickImage } = useMessengerConfig();\n const { colors, accentColor, fonts } = theme;\n const [body, setBody] = useState(\"\");\n\n async function onPick() {\n const image = await pickImage();\n if (image) {\n await onSend(body, image);\n setBody(\"\");\n }\n }\n\n async function onPressSend() {\n if (!body.trim() || sending) return;\n const text = body;\n await onSend(text, null);\n setBody(\"\");\n }\n\n const canSend = Boolean(body.trim()) && !sending;\n\n return (\n <View\n style={{\n flexDirection: isRtl ? \"row-reverse\" : \"row\",\n alignItems: \"center\",\n gap: 8,\n paddingHorizontal: 12,\n paddingVertical: 10,\n borderTopWidth: 1,\n borderTopColor: colors.border,\n paddingBottom: Platform.OS === \"ios\" ? 28 : 12,\n }}\n >\n <TouchableOpacity\n onPress={onPick}\n hitSlop={10}\n disabled={sending}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Attach image\"\n style={{\n width: 40,\n height: 40,\n borderRadius: 20,\n alignItems: \"center\",\n justifyContent: \"center\",\n opacity: sending ? 0.45 : 1,\n }}\n >\n <AttachImageIcon color={accentColor} size={22} />\n </TouchableOpacity>\n <TextInput\n value={body}\n onChangeText={setBody}\n placeholder={t(\n MessengerI18n.typeMessage.key,\n MessengerI18n.typeMessage.fallback\n )}\n placeholderTextColor={colors.textMuted}\n multiline\n style={{\n flex: 1,\n maxHeight: 100,\n minHeight: 40,\n borderWidth: 1,\n borderColor: colors.border,\n borderRadius: 20,\n paddingHorizontal: 14,\n paddingVertical: Platform.OS === \"ios\" ? 10 : 8,\n color: colors.text,\n fontFamily: fonts.body,\n textAlign: isRtl ? \"right\" : \"left\",\n backgroundColor: colors.surface,\n }}\n />\n <TouchableOpacity\n onPress={onPressSend}\n disabled={!canSend}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Send message\"\n style={{\n width: 40,\n height: 40,\n borderRadius: 20,\n backgroundColor: canSend ? accentColor : colors.surfaceSecondary,\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {sending ? (\n <ActivityIndicator color=\"#FFF\" size=\"small\" />\n ) : (\n <SendChevronIcon color={canSend ? \"#FFF\" : colors.textMuted} size={14} />\n )}\n </TouchableOpacity>\n </View>\n );\n}\n","import React, { useRef } from \"react\";\nimport {\n View,\n Text,\n TouchableOpacity,\n ActivityIndicator,\n FlatList,\n KeyboardAvoidingView,\n Platform,\n} from \"react-native\";\nimport { useMessengerConfig } from \"../provider\";\nimport { useThread } from \"../hooks/useThread\";\nimport { useSendMessage } from \"../hooks/useSendMessage\";\nimport { MessageBubble } from \"./MessageBubble\";\nimport { Composer } from \"./Composer\";\nimport { MessengerI18n } from \"../i18nKeys\";\nimport type { ChatMessage, PickedImage } from \"../types\";\n\nfunction FeatureOff() {\n const { t, theme, onFeatureOff } = useMessengerConfig();\n if (onFeatureOff) return <>{onFeatureOff()}</>;\n return (\n <View\n style={{\n flex: 1,\n backgroundColor: theme.colors.background,\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <Text style={{ color: theme.colors.textMuted }}>\n {t(MessengerI18n.off.key, MessengerI18n.off.fallback)}\n </Text>\n </View>\n );\n}\n\nexport function ThreadScreen({ threadId }: { threadId: number }) {\n const { enabled, t, isRtl, theme, navigation } = useMessengerConfig();\n const { colors, accentColor, fonts } = theme;\n const listRef = useRef<FlatList<ChatMessage> | null>(null);\n const threadQuery = useThread(threadId);\n const sendMutation = useSendMessage(threadId);\n\n if (!enabled) return <FeatureOff />;\n\n const messages = threadQuery.data?.messages ?? [];\n const loading = threadQuery.isLoading && messages.length === 0;\n\n async function handleSend(body: string, image?: PickedImage | null) {\n if ((!body.trim() && !image) || sendMutation.isPending) return;\n await sendMutation.mutateAsync({ body, image });\n setTimeout(() => listRef.current?.scrollToEnd({ animated: true }), 100);\n }\n\n return (\n <KeyboardAvoidingView\n style={{ flex: 1, backgroundColor: colors.background }}\n behavior={Platform.OS === \"ios\" ? \"padding\" : undefined}\n keyboardVerticalOffset={0}\n >\n <View\n style={{\n paddingTop: 56,\n paddingHorizontal: 16,\n paddingBottom: 12,\n flexDirection: isRtl ? \"row-reverse\" : \"row\",\n alignItems: \"center\",\n gap: 12,\n borderBottomWidth: 1,\n borderBottomColor: colors.border,\n }}\n >\n <TouchableOpacity onPress={navigation.goBack} hitSlop={12}>\n <Text style={{ fontSize: 22, color: colors.text }}>\n {isRtl ? \"→\" : \"←\"}\n </Text>\n </TouchableOpacity>\n <Text\n style={{\n color: colors.text,\n fontSize: 18,\n fontFamily: fonts.displayBold,\n fontWeight: \"700\",\n flex: 1,\n }}\n >\n {t(MessengerI18n.chat.key, MessengerI18n.chat.fallback)}\n </Text>\n </View>\n\n {loading ? (\n <ActivityIndicator color={accentColor} style={{ marginTop: 40 }} />\n ) : (\n <FlatList\n ref={listRef}\n data={messages}\n keyExtractor={(m: ChatMessage) => String(m.id)}\n contentContainerStyle={{ padding: 16, paddingBottom: 8 }}\n onContentSizeChange={() =>\n listRef.current?.scrollToEnd({ animated: false })\n }\n ListEmptyComponent={\n <Text\n style={{\n color: colors.textMuted,\n textAlign: \"center\",\n marginTop: 40,\n fontFamily: fonts.body,\n }}\n >\n {t(\n MessengerI18n.startConversation.key,\n MessengerI18n.startConversation.fallback\n )}\n </Text>\n }\n renderItem={({ item }: { item: ChatMessage }) => (\n <MessageBubble message={item} />\n )}\n />\n )}\n\n <Composer sending={sendMutation.isPending} onSend={handleSend} />\n </KeyboardAvoidingView>\n );\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@samirify/messenger",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "Trainer\u2194client messenger \u2014 React Query hooks + React Native + web DOM UI.",
5
5
  "license": "MIT",
6
6
  "author": "Samirify",