@droppii-org/chat-mobile 0.2.107 → 0.2.109

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 (137) hide show
  1. package/lib/module/components/ThreadCard/ThreadCard.js +2 -0
  2. package/lib/module/components/ThreadCard/ThreadCard.js.map +1 -1
  3. package/lib/module/components/messages/fileMessage/index.js +9 -2
  4. package/lib/module/components/messages/fileMessage/index.js.map +1 -1
  5. package/lib/module/components/messages/quotedMessage/index.js +6 -1
  6. package/lib/module/components/messages/quotedMessage/index.js.map +1 -1
  7. package/lib/module/context/TimelinePressGuardContext.js +14 -0
  8. package/lib/module/context/TimelinePressGuardContext.js.map +1 -0
  9. package/lib/module/hooks/useConversationList.js +4 -0
  10. package/lib/module/hooks/useConversationList.js.map +1 -1
  11. package/lib/module/hooks/useDismissKeyboardFirst.js +19 -0
  12. package/lib/module/hooks/useDismissKeyboardFirst.js.map +1 -0
  13. package/lib/module/hooks/useExpandableText.js +6 -1
  14. package/lib/module/hooks/useExpandableText.js.map +1 -1
  15. package/lib/module/hooks/useGuardedPress.js +19 -0
  16. package/lib/module/hooks/useGuardedPress.js.map +1 -0
  17. package/lib/module/screens/ChatInfo/ChatInfo.js +12 -3
  18. package/lib/module/screens/ChatInfo/ChatInfo.js.map +1 -1
  19. package/lib/module/screens/ChatInfo/ChatInfoActions.js +45 -40
  20. package/lib/module/screens/ChatInfo/ChatInfoActions.js.map +1 -1
  21. package/lib/module/screens/ChatInfo/ChatInfoProfile.js +11 -7
  22. package/lib/module/screens/ChatInfo/ChatInfoProfile.js.map +1 -1
  23. package/lib/module/screens/chat-detail/ChatComposer.js +89 -498
  24. package/lib/module/screens/chat-detail/ChatComposer.js.map +1 -1
  25. package/lib/module/screens/chat-detail/ChatDetail.js +38 -20
  26. package/lib/module/screens/chat-detail/ChatDetail.js.map +1 -1
  27. package/lib/module/screens/chat-detail/ChatListLegend.js +113 -76
  28. package/lib/module/screens/chat-detail/ChatListLegend.js.map +1 -1
  29. package/lib/module/screens/chat-detail/components/ChatComposerAccessorySlot.js +47 -0
  30. package/lib/module/screens/chat-detail/components/ChatComposerAccessorySlot.js.map +1 -0
  31. package/lib/module/screens/chat-detail/components/ChatComposerInputArea.js +149 -0
  32. package/lib/module/screens/chat-detail/components/ChatComposerInputArea.js.map +1 -0
  33. package/lib/module/screens/chat-detail/components/ChatComposerStatusBanner.js +104 -0
  34. package/lib/module/screens/chat-detail/components/ChatComposerStatusBanner.js.map +1 -0
  35. package/lib/module/screens/chat-detail/hooks/useChatComposerAnimation.js +0 -17
  36. package/lib/module/screens/chat-detail/hooks/useChatComposerAnimation.js.map +1 -1
  37. package/lib/module/screens/chat-detail/hooks/useChatComposerState.js +16 -2
  38. package/lib/module/screens/chat-detail/hooks/useChatComposerState.js.map +1 -1
  39. package/lib/module/screens/chat-detail/hooks/useComposerBotMenu.js +122 -0
  40. package/lib/module/screens/chat-detail/hooks/useComposerBotMenu.js.map +1 -0
  41. package/lib/module/screens/chat-detail/hooks/useComposerPanelActions.js +46 -0
  42. package/lib/module/screens/chat-detail/hooks/useComposerPanelActions.js.map +1 -0
  43. package/lib/module/screens/chat-detail/hooks/useComposerPanelDismiss.js +75 -0
  44. package/lib/module/screens/chat-detail/hooks/useComposerPanelDismiss.js.map +1 -0
  45. package/lib/module/screens/chat-detail/hooks/useComposerPanels.js +136 -0
  46. package/lib/module/screens/chat-detail/hooks/useComposerPanels.js.map +1 -0
  47. package/lib/module/screens/chat-detail/hooks/useComposerSend.js +74 -0
  48. package/lib/module/screens/chat-detail/hooks/useComposerSend.js.map +1 -0
  49. package/lib/module/screens/chat-detail/legend/LegendChatMessage.js +2 -0
  50. package/lib/module/screens/chat-detail/legend/LegendChatMessage.js.map +1 -1
  51. package/lib/module/screens/chat-detail/types.js +5 -0
  52. package/lib/module/screens/chat-detail/types.js.map +1 -1
  53. package/lib/module/store/message.js +14 -0
  54. package/lib/module/store/message.js.map +1 -1
  55. package/lib/module/utils/composerPanelDismissGesture.js +52 -0
  56. package/lib/module/utils/composerPanelDismissGesture.js.map +1 -0
  57. package/lib/module/utils/perf-marker.js +44 -0
  58. package/lib/module/utils/perf-marker.js.map +1 -0
  59. package/lib/typescript/src/components/ThreadCard/ThreadCard.d.ts.map +1 -1
  60. package/lib/typescript/src/components/messages/fileMessage/index.d.ts.map +1 -1
  61. package/lib/typescript/src/components/messages/quotedMessage/index.d.ts.map +1 -1
  62. package/lib/typescript/src/context/TimelinePressGuardContext.d.ts +3 -0
  63. package/lib/typescript/src/context/TimelinePressGuardContext.d.ts.map +1 -0
  64. package/lib/typescript/src/hooks/useConversationList.d.ts.map +1 -1
  65. package/lib/typescript/src/hooks/useDismissKeyboardFirst.d.ts +8 -0
  66. package/lib/typescript/src/hooks/useDismissKeyboardFirst.d.ts.map +1 -0
  67. package/lib/typescript/src/hooks/useExpandableText.d.ts.map +1 -1
  68. package/lib/typescript/src/hooks/useGuardedPress.d.ts +9 -0
  69. package/lib/typescript/src/hooks/useGuardedPress.d.ts.map +1 -0
  70. package/lib/typescript/src/screens/ChatInfo/ChatInfo.d.ts.map +1 -1
  71. package/lib/typescript/src/screens/ChatInfo/ChatInfoActions.d.ts +2 -1
  72. package/lib/typescript/src/screens/ChatInfo/ChatInfoActions.d.ts.map +1 -1
  73. package/lib/typescript/src/screens/ChatInfo/ChatInfoProfile.d.ts +2 -1
  74. package/lib/typescript/src/screens/ChatInfo/ChatInfoProfile.d.ts.map +1 -1
  75. package/lib/typescript/src/screens/chat-detail/ChatComposer.d.ts +7 -3
  76. package/lib/typescript/src/screens/chat-detail/ChatComposer.d.ts.map +1 -1
  77. package/lib/typescript/src/screens/chat-detail/ChatDetail.d.ts.map +1 -1
  78. package/lib/typescript/src/screens/chat-detail/ChatListLegend.d.ts +5 -1
  79. package/lib/typescript/src/screens/chat-detail/ChatListLegend.d.ts.map +1 -1
  80. package/lib/typescript/src/screens/chat-detail/components/ChatComposerAccessorySlot.d.ts +12 -0
  81. package/lib/typescript/src/screens/chat-detail/components/ChatComposerAccessorySlot.d.ts.map +1 -0
  82. package/lib/typescript/src/screens/chat-detail/components/ChatComposerInputArea.d.ts +30 -0
  83. package/lib/typescript/src/screens/chat-detail/components/ChatComposerInputArea.d.ts.map +1 -0
  84. package/lib/typescript/src/screens/chat-detail/components/ChatComposerStatusBanner.d.ts +19 -0
  85. package/lib/typescript/src/screens/chat-detail/components/ChatComposerStatusBanner.d.ts.map +1 -0
  86. package/lib/typescript/src/screens/chat-detail/hooks/useChatComposerAnimation.d.ts +0 -1
  87. package/lib/typescript/src/screens/chat-detail/hooks/useChatComposerAnimation.d.ts.map +1 -1
  88. package/lib/typescript/src/screens/chat-detail/hooks/useChatComposerState.d.ts +7 -0
  89. package/lib/typescript/src/screens/chat-detail/hooks/useChatComposerState.d.ts.map +1 -1
  90. package/lib/typescript/src/screens/chat-detail/hooks/useComposerBotMenu.d.ts +7 -0
  91. package/lib/typescript/src/screens/chat-detail/hooks/useComposerBotMenu.d.ts.map +1 -0
  92. package/lib/typescript/src/screens/chat-detail/hooks/useComposerPanelActions.d.ts +17 -0
  93. package/lib/typescript/src/screens/chat-detail/hooks/useComposerPanelActions.d.ts.map +1 -0
  94. package/lib/typescript/src/screens/chat-detail/hooks/useComposerPanelDismiss.d.ts +12 -0
  95. package/lib/typescript/src/screens/chat-detail/hooks/useComposerPanelDismiss.d.ts.map +1 -0
  96. package/lib/typescript/src/screens/chat-detail/hooks/useComposerPanels.d.ts +25 -0
  97. package/lib/typescript/src/screens/chat-detail/hooks/useComposerPanels.d.ts.map +1 -0
  98. package/lib/typescript/src/screens/chat-detail/hooks/useComposerSend.d.ts +16 -0
  99. package/lib/typescript/src/screens/chat-detail/hooks/useComposerSend.d.ts.map +1 -0
  100. package/lib/typescript/src/screens/chat-detail/legend/LegendChatMessage.d.ts.map +1 -1
  101. package/lib/typescript/src/screens/chat-detail/types.d.ts +8 -0
  102. package/lib/typescript/src/screens/chat-detail/types.d.ts.map +1 -1
  103. package/lib/typescript/src/store/message.d.ts.map +1 -1
  104. package/lib/typescript/src/utils/composerPanelDismissGesture.d.ts +33 -0
  105. package/lib/typescript/src/utils/composerPanelDismissGesture.d.ts.map +1 -0
  106. package/lib/typescript/src/utils/perf-marker.d.ts +8 -0
  107. package/lib/typescript/src/utils/perf-marker.d.ts.map +1 -0
  108. package/package.json +2 -1
  109. package/src/components/ThreadCard/ThreadCard.tsx +2 -0
  110. package/src/components/messages/fileMessage/index.tsx +17 -3
  111. package/src/components/messages/quotedMessage/index.tsx +5 -1
  112. package/src/context/TimelinePressGuardContext.tsx +15 -0
  113. package/src/hooks/useConversationList.ts +2 -0
  114. package/src/hooks/useDismissKeyboardFirst.ts +19 -0
  115. package/src/hooks/useExpandableText.ts +5 -1
  116. package/src/hooks/useGuardedPress.ts +20 -0
  117. package/src/screens/ChatInfo/ChatInfo.tsx +10 -1
  118. package/src/screens/ChatInfo/ChatInfoActions.tsx +47 -39
  119. package/src/screens/ChatInfo/ChatInfoProfile.tsx +17 -12
  120. package/src/screens/chat-detail/ChatComposer.tsx +105 -631
  121. package/src/screens/chat-detail/ChatDetail.tsx +38 -20
  122. package/src/screens/chat-detail/ChatListLegend.tsx +122 -71
  123. package/src/screens/chat-detail/components/ChatComposerAccessorySlot.tsx +61 -0
  124. package/src/screens/chat-detail/components/ChatComposerInputArea.tsx +198 -0
  125. package/src/screens/chat-detail/components/ChatComposerStatusBanner.tsx +116 -0
  126. package/src/screens/chat-detail/hooks/useChatComposerAnimation.ts +0 -29
  127. package/src/screens/chat-detail/hooks/useChatComposerState.ts +25 -2
  128. package/src/screens/chat-detail/hooks/useComposerBotMenu.tsx +140 -0
  129. package/src/screens/chat-detail/hooks/useComposerPanelActions.ts +57 -0
  130. package/src/screens/chat-detail/hooks/useComposerPanelDismiss.ts +111 -0
  131. package/src/screens/chat-detail/hooks/useComposerPanels.ts +197 -0
  132. package/src/screens/chat-detail/hooks/useComposerSend.ts +98 -0
  133. package/src/screens/chat-detail/legend/LegendChatMessage.tsx +2 -0
  134. package/src/screens/chat-detail/types.ts +9 -0
  135. package/src/store/message.ts +14 -0
  136. package/src/utils/composerPanelDismissGesture.ts +72 -0
  137. package/src/utils/perf-marker.ts +39 -0
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/screens/chat-detail/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/screens/chat-detail/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../../../src/store/message.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAGV,YAAY,EACb,MAAM,eAAe,CAAC;AAavB,eAAO,MAAM,eAAe,2EAwMzB,CAAC;AAEJ,eAAO,MAAM,kBAAkB,GAAI,aAAa,MAAM,SAiBrD,CAAC"}
1
+ {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../../../src/store/message.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAGV,YAAY,EACb,MAAM,eAAe,CAAC;AAcvB,eAAO,MAAM,eAAe,2EAqNzB,CAAC;AAEJ,eAAO,MAAM,kBAAkB,GAAI,aAAa,MAAM,SAiBrD,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Per-touch state for dismissing the composer's attachment/sticker panel by
3
+ * tapping the chat timeline: a touch that began while the panel was open and
4
+ * ended without dragging is a dismiss tap. Drag detection is explicit — a
5
+ * movement threshold or the list's scroll-begin — since the touch is only
6
+ * observed (touch events), never claimed as the JS responder.
7
+ */
8
+ export declare const DISMISS_DRAG_THRESHOLD_PX = 10;
9
+ export interface DismissTouch {
10
+ panelOpenAtStart: boolean;
11
+ dragged: boolean;
12
+ startX: number;
13
+ startY: number;
14
+ }
15
+ export declare const IDLE_DISMISS_TOUCH: DismissTouch;
16
+ export declare const startDismissTouch: (panelOpen: boolean, x: number, y: number) => DismissTouch;
17
+ export declare const moveDismissTouch: (touch: DismissTouch, x: number, y: number) => DismissTouch;
18
+ export declare const markDismissTouchDragged: (touch: DismissTouch) => DismissTouch;
19
+ /** Whether releasing this touch should close the panel. */
20
+ export declare const shouldDismissOnRelease: (touch: DismissTouch) => boolean;
21
+ /**
22
+ * How long after the finger lifts a press still belongs to the dismissing
23
+ * touch. RNGH Tap and JS onPress callbacks land right after touchEnd; a later
24
+ * press (e.g. a screen-reader activation, which sends no touch events) must
25
+ * not be swallowed by a stale flag.
26
+ */
27
+ export declare const SWALLOW_AFTER_RELEASE_MS = 500;
28
+ /**
29
+ * Whether a timeline press must be swallowed. `releasedAt` is null while the
30
+ * dismissing touch is still down.
31
+ */
32
+ export declare const isPressSwallowed: (swallow: boolean, releasedAt: number | null, now: number) => boolean;
33
+ //# sourceMappingURL=composerPanelDismissGesture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composerPanelDismissGesture.d.ts","sourceRoot":"","sources":["../../../../src/utils/composerPanelDismissGesture.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C,MAAM,WAAW,YAAY;IAC3B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,kBAAkB,EAAE,YAKhC,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,WAAW,OAAO,EAClB,GAAG,MAAM,EACT,GAAG,MAAM,KACR,YAKD,CAAC;AAEH,eAAO,MAAM,gBAAgB,GAC3B,OAAO,YAAY,EACnB,GAAG,MAAM,EACT,GAAG,MAAM,KACR,YAMF,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,OAAO,YAAY,KAAG,YACT,CAAC;AAEtD,2DAA2D;AAC3D,eAAO,MAAM,sBAAsB,GAAI,OAAO,YAAY,KAAG,OACnB,CAAC;AAE3C;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAE5C;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAC3B,SAAS,OAAO,EAChB,YAAY,MAAM,GAAG,IAAI,EACzB,KAAK,MAAM,KACV,OAEmE,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare const enablePerfMarkers: (on?: boolean) => void;
2
+ export declare const perfMark: (name: string, data?: Record<string, unknown>) => void;
3
+ /**
4
+ * Counts render-function invocations of `component`, including renders React later discards.
5
+ * Counts are batched and emitted as a delta every ~500 ms, so logging never happens per render.
6
+ */
7
+ export declare const perfCountRender: (component: string) => void;
8
+ //# sourceMappingURL=perf-marker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"perf-marker.d.ts","sourceRoot":"","sources":["../../../../src/utils/perf-marker.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,iBAAiB,GAAI,YAAS,SAE1C,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,EAAE,OAAO,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,SAGpE,CAAC;AASF;;;GAGG;AACH,eAAO,MAAM,eAAe,GAAI,WAAW,MAAM,SAKhD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@droppii-org/chat-mobile",
3
- "version": "0.2.107",
3
+ "version": "0.2.109",
4
4
  "description": "Droppii chat mobile",
5
5
  "keywords": [
6
6
  "react-native",
@@ -63,6 +63,7 @@
63
63
  "typecheck": "tsc -p tsconfig.build.json 2>&1 | grep -E 'src/.*error' || echo 'Typecheck passed (external dependency warnings ignored)'",
64
64
  "lint": "eslint \"**/*.{js,ts,tsx}\"",
65
65
  "test": "jest",
66
+ "perf": "node performance/scripts/cli.mjs",
66
67
  "release": "release-it --no-git --ci --no-increment",
67
68
  "web": "vite",
68
69
  "build:web": "vite build",
@@ -25,6 +25,7 @@ import { MuteThread } from './MuteThread';
25
25
  import { PinThread } from './PinThread';
26
26
  import { useIsJoinedGroup } from '../../hooks/useIsJoinedGroup';
27
27
  import isEmpty from 'lodash/isEmpty';
28
+ import { perfCountRender } from '../../utils/perf-marker';
28
29
 
29
30
  interface ThreadCardProps {
30
31
  item: string;
@@ -35,6 +36,7 @@ interface ThreadCardProps {
35
36
  }
36
37
 
37
38
  const ThreadCard = memo(({ item, onPress }: ThreadCardProps) => {
39
+ perfCountRender('ThreadCard');
38
40
  const conversation = useConversation(item);
39
41
 
40
42
  const {
@@ -7,6 +7,9 @@ import { getTailCornerStyle } from '../bubbleTail.utils';
7
7
  import { BubbleTailRow } from '../BubbleTailRow';
8
8
  import type { BaseLegendMessageProps } from '../types';
9
9
  import { useFileDownload } from '../../../hooks/useFileDownload';
10
+ import { useGuardedPress } from '../../../hooks/useGuardedPress';
11
+ import { useDismissKeyboardFirst } from '../../../hooks/useDismissKeyboardFirst';
12
+ import { useTimelinePressGuard } from '../../../context/TimelinePressGuardContext';
10
13
  import {
11
14
  getFileIcon,
12
15
  getMimeType,
@@ -22,9 +25,20 @@ export const FileMessage = memo(
22
25
  (message.fileElem as any)?.url ||
23
26
  '';
24
27
 
25
- const { state, handleView, handleDownload } = useFileDownload(
26
- fileName,
27
- url
28
+ const {
29
+ state,
30
+ handleView: handleViewRaw,
31
+ handleDownload: handleDownloadRaw,
32
+ } = useFileDownload(fileName, url);
33
+ // Skipped for the tap that dismisses a composer panel (timeline only).
34
+ const shouldSwallowPress = useTimelinePressGuard();
35
+ const handleView = useGuardedPress(
36
+ useDismissKeyboardFirst(handleViewRaw),
37
+ shouldSwallowPress
38
+ );
39
+ const handleDownload = useGuardedPress(
40
+ handleDownloadRaw,
41
+ shouldSwallowPress
28
42
  );
29
43
 
30
44
  const mimeType = useMemo(() => getMimeType(fileName), [fileName]);
@@ -25,6 +25,7 @@ import { renderLinkifiedText } from '../LinkifiedText';
25
25
  import { ExpandableMessageText } from '../ExpandableMessageText';
26
26
  import { useUserStore } from '../../../store';
27
27
  import { useChatDetailContext } from '../../../context';
28
+ import { useTimelinePressGuard } from '../../../context/TimelinePressGuardContext';
28
29
  import { ChatEvent } from '../../../types/events';
29
30
 
30
31
  interface QuotedMessageProps extends BaseLegendMessageProps {
@@ -85,11 +86,14 @@ const QuotedMessage = memo((props: QuotedMessageProps) => {
85
86
  return getFileIcon(mimeType);
86
87
  }, [quotedMessage]);
87
88
 
89
+ // Skipped for the tap that dismisses a composer panel (timeline only).
90
+ const shouldSwallowPress = useTimelinePressGuard();
88
91
  const handlePressQuotedMessage = useCallback(() => {
92
+ if (shouldSwallowPress()) return;
89
93
  DeviceEventEmitter.emit(ChatEvent.ScrollToMessage, {
90
94
  clientMessageId: quotedMessage?.clientMsgID || '',
91
95
  });
92
- }, [quotedMessage]);
96
+ }, [quotedMessage, shouldSwallowPress]);
93
97
 
94
98
  return (
95
99
  <>
@@ -0,0 +1,15 @@
1
+ import { createContext, useContext } from 'react';
2
+
3
+ const neverSwallow = () => false;
4
+
5
+ /**
6
+ * Timeline-only press guard. ChatListLegend provides the tap-outside panel
7
+ * dismiss's `shouldSwallowPress` (useComposerPanelDismiss); every other
8
+ * surface (Pin Management, toolbox overlay) gets the no-op default.
9
+ */
10
+ const TimelinePressGuardContext = createContext<() => boolean>(neverSwallow);
11
+
12
+ export const TimelinePressGuardProvider = TimelinePressGuardContext.Provider;
13
+
14
+ export const useTimelinePressGuard = () =>
15
+ useContext(TimelinePressGuardContext);
@@ -4,6 +4,7 @@ import OpenIMSDK from '@droppii/openim-rn-client-sdk';
4
4
  import { conversationQueryKeys } from './query-keys';
5
5
  import { useConversationStore } from '../store';
6
6
  import type { DChatApplicationType } from '../types/chat';
7
+ import { perfMark } from '../utils/perf-marker';
7
8
 
8
9
  type Params = {
9
10
  applicationType: DChatApplicationType;
@@ -33,6 +34,7 @@ export function useConversationList({
33
34
  });
34
35
 
35
36
  useConversationStore.getState().updateConversations(conversations);
37
+ perfMark('conversation_list_loaded', { count: conversations.length });
36
38
  return conversations;
37
39
  },
38
40
  });
@@ -0,0 +1,19 @@
1
+ import { useMemo } from 'react';
2
+ import { Keyboard } from 'react-native';
3
+
4
+ /**
5
+ * Wraps a press that leaves the timeline (media viewer, link, file viewer) so
6
+ * the keyboard is dismissed first. The timeline uses
7
+ * `keyboardShouldPersistTaps="handled"`, so the keyboard would otherwise stay
8
+ * up over the screen the press opens. An absent handler stays absent.
9
+ */
10
+ export const useDismissKeyboardFirst = <A extends unknown[]>(
11
+ handler: ((...args: A) => unknown) | undefined
12
+ ): ((...args: A) => void) | undefined =>
13
+ useMemo(() => {
14
+ if (!handler) return handler;
15
+ return (...args: A) => {
16
+ Keyboard.dismiss();
17
+ handler(...args);
18
+ };
19
+ }, [handler]);
@@ -1,6 +1,7 @@
1
1
  import { useCallback, useState } from 'react';
2
2
  import { useWindowDimensions, type TextLayoutEvent } from 'react-native';
3
3
  import { useExpandedMessageStore } from '../store/expandedMessage';
4
+ import { useTimelinePressGuard } from '../context/TimelinePressGuardContext';
4
5
  import {
5
6
  COLLAPSED_LINES,
6
7
  expandedKey,
@@ -125,9 +126,12 @@ export function useExpandableText(
125
126
  [fit, key, settle]
126
127
  );
127
128
 
129
+ // Skipped for the tap that dismisses a composer panel (timeline only).
130
+ const shouldSwallowPress = useTimelinePressGuard();
128
131
  const expand = useCallback(() => {
132
+ if (shouldSwallowPress()) return;
129
133
  expandInStore(surface, messageId);
130
- }, [expandInStore, surface, messageId]);
134
+ }, [expandInStore, surface, messageId, shouldSwallowPress]);
131
135
 
132
136
  return {
133
137
  mode,
@@ -0,0 +1,20 @@
1
+ import { useMemo } from 'react';
2
+
3
+ /**
4
+ * Wraps a timeline press handler so it is skipped while `shouldSwallow()` is
5
+ * true — the tap-outside panel dismiss (useComposerPanelDismiss) swallows the
6
+ * press of a touch that began with a composer panel open. An absent handler
7
+ * stays absent, so "not tappable" rows keep behaving as before. The wrapper's
8
+ * return value is dropped: press handlers are fire-and-forget.
9
+ */
10
+ export const useGuardedPress = <A extends unknown[]>(
11
+ handler: ((...args: A) => unknown) | undefined,
12
+ shouldSwallow: (() => boolean) | undefined
13
+ ): ((...args: A) => void) | undefined =>
14
+ useMemo(() => {
15
+ if (!handler || !shouldSwallow) return handler;
16
+ return (...args: A) => {
17
+ if (shouldSwallow()) return;
18
+ handler(...args);
19
+ };
20
+ }, [handler, shouldSwallow]);
@@ -1,4 +1,4 @@
1
- import { memo, useCallback } from 'react';
1
+ import { memo, useCallback, useMemo } from 'react';
2
2
  import { KContainer, KNavigation } from '@droppii/libs';
3
3
  import { useNavigation } from '@react-navigation/native';
4
4
  import { useGetConversationTarget } from '../../hooks/conversation/useGetConversationDetail';
@@ -14,6 +14,7 @@ import { trans } from '../../translation';
14
14
  import { withChatDetailProvider } from '../../context';
15
15
  import { useChatDetailContext } from '../../context';
16
16
  import { getHeaderIconColor } from '../../utils/theme';
17
+ import { useIsJoinedGroup } from '../../hooks/useIsJoinedGroup';
17
18
 
18
19
  const ChatInfo = memo(
19
20
  ({
@@ -39,6 +40,12 @@ const ChatInfo = memo(
39
40
  );
40
41
  const { leaveGroup } = useLeaveGroup();
41
42
 
43
+ const { data: isJoinedGroup } = useIsJoinedGroup(conversation?.groupID);
44
+
45
+ const isNotInGroup = useMemo(() => {
46
+ return isGroup ? !isJoinedGroup : false;
47
+ }, [isGroup, isJoinedGroup]);
48
+
42
49
  const handleLeaveGroup = useCallback(async () => {
43
50
  if (!conversation?.groupID) return;
44
51
 
@@ -78,6 +85,7 @@ const ChatInfo = memo(
78
85
  <ChatInfoProfile
79
86
  conversation={conversation}
80
87
  onPressSearch={onPressSearch}
88
+ isNotInGroup={isNotInGroup}
81
89
  />
82
90
  <ChatInfoMediaRow onPressMedia={onPressMedia} />
83
91
  <KContainer.VisibleView visible={isGroup}>
@@ -92,6 +100,7 @@ const ChatInfo = memo(
92
100
  onPressAddToGroup={onPressAddToGroup}
93
101
  onPressLeaveGroup={handleLeaveGroup}
94
102
  onDismissGroup={onDismissGroup}
103
+ isNotInGroup={isNotInGroup}
95
104
  />
96
105
  </KContainer.ScrollView>
97
106
  </KContainer.Page>
@@ -26,6 +26,7 @@ interface ChatInfoActionsProps {
26
26
  onPressAddToGroup?: () => void;
27
27
  onPressLeaveGroup?: () => void;
28
28
  onDismissGroup?: () => void;
29
+ isNotInGroup?: boolean;
29
30
  }
30
31
 
31
32
  const ChatInfoActions = memo(
@@ -38,6 +39,7 @@ const ChatInfoActions = memo(
38
39
  onPressAddToGroup,
39
40
  onPressLeaveGroup,
40
41
  onDismissGroup,
42
+ isNotInGroup,
41
43
  }: ChatInfoActionsProps) => {
42
44
  const { pinConversation, unpinConversation } = usePinConversation();
43
45
  const isPinned = Boolean(conversation?.isPinned);
@@ -113,22 +115,24 @@ const ChatInfoActions = memo(
113
115
  }
114
116
  }
115
117
 
116
- items.push({
117
- leftNode: {
118
- icon: { vectorName: isPinned ? 'thumbtack-off-o' : 'thumbtack-o' },
119
- },
120
- onPress: handlePinPress,
121
- showChevron: false,
122
- paddingH: '0.75rem',
123
- paddingV: '0.75rem',
124
- customLabel: (
125
- <KLabel.Text typo="TextMdMedium" numberOfLines={1}>
126
- {isPinned
127
- ? trans('chat:info_unpin_message')
128
- : trans('chat:info_pin_message')}
129
- </KLabel.Text>
130
- ),
131
- });
118
+ if (!isNotInGroup) {
119
+ items.push({
120
+ leftNode: {
121
+ icon: { vectorName: isPinned ? 'thumbtack-off-o' : 'thumbtack-o' },
122
+ },
123
+ onPress: handlePinPress,
124
+ showChevron: false,
125
+ paddingH: '0.75rem',
126
+ paddingV: '0.75rem',
127
+ customLabel: (
128
+ <KLabel.Text typo="TextMdMedium" numberOfLines={1}>
129
+ {isPinned
130
+ ? trans('chat:info_unpin_message')
131
+ : trans('chat:info_pin_message')}
132
+ </KLabel.Text>
133
+ ),
134
+ });
135
+ }
132
136
 
133
137
  return items;
134
138
  }, [
@@ -141,11 +145,12 @@ const ChatInfoActions = memo(
141
145
  onPressCreateGroup,
142
146
  onPressAddToGroup,
143
147
  handlePinPress,
148
+ isNotInGroup,
144
149
  ]);
145
150
 
146
151
  const dangerData: KListItemBaseItemProps[] = useMemo(() => {
147
152
  const items: KListItemBaseItemProps[] = [];
148
- if (isGroup) {
153
+ if (isGroup && !isNotInGroup) {
149
154
  items.push({
150
155
  leftNode: {
151
156
  icon: {
@@ -194,29 +199,31 @@ const ChatInfoActions = memo(
194
199
  }
195
200
  }
196
201
 
197
- items.push({
198
- label: trans('chat:info_delete_history'),
199
- leftNode: {
200
- icon: {
201
- vectorName: 'trash-alt-o-1',
202
- tintColor: KColors.danger.normal,
202
+ if (!isNotInGroup) {
203
+ items.push({
204
+ label: trans('chat:info_delete_history'),
205
+ leftNode: {
206
+ icon: {
207
+ vectorName: 'trash-alt-o-1',
208
+ tintColor: KColors.danger.normal,
209
+ },
203
210
  },
204
- },
205
- tintColor: KColors.danger.normal,
206
- onPress: handleDeleteHistory,
207
- showChevron: false,
208
- paddingH: '0.75rem',
209
- paddingV: '0.75rem',
210
- customLabel: (
211
- <KLabel.Text
212
- typo="TextMdMedium"
213
- color={KColors.danger.normal}
214
- numberOfLines={1}
215
- >
216
- {trans('chat:info_delete_history')}
217
- </KLabel.Text>
218
- ),
219
- });
211
+ tintColor: KColors.danger.normal,
212
+ onPress: handleDeleteHistory,
213
+ showChevron: false,
214
+ paddingH: '0.75rem',
215
+ paddingV: '0.75rem',
216
+ customLabel: (
217
+ <KLabel.Text
218
+ typo="TextMdMedium"
219
+ color={KColors.danger.normal}
220
+ numberOfLines={1}
221
+ >
222
+ {trans('chat:info_delete_history')}
223
+ </KLabel.Text>
224
+ ),
225
+ });
226
+ }
220
227
 
221
228
  return items;
222
229
  }, [
@@ -225,6 +232,7 @@ const ChatInfoActions = memo(
225
232
  handleDeleteHistory,
226
233
  isOwner,
227
234
  handleDismissGroup,
235
+ isNotInGroup,
228
236
  ]);
229
237
 
230
238
  return (
@@ -47,10 +47,11 @@ const QuickAction = memo(
47
47
  interface ChatInfoProfileProps {
48
48
  conversation?: ConversationItem;
49
49
  onPressSearch?: () => void;
50
+ isNotInGroup?: boolean;
50
51
  }
51
52
 
52
53
  const ChatInfoProfile = memo(
53
- ({ conversation, onPressSearch }: ChatInfoProfileProps) => {
54
+ ({ conversation, onPressSearch, isNotInGroup }: ChatInfoProfileProps) => {
54
55
  const { faceURL, showName = '' } = conversation ?? {};
55
56
 
56
57
  const isMuted =
@@ -122,17 +123,21 @@ const ChatInfoProfile = memo(
122
123
  background={KColors.palette.gray.w25}
123
124
  iconColor={KColors.gray.dark}
124
125
  />
125
- <QuickAction
126
- iconName={isMuted ? 'bell-b' : 'bell-off-o'}
127
- label={
128
- isMuted ? trans('chat:unmute_action') : trans('chat:mute_action')
129
- }
130
- background={
131
- isMuted ? KColors.primary.normal : KColors.palette.gray.w25
132
- }
133
- iconColor={isMuted ? KColors.white : KColors.gray.dark}
134
- onPress={handleNotificationPress}
135
- />
126
+ <KContainer.VisibleView visible={!isNotInGroup}>
127
+ <QuickAction
128
+ iconName={isMuted ? 'bell-b' : 'bell-off-o'}
129
+ label={
130
+ isMuted
131
+ ? trans('chat:unmute_action')
132
+ : trans('chat:mute_action')
133
+ }
134
+ background={
135
+ isMuted ? KColors.primary.normal : KColors.palette.gray.w25
136
+ }
137
+ iconColor={isMuted ? KColors.white : KColors.gray.dark}
138
+ onPress={handleNotificationPress}
139
+ />
140
+ </KContainer.VisibleView>
136
141
  </KContainer.View>
137
142
  </KContainer.View>
138
143
  );