|
@@ -212,6 +212,15 @@ const GroupChatScreen = ({ route }: { route: any }) => {
|
|
|
const textInputRef = useRef<TextInput>(null);
|
|
|
|
|
|
const socket = useRef<WebSocket | null>(null);
|
|
|
+ const scrollViewRef = useRef<ScrollView>(null);
|
|
|
+
|
|
|
+ useEffect(() => {
|
|
|
+ if (isModalVisible) {
|
|
|
+ setTimeout(() => {
|
|
|
+ scrollViewRef.current?.scrollToEnd({ animated: false });
|
|
|
+ }, 50);
|
|
|
+ }
|
|
|
+ }, [isModalVisible]);
|
|
|
|
|
|
useFocusEffect(
|
|
|
useCallback(() => {
|
|
@@ -1224,8 +1233,9 @@ const GroupChatScreen = ({ route }: { route: any }) => {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if (spaceBelow < 220) {
|
|
|
- const extraShift = 220 - spaceBelow;
|
|
|
+ const maxSpaceBelow = isMine ? 280 : 200;
|
|
|
+ if (spaceBelow < maxSpaceBelow) {
|
|
|
+ const extraShift = maxSpaceBelow - spaceBelow;
|
|
|
finalY -= extraShift;
|
|
|
}
|
|
|
|
|
@@ -1465,23 +1475,46 @@ const GroupChatScreen = ({ route }: { route: any }) => {
|
|
|
);
|
|
|
};
|
|
|
|
|
|
- const renderSelectedMessage = () =>
|
|
|
- selectedMessage && (
|
|
|
+ const renderSelectedMessage = () => {
|
|
|
+ if (!selectedMessage) return;
|
|
|
+
|
|
|
+ const messageToCompare = selectedMessage.previousMessage;
|
|
|
+
|
|
|
+ const showUserName =
|
|
|
+ selectedMessage.position === 'left' &&
|
|
|
+ selectedMessage.currentMessage &&
|
|
|
+ messageToCompare &&
|
|
|
+ (!isSameUser(selectedMessage.currentMessage, messageToCompare) ||
|
|
|
+ !isSameDay(selectedMessage.currentMessage, messageToCompare));
|
|
|
+
|
|
|
+ return (
|
|
|
<View
|
|
|
style={{
|
|
|
- maxHeight: '80%',
|
|
|
- width: messagePosition?.width,
|
|
|
- position: 'absolute',
|
|
|
- top: messagePosition?.y,
|
|
|
- left: messagePosition?.x
|
|
|
+ left: !messagePosition?.isMine && messagePosition?.x ? messagePosition?.x - 8 : undefined,
|
|
|
+ top: messagePosition?.y && messagePosition?.y > 120 ? messagePosition?.y : 0,
|
|
|
+ overflow: 'hidden'
|
|
|
}}
|
|
|
>
|
|
|
- <ScrollView>
|
|
|
+ <ScrollView
|
|
|
+ ref={scrollViewRef}
|
|
|
+ contentContainerStyle={{
|
|
|
+ paddingBottom: 60
|
|
|
+ }}
|
|
|
+ showsVerticalScrollIndicator={false}
|
|
|
+ >
|
|
|
<Bubble
|
|
|
{...selectedMessage}
|
|
|
wrapperStyle={{
|
|
|
- right: { backgroundColor: Colors.DARK_BLUE },
|
|
|
- left: { backgroundColor: Colors.FILL_LIGHT }
|
|
|
+ right: {
|
|
|
+ backgroundColor: Colors.DARK_BLUE,
|
|
|
+ marginTop: messagePosition?.y && messagePosition?.y > 120 ? 0 : 120,
|
|
|
+ marginRight: 8
|
|
|
+ },
|
|
|
+ left: {
|
|
|
+ backgroundColor: Colors.FILL_LIGHT,
|
|
|
+ marginTop: messagePosition?.y && messagePosition?.y > 120 ? 0 : 120,
|
|
|
+ marginLeft: 8
|
|
|
+ }
|
|
|
}}
|
|
|
textStyle={{
|
|
|
right: { color: Colors.WHITE },
|
|
@@ -1489,19 +1522,43 @@ const GroupChatScreen = ({ route }: { route: any }) => {
|
|
|
}}
|
|
|
renderTicks={() => null}
|
|
|
renderTime={renderTimeContainer}
|
|
|
- renderCustomView={() =>
|
|
|
- selectedMessage.currentMessage.attachment?.filetype === 'nomadmania/location'
|
|
|
- ? renderMessageLocation(selectedMessage)
|
|
|
- : selectedMessage.currentMessage.attachment &&
|
|
|
- !selectedMessage.currentMessage.image &&
|
|
|
- !selectedMessage.currentMessage.video
|
|
|
- ? renderMessageFile(selectedMessage)
|
|
|
- : renderReplyMessageView(selectedMessage)
|
|
|
- }
|
|
|
+ renderCustomView={() => (
|
|
|
+ <View>
|
|
|
+ {showUserName ? (
|
|
|
+ <Text
|
|
|
+ style={{
|
|
|
+ color: Colors.BLACK,
|
|
|
+ fontWeight: '600',
|
|
|
+ fontSize: 13,
|
|
|
+ paddingHorizontal: 10,
|
|
|
+ paddingTop: 8,
|
|
|
+ paddingBottom: 2
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ {selectedMessage.currentMessage.user.name}
|
|
|
+ </Text>
|
|
|
+ ) : null}
|
|
|
+ {selectedMessage.currentMessage.attachment?.filetype === 'nomadmania/location'
|
|
|
+ ? renderMessageLocation(selectedMessage)
|
|
|
+ : selectedMessage.currentMessage.attachment &&
|
|
|
+ !selectedMessage.currentMessage.image &&
|
|
|
+ !selectedMessage.currentMessage.video
|
|
|
+ ? renderMessageFile(selectedMessage)
|
|
|
+ : renderReplyMessageView(selectedMessage)}
|
|
|
+ </View>
|
|
|
+ )}
|
|
|
+ />
|
|
|
+ <OptionsMenu
|
|
|
+ selectedMessage={selectedMessage}
|
|
|
+ handleOptionPress={handleOptionPress}
|
|
|
+ messagePosition={messagePosition}
|
|
|
+ isGroup={true}
|
|
|
+ isAdmin={data?.settings?.admin == 1}
|
|
|
/>
|
|
|
</ScrollView>
|
|
|
</View>
|
|
|
);
|
|
|
+ };
|
|
|
|
|
|
const handleBackgroundPress = () => {
|
|
|
setIsModalVisible(false);
|
|
@@ -2394,13 +2451,6 @@ const GroupChatScreen = ({ route }: { route: any }) => {
|
|
|
openEmojiSelector={openEmojiSelector}
|
|
|
/>
|
|
|
{renderSelectedMessage()}
|
|
|
- <OptionsMenu
|
|
|
- selectedMessage={selectedMessage}
|
|
|
- handleOptionPress={handleOptionPress}
|
|
|
- messagePosition={messagePosition}
|
|
|
- isGroup={true}
|
|
|
- isAdmin={data?.settings?.admin == 1}
|
|
|
- />
|
|
|
<EmojiSelectorModal
|
|
|
visible={emojiSelectorVisible}
|
|
|
selectedMessage={selectedMessage}
|