@kesha-antonov/react-native-chat 4.1.0 → 4.3.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 +306 -62
- 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 +22 -27
- package/lib/Avatar.js.map +1 -1
- package/lib/Bubble/index.d.ts.map +1 -1
- package/lib/Bubble/index.js +138 -37
- package/lib/Bubble/index.js.map +1 -1
- package/lib/Bubble/styles.d.ts +47 -11
- package/lib/Bubble/styles.d.ts.map +1 -1
- package/lib/Bubble/styles.js +108 -57
- package/lib/Bubble/styles.js.map +1 -1
- package/lib/Bubble/types.d.ts +16 -1
- package/lib/Bubble/types.d.ts.map +1 -1
- package/lib/Chat/ChatKeyboardAvoidingView.d.ts +21 -0
- package/lib/Chat/ChatKeyboardAvoidingView.d.ts.map +1 -0
- package/lib/Chat/ChatKeyboardAvoidingView.js +15 -0
- package/lib/Chat/ChatKeyboardAvoidingView.js.map +1 -0
- package/lib/Chat/index.d.ts.map +1 -1
- package/lib/Chat/index.js +81 -28
- package/lib/Chat/index.js.map +1 -1
- package/lib/Chat/types.d.ts +36 -6
- 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 +29 -1
- package/lib/ChatContext.d.ts.map +1 -1
- package/lib/ChatContext.js +3 -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 +63 -50
- package/lib/Composer.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 +223 -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 +10 -9
- package/lib/Message/index.js.map +1 -1
- package/lib/Message/styles.d.ts +1 -4
- package/lib/Message/styles.d.ts.map +1 -1
- package/lib/Message/styles.js +4 -4
- 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/FlashList.d.ts +9 -0
- package/lib/MessagesContainer/FlashList.d.ts.map +1 -0
- package/lib/MessagesContainer/FlashList.js +23 -0
- package/lib/MessagesContainer/FlashList.js.map +1 -0
- 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 +133 -42
- package/lib/MessagesContainer/index.js.map +1 -1
- package/lib/MessagesContainer/styles.d.ts +23 -7
- package/lib/MessagesContainer/styles.d.ts.map +1 -1
- package/lib/MessagesContainer/styles.js +25 -9
- package/lib/MessagesContainer/styles.js.map +1 -1
- package/lib/MessagesContainer/types.d.ts +22 -2
- package/lib/MessagesContainer/types.d.ts.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 +148 -0
- package/lib/Theme.d.ts.map +1 -0
- package/lib/Theme.js +142 -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 +523 -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 +36 -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 +396 -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/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/useHasKeyboardProvider.d.ts +19 -0
- package/lib/hooks/useHasKeyboardProvider.d.ts.map +1 -0
- package/lib/hooks/useHasKeyboardProvider.js +31 -0
- package/lib/hooks/useHasKeyboardProvider.js.map +1 -0
- 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/useIsKeyboardVisible.d.ts +12 -0
- package/lib/hooks/useIsKeyboardVisible.d.ts.map +1 -0
- package/lib/hooks/useIsKeyboardVisible.js +31 -0
- package/lib/hooks/useIsKeyboardVisible.js.map +1 -0
- package/lib/hooks/useKeyboardVerticalOffset.d.ts +28 -0
- package/lib/hooks/useKeyboardVerticalOffset.d.ts.map +1 -0
- package/lib/hooks/useKeyboardVerticalOffset.js +43 -0
- package/lib/hooks/useKeyboardVerticalOffset.js.map +1 -0
- 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 +59 -0
- package/lib/i18n.d.ts.map +1 -0
- package/lib/i18n.js +122 -0
- package/lib/i18n.js.map +1 -0
- package/lib/index.d.ts +17 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +17 -0
- package/lib/index.js.map +1 -1
- package/lib/types.d.ts +2 -1
- package/lib/types.d.ts.map +1 -1
- package/package.json +103 -41
- 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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VideoNoteRecorder.js","sourceRoot":"","sources":["../../src/components/VideoNoteRecorder.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { IMessage, VideoRecordingProps } from '../Models';
|
|
3
|
+
export declare const isVideoRecordingAvailable: boolean;
|
|
4
|
+
export interface VideoRecordButtonProps<TMessage extends IMessage = IMessage> {
|
|
5
|
+
config?: VideoRecordingProps;
|
|
6
|
+
onSend?: (message: Partial<TMessage>, shouldResetInputToolbar: boolean) => void;
|
|
7
|
+
/**
|
|
8
|
+
* Single tap on the button. Set when the control shares the right slot with
|
|
9
|
+
* the mic: a tap switches back to voice, a hold opens the recorder.
|
|
10
|
+
*/
|
|
11
|
+
onTap?: () => void;
|
|
12
|
+
/**
|
|
13
|
+
* `inset` (default) is the small glyph inside the composer field; `round` is
|
|
14
|
+
* the filled accent circle that occupies the right slot beside it.
|
|
15
|
+
*/
|
|
16
|
+
variant?: 'inset' | 'round';
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Camera button for video messages. Prefers react-native-vision-camera for a
|
|
20
|
+
* Telegram-style round video note recorder; falls back to expo-image-picker's
|
|
21
|
+
* system camera. Only rendered when one of those is installed.
|
|
22
|
+
*
|
|
23
|
+
* Note the two backends produce different messages: the round recorder sends
|
|
24
|
+
* `{ video, videoNote: true }` (a circular note), while the system-camera
|
|
25
|
+
* fallback sends a plain `{ video }` full-frame clip, because a rectangular
|
|
26
|
+
* capture would crop badly into a circle.
|
|
27
|
+
*/
|
|
28
|
+
export declare function VideoRecordButton<TMessage extends IMessage = IMessage>({ config, onSend, onTap, variant, }: VideoRecordButtonProps<TMessage>): React.JSX.Element;
|
|
29
|
+
//# sourceMappingURL=VideoRecordButton.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VideoRecordButton.d.ts","sourceRoot":"","sources":["../../src/components/VideoRecordButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgC,MAAM,OAAO,CAAA;AAIpD,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAyBzD,eAAO,MAAM,yBAAyB,SAA8D,CAAA;AAEpG,MAAM,WAAW,sBAAsB,CAAC,QAAQ,SAAS,QAAQ,GAAG,QAAQ;IAC1E,MAAM,CAAC,EAAE,mBAAmB,CAAA;IAC5B,MAAM,CAAC,EAAE,CACP,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,EAC1B,uBAAuB,EAAE,OAAO,KAC7B,IAAI,CAAA;IACT;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,IAAI,CAAA;IAClB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAA;CAC5B;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,SAAS,QAAQ,GAAG,QAAQ,EAAG,EACvE,MAAM,EACN,MAAM,EACN,KAAK,EACL,OAAiB,GAClB,EAAE,sBAAsB,CAAC,QAAQ,CAAC,qBA2FlC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import React, { useCallback, useState } from 'react';
|
|
2
|
+
import { Modal, Pressable, StyleSheet } from 'react-native';
|
|
3
|
+
import { useThemedStyles } from '../hooks/useTheme';
|
|
4
|
+
import { Icon } from './Icon';
|
|
5
|
+
import { CameraIcon } from './MediaControls';
|
|
6
|
+
import { VideoNoteRecorder, isVisionCameraAvailable, isVisionCameraNativeReady } from './VideoNoteRecorder';
|
|
7
|
+
// Optional camera-roll/launcher fallback. Resolved through a try/catch require.
|
|
8
|
+
let imagePicker = null;
|
|
9
|
+
try {
|
|
10
|
+
imagePicker = require('expo-image-picker');
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
imagePicker = null;
|
|
14
|
+
}
|
|
15
|
+
// Optional expo-device, used only to detect a simulator/emulator. The system
|
|
16
|
+
// camera (UIImagePickerController) throws an uncaught native exception on the
|
|
17
|
+
// iOS simulator ("No available types for source 1") that can't be caught in JS,
|
|
18
|
+
// so we skip launching it there and surface an error instead of crashing.
|
|
19
|
+
let device = null;
|
|
20
|
+
try {
|
|
21
|
+
device = require('expo-device');
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
device = null;
|
|
25
|
+
}
|
|
26
|
+
export const isVideoRecordingAvailable = isVisionCameraAvailable || !!imagePicker?.launchCameraAsync;
|
|
27
|
+
/**
|
|
28
|
+
* Camera button for video messages. Prefers react-native-vision-camera for a
|
|
29
|
+
* Telegram-style round video note recorder; falls back to expo-image-picker's
|
|
30
|
+
* system camera. Only rendered when one of those is installed.
|
|
31
|
+
*
|
|
32
|
+
* Note the two backends produce different messages: the round recorder sends
|
|
33
|
+
* `{ video, videoNote: true }` (a circular note), while the system-camera
|
|
34
|
+
* fallback sends a plain `{ video }` full-frame clip, because a rectangular
|
|
35
|
+
* capture would crop badly into a circle.
|
|
36
|
+
*/
|
|
37
|
+
export function VideoRecordButton({ config, onSend, onTap, variant = 'inset', }) {
|
|
38
|
+
const styles = useThemedStyles(createStyles);
|
|
39
|
+
const [isRecorderOpen, setIsRecorderOpen] = useState(false);
|
|
40
|
+
const launchPicker = useCallback(async () => {
|
|
41
|
+
// expo-image-picker's system camera hard-crashes on a simulator/emulator
|
|
42
|
+
// (no camera hardware). Surface a catchable error instead of crashing.
|
|
43
|
+
if (device && device.isDevice === false) {
|
|
44
|
+
config?.onError?.(new Error('Camera is not available on a simulator/emulator. Use a physical device.'));
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
const permission = await imagePicker.requestCameraPermissionsAsync();
|
|
49
|
+
if (!permission?.granted) {
|
|
50
|
+
config?.onPermissionDenied?.();
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const mediaTypes = imagePicker.MediaTypeOptions?.Videos ?? ['videos'];
|
|
54
|
+
const result = await imagePicker.launchCameraAsync({
|
|
55
|
+
mediaTypes,
|
|
56
|
+
videoMaxDuration: config?.maxDuration ?? 60,
|
|
57
|
+
quality: 1,
|
|
58
|
+
});
|
|
59
|
+
const uri = result?.assets?.[0]?.uri;
|
|
60
|
+
if (!result?.canceled && uri)
|
|
61
|
+
onSend?.({ video: uri }, false);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
config?.onError?.(error);
|
|
65
|
+
}
|
|
66
|
+
}, [config, onSend]);
|
|
67
|
+
// Gate on the *native* probe, not the JS require: a binary where the package
|
|
68
|
+
// is installed but not linked would otherwise open a recorder that can never
|
|
69
|
+
// capture, instead of falling back to the system camera.
|
|
70
|
+
const handlePress = useCallback(() => {
|
|
71
|
+
if (isVisionCameraNativeReady)
|
|
72
|
+
setIsRecorderOpen(true);
|
|
73
|
+
else if (imagePicker?.launchCameraAsync)
|
|
74
|
+
launchPicker();
|
|
75
|
+
else
|
|
76
|
+
setIsRecorderOpen(true);
|
|
77
|
+
}, [launchPicker]);
|
|
78
|
+
const isRound = variant === 'round';
|
|
79
|
+
return (<>
|
|
80
|
+
<Pressable
|
|
81
|
+
// Sharing the slot with the mic: tap toggles back to voice, a long press
|
|
82
|
+
// opens the recorder - the same tap/hold split the mic uses.
|
|
83
|
+
onPress={onTap ?? handlePress} onLongPress={onTap ? handlePress : undefined} delayLongPress={180} accessibilityRole='button' accessibilityLabel={onTap ? 'switch to voice message' : 'record video message'} hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }} style={isRound ? styles.roundButton : styles.button}>
|
|
84
|
+
<Icon name='camera' color={isRound ? '#fff' : styles.iconColor.color} size={22} fallback={<CameraIcon color={isRound ? '#fff' : styles.iconColor.color} size={22}/>}/>
|
|
85
|
+
</Pressable>
|
|
86
|
+
|
|
87
|
+
{isVisionCameraAvailable && (<Modal visible={isRecorderOpen}
|
|
88
|
+
// Transparent + fade so the recorder's scrim dims the conversation
|
|
89
|
+
// rather than replacing it, which is what Telegram shows.
|
|
90
|
+
transparent animationType='fade' onRequestClose={() => setIsRecorderOpen(false)} statusBarTranslucent>
|
|
91
|
+
{isRecorderOpen && (<VideoNoteRecorder config={config} onSend={onSend} onClose={() => setIsRecorderOpen(false)}/>)}
|
|
92
|
+
</Modal>)}
|
|
93
|
+
</>);
|
|
94
|
+
}
|
|
95
|
+
const createStyles = (theme) => StyleSheet.create({
|
|
96
|
+
// Inset camera control, bottom-aligned inside the field group.
|
|
97
|
+
button: {
|
|
98
|
+
alignItems: 'center',
|
|
99
|
+
justifyContent: 'center',
|
|
100
|
+
paddingBottom: 8,
|
|
101
|
+
},
|
|
102
|
+
// Carries the themed icon color (StyleSheet keeps it out of JSX).
|
|
103
|
+
iconColor: {
|
|
104
|
+
color: theme.colors.incomingMeta,
|
|
105
|
+
},
|
|
106
|
+
// Right-slot form: matches the mic/send circle so the swap doesn't shift the row.
|
|
107
|
+
roundButton: {
|
|
108
|
+
width: theme.sendButton.size,
|
|
109
|
+
height: theme.sendButton.size,
|
|
110
|
+
borderRadius: theme.radii.sendButton,
|
|
111
|
+
backgroundColor: theme.colors.accent,
|
|
112
|
+
alignItems: 'center',
|
|
113
|
+
justifyContent: 'center',
|
|
114
|
+
alignSelf: 'center',
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
//# sourceMappingURL=VideoRecordButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VideoRecordButton.js","sourceRoot":"","sources":["../../src/components/VideoRecordButton.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { AudioRecordingProps, IMessage } from '../Models';
|
|
3
|
+
export declare const isVoiceRecordingAvailable: boolean;
|
|
4
|
+
export declare const formatElapsed: (ms: number) => string;
|
|
5
|
+
/** Live recording state surfaced to the InputToolbar so it can render the bar. */
|
|
6
|
+
export interface VoiceRecordingState {
|
|
7
|
+
active: boolean;
|
|
8
|
+
locked: boolean;
|
|
9
|
+
elapsed: number;
|
|
10
|
+
cancelArmed: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Recent microphone amplitudes, 0..1, oldest first. Drives the live waveform
|
|
13
|
+
* the toolbar draws while a recording is locked.
|
|
14
|
+
*/
|
|
15
|
+
levels: number[];
|
|
16
|
+
}
|
|
17
|
+
export interface VoiceMessageInputHandle {
|
|
18
|
+
/** Discard the in-progress recording (used by the bar's Cancel button). */
|
|
19
|
+
cancel: () => void;
|
|
20
|
+
}
|
|
21
|
+
export interface VoiceMessageInputProps {
|
|
22
|
+
config?: AudioRecordingProps;
|
|
23
|
+
onSend?: (message: Partial<IMessage>, shouldResetInputToolbar: boolean) => void;
|
|
24
|
+
/** Reports recording state up so the toolbar can draw the timer/cancel bar. */
|
|
25
|
+
onStateChange?: (state: VoiceRecordingState) => void;
|
|
26
|
+
/**
|
|
27
|
+
* Single tap on the mic. When provided, the control switches to tap-to-toggle
|
|
28
|
+
* (voice <-> video) and only records once the press is held, matching Telegram.
|
|
29
|
+
*/
|
|
30
|
+
onTap?: () => void;
|
|
31
|
+
}
|
|
32
|
+
export declare const VoiceMessageInput: React.ForwardRefExoticComponent<VoiceMessageInputProps & React.RefAttributes<VoiceMessageInputHandle>>;
|
|
33
|
+
//# sourceMappingURL=VoiceMessageInput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VoiceMessageInput.d.ts","sourceRoot":"","sources":["../../src/components/VoiceMessageInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAQN,MAAM,OAAO,CAAA;AAcd,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAgBzD,eAAO,MAAM,yBAAyB,SAIrC,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,IAAI,MAAM,WAKvC,CAAA;AAED,kFAAkF;AAClF,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,OAAO,CAAA;IACpB;;;OAGG;IACH,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB;AAmBD,MAAM,WAAW,uBAAuB;IACtC,2EAA2E;IAC3E,MAAM,EAAE,MAAM,IAAI,CAAA;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,mBAAmB,CAAA;IAC5B,MAAM,CAAC,EAAE,CACP,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,EAC1B,uBAAuB,EAAE,OAAO,KAC7B,IAAI,CAAA;IACT,+EAA+E;IAC/E,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAA;IACpD;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,IAAI,CAAA;CACnB;AAsYD,eAAO,MAAM,iBAAiB,wGAAqC,CAAA"}
|
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState, } from 'react';
|
|
2
|
+
import { Pressable, StyleSheet, View } from 'react-native';
|
|
3
|
+
import { Gesture, GestureDetector } from 'react-native-gesture-handler';
|
|
4
|
+
import Animated, { ReduceMotion, cancelAnimation, interpolate, runOnJS, useAnimatedStyle, useSharedValue, withTiming, } from 'react-native-reanimated';
|
|
5
|
+
import { useTheme, useThemedStyles } from '../hooks/useTheme';
|
|
6
|
+
import { Icon } from './Icon';
|
|
7
|
+
import { ChevronIcon, LockIcon, MicIcon } from './MediaControls';
|
|
8
|
+
import { SendIcon } from './SendIcon';
|
|
9
|
+
// Optional recorder. Resolved through a try/catch require so the bundle works
|
|
10
|
+
// whether or not the consumer installed `expo-audio` (Metro treats
|
|
11
|
+
// try/catch-wrapped requires as optional dependencies).
|
|
12
|
+
let expoAudio = null;
|
|
13
|
+
try {
|
|
14
|
+
expoAudio = require('expo-audio');
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
expoAudio = null;
|
|
18
|
+
}
|
|
19
|
+
export const isVoiceRecordingAvailable = !!(expoAudio?.useAudioRecorder &&
|
|
20
|
+
expoAudio?.RecordingPresets &&
|
|
21
|
+
expoAudio?.AudioModule);
|
|
22
|
+
export const formatElapsed = (ms) => {
|
|
23
|
+
const total = Math.floor(ms / 1000);
|
|
24
|
+
const mins = Math.floor(total / 60);
|
|
25
|
+
const secs = total % 60;
|
|
26
|
+
return `${mins}:${secs.toString().padStart(2, '0')}`;
|
|
27
|
+
};
|
|
28
|
+
/** How many amplitude samples the live waveform keeps. */
|
|
29
|
+
const LEVEL_HISTORY = 48;
|
|
30
|
+
/** Metering floor in dB; anything quieter reads as silence. */
|
|
31
|
+
const METERING_FLOOR_DB = -60;
|
|
32
|
+
/** Map an expo-audio metering value (dB) onto a 0..1 bar height. */
|
|
33
|
+
const normalizeMetering = (db) => {
|
|
34
|
+
if (db == null || !Number.isFinite(db))
|
|
35
|
+
return 0;
|
|
36
|
+
const clamped = Math.max(METERING_FLOOR_DB, Math.min(0, db));
|
|
37
|
+
return (clamped - METERING_FLOOR_DB) / -METERING_FLOOR_DB;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Telegram-style hold-to-record voice notes. Hold the mic to record, slide left
|
|
41
|
+
* to cancel, slide up to lock for hands-free recording (release and tap send),
|
|
42
|
+
* or release to send. A release under `minDurationMs` is discarded.
|
|
43
|
+
*
|
|
44
|
+
* This component owns only the right-side control (mic / send button, the lock
|
|
45
|
+
* affordance and the amplitude halo). The recording bar - timer, "slide to
|
|
46
|
+
* cancel" hint - is drawn by the InputToolbar via `onStateChange`, so it can
|
|
47
|
+
* span the full width of the input row. Only mounted when expo-audio is
|
|
48
|
+
* available, so its hooks always run in a stable order.
|
|
49
|
+
*/
|
|
50
|
+
function VoiceMessageInputInner({ config, onSend, onStateChange, onTap }, ref) {
|
|
51
|
+
const styles = useThemedStyles(createStyles);
|
|
52
|
+
const { voice } = useTheme();
|
|
53
|
+
// Metering drives the live waveform and the amplitude halo, so it has to be
|
|
54
|
+
// switched on with the preset - it is off by default.
|
|
55
|
+
const recorderOptions = useMemo(() => ({ ...expoAudio.RecordingPresets.HIGH_QUALITY, isMeteringEnabled: true }), []);
|
|
56
|
+
const recorder = expoAudio.useAudioRecorder(recorderOptions);
|
|
57
|
+
const [isRecording, setIsRecording] = useState(false);
|
|
58
|
+
const [isLocked, setIsLocked] = useState(false);
|
|
59
|
+
const [elapsed, setElapsed] = useState(0);
|
|
60
|
+
const [cancelArmedState, setCancelArmedState] = useState(false);
|
|
61
|
+
const [levels, setLevels] = useState([]);
|
|
62
|
+
const startedAtRef = useRef(0);
|
|
63
|
+
const isRecordingRef = useRef(false);
|
|
64
|
+
const lockedRef = useRef(false);
|
|
65
|
+
const timerRef = useRef(null);
|
|
66
|
+
// `start` is async (permission -> audio mode -> prepare), so a quick tap can
|
|
67
|
+
// release the gesture before the recorder is live. These two refs let the
|
|
68
|
+
// release be remembered and applied once `start` finishes, instead of being
|
|
69
|
+
// dropped and leaving a recording nothing can stop.
|
|
70
|
+
const startTokenRef = useRef(0);
|
|
71
|
+
const pendingFinishRef = useRef(null);
|
|
72
|
+
const minDurationMs = config?.minDurationMs ?? 800;
|
|
73
|
+
const maxDurationMs = config?.maxDurationMs ?? 600000;
|
|
74
|
+
const cancelThreshold = voice.cancelThreshold;
|
|
75
|
+
const lockThreshold = voice.lockThreshold;
|
|
76
|
+
const maxSlide = -(cancelThreshold + 60);
|
|
77
|
+
const lockTravel = lockThreshold + 12;
|
|
78
|
+
const translateX = useSharedValue(0);
|
|
79
|
+
const translateY = useSharedValue(0);
|
|
80
|
+
const cancelArmed = useSharedValue(0);
|
|
81
|
+
const lockProgress = useSharedValue(0);
|
|
82
|
+
const lockedSV = useSharedValue(0);
|
|
83
|
+
const halo = useSharedValue(0);
|
|
84
|
+
// Surface recording state to the toolbar (timer/cancel bar live there).
|
|
85
|
+
useEffect(() => {
|
|
86
|
+
onStateChange?.({ active: isRecording, locked: isLocked, elapsed, cancelArmed: cancelArmedState, levels });
|
|
87
|
+
}, [onStateChange, isRecording, isLocked, elapsed, cancelArmedState, levels]);
|
|
88
|
+
const clearTimer = useCallback(() => {
|
|
89
|
+
if (timerRef.current) {
|
|
90
|
+
clearInterval(timerRef.current);
|
|
91
|
+
timerRef.current = null;
|
|
92
|
+
}
|
|
93
|
+
}, []);
|
|
94
|
+
/** Reads and clears the deferred release, in its own scope so that clearing it
|
|
95
|
+
* inside `start` doesn't narrow the ref to `null` for the later read. */
|
|
96
|
+
const takePendingFinish = useCallback(() => {
|
|
97
|
+
const pending = pendingFinishRef.current;
|
|
98
|
+
pendingFinishRef.current = null;
|
|
99
|
+
return pending;
|
|
100
|
+
}, []);
|
|
101
|
+
// Every gesture-owned shared value, back to rest. This has to run on *end* of
|
|
102
|
+
// a recording rather than in `onFinalize`, because the locked path returns
|
|
103
|
+
// from `onFinalize` early - leaving `cancelArmed` latched would make the next
|
|
104
|
+
// release read as "cancelled" and silently discard that take.
|
|
105
|
+
const resetGesture = useCallback(() => {
|
|
106
|
+
translateX.value = withTiming(0, { duration: 150 });
|
|
107
|
+
translateY.value = withTiming(0, { duration: 150 });
|
|
108
|
+
cancelArmed.value = 0;
|
|
109
|
+
lockProgress.value = 0;
|
|
110
|
+
lockedSV.value = 0;
|
|
111
|
+
}, [translateX, translateY, cancelArmed, lockProgress, lockedSV]);
|
|
112
|
+
// Leaves the audio session as we found it. Recording puts iOS into
|
|
113
|
+
// PlayAndRecord, which routes playback to the quiet receiver; not restoring it
|
|
114
|
+
// makes every voice note played afterwards sound muffled.
|
|
115
|
+
const releaseAudioSession = useCallback(() => {
|
|
116
|
+
try {
|
|
117
|
+
expoAudio.setAudioModeAsync?.({ allowsRecording: false, playsInSilentMode: true });
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// best-effort; the session is not worth failing a send over
|
|
121
|
+
}
|
|
122
|
+
}, []);
|
|
123
|
+
const finish = useCallback(async (cancelled) => {
|
|
124
|
+
if (!isRecordingRef.current) {
|
|
125
|
+
// A release that lands while `start` is still awaiting natives: remember
|
|
126
|
+
// it so `start` can apply it the moment the recorder is actually live.
|
|
127
|
+
if (startTokenRef.current > 0)
|
|
128
|
+
pendingFinishRef.current = { cancelled };
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
isRecordingRef.current = false;
|
|
132
|
+
lockedRef.current = false;
|
|
133
|
+
const duration = Date.now() - startedAtRef.current;
|
|
134
|
+
clearTimer();
|
|
135
|
+
cancelAnimation(halo);
|
|
136
|
+
halo.value = 0;
|
|
137
|
+
resetGesture();
|
|
138
|
+
setIsRecording(false);
|
|
139
|
+
setIsLocked(false);
|
|
140
|
+
setCancelArmedState(false);
|
|
141
|
+
try {
|
|
142
|
+
await recorder.stop();
|
|
143
|
+
const uri = recorder.uri;
|
|
144
|
+
if (cancelled || !uri)
|
|
145
|
+
return;
|
|
146
|
+
if (duration < minDurationMs) {
|
|
147
|
+
config?.onTooShort?.();
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
onSend?.({ audio: uri, duration: Math.round(duration / 1000) }, false);
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
config?.onError?.(error);
|
|
154
|
+
}
|
|
155
|
+
finally {
|
|
156
|
+
releaseAudioSession();
|
|
157
|
+
}
|
|
158
|
+
}, [recorder, minDurationMs, onSend, config, clearTimer, halo, resetGesture, releaseAudioSession]);
|
|
159
|
+
const start = useCallback(async () => {
|
|
160
|
+
if (isRecordingRef.current || startTokenRef.current > 0)
|
|
161
|
+
return;
|
|
162
|
+
const token = Date.now();
|
|
163
|
+
startTokenRef.current = token;
|
|
164
|
+
pendingFinishRef.current = null;
|
|
165
|
+
try {
|
|
166
|
+
const permission = await expoAudio.AudioModule.requestRecordingPermissionsAsync();
|
|
167
|
+
if (!permission?.granted) {
|
|
168
|
+
config?.onPermissionDenied?.();
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
await expoAudio.setAudioModeAsync?.({ allowsRecording: true, playsInSilentMode: true });
|
|
172
|
+
await recorder.prepareToRecordAsync();
|
|
173
|
+
// The component may have unmounted while we were awaiting natives.
|
|
174
|
+
if (startTokenRef.current !== token)
|
|
175
|
+
return;
|
|
176
|
+
recorder.record();
|
|
177
|
+
startedAtRef.current = Date.now();
|
|
178
|
+
isRecordingRef.current = true;
|
|
179
|
+
setElapsed(0);
|
|
180
|
+
setLevels([]);
|
|
181
|
+
setIsRecording(true);
|
|
182
|
+
clearTimer();
|
|
183
|
+
// 100ms keeps the live waveform moving at roughly Telegram's rate while
|
|
184
|
+
// staying cheap; the elapsed label only needs whole seconds.
|
|
185
|
+
timerRef.current = setInterval(() => {
|
|
186
|
+
const ms = Date.now() - startedAtRef.current;
|
|
187
|
+
setElapsed(ms);
|
|
188
|
+
// The halo tracks real loudness rather than pulsing on a fixed loop.
|
|
189
|
+
const level = normalizeMetering(recorder.getStatus?.()?.metering);
|
|
190
|
+
halo.value = withTiming(level, { duration: 120, reduceMotion: ReduceMotion.System });
|
|
191
|
+
setLevels(previous => {
|
|
192
|
+
const next = previous.length >= LEVEL_HISTORY
|
|
193
|
+
? previous.slice(previous.length - LEVEL_HISTORY + 1)
|
|
194
|
+
: previous;
|
|
195
|
+
return [...next, level];
|
|
196
|
+
});
|
|
197
|
+
if (ms >= maxDurationMs)
|
|
198
|
+
finish(false);
|
|
199
|
+
}, 100);
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
config?.onError?.(error);
|
|
203
|
+
isRecordingRef.current = false;
|
|
204
|
+
setIsRecording(false);
|
|
205
|
+
clearTimer();
|
|
206
|
+
releaseAudioSession();
|
|
207
|
+
}
|
|
208
|
+
finally {
|
|
209
|
+
if (startTokenRef.current === token) {
|
|
210
|
+
startTokenRef.current = 0;
|
|
211
|
+
// Apply a release that arrived while we were starting up. Without this
|
|
212
|
+
// a quick tap leaves a live recording with no control to end it.
|
|
213
|
+
const pending = takePendingFinish();
|
|
214
|
+
if (pending)
|
|
215
|
+
finish(pending.cancelled);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}, [recorder, config, clearTimer, halo, maxDurationMs, finish, releaseAudioSession, takePendingFinish]);
|
|
219
|
+
// Tear the recorder down with the component: without this the mic stays hot
|
|
220
|
+
// (and the iOS recording indicator lit) after navigating away mid-recording,
|
|
221
|
+
// and the toolbar is left showing a frozen recording bar.
|
|
222
|
+
useEffect(() => () => {
|
|
223
|
+
clearTimer();
|
|
224
|
+
cancelAnimation(halo);
|
|
225
|
+
startTokenRef.current = 0;
|
|
226
|
+
pendingFinishRef.current = null;
|
|
227
|
+
if (isRecordingRef.current) {
|
|
228
|
+
isRecordingRef.current = false;
|
|
229
|
+
try {
|
|
230
|
+
const stopped = recorder.stop();
|
|
231
|
+
stopped?.catch?.(() => { });
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
// already stopped
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
releaseAudioSession();
|
|
238
|
+
onStateChange?.({ active: false, locked: false, elapsed: 0, cancelArmed: false, levels: [] });
|
|
239
|
+
}, [clearTimer, halo, recorder, releaseAudioSession, onStateChange]);
|
|
240
|
+
useImperativeHandle(ref, () => ({ cancel: () => finish(true) }), [finish]);
|
|
241
|
+
const lock = useCallback(() => {
|
|
242
|
+
lockedRef.current = true;
|
|
243
|
+
setIsLocked(true);
|
|
244
|
+
}, []);
|
|
245
|
+
// Tracks whether the pan actually activated, so a release that follows a plain
|
|
246
|
+
// tap (mode switch) never runs the recording teardown.
|
|
247
|
+
const didActivate = useSharedValue(0);
|
|
248
|
+
const panGesture = useMemo(() => Gesture.Pan()
|
|
249
|
+
// A quick tap switches the control between voice and video (Telegram),
|
|
250
|
+
// so recording only begins once the press is clearly a hold. Without
|
|
251
|
+
// this the tap would start a take and immediately discard it.
|
|
252
|
+
.activateAfterLongPress(onTap ? 180 : 0)
|
|
253
|
+
.onStart(() => {
|
|
254
|
+
didActivate.value = 1;
|
|
255
|
+
runOnJS(start)();
|
|
256
|
+
})
|
|
257
|
+
.onUpdate(event => {
|
|
258
|
+
if (didActivate.value === 0)
|
|
259
|
+
return;
|
|
260
|
+
if (lockedSV.value > 0)
|
|
261
|
+
return;
|
|
262
|
+
const x = Math.max(maxSlide, Math.min(0, event.translationX));
|
|
263
|
+
const y = Math.max(-lockTravel, Math.min(0, event.translationY));
|
|
264
|
+
translateX.value = x;
|
|
265
|
+
translateY.value = y;
|
|
266
|
+
lockProgress.value = Math.min(1, -y / lockThreshold);
|
|
267
|
+
const armed = x <= -cancelThreshold ? 1 : 0;
|
|
268
|
+
if (armed !== cancelArmed.value) {
|
|
269
|
+
cancelArmed.value = armed;
|
|
270
|
+
runOnJS(setCancelArmedState)(armed > 0);
|
|
271
|
+
}
|
|
272
|
+
if (-y >= lockThreshold) {
|
|
273
|
+
lockedSV.value = 1;
|
|
274
|
+
translateX.value = withTiming(0, { duration: 150 });
|
|
275
|
+
translateY.value = withTiming(0, { duration: 150 });
|
|
276
|
+
runOnJS(lock)();
|
|
277
|
+
}
|
|
278
|
+
})
|
|
279
|
+
.onFinalize(() => {
|
|
280
|
+
// Never activated: this was a tap, handled by the tap gesture below.
|
|
281
|
+
if (didActivate.value === 0)
|
|
282
|
+
return;
|
|
283
|
+
didActivate.value = 0;
|
|
284
|
+
// Locked: the finger is released but recording continues, so only the
|
|
285
|
+
// drag offsets go home. `cancelArmed` / `lockProgress` are cleared by
|
|
286
|
+
// `finish` via resetGesture, so nothing latches into the next take.
|
|
287
|
+
if (lockedSV.value > 0) {
|
|
288
|
+
translateX.value = withTiming(0, { duration: 150 });
|
|
289
|
+
translateY.value = withTiming(0, { duration: 150 });
|
|
290
|
+
cancelArmed.value = 0;
|
|
291
|
+
lockProgress.value = 0;
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
const cancelled = cancelArmed.value > 0;
|
|
295
|
+
translateX.value = withTiming(0, { duration: 150 });
|
|
296
|
+
translateY.value = withTiming(0, { duration: 150 });
|
|
297
|
+
cancelArmed.value = 0;
|
|
298
|
+
lockProgress.value = 0;
|
|
299
|
+
runOnJS(finish)(cancelled);
|
|
300
|
+
}), [start, finish, lock, translateX, translateY, cancelArmed, lockProgress, lockedSV, didActivate, maxSlide, lockTravel, cancelThreshold, lockThreshold, onTap]);
|
|
301
|
+
// Tap switches voice <-> video; the pan (hold) records. Race so whichever
|
|
302
|
+
// recognizes first wins.
|
|
303
|
+
const micGesture = useMemo(() => {
|
|
304
|
+
if (!onTap)
|
|
305
|
+
return panGesture;
|
|
306
|
+
return Gesture.Race(Gesture.Tap().maxDuration(200).onEnd(() => {
|
|
307
|
+
runOnJS(onTap)();
|
|
308
|
+
}), panGesture);
|
|
309
|
+
}, [panGesture, onTap]);
|
|
310
|
+
const micAnimatedStyle = useAnimatedStyle(() => ({
|
|
311
|
+
transform: [{ translateX: translateX.value }, { translateY: translateY.value }],
|
|
312
|
+
}));
|
|
313
|
+
// `halo` now carries loudness (0..1) rather than a looping sweep, so the ring
|
|
314
|
+
// swells with the voice like Telegram's blob instead of pulsing on a timer.
|
|
315
|
+
const haloAnimatedStyle = useAnimatedStyle(() => ({
|
|
316
|
+
opacity: interpolate(halo.value, [0, 1], [0.12, 0.4]),
|
|
317
|
+
transform: [{ scale: interpolate(halo.value, [0, 1], [1.05, 2.1]) }],
|
|
318
|
+
}));
|
|
319
|
+
// Lock pill above the mic: the up-chevron rises and fades toward the lock as
|
|
320
|
+
// the finger slides up; the whole pill nudges up to acknowledge the drag.
|
|
321
|
+
const lockPillStyle = useAnimatedStyle(() => ({
|
|
322
|
+
transform: [{ translateY: interpolate(lockProgress.value, [0, 1], [0, -6]) }],
|
|
323
|
+
opacity: interpolate(lockProgress.value, [0, 0.05, 1], [0.7, 1, 1]),
|
|
324
|
+
}));
|
|
325
|
+
const lockChevronStyle = useAnimatedStyle(() => ({
|
|
326
|
+
opacity: interpolate(lockProgress.value, [0, 0.6, 1], [1, 0.4, 0]),
|
|
327
|
+
transform: [{ translateY: interpolate(lockProgress.value, [0, 1], [0, -4]) }],
|
|
328
|
+
}));
|
|
329
|
+
return (<View style={styles.container}>
|
|
330
|
+
{isRecording && (<Animated.View style={[styles.halo, haloAnimatedStyle]} pointerEvents='none'/>)}
|
|
331
|
+
|
|
332
|
+
{isRecording && !isLocked && (<Animated.View style={[styles.lockPill, lockPillStyle]} pointerEvents='none'>
|
|
333
|
+
<Icon name='lock' color={styles.lockColor.color} size={15} fallback={<LockIcon color={styles.lockColor.color} size={15}/>}/>
|
|
334
|
+
<Animated.View style={lockChevronStyle}>
|
|
335
|
+
<ChevronIcon color={styles.lockColor.color} size={12} direction='up'/>
|
|
336
|
+
</Animated.View>
|
|
337
|
+
</Animated.View>)}
|
|
338
|
+
|
|
339
|
+
{isLocked
|
|
340
|
+
? (<Pressable onPress={() => finish(false)} accessibilityRole='button' accessibilityLabel='send voice message' style={styles.button}>
|
|
341
|
+
<Icon name='send' color='#fff' size={20} fallback={<SendIcon color='#fff' size={20}/>}/>
|
|
342
|
+
</Pressable>)
|
|
343
|
+
: (<GestureDetector gesture={micGesture}>
|
|
344
|
+
<Animated.View accessibilityRole='button' accessibilityLabel='record voice message' style={[styles.button, micAnimatedStyle]}>
|
|
345
|
+
<Icon name='mic' color='#fff' size={22} fallback={<MicIcon color='#fff' size={22}/>}/>
|
|
346
|
+
</Animated.View>
|
|
347
|
+
</GestureDetector>)}
|
|
348
|
+
</View>);
|
|
349
|
+
}
|
|
350
|
+
export const VoiceMessageInput = forwardRef(VoiceMessageInputInner);
|
|
351
|
+
const createStyles = (theme) => StyleSheet.create({
|
|
352
|
+
container: {
|
|
353
|
+
// Matches Send's wrapper so the mic and the send button share a baseline -
|
|
354
|
+
// otherwise the control jumps 4pt the moment the first character is typed.
|
|
355
|
+
minHeight: theme.composer.minHeight,
|
|
356
|
+
justifyContent: 'center',
|
|
357
|
+
alignItems: 'center',
|
|
358
|
+
},
|
|
359
|
+
button: {
|
|
360
|
+
width: theme.sendButton.size,
|
|
361
|
+
height: theme.sendButton.size,
|
|
362
|
+
borderRadius: theme.radii.sendButton,
|
|
363
|
+
backgroundColor: theme.colors.accent,
|
|
364
|
+
alignItems: 'center',
|
|
365
|
+
justifyContent: 'center',
|
|
366
|
+
zIndex: 2,
|
|
367
|
+
},
|
|
368
|
+
// Soft accent ring that scales out and fades, like Telegram's amplitude blob.
|
|
369
|
+
halo: {
|
|
370
|
+
position: 'absolute',
|
|
371
|
+
width: theme.sendButton.size,
|
|
372
|
+
height: theme.sendButton.size,
|
|
373
|
+
borderRadius: theme.radii.sendButton,
|
|
374
|
+
backgroundColor: theme.colors.accent,
|
|
375
|
+
zIndex: 1,
|
|
376
|
+
},
|
|
377
|
+
// Lock affordance floating above the mic.
|
|
378
|
+
lockPill: {
|
|
379
|
+
position: 'absolute',
|
|
380
|
+
bottom: theme.sendButton.size + 12,
|
|
381
|
+
width: 34,
|
|
382
|
+
height: 56,
|
|
383
|
+
borderRadius: 17,
|
|
384
|
+
backgroundColor: theme.colors.inputBackground,
|
|
385
|
+
borderWidth: StyleSheet.hairlineWidth,
|
|
386
|
+
borderColor: theme.colors.inputFieldBorder,
|
|
387
|
+
alignItems: 'center',
|
|
388
|
+
justifyContent: 'space-between',
|
|
389
|
+
paddingVertical: 8,
|
|
390
|
+
zIndex: 3,
|
|
391
|
+
},
|
|
392
|
+
lockColor: {
|
|
393
|
+
color: theme.colors.placeholder,
|
|
394
|
+
},
|
|
395
|
+
});
|
|
396
|
+
//# sourceMappingURL=VoiceMessageInput.js.map
|