@planningcenter/chat-react-native 4.0.0-rc.3 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/hooks/use_rest_away_from_dismiss_edge.d.ts +1 -0
- package/build/hooks/use_rest_away_from_dismiss_edge.d.ts.map +1 -1
- package/build/hooks/use_rest_away_from_dismiss_edge.js +24 -11
- package/build/hooks/use_rest_away_from_dismiss_edge.js.map +1 -1
- package/build/screens/conversation_screen.d.ts.map +1 -1
- package/build/screens/conversation_screen.js +48 -45
- package/build/screens/conversation_screen.js.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/hooks/use_rest_away_from_dismiss_edge.test.ts +70 -0
- package/src/hooks/use_rest_away_from_dismiss_edge.ts +42 -10
- package/src/screens/conversation_screen.tsx +2 -1
|
@@ -11,6 +11,7 @@ export declare const useRestAwayFromDismissEdge: ({ listRef, enabled, }: {
|
|
|
11
11
|
enabled?: boolean;
|
|
12
12
|
}) => {
|
|
13
13
|
restOffset: number;
|
|
14
|
+
onLayout: (...args: any[]) => void;
|
|
14
15
|
onContentSizeChange: (...args: any[]) => void;
|
|
15
16
|
onScrollEndDrag: (...args: any[]) => void;
|
|
16
17
|
onMomentumScrollEnd: (...args: any[]) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use_rest_away_from_dismiss_edge.d.ts","sourceRoot":"","sources":["../../src/hooks/use_rest_away_from_dismiss_edge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAuB,MAAM,OAAO,CAAA;AACtD,OAAO,
|
|
1
|
+
{"version":3,"file":"use_rest_away_from_dismiss_edge.d.ts","sourceRoot":"","sources":["../../src/hooks/use_rest_away_from_dismiss_edge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAuB,MAAM,OAAO,CAAA;AACtD,OAAO,EACL,QAAQ,EAKT,MAAM,cAAc,CAAA;AAIrB;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,GAAI,uBAGxC;IACD,OAAO,EAAE,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAA;IACnC,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;;;;;;CAkEA,CAAA"}
|
|
@@ -13,23 +13,34 @@ export const useRestAwayFromDismissEdge = ({
|
|
|
13
13
|
listRef,
|
|
14
14
|
enabled = Platform.OS === 'ios'
|
|
15
15
|
}) => {
|
|
16
|
+
const layoutHeight = useRef(0);
|
|
17
|
+
const contentHeight = useRef(0);
|
|
18
|
+
const didSetInitialOffset = useRef(false);
|
|
19
|
+
const canRestAwayFromEdge = useCallback(() => layoutHeight.current > 0 && contentHeight.current - layoutHeight.current >= REST_OFFSET, []);
|
|
16
20
|
const restAwayFromDismissEdge = useCallback(() => {
|
|
21
|
+
if (!canRestAwayFromEdge()) return;
|
|
17
22
|
listRef.current?.scrollToOffset({
|
|
18
23
|
animated: false,
|
|
19
24
|
offset: REST_OFFSET
|
|
20
25
|
});
|
|
21
|
-
}, [listRef]);
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
}, [canRestAwayFromEdge, listRef]);
|
|
27
|
+
const applyInitialOffsetOnceScrollable = useCallback(() => {
|
|
28
|
+
if (didSetInitialOffset.current || !canRestAwayFromEdge()) return;
|
|
29
|
+
didSetInitialOffset.current = true;
|
|
30
|
+
restAwayFromDismissEdge();
|
|
31
|
+
}, [canRestAwayFromEdge, restAwayFromDismissEdge]);
|
|
32
|
+
const handleLayout = useCallback(event => {
|
|
33
|
+
layoutHeight.current = event.nativeEvent.layout.height;
|
|
34
|
+
applyInitialOffsetOnceScrollable();
|
|
35
|
+
}, [applyInitialOffsetOnceScrollable]);
|
|
36
|
+
const handleContentSizeChange = useCallback((_width, height) => {
|
|
37
|
+
contentHeight.current = height;
|
|
38
|
+
applyInitialOffsetOnceScrollable();
|
|
39
|
+
}, [applyInitialOffsetOnceScrollable]);
|
|
29
40
|
|
|
30
41
|
// A negative offset means the bounce is still animating; let it settle first.
|
|
31
|
-
const handleScrollSettled = useCallback(
|
|
32
|
-
const offsetY =
|
|
42
|
+
const handleScrollSettled = useCallback(event_0 => {
|
|
43
|
+
const offsetY = event_0.nativeEvent.contentOffset.y;
|
|
33
44
|
if (offsetY >= 0 && offsetY < REST_OFFSET) {
|
|
34
45
|
restAwayFromDismissEdge();
|
|
35
46
|
}
|
|
@@ -37,6 +48,7 @@ export const useRestAwayFromDismissEdge = ({
|
|
|
37
48
|
if (!enabled) {
|
|
38
49
|
return {
|
|
39
50
|
restOffset: 0,
|
|
51
|
+
onLayout: noop,
|
|
40
52
|
onContentSizeChange: noop,
|
|
41
53
|
onScrollEndDrag: noop,
|
|
42
54
|
onMomentumScrollEnd: noop
|
|
@@ -44,7 +56,8 @@ export const useRestAwayFromDismissEdge = ({
|
|
|
44
56
|
}
|
|
45
57
|
return {
|
|
46
58
|
restOffset: REST_OFFSET,
|
|
47
|
-
|
|
59
|
+
onLayout: handleLayout,
|
|
60
|
+
onContentSizeChange: handleContentSizeChange,
|
|
48
61
|
onScrollEndDrag: handleScrollSettled,
|
|
49
62
|
onMomentumScrollEnd: handleScrollSettled
|
|
50
63
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use_rest_away_from_dismiss_edge.js","names":["noop","useCallback","useRef","Platform","REST_OFFSET","useRestAwayFromDismissEdge","listRef","enabled","OS","
|
|
1
|
+
{"version":3,"file":"use_rest_away_from_dismiss_edge.js","names":["noop","useCallback","useRef","Platform","REST_OFFSET","useRestAwayFromDismissEdge","listRef","enabled","OS","layoutHeight","contentHeight","didSetInitialOffset","canRestAwayFromEdge","current","restAwayFromDismissEdge","scrollToOffset","animated","offset","applyInitialOffsetOnceScrollable","handleLayout","event","nativeEvent","layout","height","handleContentSizeChange","_width","handleScrollSettled","offsetY","contentOffset","y","restOffset","onLayout","onContentSizeChange","onScrollEndDrag","onMomentumScrollEnd"],"sources":["../../src/hooks/use_rest_away_from_dismiss_edge.ts"],"sourcesContent":["import { noop } from 'lodash'\nimport { RefObject, useCallback, useRef } from 'react'\nimport {\n FlatList,\n LayoutChangeEvent,\n NativeScrollEvent,\n NativeSyntheticEvent,\n Platform,\n} from 'react-native'\n\nconst REST_OFFSET = 1\n\n/**\n * iOS starts a sheet's interactive dismissal once the content scroll view sits at its\n * top content edge — for an inverted list, wherever the newest message rests. Resting\n * the list 1pt in from that edge keeps a drag at the bottom of a conversation scrolling\n * history instead of swiping the modal away.\n */\nexport const useRestAwayFromDismissEdge = ({\n listRef,\n enabled = Platform.OS === 'ios',\n}: {\n listRef: RefObject<FlatList | null>\n enabled?: boolean\n}) => {\n const layoutHeight = useRef(0)\n const contentHeight = useRef(0)\n const didSetInitialOffset = useRef(false)\n\n const canRestAwayFromEdge = useCallback(\n () => layoutHeight.current > 0 && contentHeight.current - layoutHeight.current >= REST_OFFSET,\n []\n )\n\n const restAwayFromDismissEdge = useCallback(() => {\n if (!canRestAwayFromEdge()) return\n listRef.current?.scrollToOffset({ animated: false, offset: REST_OFFSET })\n }, [canRestAwayFromEdge, listRef])\n\n const applyInitialOffsetOnceScrollable = useCallback(() => {\n if (didSetInitialOffset.current || !canRestAwayFromEdge()) return\n didSetInitialOffset.current = true\n restAwayFromDismissEdge()\n }, [canRestAwayFromEdge, restAwayFromDismissEdge])\n\n const handleLayout = useCallback(\n (event: LayoutChangeEvent) => {\n layoutHeight.current = event.nativeEvent.layout.height\n applyInitialOffsetOnceScrollable()\n },\n [applyInitialOffsetOnceScrollable]\n )\n\n const handleContentSizeChange = useCallback(\n (_width: number, height: number) => {\n contentHeight.current = height\n applyInitialOffsetOnceScrollable()\n },\n [applyInitialOffsetOnceScrollable]\n )\n\n // A negative offset means the bounce is still animating; let it settle first.\n const handleScrollSettled = useCallback(\n (event: NativeSyntheticEvent<NativeScrollEvent>) => {\n const offsetY = event.nativeEvent.contentOffset.y\n\n if (offsetY >= 0 && offsetY < REST_OFFSET) {\n restAwayFromDismissEdge()\n }\n },\n [restAwayFromDismissEdge]\n )\n\n if (!enabled) {\n return {\n restOffset: 0,\n onLayout: noop,\n onContentSizeChange: noop,\n onScrollEndDrag: noop,\n onMomentumScrollEnd: noop,\n }\n }\n\n return {\n restOffset: REST_OFFSET,\n onLayout: handleLayout,\n onContentSizeChange: handleContentSizeChange,\n onScrollEndDrag: handleScrollSettled,\n onMomentumScrollEnd: handleScrollSettled,\n }\n}\n"],"mappings":"AAAA,SAASA,IAAI,QAAQ,QAAQ;AAC7B,SAAoBC,WAAW,EAAEC,MAAM,QAAQ,OAAO;AACtD,SAKEC,QAAQ,QACH,cAAc;AAErB,MAAMC,WAAW,GAAG,CAAC;;AAErB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,0BAA0B,GAAGA,CAAC;EACzCC,OAAO;EACPC,OAAO,GAAGJ,QAAQ,CAACK,EAAE,KAAK;AAI5B,CAAC,KAAK;EACJ,MAAMC,YAAY,GAAGP,MAAM,CAAC,CAAC,CAAC;EAC9B,MAAMQ,aAAa,GAAGR,MAAM,CAAC,CAAC,CAAC;EAC/B,MAAMS,mBAAmB,GAAGT,MAAM,CAAC,KAAK,CAAC;EAEzC,MAAMU,mBAAmB,GAAGX,WAAW,CACrC,MAAMQ,YAAY,CAACI,OAAO,GAAG,CAAC,IAAIH,aAAa,CAACG,OAAO,GAAGJ,YAAY,CAACI,OAAO,IAAIT,WAAW,EAC7F,EACF,CAAC;EAED,MAAMU,uBAAuB,GAAGb,WAAW,CAAC,MAAM;IAChD,IAAI,CAACW,mBAAmB,CAAC,CAAC,EAAE;IAC5BN,OAAO,CAACO,OAAO,EAAEE,cAAc,CAAC;MAAEC,QAAQ,EAAE,KAAK;MAAEC,MAAM,EAAEb;IAAY,CAAC,CAAC;EAC3E,CAAC,EAAE,CAACQ,mBAAmB,EAAEN,OAAO,CAAC,CAAC;EAElC,MAAMY,gCAAgC,GAAGjB,WAAW,CAAC,MAAM;IACzD,IAAIU,mBAAmB,CAACE,OAAO,IAAI,CAACD,mBAAmB,CAAC,CAAC,EAAE;IAC3DD,mBAAmB,CAACE,OAAO,GAAG,IAAI;IAClCC,uBAAuB,CAAC,CAAC;EAC3B,CAAC,EAAE,CAACF,mBAAmB,EAAEE,uBAAuB,CAAC,CAAC;EAElD,MAAMK,YAAY,GAAGlB,WAAW,CAC7BmB,KAAwB,IAAK;IAC5BX,YAAY,CAACI,OAAO,GAAGO,KAAK,CAACC,WAAW,CAACC,MAAM,CAACC,MAAM;IACtDL,gCAAgC,CAAC,CAAC;EACpC,CAAC,EACD,CAACA,gCAAgC,CACnC,CAAC;EAED,MAAMM,uBAAuB,GAAGvB,WAAW,CACzC,CAACwB,MAAc,EAAEF,MAAc,KAAK;IAClCb,aAAa,CAACG,OAAO,GAAGU,MAAM;IAC9BL,gCAAgC,CAAC,CAAC;EACpC,CAAC,EACD,CAACA,gCAAgC,CACnC,CAAC;;EAED;EACA,MAAMQ,mBAAmB,GAAGzB,WAAW,CACpCmB,OAA8C,IAAK;IAClD,MAAMO,OAAO,GAAGP,OAAK,CAACC,WAAW,CAACO,aAAa,CAACC,CAAC;IAEjD,IAAIF,OAAO,IAAI,CAAC,IAAIA,OAAO,GAAGvB,WAAW,EAAE;MACzCU,uBAAuB,CAAC,CAAC;IAC3B;EACF,CAAC,EACD,CAACA,uBAAuB,CAC1B,CAAC;EAED,IAAI,CAACP,OAAO,EAAE;IACZ,OAAO;MACLuB,UAAU,EAAE,CAAC;MACbC,QAAQ,EAAE/B,IAAI;MACdgC,mBAAmB,EAAEhC,IAAI;MACzBiC,eAAe,EAAEjC,IAAI;MACrBkC,mBAAmB,EAAElC;IACvB,CAAC;EACH;EAEA,OAAO;IACL8B,UAAU,EAAE1B,WAAW;IACvB2B,QAAQ,EAAEZ,YAAY;IACtBa,mBAAmB,EAAER,uBAAuB;IAC5CS,eAAe,EAAEP,mBAAmB;IACpCQ,mBAAmB,EAAER;EACvB,CAAC;AACH,CAAC","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation_screen.d.ts","sourceRoot":"","sources":["../../src/screens/conversation_screen.tsx"],"names":[],"mappings":"AACA,OAAO,EAAe,gBAAgB,EAAqB,MAAM,4BAA4B,CAAA;AAC7F,OAAO,EAGL,iBAAiB,EAIlB,MAAM,0BAA0B,CAAA;AAoCjC,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAA;AAOjF,MAAM,MAAM,sBAAsB,GAAG;IACnC,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,yBAAyB,CAAA;IACjC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG,iBAAiB,CAAC,sBAAsB,CAAC,CAAA;AAE/E,wBAAgB,kBAAkB,CAAC,EAAE,KAAK,EAAE,EAAE,uBAAuB,2CAkBpE;
|
|
1
|
+
{"version":3,"file":"conversation_screen.d.ts","sourceRoot":"","sources":["../../src/screens/conversation_screen.tsx"],"names":[],"mappings":"AACA,OAAO,EAAe,gBAAgB,EAAqB,MAAM,4BAA4B,CAAA;AAC7F,OAAO,EAGL,iBAAiB,EAIlB,MAAM,0BAA0B,CAAA;AAoCjC,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAA;AAOjF,MAAM,MAAM,sBAAsB,GAAG;IACnC,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,yBAAyB,CAAA;IACjC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG,iBAAiB,CAAC,sBAAsB,CAAC,CAAA;AAE/E,wBAAgB,kBAAkB,CAAC,EAAE,KAAK,EAAE,EAAE,uBAAuB,2CAkBpE;AAyPD,UAAU,4BAA6B,SAAQ,gBAAgB;IAC7D,eAAe,EAAE,MAAM,CAAA;IACvB,KAAK,CAAC,EAAE,yBAAyB,CAAA;IACjC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,eAAO,MAAM,uBAAuB,GAAI,8DAOrC,4BAA4B,4CAqC9B,CAAA"}
|
|
@@ -104,7 +104,7 @@ export function ConversationScreen(t0) {
|
|
|
104
104
|
return t6;
|
|
105
105
|
}
|
|
106
106
|
function ConversationScreenContent(t0) {
|
|
107
|
-
const $ = _c(
|
|
107
|
+
const $ = _c(86);
|
|
108
108
|
const {
|
|
109
109
|
route
|
|
110
110
|
} = t0;
|
|
@@ -253,6 +253,7 @@ function ConversationScreenContent(t0) {
|
|
|
253
253
|
}
|
|
254
254
|
const {
|
|
255
255
|
restOffset,
|
|
256
|
+
onLayout,
|
|
256
257
|
onContentSizeChange,
|
|
257
258
|
onMomentumScrollEnd,
|
|
258
259
|
onScrollEndDrag
|
|
@@ -364,7 +365,7 @@ function ConversationScreenContent(t0) {
|
|
|
364
365
|
return t18;
|
|
365
366
|
}
|
|
366
367
|
let t15;
|
|
367
|
-
if ($[47] !== canDeleteNonAuthoredMessages || $[48] !== conversation || $[49] !== conversation_id || $[50] !== fetchNextPage || $[51] !== hasNextPage || $[52] !== messagesWithSeparators || $[53] !== noMessages || $[54] !== onContentSizeChange || $[55] !==
|
|
368
|
+
if ($[47] !== canDeleteNonAuthoredMessages || $[48] !== conversation || $[49] !== conversation_id || $[50] !== fetchNextPage || $[51] !== hasNextPage || $[52] !== messagesWithSeparators || $[53] !== noMessages || $[54] !== onContentSizeChange || $[55] !== onLayout || $[56] !== onMomentumScrollEnd || $[57] !== onScrollEndDrag || $[58] !== reply_root_id || $[59] !== styles.emptyState || $[60] !== styles.listContainer || $[61] !== styles.listHeader) {
|
|
368
369
|
t15 = noMessages ? /*#__PURE__*/_jsx(View, {
|
|
369
370
|
style: styles.emptyState,
|
|
370
371
|
children: /*#__PURE__*/_jsx(ConversationStartBanner, {
|
|
@@ -378,6 +379,7 @@ function ConversationScreenContent(t0) {
|
|
|
378
379
|
data: messagesWithSeparators,
|
|
379
380
|
keyExtractor: _temp,
|
|
380
381
|
onScroll: trackScroll,
|
|
382
|
+
onLayout: onLayout,
|
|
381
383
|
onContentSizeChange: onContentSizeChange,
|
|
382
384
|
onScrollEndDrag: onScrollEndDrag,
|
|
383
385
|
onMomentumScrollEnd: onMomentumScrollEnd,
|
|
@@ -429,46 +431,47 @@ function ConversationScreenContent(t0) {
|
|
|
429
431
|
$[52] = messagesWithSeparators;
|
|
430
432
|
$[53] = noMessages;
|
|
431
433
|
$[54] = onContentSizeChange;
|
|
432
|
-
$[55] =
|
|
433
|
-
$[56] =
|
|
434
|
-
$[57] =
|
|
435
|
-
$[58] =
|
|
436
|
-
$[59] = styles.
|
|
437
|
-
$[60] = styles.
|
|
438
|
-
$[61] =
|
|
434
|
+
$[55] = onLayout;
|
|
435
|
+
$[56] = onMomentumScrollEnd;
|
|
436
|
+
$[57] = onScrollEndDrag;
|
|
437
|
+
$[58] = reply_root_id;
|
|
438
|
+
$[59] = styles.emptyState;
|
|
439
|
+
$[60] = styles.listContainer;
|
|
440
|
+
$[61] = styles.listHeader;
|
|
441
|
+
$[62] = t15;
|
|
439
442
|
} else {
|
|
440
|
-
t15 = $[
|
|
443
|
+
t15 = $[62];
|
|
441
444
|
}
|
|
442
445
|
let t16;
|
|
443
|
-
if ($[
|
|
446
|
+
if ($[63] !== handleReturnToBottom || $[64] !== showJumpToBottomButton) {
|
|
444
447
|
t16 = /*#__PURE__*/_jsx(JumpToBottomButton, {
|
|
445
448
|
onPress: handleReturnToBottom,
|
|
446
449
|
visible: showJumpToBottomButton
|
|
447
450
|
});
|
|
448
|
-
$[
|
|
449
|
-
$[
|
|
450
|
-
$[
|
|
451
|
+
$[63] = handleReturnToBottom;
|
|
452
|
+
$[64] = showJumpToBottomButton;
|
|
453
|
+
$[65] = t16;
|
|
451
454
|
} else {
|
|
452
|
-
t16 = $[
|
|
455
|
+
t16 = $[65];
|
|
453
456
|
}
|
|
454
457
|
let t17;
|
|
455
|
-
if ($[
|
|
458
|
+
if ($[66] !== noMessages) {
|
|
456
459
|
t17 = !noMessages && /*#__PURE__*/_jsx(TypingIndicator, {});
|
|
457
|
-
$[
|
|
458
|
-
$[
|
|
460
|
+
$[66] = noMessages;
|
|
461
|
+
$[67] = t17;
|
|
459
462
|
} else {
|
|
460
|
-
t17 = $[
|
|
463
|
+
t17 = $[67];
|
|
461
464
|
}
|
|
462
465
|
let t18;
|
|
463
|
-
if ($[
|
|
466
|
+
if ($[68] !== showLeaderDisabledReplyBanner) {
|
|
464
467
|
t18 = showLeaderDisabledReplyBanner && /*#__PURE__*/_jsx(LeaderMessagesDisabledBanner, {});
|
|
465
|
-
$[
|
|
466
|
-
$[
|
|
468
|
+
$[68] = showLeaderDisabledReplyBanner;
|
|
469
|
+
$[69] = t18;
|
|
467
470
|
} else {
|
|
468
|
-
t18 = $[
|
|
471
|
+
t18 = $[69];
|
|
469
472
|
}
|
|
470
473
|
let t19;
|
|
471
|
-
if ($[
|
|
474
|
+
if ($[70] !== canReply || $[71] !== conversation || $[72] !== currentlyEditingMessage || $[73] !== markHandledByMessageForm || $[74] !== replyRootAuthorFirstName || $[75] !== reply_root_id) {
|
|
472
475
|
t19 = /*#__PURE__*/_jsx(ConversationBottomBar, {
|
|
473
476
|
conversation: conversation,
|
|
474
477
|
canReply: canReply,
|
|
@@ -477,41 +480,41 @@ function ConversationScreenContent(t0) {
|
|
|
477
480
|
currentlyEditingMessage: currentlyEditingMessage,
|
|
478
481
|
onFlaggedInMessageForm: markHandledByMessageForm
|
|
479
482
|
});
|
|
480
|
-
$[
|
|
481
|
-
$[
|
|
482
|
-
$[
|
|
483
|
-
$[
|
|
484
|
-
$[
|
|
485
|
-
$[
|
|
486
|
-
$[
|
|
483
|
+
$[70] = canReply;
|
|
484
|
+
$[71] = conversation;
|
|
485
|
+
$[72] = currentlyEditingMessage;
|
|
486
|
+
$[73] = markHandledByMessageForm;
|
|
487
|
+
$[74] = replyRootAuthorFirstName;
|
|
488
|
+
$[75] = reply_root_id;
|
|
489
|
+
$[76] = t19;
|
|
487
490
|
} else {
|
|
488
|
-
t19 = $[
|
|
491
|
+
t19 = $[76];
|
|
489
492
|
}
|
|
490
493
|
let t20;
|
|
491
|
-
if ($[
|
|
494
|
+
if ($[77] !== t15 || $[78] !== t16 || $[79] !== t17 || $[80] !== t18 || $[81] !== t19) {
|
|
492
495
|
t20 = /*#__PURE__*/_jsxs(KeyboardView, {
|
|
493
496
|
children: [t15, t16, t17, t18, t19]
|
|
494
497
|
});
|
|
495
|
-
$[
|
|
496
|
-
$[
|
|
497
|
-
$[
|
|
498
|
-
$[
|
|
499
|
-
$[
|
|
500
|
-
$[
|
|
498
|
+
$[77] = t15;
|
|
499
|
+
$[78] = t16;
|
|
500
|
+
$[79] = t17;
|
|
501
|
+
$[80] = t18;
|
|
502
|
+
$[81] = t19;
|
|
503
|
+
$[82] = t20;
|
|
501
504
|
} else {
|
|
502
|
-
t20 = $[
|
|
505
|
+
t20 = $[82];
|
|
503
506
|
}
|
|
504
507
|
let t21;
|
|
505
|
-
if ($[
|
|
508
|
+
if ($[83] !== styles.container || $[84] !== t20) {
|
|
506
509
|
t21 = /*#__PURE__*/_jsx(View, {
|
|
507
510
|
style: styles.container,
|
|
508
511
|
children: t20
|
|
509
512
|
});
|
|
510
|
-
$[
|
|
511
|
-
$[
|
|
512
|
-
$[
|
|
513
|
+
$[83] = styles.container;
|
|
514
|
+
$[84] = t20;
|
|
515
|
+
$[85] = t21;
|
|
513
516
|
} else {
|
|
514
|
-
t21 = $[
|
|
517
|
+
t21 = $[85];
|
|
515
518
|
}
|
|
516
519
|
return t21;
|
|
517
520
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation_screen.js","names":["date","formatDate","HeaderTitle","PlatformPressable","CommonActions","useNavigation","useTheme","useNavigationTheme","useRoute","React","useCallback","useEffect","useRef","useState","FlatList","Platform","StyleSheet","useWindowDimensions","View","useSafeAreaInsets","Badge","Icon","Text","ConversationStartBanner","JumpToBottomButton","Message","MessageForm","ConversationDisabledBanner","LeaderMessagesDisabledBanner","MemberMessagesDisabledBanner","ReplyShadowMessage","SystemMessage","TypingIndicator","KeyboardView","useHeaderSlotReserve","BlankState","ConversationContextProvider","useMessageAvailableMembersAction","useConversation","useConversationJoltEvents","useConversationMessages","useConversationMessagesJoltEvents","useMarkLatestMessageRead","analyticsEvents","normalizeAnalyticsMetadata","usePublishProductAnalyticsEvent","useRestAwayFromDismissEdge","useVideoModerationJoltEvents","getRelativeDateStatus","groupMessages","CONVERSATION_MESSAGE_LIST_PADDING_HORIZONTAL","isSystemMessage","jsx","_jsx","jsxs","_jsxs","ConversationScreen","t0","$","_c","route","conversation_id","reply_root_id","params","t1","data","conversation","t2","t3","conversation_show_opened","t4","t5","ConversationScreenContent","t6","currentPageReplyRootId","children","styles","useStyles","navigation","editing_message_id","reply_root_author_name","messages","fetchNextPage","hasNextPage","conversationId","markHandledByMessageForm","useEnsureConversationsRouteExists","ms","inReplyScreen","messagesWithSeparators","noMessages","length","repliesDisabled","memberAbility","badges","title","canReply","showLeaderDisabledReplyBanner","canDeleteNonAuthoredMessages","t7","t8","m","String","id","find","currentlyEditingMessage","split","replyRootAuthorFirstName","replyHeaderTitle","muted","conversationMembership","listRef","showJumpToBottomButton","setShowJumpToBottomButton","t9","Symbol","for","event","offsetY","nativeEvent","contentOffset","y","trackScroll","t10","enabled","OS","restOffset","onContentSizeChange","onMomentumScrollEnd","onScrollEndDrag","t11","current","scrollToOffset","offset","handleReturnToBottom","t12","deleted","setParams","badge","t13","t14","t15","Imagery","name","t16","Content","Heading","t17","goBack","Root","Button","onPress","accessibilityHint","accessibilityRole","t18","container","style","emptyState","listContainer","listHeader","hasMessages","inverted","contentContainerStyle","keyExtractor","_temp","scrollEventThrottle","ListFooterComponent","renderItem","item","item_0","type","InlineDateSeparator","latestReadMessageSortKey","onEndReached","ListHeaderComponent","t19","ConversationBottomBar","t20","t21","replyRootId","onFlaggedInMessageForm","messageLink","disabled","disabledMessage","message","AttachmentPicker","Commands","TextInput","SubmitButton","useDateSeparatorStyles","isThisYear","showYear","year","dateStamp","separator","dateText","variant","theme","colors","borderColorDefaultBase","create","alignItems","flexDirection","paddingHorizontal","paddingVertical","flex","height","borderTopWidth","borderTopColor","ConversationScreenTitle","usePressableHeaderStyle","resourceType","pcoResourceType","productName","appName","text","undefined","navigate","maxFontSizeMultiplier","titleTextContainer","size","titleWrapper","testID","width","slotReserve","headerContainerStyle","maxWidth","select","android","default","columnGap","flexShrink","minWidth","alignSelf","marginTop","navigationTheme","bottom","card","justifyContent","backgroundColor","paddingBottom","chat_group_graph_id","navigationState","getState","routes","conversationsRoute","_temp2","dispatch","state","reset","index","r"],"sources":["../../src/screens/conversation_screen.tsx"],"sourcesContent":["import { date as formatDate } from '@planningcenter/datetime-fmt'\nimport { HeaderTitle, HeaderTitleProps, PlatformPressable } from '@react-navigation/elements'\nimport {\n CommonActions,\n RouteProp,\n StaticScreenProps,\n useNavigation,\n useTheme as useNavigationTheme,\n useRoute,\n} from '@react-navigation/native'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\nimport { FlatList, Platform, StyleSheet, useWindowDimensions, View } from 'react-native'\nimport { useSafeAreaInsets } from 'react-native-safe-area-context'\nimport { Badge, Icon, Text } from '../components'\nimport { ConversationStartBanner } from '../components/conversation/conversation_start_banner'\nimport { JumpToBottomButton } from '../components/conversation/jump_to_bottom_button'\nimport { Message } from '../components/conversation/message'\nimport { MessageForm } from '../components/conversation/message_form'\nimport {\n ConversationDisabledBanner,\n LeaderMessagesDisabledBanner,\n MemberMessagesDisabledBanner,\n} from '../components/conversation/messages_disabled_banners'\nimport { ReplyShadowMessage } from '../components/conversation/reply_shadow_message'\nimport { SystemMessage } from '../components/conversation/system_message'\nimport { TypingIndicator } from '../components/conversation/typing_indicator'\nimport { KeyboardView } from '../components/display/keyboard_view'\nimport { useHeaderSlotReserve } from '../components/display/platform_modal_header_buttons'\nimport BlankState from '../components/primitive/blank_state_primitive'\nimport { ConversationContextProvider } from '../contexts/conversation_context'\nimport { useTheme } from '../hooks'\nimport { useMessageAvailableMembersAction } from '../hooks/direct_messages/use_message_available_members_action'\nimport { useConversation } from '../hooks/use_conversation'\nimport { useConversationJoltEvents } from '../hooks/use_conversation_jolt_events'\nimport { useConversationMessages } from '../hooks/use_conversation_messages'\nimport { useConversationMessagesJoltEvents } from '../hooks/use_conversation_messages_jolt_events'\nimport { useMarkLatestMessageRead } from '../hooks/use_mark_latest_message_read'\nimport {\n analyticsEvents,\n normalizeAnalyticsMetadata,\n usePublishProductAnalyticsEvent,\n} from '../hooks/use_product_analytics'\nimport { useRestAwayFromDismissEdge } from '../hooks/use_rest_away_from_dismiss_edge'\nimport { useVideoModerationJoltEvents } from '../hooks/use_video_moderation_jolt_events'\nimport { ConversationResource } from '../types/resources/conversation'\nimport { ConversationBadgeResource } from '../types/resources/conversation_badge'\nimport { MessageResource } from '../types/resources/message'\nimport { getRelativeDateStatus } from '../utils/date'\nimport { groupMessages, type DateSeparator } from '../utils/group_messages'\nimport { CONVERSATION_MESSAGE_LIST_PADDING_HORIZONTAL } from '../utils/styles'\nimport { isSystemMessage } from '../utils/system_messages'\n\nexport type ConversationRouteProps = {\n conversation_id: number\n reply_root_id?: string | null\n reply_root_author_name?: string\n chat_group_graph_id?: string\n clear_input?: boolean\n editing_message_id?: number | null\n title?: string\n subtitle?: string\n badge?: ConversationBadgeResource\n deleted?: boolean\n muted?: boolean\n}\n\nexport type ConversationScreenProps = StaticScreenProps<ConversationRouteProps>\n\nexport function ConversationScreen({ route }: ConversationScreenProps) {\n const { conversation_id, reply_root_id } = route.params\n\n const { data: conversation } = useConversation({ conversation_id })\n\n usePublishProductAnalyticsEvent(analyticsEvents.conversation_show_opened, {\n reply_root_id,\n ...normalizeAnalyticsMetadata(conversation),\n })\n\n return (\n <ConversationContextProvider\n conversationId={conversation_id}\n currentPageReplyRootId={reply_root_id ?? null}\n >\n <ConversationScreenContent route={route} />\n </ConversationContextProvider>\n )\n}\n\nfunction ConversationScreenContent({ route }: ConversationScreenProps) {\n const styles = useStyles()\n const navigation = useNavigation()\n const { conversation_id, editing_message_id, reply_root_id, reply_root_author_name } =\n route.params\n const { data: conversation } = useConversation(route.params)\n const { messages, fetchNextPage, hasNextPage } = useConversationMessages({\n conversation_id,\n reply_root_id,\n })\n useConversationJoltEvents({ conversationId: conversation_id })\n useConversationMessagesJoltEvents({ conversationId: conversation_id })\n const { markHandledByMessageForm } = useVideoModerationJoltEvents()\n useEnsureConversationsRouteExists()\n useMarkLatestMessageRead({ conversation, messages })\n const messagesWithSeparators = groupMessages({\n ms: messages,\n inReplyScreen: !!reply_root_id,\n })\n const noMessages = messagesWithSeparators.length === 0\n\n const { repliesDisabled, memberAbility, badges, title } = conversation\n const canReply = memberAbility?.canReply\n const showLeaderDisabledReplyBanner = canReply && repliesDisabled\n const canDeleteNonAuthoredMessages = memberAbility?.canDeleteNonAuthoredMessages ?? false\n const currentlyEditingMessage = messages.find(m => String(m.id) === String(editing_message_id))\n const replyRootAuthorFirstName = reply_root_author_name?.split(' ')[0]\n const replyHeaderTitle = replyRootAuthorFirstName\n ? `Reply to ${replyRootAuthorFirstName}`\n : 'Reply'\n // Prefer the membership for optimistic updates.\n const muted = conversation.conversationMembership?.muted ?? conversation.muted\n\n const listRef = useRef<FlatList>(null)\n const [showJumpToBottomButton, setShowJumpToBottomButton] = useState(false)\n\n const trackScroll = (event: any) => {\n const offsetY = event.nativeEvent.contentOffset.y\n setShowJumpToBottomButton(offsetY > 200)\n }\n\n const { restOffset, onContentSizeChange, onMomentumScrollEnd, onScrollEndDrag } =\n useRestAwayFromDismissEdge({\n listRef,\n enabled: Platform.OS === 'ios',\n })\n\n const handleReturnToBottom = useCallback(() => {\n listRef.current?.scrollToOffset({\n offset: restOffset,\n })\n }, [restOffset])\n\n useEffect(() => {\n if (reply_root_id) {\n navigation.setParams({\n title: replyHeaderTitle,\n })\n } else {\n navigation.setParams({\n title: title,\n badge: badges?.[0],\n deleted: conversation?.deleted,\n muted,\n })\n }\n }, [navigation, title, badges, conversation?.deleted, reply_root_id, replyHeaderTitle, muted])\n\n if (!conversation || conversation.deleted) {\n return (\n <View style={styles.container}>\n <BlankState.Root>\n <BlankState.Imagery name=\"general.outlinedTextMessage\" />\n <BlankState.Content>\n <BlankState.Heading>This conversation has been deleted</BlankState.Heading>\n </BlankState.Content>\n <BlankState.Button\n onPress={navigation.goBack}\n title=\"Back to conversations\"\n accessibilityHint=\"Navigates back to the conversations list\"\n accessibilityRole=\"link\"\n />\n </BlankState.Root>\n </View>\n )\n }\n\n return (\n <View style={styles.container}>\n <KeyboardView>\n {noMessages ? (\n <View style={styles.emptyState}>\n <ConversationStartBanner conversation={conversation} hasMessages={false} />\n </View>\n ) : (\n <FlatList\n inverted\n ref={listRef}\n contentContainerStyle={styles.listContainer}\n data={messagesWithSeparators}\n keyExtractor={item => item.id}\n onScroll={trackScroll}\n onContentSizeChange={onContentSizeChange}\n onScrollEndDrag={onScrollEndDrag}\n onMomentumScrollEnd={onMomentumScrollEnd}\n scrollEventThrottle={10}\n ListFooterComponent={\n hasNextPage ? null : (\n <ConversationStartBanner conversation={conversation} hasMessages={true} />\n )\n }\n renderItem={({ item }) => {\n if (item.type === 'DateSeparator') {\n return <InlineDateSeparator {...item} />\n }\n\n if (item.type === 'ReplyShadowMessage') {\n return (\n <ReplyShadowMessage\n {...(item as any)}\n conversation_id={conversation_id}\n inReplyScreen={!!reply_root_id}\n />\n )\n }\n\n if (isSystemMessage(item)) {\n return <SystemMessage message={item} conversationId={conversation_id} />\n }\n\n return (\n <Message\n {...item}\n canDeleteNonAuthoredMessages={canDeleteNonAuthoredMessages}\n conversation_id={conversation_id}\n latestReadMessageSortKey={conversation?.latestReadMessageSortKey}\n inReplyScreen={!!reply_root_id}\n />\n )\n }}\n onEndReached={() => fetchNextPage()}\n ListHeaderComponent={<View style={styles.listHeader} />}\n />\n )}\n <JumpToBottomButton onPress={handleReturnToBottom} visible={showJumpToBottomButton} />\n {!noMessages && <TypingIndicator />}\n {showLeaderDisabledReplyBanner && <LeaderMessagesDisabledBanner />}\n <ConversationBottomBar\n conversation={conversation}\n canReply={canReply}\n replyRootAuthorFirstName={replyRootAuthorFirstName}\n replyRootId={reply_root_id}\n currentlyEditingMessage={currentlyEditingMessage}\n onFlaggedInMessageForm={markHandledByMessageForm}\n />\n </KeyboardView>\n </View>\n )\n}\n\ninterface ConversationBottomBarProps {\n conversation: ConversationResource\n canReply: boolean | undefined\n replyRootAuthorFirstName: string | undefined\n replyRootId: string | null | undefined\n currentlyEditingMessage: MessageResource | undefined\n onFlaggedInMessageForm?: (id: string) => void\n}\n\nfunction ConversationBottomBar({\n conversation,\n canReply,\n replyRootAuthorFirstName,\n replyRootId,\n currentlyEditingMessage,\n onFlaggedInMessageForm,\n}: ConversationBottomBarProps) {\n const messageLink = useMessageAvailableMembersAction(conversation)\n\n if (conversation.disabled)\n return (\n <ConversationDisabledBanner\n message={conversation.disabledMessage ?? null}\n messageLink={messageLink}\n />\n )\n if (!canReply) return <MemberMessagesDisabledBanner />\n return (\n <MessageForm.Root\n replyRootAuthorFirstName={replyRootAuthorFirstName}\n conversation={conversation}\n replyRootId={replyRootId}\n currentlyEditingMessage={currentlyEditingMessage}\n onFlaggedInMessageForm={onFlaggedInMessageForm}\n key={\n currentlyEditingMessage\n ? `edit-message-form-${currentlyEditingMessage.id}`\n : 'new-message-form'\n }\n >\n <MessageForm.AttachmentPicker />\n <MessageForm.Commands />\n <MessageForm.TextInput />\n <MessageForm.SubmitButton />\n </MessageForm.Root>\n )\n}\n\nfunction InlineDateSeparator({ date }: DateSeparator) {\n const styles = useDateSeparatorStyles()\n const { isThisYear } = getRelativeDateStatus(date)\n const showYear = !isThisYear\n const dateStamp = formatDate(date, { style: 'long', year: showYear })\n\n return (\n <View style={styles.container}>\n <View style={styles.separator} />\n <Text variant=\"footnote\" style={styles.dateText}>\n {dateStamp}\n </Text>\n <View style={styles.separator} />\n </View>\n )\n}\n\nconst useDateSeparatorStyles = () => {\n const theme = useTheme()\n return StyleSheet.create({\n container: {\n alignItems: 'center',\n flexDirection: 'row',\n paddingHorizontal: CONVERSATION_MESSAGE_LIST_PADDING_HORIZONTAL,\n paddingVertical: 16,\n },\n separator: {\n flex: 1,\n height: 1,\n borderTopWidth: 1,\n borderTopColor: theme.colors.borderColorDefaultBase,\n },\n dateText: {\n paddingHorizontal: 8,\n },\n })\n}\n\ninterface ConversationScreenTitleProps extends HeaderTitleProps {\n conversation_id: number\n badge?: ConversationBadgeResource\n deleted?: boolean\n muted?: boolean\n}\n\nexport const ConversationScreenTitle = ({\n conversation_id,\n badge,\n children,\n style,\n deleted,\n muted,\n}: ConversationScreenTitleProps) => {\n const styles = usePressableHeaderStyle()\n const navigation = useNavigation()\n const resourceType = badge?.pcoResourceType || ''\n const productName = badge?.appName\n const name = badge?.text || undefined\n\n return (\n <PlatformPressable\n testID=\"conversation-details-button\"\n accessibilityHint=\"Opens details about members and settings\"\n style={styles.container}\n onPress={() => {\n if (deleted) return\n\n navigation.navigate('ConversationDetails', { conversation_id })\n }}\n >\n <View style={styles.titleWrapper}>\n <View style={styles.titleTextContainer}>\n <HeaderTitle maxFontSizeMultiplier={1} style={style}>\n {children}\n </HeaderTitle>\n </View>\n {muted && <Icon name=\"general.bellMuted\" size={12} />}\n {!deleted && <Icon name=\"general.downChevron\" size={12} />}\n </View>\n <Badge\n variant=\"metaSubtle\"\n productLogoName={productName}\n label={resourceType}\n metaLabel={name}\n style={styles.badge}\n maxFontSizeMultiplier={1}\n />\n </PlatformPressable>\n )\n}\n\nconst usePressableHeaderStyle = () => {\n const { width } = useWindowDimensions()\n const slotReserve = useHeaderSlotReserve()\n const headerContainerStyle = { maxWidth: width - slotReserve * 2 }\n\n return StyleSheet.create({\n container: {\n alignItems: Platform.select({ android: 'flex-start', default: 'center' }),\n flex: 1,\n ...headerContainerStyle,\n },\n titleWrapper: {\n alignItems: 'center',\n columnGap: 4,\n flexDirection: 'row',\n flexShrink: 1,\n },\n titleTextContainer: {\n flexShrink: 1,\n minWidth: 0,\n },\n badge: {\n alignSelf: Platform.select({ android: 'flex-start', default: 'center' }),\n marginTop: 2,\n },\n })\n}\n\nconst useStyles = () => {\n const navigationTheme = useNavigationTheme()\n const { bottom } = useSafeAreaInsets()\n\n return StyleSheet.create({\n container: {\n flex: 1,\n justifyContent: 'center',\n backgroundColor: navigationTheme.colors.card,\n paddingBottom: bottom,\n },\n emptyState: {\n flex: 1,\n justifyContent: 'center',\n },\n listContainer: {\n paddingVertical: 12,\n },\n listHeader: {\n // Just whitespace to provide space where the typing indicator can be\n height: 16,\n },\n })\n}\n\n/**\n * useEnsureConversationsRouteExists\n */\nconst useEnsureConversationsRouteExists = () => {\n const navigation = useNavigation()\n const { params } = useRoute<RouteProp<ConversationScreenProps['route']>>()\n\n useEffect(() => {\n const navigationState = navigation.getState()\n const routes = navigationState?.routes || []\n const conversationsRoute = routes.find(r => r.name === 'Conversations')\n\n if (conversationsRoute) return\n\n navigation.dispatch(state => {\n return CommonActions.reset({\n ...state,\n routes: [\n { name: 'Conversations', params: { chat_group_graph_id: params?.chat_group_graph_id } },\n ...routes,\n ],\n index: state.index + 1,\n })\n })\n }, [navigation, params?.chat_group_graph_id])\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"conversation_screen.js","names":["date","formatDate","HeaderTitle","PlatformPressable","CommonActions","useNavigation","useTheme","useNavigationTheme","useRoute","React","useCallback","useEffect","useRef","useState","FlatList","Platform","StyleSheet","useWindowDimensions","View","useSafeAreaInsets","Badge","Icon","Text","ConversationStartBanner","JumpToBottomButton","Message","MessageForm","ConversationDisabledBanner","LeaderMessagesDisabledBanner","MemberMessagesDisabledBanner","ReplyShadowMessage","SystemMessage","TypingIndicator","KeyboardView","useHeaderSlotReserve","BlankState","ConversationContextProvider","useMessageAvailableMembersAction","useConversation","useConversationJoltEvents","useConversationMessages","useConversationMessagesJoltEvents","useMarkLatestMessageRead","analyticsEvents","normalizeAnalyticsMetadata","usePublishProductAnalyticsEvent","useRestAwayFromDismissEdge","useVideoModerationJoltEvents","getRelativeDateStatus","groupMessages","CONVERSATION_MESSAGE_LIST_PADDING_HORIZONTAL","isSystemMessage","jsx","_jsx","jsxs","_jsxs","ConversationScreen","t0","$","_c","route","conversation_id","reply_root_id","params","t1","data","conversation","t2","t3","conversation_show_opened","t4","t5","ConversationScreenContent","t6","currentPageReplyRootId","children","styles","useStyles","navigation","editing_message_id","reply_root_author_name","messages","fetchNextPage","hasNextPage","conversationId","markHandledByMessageForm","useEnsureConversationsRouteExists","ms","inReplyScreen","messagesWithSeparators","noMessages","length","repliesDisabled","memberAbility","badges","title","canReply","showLeaderDisabledReplyBanner","canDeleteNonAuthoredMessages","t7","t8","m","String","id","find","currentlyEditingMessage","split","replyRootAuthorFirstName","replyHeaderTitle","muted","conversationMembership","listRef","showJumpToBottomButton","setShowJumpToBottomButton","t9","Symbol","for","event","offsetY","nativeEvent","contentOffset","y","trackScroll","t10","enabled","OS","restOffset","onLayout","onContentSizeChange","onMomentumScrollEnd","onScrollEndDrag","t11","current","scrollToOffset","offset","handleReturnToBottom","t12","deleted","setParams","badge","t13","t14","t15","Imagery","name","t16","Content","Heading","t17","goBack","Root","Button","onPress","accessibilityHint","accessibilityRole","t18","container","style","emptyState","listContainer","listHeader","hasMessages","inverted","contentContainerStyle","keyExtractor","_temp","scrollEventThrottle","ListFooterComponent","renderItem","item","item_0","type","InlineDateSeparator","latestReadMessageSortKey","onEndReached","ListHeaderComponent","t19","ConversationBottomBar","t20","t21","replyRootId","onFlaggedInMessageForm","messageLink","disabled","disabledMessage","message","AttachmentPicker","Commands","TextInput","SubmitButton","useDateSeparatorStyles","isThisYear","showYear","year","dateStamp","separator","dateText","variant","theme","colors","borderColorDefaultBase","create","alignItems","flexDirection","paddingHorizontal","paddingVertical","flex","height","borderTopWidth","borderTopColor","ConversationScreenTitle","usePressableHeaderStyle","resourceType","pcoResourceType","productName","appName","text","undefined","navigate","maxFontSizeMultiplier","titleTextContainer","size","titleWrapper","testID","width","slotReserve","headerContainerStyle","maxWidth","select","android","default","columnGap","flexShrink","minWidth","alignSelf","marginTop","navigationTheme","bottom","card","justifyContent","backgroundColor","paddingBottom","chat_group_graph_id","navigationState","getState","routes","conversationsRoute","_temp2","dispatch","state","reset","index","r"],"sources":["../../src/screens/conversation_screen.tsx"],"sourcesContent":["import { date as formatDate } from '@planningcenter/datetime-fmt'\nimport { HeaderTitle, HeaderTitleProps, PlatformPressable } from '@react-navigation/elements'\nimport {\n CommonActions,\n RouteProp,\n StaticScreenProps,\n useNavigation,\n useTheme as useNavigationTheme,\n useRoute,\n} from '@react-navigation/native'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\nimport { FlatList, Platform, StyleSheet, useWindowDimensions, View } from 'react-native'\nimport { useSafeAreaInsets } from 'react-native-safe-area-context'\nimport { Badge, Icon, Text } from '../components'\nimport { ConversationStartBanner } from '../components/conversation/conversation_start_banner'\nimport { JumpToBottomButton } from '../components/conversation/jump_to_bottom_button'\nimport { Message } from '../components/conversation/message'\nimport { MessageForm } from '../components/conversation/message_form'\nimport {\n ConversationDisabledBanner,\n LeaderMessagesDisabledBanner,\n MemberMessagesDisabledBanner,\n} from '../components/conversation/messages_disabled_banners'\nimport { ReplyShadowMessage } from '../components/conversation/reply_shadow_message'\nimport { SystemMessage } from '../components/conversation/system_message'\nimport { TypingIndicator } from '../components/conversation/typing_indicator'\nimport { KeyboardView } from '../components/display/keyboard_view'\nimport { useHeaderSlotReserve } from '../components/display/platform_modal_header_buttons'\nimport BlankState from '../components/primitive/blank_state_primitive'\nimport { ConversationContextProvider } from '../contexts/conversation_context'\nimport { useTheme } from '../hooks'\nimport { useMessageAvailableMembersAction } from '../hooks/direct_messages/use_message_available_members_action'\nimport { useConversation } from '../hooks/use_conversation'\nimport { useConversationJoltEvents } from '../hooks/use_conversation_jolt_events'\nimport { useConversationMessages } from '../hooks/use_conversation_messages'\nimport { useConversationMessagesJoltEvents } from '../hooks/use_conversation_messages_jolt_events'\nimport { useMarkLatestMessageRead } from '../hooks/use_mark_latest_message_read'\nimport {\n analyticsEvents,\n normalizeAnalyticsMetadata,\n usePublishProductAnalyticsEvent,\n} from '../hooks/use_product_analytics'\nimport { useRestAwayFromDismissEdge } from '../hooks/use_rest_away_from_dismiss_edge'\nimport { useVideoModerationJoltEvents } from '../hooks/use_video_moderation_jolt_events'\nimport { ConversationResource } from '../types/resources/conversation'\nimport { ConversationBadgeResource } from '../types/resources/conversation_badge'\nimport { MessageResource } from '../types/resources/message'\nimport { getRelativeDateStatus } from '../utils/date'\nimport { groupMessages, type DateSeparator } from '../utils/group_messages'\nimport { CONVERSATION_MESSAGE_LIST_PADDING_HORIZONTAL } from '../utils/styles'\nimport { isSystemMessage } from '../utils/system_messages'\n\nexport type ConversationRouteProps = {\n conversation_id: number\n reply_root_id?: string | null\n reply_root_author_name?: string\n chat_group_graph_id?: string\n clear_input?: boolean\n editing_message_id?: number | null\n title?: string\n subtitle?: string\n badge?: ConversationBadgeResource\n deleted?: boolean\n muted?: boolean\n}\n\nexport type ConversationScreenProps = StaticScreenProps<ConversationRouteProps>\n\nexport function ConversationScreen({ route }: ConversationScreenProps) {\n const { conversation_id, reply_root_id } = route.params\n\n const { data: conversation } = useConversation({ conversation_id })\n\n usePublishProductAnalyticsEvent(analyticsEvents.conversation_show_opened, {\n reply_root_id,\n ...normalizeAnalyticsMetadata(conversation),\n })\n\n return (\n <ConversationContextProvider\n conversationId={conversation_id}\n currentPageReplyRootId={reply_root_id ?? null}\n >\n <ConversationScreenContent route={route} />\n </ConversationContextProvider>\n )\n}\n\nfunction ConversationScreenContent({ route }: ConversationScreenProps) {\n const styles = useStyles()\n const navigation = useNavigation()\n const { conversation_id, editing_message_id, reply_root_id, reply_root_author_name } =\n route.params\n const { data: conversation } = useConversation(route.params)\n const { messages, fetchNextPage, hasNextPage } = useConversationMessages({\n conversation_id,\n reply_root_id,\n })\n useConversationJoltEvents({ conversationId: conversation_id })\n useConversationMessagesJoltEvents({ conversationId: conversation_id })\n const { markHandledByMessageForm } = useVideoModerationJoltEvents()\n useEnsureConversationsRouteExists()\n useMarkLatestMessageRead({ conversation, messages })\n const messagesWithSeparators = groupMessages({\n ms: messages,\n inReplyScreen: !!reply_root_id,\n })\n const noMessages = messagesWithSeparators.length === 0\n\n const { repliesDisabled, memberAbility, badges, title } = conversation\n const canReply = memberAbility?.canReply\n const showLeaderDisabledReplyBanner = canReply && repliesDisabled\n const canDeleteNonAuthoredMessages = memberAbility?.canDeleteNonAuthoredMessages ?? false\n const currentlyEditingMessage = messages.find(m => String(m.id) === String(editing_message_id))\n const replyRootAuthorFirstName = reply_root_author_name?.split(' ')[0]\n const replyHeaderTitle = replyRootAuthorFirstName\n ? `Reply to ${replyRootAuthorFirstName}`\n : 'Reply'\n // Prefer the membership for optimistic updates.\n const muted = conversation.conversationMembership?.muted ?? conversation.muted\n\n const listRef = useRef<FlatList>(null)\n const [showJumpToBottomButton, setShowJumpToBottomButton] = useState(false)\n\n const trackScroll = (event: any) => {\n const offsetY = event.nativeEvent.contentOffset.y\n setShowJumpToBottomButton(offsetY > 200)\n }\n\n const { restOffset, onLayout, onContentSizeChange, onMomentumScrollEnd, onScrollEndDrag } =\n useRestAwayFromDismissEdge({\n listRef,\n enabled: Platform.OS === 'ios',\n })\n\n const handleReturnToBottom = useCallback(() => {\n listRef.current?.scrollToOffset({\n offset: restOffset,\n })\n }, [restOffset])\n\n useEffect(() => {\n if (reply_root_id) {\n navigation.setParams({\n title: replyHeaderTitle,\n })\n } else {\n navigation.setParams({\n title: title,\n badge: badges?.[0],\n deleted: conversation?.deleted,\n muted,\n })\n }\n }, [navigation, title, badges, conversation?.deleted, reply_root_id, replyHeaderTitle, muted])\n\n if (!conversation || conversation.deleted) {\n return (\n <View style={styles.container}>\n <BlankState.Root>\n <BlankState.Imagery name=\"general.outlinedTextMessage\" />\n <BlankState.Content>\n <BlankState.Heading>This conversation has been deleted</BlankState.Heading>\n </BlankState.Content>\n <BlankState.Button\n onPress={navigation.goBack}\n title=\"Back to conversations\"\n accessibilityHint=\"Navigates back to the conversations list\"\n accessibilityRole=\"link\"\n />\n </BlankState.Root>\n </View>\n )\n }\n\n return (\n <View style={styles.container}>\n <KeyboardView>\n {noMessages ? (\n <View style={styles.emptyState}>\n <ConversationStartBanner conversation={conversation} hasMessages={false} />\n </View>\n ) : (\n <FlatList\n inverted\n ref={listRef}\n contentContainerStyle={styles.listContainer}\n data={messagesWithSeparators}\n keyExtractor={item => item.id}\n onScroll={trackScroll}\n onLayout={onLayout}\n onContentSizeChange={onContentSizeChange}\n onScrollEndDrag={onScrollEndDrag}\n onMomentumScrollEnd={onMomentumScrollEnd}\n scrollEventThrottle={10}\n ListFooterComponent={\n hasNextPage ? null : (\n <ConversationStartBanner conversation={conversation} hasMessages={true} />\n )\n }\n renderItem={({ item }) => {\n if (item.type === 'DateSeparator') {\n return <InlineDateSeparator {...item} />\n }\n\n if (item.type === 'ReplyShadowMessage') {\n return (\n <ReplyShadowMessage\n {...(item as any)}\n conversation_id={conversation_id}\n inReplyScreen={!!reply_root_id}\n />\n )\n }\n\n if (isSystemMessage(item)) {\n return <SystemMessage message={item} conversationId={conversation_id} />\n }\n\n return (\n <Message\n {...item}\n canDeleteNonAuthoredMessages={canDeleteNonAuthoredMessages}\n conversation_id={conversation_id}\n latestReadMessageSortKey={conversation?.latestReadMessageSortKey}\n inReplyScreen={!!reply_root_id}\n />\n )\n }}\n onEndReached={() => fetchNextPage()}\n ListHeaderComponent={<View style={styles.listHeader} />}\n />\n )}\n <JumpToBottomButton onPress={handleReturnToBottom} visible={showJumpToBottomButton} />\n {!noMessages && <TypingIndicator />}\n {showLeaderDisabledReplyBanner && <LeaderMessagesDisabledBanner />}\n <ConversationBottomBar\n conversation={conversation}\n canReply={canReply}\n replyRootAuthorFirstName={replyRootAuthorFirstName}\n replyRootId={reply_root_id}\n currentlyEditingMessage={currentlyEditingMessage}\n onFlaggedInMessageForm={markHandledByMessageForm}\n />\n </KeyboardView>\n </View>\n )\n}\n\ninterface ConversationBottomBarProps {\n conversation: ConversationResource\n canReply: boolean | undefined\n replyRootAuthorFirstName: string | undefined\n replyRootId: string | null | undefined\n currentlyEditingMessage: MessageResource | undefined\n onFlaggedInMessageForm?: (id: string) => void\n}\n\nfunction ConversationBottomBar({\n conversation,\n canReply,\n replyRootAuthorFirstName,\n replyRootId,\n currentlyEditingMessage,\n onFlaggedInMessageForm,\n}: ConversationBottomBarProps) {\n const messageLink = useMessageAvailableMembersAction(conversation)\n\n if (conversation.disabled)\n return (\n <ConversationDisabledBanner\n message={conversation.disabledMessage ?? null}\n messageLink={messageLink}\n />\n )\n if (!canReply) return <MemberMessagesDisabledBanner />\n return (\n <MessageForm.Root\n replyRootAuthorFirstName={replyRootAuthorFirstName}\n conversation={conversation}\n replyRootId={replyRootId}\n currentlyEditingMessage={currentlyEditingMessage}\n onFlaggedInMessageForm={onFlaggedInMessageForm}\n key={\n currentlyEditingMessage\n ? `edit-message-form-${currentlyEditingMessage.id}`\n : 'new-message-form'\n }\n >\n <MessageForm.AttachmentPicker />\n <MessageForm.Commands />\n <MessageForm.TextInput />\n <MessageForm.SubmitButton />\n </MessageForm.Root>\n )\n}\n\nfunction InlineDateSeparator({ date }: DateSeparator) {\n const styles = useDateSeparatorStyles()\n const { isThisYear } = getRelativeDateStatus(date)\n const showYear = !isThisYear\n const dateStamp = formatDate(date, { style: 'long', year: showYear })\n\n return (\n <View style={styles.container}>\n <View style={styles.separator} />\n <Text variant=\"footnote\" style={styles.dateText}>\n {dateStamp}\n </Text>\n <View style={styles.separator} />\n </View>\n )\n}\n\nconst useDateSeparatorStyles = () => {\n const theme = useTheme()\n return StyleSheet.create({\n container: {\n alignItems: 'center',\n flexDirection: 'row',\n paddingHorizontal: CONVERSATION_MESSAGE_LIST_PADDING_HORIZONTAL,\n paddingVertical: 16,\n },\n separator: {\n flex: 1,\n height: 1,\n borderTopWidth: 1,\n borderTopColor: theme.colors.borderColorDefaultBase,\n },\n dateText: {\n paddingHorizontal: 8,\n },\n })\n}\n\ninterface ConversationScreenTitleProps extends HeaderTitleProps {\n conversation_id: number\n badge?: ConversationBadgeResource\n deleted?: boolean\n muted?: boolean\n}\n\nexport const ConversationScreenTitle = ({\n conversation_id,\n badge,\n children,\n style,\n deleted,\n muted,\n}: ConversationScreenTitleProps) => {\n const styles = usePressableHeaderStyle()\n const navigation = useNavigation()\n const resourceType = badge?.pcoResourceType || ''\n const productName = badge?.appName\n const name = badge?.text || undefined\n\n return (\n <PlatformPressable\n testID=\"conversation-details-button\"\n accessibilityHint=\"Opens details about members and settings\"\n style={styles.container}\n onPress={() => {\n if (deleted) return\n\n navigation.navigate('ConversationDetails', { conversation_id })\n }}\n >\n <View style={styles.titleWrapper}>\n <View style={styles.titleTextContainer}>\n <HeaderTitle maxFontSizeMultiplier={1} style={style}>\n {children}\n </HeaderTitle>\n </View>\n {muted && <Icon name=\"general.bellMuted\" size={12} />}\n {!deleted && <Icon name=\"general.downChevron\" size={12} />}\n </View>\n <Badge\n variant=\"metaSubtle\"\n productLogoName={productName}\n label={resourceType}\n metaLabel={name}\n style={styles.badge}\n maxFontSizeMultiplier={1}\n />\n </PlatformPressable>\n )\n}\n\nconst usePressableHeaderStyle = () => {\n const { width } = useWindowDimensions()\n const slotReserve = useHeaderSlotReserve()\n const headerContainerStyle = { maxWidth: width - slotReserve * 2 }\n\n return StyleSheet.create({\n container: {\n alignItems: Platform.select({ android: 'flex-start', default: 'center' }),\n flex: 1,\n ...headerContainerStyle,\n },\n titleWrapper: {\n alignItems: 'center',\n columnGap: 4,\n flexDirection: 'row',\n flexShrink: 1,\n },\n titleTextContainer: {\n flexShrink: 1,\n minWidth: 0,\n },\n badge: {\n alignSelf: Platform.select({ android: 'flex-start', default: 'center' }),\n marginTop: 2,\n },\n })\n}\n\nconst useStyles = () => {\n const navigationTheme = useNavigationTheme()\n const { bottom } = useSafeAreaInsets()\n\n return StyleSheet.create({\n container: {\n flex: 1,\n justifyContent: 'center',\n backgroundColor: navigationTheme.colors.card,\n paddingBottom: bottom,\n },\n emptyState: {\n flex: 1,\n justifyContent: 'center',\n },\n listContainer: {\n paddingVertical: 12,\n },\n listHeader: {\n // Just whitespace to provide space where the typing indicator can be\n height: 16,\n },\n })\n}\n\n/**\n * useEnsureConversationsRouteExists\n */\nconst useEnsureConversationsRouteExists = () => {\n const navigation = useNavigation()\n const { params } = useRoute<RouteProp<ConversationScreenProps['route']>>()\n\n useEffect(() => {\n const navigationState = navigation.getState()\n const routes = navigationState?.routes || []\n const conversationsRoute = routes.find(r => r.name === 'Conversations')\n\n if (conversationsRoute) return\n\n navigation.dispatch(state => {\n return CommonActions.reset({\n ...state,\n routes: [\n { name: 'Conversations', params: { chat_group_graph_id: params?.chat_group_graph_id } },\n ...routes,\n ],\n index: state.index + 1,\n })\n })\n }, [navigation, params?.chat_group_graph_id])\n}\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@planningcenter/chat-react-native",
|
|
3
|
-
"version": "4.0.0
|
|
3
|
+
"version": "4.0.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"@fortawesome/fontawesome-svg-core": "^7.2.0",
|
|
35
35
|
"@fortawesome/react-native-fontawesome": "^0.3.2",
|
|
36
|
-
"@planningcenter/emoji-keyboard": "
|
|
36
|
+
"@planningcenter/emoji-keyboard": "4.0.0",
|
|
37
37
|
"lodash-inflection": "^1.5.0"
|
|
38
38
|
},
|
|
39
39
|
"peerDependencies": {
|
|
@@ -84,5 +84,5 @@
|
|
|
84
84
|
"sf-symbols-typescript": "^2.2.0",
|
|
85
85
|
"typescript": "~6.0.3"
|
|
86
86
|
},
|
|
87
|
-
"gitHead": "
|
|
87
|
+
"gitHead": "87719f8962ae23297862f1f2c876dcbf06a69b45"
|
|
88
88
|
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { renderHook } from '@testing-library/react-native'
|
|
2
|
+
import { FlatList, LayoutChangeEvent, NativeScrollEvent, NativeSyntheticEvent } from 'react-native'
|
|
3
|
+
import { useRestAwayFromDismissEdge } from '../../hooks/use_rest_away_from_dismiss_edge'
|
|
4
|
+
|
|
5
|
+
const VIEWPORT_HEIGHT = 800
|
|
6
|
+
const LIST_WIDTH = 390
|
|
7
|
+
|
|
8
|
+
const layoutEvent = (height: number) =>
|
|
9
|
+
({ nativeEvent: { layout: { x: 0, y: 0, width: LIST_WIDTH, height } } }) as LayoutChangeEvent
|
|
10
|
+
|
|
11
|
+
const settledEvent = (y: number) =>
|
|
12
|
+
({ nativeEvent: { contentOffset: { x: 0, y } } }) as NativeSyntheticEvent<NativeScrollEvent>
|
|
13
|
+
|
|
14
|
+
const renderEnabledHook = () => {
|
|
15
|
+
const scrollToOffset = jest.fn()
|
|
16
|
+
const listRef = { current: { scrollToOffset } as unknown as FlatList }
|
|
17
|
+
const { result } = renderHook(() => useRestAwayFromDismissEdge({ listRef, enabled: true }))
|
|
18
|
+
return { scrollToOffset, handlers: result.current }
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
describe('useRestAwayFromDismissEdge', () => {
|
|
22
|
+
test('leaves a list that fits in its viewport alone', () => {
|
|
23
|
+
const { scrollToOffset, handlers } = renderEnabledHook()
|
|
24
|
+
|
|
25
|
+
handlers.onLayout(layoutEvent(VIEWPORT_HEIGHT))
|
|
26
|
+
handlers.onContentSizeChange(LIST_WIDTH, VIEWPORT_HEIGHT / 2)
|
|
27
|
+
handlers.onMomentumScrollEnd(settledEvent(0))
|
|
28
|
+
handlers.onScrollEndDrag(settledEvent(0))
|
|
29
|
+
|
|
30
|
+
expect(scrollToOffset).not.toHaveBeenCalled()
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
test('leaves a list with less than 1pt of overflow alone', () => {
|
|
34
|
+
const { scrollToOffset, handlers } = renderEnabledHook()
|
|
35
|
+
|
|
36
|
+
handlers.onLayout(layoutEvent(VIEWPORT_HEIGHT))
|
|
37
|
+
handlers.onContentSizeChange(LIST_WIDTH, VIEWPORT_HEIGHT + 0.5)
|
|
38
|
+
handlers.onMomentumScrollEnd(settledEvent(0.333))
|
|
39
|
+
|
|
40
|
+
expect(scrollToOffset).not.toHaveBeenCalled()
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
test('rests a scrollable list 1pt off the dismiss edge on open and after it settles there', () => {
|
|
44
|
+
const { scrollToOffset, handlers } = renderEnabledHook()
|
|
45
|
+
|
|
46
|
+
handlers.onLayout(layoutEvent(VIEWPORT_HEIGHT))
|
|
47
|
+
handlers.onContentSizeChange(LIST_WIDTH, VIEWPORT_HEIGHT * 2)
|
|
48
|
+
expect(scrollToOffset).toHaveBeenCalledTimes(1)
|
|
49
|
+
expect(scrollToOffset).toHaveBeenCalledWith({ animated: false, offset: 1 })
|
|
50
|
+
|
|
51
|
+
handlers.onMomentumScrollEnd(settledEvent(0))
|
|
52
|
+
expect(scrollToOffset).toHaveBeenCalledTimes(2)
|
|
53
|
+
|
|
54
|
+
handlers.onMomentumScrollEnd(settledEvent(1))
|
|
55
|
+
handlers.onMomentumScrollEnd(settledEvent(-20))
|
|
56
|
+
expect(scrollToOffset).toHaveBeenCalledTimes(2)
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
test('applies the initial offset once a short list grows past its viewport', () => {
|
|
60
|
+
const { scrollToOffset, handlers } = renderEnabledHook()
|
|
61
|
+
|
|
62
|
+
handlers.onLayout(layoutEvent(VIEWPORT_HEIGHT))
|
|
63
|
+
handlers.onContentSizeChange(LIST_WIDTH, VIEWPORT_HEIGHT / 2)
|
|
64
|
+
expect(scrollToOffset).not.toHaveBeenCalled()
|
|
65
|
+
|
|
66
|
+
handlers.onContentSizeChange(LIST_WIDTH, VIEWPORT_HEIGHT * 2)
|
|
67
|
+
handlers.onContentSizeChange(LIST_WIDTH, VIEWPORT_HEIGHT * 3)
|
|
68
|
+
expect(scrollToOffset).toHaveBeenCalledTimes(1)
|
|
69
|
+
})
|
|
70
|
+
})
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { noop } from 'lodash'
|
|
2
2
|
import { RefObject, useCallback, useRef } from 'react'
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
FlatList,
|
|
5
|
+
LayoutChangeEvent,
|
|
6
|
+
NativeScrollEvent,
|
|
7
|
+
NativeSyntheticEvent,
|
|
8
|
+
Platform,
|
|
9
|
+
} from 'react-native'
|
|
4
10
|
|
|
5
11
|
const REST_OFFSET = 1
|
|
6
12
|
|
|
@@ -17,17 +23,41 @@ export const useRestAwayFromDismissEdge = ({
|
|
|
17
23
|
listRef: RefObject<FlatList | null>
|
|
18
24
|
enabled?: boolean
|
|
19
25
|
}) => {
|
|
26
|
+
const layoutHeight = useRef(0)
|
|
27
|
+
const contentHeight = useRef(0)
|
|
28
|
+
const didSetInitialOffset = useRef(false)
|
|
29
|
+
|
|
30
|
+
const canRestAwayFromEdge = useCallback(
|
|
31
|
+
() => layoutHeight.current > 0 && contentHeight.current - layoutHeight.current >= REST_OFFSET,
|
|
32
|
+
[]
|
|
33
|
+
)
|
|
34
|
+
|
|
20
35
|
const restAwayFromDismissEdge = useCallback(() => {
|
|
36
|
+
if (!canRestAwayFromEdge()) return
|
|
21
37
|
listRef.current?.scrollToOffset({ animated: false, offset: REST_OFFSET })
|
|
22
|
-
}, [listRef])
|
|
38
|
+
}, [canRestAwayFromEdge, listRef])
|
|
23
39
|
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
40
|
+
const applyInitialOffsetOnceScrollable = useCallback(() => {
|
|
41
|
+
if (didSetInitialOffset.current || !canRestAwayFromEdge()) return
|
|
42
|
+
didSetInitialOffset.current = true
|
|
43
|
+
restAwayFromDismissEdge()
|
|
44
|
+
}, [canRestAwayFromEdge, restAwayFromDismissEdge])
|
|
45
|
+
|
|
46
|
+
const handleLayout = useCallback(
|
|
47
|
+
(event: LayoutChangeEvent) => {
|
|
48
|
+
layoutHeight.current = event.nativeEvent.layout.height
|
|
49
|
+
applyInitialOffsetOnceScrollable()
|
|
50
|
+
},
|
|
51
|
+
[applyInitialOffsetOnceScrollable]
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
const handleContentSizeChange = useCallback(
|
|
55
|
+
(_width: number, height: number) => {
|
|
56
|
+
contentHeight.current = height
|
|
57
|
+
applyInitialOffsetOnceScrollable()
|
|
58
|
+
},
|
|
59
|
+
[applyInitialOffsetOnceScrollable]
|
|
60
|
+
)
|
|
31
61
|
|
|
32
62
|
// A negative offset means the bounce is still animating; let it settle first.
|
|
33
63
|
const handleScrollSettled = useCallback(
|
|
@@ -44,6 +74,7 @@ export const useRestAwayFromDismissEdge = ({
|
|
|
44
74
|
if (!enabled) {
|
|
45
75
|
return {
|
|
46
76
|
restOffset: 0,
|
|
77
|
+
onLayout: noop,
|
|
47
78
|
onContentSizeChange: noop,
|
|
48
79
|
onScrollEndDrag: noop,
|
|
49
80
|
onMomentumScrollEnd: noop,
|
|
@@ -52,7 +83,8 @@ export const useRestAwayFromDismissEdge = ({
|
|
|
52
83
|
|
|
53
84
|
return {
|
|
54
85
|
restOffset: REST_OFFSET,
|
|
55
|
-
|
|
86
|
+
onLayout: handleLayout,
|
|
87
|
+
onContentSizeChange: handleContentSizeChange,
|
|
56
88
|
onScrollEndDrag: handleScrollSettled,
|
|
57
89
|
onMomentumScrollEnd: handleScrollSettled,
|
|
58
90
|
}
|
|
@@ -127,7 +127,7 @@ function ConversationScreenContent({ route }: ConversationScreenProps) {
|
|
|
127
127
|
setShowJumpToBottomButton(offsetY > 200)
|
|
128
128
|
}
|
|
129
129
|
|
|
130
|
-
const { restOffset, onContentSizeChange, onMomentumScrollEnd, onScrollEndDrag } =
|
|
130
|
+
const { restOffset, onLayout, onContentSizeChange, onMomentumScrollEnd, onScrollEndDrag } =
|
|
131
131
|
useRestAwayFromDismissEdge({
|
|
132
132
|
listRef,
|
|
133
133
|
enabled: Platform.OS === 'ios',
|
|
@@ -188,6 +188,7 @@ function ConversationScreenContent({ route }: ConversationScreenProps) {
|
|
|
188
188
|
data={messagesWithSeparators}
|
|
189
189
|
keyExtractor={item => item.id}
|
|
190
190
|
onScroll={trackScroll}
|
|
191
|
+
onLayout={onLayout}
|
|
191
192
|
onContentSizeChange={onContentSizeChange}
|
|
192
193
|
onScrollEndDrag={onScrollEndDrag}
|
|
193
194
|
onMomentumScrollEnd={onMomentumScrollEnd}
|