@kesha-antonov/react-native-chat 4.2.0 → 4.4.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/README.md +253 -47
- package/lib/Actions.d.ts +5 -5
- package/lib/Actions.d.ts.map +1 -1
- package/lib/Actions.js +28 -39
- package/lib/Actions.js.map +1 -1
- package/lib/Avatar.d.ts.map +1 -1
- package/lib/Avatar.js +34 -32
- package/lib/Avatar.js.map +1 -1
- package/lib/Bubble/index.d.ts.map +1 -1
- package/lib/Bubble/index.js +98 -28
- package/lib/Bubble/index.js.map +1 -1
- package/lib/Bubble/styles.d.ts +28 -11
- package/lib/Bubble/styles.d.ts.map +1 -1
- package/lib/Bubble/styles.js +108 -80
- package/lib/Bubble/styles.js.map +1 -1
- package/lib/Bubble/types.d.ts +12 -7
- package/lib/Bubble/types.d.ts.map +1 -1
- package/lib/Chat/ChatKeyboardAvoidingView.d.ts +8 -3
- package/lib/Chat/ChatKeyboardAvoidingView.d.ts.map +1 -1
- package/lib/Chat/ChatKeyboardAvoidingView.js +3 -5
- package/lib/Chat/ChatKeyboardAvoidingView.js.map +1 -1
- package/lib/Chat/index.d.ts +1 -0
- package/lib/Chat/index.d.ts.map +1 -1
- package/lib/Chat/index.js +94 -28
- package/lib/Chat/index.js.map +1 -1
- package/lib/Chat/types.d.ts +66 -24
- package/lib/Chat/types.d.ts.map +1 -1
- package/lib/ChatAvatar.d.ts.map +1 -1
- package/lib/ChatAvatar.js +11 -17
- package/lib/ChatAvatar.js.map +1 -1
- package/lib/ChatContext.d.ts +31 -1
- package/lib/ChatContext.d.ts.map +1 -1
- package/lib/ChatContext.js +4 -0
- package/lib/ChatContext.js.map +1 -1
- package/lib/Color.d.ts.map +1 -1
- package/lib/Color.js +6 -2
- package/lib/Color.js.map +1 -1
- package/lib/Composer.d.ts +14 -1
- package/lib/Composer.d.ts.map +1 -1
- package/lib/Composer.js +68 -50
- package/lib/Composer.js.map +1 -1
- package/lib/Constant.d.ts +1 -0
- package/lib/Constant.d.ts.map +1 -1
- package/lib/Constant.js +1 -0
- package/lib/Constant.js.map +1 -1
- package/lib/Day/index.d.ts.map +1 -1
- package/lib/Day/index.js +7 -3
- package/lib/Day/index.js.map +1 -1
- package/lib/Day/styles.d.ts +6 -7
- package/lib/Day/styles.d.ts.map +1 -1
- package/lib/Day/styles.js +11 -13
- package/lib/Day/styles.js.map +1 -1
- package/lib/Icons.d.ts +24 -0
- package/lib/Icons.d.ts.map +1 -0
- package/lib/Icons.js +2 -0
- package/lib/Icons.js.map +1 -0
- package/lib/InputToolbar.d.ts +18 -5
- package/lib/InputToolbar.d.ts.map +1 -1
- package/lib/InputToolbar.js +246 -19
- package/lib/InputToolbar.js.map +1 -1
- package/lib/LoadEarlierMessages.d.ts.map +1 -1
- package/lib/LoadEarlierMessages.js +12 -7
- package/lib/LoadEarlierMessages.js.map +1 -1
- package/lib/Message/index.d.ts.map +1 -1
- package/lib/Message/index.js +21 -12
- package/lib/Message/index.js.map +1 -1
- package/lib/Message/styles.js +2 -2
- package/lib/Message/styles.js.map +1 -1
- package/lib/MessageAudio.d.ts +2 -1
- package/lib/MessageAudio.d.ts.map +1 -1
- package/lib/MessageAudio.js +121 -19
- package/lib/MessageAudio.js.map +1 -1
- package/lib/MessageLocation.d.ts +9 -0
- package/lib/MessageLocation.d.ts.map +1 -0
- package/lib/MessageLocation.js +85 -0
- package/lib/MessageLocation.js.map +1 -0
- package/lib/MessageText.d.ts +12 -1
- package/lib/MessageText.d.ts.map +1 -1
- package/lib/MessageText.js +38 -11
- package/lib/MessageText.js.map +1 -1
- package/lib/MessageVideo.d.ts +2 -1
- package/lib/MessageVideo.d.ts.map +1 -1
- package/lib/MessageVideo.js +156 -18
- package/lib/MessageVideo.js.map +1 -1
- package/lib/MessagesContainer/components/Item/index.d.ts +2 -1
- package/lib/MessagesContainer/components/Item/index.d.ts.map +1 -1
- package/lib/MessagesContainer/components/Item/index.js +23 -1
- package/lib/MessagesContainer/components/Item/index.js.map +1 -1
- package/lib/MessagesContainer/index.d.ts.map +1 -1
- package/lib/MessagesContainer/index.js +24 -11
- package/lib/MessagesContainer/index.js.map +1 -1
- package/lib/MessagesContainer/styles.d.ts +23 -3
- package/lib/MessagesContainer/styles.d.ts.map +1 -1
- package/lib/MessagesContainer/styles.js +25 -5
- package/lib/MessagesContainer/styles.js.map +1 -1
- package/lib/Models.d.ts +72 -0
- package/lib/Models.d.ts.map +1 -1
- package/lib/QuickReplies.d.ts +1 -1
- package/lib/QuickReplies.d.ts.map +1 -1
- package/lib/QuickReplies.js +13 -7
- package/lib/QuickReplies.js.map +1 -1
- package/lib/Reactions/MessageReactions.d.ts.map +1 -1
- package/lib/Reactions/MessageReactions.js +11 -10
- package/lib/Reactions/MessageReactions.js.map +1 -1
- package/lib/Reactions/ReactionPicker.d.ts.map +1 -1
- package/lib/Reactions/ReactionPicker.js +5 -3
- package/lib/Reactions/ReactionPicker.js.map +1 -1
- package/lib/Send.d.ts +2 -2
- package/lib/Send.d.ts.map +1 -1
- package/lib/Send.js +37 -37
- package/lib/Send.js.map +1 -1
- package/lib/SystemMessage.d.ts.map +1 -1
- package/lib/SystemMessage.js +8 -5
- package/lib/SystemMessage.js.map +1 -1
- package/lib/Theme.d.ts +159 -0
- package/lib/Theme.d.ts.map +1 -0
- package/lib/Theme.js +147 -0
- package/lib/Theme.js.map +1 -0
- package/lib/Time.d.ts.map +1 -1
- package/lib/Time.js +7 -5
- package/lib/Time.js.map +1 -1
- package/lib/TypingIndicator/index.d.ts.map +1 -1
- package/lib/TypingIndicator/index.js +4 -1
- package/lib/TypingIndicator/index.js.map +1 -1
- package/lib/TypingIndicator/styles.d.ts +2 -2
- package/lib/TypingIndicator/styles.d.ts.map +1 -1
- package/lib/TypingIndicator/styles.js +4 -5
- package/lib/TypingIndicator/styles.js.map +1 -1
- package/lib/components/AttachmentSheet.d.ts +28 -0
- package/lib/components/AttachmentSheet.d.ts.map +1 -0
- package/lib/components/AttachmentSheet.js +177 -0
- package/lib/components/AttachmentSheet.js.map +1 -0
- package/lib/components/BasicMarkdown.d.ts +12 -0
- package/lib/components/BasicMarkdown.d.ts.map +1 -0
- package/lib/components/BasicMarkdown.js +220 -0
- package/lib/components/BasicMarkdown.js.map +1 -0
- package/lib/components/ContextMenu.d.ts +25 -0
- package/lib/components/ContextMenu.d.ts.map +1 -0
- package/lib/components/ContextMenu.js +122 -0
- package/lib/components/ContextMenu.js.map +1 -0
- package/lib/components/Icon.d.ts +17 -0
- package/lib/components/Icon.d.ts.map +1 -0
- package/lib/components/Icon.js +19 -0
- package/lib/components/Icon.js.map +1 -0
- package/lib/components/LucideIcon.d.ts +10 -0
- package/lib/components/LucideIcon.d.ts.map +1 -0
- package/lib/components/LucideIcon.js +118 -0
- package/lib/components/LucideIcon.js.map +1 -0
- package/lib/components/MarkdownMessageText.d.ts +19 -0
- package/lib/components/MarkdownMessageText.d.ts.map +1 -0
- package/lib/components/MarkdownMessageText.js +35 -0
- package/lib/components/MarkdownMessageText.js.map +1 -0
- package/lib/components/MediaCard.d.ts +19 -0
- package/lib/components/MediaCard.d.ts.map +1 -0
- package/lib/components/MediaCard.js +102 -0
- package/lib/components/MediaCard.js.map +1 -0
- package/lib/components/MediaControls.d.ts +41 -0
- package/lib/components/MediaControls.d.ts.map +1 -0
- package/lib/components/MediaControls.js +524 -0
- package/lib/components/MediaControls.js.map +1 -0
- package/lib/components/MessageReply.d.ts.map +1 -1
- package/lib/components/MessageReply.js +11 -9
- package/lib/components/MessageReply.js.map +1 -1
- package/lib/components/ReplyPreview.d.ts +3 -1
- package/lib/components/ReplyPreview.d.ts.map +1 -1
- package/lib/components/ReplyPreview.js +37 -36
- package/lib/components/ReplyPreview.js.map +1 -1
- package/lib/components/SendIcon.d.ts +13 -0
- package/lib/components/SendIcon.d.ts.map +1 -0
- package/lib/components/SendIcon.js +37 -0
- package/lib/components/SendIcon.js.map +1 -0
- package/lib/components/Ticks.d.ts +25 -0
- package/lib/components/Ticks.d.ts.map +1 -0
- package/lib/components/Ticks.js +102 -0
- package/lib/components/Ticks.js.map +1 -0
- package/lib/components/VideoNoteOverlay.d.ts +25 -0
- package/lib/components/VideoNoteOverlay.d.ts.map +1 -0
- package/lib/components/VideoNoteOverlay.js +151 -0
- package/lib/components/VideoNoteOverlay.js.map +1 -0
- package/lib/components/VideoNoteRecorder.d.ts +19 -0
- package/lib/components/VideoNoteRecorder.d.ts.map +1 -0
- package/lib/components/VideoNoteRecorder.js +634 -0
- package/lib/components/VideoNoteRecorder.js.map +1 -0
- package/lib/components/VideoRecordButton.d.ts +29 -0
- package/lib/components/VideoRecordButton.d.ts.map +1 -0
- package/lib/components/VideoRecordButton.js +117 -0
- package/lib/components/VideoRecordButton.js.map +1 -0
- package/lib/components/VoiceMessageInput.d.ts +33 -0
- package/lib/components/VoiceMessageInput.d.ts.map +1 -0
- package/lib/components/VoiceMessageInput.js +403 -0
- package/lib/components/VoiceMessageInput.js.map +1 -0
- package/lib/components/WaveformPlayer.d.ts +19 -0
- package/lib/components/WaveformPlayer.d.ts.map +1 -0
- package/lib/components/WaveformPlayer.js +367 -0
- package/lib/components/WaveformPlayer.js.map +1 -0
- package/lib/components/mediaPalette.d.ts +23 -0
- package/lib/components/mediaPalette.d.ts.map +1 -0
- package/lib/components/mediaPalette.js +16 -0
- package/lib/components/mediaPalette.js.map +1 -0
- package/lib/components/mediaPlayback.d.ts +22 -0
- package/lib/components/mediaPlayback.d.ts.map +1 -0
- package/lib/components/mediaPlayback.js +34 -0
- package/lib/components/mediaPlayback.js.map +1 -0
- package/lib/dayjsLocales.d.ts +18 -0
- package/lib/dayjsLocales.d.ts.map +1 -0
- package/lib/dayjsLocales.js +36 -0
- package/lib/dayjsLocales.js.map +1 -0
- package/lib/hooks/useColorScheme.d.ts +9 -2
- package/lib/hooks/useColorScheme.d.ts.map +1 -1
- package/lib/hooks/useColorScheme.js +9 -3
- package/lib/hooks/useColorScheme.js.map +1 -1
- package/lib/hooks/useIcons.d.ts +4 -0
- package/lib/hooks/useIcons.d.ts.map +1 -0
- package/lib/hooks/useIcons.js +8 -0
- package/lib/hooks/useIcons.js.map +1 -0
- package/lib/hooks/useIsRTL.d.ts +3 -0
- package/lib/hooks/useIsRTL.d.ts.map +1 -0
- package/lib/hooks/useIsRTL.js +7 -0
- package/lib/hooks/useIsRTL.js.map +1 -0
- package/lib/hooks/useKeyboardVerticalOffset.d.ts +29 -8
- package/lib/hooks/useKeyboardVerticalOffset.d.ts.map +1 -1
- package/lib/hooks/useKeyboardVerticalOffset.js +41 -8
- package/lib/hooks/useKeyboardVerticalOffset.js.map +1 -1
- package/lib/hooks/useLabels.d.ts +4 -0
- package/lib/hooks/useLabels.d.ts.map +1 -0
- package/lib/hooks/useLabels.js +8 -0
- package/lib/hooks/useLabels.js.map +1 -0
- package/lib/hooks/useTheme.d.ts +21 -0
- package/lib/hooks/useTheme.d.ts.map +1 -0
- package/lib/hooks/useTheme.js +32 -0
- package/lib/hooks/useTheme.js.map +1 -0
- package/lib/i18n.d.ts +66 -0
- package/lib/i18n.d.ts.map +1 -0
- package/lib/i18n.js +53 -0
- package/lib/i18n.js.map +1 -0
- package/lib/index.d.ts +19 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +19 -0
- package/lib/index.js.map +1 -1
- package/lib/locales/ar.d.ts +3 -0
- package/lib/locales/ar.d.ts.map +1 -0
- package/lib/locales/ar.js +22 -0
- package/lib/locales/ar.js.map +1 -0
- package/lib/locales/de.d.ts +3 -0
- package/lib/locales/de.d.ts.map +1 -0
- package/lib/locales/de.js +22 -0
- package/lib/locales/de.js.map +1 -0
- package/lib/locales/es.d.ts +3 -0
- package/lib/locales/es.d.ts.map +1 -0
- package/lib/locales/es.js +22 -0
- package/lib/locales/es.js.map +1 -0
- package/lib/locales/fr.d.ts +3 -0
- package/lib/locales/fr.d.ts.map +1 -0
- package/lib/locales/fr.js +22 -0
- package/lib/locales/fr.js.map +1 -0
- package/lib/locales/hi.d.ts +3 -0
- package/lib/locales/hi.d.ts.map +1 -0
- package/lib/locales/hi.js +22 -0
- package/lib/locales/hi.js.map +1 -0
- package/lib/locales/id.d.ts +3 -0
- package/lib/locales/id.d.ts.map +1 -0
- package/lib/locales/id.js +22 -0
- package/lib/locales/id.js.map +1 -0
- package/lib/locales/index.d.ts +19 -0
- package/lib/locales/index.d.ts.map +1 -0
- package/lib/locales/index.js +39 -0
- package/lib/locales/index.js.map +1 -0
- package/lib/locales/it.d.ts +3 -0
- package/lib/locales/it.d.ts.map +1 -0
- package/lib/locales/it.js +22 -0
- package/lib/locales/it.js.map +1 -0
- package/lib/locales/ja.d.ts +3 -0
- package/lib/locales/ja.d.ts.map +1 -0
- package/lib/locales/ja.js +22 -0
- package/lib/locales/ja.js.map +1 -0
- package/lib/locales/ko.d.ts +3 -0
- package/lib/locales/ko.d.ts.map +1 -0
- package/lib/locales/ko.js +22 -0
- package/lib/locales/ko.js.map +1 -0
- package/lib/locales/nl.d.ts +3 -0
- package/lib/locales/nl.d.ts.map +1 -0
- package/lib/locales/nl.js +22 -0
- package/lib/locales/nl.js.map +1 -0
- package/lib/locales/pl.d.ts +3 -0
- package/lib/locales/pl.d.ts.map +1 -0
- package/lib/locales/pl.js +22 -0
- package/lib/locales/pl.js.map +1 -0
- package/lib/locales/pt.d.ts +3 -0
- package/lib/locales/pt.d.ts.map +1 -0
- package/lib/locales/pt.js +22 -0
- package/lib/locales/pt.js.map +1 -0
- package/lib/locales/ru.d.ts +3 -0
- package/lib/locales/ru.d.ts.map +1 -0
- package/lib/locales/ru.js +22 -0
- package/lib/locales/ru.js.map +1 -0
- package/lib/locales/tr.d.ts +3 -0
- package/lib/locales/tr.d.ts.map +1 -0
- package/lib/locales/tr.js +22 -0
- package/lib/locales/tr.js.map +1 -0
- package/lib/locales/zh.d.ts +3 -0
- package/lib/locales/zh.d.ts.map +1 -0
- package/lib/locales/zh.js +22 -0
- package/lib/locales/zh.js.map +1 -0
- package/lib/rtl.d.ts +18 -0
- package/lib/rtl.d.ts.map +1 -0
- package/lib/rtl.js +31 -0
- package/lib/rtl.js.map +1 -0
- package/lib/types.d.ts +2 -1
- package/lib/types.d.ts.map +1 -1
- package/package.json +99 -44
- package/lib/MessageReply.d.ts +0 -15
- package/lib/MessageReply.d.ts.map +0 -1
- package/lib/MessageReply.js +0 -102
- package/lib/MessageReply.js.map +0 -1
- package/lib/ReplyPreview.d.ts +0 -14
- package/lib/ReplyPreview.d.ts.map +0 -1
- package/lib/ReplyPreview.js +0 -94
- package/lib/ReplyPreview.js.map +0 -1
|
@@ -1,16 +1,21 @@
|
|
|
1
1
|
import React, { useEffect } from 'react';
|
|
2
2
|
import { Image, Pressable, StyleSheet, Text, View, } from 'react-native';
|
|
3
3
|
import Animated, { useAnimatedStyle, useSharedValue, withTiming, Easing, interpolate, runOnJS, } from 'react-native-reanimated';
|
|
4
|
-
import {
|
|
4
|
+
import { useLabels } from '../hooks/useLabels';
|
|
5
|
+
import { useThemedStyles } from '../hooks/useTheme';
|
|
6
|
+
import { formatLabel } from '../i18n';
|
|
7
|
+
import { Icon } from './Icon';
|
|
8
|
+
import { CloseIcon, PencilIcon, ReplyArrowIcon } from './MediaControls';
|
|
5
9
|
const ANIMATION_DURATION = 200;
|
|
6
10
|
const ANIMATION_EASING = Easing.bezier(0.25, 0.1, 0.25, 1);
|
|
7
11
|
const DEFAULT_HEIGHT = 68;
|
|
8
|
-
const
|
|
12
|
+
const createStyles = (theme) => StyleSheet.create({
|
|
9
13
|
borderIndicator: {
|
|
10
|
-
backgroundColor:
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
+
backgroundColor: theme.colors.accent,
|
|
15
|
+
borderRadius: 2,
|
|
16
|
+
width: 3,
|
|
17
|
+
alignSelf: 'stretch',
|
|
18
|
+
marginVertical: 8,
|
|
14
19
|
},
|
|
15
20
|
clearButton: {
|
|
16
21
|
alignItems: 'center',
|
|
@@ -22,23 +27,26 @@ const styles = StyleSheet.create({
|
|
|
22
27
|
clearButtonText: {
|
|
23
28
|
fontSize: 18,
|
|
24
29
|
fontWeight: '600',
|
|
30
|
+
color: theme.colors.placeholder,
|
|
25
31
|
},
|
|
32
|
+
// Flush banner: full-bleed inside the bar, sharing the bar background with a
|
|
33
|
+
// bottom hairline, so it reads as the composer growing a header.
|
|
26
34
|
container: {
|
|
27
|
-
borderRadius: 8,
|
|
28
35
|
flexDirection: 'row',
|
|
29
|
-
|
|
30
|
-
marginHorizontal: 10,
|
|
36
|
+
alignItems: 'center',
|
|
31
37
|
overflow: 'hidden',
|
|
38
|
+
paddingLeft: theme.spacing.screenEdge.left,
|
|
39
|
+
paddingRight: theme.spacing.screenEdge.right,
|
|
40
|
+
backgroundColor: theme.colors.inputBarBackground,
|
|
41
|
+
borderBottomWidth: StyleSheet.hairlineWidth,
|
|
42
|
+
borderBottomColor: theme.colors.separator,
|
|
32
43
|
},
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
},
|
|
36
|
-
containerLight: {
|
|
37
|
-
backgroundColor: '#e9e9eb',
|
|
44
|
+
leadingIcon: {
|
|
45
|
+
marginRight: 8,
|
|
38
46
|
},
|
|
39
47
|
content: {
|
|
40
48
|
flex: 1,
|
|
41
|
-
paddingHorizontal:
|
|
49
|
+
paddingHorizontal: 8,
|
|
42
50
|
paddingVertical: 8,
|
|
43
51
|
},
|
|
44
52
|
image: {
|
|
@@ -53,15 +61,10 @@ const styles = StyleSheet.create({
|
|
|
53
61
|
},
|
|
54
62
|
text: {
|
|
55
63
|
fontSize: 14,
|
|
56
|
-
|
|
57
|
-
textDark: {
|
|
58
|
-
color: '#fff',
|
|
59
|
-
},
|
|
60
|
-
textLight: {
|
|
61
|
-
color: '#333',
|
|
64
|
+
color: theme.colors.inputText,
|
|
62
65
|
},
|
|
63
66
|
username: {
|
|
64
|
-
color:
|
|
67
|
+
color: theme.colors.accent,
|
|
65
68
|
fontSize: 13,
|
|
66
69
|
fontWeight: '600',
|
|
67
70
|
marginBottom: 2,
|
|
@@ -70,9 +73,9 @@ const styles = StyleSheet.create({
|
|
|
70
73
|
overflow: 'hidden',
|
|
71
74
|
},
|
|
72
75
|
});
|
|
73
|
-
export function ReplyPreview({ replyMessage, onClearReply, containerStyle, textStyle, imageStyle, }) {
|
|
74
|
-
const
|
|
75
|
-
const
|
|
76
|
+
export function ReplyPreview({ replyMessage, onClearReply, mode = 'reply', containerStyle, textStyle, imageStyle, }) {
|
|
77
|
+
const styles = useThemedStyles(createStyles);
|
|
78
|
+
const labels = useLabels();
|
|
76
79
|
const animationProgress = useSharedValue(0);
|
|
77
80
|
const contentHeight = useSharedValue(DEFAULT_HEIGHT);
|
|
78
81
|
// Animate in on mount
|
|
@@ -95,18 +98,17 @@ export function ReplyPreview({ replyMessage, onClearReply, containerStyle, textS
|
|
|
95
98
|
const wrapperAnimatedStyle = useAnimatedStyle(() => {
|
|
96
99
|
const height = interpolate(animationProgress.value, [0, 1], [0, contentHeight.value]);
|
|
97
100
|
const opacity = interpolate(animationProgress.value, [0, 0.5, 1], [0, 0.5, 1]);
|
|
98
|
-
const translateY = interpolate(animationProgress.value, [0, 1], [10, 0]);
|
|
99
101
|
return {
|
|
100
102
|
height,
|
|
101
103
|
opacity,
|
|
102
|
-
transform: [{ translateY }],
|
|
103
104
|
};
|
|
104
105
|
});
|
|
105
106
|
const displayName = replyMessage.user?.name || 'Unknown';
|
|
107
|
+
const accent = styles.username.color;
|
|
108
|
+
const title = mode === 'edit' ? labels.editing : formatLabel(labels.replyingTo, { name: displayName });
|
|
106
109
|
return (<Animated.View style={[styles.wrapper, wrapperAnimatedStyle]}>
|
|
107
110
|
<View style={[
|
|
108
111
|
styles.container,
|
|
109
|
-
isDark ? styles.containerDark : styles.containerLight,
|
|
110
112
|
containerStyle,
|
|
111
113
|
]} onLayout={e => {
|
|
112
114
|
const newHeight = e.nativeEvent.layout.height + 8;
|
|
@@ -116,17 +118,21 @@ export function ReplyPreview({ replyMessage, onClearReply, containerStyle, textS
|
|
|
116
118
|
easing: ANIMATION_EASING,
|
|
117
119
|
});
|
|
118
120
|
}}>
|
|
121
|
+
<View style={styles.leadingIcon}>
|
|
122
|
+
{mode === 'edit'
|
|
123
|
+
? <Icon name='pencil' color={accent} size={18} fallback={<PencilIcon color={accent} size={18}/>}/>
|
|
124
|
+
: <Icon name='reply' color={accent} size={18} fallback={<ReplyArrowIcon color={accent} size={18}/>}/>}
|
|
125
|
+
</View>
|
|
119
126
|
<View style={styles.borderIndicator}/>
|
|
120
127
|
<View style={styles.content}>
|
|
121
128
|
<View style={styles.row}>
|
|
122
129
|
{replyMessage.image && (<Image source={{ uri: replyMessage.image }} style={[styles.image, imageStyle]}/>)}
|
|
123
130
|
<View style={{ flex: 1 }}>
|
|
124
131
|
<Text style={styles.username} numberOfLines={1}>
|
|
125
|
-
|
|
132
|
+
{title}
|
|
126
133
|
</Text>
|
|
127
134
|
{replyMessage.text && (<Text style={[
|
|
128
135
|
styles.text,
|
|
129
|
-
isDark ? styles.textDark : styles.textLight,
|
|
130
136
|
textStyle,
|
|
131
137
|
]} numberOfLines={2}>
|
|
132
138
|
{replyMessage.text}
|
|
@@ -135,12 +141,7 @@ export function ReplyPreview({ replyMessage, onClearReply, containerStyle, textS
|
|
|
135
141
|
</View>
|
|
136
142
|
</View>
|
|
137
143
|
<Pressable style={styles.clearButton} onPress={handleClear} hitSlop={8}>
|
|
138
|
-
<
|
|
139
|
-
styles.clearButtonText,
|
|
140
|
-
isDark ? styles.textDark : styles.textLight,
|
|
141
|
-
]}>
|
|
142
|
-
×
|
|
143
|
-
</Text>
|
|
144
|
+
<Icon name='close' color={styles.clearButtonText.color} size={16} fallback={<CloseIcon color={styles.clearButtonText.color} size={16}/>}/>
|
|
144
145
|
</Pressable>
|
|
145
146
|
</View>
|
|
146
147
|
</Animated.View>);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReplyPreview.js","sourceRoot":"","sources":["../../src/components/ReplyPreview.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACxC,OAAO,EACL,KAAK,EAEL,SAAS,EAET,UAAU,EACV,IAAI,EAEJ,IAAI,GAEL,MAAM,cAAc,CAAA;AACrB,OAAO,QAAQ,EAAE,EACf,gBAAgB,EAChB,cAAc,EACd,UAAU,EACV,MAAM,EACN,WAAW,EACX,OAAO,GACR,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EAAE,cAAc,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"ReplyPreview.js","sourceRoot":"","sources":["../../src/components/ReplyPreview.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACxC,OAAO,EACL,KAAK,EAEL,SAAS,EAET,UAAU,EACV,IAAI,EAEJ,IAAI,GAEL,MAAM,cAAc,CAAA;AACrB,OAAO,QAAQ,EAAE,EACf,gBAAgB,EAChB,cAAc,EACd,UAAU,EACV,MAAM,EACN,WAAW,EACX,OAAO,GACR,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAGrC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC7B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAEvE,MAAM,kBAAkB,GAAG,GAAG,CAAA;AAC9B,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;AAC1D,MAAM,cAAc,GAAG,EAAE,CAAA;AAiBzB,MAAM,YAAY,GAAG,CAAC,KAAgB,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;IAC3D,eAAe,EAAE;QACf,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM;QACpC,YAAY,EAAE,CAAC;QACf,KAAK,EAAE,CAAC;QACR,SAAS,EAAE,SAAS;QACpB,cAAc,EAAE,CAAC;KAClB;IACD,WAAW,EAAE;QACX,UAAU,EAAE,QAAQ;QACpB,YAAY,EAAE,EAAE;QAChB,MAAM,EAAE,EAAE;QACV,cAAc,EAAE,QAAQ;QACxB,KAAK,EAAE,EAAE;KACV;IACD,eAAe,EAAE;QACf,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,KAAK;QACjB,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,WAAW;KAChC;IACD,6EAA6E;IAC7E,iEAAiE;IACjE,SAAS,EAAE;QACT,aAAa,EAAE,KAAK;QACpB,UAAU,EAAE,QAAQ;QACpB,QAAQ,EAAE,QAAQ;QAClB,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI;QAC1C,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK;QAC5C,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,kBAAkB;QAChD,iBAAiB,EAAE,UAAU,CAAC,aAAa;QAC3C,iBAAiB,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS;KAC1C;IACD,WAAW,EAAE;QACX,WAAW,EAAE,CAAC;KACf;IACD,OAAO,EAAE;QACP,IAAI,EAAE,CAAC;QACP,iBAAiB,EAAE,CAAC;QACpB,eAAe,EAAE,CAAC;KACnB;IACD,KAAK,EAAE;QACL,YAAY,EAAE,CAAC;QACf,MAAM,EAAE,EAAE;QACV,WAAW,EAAE,CAAC;QACd,KAAK,EAAE,EAAE;KACV;IACD,GAAG,EAAE;QACH,UAAU,EAAE,QAAQ;QACpB,aAAa,EAAE,KAAK;KACrB;IACD,IAAI,EAAE;QACJ,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS;KAC9B;IACD,QAAQ,EAAE;QACR,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM;QAC1B,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,KAAK;QACjB,YAAY,EAAE,CAAC;KAChB;IACD,OAAO,EAAE;QACP,QAAQ,EAAE,QAAQ;KACnB;CACF,CAAC,CAAA;AAEF,MAAM,UAAU,YAAY,CAAE,EAC5B,YAAY,EACZ,YAAY,EACZ,IAAI,GAAG,OAAO,EACd,cAAc,EACd,SAAS,EACT,UAAU,GACQ;IAClB,MAAM,MAAM,GAAG,eAAe,CAAC,YAAY,CAAC,CAAA;IAC5C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAE1B,MAAM,iBAAiB,GAAG,cAAc,CAAC,CAAC,CAAC,CAAA;IAC3C,MAAM,aAAa,GAAG,cAAc,CAAC,cAAc,CAAC,CAAA;IAEpD,sBAAsB;IACtB,SAAS,CAAC,GAAG,EAAE;QACb,iBAAiB,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC,EAAE;YACtC,QAAQ,EAAE,kBAAkB;YAC5B,MAAM,EAAE,gBAAgB;SACzB,CAAC,CAAA;IACJ,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAA;IAEvB,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,SAAS,CAAA;QACT,iBAAiB,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC,EAAE;YACtC,QAAQ,EAAE,kBAAkB;YAC5B,MAAM,EAAE,gBAAgB;SACzB,EAAE,QAAQ,CAAC,EAAE;YACZ,IAAI,QAAQ,IAAI,YAAY;gBAC1B,OAAO,CAAC,YAAY,CAAC,EAAE,CAAA;QAC3B,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,WAAW,CACxB,iBAAiB,CAAC,KAAK,EACvB,CAAC,CAAC,EAAE,CAAC,CAAC,EACN,CAAC,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC,CACzB,CAAA;QAED,MAAM,OAAO,GAAG,WAAW,CACzB,iBAAiB,CAAC,KAAK,EACvB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EACX,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CACZ,CAAA;QAED,OAAO;YACL,MAAM;YACN,OAAO;SACR,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,IAAI,SAAS,CAAA;IACxD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAA;IACpC,MAAM,KAAK,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;IAEtG,OAAO,CACL,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAC3D;MAAA,CAAC,IAAI,CACH,KAAK,CAAC,CAAC;YACL,MAAM,CAAC,SAAS;YAChB,cAAc;SACf,CAAC,CACF,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;YACZ,MAAM,SAAS,GAAG,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAA;YACjD,sDAAsD;YACtD,aAAa,CAAC,KAAK,GAAG,UAAU,CAAC,SAAS,EAAE;gBAC1C,QAAQ,EAAE,kBAAkB;gBAC5B,MAAM,EAAE,gBAAgB;aACzB,CAAC,CAAA;QACJ,CAAC,CAAC,CAEF;QAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAC9B;UAAA,CAAC,IAAI,KAAK,MAAM;YACd,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAG,CAAC,EAAG;YACpG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAG,CAAC,EAAG,CAC3G;QAAA,EAAE,IAAI,CACN;QAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,EACpC;QAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAC1B;UAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CACtB;YAAA,CAAC,YAAY,CAAC,KAAK,IAAI,CACrB,CAAC,KAAK,CACJ,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC,CACpC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,EAClC,CACH,CACD;YAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CACvB;cAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAC7C;gBAAA,CAAC,KAAK,CACR;cAAA,EAAE,IAAI,CACN;cAAA,CAAC,YAAY,CAAC,IAAI,IAAI,CACpB,CAAC,IAAI,CACH,KAAK,CAAC,CAAC;gBACL,MAAM,CAAC,IAAI;gBACX,SAAS;aACV,CAAC,CACF,aAAa,CAAC,CAAC,CAAC,CAAC,CAEjB;kBAAA,CAAC,YAAY,CAAC,IAAI,CACpB;gBAAA,EAAE,IAAI,CAAC,CACR,CACH;YAAA,EAAE,IAAI,CACR;UAAA,EAAE,IAAI,CACR;QAAA,EAAE,IAAI,CACN;QAAA,CAAC,SAAS,CACR,KAAK,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAC1B,OAAO,CAAC,CAAC,WAAW,CAAC,CACrB,OAAO,CAAC,CAAC,CAAC,CAAC,CAEX;UAAA,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAG,CAAC,EAC3I;QAAA,EAAE,SAAS,CACb;MAAA,EAAE,IAAI,CACR;IAAA,EAAE,QAAQ,CAAC,IAAI,CAAC,CACjB,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface SendIconProps {
|
|
3
|
+
color?: string;
|
|
4
|
+
/** Overall icon box size; the glyph scales to fit. Defaults to 20. */
|
|
5
|
+
size?: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Dependency-free fallback send glyph (used when react-native-svg is not
|
|
9
|
+
* installed; otherwise the Lucide "send" icon is rendered via the Icon
|
|
10
|
+
* resolver). A triangle tilted to point up-and-to-the-right.
|
|
11
|
+
*/
|
|
12
|
+
export declare const SendIcon: ({ color, size }: SendIconProps) => React.JSX.Element;
|
|
13
|
+
//# sourceMappingURL=SendIcon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SendIcon.d.ts","sourceRoot":"","sources":["../../src/components/SendIcon.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAA;AAGtC,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GAAI,iBAA+B,aAAa,sBAQpE,CAAA"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import React, { useMemo } from 'react';
|
|
2
|
+
import { StyleSheet, View } from 'react-native';
|
|
3
|
+
/**
|
|
4
|
+
* Dependency-free fallback send glyph (used when react-native-svg is not
|
|
5
|
+
* installed; otherwise the Lucide "send" icon is rendered via the Icon
|
|
6
|
+
* resolver). A triangle tilted to point up-and-to-the-right.
|
|
7
|
+
*/
|
|
8
|
+
export const SendIcon = ({ color = '#fff', size = 20 }) => {
|
|
9
|
+
const styles = useMemo(() => createStyles(color, size), [color, size]);
|
|
10
|
+
return (<View style={styles.container}>
|
|
11
|
+
<View style={styles.triangle}/>
|
|
12
|
+
</View>);
|
|
13
|
+
};
|
|
14
|
+
const createStyles = (color, size) => {
|
|
15
|
+
const side = size * 0.82;
|
|
16
|
+
return StyleSheet.create({
|
|
17
|
+
container: {
|
|
18
|
+
width: size,
|
|
19
|
+
height: size,
|
|
20
|
+
alignItems: 'center',
|
|
21
|
+
justifyContent: 'center',
|
|
22
|
+
transform: [{ rotate: '-45deg' }],
|
|
23
|
+
},
|
|
24
|
+
triangle: {
|
|
25
|
+
width: 0,
|
|
26
|
+
height: 0,
|
|
27
|
+
borderTopWidth: side / 2,
|
|
28
|
+
borderBottomWidth: side / 2,
|
|
29
|
+
borderLeftWidth: side,
|
|
30
|
+
borderTopColor: 'transparent',
|
|
31
|
+
borderBottomColor: 'transparent',
|
|
32
|
+
borderLeftColor: color,
|
|
33
|
+
marginLeft: size * 0.16,
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=SendIcon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SendIcon.js","sourceRoot":"","sources":["../../src/components/SendIcon.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAQ/C;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,IAAI,GAAG,EAAE,EAAiB,EAAE,EAAE;IACvE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAA;IAEtE,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAC5B;MAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAC/B;IAAA,EAAE,IAAI,CAAC,CACR,CAAA;AACH,CAAC,CAAA;AAED,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,IAAY,EAAE,EAAE;IACnD,MAAM,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;IAExB,OAAO,UAAU,CAAC,MAAM,CAAC;QACvB,SAAS,EAAE;YACT,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,IAAI;YACZ,UAAU,EAAE,QAAQ;YACpB,cAAc,EAAE,QAAQ;YACxB,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;SAClC;QACD,QAAQ,EAAE;YACR,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,CAAC;YACT,cAAc,EAAE,IAAI,GAAG,CAAC;YACxB,iBAAiB,EAAE,IAAI,GAAG,CAAC;YAC3B,eAAe,EAAE,IAAI;YACrB,cAAc,EAAE,aAAa;YAC7B,iBAAiB,EAAE,aAAa;YAChC,eAAe,EAAE,KAAK;YACtB,UAAU,EAAE,IAAI,GAAG,IAAI;SACxB;KACF,CAAC,CAAA;AACJ,CAAC,CAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface TicksProps {
|
|
3
|
+
/** Render a double check (delivered / read) instead of a single check (sent). */
|
|
4
|
+
double?: boolean;
|
|
5
|
+
color: string;
|
|
6
|
+
/** Visual height of a single check; defaults to 9. */
|
|
7
|
+
size?: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Telegram-style delivery ticks: one check = sent, double check = delivered/read.
|
|
11
|
+
* Color the read state with the accent (or a brighter shade on colored bubbles).
|
|
12
|
+
*/
|
|
13
|
+
export declare const Ticks: ({ double, color, size }: TicksProps) => React.JSX.Element;
|
|
14
|
+
export interface PendingClockProps {
|
|
15
|
+
color: string;
|
|
16
|
+
size?: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* A minimal clock-outline icon for the "pending" (sending) state, replacing the
|
|
20
|
+
* old "🕓" emoji. The hands rotate continuously while the message is sending,
|
|
21
|
+
* mirroring Telegram's spinning clock. Respects the system reduce-motion
|
|
22
|
+
* setting (the hands simply hold still).
|
|
23
|
+
*/
|
|
24
|
+
export declare const PendingClock: ({ color, size }: PendingClockProps) => React.JSX.Element;
|
|
25
|
+
//# sourceMappingURL=Ticks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Ticks.d.ts","sourceRoot":"","sources":["../../src/components/Ticks.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6B,MAAM,OAAO,CAAA;AA2BjD,MAAM,WAAW,UAAU;IACzB,iFAAiF;IACjF,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;;GAGG;AACH,eAAO,MAAM,KAAK,GAAI,yBAAqC,UAAU,sBASpE,CAAA;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GAAI,iBAAsB,iBAAiB,sBA0BnE,CAAA"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import React, { useEffect, useMemo } from 'react';
|
|
2
|
+
import { StyleSheet, View } from 'react-native';
|
|
3
|
+
import Animated, { Easing, ReduceMotion, cancelAnimation, useAnimatedStyle, useSharedValue, withRepeat, withTiming, } from 'react-native-reanimated';
|
|
4
|
+
/**
|
|
5
|
+
* A single checkmark drawn with two borders rotated 45deg - no SVG dependency.
|
|
6
|
+
* Replaces the old literal "✓" glyph so the tick is crisp at any size and color.
|
|
7
|
+
*/
|
|
8
|
+
const Check = ({ color, size, style }) => {
|
|
9
|
+
const styles = useMemo(() => createCheckStyles(color, size), [color, size]);
|
|
10
|
+
return <View style={[styles.check, style]}/>;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Telegram-style delivery ticks: one check = sent, double check = delivered/read.
|
|
14
|
+
* Color the read state with the accent (or a brighter shade on colored bubbles).
|
|
15
|
+
*/
|
|
16
|
+
export const Ticks = ({ double = false, color, size = 9 }) => {
|
|
17
|
+
const styles = useMemo(() => createTicksStyles(size), [size]);
|
|
18
|
+
return (<View style={styles.row}>
|
|
19
|
+
<Check color={color} size={size}/>
|
|
20
|
+
{double && <Check color={color} size={size} style={styles.secondCheck}/>}
|
|
21
|
+
</View>);
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* A minimal clock-outline icon for the "pending" (sending) state, replacing the
|
|
25
|
+
* old "🕓" emoji. The hands rotate continuously while the message is sending,
|
|
26
|
+
* mirroring Telegram's spinning clock. Respects the system reduce-motion
|
|
27
|
+
* setting (the hands simply hold still).
|
|
28
|
+
*/
|
|
29
|
+
export const PendingClock = ({ color, size = 11 }) => {
|
|
30
|
+
const styles = useMemo(() => createClockStyles(color, size), [color, size]);
|
|
31
|
+
const rotation = useSharedValue(0);
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
rotation.value = withRepeat(withTiming(360, { duration: 1200, easing: Easing.linear, reduceMotion: ReduceMotion.System }), -1, false);
|
|
34
|
+
return () => cancelAnimation(rotation);
|
|
35
|
+
}, [rotation]);
|
|
36
|
+
const handsStyle = useAnimatedStyle(() => ({
|
|
37
|
+
transform: [{ rotate: `${rotation.value}deg` }],
|
|
38
|
+
}));
|
|
39
|
+
return (<View style={styles.face}>
|
|
40
|
+
<Animated.View style={[styles.hands, StyleSheet.absoluteFill, handsStyle]}>
|
|
41
|
+
<View style={styles.minuteHand}/>
|
|
42
|
+
<View style={styles.hourHand}/>
|
|
43
|
+
</Animated.View>
|
|
44
|
+
</View>);
|
|
45
|
+
};
|
|
46
|
+
const createCheckStyles = (color, size) => {
|
|
47
|
+
const thickness = Math.max(1.5, Math.round(size * 0.16));
|
|
48
|
+
return StyleSheet.create({
|
|
49
|
+
check: {
|
|
50
|
+
width: size * 0.55,
|
|
51
|
+
height: size,
|
|
52
|
+
borderColor: color,
|
|
53
|
+
borderRightWidth: thickness,
|
|
54
|
+
borderBottomWidth: thickness,
|
|
55
|
+
transform: [{ rotate: '45deg' }],
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
const createTicksStyles = (size) => StyleSheet.create({
|
|
60
|
+
row: {
|
|
61
|
+
flexDirection: 'row',
|
|
62
|
+
alignItems: 'center',
|
|
63
|
+
justifyContent: 'center',
|
|
64
|
+
height: size + 2,
|
|
65
|
+
},
|
|
66
|
+
secondCheck: {
|
|
67
|
+
marginLeft: -size * 0.35,
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
const createClockStyles = (color, size) => {
|
|
71
|
+
const hand = Math.max(1, Math.round(size * 0.09));
|
|
72
|
+
return StyleSheet.create({
|
|
73
|
+
face: {
|
|
74
|
+
width: size,
|
|
75
|
+
height: size,
|
|
76
|
+
borderRadius: size / 2,
|
|
77
|
+
borderColor: color,
|
|
78
|
+
borderWidth: hand,
|
|
79
|
+
alignItems: 'center',
|
|
80
|
+
justifyContent: 'center',
|
|
81
|
+
},
|
|
82
|
+
hands: {
|
|
83
|
+
alignItems: 'center',
|
|
84
|
+
justifyContent: 'center',
|
|
85
|
+
},
|
|
86
|
+
minuteHand: {
|
|
87
|
+
position: 'absolute',
|
|
88
|
+
width: hand,
|
|
89
|
+
height: size * 0.32,
|
|
90
|
+
backgroundColor: color,
|
|
91
|
+
bottom: '50%',
|
|
92
|
+
},
|
|
93
|
+
hourHand: {
|
|
94
|
+
position: 'absolute',
|
|
95
|
+
height: hand,
|
|
96
|
+
width: size * 0.24,
|
|
97
|
+
backgroundColor: color,
|
|
98
|
+
left: '50%',
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
};
|
|
102
|
+
//# sourceMappingURL=Ticks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Ticks.js","sourceRoot":"","sources":["../../src/components/Ticks.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface VideoNoteOverlayProps {
|
|
3
|
+
/** Diameter of the note this overlays. */
|
|
4
|
+
size: number;
|
|
5
|
+
/** Playback position, 0..1. */
|
|
6
|
+
progress: number;
|
|
7
|
+
isMuted: boolean;
|
|
8
|
+
isPlaying: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Chrome drawn *on* a round video note: the progress ring sweeping its edge, a
|
|
12
|
+
* mute badge while it is silent, and a stop target once it is playing.
|
|
13
|
+
*
|
|
14
|
+
* The duration is deliberately not here - Telegram renders it under the circle
|
|
15
|
+
* on the chat background, so it lives in `MessageVideo` beside the note.
|
|
16
|
+
*
|
|
17
|
+
* Non-interactive: the note's own press target handles taps.
|
|
18
|
+
*/
|
|
19
|
+
export declare function VideoNoteOverlay({ size, progress, isMuted, isPlaying, }: VideoNoteOverlayProps): React.JSX.Element;
|
|
20
|
+
/** Duration and unwatched dot, rendered under the note on the chat background. */
|
|
21
|
+
export declare function VideoNoteMeta({ duration, isWatched, }: {
|
|
22
|
+
duration?: number;
|
|
23
|
+
isWatched: boolean;
|
|
24
|
+
}): React.JSX.Element | null;
|
|
25
|
+
//# sourceMappingURL=VideoNoteOverlay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VideoNoteOverlay.d.ts","sourceRoot":"","sources":["../../src/components/VideoNoteOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAA;AAwCtC,MAAM,WAAW,qBAAqB;IACpC,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAA;IACZ,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,OAAO,CAAA;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAE,EAChC,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,SAAS,GACV,EAAE,qBAAqB,qBAwCvB;AAED,kFAAkF;AAClF,wBAAgB,aAAa,CAAE,EAC7B,QAAQ,EACR,SAAS,GACV,EAAE;IACD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,OAAO,CAAA;CACnB,4BAUA"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import React, { useMemo } from 'react';
|
|
2
|
+
import { StyleSheet, Text, View } from 'react-native';
|
|
3
|
+
import { CloseIcon } from './MediaControls';
|
|
4
|
+
// Optional SVG, used to draw the circular progress ring. When absent the note
|
|
5
|
+
// still plays, just without the ring - the same optional-require pattern the
|
|
6
|
+
// recorder uses.
|
|
7
|
+
let Svg = null;
|
|
8
|
+
let SvgCircle = null;
|
|
9
|
+
try {
|
|
10
|
+
const svg = require('react-native-svg');
|
|
11
|
+
Svg = svg.Svg ?? svg.default;
|
|
12
|
+
SvgCircle = svg.Circle;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
Svg = null;
|
|
16
|
+
SvgCircle = null;
|
|
17
|
+
}
|
|
18
|
+
const formatTime = (seconds) => {
|
|
19
|
+
if (!Number.isFinite(seconds) || seconds < 0)
|
|
20
|
+
seconds = 0;
|
|
21
|
+
const mins = Math.floor(seconds / 60);
|
|
22
|
+
const secs = Math.floor(seconds % 60);
|
|
23
|
+
return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
|
|
24
|
+
};
|
|
25
|
+
/** A speaker glyph, crossed through when muted. */
|
|
26
|
+
const SpeakerIcon = ({ size = 14, isMuted }) => {
|
|
27
|
+
const styles = useMemo(() => createSpeakerStyles(size), [size]);
|
|
28
|
+
return (<View style={styles.wrapper}>
|
|
29
|
+
<View style={styles.body}/>
|
|
30
|
+
<View style={styles.cone}/>
|
|
31
|
+
{isMuted && <View style={styles.slash}/>}
|
|
32
|
+
</View>);
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Chrome drawn *on* a round video note: the progress ring sweeping its edge, a
|
|
36
|
+
* mute badge while it is silent, and a stop target once it is playing.
|
|
37
|
+
*
|
|
38
|
+
* The duration is deliberately not here - Telegram renders it under the circle
|
|
39
|
+
* on the chat background, so it lives in `MessageVideo` beside the note.
|
|
40
|
+
*
|
|
41
|
+
* Non-interactive: the note's own press target handles taps.
|
|
42
|
+
*/
|
|
43
|
+
export function VideoNoteOverlay({ size, progress, isMuted, isPlaying, }) {
|
|
44
|
+
const stroke = 3;
|
|
45
|
+
const radius = size / 2 - stroke / 2;
|
|
46
|
+
const circumference = 2 * Math.PI * radius;
|
|
47
|
+
const clamped = Math.max(0, Math.min(1, progress));
|
|
48
|
+
return (<View style={StyleSheet.absoluteFill} pointerEvents='none'>
|
|
49
|
+
{SvgCircle && clamped > 0 && (<Svg width={size} height={size} style={StyleSheet.absoluteFill}>
|
|
50
|
+
{/* Only the elapsed arc, no track - matching Telegram. */}
|
|
51
|
+
<SvgCircle cx={size / 2} cy={size / 2} r={radius} stroke='#FFFFFF' strokeWidth={stroke} fill='none' strokeLinecap='round' strokeDasharray={circumference} strokeDashoffset={circumference * (1 - clamped)} transform={`rotate(-90 ${size / 2} ${size / 2})`}/>
|
|
52
|
+
</Svg>)}
|
|
53
|
+
|
|
54
|
+
{isPlaying
|
|
55
|
+
? (
|
|
56
|
+
// Playing: a stop target in the middle, as Telegram shows.
|
|
57
|
+
<View style={styles.centerBadge}>
|
|
58
|
+
<CloseIcon color='#fff' size={18}/>
|
|
59
|
+
</View>)
|
|
60
|
+
: isMuted && (<View style={styles.muteBadge}>
|
|
61
|
+
<SpeakerIcon isMuted size={14}/>
|
|
62
|
+
</View>)}
|
|
63
|
+
</View>);
|
|
64
|
+
}
|
|
65
|
+
/** Duration and unwatched dot, rendered under the note on the chat background. */
|
|
66
|
+
export function VideoNoteMeta({ duration, isWatched, }) {
|
|
67
|
+
if (duration == null)
|
|
68
|
+
return null;
|
|
69
|
+
return (<View style={styles.metaRow}>
|
|
70
|
+
<Text style={styles.metaText}>{formatTime(duration)}</Text>
|
|
71
|
+
{!isWatched && <View style={styles.unwatchedDot}/>}
|
|
72
|
+
</View>);
|
|
73
|
+
}
|
|
74
|
+
const styles = StyleSheet.create({
|
|
75
|
+
centerBadge: {
|
|
76
|
+
position: 'absolute',
|
|
77
|
+
alignSelf: 'center',
|
|
78
|
+
top: '50%',
|
|
79
|
+
marginTop: -22,
|
|
80
|
+
width: 44,
|
|
81
|
+
height: 44,
|
|
82
|
+
borderRadius: 22,
|
|
83
|
+
backgroundColor: 'rgba(0, 0, 0, 0.45)',
|
|
84
|
+
alignItems: 'center',
|
|
85
|
+
justifyContent: 'center',
|
|
86
|
+
},
|
|
87
|
+
muteBadge: {
|
|
88
|
+
position: 'absolute',
|
|
89
|
+
bottom: 16,
|
|
90
|
+
alignSelf: 'center',
|
|
91
|
+
width: 28,
|
|
92
|
+
height: 28,
|
|
93
|
+
borderRadius: 14,
|
|
94
|
+
backgroundColor: 'rgba(0, 0, 0, 0.45)',
|
|
95
|
+
alignItems: 'center',
|
|
96
|
+
justifyContent: 'center',
|
|
97
|
+
},
|
|
98
|
+
metaRow: {
|
|
99
|
+
flexDirection: 'row',
|
|
100
|
+
alignItems: 'center',
|
|
101
|
+
gap: 6,
|
|
102
|
+
marginTop: 6,
|
|
103
|
+
alignSelf: 'center',
|
|
104
|
+
},
|
|
105
|
+
metaText: {
|
|
106
|
+
fontSize: 13,
|
|
107
|
+
color: 'rgba(0, 0, 0, 0.45)',
|
|
108
|
+
fontVariant: ['tabular-nums'],
|
|
109
|
+
},
|
|
110
|
+
// Telegram marks a note you have not played yet with a small accent dot.
|
|
111
|
+
unwatchedDot: {
|
|
112
|
+
width: 6,
|
|
113
|
+
height: 6,
|
|
114
|
+
borderRadius: 3,
|
|
115
|
+
backgroundColor: '#3390EC',
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
const createSpeakerStyles = (size) => StyleSheet.create({
|
|
119
|
+
wrapper: {
|
|
120
|
+
width: size,
|
|
121
|
+
height: size,
|
|
122
|
+
alignItems: 'center',
|
|
123
|
+
justifyContent: 'center',
|
|
124
|
+
flexDirection: 'row',
|
|
125
|
+
},
|
|
126
|
+
body: {
|
|
127
|
+
width: size * 0.3,
|
|
128
|
+
height: size * 0.42,
|
|
129
|
+
backgroundColor: '#FFFFFF',
|
|
130
|
+
},
|
|
131
|
+
cone: {
|
|
132
|
+
width: 0,
|
|
133
|
+
height: 0,
|
|
134
|
+
borderTopWidth: size * 0.42,
|
|
135
|
+
borderBottomWidth: size * 0.42,
|
|
136
|
+
borderRightWidth: size * 0.34,
|
|
137
|
+
borderTopColor: 'transparent',
|
|
138
|
+
borderBottomColor: 'transparent',
|
|
139
|
+
borderRightColor: '#FFFFFF',
|
|
140
|
+
transform: [{ rotate: '180deg' }],
|
|
141
|
+
},
|
|
142
|
+
slash: {
|
|
143
|
+
position: 'absolute',
|
|
144
|
+
width: size * 1.1,
|
|
145
|
+
height: 1.5,
|
|
146
|
+
borderRadius: 1,
|
|
147
|
+
backgroundColor: '#FFFFFF',
|
|
148
|
+
transform: [{ rotate: '-45deg' }],
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
//# sourceMappingURL=VideoNoteOverlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VideoNoteOverlay.js","sourceRoot":"","sources":["../../src/components/VideoNoteOverlay.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { IMessage, VideoRecordingProps } from '../Models';
|
|
3
|
+
export declare const isVisionCameraAvailable: boolean;
|
|
4
|
+
export declare const isVisionCameraNativeReady: boolean;
|
|
5
|
+
export interface VideoNoteRecorderProps<TMessage extends IMessage = IMessage> {
|
|
6
|
+
config?: VideoRecordingProps;
|
|
7
|
+
onClose: () => void;
|
|
8
|
+
onSend?: (message: Partial<TMessage>, shouldResetInputToolbar: boolean) => void;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Telegram-style round video note recorder: records the front camera into a
|
|
12
|
+
* circular preview. When react-native-vision-camera's native module is missing
|
|
13
|
+
* (a simulator, or a binary built before the dependency was added) it shows an
|
|
14
|
+
* unavailable state with the shutter disabled rather than fabricating a note.
|
|
15
|
+
* The two paths are separate components so the vision-camera hooks are only ever
|
|
16
|
+
* called when the native module is present (no crash, stable hook order).
|
|
17
|
+
*/
|
|
18
|
+
export declare function VideoNoteRecorder<TMessage extends IMessage = IMessage>(props: VideoNoteRecorderProps<TMessage>): React.JSX.Element;
|
|
19
|
+
//# sourceMappingURL=VideoNoteRecorder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VideoNoteRecorder.d.ts","sourceRoot":"","sources":["../../src/components/VideoNoteRecorder.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAA;AAOhF,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AA2BzD,eAAO,MAAM,uBAAuB,SAAyB,CAAA;AAO7D,eAAO,MAAM,yBAAyB,SASlC,CAAA;AA0BJ,MAAM,WAAW,sBAAsB,CAAC,QAAQ,SAAS,QAAQ,GAAG,QAAQ;IAC1E,MAAM,CAAC,EAAE,mBAAmB,CAAA;IAC5B,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,MAAM,CAAC,EAAE,CACP,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,EAC1B,uBAAuB,EAAE,OAAO,KAC7B,IAAI,CAAA;CACV;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,SAAS,QAAQ,GAAG,QAAQ,EACpE,KAAK,EAAE,sBAAsB,CAAC,QAAQ,CAAC,qBAKxC"}
|