@repzo/widget-react-native 1.2.1 → 1.2.2

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.
Files changed (117) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +31 -0
  3. package/lib/commonjs/api/client.js +47 -2
  4. package/lib/commonjs/api/client.js.map +1 -1
  5. package/lib/commonjs/audio/voice.js +119 -0
  6. package/lib/commonjs/audio/voice.js.map +1 -0
  7. package/lib/commonjs/i18n.js +6 -0
  8. package/lib/commonjs/i18n.js.map +1 -1
  9. package/lib/commonjs/locales.js +4 -0
  10. package/lib/commonjs/locales.js.map +1 -1
  11. package/lib/commonjs/state/use-widget-state.js +31 -0
  12. package/lib/commonjs/state/use-widget-state.js.map +1 -1
  13. package/lib/commonjs/state/widget-store.js +22 -1
  14. package/lib/commonjs/state/widget-store.js.map +1 -1
  15. package/lib/commonjs/ui/WidgetProvider.js +6 -0
  16. package/lib/commonjs/ui/WidgetProvider.js.map +1 -1
  17. package/lib/commonjs/ui/components/FileCard.js +134 -0
  18. package/lib/commonjs/ui/components/FileCard.js.map +1 -0
  19. package/lib/commonjs/ui/components/Launcher.js +15 -1
  20. package/lib/commonjs/ui/components/Launcher.js.map +1 -1
  21. package/lib/commonjs/ui/components/VoiceNote.js +354 -0
  22. package/lib/commonjs/ui/components/VoiceNote.js.map +1 -0
  23. package/lib/commonjs/ui/components/icons.js +57 -0
  24. package/lib/commonjs/ui/components/icons.js.map +1 -1
  25. package/lib/commonjs/ui/screens/chat/ChatView.js +33 -14
  26. package/lib/commonjs/ui/screens/chat/ChatView.js.map +1 -1
  27. package/lib/commonjs/ui/screens/chat/ChatView.styles.js +0 -9
  28. package/lib/commonjs/ui/screens/chat/ChatView.styles.js.map +1 -1
  29. package/lib/module/api/client.js +48 -2
  30. package/lib/module/api/client.js.map +1 -1
  31. package/lib/module/audio/voice.js +110 -0
  32. package/lib/module/audio/voice.js.map +1 -0
  33. package/lib/module/i18n.js +6 -0
  34. package/lib/module/i18n.js.map +1 -1
  35. package/lib/module/locales.js +4 -0
  36. package/lib/module/locales.js.map +1 -1
  37. package/lib/module/state/use-widget-state.js +30 -1
  38. package/lib/module/state/use-widget-state.js.map +1 -1
  39. package/lib/module/state/widget-store.js +22 -1
  40. package/lib/module/state/widget-store.js.map +1 -1
  41. package/lib/module/ui/WidgetProvider.js +6 -0
  42. package/lib/module/ui/WidgetProvider.js.map +1 -1
  43. package/lib/module/ui/components/FileCard.js +130 -0
  44. package/lib/module/ui/components/FileCard.js.map +1 -0
  45. package/lib/module/ui/components/Launcher.js +16 -2
  46. package/lib/module/ui/components/Launcher.js.map +1 -1
  47. package/lib/module/ui/components/VoiceNote.js +350 -0
  48. package/lib/module/ui/components/VoiceNote.js.map +1 -0
  49. package/lib/module/ui/components/icons.js +55 -0
  50. package/lib/module/ui/components/icons.js.map +1 -1
  51. package/lib/module/ui/screens/chat/ChatView.js +33 -14
  52. package/lib/module/ui/screens/chat/ChatView.js.map +1 -1
  53. package/lib/module/ui/screens/chat/ChatView.styles.js +0 -9
  54. package/lib/module/ui/screens/chat/ChatView.styles.js.map +1 -1
  55. package/lib/typescript/commonjs/api/client.d.ts +12 -0
  56. package/lib/typescript/commonjs/api/client.d.ts.map +1 -1
  57. package/lib/typescript/commonjs/audio/voice.d.ts +29 -0
  58. package/lib/typescript/commonjs/audio/voice.d.ts.map +1 -0
  59. package/lib/typescript/commonjs/i18n.d.ts +4 -0
  60. package/lib/typescript/commonjs/i18n.d.ts.map +1 -1
  61. package/lib/typescript/commonjs/locales.d.ts.map +1 -1
  62. package/lib/typescript/commonjs/state/use-widget-state.d.ts +8 -0
  63. package/lib/typescript/commonjs/state/use-widget-state.d.ts.map +1 -1
  64. package/lib/typescript/commonjs/state/widget-store.d.ts +2 -0
  65. package/lib/typescript/commonjs/state/widget-store.d.ts.map +1 -1
  66. package/lib/typescript/commonjs/ui/WidgetProvider.d.ts.map +1 -1
  67. package/lib/typescript/commonjs/ui/components/FileCard.d.ts +21 -0
  68. package/lib/typescript/commonjs/ui/components/FileCard.d.ts.map +1 -0
  69. package/lib/typescript/commonjs/ui/components/Launcher.d.ts.map +1 -1
  70. package/lib/typescript/commonjs/ui/components/VoiceNote.d.ts +32 -0
  71. package/lib/typescript/commonjs/ui/components/VoiceNote.d.ts.map +1 -0
  72. package/lib/typescript/commonjs/ui/components/icons.d.ts +4 -0
  73. package/lib/typescript/commonjs/ui/components/icons.d.ts.map +1 -1
  74. package/lib/typescript/commonjs/ui/screens/chat/ChatView.d.ts.map +1 -1
  75. package/lib/typescript/commonjs/ui/screens/chat/ChatView.styles.d.ts +0 -9
  76. package/lib/typescript/commonjs/ui/screens/chat/ChatView.styles.d.ts.map +1 -1
  77. package/lib/typescript/commonjs/ui/screens/chat/ChatView.types.d.ts +4 -0
  78. package/lib/typescript/commonjs/ui/screens/chat/ChatView.types.d.ts.map +1 -1
  79. package/lib/typescript/module/api/client.d.ts +12 -0
  80. package/lib/typescript/module/api/client.d.ts.map +1 -1
  81. package/lib/typescript/module/audio/voice.d.ts +29 -0
  82. package/lib/typescript/module/audio/voice.d.ts.map +1 -0
  83. package/lib/typescript/module/i18n.d.ts +4 -0
  84. package/lib/typescript/module/i18n.d.ts.map +1 -1
  85. package/lib/typescript/module/locales.d.ts.map +1 -1
  86. package/lib/typescript/module/state/use-widget-state.d.ts +8 -0
  87. package/lib/typescript/module/state/use-widget-state.d.ts.map +1 -1
  88. package/lib/typescript/module/state/widget-store.d.ts +2 -0
  89. package/lib/typescript/module/state/widget-store.d.ts.map +1 -1
  90. package/lib/typescript/module/ui/WidgetProvider.d.ts.map +1 -1
  91. package/lib/typescript/module/ui/components/FileCard.d.ts +21 -0
  92. package/lib/typescript/module/ui/components/FileCard.d.ts.map +1 -0
  93. package/lib/typescript/module/ui/components/Launcher.d.ts.map +1 -1
  94. package/lib/typescript/module/ui/components/VoiceNote.d.ts +32 -0
  95. package/lib/typescript/module/ui/components/VoiceNote.d.ts.map +1 -0
  96. package/lib/typescript/module/ui/components/icons.d.ts +4 -0
  97. package/lib/typescript/module/ui/components/icons.d.ts.map +1 -1
  98. package/lib/typescript/module/ui/screens/chat/ChatView.d.ts.map +1 -1
  99. package/lib/typescript/module/ui/screens/chat/ChatView.styles.d.ts +0 -9
  100. package/lib/typescript/module/ui/screens/chat/ChatView.styles.d.ts.map +1 -1
  101. package/lib/typescript/module/ui/screens/chat/ChatView.types.d.ts +4 -0
  102. package/lib/typescript/module/ui/screens/chat/ChatView.types.d.ts.map +1 -1
  103. package/package.json +5 -1
  104. package/src/api/client.ts +56 -2
  105. package/src/audio/voice.ts +103 -0
  106. package/src/i18n.ts +6 -0
  107. package/src/locales.ts +4 -0
  108. package/src/state/use-widget-state.ts +30 -1
  109. package/src/state/widget-store.ts +22 -1
  110. package/src/ui/WidgetProvider.tsx +6 -0
  111. package/src/ui/components/FileCard.tsx +111 -0
  112. package/src/ui/components/Launcher.tsx +7 -2
  113. package/src/ui/components/VoiceNote.tsx +363 -0
  114. package/src/ui/components/icons.tsx +33 -0
  115. package/src/ui/screens/chat/ChatView.styles.ts +0 -9
  116. package/src/ui/screens/chat/ChatView.tsx +39 -13
  117. package/src/ui/screens/chat/ChatView.types.ts +4 -0
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * An attachment that opens outside the chat (PDF, video, sheet…), drawn as a
5
+ * card that reads as tappable: a tile with the file's type, its name, the
6
+ * type and size under it, and an arrow — instead of a bare name in a box.
7
+ */
8
+
9
+ import { Pressable, StyleSheet, Text, View } from 'react-native';
10
+ import { formatBytes } from "../../attachments/pickers.js";
11
+ import { ChevronIcon, PlayIcon } from "./icons.js";
12
+ import { fontSize, palette, radius, spacing, withAlpha } from "../styles/theme.js";
13
+ import { forwardDirection, START_ALIGN } from "../utils/rtl.js";
14
+
15
+ /** `PDF`, `MP4`, `XLSX` — from the name, else the MIME subtype; at most 4 letters. */
16
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
17
+ export function fileTypeLabel(name, contentType) {
18
+ const fromName = /\.([a-z0-9]{1,8})$/i.exec(name.trim())?.[1];
19
+ const fromType = (contentType ?? '').split('/')[1]?.split(/[;+.-]/)[0];
20
+ const label = (fromName || fromType || 'file').toUpperCase();
21
+ return label.length > 4 ? label.slice(0, 4) : label;
22
+ }
23
+ export function FileCard({
24
+ name,
25
+ contentType,
26
+ size,
27
+ color,
28
+ onBrandBubble,
29
+ openLabel,
30
+ onPress
31
+ }) {
32
+ const type = fileTypeLabel(name, contentType);
33
+ const isVideo = (contentType ?? '').toLowerCase().startsWith('video/');
34
+ const meta = size > 0 ? `${type} · ${formatBytes(size)}` : type;
35
+ const accent = onBrandBubble ? palette.white : color;
36
+ return /*#__PURE__*/_jsxs(Pressable, {
37
+ onPress: onPress,
38
+ disabled: !onPress,
39
+ accessibilityRole: "button",
40
+ accessibilityLabel: openLabel,
41
+ style: ({
42
+ pressed
43
+ }) => [styles.card, onBrandBubble ? {
44
+ backgroundColor: withAlpha(palette.white, 0.16),
45
+ borderColor: withAlpha(palette.white, 0.35)
46
+ } : {
47
+ backgroundColor: palette.white,
48
+ borderColor: palette.border
49
+ }, !onPress && styles.unavailable, pressed && styles.pressed],
50
+ children: [/*#__PURE__*/_jsx(View, {
51
+ style: [styles.tile, {
52
+ backgroundColor: onBrandBubble ? palette.white : withAlpha(color, 0.12)
53
+ }],
54
+ children: isVideo ? /*#__PURE__*/_jsx(PlayIcon, {
55
+ size: 16,
56
+ color: color
57
+ }) : /*#__PURE__*/_jsx(Text, {
58
+ style: [styles.tileLabel, {
59
+ color
60
+ }],
61
+ numberOfLines: 1,
62
+ children: type
63
+ })
64
+ }), /*#__PURE__*/_jsxs(View, {
65
+ style: styles.text,
66
+ children: [/*#__PURE__*/_jsx(Text, {
67
+ style: [styles.name, {
68
+ color: onBrandBubble ? palette.white : palette.ink
69
+ }],
70
+ numberOfLines: 2,
71
+ children: name
72
+ }), /*#__PURE__*/_jsx(Text, {
73
+ style: [styles.meta, {
74
+ color: onBrandBubble ? withAlpha(palette.white, 0.8) : palette.textMuted
75
+ }],
76
+ children: meta
77
+ })]
78
+ }), onPress ? /*#__PURE__*/_jsx(ChevronIcon, {
79
+ size: 14,
80
+ color: accent,
81
+ direction: forwardDirection()
82
+ }) : null]
83
+ });
84
+ }
85
+ const styles = StyleSheet.create({
86
+ card: {
87
+ flexDirection: 'row',
88
+ alignItems: 'center',
89
+ gap: spacing.sm + 2,
90
+ minWidth: 220,
91
+ paddingVertical: spacing.sm + 1,
92
+ paddingHorizontal: spacing.sm + 2,
93
+ borderWidth: StyleSheet.hairlineWidth,
94
+ borderRadius: radius.lg
95
+ },
96
+ pressed: {
97
+ opacity: 0.7
98
+ },
99
+ unavailable: {
100
+ opacity: 0.6
101
+ },
102
+ tile: {
103
+ width: 40,
104
+ height: 40,
105
+ borderRadius: radius.sm,
106
+ alignItems: 'center',
107
+ justifyContent: 'center'
108
+ },
109
+ tileLabel: {
110
+ fontSize: 11,
111
+ fontWeight: '800',
112
+ letterSpacing: 0.3
113
+ },
114
+ text: {
115
+ flex: 1,
116
+ minWidth: 0,
117
+ gap: 2
118
+ },
119
+ // A Latin file name in an Arabic chat still lines up with the card's start.
120
+ name: {
121
+ fontSize: fontSize.meta + 1,
122
+ fontWeight: '600',
123
+ textAlign: START_ALIGN
124
+ },
125
+ meta: {
126
+ fontSize: fontSize.caption,
127
+ textAlign: START_ALIGN
128
+ }
129
+ });
130
+ //# sourceMappingURL=FileCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Pressable","StyleSheet","Text","View","formatBytes","ChevronIcon","PlayIcon","fontSize","palette","radius","spacing","withAlpha","forwardDirection","START_ALIGN","jsx","_jsx","jsxs","_jsxs","fileTypeLabel","name","contentType","fromName","exec","trim","fromType","split","label","toUpperCase","length","slice","FileCard","size","color","onBrandBubble","openLabel","onPress","type","isVideo","toLowerCase","startsWith","meta","accent","white","disabled","accessibilityRole","accessibilityLabel","style","pressed","styles","card","backgroundColor","borderColor","border","unavailable","children","tile","tileLabel","numberOfLines","text","ink","textMuted","direction","create","flexDirection","alignItems","gap","sm","minWidth","paddingVertical","paddingHorizontal","borderWidth","hairlineWidth","borderRadius","lg","opacity","width","height","justifyContent","fontWeight","letterSpacing","flex","textAlign","caption"],"sourceRoot":"../../../../src","sources":["ui/components/FileCard.tsx"],"mappings":"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","ignoreList":[]}
@@ -11,7 +11,7 @@
11
11
 
12
12
  import { Pressable, StyleSheet, Text, View } from 'react-native';
13
13
  import { createTranslator, DEFAULT_LABELS } from "../../i18n.js";
14
- import { useWidgetState } from "../../state/use-widget-state.js";
14
+ import { shallowEqual, useWidgetSelector } from "../../state/use-widget-state.js";
15
15
  import { controller } from "../../controller.js";
16
16
  import { ChatIcon, ChevronIcon } from "./icons.js";
17
17
  import { DEFAULT_PRIMARY_COLOR, fontSize, palette, radius, shadows, spacing } from "../styles/theme.js";
@@ -22,7 +22,21 @@ export function Launcher({
22
22
  horizontalPadding,
23
23
  hidden = false
24
24
  }) {
25
- const state = useWidgetState();
25
+ // Only what the launcher draws: it sits on the host's screens and shouldn't
26
+ // redraw on every message or typing event.
27
+ const state = useWidgetSelector(({
28
+ booted,
29
+ config,
30
+ isOpen,
31
+ locale,
32
+ unreadCount
33
+ }) => ({
34
+ booted,
35
+ config,
36
+ isOpen,
37
+ locale,
38
+ unreadCount
39
+ }), shallowEqual);
26
40
  const config = state.config;
27
41
  if (hidden || !state.booted || config?.showLauncher === false) return null;
28
42
  const color = config?.primaryColor || DEFAULT_PRIMARY_COLOR;
@@ -1 +1 @@
1
- {"version":3,"names":["Pressable","StyleSheet","Text","View","createTranslator","DEFAULT_LABELS","useWidgetState","controller","ChatIcon","ChevronIcon","DEFAULT_PRIMARY_COLOR","fontSize","palette","radius","shadows","spacing","jsx","_jsx","jsxs","_jsxs","Launcher","position","verticalPadding","horizontalPadding","hidden","state","config","booted","showLauncher","color","primaryColor","side","bottom","Math","max","launcherVerticalPadding","inset","launcherHorizontalPadding","text","bubbleText","showText","isOpen","translate","locale","accessibilityLabel","launcherClose","launcherOpen","style","styles","wrapper","right","left","pointerEvents","children","onPress","store","toggle","accessibilityRole","pressed","bubble","bubbleWithText","bubbleRound","backgroundColor","size","direction","white","unreadCount","badge","badgeLabel","create","height","alignItems","justifyContent","flexDirection","gap","sm","floating","width","borderRadius","pill","paddingHorizontal","xl","body","fontWeight","opacity","transform","scale","top","minWidth","xs","danger","caption"],"sourceRoot":"../../../../src","sources":["ui/components/Launcher.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Pressable","StyleSheet","Text","View","createTranslator","DEFAULT_LABELS","shallowEqual","useWidgetSelector","controller","ChatIcon","ChevronIcon","DEFAULT_PRIMARY_COLOR","fontSize","palette","radius","shadows","spacing","jsx","_jsx","jsxs","_jsxs","Launcher","position","verticalPadding","horizontalPadding","hidden","state","booted","config","isOpen","locale","unreadCount","showLauncher","color","primaryColor","side","bottom","Math","max","launcherVerticalPadding","inset","launcherHorizontalPadding","text","bubbleText","showText","translate","accessibilityLabel","launcherClose","launcherOpen","style","styles","wrapper","right","left","pointerEvents","children","onPress","store","toggle","accessibilityRole","pressed","bubble","bubbleWithText","bubbleRound","backgroundColor","size","direction","white","badge","badgeLabel","create","height","alignItems","justifyContent","flexDirection","gap","sm","floating","width","borderRadius","pill","paddingHorizontal","xl","body","fontWeight","opacity","transform","scale","top","minWidth","xs","danger","caption"],"sourceRoot":"../../../../src","sources":["ui/components/Launcher.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,350 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * A voice note (or any audio attachment) played inside the chat, laid out the
5
+ * way messaging apps do it: a play button beside a waveform the visitor can
6
+ * tap or drag to jump through the note, the time under it, and a speed chip
7
+ * once the note has been started. Only rendered when the host app has
8
+ * `expo-audio` (see `src/audio/voice.ts`); without it audio stays a file row.
9
+ */
10
+
11
+ import { useEffect, useMemo, useRef, useState } from 'react';
12
+ import { ActivityIndicator, PanResponder, Pressable, StyleSheet, Text, View } from 'react-native';
13
+ import { audioPlayerOptions, claimVoicePlayback, formatVoiceClock, voicePlaybackModule, voiceWaveformLevels } from "../../audio/voice.js";
14
+ import { PauseIcon, PlayIcon } from "./icons.js";
15
+ import { fontSize, palette, withAlpha } from "../styles/theme.js";
16
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
17
+ const BAR_COUNT = 32;
18
+ const BAR_WIDTH = 3;
19
+ const BAR_MIN_HEIGHT = 4;
20
+ const BAR_MAX_HEIGHT = 24;
21
+ const BUTTON_SIZE = 36;
22
+ const KNOB_SIZE = 12;
23
+ const SPEEDS = [1, 1.5, 2];
24
+
25
+ /**
26
+ * The player is only created once the visitor taps play. The whole thread
27
+ * renders at once, so a player per note would download every note in the
28
+ * conversation as soon as the chat opened.
29
+ */
30
+ export function VoiceNote(props) {
31
+ const [started, setStarted] = useState(false);
32
+ if (started) return /*#__PURE__*/_jsx(ActiveVoiceNote, {
33
+ ...props
34
+ });
35
+ return /*#__PURE__*/_jsx(VoiceNoteLayout, {
36
+ ...props,
37
+ playing: false,
38
+ loading: false,
39
+ progress: 0,
40
+ time: null,
41
+ onToggle: () => setStarted(true)
42
+ });
43
+ }
44
+
45
+ /** A note that has been started: owns its expo-audio player and plays on mount. */
46
+ function ActiveVoiceNote(props) {
47
+ const {
48
+ url,
49
+ onError
50
+ } = props;
51
+ const audio = voicePlaybackModule();
52
+ const player = audio.useAudioPlayer({
53
+ uri: url
54
+ }, audioPlayerOptions());
55
+ const status = audio.useAudioPlayerStatus(player);
56
+ const [speedIndex, setSpeedIndex] = useState(0);
57
+ const [scrub, setScrub] = useState(null);
58
+ const [trackWidth, setTrackWidth] = useState(0);
59
+ // Whether the visitor asked for playback, so a note still loading shows a
60
+ // spinner, and one they paused while it loaded doesn't.
61
+ const [wantsPlay, setWantsPlay] = useState(true);
62
+ // This note's hold on playback: starting it pauses any other note.
63
+ const releasePlayback = useRef(null);
64
+ const duration = Math.max(Number(status?.duration) || 0, 0);
65
+ const currentTime = Math.max(Number(status?.currentTime) || 0, 0);
66
+ const playing = !!status?.playing;
67
+ const finished = !!status?.didJustFinish || duration > 0 && currentTime >= duration - 0.1;
68
+ // `isLoaded` / `isBuffering` are compared strictly: an expo-audio that
69
+ // doesn't report them never gets a spinner that can't go away.
70
+ const loading = wantsPlay && !playing && (status?.isLoaded === false || status?.isBuffering === true);
71
+ const pause = () => {
72
+ setWantsPlay(false);
73
+ player.pause();
74
+ };
75
+ const start = () => {
76
+ releasePlayback.current?.();
77
+ releasePlayback.current = claimVoicePlayback(pause);
78
+ setWantsPlay(true);
79
+ player.play();
80
+ };
81
+
82
+ // The visitor tapped play on the idle note, which created this player.
83
+ // Neither callback changes for the player's lifetime.
84
+ useEffect(() => {
85
+ start();
86
+ return () => releasePlayback.current?.();
87
+ // eslint-disable-next-line react-hooks/exhaustive-deps
88
+ }, []);
89
+
90
+ // The error is only on the status update that reports it (the next one
91
+ // clears it), so it is acted on as it arrives.
92
+ const error = status?.error;
93
+ useEffect(() => {
94
+ if (error) onError();
95
+ }, [error, onError]);
96
+ const togglePlay = async () => {
97
+ if (playing || loading) {
98
+ pause();
99
+ return;
100
+ }
101
+ if (finished) await player.seekTo(0);
102
+ start();
103
+ };
104
+ const cycleSpeed = () => {
105
+ const next = (speedIndex + 1) % SPEEDS.length;
106
+ setSpeedIndex(next);
107
+ try {
108
+ player.setPlaybackRate(SPEEDS[next], 'high');
109
+ } catch {
110
+ // Some versions take no pitch-correction argument.
111
+ try {
112
+ player.setPlaybackRate(SPEEDS[next]);
113
+ } catch {
114
+ // Speed unsupported: the note keeps playing at 1×.
115
+ }
116
+ }
117
+ };
118
+
119
+ // The latest values for the (stable) PanResponder below.
120
+ const latest = useRef({
121
+ trackWidth,
122
+ duration,
123
+ player
124
+ });
125
+ latest.current = {
126
+ trackWidth,
127
+ duration,
128
+ player
129
+ };
130
+ const ratioAt = x => {
131
+ const width = latest.current.trackWidth;
132
+ return width > 0 ? Math.min(1, Math.max(0, x / width)) : 0;
133
+ };
134
+ // Where the finger first touched the track. Later positions are that plus
135
+ // the drag distance: a move event's own `locationX` is measured from
136
+ // whatever view is under the finger, not from the track.
137
+ const startX = useRef(0);
138
+ const pan = useRef(PanResponder.create({
139
+ onStartShouldSetPanResponder: () => true,
140
+ onMoveShouldSetPanResponder: () => true,
141
+ onPanResponderGrant: event => {
142
+ startX.current = event.nativeEvent.locationX;
143
+ setScrub(ratioAt(startX.current));
144
+ },
145
+ onPanResponderMove: (_, gesture) => setScrub(ratioAt(startX.current + gesture.dx)),
146
+ onPanResponderRelease: (_, gesture) => {
147
+ const {
148
+ duration: length,
149
+ player: current
150
+ } = latest.current;
151
+ if (length > 0) void current.seekTo(ratioAt(startX.current + gesture.dx) * length);
152
+ setScrub(null);
153
+ },
154
+ onPanResponderTerminate: () => setScrub(null)
155
+ })).current;
156
+ const displayTime = scrub != null ? scrub * duration : playing ? currentTime : finished ? duration : currentTime || duration;
157
+ // The chip joins once the note was started, so an untouched note shows only its length.
158
+ const showSpeed = speedIndex > 0 || playing || currentTime > 0 && !finished;
159
+ return /*#__PURE__*/_jsx(VoiceNoteLayout, {
160
+ ...props,
161
+ playing: playing,
162
+ loading: loading,
163
+ progress: scrub ?? (duration > 0 ? Math.min(1, currentTime / duration) : 0)
164
+ // Nothing to show until the player knows the note's length.
165
+ ,
166
+ time: duration > 0 ? formatVoiceClock(displayTime) : null,
167
+ onToggle: () => void togglePlay(),
168
+ track: {
169
+ panHandlers: pan.panHandlers,
170
+ onWidth: setTrackWidth
171
+ },
172
+ speed: showSpeed ? {
173
+ value: SPEEDS[speedIndex],
174
+ changed: speedIndex > 0,
175
+ onPress: cycleSpeed
176
+ } : null
177
+ });
178
+ }
179
+ function VoiceNoteLayout({
180
+ seed,
181
+ color,
182
+ onBrandBubble,
183
+ labels,
184
+ playing,
185
+ loading,
186
+ progress,
187
+ time,
188
+ onToggle,
189
+ track,
190
+ speed
191
+ }) {
192
+ const accent = onBrandBubble ? palette.white : color;
193
+ const onAccent = onBrandBubble ? color : palette.white;
194
+ const trackColor = onBrandBubble ? withAlpha(palette.white, 0.4) : palette.disabled;
195
+ const subtle = onBrandBubble ? withAlpha(palette.white, 0.8) : palette.textMuted;
196
+ const levels = useMemo(() => voiceWaveformLevels(seed, BAR_COUNT), [seed]);
197
+ const [trackWidth, setTrackWidth] = useState(0);
198
+ const onTrackLayout = event => {
199
+ setTrackWidth(event.nativeEvent.layout.width);
200
+ track?.onWidth(event.nativeEvent.layout.width);
201
+ };
202
+
203
+ // Bar i's centre sits at this share of the track; the playhead travels the same span.
204
+ const barCentre = i => trackWidth > BAR_WIDTH ? (BAR_WIDTH / 2 + i * (trackWidth - BAR_WIDTH) / (BAR_COUNT - 1)) / trackWidth : i / (BAR_COUNT - 1);
205
+ const knobOffset = trackWidth > 0 ? Math.round(progress * (trackWidth - KNOB_SIZE)) : 0;
206
+ let icon = /*#__PURE__*/_jsx(PlayIcon, {
207
+ size: 14,
208
+ color: onAccent
209
+ });
210
+ if (loading) icon = /*#__PURE__*/_jsx(ActivityIndicator, {
211
+ size: "small",
212
+ color: onAccent
213
+ });else if (playing) icon = /*#__PURE__*/_jsx(PauseIcon, {
214
+ size: 14,
215
+ color: onAccent
216
+ });
217
+ return /*#__PURE__*/_jsxs(View, {
218
+ style: styles.root,
219
+ children: [/*#__PURE__*/_jsxs(View, {
220
+ style: styles.row,
221
+ children: [/*#__PURE__*/_jsx(Pressable, {
222
+ onPress: onToggle,
223
+ accessibilityRole: "button",
224
+ accessibilityLabel: playing || loading ? labels.pause : labels.play,
225
+ accessibilityState: {
226
+ busy: loading
227
+ },
228
+ hitSlop: 4,
229
+ style: ({
230
+ pressed
231
+ }) => [styles.playButton, {
232
+ backgroundColor: accent,
233
+ opacity: pressed ? 0.8 : 1
234
+ }],
235
+ children: icon
236
+ }), /*#__PURE__*/_jsxs(View, {
237
+ style: styles.track,
238
+ onLayout: onTrackLayout,
239
+ ...track?.panHandlers,
240
+ children: [levels.map((level, i) => /*#__PURE__*/_jsx(View, {
241
+ // Touches land on the track itself, so their position is measured from its edge.
242
+ pointerEvents: "none",
243
+ style: [styles.bar, {
244
+ height: BAR_MIN_HEIGHT + level * (BAR_MAX_HEIGHT - BAR_MIN_HEIGHT),
245
+ backgroundColor: barCentre(i) <= progress ? accent : trackColor
246
+ }]
247
+ }, i)), trackWidth > 0 ? /*#__PURE__*/_jsx(View, {
248
+ pointerEvents: "none",
249
+ style: [styles.knob, {
250
+ backgroundColor: accent,
251
+ transform: [{
252
+ translateX: knobOffset
253
+ }]
254
+ }]
255
+ }) : null]
256
+ })]
257
+ }), /*#__PURE__*/_jsxs(View, {
258
+ style: styles.meta,
259
+ children: [time != null ? /*#__PURE__*/_jsx(Text, {
260
+ style: [styles.time, {
261
+ color: subtle
262
+ }],
263
+ children: time
264
+ }) : null, speed ? /*#__PURE__*/_jsx(Pressable, {
265
+ onPress: speed.onPress,
266
+ accessibilityRole: "button",
267
+ accessibilityLabel: labels.speed,
268
+ hitSlop: 12,
269
+ style: ({
270
+ pressed
271
+ }) => [styles.speed, {
272
+ backgroundColor: speed.changed ? accent : trackColor,
273
+ opacity: pressed ? 0.6 : 1
274
+ }],
275
+ children: /*#__PURE__*/_jsxs(Text, {
276
+ style: [styles.speedText, {
277
+ color: speed.changed ? onAccent : onBrandBubble ? palette.white : palette.text
278
+ }],
279
+ children: [speed.value, "\xD7"]
280
+ })
281
+ }) : null]
282
+ })]
283
+ });
284
+ }
285
+ const styles = StyleSheet.create({
286
+ // A timeline runs left to right in every language, so RTL doesn't mirror it
287
+ // (the touch position and the playhead stay in the same coordinates).
288
+ root: {
289
+ minWidth: 200,
290
+ direction: 'ltr'
291
+ },
292
+ row: {
293
+ flexDirection: 'row',
294
+ alignItems: 'center',
295
+ gap: 10
296
+ },
297
+ playButton: {
298
+ width: BUTTON_SIZE,
299
+ height: BUTTON_SIZE,
300
+ borderRadius: BUTTON_SIZE / 2,
301
+ alignItems: 'center',
302
+ justifyContent: 'center'
303
+ },
304
+ track: {
305
+ flex: 1,
306
+ minWidth: 0,
307
+ height: BUTTON_SIZE,
308
+ flexDirection: 'row',
309
+ alignItems: 'center',
310
+ justifyContent: 'space-between'
311
+ },
312
+ bar: {
313
+ width: BAR_WIDTH,
314
+ borderRadius: BAR_WIDTH / 2
315
+ },
316
+ knob: {
317
+ position: 'absolute',
318
+ left: 0,
319
+ width: KNOB_SIZE,
320
+ height: KNOB_SIZE,
321
+ borderRadius: KNOB_SIZE / 2
322
+ },
323
+ meta: {
324
+ minHeight: 18,
325
+ marginTop: -2,
326
+ marginLeft: BUTTON_SIZE + 10,
327
+ flexDirection: 'row',
328
+ alignItems: 'center',
329
+ gap: 6
330
+ },
331
+ time: {
332
+ fontSize: fontSize.caption,
333
+ fontWeight: '500',
334
+ fontVariant: ['tabular-nums']
335
+ },
336
+ speed: {
337
+ minWidth: 30,
338
+ height: 18,
339
+ paddingHorizontal: 6,
340
+ borderRadius: 9,
341
+ alignItems: 'center',
342
+ justifyContent: 'center'
343
+ },
344
+ speedText: {
345
+ fontSize: 11,
346
+ fontWeight: '700',
347
+ fontVariant: ['tabular-nums']
348
+ }
349
+ });
350
+ //# sourceMappingURL=VoiceNote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useEffect","useMemo","useRef","useState","ActivityIndicator","PanResponder","Pressable","StyleSheet","Text","View","audioPlayerOptions","claimVoicePlayback","formatVoiceClock","voicePlaybackModule","voiceWaveformLevels","PauseIcon","PlayIcon","fontSize","palette","withAlpha","jsx","_jsx","jsxs","_jsxs","BAR_COUNT","BAR_WIDTH","BAR_MIN_HEIGHT","BAR_MAX_HEIGHT","BUTTON_SIZE","KNOB_SIZE","SPEEDS","VoiceNote","props","started","setStarted","ActiveVoiceNote","VoiceNoteLayout","playing","loading","progress","time","onToggle","url","onError","audio","player","useAudioPlayer","uri","status","useAudioPlayerStatus","speedIndex","setSpeedIndex","scrub","setScrub","trackWidth","setTrackWidth","wantsPlay","setWantsPlay","releasePlayback","duration","Math","max","Number","currentTime","finished","didJustFinish","isLoaded","isBuffering","pause","start","current","play","error","togglePlay","seekTo","cycleSpeed","next","length","setPlaybackRate","latest","ratioAt","x","width","min","startX","pan","create","onStartShouldSetPanResponder","onMoveShouldSetPanResponder","onPanResponderGrant","event","nativeEvent","locationX","onPanResponderMove","_","gesture","dx","onPanResponderRelease","onPanResponderTerminate","displayTime","showSpeed","track","panHandlers","onWidth","speed","value","changed","onPress","seed","color","onBrandBubble","labels","accent","white","onAccent","trackColor","disabled","subtle","textMuted","levels","onTrackLayout","layout","barCentre","i","knobOffset","round","icon","size","style","styles","root","children","row","accessibilityRole","accessibilityLabel","accessibilityState","busy","hitSlop","pressed","playButton","backgroundColor","opacity","onLayout","map","level","pointerEvents","bar","height","knob","transform","translateX","meta","speedText","text","minWidth","direction","flexDirection","alignItems","gap","borderRadius","justifyContent","flex","position","left","minHeight","marginTop","marginLeft","caption","fontWeight","fontVariant","paddingHorizontal"],"sourceRoot":"../../../../src","sources":["ui/components/VoiceNote.tsx"],"mappings":"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","ignoreList":[]}
@@ -79,6 +79,61 @@ export function ChevronIcon({
79
79
  });
80
80
  }
81
81
 
82
+ /** A right-pointing triangle, drawn with borders — a voice note's play button. */
83
+ export function PlayIcon({
84
+ size = 16,
85
+ color = palette.white,
86
+ style
87
+ }) {
88
+ return /*#__PURE__*/_jsx(View, {
89
+ style: [{
90
+ width: size,
91
+ height: size
92
+ }, styles.center, style],
93
+ children: /*#__PURE__*/_jsx(View, {
94
+ style: {
95
+ width: 0,
96
+ height: 0,
97
+ // The triangle's weight sits left of its box; nudge it to look centred.
98
+ marginLeft: size * 0.12,
99
+ borderLeftWidth: size * 0.72,
100
+ borderTopWidth: size * 0.42,
101
+ borderBottomWidth: size * 0.42,
102
+ borderLeftColor: color,
103
+ borderTopColor: 'transparent',
104
+ borderBottomColor: 'transparent'
105
+ }
106
+ })
107
+ });
108
+ }
109
+
110
+ /** Two upright bars — a playing voice note's pause button. */
111
+ export function PauseIcon({
112
+ size = 16,
113
+ color = palette.white,
114
+ style
115
+ }) {
116
+ const bar = {
117
+ width: size * 0.26,
118
+ height: size * 0.8,
119
+ borderRadius: 1.5,
120
+ backgroundColor: color
121
+ };
122
+ return /*#__PURE__*/_jsxs(View, {
123
+ style: [{
124
+ width: size,
125
+ height: size,
126
+ flexDirection: 'row',
127
+ gap: size * 0.2
128
+ }, styles.center, style],
129
+ children: [/*#__PURE__*/_jsx(View, {
130
+ style: bar
131
+ }), /*#__PURE__*/_jsx(View, {
132
+ style: bar
133
+ })]
134
+ });
135
+ }
136
+
82
137
  /** Arrow with a shaft — used for the "start a conversation" affordance. */
83
138
  export function ArrowRightIcon({
84
139
  size = 16,