-
Notifications
You must be signed in to change notification settings - Fork 373
Expand file tree
/
Copy pathMessageInputHeaderView.tsx
More file actions
83 lines (76 loc) · 3.09 KB
/
MessageInputHeaderView.tsx
File metadata and controls
83 lines (76 loc) · 3.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import React, { useCallback } from 'react';
import { StyleSheet } from 'react-native';
import Animated, { FadeIn, FadeOut, LinearTransition } from 'react-native-reanimated';
import { LinkPreviewList } from './components/LinkPreviewList';
import { useHasLinkPreviews } from './hooks/useLinkPreviews';
import { idleRecordingStateSelector } from './utils/audioRecorderSelectors';
import { messageComposerStateStoreSelector } from './utils/messageComposerSelectors';
import { useMessageComposerAPIContext } from '../../contexts/messageComposerContext/MessageComposerAPIContext';
import { useHasAttachments } from '../../contexts/messageInputContext/hooks/useHasAttachments';
import { useMessageComposer } from '../../contexts/messageInputContext/hooks/useMessageComposer';
import { useMessageInputContext } from '../../contexts/messageInputContext/MessageInputContext';
import { useMessagesContext } from '../../contexts/messagesContext/MessagesContext';
import { useTheme } from '../../contexts/themeContext/ThemeContext';
import { useStateStore } from '../../hooks/useStateStore';
import { primitives } from '../../theme';
export const MessageInputHeaderView = () => {
const {
theme: {
messageComposer: { contentContainer },
},
} = useTheme();
const messageComposer = useMessageComposer();
const editing = !!messageComposer.editedMessage;
const { clearEditingState } = useMessageComposerAPIContext();
const { quotedMessage } = useStateStore(messageComposer.state, messageComposerStateStoreSelector);
const hasLinkPreviews = useHasLinkPreviews();
const { audioRecorderManager, AttachmentUploadPreviewList } = useMessageInputContext();
const { Reply } = useMessagesContext();
const { isRecordingStateIdle } = useStateStore(
audioRecorderManager.state,
idleRecordingStateSelector,
);
const hasAttachments = useHasAttachments();
const onDismissReply = useCallback(() => {
messageComposer.setQuotedMessage(null);
}, [messageComposer]);
return isRecordingStateIdle ? (
<Animated.View
layout={LinearTransition.duration(200)}
style={[
styles.contentContainer,
{
paddingTop:
hasAttachments || quotedMessage || editing || hasLinkPreviews
? primitives.spacingXs
: 0,
},
contentContainer,
]}
>
{editing ? (
<Animated.View entering={FadeIn.duration(200)} exiting={FadeOut.duration(200)}>
<Reply
mode='edit'
onDismiss={clearEditingState}
quotedMessage={messageComposer.editedMessage}
/>
</Animated.View>
) : null}
{quotedMessage && !editing ? (
<Animated.View entering={FadeIn.duration(200)} exiting={FadeOut.duration(200)}>
<Reply onDismiss={editing ? undefined : onDismissReply} mode='reply' />
</Animated.View>
) : null}
<AttachmentUploadPreviewList />
<LinkPreviewList />
</Animated.View>
) : null;
};
const styles = StyleSheet.create({
contentContainer: {
gap: primitives.spacingXxs,
overflow: 'hidden',
paddingHorizontal: primitives.spacingXs,
},
});