@repzo/widget-react-native 1.2.2 → 1.3.1
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/CHANGELOG.md +88 -0
- package/README.md +43 -33
- package/android/build.gradle +22 -0
- package/android/src/main/java/expo/modules/repzowidget/RepzoVoicePlayer.kt +222 -0
- package/android/src/main/java/expo/modules/repzowidget/RepzoWidgetAudioModule.kt +68 -0
- package/expo-module.config.json +9 -0
- package/ios/RepzoVoicePlayer.swift +175 -0
- package/ios/RepzoWidgetAudio.podspec +26 -0
- package/ios/RepzoWidgetAudioModule.swift +65 -0
- package/lib/commonjs/api/client.js +40 -0
- package/lib/commonjs/api/client.js.map +1 -1
- package/lib/commonjs/attachments/pickers.js +80 -23
- package/lib/commonjs/attachments/pickers.js.map +1 -1
- package/lib/commonjs/audio/native-player.js +97 -0
- package/lib/commonjs/audio/native-player.js.map +1 -0
- package/lib/commonjs/audio/voice.js +34 -7
- package/lib/commonjs/audio/voice.js.map +1 -1
- package/lib/commonjs/i18n.js +2 -0
- package/lib/commonjs/i18n.js.map +1 -1
- package/lib/commonjs/locales.js +1 -0
- package/lib/commonjs/locales.js.map +1 -1
- package/lib/commonjs/state/widget-store.js +238 -40
- package/lib/commonjs/state/widget-store.js.map +1 -1
- package/lib/commonjs/types.js.map +1 -1
- package/lib/commonjs/ui/WidgetProvider.js +8 -6
- package/lib/commonjs/ui/WidgetProvider.js.map +1 -1
- package/lib/commonjs/ui/components/ImageViewer.js +20 -37
- package/lib/commonjs/ui/components/ImageViewer.js.map +1 -1
- package/lib/commonjs/ui/components/MessagesSkeleton.js +126 -0
- package/lib/commonjs/ui/components/MessagesSkeleton.js.map +1 -0
- package/lib/commonjs/ui/components/VoiceNote.js +8 -9
- package/lib/commonjs/ui/components/VoiceNote.js.map +1 -1
- package/lib/commonjs/ui/components/ZoomableImage.js +299 -0
- package/lib/commonjs/ui/components/ZoomableImage.js.map +1 -0
- package/lib/commonjs/ui/components/icons.js +22 -16
- package/lib/commonjs/ui/components/icons.js.map +1 -1
- package/lib/commonjs/ui/screens/chat/ChatView.js +42 -18
- package/lib/commonjs/ui/screens/chat/ChatView.js.map +1 -1
- package/lib/commonjs/ui/screens/chat/ChatView.styles.js +17 -9
- package/lib/commonjs/ui/screens/chat/ChatView.styles.js.map +1 -1
- package/lib/commonjs/ui/styles/theme.js +1 -0
- package/lib/commonjs/ui/styles/theme.js.map +1 -1
- package/lib/commonjs/ui/utils/conversations.js +17 -1
- package/lib/commonjs/ui/utils/conversations.js.map +1 -1
- package/lib/module/api/client.js +40 -0
- package/lib/module/api/client.js.map +1 -1
- package/lib/module/attachments/pickers.js +80 -23
- package/lib/module/attachments/pickers.js.map +1 -1
- package/lib/module/audio/native-player.js +93 -0
- package/lib/module/audio/native-player.js.map +1 -0
- package/lib/module/audio/voice.js +32 -6
- package/lib/module/audio/voice.js.map +1 -1
- package/lib/module/i18n.js +2 -0
- package/lib/module/i18n.js.map +1 -1
- package/lib/module/locales.js +1 -0
- package/lib/module/locales.js.map +1 -1
- package/lib/module/state/widget-store.js +238 -40
- package/lib/module/state/widget-store.js.map +1 -1
- package/lib/module/types.js.map +1 -1
- package/lib/module/ui/WidgetProvider.js +8 -6
- package/lib/module/ui/WidgetProvider.js.map +1 -1
- package/lib/module/ui/components/ImageViewer.js +21 -38
- package/lib/module/ui/components/ImageViewer.js.map +1 -1
- package/lib/module/ui/components/MessagesSkeleton.js +124 -0
- package/lib/module/ui/components/MessagesSkeleton.js.map +1 -0
- package/lib/module/ui/components/VoiceNote.js +9 -10
- package/lib/module/ui/components/VoiceNote.js.map +1 -1
- package/lib/module/ui/components/ZoomableImage.js +291 -0
- package/lib/module/ui/components/ZoomableImage.js.map +1 -0
- package/lib/module/ui/components/icons.js +21 -15
- package/lib/module/ui/components/icons.js.map +1 -1
- package/lib/module/ui/screens/chat/ChatView.js +44 -20
- package/lib/module/ui/screens/chat/ChatView.js.map +1 -1
- package/lib/module/ui/screens/chat/ChatView.styles.js +17 -9
- package/lib/module/ui/screens/chat/ChatView.styles.js.map +1 -1
- package/lib/module/ui/styles/theme.js +1 -0
- package/lib/module/ui/styles/theme.js.map +1 -1
- package/lib/module/ui/utils/conversations.js +15 -1
- package/lib/module/ui/utils/conversations.js.map +1 -1
- package/lib/typescript/commonjs/api/client.d.ts +27 -1
- package/lib/typescript/commonjs/api/client.d.ts.map +1 -1
- package/lib/typescript/commonjs/attachments/pickers.d.ts +22 -10
- package/lib/typescript/commonjs/attachments/pickers.d.ts.map +1 -1
- package/lib/typescript/commonjs/audio/native-player.d.ts +36 -0
- package/lib/typescript/commonjs/audio/native-player.d.ts.map +1 -0
- package/lib/typescript/commonjs/audio/voice.d.ts +17 -4
- package/lib/typescript/commonjs/audio/voice.d.ts.map +1 -1
- package/lib/typescript/commonjs/i18n.d.ts +1 -0
- package/lib/typescript/commonjs/i18n.d.ts.map +1 -1
- package/lib/typescript/commonjs/locales.d.ts.map +1 -1
- package/lib/typescript/commonjs/state/widget-store.d.ts +38 -3
- package/lib/typescript/commonjs/state/widget-store.d.ts.map +1 -1
- package/lib/typescript/commonjs/types.d.ts +17 -0
- package/lib/typescript/commonjs/types.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/WidgetProvider.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/ImageViewer.d.ts +2 -2
- package/lib/typescript/commonjs/ui/components/ImageViewer.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/MessagesSkeleton.d.ts +10 -0
- package/lib/typescript/commonjs/ui/components/MessagesSkeleton.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/components/VoiceNote.d.ts +2 -2
- package/lib/typescript/commonjs/ui/components/VoiceNote.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/ZoomableImage.d.ts +45 -0
- package/lib/typescript/commonjs/ui/components/ZoomableImage.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/components/icons.d.ts +2 -1
- package/lib/typescript/commonjs/ui/components/icons.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/chat/ChatView.d.ts +1 -1
- package/lib/typescript/commonjs/ui/screens/chat/ChatView.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/chat/ChatView.styles.d.ts +14 -9
- package/lib/typescript/commonjs/ui/screens/chat/ChatView.styles.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/chat/ChatView.types.d.ts +4 -0
- package/lib/typescript/commonjs/ui/screens/chat/ChatView.types.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/styles/theme.d.ts +2 -0
- package/lib/typescript/commonjs/ui/styles/theme.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/utils/conversations.d.ts +10 -2
- package/lib/typescript/commonjs/ui/utils/conversations.d.ts.map +1 -1
- package/lib/typescript/module/api/client.d.ts +27 -1
- package/lib/typescript/module/api/client.d.ts.map +1 -1
- package/lib/typescript/module/attachments/pickers.d.ts +22 -10
- package/lib/typescript/module/attachments/pickers.d.ts.map +1 -1
- package/lib/typescript/module/audio/native-player.d.ts +36 -0
- package/lib/typescript/module/audio/native-player.d.ts.map +1 -0
- package/lib/typescript/module/audio/voice.d.ts +17 -4
- package/lib/typescript/module/audio/voice.d.ts.map +1 -1
- package/lib/typescript/module/i18n.d.ts +1 -0
- package/lib/typescript/module/i18n.d.ts.map +1 -1
- package/lib/typescript/module/locales.d.ts.map +1 -1
- package/lib/typescript/module/state/widget-store.d.ts +38 -3
- package/lib/typescript/module/state/widget-store.d.ts.map +1 -1
- package/lib/typescript/module/types.d.ts +17 -0
- package/lib/typescript/module/types.d.ts.map +1 -1
- package/lib/typescript/module/ui/WidgetProvider.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/ImageViewer.d.ts +2 -2
- package/lib/typescript/module/ui/components/ImageViewer.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/MessagesSkeleton.d.ts +10 -0
- package/lib/typescript/module/ui/components/MessagesSkeleton.d.ts.map +1 -0
- package/lib/typescript/module/ui/components/VoiceNote.d.ts +2 -2
- package/lib/typescript/module/ui/components/VoiceNote.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/ZoomableImage.d.ts +45 -0
- package/lib/typescript/module/ui/components/ZoomableImage.d.ts.map +1 -0
- package/lib/typescript/module/ui/components/icons.d.ts +2 -1
- package/lib/typescript/module/ui/components/icons.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/chat/ChatView.d.ts +1 -1
- package/lib/typescript/module/ui/screens/chat/ChatView.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/chat/ChatView.styles.d.ts +14 -9
- package/lib/typescript/module/ui/screens/chat/ChatView.styles.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/chat/ChatView.types.d.ts +4 -0
- package/lib/typescript/module/ui/screens/chat/ChatView.types.d.ts.map +1 -1
- package/lib/typescript/module/ui/styles/theme.d.ts +2 -0
- package/lib/typescript/module/ui/styles/theme.d.ts.map +1 -1
- package/lib/typescript/module/ui/utils/conversations.d.ts +10 -2
- package/lib/typescript/module/ui/utils/conversations.d.ts.map +1 -1
- package/package.json +10 -3
- package/react-native.config.js +12 -0
- package/src/api/client.ts +66 -2
- package/src/attachments/pickers.ts +87 -25
- package/src/audio/native-player.ts +106 -0
- package/src/audio/voice.ts +30 -6
- package/src/i18n.ts +2 -0
- package/src/locales.ts +1 -0
- package/src/state/widget-store.ts +233 -33
- package/src/types.ts +17 -0
- package/src/ui/WidgetProvider.tsx +16 -7
- package/src/ui/components/ImageViewer.tsx +21 -36
- package/src/ui/components/MessagesSkeleton.tsx +92 -0
- package/src/ui/components/VoiceNote.tsx +6 -14
- package/src/ui/components/ZoomableImage.tsx +250 -0
- package/src/ui/components/icons.tsx +10 -12
- package/src/ui/screens/chat/ChatView.styles.ts +17 -9
- package/src/ui/screens/chat/ChatView.tsx +49 -25
- package/src/ui/screens/chat/ChatView.types.ts +4 -0
- package/src/ui/styles/theme.ts +6 -0
- package/src/ui/utils/conversations.ts +16 -2
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import AVFoundation
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* One voice note on the system AVPlayer. Created, driven and released on the
|
|
5
|
+
* main queue; observers hop back to it before touching anything.
|
|
6
|
+
*/
|
|
7
|
+
final class RepzoVoicePlayer {
|
|
8
|
+
private let player: AVPlayer
|
|
9
|
+
private let item: AVPlayerItem
|
|
10
|
+
private let onStatus: ([String: Any?]) -> Void
|
|
11
|
+
private var rate: Float = 1
|
|
12
|
+
private var released = false
|
|
13
|
+
private var timeObserver: Any?
|
|
14
|
+
private var observations: [NSKeyValueObservation] = []
|
|
15
|
+
private var notificationObservers: [NSObjectProtocol] = []
|
|
16
|
+
|
|
17
|
+
init(url: URL, onStatus: @escaping ([String: Any?]) -> Void) {
|
|
18
|
+
self.onStatus = onStatus
|
|
19
|
+
item = AVPlayerItem(url: url)
|
|
20
|
+
// Keeps voices at their normal pitch at 1.5× and 2×.
|
|
21
|
+
item.audioTimePitchAlgorithm = .timeDomain
|
|
22
|
+
player = AVPlayer(playerItem: item)
|
|
23
|
+
|
|
24
|
+
observations = [
|
|
25
|
+
item.observe(\.status) { [weak self] _, _ in self?.emitOnMain() },
|
|
26
|
+
item.observe(\.duration) { [weak self] _, _ in self?.emitOnMain() },
|
|
27
|
+
player.observe(\.timeControlStatus) { [weak self] _, _ in self?.emitOnMain() },
|
|
28
|
+
]
|
|
29
|
+
// Moves the playhead while the note plays.
|
|
30
|
+
timeObserver = player.addPeriodicTimeObserver(
|
|
31
|
+
forInterval: CMTime(value: 1, timescale: 10),
|
|
32
|
+
queue: .main
|
|
33
|
+
) { [weak self] _ in
|
|
34
|
+
guard let self = self, self.player.timeControlStatus == .playing else { return }
|
|
35
|
+
self.emit()
|
|
36
|
+
}
|
|
37
|
+
let center = NotificationCenter.default
|
|
38
|
+
notificationObservers = [
|
|
39
|
+
center.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: item, queue: .main) { [weak self] _ in
|
|
40
|
+
self?.finish()
|
|
41
|
+
},
|
|
42
|
+
center.addObserver(forName: .AVPlayerItemFailedToPlayToEndTime, object: item, queue: .main) { [weak self] _ in
|
|
43
|
+
self?.emit()
|
|
44
|
+
},
|
|
45
|
+
// A call or another app taking the audio pauses the note, as messaging apps do.
|
|
46
|
+
center.addObserver(forName: AVAudioSession.interruptionNotification, object: nil, queue: .main) { [weak self] note in
|
|
47
|
+
let type = (note.userInfo?[AVAudioSessionInterruptionTypeKey] as? UInt).flatMap(AVAudioSession.InterruptionType.init)
|
|
48
|
+
if type == .began { self?.pause() }
|
|
49
|
+
},
|
|
50
|
+
]
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
func play() {
|
|
54
|
+
guard !released else { return }
|
|
55
|
+
RepzoVoiceSession.shared.begin(self)
|
|
56
|
+
let duration = item.duration.seconds
|
|
57
|
+
if duration.isFinite, duration > 0, player.currentTime().seconds >= duration - 0.05 {
|
|
58
|
+
player.seek(to: .zero)
|
|
59
|
+
}
|
|
60
|
+
// Starts once enough has loaded; until then timeControlStatus reports waiting.
|
|
61
|
+
player.rate = rate
|
|
62
|
+
emit()
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
func pause() {
|
|
66
|
+
guard !released else { return }
|
|
67
|
+
player.pause()
|
|
68
|
+
RepzoVoiceSession.shared.end(self)
|
|
69
|
+
emit()
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
func seek(to seconds: Double, completion: @escaping () -> Void) {
|
|
73
|
+
guard !released else {
|
|
74
|
+
completion()
|
|
75
|
+
return
|
|
76
|
+
}
|
|
77
|
+
let time = CMTime(seconds: max(0, seconds), preferredTimescale: 600)
|
|
78
|
+
player.seek(to: time, toleranceBefore: .zero, toleranceAfter: .zero) { [weak self] _ in
|
|
79
|
+
DispatchQueue.main.async {
|
|
80
|
+
self?.emit()
|
|
81
|
+
completion()
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
func setRate(_ value: Float) {
|
|
87
|
+
rate = value
|
|
88
|
+
// Setting the rate of a paused AVPlayer would start it.
|
|
89
|
+
if player.timeControlStatus != .paused { player.rate = value }
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
func release() {
|
|
93
|
+
guard !released else { return }
|
|
94
|
+
player.pause()
|
|
95
|
+
released = true
|
|
96
|
+
if let timeObserver = timeObserver { player.removeTimeObserver(timeObserver) }
|
|
97
|
+
timeObserver = nil
|
|
98
|
+
observations.forEach { $0.invalidate() }
|
|
99
|
+
observations = []
|
|
100
|
+
notificationObservers.forEach { NotificationCenter.default.removeObserver($0) }
|
|
101
|
+
notificationObservers = []
|
|
102
|
+
player.replaceCurrentItem(with: nil)
|
|
103
|
+
RepzoVoiceSession.shared.end(self)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
private func finish() {
|
|
107
|
+
guard !released else { return }
|
|
108
|
+
player.pause()
|
|
109
|
+
RepzoVoiceSession.shared.end(self)
|
|
110
|
+
emit(didJustFinish: true)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
private func emitOnMain() {
|
|
114
|
+
if Thread.isMainThread {
|
|
115
|
+
emit()
|
|
116
|
+
} else {
|
|
117
|
+
DispatchQueue.main.async { [weak self] in self?.emit() }
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
private func emit(didJustFinish: Bool = false) {
|
|
122
|
+
guard !released else { return }
|
|
123
|
+
let duration = item.duration.seconds
|
|
124
|
+
let current = player.currentTime().seconds
|
|
125
|
+
var error: String?
|
|
126
|
+
if item.status == .failed {
|
|
127
|
+
error = item.error?.localizedDescription ?? "Can't play this audio"
|
|
128
|
+
}
|
|
129
|
+
onStatus([
|
|
130
|
+
"currentTime": current.isFinite ? max(0, current) : 0,
|
|
131
|
+
"duration": duration.isFinite ? max(0, duration) : 0,
|
|
132
|
+
"playing": player.timeControlStatus == .playing,
|
|
133
|
+
"isLoaded": item.status == .readyToPlay,
|
|
134
|
+
"isBuffering": player.timeControlStatus == .waitingToPlayAtSpecifiedRate,
|
|
135
|
+
"didJustFinish": didJustFinish,
|
|
136
|
+
"error": error,
|
|
137
|
+
])
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* The app's audio session while a note plays. A note plays with the ringer
|
|
143
|
+
* switch on silent, like in messaging apps, so an app still on the default
|
|
144
|
+
* (silenced) category is moved to playback for the note and put back after.
|
|
145
|
+
* An app that chose its own category keeps it.
|
|
146
|
+
*/
|
|
147
|
+
final class RepzoVoiceSession {
|
|
148
|
+
static let shared = RepzoVoiceSession()
|
|
149
|
+
|
|
150
|
+
private weak var owner: RepzoVoicePlayer?
|
|
151
|
+
private var previous: (category: AVAudioSession.Category, mode: AVAudioSession.Mode, options: AVAudioSession.CategoryOptions)?
|
|
152
|
+
|
|
153
|
+
func begin(_ player: RepzoVoicePlayer) {
|
|
154
|
+
owner = player
|
|
155
|
+
let session = AVAudioSession.sharedInstance()
|
|
156
|
+
// Only .soloAmbient is the system default; .ambient is a deliberate choice
|
|
157
|
+
// to mix with music and follow the silent switch, so it's left alone.
|
|
158
|
+
if previous == nil, session.category == .soloAmbient {
|
|
159
|
+
previous = (session.category, session.mode, session.categoryOptions)
|
|
160
|
+
try? session.setCategory(.playback, mode: .spokenAudio, options: [])
|
|
161
|
+
}
|
|
162
|
+
try? session.setActive(true)
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
func end(_ player: RepzoVoicePlayer) {
|
|
166
|
+
guard owner === player else { return }
|
|
167
|
+
owner = nil
|
|
168
|
+
guard let previous = previous else { return }
|
|
169
|
+
self.previous = nil
|
|
170
|
+
let session = AVAudioSession.sharedInstance()
|
|
171
|
+
// Lets music the note interrupted carry on.
|
|
172
|
+
try? session.setActive(false, options: .notifyOthersOnDeactivation)
|
|
173
|
+
try? session.setCategory(previous.category, mode: previous.mode, options: previous.options)
|
|
174
|
+
}
|
|
175
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require 'json'
|
|
2
|
+
|
|
3
|
+
package = JSON.parse(File.read(File.join(__dir__, '..', 'package.json')))
|
|
4
|
+
|
|
5
|
+
Pod::Spec.new do |s|
|
|
6
|
+
s.name = 'RepzoWidgetAudio'
|
|
7
|
+
s.version = package['version']
|
|
8
|
+
s.summary = 'Plays voice messages inside the Repzo chat widget'
|
|
9
|
+
s.description = 'Plays voice messages inside the Repzo chat widget with the system audio player.'
|
|
10
|
+
s.license = package['license']
|
|
11
|
+
s.author = 'Repzo'
|
|
12
|
+
s.homepage = 'https://www.npmjs.com/package/@repzo/widget-react-native'
|
|
13
|
+
s.platforms = { :ios => '13.4' }
|
|
14
|
+
s.swift_version = '5.9'
|
|
15
|
+
s.source = { git: '' }
|
|
16
|
+
s.static_framework = true
|
|
17
|
+
|
|
18
|
+
s.dependency 'ExpoModulesCore'
|
|
19
|
+
|
|
20
|
+
s.pod_target_xcconfig = {
|
|
21
|
+
'DEFINES_MODULE' => 'YES',
|
|
22
|
+
'SWIFT_COMPILATION_MODE' => 'wholemodule'
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
s.source_files = '**/*.swift'
|
|
26
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import ExpoModulesCore
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Plays the chat's voice notes, so apps don't need an audio package of their
|
|
5
|
+
* own. JS addresses each note's player by an id it picks (see
|
|
6
|
+
* `src/audio/native-player.ts`); every change comes back as an `onStatus`
|
|
7
|
+
* event carrying that id.
|
|
8
|
+
*/
|
|
9
|
+
public class RepzoWidgetAudioModule: Module {
|
|
10
|
+
// Only touched on the main queue: every function below runs there.
|
|
11
|
+
private var players: [String: RepzoVoicePlayer] = [:]
|
|
12
|
+
|
|
13
|
+
public func definition() -> ModuleDefinition {
|
|
14
|
+
Name("RepzoWidgetAudio")
|
|
15
|
+
|
|
16
|
+
Events("onStatus")
|
|
17
|
+
|
|
18
|
+
AsyncFunction("create") { (id: String, url: URL) in
|
|
19
|
+
self.players.removeValue(forKey: id)?.release()
|
|
20
|
+
self.players[id] = RepzoVoicePlayer(url: url) { [weak self] status in
|
|
21
|
+
var body = status
|
|
22
|
+
body["id"] = id
|
|
23
|
+
self?.sendEvent("onStatus", body)
|
|
24
|
+
}
|
|
25
|
+
}.runOnQueue(.main)
|
|
26
|
+
|
|
27
|
+
AsyncFunction("play") { (id: String) in
|
|
28
|
+
self.players[id]?.play()
|
|
29
|
+
}.runOnQueue(.main)
|
|
30
|
+
|
|
31
|
+
AsyncFunction("pause") { (id: String) in
|
|
32
|
+
self.players[id]?.pause()
|
|
33
|
+
}.runOnQueue(.main)
|
|
34
|
+
|
|
35
|
+
AsyncFunction("seekTo") { (id: String, seconds: Double, promise: Promise) in
|
|
36
|
+
guard let player = self.players[id] else {
|
|
37
|
+
promise.resolve(nil)
|
|
38
|
+
return
|
|
39
|
+
}
|
|
40
|
+
player.seek(to: seconds) { promise.resolve(nil) }
|
|
41
|
+
}.runOnQueue(.main)
|
|
42
|
+
|
|
43
|
+
AsyncFunction("setRate") { (id: String, rate: Double) in
|
|
44
|
+
self.players[id]?.setRate(Float(rate))
|
|
45
|
+
}.runOnQueue(.main)
|
|
46
|
+
|
|
47
|
+
AsyncFunction("release") { (id: String) in
|
|
48
|
+
self.players.removeValue(forKey: id)?.release()
|
|
49
|
+
}.runOnQueue(.main)
|
|
50
|
+
|
|
51
|
+
// Leaving the app pauses every note, including one still loading, so it
|
|
52
|
+
// doesn't keep playing with its controls out of sight (apps with the
|
|
53
|
+
// background audio mode would otherwise carry on).
|
|
54
|
+
OnAppEntersBackground {
|
|
55
|
+
self.players.values.forEach { $0.pause() }
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
OnDestroy {
|
|
59
|
+
DispatchQueue.main.async {
|
|
60
|
+
self.players.values.forEach { $0.release() }
|
|
61
|
+
self.players.removeAll()
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -278,6 +278,46 @@ class WidgetApiClient {
|
|
|
278
278
|
body: data
|
|
279
279
|
});
|
|
280
280
|
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Puts a local file in storage ahead of the message, which then names it by
|
|
284
|
+
* the returned upload token. The target is presigned storage, or a path on
|
|
285
|
+
* the server where its storage can't presign. The file is read as a native
|
|
286
|
+
* blob, so it never becomes a JS string; its size is the blob's, since the
|
|
287
|
+
* upload URL is signed for exactly the size asked for.
|
|
288
|
+
*/
|
|
289
|
+
async uploadAttachment(file) {
|
|
290
|
+
let blob;
|
|
291
|
+
try {
|
|
292
|
+
blob = await (await fetch(file.uri)).blob();
|
|
293
|
+
} catch (error) {
|
|
294
|
+
throw new RepzoWidgetError(error instanceof Error ? error.message : 'Could not read the file', 0, 'network');
|
|
295
|
+
}
|
|
296
|
+
const target = await this.request('/api/widget/uploads', {
|
|
297
|
+
method: 'POST',
|
|
298
|
+
body: {
|
|
299
|
+
fileName: file.name,
|
|
300
|
+
contentType: file.contentType,
|
|
301
|
+
size: blob.size || file.size
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
const uploadUrl = this.resolveUrl(target.uploadUrl);
|
|
305
|
+
if (!uploadUrl) throw new RepzoWidgetError('Invalid upload target', 0, 'http');
|
|
306
|
+
let response;
|
|
307
|
+
try {
|
|
308
|
+
response = await fetch(uploadUrl, {
|
|
309
|
+
method: target.method ?? 'PUT',
|
|
310
|
+
headers: target.headers ?? {
|
|
311
|
+
'Content-Type': file.contentType
|
|
312
|
+
},
|
|
313
|
+
body: blob
|
|
314
|
+
});
|
|
315
|
+
} catch (error) {
|
|
316
|
+
throw new RepzoWidgetError(error instanceof Error ? error.message : 'Upload failed', 0, 'network');
|
|
317
|
+
}
|
|
318
|
+
if (!response.ok) throw new RepzoWidgetError('Upload failed', response.status, 'http');
|
|
319
|
+
return target.uploadToken;
|
|
320
|
+
}
|
|
281
321
|
listConversations() {
|
|
282
322
|
return this.request('/api/widget/conversations');
|
|
283
323
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_storage","require","_safeUrl","TERMINAL_CODES","Set","isTerminalErrorCode","code","has","RepzoWidgetError","Error","constructor","message","status","name","fromResponse","body","payload","exports","WidgetApiClient","baseUrl","channelAccountId","token","tokenLoaded","reauthorize","onTerminalError","sendPartBatch","configure","replace","getBaseUrl","getChannelAccountId","getToken","SecureStorage","getItem","TOKEN_KEY","setToken","setItem","clearToken","removeItem","resolveUrl","url","trimmed","trim","isHttpUrl","urlScheme","resolved","startsWith","request","path","options","sentToken","send","headers","authToken","undefined","Authorization","fetch","method","JSON","stringify","error","response","skipReauth","refreshed","ok","json","catch","getConfig","platform","query","encodeURIComponent","getOutboundMessage","askSendPart","getPost","part","own","Promise","resolve","reject","setTimeout","flushSendParts","push","asks","parts","Array","from","map","ask","answer","length","join","value","then","sendPostInteraction","campaignId","kind","init","params","visitorToken","resumeToken","user","email","phone","userId","user_id","userHash","user_hash","account","id","signedUpAt","signed_up_at","Date","toISOString","trackingVisitorId","sdkVersion","logout","sendMessage","data","listConversations","listMessages","conversationId","cursor","markConversationRead","rateConversation","ratingId","identify","sendTyping","isTyping","trackEvent","registerPushToken","reportPushOpened","deliveryId","removePushToken","auth"],"sourceRoot":"../../../src","sources":["api/client.ts"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_storage","require","_safeUrl","TERMINAL_CODES","Set","isTerminalErrorCode","code","has","RepzoWidgetError","Error","constructor","message","status","name","fromResponse","body","payload","exports","WidgetApiClient","baseUrl","channelAccountId","token","tokenLoaded","reauthorize","onTerminalError","sendPartBatch","configure","replace","getBaseUrl","getChannelAccountId","getToken","SecureStorage","getItem","TOKEN_KEY","setToken","setItem","clearToken","removeItem","resolveUrl","url","trimmed","trim","isHttpUrl","urlScheme","resolved","startsWith","request","path","options","sentToken","send","headers","authToken","undefined","Authorization","fetch","method","JSON","stringify","error","response","skipReauth","refreshed","ok","json","catch","getConfig","platform","query","encodeURIComponent","getOutboundMessage","askSendPart","getPost","part","own","Promise","resolve","reject","setTimeout","flushSendParts","push","asks","parts","Array","from","map","ask","answer","length","join","value","then","sendPostInteraction","campaignId","kind","init","params","visitorToken","resumeToken","user","email","phone","userId","user_id","userHash","user_hash","account","id","signedUpAt","signed_up_at","Date","toISOString","trackingVisitorId","sdkVersion","logout","sendMessage","data","uploadAttachment","file","blob","uri","target","fileName","contentType","size","uploadUrl","uploadToken","listConversations","listMessages","conversationId","cursor","markConversationRead","rateConversation","ratingId","identify","sendTyping","isTyping","trackEvent","registerPushToken","reportPushOpened","deliveryId","removePushToken","auth"],"sourceRoot":"../../../src","sources":["api/client.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -15,8 +15,12 @@ exports.pickAttachments = pickAttachments;
|
|
|
15
15
|
exports.setAttachmentOptions = setAttachmentOptions;
|
|
16
16
|
exports.stripDataUrlPrefix = stripDataUrlPrefix;
|
|
17
17
|
/**
|
|
18
|
-
* Visitor attachments: picking photos/files
|
|
19
|
-
*
|
|
18
|
+
* Visitor attachments: picking photos/files for `POST /api/widget/messages`.
|
|
19
|
+
*
|
|
20
|
+
* A server that takes uploads names its cap (`maxAttachmentBytes`): a picked
|
|
21
|
+
* file then stays a local URI and is uploaded when the message is sent. An
|
|
22
|
+
* older server only takes files inline, as base64 data URLs within the
|
|
23
|
+
* 1.5 MB / 6 MB caps below.
|
|
20
24
|
*
|
|
21
25
|
* The SDK ships no native code, so every picker is borrowed from the host —
|
|
22
26
|
* the same approach as `storage.ts` and `native-gradient.ts`:
|
|
@@ -24,7 +28,7 @@ exports.stripDataUrlPrefix = stripDataUrlPrefix;
|
|
|
24
28
|
* - `expo-document-picker` → any file
|
|
25
29
|
* - `expo-file-system` → reads a picked file as base64 (optional; without it
|
|
26
30
|
* the file is read through `fetch` + `FileReader`)
|
|
27
|
-
* - `expo-image-manipulator` → shrinks photos to fit the 1.5 MB cap (optional;
|
|
31
|
+
* - `expo-image-manipulator` → shrinks photos, to fit the 1.5 MB inline cap (optional;
|
|
28
32
|
* without it a full-resolution camera photo is usually refused as too large)
|
|
29
33
|
*
|
|
30
34
|
* A host without those (or with `react-native-image-picker` etc.) plugs its own
|
|
@@ -37,10 +41,10 @@ exports.stripDataUrlPrefix = stripDataUrlPrefix;
|
|
|
37
41
|
|
|
38
42
|
/** The server keeps the first five and silently drops the rest. */
|
|
39
43
|
const MAX_ATTACHMENTS = exports.MAX_ATTACHMENTS = 5;
|
|
40
|
-
/** Per file, decoded. The server silently drops anything larger. */
|
|
44
|
+
/** Per inline file, decoded. The server silently drops anything larger. */
|
|
41
45
|
const MAX_ATTACHMENT_BYTES = exports.MAX_ATTACHMENT_BYTES = 1_500_000;
|
|
42
46
|
/**
|
|
43
|
-
* All files in one message, decoded. Base64 inside JSON inflates bytes by
|
|
47
|
+
* All inline files in one message, decoded. Base64 inside JSON inflates bytes by
|
|
44
48
|
* ~1.37x and the server caps a request body at 10 MB, so five files at the
|
|
45
49
|
* per-file maximum would come back as a 413.
|
|
46
50
|
*/
|
|
@@ -49,7 +53,7 @@ const MAX_TOTAL_ATTACHMENT_BYTES = exports.MAX_TOTAL_ATTACHMENT_BYTES = 6_000_00
|
|
|
49
53
|
/** Photos are re-encoded at this JPEG quality — small enough to fit the cap more often. */
|
|
50
54
|
const IMAGE_QUALITY = 0.7;
|
|
51
55
|
|
|
52
|
-
/** A picked file,
|
|
56
|
+
/** A picked file, ready to send; what the composer shows as a chip. */
|
|
53
57
|
|
|
54
58
|
/** Why some (or all) of a pick didn't make it into the composer. */
|
|
55
59
|
|
|
@@ -122,9 +126,10 @@ const CAMERA_DENIED = 'cameraDenied';
|
|
|
122
126
|
|
|
123
127
|
/**
|
|
124
128
|
* Opens the picker for `source` and returns what fits alongside `current`.
|
|
129
|
+
* `uploadLimit` is the server's upload cap; without it files go inline.
|
|
125
130
|
* Never throws: a cancelled pick is `{ added: [], problem: null }`.
|
|
126
131
|
*/
|
|
127
|
-
async function pickAttachments(source, current) {
|
|
132
|
+
async function pickAttachments(source, current, uploadLimit = null) {
|
|
128
133
|
const slots = MAX_ATTACHMENTS - current.length;
|
|
129
134
|
if (slots <= 0) return {
|
|
130
135
|
added: [],
|
|
@@ -132,7 +137,7 @@ async function pickAttachments(source, current) {
|
|
|
132
137
|
};
|
|
133
138
|
let picked;
|
|
134
139
|
try {
|
|
135
|
-
picked = hostOptions?.pick ? await hostOptions.pick(source) : await launchBuiltInPicker(source, slots);
|
|
140
|
+
picked = hostOptions?.pick ? await hostOptions.pick(source) : await launchBuiltInPicker(source, slots, !!uploadLimit);
|
|
136
141
|
} catch (error) {
|
|
137
142
|
console.warn('[repzo-widget] attachment picker failed', error);
|
|
138
143
|
return {
|
|
@@ -158,15 +163,16 @@ async function pickAttachments(source, current) {
|
|
|
158
163
|
}
|
|
159
164
|
// A size the picker already knows rules a file out before it's read, so
|
|
160
165
|
// a 40 MB video never lands in memory as a base64 string.
|
|
161
|
-
const
|
|
162
|
-
const
|
|
166
|
+
const uploads = !!uploadLimit && !!file.uri;
|
|
167
|
+
const declared = file.base64 && !uploads ? null : validSize(file.size);
|
|
168
|
+
const early = declared === null ? null : checkAttachmentFits(accepted, declared, uploads ? uploadLimit : null);
|
|
163
169
|
if (early) {
|
|
164
170
|
problem = problem ?? early;
|
|
165
171
|
continue;
|
|
166
172
|
}
|
|
167
173
|
let draft;
|
|
168
174
|
try {
|
|
169
|
-
draft = await toDraft(file);
|
|
175
|
+
draft = uploads ? await toUploadDraft(file, uploadLimit) : await toDraft(file);
|
|
170
176
|
} catch (error) {
|
|
171
177
|
if (error === TOO_LARGE) {
|
|
172
178
|
problem = problem ?? 'tooLarge';
|
|
@@ -176,7 +182,7 @@ async function pickAttachments(source, current) {
|
|
|
176
182
|
problem = problem ?? 'failed';
|
|
177
183
|
continue;
|
|
178
184
|
}
|
|
179
|
-
const fits = draft.size > 0 ? checkAttachmentFits(accepted, draft.size) : 'failed';
|
|
185
|
+
const fits = draft.size > 0 ? checkAttachmentFits(accepted, draft.size, uploads ? uploadLimit : null) : 'failed';
|
|
180
186
|
if (fits) {
|
|
181
187
|
problem = problem ?? fits;
|
|
182
188
|
continue;
|
|
@@ -188,7 +194,7 @@ async function pickAttachments(source, current) {
|
|
|
188
194
|
problem
|
|
189
195
|
};
|
|
190
196
|
}
|
|
191
|
-
async function launchBuiltInPicker(source, slots) {
|
|
197
|
+
async function launchBuiltInPicker(source, slots, uploads) {
|
|
192
198
|
if (source === 'file') {
|
|
193
199
|
if (!documentPicker) return null;
|
|
194
200
|
const result = await documentPicker.getDocumentAsync({
|
|
@@ -209,9 +215,10 @@ async function launchBuiltInPicker(source, slots) {
|
|
|
209
215
|
if (!imagePicker) return null;
|
|
210
216
|
const options = {
|
|
211
217
|
quality: IMAGE_QUALITY,
|
|
212
|
-
// With the manipulator the photo is re-encoded below,
|
|
213
|
-
// (full-resolution)
|
|
214
|
-
base64
|
|
218
|
+
// With the manipulator the photo is re-encoded below, and an uploaded
|
|
219
|
+
// photo is read from its file, so the picker's own (full-resolution)
|
|
220
|
+
// base64 would only waste memory.
|
|
221
|
+
base64: !uploads && !imageManipulator,
|
|
215
222
|
exif: false
|
|
216
223
|
};
|
|
217
224
|
let result;
|
|
@@ -230,13 +237,13 @@ async function launchBuiltInPicker(source, slots) {
|
|
|
230
237
|
const assets = Array.isArray(result?.assets) ? result.assets : [];
|
|
231
238
|
const files = [];
|
|
232
239
|
for (const [index, asset] of assets.slice(0, slots).entries()) {
|
|
233
|
-
const shrunk = await shrinkPhoto(asset);
|
|
240
|
+
const shrunk = await shrinkPhoto(asset, !uploads);
|
|
234
241
|
const type = shrunk ? 'image/jpeg' : asset.mimeType || guessContentType(asset.fileName || asset.uri) || 'image/jpeg';
|
|
235
242
|
const baseName = (asset.fileName || `photo-${Date.now()}-${index + 1}`).replace(/\.[^.]+$/, '');
|
|
236
243
|
files.push({
|
|
237
244
|
name: `${baseName}.${extensionFor(type)}`,
|
|
238
245
|
type,
|
|
239
|
-
// No `size`: `fileSize` is the original's, not the re-encoded
|
|
246
|
+
// No `size`: `fileSize` is the original's, not the re-encoded file's.
|
|
240
247
|
uri: shrunk?.uri ?? asset.uri,
|
|
241
248
|
base64: shrunk?.base64 ?? asset.base64 ?? undefined
|
|
242
249
|
});
|
|
@@ -270,7 +277,7 @@ async function launchImagePicker(launch, options) {
|
|
|
270
277
|
* MAX_IMAGE_EDGE. Null when the manipulator isn't installed or fails — the
|
|
271
278
|
* caller then falls back to the picker's own output (and the size check).
|
|
272
279
|
*/
|
|
273
|
-
async function shrinkPhoto(asset) {
|
|
280
|
+
async function shrinkPhoto(asset, withBase64) {
|
|
274
281
|
if (!imageManipulator || !asset?.uri) return null;
|
|
275
282
|
const width = Number(asset.width) || 0;
|
|
276
283
|
const height = Number(asset.height) || 0;
|
|
@@ -283,7 +290,7 @@ async function shrinkPhoto(asset) {
|
|
|
283
290
|
const saveOptions = {
|
|
284
291
|
compress: IMAGE_QUALITY,
|
|
285
292
|
format: imageManipulator.SaveFormat?.JPEG ?? 'jpeg',
|
|
286
|
-
base64:
|
|
293
|
+
base64: withBase64
|
|
287
294
|
};
|
|
288
295
|
try {
|
|
289
296
|
let output;
|
|
@@ -297,6 +304,9 @@ async function shrinkPhoto(asset) {
|
|
|
297
304
|
const image = await context.renderAsync();
|
|
298
305
|
output = await image.saveAsync(saveOptions);
|
|
299
306
|
}
|
|
307
|
+
if (!withBase64) return typeof output?.uri === 'string' && output.uri ? {
|
|
308
|
+
uri: output.uri
|
|
309
|
+
} : null;
|
|
300
310
|
return typeof output?.base64 === 'string' && output.base64 ? {
|
|
301
311
|
uri: output.uri ?? asset.uri,
|
|
302
312
|
base64: output.base64
|
|
@@ -327,6 +337,48 @@ async function toDraft(file) {
|
|
|
327
337
|
};
|
|
328
338
|
}
|
|
329
339
|
|
|
340
|
+
/** A file that's uploaded when the message is sent: only its size is read here. */
|
|
341
|
+
async function toUploadDraft(file, uploadLimit) {
|
|
342
|
+
const uri = file.uri;
|
|
343
|
+
const size = validSize(file.size) ?? (await readFileSize(uri));
|
|
344
|
+
if (size > uploadLimit) throw TOO_LARGE;
|
|
345
|
+
const name = (file.name || fileNameFromUri(uri) || 'file').slice(0, 255);
|
|
346
|
+
return {
|
|
347
|
+
id: `draft-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
|
|
348
|
+
name,
|
|
349
|
+
contentType: normalizeContentType(file.type) ?? guessContentType(name) ?? 'application/octet-stream',
|
|
350
|
+
size,
|
|
351
|
+
dataUrl: '',
|
|
352
|
+
fileUri: uri,
|
|
353
|
+
previewUri: uri
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/** A local file's size in bytes, or 0 when nothing can tell. */
|
|
358
|
+
async function readFileSize(uri) {
|
|
359
|
+
if (typeof fileSystem?.File === 'function') {
|
|
360
|
+
try {
|
|
361
|
+
const size = validSize(new fileSystem.File(uri).size);
|
|
362
|
+
if (size !== null) return size;
|
|
363
|
+
} catch {
|
|
364
|
+
// Fall through to the next reader.
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
if (typeof fileSystem?.getInfoAsync === 'function') {
|
|
368
|
+
try {
|
|
369
|
+
const size = validSize((await fileSystem.getInfoAsync(uri, {
|
|
370
|
+
size: true
|
|
371
|
+
}))?.size);
|
|
372
|
+
if (size !== null) return size;
|
|
373
|
+
} catch {
|
|
374
|
+
// Fall through to fetch.
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
// A native blob: its size is known without reading it into JS.
|
|
378
|
+
const blob = await (await fetch(uri)).blob();
|
|
379
|
+
return validSize(blob.size) ?? 0;
|
|
380
|
+
}
|
|
381
|
+
|
|
330
382
|
/** Thrown (by identity) when a file is over the per-file cap before it's read. */
|
|
331
383
|
const TOO_LARGE = new Error('File exceeds the attachment cap');
|
|
332
384
|
|
|
@@ -394,11 +446,16 @@ async function readBase64WithFetch(uri) {
|
|
|
394
446
|
|
|
395
447
|
// ─── Pure helpers ──────────────────────────────────────────────────────────
|
|
396
448
|
|
|
397
|
-
/**
|
|
398
|
-
|
|
449
|
+
/**
|
|
450
|
+
* Null when a file of `size` bytes still fits beside `current`; otherwise the
|
|
451
|
+
* limit it breaks. With `uploadLimit` the file is uploaded on its own, so
|
|
452
|
+
* only its own size counts; inline files also share one request body.
|
|
453
|
+
*/
|
|
454
|
+
function checkAttachmentFits(current, size, uploadLimit = null) {
|
|
399
455
|
if (current.length >= MAX_ATTACHMENTS) return 'tooMany';
|
|
456
|
+
if (uploadLimit) return size > uploadLimit ? 'tooLarge' : null;
|
|
400
457
|
if (size > MAX_ATTACHMENT_BYTES) return 'tooLarge';
|
|
401
|
-
const total = current.reduce((sum, item) => sum + item.size, 0);
|
|
458
|
+
const total = current.filter(item => !item.fileUri).reduce((sum, item) => sum + item.size, 0);
|
|
402
459
|
if (total + size > MAX_TOTAL_ATTACHMENT_BYTES) return 'tooLargeTogether';
|
|
403
460
|
return null;
|
|
404
461
|
}
|