@droppii-org/chat-mobile 0.2.105 → 0.2.107

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.
Files changed (152) hide show
  1. package/lib/module/components/TypingDots/TypingDots.js +131 -0
  2. package/lib/module/components/TypingDots/TypingDots.js.map +1 -0
  3. package/lib/module/components/TypingDots/index.js +4 -0
  4. package/lib/module/components/TypingDots/index.js.map +1 -0
  5. package/lib/module/components/messages/ExpandableMessageText.js +112 -0
  6. package/lib/module/components/messages/ExpandableMessageText.js.map +1 -0
  7. package/lib/module/components/messages/PreviewScrollableText.js +80 -0
  8. package/lib/module/components/messages/PreviewScrollableText.js.map +1 -0
  9. package/lib/module/components/messages/linkMessage/index.js +21 -12
  10. package/lib/module/components/messages/linkMessage/index.js.map +1 -1
  11. package/lib/module/components/messages/quotedMessage/index.js +12 -2
  12. package/lib/module/components/messages/quotedMessage/index.js.map +1 -1
  13. package/lib/module/components/messages/textMessage/index.js +7 -1
  14. package/lib/module/components/messages/textMessage/index.js.map +1 -1
  15. package/lib/module/components/messages/types.js.map +1 -1
  16. package/lib/module/core/useChatListener.js +26 -2
  17. package/lib/module/core/useChatListener.js.map +1 -1
  18. package/lib/module/hooks/groups/useGroupMemberName.js +32 -0
  19. package/lib/module/hooks/groups/useGroupMemberName.js.map +1 -0
  20. package/lib/module/hooks/query-keys.js +2 -1
  21. package/lib/module/hooks/query-keys.js.map +1 -1
  22. package/lib/module/hooks/useExpandableText.js +120 -0
  23. package/lib/module/hooks/useExpandableText.js.map +1 -0
  24. package/lib/module/hooks/useInputState.js +38 -0
  25. package/lib/module/hooks/useInputState.js.map +1 -0
  26. package/lib/module/hooks/useInputStateBroadcast.js +53 -0
  27. package/lib/module/hooks/useInputStateBroadcast.js.map +1 -0
  28. package/lib/module/screens/chat-detail/ChatComposer.js +15 -3
  29. package/lib/module/screens/chat-detail/ChatComposer.js.map +1 -1
  30. package/lib/module/screens/chat-detail/ChatDetail.js +11 -0
  31. package/lib/module/screens/chat-detail/ChatDetail.js.map +1 -1
  32. package/lib/module/screens/chat-detail/ChatListLegend.js +2 -1
  33. package/lib/module/screens/chat-detail/ChatListLegend.js.map +1 -1
  34. package/lib/module/screens/chat-detail/ChatTypingIndicator.js +86 -0
  35. package/lib/module/screens/chat-detail/ChatTypingIndicator.js.map +1 -0
  36. package/lib/module/screens/chat-detail/PinnedMessagesSheet.js +7 -0
  37. package/lib/module/screens/chat-detail/PinnedMessagesSheet.js.map +1 -1
  38. package/lib/module/screens/chat-detail/legend/LegendChatMessage.js +10 -3
  39. package/lib/module/screens/chat-detail/legend/LegendChatMessage.js.map +1 -1
  40. package/lib/module/screens/chat-detail/messageToolbox/MessageToolboxOverlay.js +11 -2
  41. package/lib/module/screens/chat-detail/messageToolbox/MessageToolboxOverlay.js.map +1 -1
  42. package/lib/module/screens/chat-detail/messageToolbox/MessageToolboxWrapper.js +79 -6
  43. package/lib/module/screens/chat-detail/messageToolbox/MessageToolboxWrapper.js.map +1 -1
  44. package/lib/module/screens/chat-detail/messageToolbox/useClonePreview.js +30 -0
  45. package/lib/module/screens/chat-detail/messageToolbox/useClonePreview.js.map +1 -0
  46. package/lib/module/store/expandedMessage.js +28 -0
  47. package/lib/module/store/expandedMessage.js.map +1 -0
  48. package/lib/module/store/index.js +1 -0
  49. package/lib/module/store/index.js.map +1 -1
  50. package/lib/module/store/inputState.js +64 -0
  51. package/lib/module/store/inputState.js.map +1 -0
  52. package/lib/module/translation/resources/i18n.js +2 -0
  53. package/lib/module/translation/resources/i18n.js.map +1 -1
  54. package/lib/module/utils/expandableText.js +41 -0
  55. package/lib/module/utils/expandableText.js.map +1 -0
  56. package/lib/module/utils/inlineTruncation.js +51 -0
  57. package/lib/module/utils/inlineTruncation.js.map +1 -0
  58. package/lib/module/utils/inputState.js +77 -0
  59. package/lib/module/utils/inputState.js.map +1 -0
  60. package/lib/module/utils/message.js +9 -0
  61. package/lib/module/utils/message.js.map +1 -1
  62. package/lib/module/utils/truncateTextChildren.js +38 -0
  63. package/lib/module/utils/truncateTextChildren.js.map +1 -0
  64. package/lib/typescript/src/components/TypingDots/TypingDots.d.ts +14 -0
  65. package/lib/typescript/src/components/TypingDots/TypingDots.d.ts.map +1 -0
  66. package/lib/typescript/src/components/TypingDots/index.d.ts +3 -0
  67. package/lib/typescript/src/components/TypingDots/index.d.ts.map +1 -0
  68. package/lib/typescript/src/components/messages/ExpandableMessageText.d.ts +25 -0
  69. package/lib/typescript/src/components/messages/ExpandableMessageText.d.ts.map +1 -0
  70. package/lib/typescript/src/components/messages/PreviewScrollableText.d.ts +29 -0
  71. package/lib/typescript/src/components/messages/PreviewScrollableText.d.ts.map +1 -0
  72. package/lib/typescript/src/components/messages/linkMessage/index.d.ts +1 -1
  73. package/lib/typescript/src/components/messages/linkMessage/index.d.ts.map +1 -1
  74. package/lib/typescript/src/components/messages/quotedMessage/index.d.ts.map +1 -1
  75. package/lib/typescript/src/components/messages/textMessage/index.d.ts +1 -1
  76. package/lib/typescript/src/components/messages/textMessage/index.d.ts.map +1 -1
  77. package/lib/typescript/src/components/messages/types.d.ts +18 -0
  78. package/lib/typescript/src/components/messages/types.d.ts.map +1 -1
  79. package/lib/typescript/src/core/useChatListener.d.ts.map +1 -1
  80. package/lib/typescript/src/hooks/groups/useGroupMemberName.d.ts +10 -0
  81. package/lib/typescript/src/hooks/groups/useGroupMemberName.d.ts.map +1 -0
  82. package/lib/typescript/src/hooks/query-keys.d.ts +1 -0
  83. package/lib/typescript/src/hooks/query-keys.d.ts.map +1 -1
  84. package/lib/typescript/src/hooks/useExpandableText.d.ts +13 -0
  85. package/lib/typescript/src/hooks/useExpandableText.d.ts.map +1 -0
  86. package/lib/typescript/src/hooks/useInputState.d.ts +21 -0
  87. package/lib/typescript/src/hooks/useInputState.d.ts.map +1 -0
  88. package/lib/typescript/src/hooks/useInputStateBroadcast.d.ts +14 -0
  89. package/lib/typescript/src/hooks/useInputStateBroadcast.d.ts.map +1 -0
  90. package/lib/typescript/src/screens/chat-detail/ChatComposer.d.ts.map +1 -1
  91. package/lib/typescript/src/screens/chat-detail/ChatDetail.d.ts.map +1 -1
  92. package/lib/typescript/src/screens/chat-detail/ChatListLegend.d.ts.map +1 -1
  93. package/lib/typescript/src/screens/chat-detail/ChatTypingIndicator.d.ts +8 -0
  94. package/lib/typescript/src/screens/chat-detail/ChatTypingIndicator.d.ts.map +1 -0
  95. package/lib/typescript/src/screens/chat-detail/PinnedMessagesSheet.d.ts.map +1 -1
  96. package/lib/typescript/src/screens/chat-detail/legend/LegendChatMessage.d.ts +11 -1
  97. package/lib/typescript/src/screens/chat-detail/legend/LegendChatMessage.d.ts.map +1 -1
  98. package/lib/typescript/src/screens/chat-detail/messageToolbox/MessageToolboxOverlay.d.ts.map +1 -1
  99. package/lib/typescript/src/screens/chat-detail/messageToolbox/MessageToolboxWrapper.d.ts +14 -1
  100. package/lib/typescript/src/screens/chat-detail/messageToolbox/MessageToolboxWrapper.d.ts.map +1 -1
  101. package/lib/typescript/src/screens/chat-detail/messageToolbox/useClonePreview.d.ts +18 -0
  102. package/lib/typescript/src/screens/chat-detail/messageToolbox/useClonePreview.d.ts.map +1 -0
  103. package/lib/typescript/src/store/expandedMessage.d.ts +15 -0
  104. package/lib/typescript/src/store/expandedMessage.d.ts.map +1 -0
  105. package/lib/typescript/src/store/index.d.ts +1 -0
  106. package/lib/typescript/src/store/index.d.ts.map +1 -1
  107. package/lib/typescript/src/store/inputState.d.ts +18 -0
  108. package/lib/typescript/src/store/inputState.d.ts.map +1 -0
  109. package/lib/typescript/src/translation/resources/i18n.d.ts.map +1 -1
  110. package/lib/typescript/src/utils/expandableText.d.ts +18 -0
  111. package/lib/typescript/src/utils/expandableText.d.ts.map +1 -0
  112. package/lib/typescript/src/utils/inlineTruncation.d.ts +24 -0
  113. package/lib/typescript/src/utils/inlineTruncation.d.ts.map +1 -0
  114. package/lib/typescript/src/utils/inputState.d.ts +54 -0
  115. package/lib/typescript/src/utils/inputState.d.ts.map +1 -0
  116. package/lib/typescript/src/utils/message.d.ts +8 -0
  117. package/lib/typescript/src/utils/message.d.ts.map +1 -1
  118. package/lib/typescript/src/utils/truncateTextChildren.d.ts +3 -0
  119. package/lib/typescript/src/utils/truncateTextChildren.d.ts.map +1 -0
  120. package/package.json +1 -1
  121. package/src/components/TypingDots/TypingDots.tsx +172 -0
  122. package/src/components/TypingDots/index.ts +2 -0
  123. package/src/components/messages/ExpandableMessageText.tsx +145 -0
  124. package/src/components/messages/PreviewScrollableText.tsx +98 -0
  125. package/src/components/messages/linkMessage/index.tsx +30 -21
  126. package/src/components/messages/quotedMessage/index.tsx +14 -2
  127. package/src/components/messages/textMessage/index.tsx +11 -2
  128. package/src/components/messages/types.ts +18 -0
  129. package/src/core/useChatListener.ts +35 -1
  130. package/src/hooks/groups/useGroupMemberName.ts +31 -0
  131. package/src/hooks/query-keys.ts +2 -0
  132. package/src/hooks/useExpandableText.ts +139 -0
  133. package/src/hooks/useInputState.ts +57 -0
  134. package/src/hooks/useInputStateBroadcast.ts +53 -0
  135. package/src/screens/chat-detail/ChatComposer.tsx +17 -2
  136. package/src/screens/chat-detail/ChatDetail.tsx +11 -0
  137. package/src/screens/chat-detail/ChatListLegend.tsx +2 -0
  138. package/src/screens/chat-detail/ChatTypingIndicator.tsx +89 -0
  139. package/src/screens/chat-detail/PinnedMessagesSheet.tsx +8 -0
  140. package/src/screens/chat-detail/legend/LegendChatMessage.tsx +22 -2
  141. package/src/screens/chat-detail/messageToolbox/MessageToolboxOverlay.tsx +20 -1
  142. package/src/screens/chat-detail/messageToolbox/MessageToolboxWrapper.tsx +111 -5
  143. package/src/screens/chat-detail/messageToolbox/useClonePreview.ts +34 -0
  144. package/src/store/expandedMessage.ts +42 -0
  145. package/src/store/index.ts +1 -0
  146. package/src/store/inputState.ts +76 -0
  147. package/src/translation/resources/i18n.ts +2 -0
  148. package/src/utils/expandableText.ts +51 -0
  149. package/src/utils/inlineTruncation.ts +65 -0
  150. package/src/utils/inputState.ts +104 -0
  151. package/src/utils/message.ts +15 -0
  152. package/src/utils/truncateTextChildren.ts +46 -0
@@ -1,17 +1,24 @@
1
1
  "use strict";
2
2
 
3
- import { useCallback, memo } from 'react';
4
- import { View, Platform, useWindowDimensions } from 'react-native';
3
+ import { useCallback, memo, useState } from 'react';
4
+ import { View, ScrollView, Pressable, StyleSheet, Platform, useWindowDimensions } from 'react-native';
5
5
  import { useAnimatedStyle, useDerivedValue, useSharedValue, withTiming } from 'react-native-reanimated';
6
6
  import { messageStyles } from "../legend/messageTypes.js";
7
7
  import Animated from 'react-native-reanimated';
8
8
  import { useSafeAreaInsets } from 'react-native-safe-area-context';
9
+ import { ClonePreviewBudgetContext } from "../../../components/messages/PreviewScrollableText.js";
10
+ import { useClonePreview } from "./useClonePreview.js";
9
11
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
10
12
  const MENU_GAP = 8;
13
+ // A clone is never squeezed below this, even if the toolbox is unusually tall —
14
+ // better to overflow slightly than to render a sliver of a message.
15
+ const MIN_CLONE_HEIGHT = 120;
11
16
  export const MessageToolboxWrapper = /*#__PURE__*/memo(({
12
17
  isOutgoing,
13
18
  rect,
14
19
  message,
20
+ isCloneInteractive,
21
+ onDismiss,
15
22
  reaction,
16
23
  toolbox
17
24
  }) => {
@@ -23,6 +30,14 @@ export const MessageToolboxWrapper = /*#__PURE__*/memo(({
23
30
  const {
24
31
  height: windowHeight
25
32
  } = useWindowDimensions();
33
+
34
+ // Mirrors `toolboxHeight` on the JS side. Deriving the clone's maxHeight
35
+ // from the shared value instead would close a loop — maxHeight feeds the
36
+ // clone's height, which feeds `messageHeight`, which feeds `translateY`.
37
+ // The toolbox's own height does not depend on the clone, so reading it
38
+ // here settles in one pass. Not ratcheted: the menu's item set varies with
39
+ // permissions, and a high-water mark could never shrink back.
40
+ const [chromeHeight, setChromeHeight] = useState(0);
26
41
  const onMessageCloneLayout = useCallback(({
27
42
  nativeEvent
28
43
  }) => {
@@ -32,12 +47,20 @@ export const MessageToolboxWrapper = /*#__PURE__*/memo(({
32
47
  nativeEvent
33
48
  }) => {
34
49
  toolboxHeight.value = nativeEvent.layout.height;
50
+ setChromeHeight(nativeEvent.layout.height);
35
51
  }, [toolboxHeight]);
36
52
  const onReactionLayout = useCallback(({
37
53
  nativeEvent
38
54
  }) => {
39
55
  reactionHeight.value = nativeEvent.layout.height;
40
56
  }, [reactionHeight]);
57
+
58
+ // Same quantities `translateY` below subtracts, so the clone is never
59
+ // allowed to be taller than the space that shift can actually recover —
60
+ // `translateY` only moves up, so an over-tall clone pushes the toolbox off
61
+ // the bottom of the screen with no way back.
62
+ const maxCloneHeight = Math.max(windowHeight - insets.top - topOffset - (insets.bottom || 32) - chromeHeight - 3 * MENU_GAP, MIN_CLONE_HEIGHT);
63
+ const preview = useClonePreview(maxCloneHeight);
41
64
  const translateY = useDerivedValue(() => {
42
65
  const menuGap = (reactionHeight.value > 0 ? MENU_GAP : 0) + (toolboxHeight.value > 0 ? MENU_GAP : 0);
43
66
  const overflowBottom = Math.max(rect.y, insets.top) + topOffset + messageHeight.value + toolboxHeight.value + (insets.bottom || 32) + menuGap - windowHeight;
@@ -50,16 +73,39 @@ export const MessageToolboxWrapper = /*#__PURE__*/memo(({
50
73
  gap: MENU_GAP,
51
74
  transform: [{
52
75
  translateY: translateY.value
53
- }]
76
+ }],
77
+ // Until the toolbox has measured, the clone's budget is over-large and
78
+ // `translateY` is computed against a toolbox height of 0, which produces
79
+ // a visible two-stage slide on every open. Lay out, then reveal.
80
+ opacity: chromeHeight > 0 ? 1 : 0
54
81
  }));
55
82
  return /*#__PURE__*/_jsxs(Animated.View, {
56
83
  pointerEvents: "box-none",
57
84
  style: [isOutgoing ? messageStyles.messageRowRight : messageStyles.messageRowLeft, containerStyles],
58
- children: [/*#__PURE__*/_jsx(View, {
59
- pointerEvents: "none",
85
+ children: [/*#__PURE__*/_jsx(ScrollView, {
86
+ style: [styles.clone, {
87
+ maxHeight: maxCloneHeight
88
+ }],
60
89
  collapsable: false,
61
90
  onLayout: onMessageCloneLayout,
62
- children: message
91
+ onContentSizeChange: preview.onContentSizeChange,
92
+ bounces: false,
93
+ showsVerticalScrollIndicator: false,
94
+ children: /*#__PURE__*/_jsx(Pressable, {
95
+ onPress: onDismiss,
96
+ disabled: preview.dismissDisabled,
97
+ children: /*#__PURE__*/_jsxs(View, {
98
+ pointerEvents: isCloneInteractive ? 'box-none' : 'none',
99
+ style: isOutgoing ? styles.rowEnd : styles.rowStart,
100
+ children: [preview.dismissDisabled && /*#__PURE__*/_jsx(Pressable, {
101
+ style: StyleSheet.absoluteFill,
102
+ onPress: onDismiss
103
+ }), /*#__PURE__*/_jsx(ClonePreviewBudgetContext.Provider, {
104
+ value: preview.budget,
105
+ children: message
106
+ })]
107
+ })
108
+ })
63
109
  }), /*#__PURE__*/_jsx(View, {
64
110
  collapsable: false,
65
111
  onLayout: onReactionLayout,
@@ -72,4 +118,31 @@ export const MessageToolboxWrapper = /*#__PURE__*/memo(({
72
118
  });
73
119
  });
74
120
  MessageToolboxWrapper.displayName = 'MessageToolboxWrapper';
121
+ const styles = StyleSheet.create({
122
+ // maxHeight belongs on the ScrollView itself — inside an auto-height parent a
123
+ // ScrollView collapses to zero.
124
+ //
125
+ // `rowStart`/`rowEnd` reproduce the contract `LegendChatMessage` gets from
126
+ // the real list row: its root (`maxWidth: '80%'`) must be the DIRECT child
127
+ // of a definite-width, non-stretching (`alignItems`) View. Any auto-width
128
+ // node in between (an extra View, a non-stretched Pressable) leaves the 80%
129
+ // with no definite basis, and Yoga collapses the bubble toward min-content —
130
+ // on device, "M2" wrapping to "M" / "2". The Pressable sits outside this
131
+ // View, stretched by the ScrollView's content container, so the chain from
132
+ // the clone's measured width down to the bubble stays definite throughout.
133
+ // Not `messageRowLeft/Right` directly: the outer Animated.View already
134
+ // applies their padding, which would double up here.
135
+ clone: {
136
+ flexGrow: 0,
137
+ width: '100%'
138
+ },
139
+ rowStart: {
140
+ width: '100%',
141
+ alignItems: 'flex-start'
142
+ },
143
+ rowEnd: {
144
+ width: '100%',
145
+ alignItems: 'flex-end'
146
+ }
147
+ });
75
148
  //# sourceMappingURL=MessageToolboxWrapper.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["useCallback","memo","View","Platform","useWindowDimensions","useAnimatedStyle","useDerivedValue","useSharedValue","withTiming","messageStyles","Animated","useSafeAreaInsets","jsx","_jsx","jsxs","_jsxs","MENU_GAP","MessageToolboxWrapper","isOutgoing","rect","message","reaction","toolbox","insets","messageHeight","reactionHeight","toolboxHeight","topOffset","OS","top","height","windowHeight","onMessageCloneLayout","nativeEvent","value","layout","onToolboxLayout","onReactionLayout","translateY","menuGap","overflowBottom","Math","max","y","bottom","min","containerStyles","left","x","width","gap","transform","pointerEvents","style","messageRowRight","messageRowLeft","children","collapsable","onLayout","displayName"],"sourceRoot":"../../../../../src","sources":["screens/chat-detail/messageToolbox/MessageToolboxWrapper.tsx"],"mappings":";;AAAA,SAASA,WAAW,EAAEC,IAAI,QAAQ,OAAO;AACzC,SACEC,IAAI,EACJC,QAAQ,EACRC,mBAAmB,QAEd,cAAc;AACrB,SACEC,gBAAgB,EAChBC,eAAe,EACfC,cAAc,EACdC,UAAU,QACL,yBAAyB;AAEhC,SAASC,aAAa,QAAQ,2BAAwB;AACtD,OAAOC,QAAQ,MAAM,yBAAyB;AAC9C,SAASC,iBAAiB,QAAQ,gCAAgC;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAEnE,MAAMC,QAAQ,GAAG,CAAC;AAUlB,OAAO,MAAMC,qBAAqB,gBAAGhB,IAAI,CACvC,CAAC;EACCiB,UAAU;EACVC,IAAI;EACJC,OAAO;EACPC,QAAQ;EACRC;AAC0B,CAAC,KAAK;EAChC,MAAMC,MAAM,GAAGZ,iBAAiB,CAAC,CAAC;EAClC,MAAMa,aAAa,GAAGjB,cAAc,CAAC,CAAC,CAAC;EACvC,MAAMkB,cAAc,GAAGlB,cAAc,CAAC,CAAC,CAAC;EACxC,MAAMmB,aAAa,GAAGnB,cAAc,CAAC,CAAC,CAAC;EACvC,MAAMoB,SAAS,GAAGxB,QAAQ,CAACyB,EAAE,KAAK,SAAS,GAAGL,MAAM,CAACM,GAAG,GAAG,CAAC;EAC5D,MAAM;IAAEC,MAAM,EAAEC;EAAa,CAAC,GAAG3B,mBAAmB,CAAC,CAAC;EAEtD,MAAM4B,oBAAoB,GAAGhC,WAAW,CACtC,CAAC;IAAEiC;EAA+B,CAAC,KAAK;IACtCT,aAAa,CAACU,KAAK,GAAGD,WAAW,CAACE,MAAM,CAACL,MAAM;EACjD,CAAC,EACD,CAACN,aAAa,CAChB,CAAC;EAED,MAAMY,eAAe,GAAGpC,WAAW,CACjC,CAAC;IAAEiC;EAA+B,CAAC,KAAK;IACtCP,aAAa,CAACQ,KAAK,GAAGD,WAAW,CAACE,MAAM,CAACL,MAAM;EACjD,CAAC,EACD,CAACJ,aAAa,CAChB,CAAC;EAED,MAAMW,gBAAgB,GAAGrC,WAAW,CAClC,CAAC;IAAEiC;EAA+B,CAAC,KAAK;IACtCR,cAAc,CAACS,KAAK,GAAGD,WAAW,CAACE,MAAM,CAACL,MAAM;EAClD,CAAC,EACD,CAACL,cAAc,CACjB,CAAC;EAED,MAAMa,UAAU,GAAGhC,eAAe,CAAC,MAAM;IACvC,MAAMiC,OAAO,GACX,CAACd,cAAc,CAACS,KAAK,GAAG,CAAC,GAAGlB,QAAQ,GAAG,CAAC,KACvCU,aAAa,CAACQ,KAAK,GAAG,CAAC,GAAGlB,QAAQ,GAAG,CAAC,CAAC;IAE1C,MAAMwB,cAAc,GAClBC,IAAI,CAACC,GAAG,CAACvB,IAAI,CAACwB,CAAC,EAAEpB,MAAM,CAACM,GAAG,CAAC,GAC5BF,SAAS,GACTH,aAAa,CAACU,KAAK,GACnBR,aAAa,CAACQ,KAAK,IAClBX,MAAM,CAACqB,MAAM,IAAI,EAAE,CAAC,GACrBL,OAAO,GACPR,YAAY;IAEd,OAAOvB,UAAU,CAACiC,IAAI,CAACI,GAAG,CAAC,CAACL,cAAc,EAAE,CAAC,CAAC,CAAC;EACjD,CAAC,CAAC;EAEF,MAAMM,eAAe,GAAGzC,gBAAgB,CAAC,OAAO;IAC9CwB,GAAG,EAAEY,IAAI,CAACC,GAAG,CAACvB,IAAI,CAACwB,CAAC,EAAEpB,MAAM,CAACM,GAAG,CAAC,GAAGF,SAAS;IAC7CoB,IAAI,EAAE5B,IAAI,CAAC6B,CAAC;IACZC,KAAK,EAAE9B,IAAI,CAAC8B,KAAK;IACjBC,GAAG,EAAElC,QAAQ;IACbmC,SAAS,EAAE,CAAC;MAAEb,UAAU,EAAEA,UAAU,CAACJ;IAAM,CAAC;EAC9C,CAAC,CAAC,CAAC;EAEH,oBACEnB,KAAA,CAACL,QAAQ,CAACR,IAAI;IACZkD,aAAa,EAAC,UAAU;IACxBC,KAAK,EAAE,CACLnC,UAAU,GACNT,aAAa,CAAC6C,eAAe,GAC7B7C,aAAa,CAAC8C,cAAc,EAChCT,eAAe,CACf;IAAAU,QAAA,gBAEF3C,IAAA,CAACX,IAAI;MACHkD,aAAa,EAAC,MAAM;MACpBK,WAAW,EAAE,KAAM;MACnBC,QAAQ,EAAE1B,oBAAqB;MAAAwB,QAAA,EAE9BpC;IAAO,CACJ,CAAC,eACPP,IAAA,CAACX,IAAI;MAACuD,WAAW,EAAE,KAAM;MAACC,QAAQ,EAAErB,gBAAiB;MAAAmB,QAAA,EAClDnC;IAAQ,CACL,CAAC,eACPR,IAAA,CAACX,IAAI;MAACuD,WAAW,EAAE,KAAM;MAACC,QAAQ,EAAEtB,eAAgB;MAAAoB,QAAA,EACjDlC;IAAO,CACJ,CAAC;EAAA,CACM,CAAC;AAEpB,CACF,CAAC;AAEDL,qBAAqB,CAAC0C,WAAW,GAAG,uBAAuB","ignoreList":[]}
1
+ {"version":3,"names":["useCallback","memo","useState","View","ScrollView","Pressable","StyleSheet","Platform","useWindowDimensions","useAnimatedStyle","useDerivedValue","useSharedValue","withTiming","messageStyles","Animated","useSafeAreaInsets","ClonePreviewBudgetContext","useClonePreview","jsx","_jsx","jsxs","_jsxs","MENU_GAP","MIN_CLONE_HEIGHT","MessageToolboxWrapper","isOutgoing","rect","message","isCloneInteractive","onDismiss","reaction","toolbox","insets","messageHeight","reactionHeight","toolboxHeight","topOffset","OS","top","height","windowHeight","chromeHeight","setChromeHeight","onMessageCloneLayout","nativeEvent","value","layout","onToolboxLayout","onReactionLayout","maxCloneHeight","Math","max","bottom","preview","translateY","menuGap","overflowBottom","y","min","containerStyles","left","x","width","gap","transform","opacity","pointerEvents","style","messageRowRight","messageRowLeft","children","styles","clone","maxHeight","collapsable","onLayout","onContentSizeChange","bounces","showsVerticalScrollIndicator","onPress","disabled","dismissDisabled","rowEnd","rowStart","absoluteFill","Provider","budget","displayName","create","flexGrow","alignItems"],"sourceRoot":"../../../../../src","sources":["screens/chat-detail/messageToolbox/MessageToolboxWrapper.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ import { useCallback, useMemo, useState } from 'react';
4
+ /**
5
+ * Wiring between the overlay's clone and the expanded text that scrolls
6
+ * inside it (see `PreviewScrollableText`).
7
+ *
8
+ * `dismissDisabled`: the clone sits in a tap-to-dismiss Pressable. On iOS a
9
+ * ScrollView refuses to scroll while an ANCESTOR holds the JS responder
10
+ * (`RCTScrollView _shouldDisableScrollInteraction`), so with the Pressable
11
+ * enabled a drag on the text never scrolls — it ends as a tap and closes the
12
+ * overlay. While the text is scrollable the Pressable stands down; the
13
+ * backdrop and the menu still dismiss.
14
+ */
15
+ export const useClonePreview = maxHeight => {
16
+ const [contentHeight, setContentHeight] = useState(0);
17
+ const [textScrollable, setTextScrollable] = useState(false);
18
+ const onContentSizeChange = useCallback((_width, height) => setContentHeight(height), []);
19
+ const budget = useMemo(() => ({
20
+ maxHeight,
21
+ contentHeight,
22
+ onScrollableChange: setTextScrollable
23
+ }), [maxHeight, contentHeight]);
24
+ return {
25
+ budget,
26
+ onContentSizeChange,
27
+ dismissDisabled: textScrollable
28
+ };
29
+ };
30
+ //# sourceMappingURL=useClonePreview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useCallback","useMemo","useState","useClonePreview","maxHeight","contentHeight","setContentHeight","textScrollable","setTextScrollable","onContentSizeChange","_width","height","budget","onScrollableChange","dismissDisabled"],"sourceRoot":"../../../../../src","sources":["screens/chat-detail/messageToolbox/useClonePreview.ts"],"mappings":";;AAAA,SAASA,WAAW,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AAGtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,eAAe,GAAIC,SAAiB,IAAK;EACpD,MAAM,CAACC,aAAa,EAAEC,gBAAgB,CAAC,GAAGJ,QAAQ,CAAC,CAAC,CAAC;EACrD,MAAM,CAACK,cAAc,EAAEC,iBAAiB,CAAC,GAAGN,QAAQ,CAAC,KAAK,CAAC;EAE3D,MAAMO,mBAAmB,GAAGT,WAAW,CACrC,CAACU,MAAc,EAAEC,MAAc,KAAKL,gBAAgB,CAACK,MAAM,CAAC,EAC5D,EACF,CAAC;EAED,MAAMC,MAAM,GAAGX,OAAO,CACpB,OAAO;IACLG,SAAS;IACTC,aAAa;IACbQ,kBAAkB,EAAEL;EACtB,CAAC,CAAC,EACF,CAACJ,SAAS,EAAEC,aAAa,CAC3B,CAAC;EAED,OAAO;IAAEO,MAAM;IAAEH,mBAAmB;IAAEK,eAAe,EAAEP;EAAe,CAAC;AACzE,CAAC","ignoreList":[]}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ import { create } from 'zustand';
4
+ import { expandedKey, withoutSurface } from "../utils/expandableText.js";
5
+ export { expandedKey };
6
+ export const useExpandedMessageStore = create()((set, get) => ({
7
+ expanded: {},
8
+ expand: (surface, messageId) => {
9
+ // A message with no id would alias onto `${surface}:` and expand every
10
+ // other id-less message with it.
11
+ if (!messageId) return;
12
+ const key = expandedKey(surface, messageId);
13
+ if (get().expanded[key]) return;
14
+ set({
15
+ expanded: {
16
+ ...get().expanded,
17
+ [key]: true
18
+ }
19
+ });
20
+ },
21
+ clearSurface: surface => {
22
+ const next = withoutSurface(get().expanded, surface);
23
+ if (next !== get().expanded) set({
24
+ expanded: next
25
+ });
26
+ }
27
+ }));
28
+ //# sourceMappingURL=expandedMessage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["create","expandedKey","withoutSurface","useExpandedMessageStore","set","get","expanded","expand","surface","messageId","key","clearSurface","next"],"sourceRoot":"../../../src","sources":["store/expandedMessage.ts"],"mappings":";;AAAA,SAASA,MAAM,QAAQ,SAAS;AAChC,SACEC,WAAW,EACXC,cAAc,QAET,4BAAyB;AAGhC,SAASD,WAAW;AAapB,OAAO,MAAME,uBAAuB,GAAGH,MAAM,CAAuB,CAAC,CACnE,CAACI,GAAG,EAAEC,GAAG,MAAM;EACbC,QAAQ,EAAE,CAAC,CAAC;EAEZC,MAAM,EAAEA,CAACC,OAAO,EAAEC,SAAS,KAAK;IAC9B;IACA;IACA,IAAI,CAACA,SAAS,EAAE;IAEhB,MAAMC,GAAG,GAAGT,WAAW,CAACO,OAAO,EAAEC,SAAS,CAAC;IAC3C,IAAIJ,GAAG,CAAC,CAAC,CAACC,QAAQ,CAACI,GAAG,CAAC,EAAE;IAEzBN,GAAG,CAAC;MAAEE,QAAQ,EAAE;QAAE,GAAGD,GAAG,CAAC,CAAC,CAACC,QAAQ;QAAE,CAACI,GAAG,GAAG;MAAK;IAAE,CAAC,CAAC;EACvD,CAAC;EAEDC,YAAY,EAAGH,OAAO,IAAK;IACzB,MAAMI,IAAI,GAAGV,cAAc,CAACG,GAAG,CAAC,CAAC,CAACC,QAAQ,EAAEE,OAAO,CAAC;IACpD,IAAII,IAAI,KAAKP,GAAG,CAAC,CAAC,CAACC,QAAQ,EAAEF,GAAG,CAAC;MAAEE,QAAQ,EAAEM;IAAK,CAAC,CAAC;EACtD;AACF,CAAC,CACH,CAAC","ignoreList":[]}
@@ -3,4 +3,5 @@
3
3
  export * from "./storeConfig.js";
4
4
  export * from "./user.js";
5
5
  export * from "./conversation.js";
6
+ export * from "./inputState.js";
6
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":[],"sourceRoot":"../../../src","sources":["store/index.ts"],"mappings":";;AAAA,cAAc,kBAAe;AAC7B,cAAc,WAAQ;AACtB,cAAc,mBAAgB","ignoreList":[]}
1
+ {"version":3,"names":[],"sourceRoot":"../../../src","sources":["store/index.ts"],"mappings":";;AAAA,cAAc,kBAAe;AAC7B,cAAc,WAAQ;AACtB,cAAc,mBAAgB;AAC9B,cAAc,iBAAc","ignoreList":[]}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+
3
+ import { create } from 'zustand';
4
+ const withoutUser = (state, userID) => {
5
+ const next = {
6
+ ...state
7
+ };
8
+ delete next[userID];
9
+ // Undefined rather than an empty object, so a leftover record can never read
10
+ // as "somebody is typing".
11
+ return Object.keys(next).length > 0 ? next : undefined;
12
+ };
13
+ export const useInputStateStore = create()(set => ({
14
+ byConversation: {},
15
+ applyInputStatus({
16
+ conversationID,
17
+ userID,
18
+ platformIDs
19
+ }) {
20
+ if (!conversationID || !userID) return;
21
+ set(state => {
22
+ const current = state.byConversation[conversationID];
23
+ if (!platformIDs || platformIDs.length === 0) {
24
+ if (!current?.[userID]) return state;
25
+ const remaining = withoutUser(current, userID);
26
+ const byConversation = {
27
+ ...state.byConversation
28
+ };
29
+ if (remaining) byConversation[conversationID] = remaining;else delete byConversation[conversationID];
30
+ return {
31
+ byConversation
32
+ };
33
+ }
34
+ return {
35
+ byConversation: {
36
+ ...state.byConversation,
37
+ [conversationID]: {
38
+ ...current,
39
+ [userID]: {
40
+ userID,
41
+ platformIDs,
42
+ updatedAt: Date.now()
43
+ }
44
+ }
45
+ }
46
+ };
47
+ });
48
+ },
49
+ removeTyper(conversationID, userID) {
50
+ set(state => {
51
+ const current = state.byConversation[conversationID];
52
+ if (!current?.[userID]) return state;
53
+ const remaining = withoutUser(current, userID);
54
+ const byConversation = {
55
+ ...state.byConversation
56
+ };
57
+ if (remaining) byConversation[conversationID] = remaining;else delete byConversation[conversationID];
58
+ return {
59
+ byConversation
60
+ };
61
+ });
62
+ }
63
+ }));
64
+ //# sourceMappingURL=inputState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["create","withoutUser","state","userID","next","Object","keys","length","undefined","useInputStateStore","set","byConversation","applyInputStatus","conversationID","platformIDs","current","remaining","updatedAt","Date","now","removeTyper"],"sourceRoot":"../../../src","sources":["store/inputState.ts"],"mappings":";;AAAA,SAASA,MAAM,QAAQ,SAAS;AAsBhC,MAAMC,WAAW,GAAGA,CAClBC,KAA6B,EAC7BC,MAAc,KACyB;EACvC,MAAMC,IAAI,GAAG;IAAE,GAAGF;EAAM,CAAC;EACzB,OAAOE,IAAI,CAACD,MAAM,CAAC;EACnB;EACA;EACA,OAAOE,MAAM,CAACC,IAAI,CAACF,IAAI,CAAC,CAACG,MAAM,GAAG,CAAC,GAAGH,IAAI,GAAGI,SAAS;AACxD,CAAC;AAED,OAAO,MAAMC,kBAAkB,GAAGT,MAAM,CAAkB,CAAC,CAAEU,GAAG,KAAM;EACpEC,cAAc,EAAE,CAAC,CAAC;EAElBC,gBAAgBA,CAAC;IAAEC,cAAc;IAAEV,MAAM;IAAEW;EAAY,CAAC,EAAE;IACxD,IAAI,CAACD,cAAc,IAAI,CAACV,MAAM,EAAE;IAEhCO,GAAG,CAAER,KAAK,IAAK;MACb,MAAMa,OAAO,GAAGb,KAAK,CAACS,cAAc,CAACE,cAAc,CAAC;MAEpD,IAAI,CAACC,WAAW,IAAIA,WAAW,CAACP,MAAM,KAAK,CAAC,EAAE;QAC5C,IAAI,CAACQ,OAAO,GAAGZ,MAAM,CAAC,EAAE,OAAOD,KAAK;QACpC,MAAMc,SAAS,GAAGf,WAAW,CAACc,OAAO,EAAEZ,MAAM,CAAC;QAC9C,MAAMQ,cAAc,GAAG;UAAE,GAAGT,KAAK,CAACS;QAAe,CAAC;QAClD,IAAIK,SAAS,EAAEL,cAAc,CAACE,cAAc,CAAC,GAAGG,SAAS,CAAC,KACrD,OAAOL,cAAc,CAACE,cAAc,CAAC;QAC1C,OAAO;UAAEF;QAAe,CAAC;MAC3B;MAEA,OAAO;QACLA,cAAc,EAAE;UACd,GAAGT,KAAK,CAACS,cAAc;UACvB,CAACE,cAAc,GAAG;YAChB,GAAGE,OAAO;YACV,CAACZ,MAAM,GAAG;cAAEA,MAAM;cAAEW,WAAW;cAAEG,SAAS,EAAEC,IAAI,CAACC,GAAG,CAAC;YAAE;UACzD;QACF;MACF,CAAC;IACH,CAAC,CAAC;EACJ,CAAC;EAEDC,WAAWA,CAACP,cAAc,EAAEV,MAAM,EAAE;IAClCO,GAAG,CAAER,KAAK,IAAK;MACb,MAAMa,OAAO,GAAGb,KAAK,CAACS,cAAc,CAACE,cAAc,CAAC;MACpD,IAAI,CAACE,OAAO,GAAGZ,MAAM,CAAC,EAAE,OAAOD,KAAK;MAEpC,MAAMc,SAAS,GAAGf,WAAW,CAACc,OAAO,EAAEZ,MAAM,CAAC;MAC9C,MAAMQ,cAAc,GAAG;QAAE,GAAGT,KAAK,CAACS;MAAe,CAAC;MAClD,IAAIK,SAAS,EAAEL,cAAc,CAACE,cAAc,CAAC,GAAGG,SAAS,CAAC,KACrD,OAAOL,cAAc,CAACE,cAAc,CAAC;MAC1C,OAAO;QAAEF;MAAe,CAAC;IAC3B,CAAC,CAAC;EACJ;AACF,CAAC,CAAC,CAAC","ignoreList":[]}
@@ -3,6 +3,8 @@
3
3
  const i18nKey = {
4
4
  'thread_card_bot_crm_name': 'Droppii Hỗ Trợ',
5
5
  'thread_card_fallback_name': 'Người dùng',
6
+ 'chat:typing_single': '<bold>{{name}}</bold> đang nhập',
7
+ 'chat:typing_multiple': 'Nhiều người đang nhập',
6
8
  'chat:file_too_large': 'Tệp tải lên không hợp lệ. Kích thước tệp không được vượt quá {{maxSize}}MB',
7
9
  'chat:file_max_count': 'Chỉ có thể đính kèm tối đa 3 tệp',
8
10
  'chat:file_pick_failed': 'Không thể chọn tệp',
@@ -1 +1 @@
1
- {"version":3,"names":["i18nKey","vi"],"sourceRoot":"../../../../src","sources":["translation/resources/i18n.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["i18nKey","vi"],"sourceRoot":"../../../../src","sources":["translation/resources/i18n.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+
3
+ export const COLLAPSED_LINES = 5;
4
+ const MEASURE_THRESHOLD_CHARS = 100;
5
+ export const expandedKey = (surface, messageId) => `${surface}:${messageId}`;
6
+ const countNewlines = text => {
7
+ let count = 0;
8
+ for (let i = 0; i < text.length; i += 1) {
9
+ if (text.charCodeAt(i) === 10) count += 1;
10
+ }
11
+ return count;
12
+ };
13
+
14
+ /**
15
+ * Character count alone is not an approximation of rendered lines — it is
16
+ * wrong for the shapes this chat carries most (pasted addresses, order lists),
17
+ * where an eight-line message can be under 70 characters. Newlines cost one
18
+ * character and a whole line, so both signals are needed. Message text is
19
+ * sender-controlled, so a length-only gate is also trivially defeated.
20
+ */
21
+ export const isMeasurementCandidate = text => text.length >= MEASURE_THRESHOLD_CHARS || countNewlines(text) >= COLLAPSED_LINES;
22
+
23
+ /**
24
+ * Returns a copy without the entries belonging to `surface`, or the original
25
+ * reference when nothing matched — callers use that identity to skip a
26
+ * pointless store update.
27
+ */
28
+ export const withoutSurface = (expanded, surface) => {
29
+ const prefix = `${surface}:`;
30
+ const next = {};
31
+ let removed = false;
32
+ for (const key in expanded) {
33
+ if (key.startsWith(prefix)) {
34
+ removed = true;
35
+ } else {
36
+ next[key] = true;
37
+ }
38
+ }
39
+ return removed ? next : expanded;
40
+ };
41
+ //# sourceMappingURL=expandableText.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["COLLAPSED_LINES","MEASURE_THRESHOLD_CHARS","expandedKey","surface","messageId","countNewlines","text","count","i","length","charCodeAt","isMeasurementCandidate","withoutSurface","expanded","prefix","next","removed","key","startsWith"],"sourceRoot":"../../../src","sources":["utils/expandableText.ts"],"mappings":";;AAEA,OAAO,MAAMA,eAAe,GAAG,CAAC;AAEhC,MAAMC,uBAAuB,GAAG,GAAG;AAEnC,OAAO,MAAMC,WAAW,GAAGA,CAACC,OAAuB,EAAEC,SAAiB,KACpE,GAAGD,OAAO,IAAIC,SAAS,EAAE;AAE3B,MAAMC,aAAa,GAAIC,IAAY,IAAK;EACtC,IAAIC,KAAK,GAAG,CAAC;EACb,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGF,IAAI,CAACG,MAAM,EAAED,CAAC,IAAI,CAAC,EAAE;IACvC,IAAIF,IAAI,CAACI,UAAU,CAACF,CAAC,CAAC,KAAK,EAAE,EAAED,KAAK,IAAI,CAAC;EAC3C;EACA,OAAOA,KAAK;AACd,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMI,sBAAsB,GAAIL,IAAY,IACjDA,IAAI,CAACG,MAAM,IAAIR,uBAAuB,IACtCI,aAAa,CAACC,IAAI,CAAC,IAAIN,eAAe;;AAExC;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMY,cAAc,GAAGA,CAC5BC,QAA8B,EAC9BV,OAAuB,KACE;EACzB,MAAMW,MAAM,GAAG,GAAGX,OAAO,GAAG;EAC5B,MAAMY,IAA0B,GAAG,CAAC,CAAC;EACrC,IAAIC,OAAO,GAAG,KAAK;EAEnB,KAAK,MAAMC,GAAG,IAAIJ,QAAQ,EAAE;IAC1B,IAAII,GAAG,CAACC,UAAU,CAACJ,MAAM,CAAC,EAAE;MAC1BE,OAAO,GAAG,IAAI;IAChB,CAAC,MAAM;MACLD,IAAI,CAACE,GAAG,CAAC,GAAG,IAAI;IAClB;EACF;EAEA,OAAOD,OAAO,GAAGD,IAAI,GAAGF,QAAQ;AAClC,CAAC","ignoreList":[]}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Cut-point arithmetic for the inline `... Xem thêm` preview. Everything here
5
+ * works on the lines RN reports from `onTextLayout`, whose `text` includes the
6
+ * line's trailing break — so joining them reproduces the rendered string and a
7
+ * running length is a valid character offset into it.
8
+ */
9
+
10
+ // How far back a shrink may look for a word boundary before accepting a
11
+ // mid-word cut. One long unbroken token (a URL) must still be cuttable.
12
+ const WORD_SNAP_WINDOW = 20;
13
+ const isSpace = char => !!char && /\s/.test(char);
14
+ const isHighSurrogate = code => code >= 0xd800 && code <= 0xdbff;
15
+ export const joinLines = lines => lines.map(line => line.text).join('');
16
+
17
+ /**
18
+ * Backs `cut` off trailing whitespace — a kept `\n` would push the suffix onto
19
+ * a line of its own — and off half an emoji, which would render as a tofu box.
20
+ */
21
+ export const settleCut = (full, cut) => {
22
+ let next = Math.max(0, Math.min(cut, full.length));
23
+ if (next > 0 && isHighSurrogate(full.charCodeAt(next - 1))) next -= 1;
24
+ while (next > 0 && isSpace(full[next - 1])) next -= 1;
25
+ return next;
26
+ };
27
+
28
+ /** First guess: everything on the first `maxLines` lines. */
29
+ export const initialCut = (lines, maxLines) => {
30
+ const full = joinLines(lines);
31
+ return settleCut(full, joinLines(lines.slice(0, maxLines)).length);
32
+ };
33
+
34
+ /**
35
+ * The suffix did not fit and wrapped past `maxLines`. Drop at least as many
36
+ * characters as spilled over — the spill includes the suffix itself, so this
37
+ * converges in one or two passes — then prefer ending on a word.
38
+ */
39
+ export const shrinkCut = (full, cut, fittedLines, maxLines) => {
40
+ const overflow = joinLines(fittedLines.slice(maxLines)).length;
41
+ let next = Math.max(0, cut - Math.max(overflow, 1));
42
+ const floor = Math.max(0, next - WORD_SNAP_WINDOW);
43
+ for (let i = next; i > floor; i -= 1) {
44
+ if (isSpace(full[i - 1])) {
45
+ next = i;
46
+ break;
47
+ }
48
+ }
49
+ return settleCut(full, next);
50
+ };
51
+ //# sourceMappingURL=inlineTruncation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["WORD_SNAP_WINDOW","isSpace","char","test","isHighSurrogate","code","joinLines","lines","map","line","text","join","settleCut","full","cut","next","Math","max","min","length","charCodeAt","initialCut","maxLines","slice","shrinkCut","fittedLines","overflow","floor","i"],"sourceRoot":"../../../src","sources":["utils/inlineTruncation.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;;AAKA;AACA;AACA,MAAMA,gBAAgB,GAAG,EAAE;AAE3B,MAAMC,OAAO,GAAIC,IAAwB,IAAK,CAAC,CAACA,IAAI,IAAI,IAAI,CAACC,IAAI,CAACD,IAAI,CAAC;AAEvE,MAAME,eAAe,GAAIC,IAAY,IAAKA,IAAI,IAAI,MAAM,IAAIA,IAAI,IAAI,MAAM;AAE1E,OAAO,MAAMC,SAAS,GAAIC,KAA8B,IACtDA,KAAK,CAACC,GAAG,CAAEC,IAAI,IAAKA,IAAI,CAACC,IAAI,CAAC,CAACC,IAAI,CAAC,EAAE,CAAC;;AAEzC;AACA;AACA;AACA;AACA,OAAO,MAAMC,SAAS,GAAGA,CAACC,IAAY,EAAEC,GAAW,KAAK;EACtD,IAAIC,IAAI,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAED,IAAI,CAACE,GAAG,CAACJ,GAAG,EAAED,IAAI,CAACM,MAAM,CAAC,CAAC;EAClD,IAAIJ,IAAI,GAAG,CAAC,IAAIX,eAAe,CAACS,IAAI,CAACO,UAAU,CAACL,IAAI,GAAG,CAAC,CAAC,CAAC,EAAEA,IAAI,IAAI,CAAC;EACrE,OAAOA,IAAI,GAAG,CAAC,IAAId,OAAO,CAACY,IAAI,CAACE,IAAI,GAAG,CAAC,CAAC,CAAC,EAAEA,IAAI,IAAI,CAAC;EACrD,OAAOA,IAAI;AACb,CAAC;;AAED;AACA,OAAO,MAAMM,UAAU,GAAGA,CACxBd,KAA8B,EAC9Be,QAAgB,KACb;EACH,MAAMT,IAAI,GAAGP,SAAS,CAACC,KAAK,CAAC;EAC7B,OAAOK,SAAS,CAACC,IAAI,EAAEP,SAAS,CAACC,KAAK,CAACgB,KAAK,CAAC,CAAC,EAAED,QAAQ,CAAC,CAAC,CAACH,MAAM,CAAC;AACpE,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMK,SAAS,GAAGA,CACvBX,IAAY,EACZC,GAAW,EACXW,WAAoC,EACpCH,QAAgB,KACb;EACH,MAAMI,QAAQ,GAAGpB,SAAS,CAACmB,WAAW,CAACF,KAAK,CAACD,QAAQ,CAAC,CAAC,CAACH,MAAM;EAC9D,IAAIJ,IAAI,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEH,GAAG,GAAGE,IAAI,CAACC,GAAG,CAACS,QAAQ,EAAE,CAAC,CAAC,CAAC;EAEnD,MAAMC,KAAK,GAAGX,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEF,IAAI,GAAGf,gBAAgB,CAAC;EAClD,KAAK,IAAI4B,CAAC,GAAGb,IAAI,EAAEa,CAAC,GAAGD,KAAK,EAAEC,CAAC,IAAI,CAAC,EAAE;IACpC,IAAI3B,OAAO,CAACY,IAAI,CAACe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;MACxBb,IAAI,GAAGa,CAAC;MACR;IACF;EACF;EAEA,OAAOhB,SAAS,CAACC,IAAI,EAAEE,IAAI,CAAC;AAC9B,CAAC","ignoreList":[]}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+
3
+ /** A typer drops out this long after their last signal — BR-002. */
4
+ export const INPUT_STATE_TTL = 3_000;
5
+
6
+ /** A single name longer than this is truncated before it goes in the sentence. */
7
+ const TYPING_NAME_MAX_LENGTH = 30;
8
+
9
+ /** userID -> record, for one conversation. */
10
+
11
+ /** conversationID -> that conversation's typers. */
12
+
13
+ const EMPTY_TYPERS = [];
14
+
15
+ /**
16
+ * Typers still inside the TTL window, oldest signal first.
17
+ *
18
+ * Expiry is derived from `updatedAt` rather than driven by one timer per user:
19
+ * the whole point is that each typer runs on their own clock. With A typing at
20
+ * t=0 and B at t=2s, A has to drop at t=3s while B stays until t=5s — a single
21
+ * shared timer reset by the newest signal would keep both alive to t=5s.
22
+ */
23
+ export const getActiveTypers = (state, now) => {
24
+ if (!state) return EMPTY_TYPERS;
25
+ const active = Object.values(state).filter(record => record.platformIDs.length > 0 && now - record.updatedAt < INPUT_STATE_TTL);
26
+ if (active.length === 0) return EMPTY_TYPERS;
27
+ return active.sort((a, b) => a.updatedAt - b.updatedAt);
28
+ };
29
+
30
+ /**
31
+ * When the next active typer falls out of the window, or null if none will.
32
+ *
33
+ * The caller uses this to wake up exactly once per expiry instead of polling.
34
+ */
35
+ export const getNextExpiryAt = (state, now) => {
36
+ const active = getActiveTypers(state, now);
37
+ if (active.length === 0) return null;
38
+
39
+ // Sorted oldest first, so the first entry expires first.
40
+ return active[0].updatedAt + INPUT_STATE_TTL;
41
+ };
42
+ export const truncateTypingName = name => name.length > TYPING_NAME_MAX_LENGTH ? `${name.slice(0, TYPING_NAME_MAX_LENGTH)}...` : name;
43
+
44
+ /**
45
+ * Which copy to render, as a key plus its values.
46
+ *
47
+ * Deliberately not a finished string: the name is styled differently from the
48
+ * rest of the sentence, so the caller needs the pieces separately to hand them
49
+ * to a rich-text renderer. Keeping translation out of here also leaves this
50
+ * module free of any dependency on the i18n layer.
51
+ */
52
+
53
+ export const TYPING_TEXT_KEYS = {
54
+ single: 'chat:typing_single',
55
+ multiple: 'chat:typing_multiple'
56
+ };
57
+
58
+ /**
59
+ * Copy for a set of typers, or null when the indicator should be hidden.
60
+ *
61
+ * Only one typer is ever named. Beyond that the sentence collapses, so the
62
+ * caller never has to resolve a second name.
63
+ */
64
+ export const resolveTypingText = (typerCount, singleName) => {
65
+ if (typerCount === 0) return null;
66
+ if (typerCount > 1) return {
67
+ key: TYPING_TEXT_KEYS.multiple
68
+ };
69
+ if (!singleName) return null;
70
+ return {
71
+ key: TYPING_TEXT_KEYS.single,
72
+ values: {
73
+ name: truncateTypingName(singleName)
74
+ }
75
+ };
76
+ };
77
+ //# sourceMappingURL=inputState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["INPUT_STATE_TTL","TYPING_NAME_MAX_LENGTH","EMPTY_TYPERS","getActiveTypers","state","now","active","Object","values","filter","record","platformIDs","length","updatedAt","sort","a","b","getNextExpiryAt","truncateTypingName","name","slice","TYPING_TEXT_KEYS","single","multiple","resolveTypingText","typerCount","singleName","key"],"sourceRoot":"../../../src","sources":["utils/inputState.ts"],"mappings":";;AAEA;AACA,OAAO,MAAMA,eAAe,GAAG,KAAK;;AAEpC;AACA,MAAMC,sBAAsB,GAAG,EAAE;;AAUjC;;AAGA;;AAGA,MAAMC,YAAyC,GAAG,EAAE;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,eAAe,GAAGA,CAC7BC,KAAyC,EACzCC,GAAW,KACqB;EAChC,IAAI,CAACD,KAAK,EAAE,OAAOF,YAAY;EAE/B,MAAMI,MAAM,GAAGC,MAAM,CAACC,MAAM,CAACJ,KAAK,CAAC,CAACK,MAAM,CACvCC,MAAM,IACLA,MAAM,CAACC,WAAW,CAACC,MAAM,GAAG,CAAC,IAAIP,GAAG,GAAGK,MAAM,CAACG,SAAS,GAAGb,eAC9D,CAAC;EAED,IAAIM,MAAM,CAACM,MAAM,KAAK,CAAC,EAAE,OAAOV,YAAY;EAC5C,OAAOI,MAAM,CAACQ,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,CAACF,SAAS,GAAGG,CAAC,CAACH,SAAS,CAAC;AACzD,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMI,eAAe,GAAGA,CAC7Bb,KAAyC,EACzCC,GAAW,KACO;EAClB,MAAMC,MAAM,GAAGH,eAAe,CAACC,KAAK,EAAEC,GAAG,CAAC;EAC1C,IAAIC,MAAM,CAACM,MAAM,KAAK,CAAC,EAAE,OAAO,IAAI;;EAEpC;EACA,OAAON,MAAM,CAAC,CAAC,CAAC,CAAEO,SAAS,GAAGb,eAAe;AAC/C,CAAC;AAED,OAAO,MAAMkB,kBAAkB,GAAIC,IAAY,IAC7CA,IAAI,CAACP,MAAM,GAAGX,sBAAsB,GAChC,GAAGkB,IAAI,CAACC,KAAK,CAAC,CAAC,EAAEnB,sBAAsB,CAAC,KAAK,GAC7CkB,IAAI;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAMA,OAAO,MAAME,gBAAgB,GAAG;EAC9BC,MAAM,EAAE,oBAAoB;EAC5BC,QAAQ,EAAE;AACZ,CAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,iBAAiB,GAAGA,CAC/BC,UAAkB,EAClBC,UAAmB,KACa;EAChC,IAAID,UAAU,KAAK,CAAC,EAAE,OAAO,IAAI;EACjC,IAAIA,UAAU,GAAG,CAAC,EAAE,OAAO;IAAEE,GAAG,EAAEN,gBAAgB,CAACE;EAAS,CAAC;EAC7D,IAAI,CAACG,UAAU,EAAE,OAAO,IAAI;EAC5B,OAAO;IACLC,GAAG,EAAEN,gBAAgB,CAACC,MAAM;IAC5Bd,MAAM,EAAE;MAAEW,IAAI,EAAED,kBAAkB,CAACQ,UAAU;IAAE;EACjD,CAAC;AACH,CAAC","ignoreList":[]}
@@ -68,6 +68,15 @@ export const hasNewHistoryMessages = (current, incoming) => {
68
68
  return !!key && !currentKeys.has(key);
69
69
  });
70
70
  };
71
+
72
+ /**
73
+ * Conversation ids a message could be filed under.
74
+ *
75
+ * A 1:1 id is built from both participants and their order is not recoverable
76
+ * from the message alone, so both spellings come back — `belongsToConversation`
77
+ * compares against both for exactly the same reason.
78
+ */
79
+ export const conversationIdsOfMessage = message => message.sessionType === SessionType.Group ? [getConversationID(SessionType.Group, message.groupID)] : [getConversationID(SessionType.Single, message.sendID, message.recvID), getConversationID(SessionType.Single, message.recvID, message.sendID)];
71
80
  export const belongsToConversation = (message, conversationId, targetUserId) => {
72
81
  switch (message.sessionType) {
73
82
  case SessionType.Single:
@@ -1 +1 @@
1
- {"version":3,"names":["PeerType","SessionType","getConversationID","getGroupIdFromConversationId","getMessageTime","message","sendTime","createTime","getMessageKey","clientMsgID","serverMsgID","getMessageRenderId","index","mergeMessages","current","incoming","map","Map","key","set","Array","from","values","sort","a","b","normalizeCreatedMessage","normalized","JSON","parse","Error","resolveHistoryLastMinSeq","history","fallbackMessage","lastMinSeq","seq","getHistoryPaginationAnchor","messages","length","oldest","reduce","prev","curr","hasNewHistoryMessages","currentKeys","Set","filter","Boolean","some","has","belongsToConversation","conversationId","targetUserId","sessionType","Single","forwardId","sendID","recvID","reverseId","Group","groupID","getReceiverId","conversation","peerType","conversationID","userID"],"sourceRoot":"../../../src","sources":["utils/message.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["PeerType","SessionType","getConversationID","getGroupIdFromConversationId","getMessageTime","message","sendTime","createTime","getMessageKey","clientMsgID","serverMsgID","getMessageRenderId","index","mergeMessages","current","incoming","map","Map","key","set","Array","from","values","sort","a","b","normalizeCreatedMessage","normalized","JSON","parse","Error","resolveHistoryLastMinSeq","history","fallbackMessage","lastMinSeq","seq","getHistoryPaginationAnchor","messages","length","oldest","reduce","prev","curr","hasNewHistoryMessages","currentKeys","Set","filter","Boolean","some","has","conversationIdsOfMessage","sessionType","Group","groupID","Single","sendID","recvID","belongsToConversation","conversationId","targetUserId","forwardId","reverseId","getReceiverId","conversation","peerType","conversationID","userID"],"sourceRoot":"../../../src","sources":["utils/message.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+
3
+ import { cloneElement, isValidElement } from 'react';
4
+ /**
5
+ * Walks a `<Text>` children tree — plain strings, mention runs, linkified
6
+ * runs, nested `<Text>` — and keeps the first `budget` characters of rendered
7
+ * text, preserving every element's styling and press handler up to the cut.
8
+ * Character counts line up with `onTextLayout` because RN renders exactly the
9
+ * concatenation of the string leaves.
10
+ */
11
+ const take = (node, budget) => {
12
+ if (budget <= 0 || node == null || typeof node === 'boolean') {
13
+ return [null, 0];
14
+ }
15
+ if (typeof node === 'string' || typeof node === 'number') {
16
+ const text = String(node);
17
+ return text.length <= budget ? [node, text.length] : [text.slice(0, budget), budget];
18
+ }
19
+ if (Array.isArray(node)) {
20
+ const kept = [];
21
+ let used = 0;
22
+ for (const child of node) {
23
+ if (used >= budget) break;
24
+ const [part, count] = take(child, budget - used);
25
+ kept.push(part);
26
+ used += count;
27
+ }
28
+ return [kept, used];
29
+ }
30
+ if (/*#__PURE__*/isValidElement(node)) {
31
+ if (node.props.children === undefined) return [node, 0];
32
+ const [children, used] = take(node.props.children, budget);
33
+ return [/*#__PURE__*/cloneElement(node, undefined, children), used];
34
+ }
35
+ return [node, 0];
36
+ };
37
+ export const truncateTextChildren = (node, limit) => take(node, limit)[0];
38
+ //# sourceMappingURL=truncateTextChildren.js.map