@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.
Files changed (172) hide show
  1. package/CHANGELOG.md +88 -0
  2. package/README.md +43 -33
  3. package/android/build.gradle +22 -0
  4. package/android/src/main/java/expo/modules/repzowidget/RepzoVoicePlayer.kt +222 -0
  5. package/android/src/main/java/expo/modules/repzowidget/RepzoWidgetAudioModule.kt +68 -0
  6. package/expo-module.config.json +9 -0
  7. package/ios/RepzoVoicePlayer.swift +175 -0
  8. package/ios/RepzoWidgetAudio.podspec +26 -0
  9. package/ios/RepzoWidgetAudioModule.swift +65 -0
  10. package/lib/commonjs/api/client.js +40 -0
  11. package/lib/commonjs/api/client.js.map +1 -1
  12. package/lib/commonjs/attachments/pickers.js +80 -23
  13. package/lib/commonjs/attachments/pickers.js.map +1 -1
  14. package/lib/commonjs/audio/native-player.js +97 -0
  15. package/lib/commonjs/audio/native-player.js.map +1 -0
  16. package/lib/commonjs/audio/voice.js +34 -7
  17. package/lib/commonjs/audio/voice.js.map +1 -1
  18. package/lib/commonjs/i18n.js +2 -0
  19. package/lib/commonjs/i18n.js.map +1 -1
  20. package/lib/commonjs/locales.js +1 -0
  21. package/lib/commonjs/locales.js.map +1 -1
  22. package/lib/commonjs/state/widget-store.js +238 -40
  23. package/lib/commonjs/state/widget-store.js.map +1 -1
  24. package/lib/commonjs/types.js.map +1 -1
  25. package/lib/commonjs/ui/WidgetProvider.js +8 -6
  26. package/lib/commonjs/ui/WidgetProvider.js.map +1 -1
  27. package/lib/commonjs/ui/components/ImageViewer.js +20 -37
  28. package/lib/commonjs/ui/components/ImageViewer.js.map +1 -1
  29. package/lib/commonjs/ui/components/MessagesSkeleton.js +126 -0
  30. package/lib/commonjs/ui/components/MessagesSkeleton.js.map +1 -0
  31. package/lib/commonjs/ui/components/VoiceNote.js +8 -9
  32. package/lib/commonjs/ui/components/VoiceNote.js.map +1 -1
  33. package/lib/commonjs/ui/components/ZoomableImage.js +299 -0
  34. package/lib/commonjs/ui/components/ZoomableImage.js.map +1 -0
  35. package/lib/commonjs/ui/components/icons.js +22 -16
  36. package/lib/commonjs/ui/components/icons.js.map +1 -1
  37. package/lib/commonjs/ui/screens/chat/ChatView.js +42 -18
  38. package/lib/commonjs/ui/screens/chat/ChatView.js.map +1 -1
  39. package/lib/commonjs/ui/screens/chat/ChatView.styles.js +17 -9
  40. package/lib/commonjs/ui/screens/chat/ChatView.styles.js.map +1 -1
  41. package/lib/commonjs/ui/styles/theme.js +1 -0
  42. package/lib/commonjs/ui/styles/theme.js.map +1 -1
  43. package/lib/commonjs/ui/utils/conversations.js +17 -1
  44. package/lib/commonjs/ui/utils/conversations.js.map +1 -1
  45. package/lib/module/api/client.js +40 -0
  46. package/lib/module/api/client.js.map +1 -1
  47. package/lib/module/attachments/pickers.js +80 -23
  48. package/lib/module/attachments/pickers.js.map +1 -1
  49. package/lib/module/audio/native-player.js +93 -0
  50. package/lib/module/audio/native-player.js.map +1 -0
  51. package/lib/module/audio/voice.js +32 -6
  52. package/lib/module/audio/voice.js.map +1 -1
  53. package/lib/module/i18n.js +2 -0
  54. package/lib/module/i18n.js.map +1 -1
  55. package/lib/module/locales.js +1 -0
  56. package/lib/module/locales.js.map +1 -1
  57. package/lib/module/state/widget-store.js +238 -40
  58. package/lib/module/state/widget-store.js.map +1 -1
  59. package/lib/module/types.js.map +1 -1
  60. package/lib/module/ui/WidgetProvider.js +8 -6
  61. package/lib/module/ui/WidgetProvider.js.map +1 -1
  62. package/lib/module/ui/components/ImageViewer.js +21 -38
  63. package/lib/module/ui/components/ImageViewer.js.map +1 -1
  64. package/lib/module/ui/components/MessagesSkeleton.js +124 -0
  65. package/lib/module/ui/components/MessagesSkeleton.js.map +1 -0
  66. package/lib/module/ui/components/VoiceNote.js +9 -10
  67. package/lib/module/ui/components/VoiceNote.js.map +1 -1
  68. package/lib/module/ui/components/ZoomableImage.js +291 -0
  69. package/lib/module/ui/components/ZoomableImage.js.map +1 -0
  70. package/lib/module/ui/components/icons.js +21 -15
  71. package/lib/module/ui/components/icons.js.map +1 -1
  72. package/lib/module/ui/screens/chat/ChatView.js +44 -20
  73. package/lib/module/ui/screens/chat/ChatView.js.map +1 -1
  74. package/lib/module/ui/screens/chat/ChatView.styles.js +17 -9
  75. package/lib/module/ui/screens/chat/ChatView.styles.js.map +1 -1
  76. package/lib/module/ui/styles/theme.js +1 -0
  77. package/lib/module/ui/styles/theme.js.map +1 -1
  78. package/lib/module/ui/utils/conversations.js +15 -1
  79. package/lib/module/ui/utils/conversations.js.map +1 -1
  80. package/lib/typescript/commonjs/api/client.d.ts +27 -1
  81. package/lib/typescript/commonjs/api/client.d.ts.map +1 -1
  82. package/lib/typescript/commonjs/attachments/pickers.d.ts +22 -10
  83. package/lib/typescript/commonjs/attachments/pickers.d.ts.map +1 -1
  84. package/lib/typescript/commonjs/audio/native-player.d.ts +36 -0
  85. package/lib/typescript/commonjs/audio/native-player.d.ts.map +1 -0
  86. package/lib/typescript/commonjs/audio/voice.d.ts +17 -4
  87. package/lib/typescript/commonjs/audio/voice.d.ts.map +1 -1
  88. package/lib/typescript/commonjs/i18n.d.ts +1 -0
  89. package/lib/typescript/commonjs/i18n.d.ts.map +1 -1
  90. package/lib/typescript/commonjs/locales.d.ts.map +1 -1
  91. package/lib/typescript/commonjs/state/widget-store.d.ts +38 -3
  92. package/lib/typescript/commonjs/state/widget-store.d.ts.map +1 -1
  93. package/lib/typescript/commonjs/types.d.ts +17 -0
  94. package/lib/typescript/commonjs/types.d.ts.map +1 -1
  95. package/lib/typescript/commonjs/ui/WidgetProvider.d.ts.map +1 -1
  96. package/lib/typescript/commonjs/ui/components/ImageViewer.d.ts +2 -2
  97. package/lib/typescript/commonjs/ui/components/ImageViewer.d.ts.map +1 -1
  98. package/lib/typescript/commonjs/ui/components/MessagesSkeleton.d.ts +10 -0
  99. package/lib/typescript/commonjs/ui/components/MessagesSkeleton.d.ts.map +1 -0
  100. package/lib/typescript/commonjs/ui/components/VoiceNote.d.ts +2 -2
  101. package/lib/typescript/commonjs/ui/components/VoiceNote.d.ts.map +1 -1
  102. package/lib/typescript/commonjs/ui/components/ZoomableImage.d.ts +45 -0
  103. package/lib/typescript/commonjs/ui/components/ZoomableImage.d.ts.map +1 -0
  104. package/lib/typescript/commonjs/ui/components/icons.d.ts +2 -1
  105. package/lib/typescript/commonjs/ui/components/icons.d.ts.map +1 -1
  106. package/lib/typescript/commonjs/ui/screens/chat/ChatView.d.ts +1 -1
  107. package/lib/typescript/commonjs/ui/screens/chat/ChatView.d.ts.map +1 -1
  108. package/lib/typescript/commonjs/ui/screens/chat/ChatView.styles.d.ts +14 -9
  109. package/lib/typescript/commonjs/ui/screens/chat/ChatView.styles.d.ts.map +1 -1
  110. package/lib/typescript/commonjs/ui/screens/chat/ChatView.types.d.ts +4 -0
  111. package/lib/typescript/commonjs/ui/screens/chat/ChatView.types.d.ts.map +1 -1
  112. package/lib/typescript/commonjs/ui/styles/theme.d.ts +2 -0
  113. package/lib/typescript/commonjs/ui/styles/theme.d.ts.map +1 -1
  114. package/lib/typescript/commonjs/ui/utils/conversations.d.ts +10 -2
  115. package/lib/typescript/commonjs/ui/utils/conversations.d.ts.map +1 -1
  116. package/lib/typescript/module/api/client.d.ts +27 -1
  117. package/lib/typescript/module/api/client.d.ts.map +1 -1
  118. package/lib/typescript/module/attachments/pickers.d.ts +22 -10
  119. package/lib/typescript/module/attachments/pickers.d.ts.map +1 -1
  120. package/lib/typescript/module/audio/native-player.d.ts +36 -0
  121. package/lib/typescript/module/audio/native-player.d.ts.map +1 -0
  122. package/lib/typescript/module/audio/voice.d.ts +17 -4
  123. package/lib/typescript/module/audio/voice.d.ts.map +1 -1
  124. package/lib/typescript/module/i18n.d.ts +1 -0
  125. package/lib/typescript/module/i18n.d.ts.map +1 -1
  126. package/lib/typescript/module/locales.d.ts.map +1 -1
  127. package/lib/typescript/module/state/widget-store.d.ts +38 -3
  128. package/lib/typescript/module/state/widget-store.d.ts.map +1 -1
  129. package/lib/typescript/module/types.d.ts +17 -0
  130. package/lib/typescript/module/types.d.ts.map +1 -1
  131. package/lib/typescript/module/ui/WidgetProvider.d.ts.map +1 -1
  132. package/lib/typescript/module/ui/components/ImageViewer.d.ts +2 -2
  133. package/lib/typescript/module/ui/components/ImageViewer.d.ts.map +1 -1
  134. package/lib/typescript/module/ui/components/MessagesSkeleton.d.ts +10 -0
  135. package/lib/typescript/module/ui/components/MessagesSkeleton.d.ts.map +1 -0
  136. package/lib/typescript/module/ui/components/VoiceNote.d.ts +2 -2
  137. package/lib/typescript/module/ui/components/VoiceNote.d.ts.map +1 -1
  138. package/lib/typescript/module/ui/components/ZoomableImage.d.ts +45 -0
  139. package/lib/typescript/module/ui/components/ZoomableImage.d.ts.map +1 -0
  140. package/lib/typescript/module/ui/components/icons.d.ts +2 -1
  141. package/lib/typescript/module/ui/components/icons.d.ts.map +1 -1
  142. package/lib/typescript/module/ui/screens/chat/ChatView.d.ts +1 -1
  143. package/lib/typescript/module/ui/screens/chat/ChatView.d.ts.map +1 -1
  144. package/lib/typescript/module/ui/screens/chat/ChatView.styles.d.ts +14 -9
  145. package/lib/typescript/module/ui/screens/chat/ChatView.styles.d.ts.map +1 -1
  146. package/lib/typescript/module/ui/screens/chat/ChatView.types.d.ts +4 -0
  147. package/lib/typescript/module/ui/screens/chat/ChatView.types.d.ts.map +1 -1
  148. package/lib/typescript/module/ui/styles/theme.d.ts +2 -0
  149. package/lib/typescript/module/ui/styles/theme.d.ts.map +1 -1
  150. package/lib/typescript/module/ui/utils/conversations.d.ts +10 -2
  151. package/lib/typescript/module/ui/utils/conversations.d.ts.map +1 -1
  152. package/package.json +10 -3
  153. package/react-native.config.js +12 -0
  154. package/src/api/client.ts +66 -2
  155. package/src/attachments/pickers.ts +87 -25
  156. package/src/audio/native-player.ts +106 -0
  157. package/src/audio/voice.ts +30 -6
  158. package/src/i18n.ts +2 -0
  159. package/src/locales.ts +1 -0
  160. package/src/state/widget-store.ts +233 -33
  161. package/src/types.ts +17 -0
  162. package/src/ui/WidgetProvider.tsx +16 -7
  163. package/src/ui/components/ImageViewer.tsx +21 -36
  164. package/src/ui/components/MessagesSkeleton.tsx +92 -0
  165. package/src/ui/components/VoiceNote.tsx +6 -14
  166. package/src/ui/components/ZoomableImage.tsx +250 -0
  167. package/src/ui/components/icons.tsx +10 -12
  168. package/src/ui/screens/chat/ChatView.styles.ts +17 -9
  169. package/src/ui/screens/chat/ChatView.tsx +49 -25
  170. package/src/ui/screens/chat/ChatView.types.ts +4 -0
  171. package/src/ui/styles/theme.ts +6 -0
  172. 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 and turning them into the base64
19
- * data URLs `POST /api/widget/messages` accepts.
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, encoded and ready to send; what the composer shows as a chip. */
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 declared = file.base64 ? null : validSize(file.size);
162
- const early = declared === null ? null : checkAttachmentFits(accepted, declared);
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, so the picker's own
213
- // (full-resolution) base64 would only waste memory.
214
- base64: !imageManipulator,
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 base64's.
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: true
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
- /** Null when a file of `size` bytes still fits beside `current`; otherwise the limit it breaks. */
398
- function checkAttachmentFits(current, size) {
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
  }