@robono/messaging-react-native 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +79 -4
  3. package/SBOM.spdx.json +832 -112
  4. package/dist/calling.js +2 -2
  5. package/dist/expo-download.d.ts +3 -0
  6. package/dist/expo-download.js +43 -0
  7. package/dist/expo-media.js +23 -0
  8. package/dist/expo-outbox.d.ts +13 -0
  9. package/dist/expo-outbox.js +81 -0
  10. package/dist/expo-saved.d.ts +24 -0
  11. package/dist/expo-saved.js +76 -0
  12. package/dist/expo-social.d.ts +3 -0
  13. package/dist/expo-social.js +21 -0
  14. package/dist/expo-thumbnails.d.ts +9 -0
  15. package/dist/expo-thumbnails.js +68 -0
  16. package/dist/expo.d.ts +9 -3
  17. package/dist/expo.js +143 -23
  18. package/dist/forward.d.ts +13 -0
  19. package/dist/forward.js +61 -0
  20. package/dist/icons.d.ts +1 -1
  21. package/dist/inbox.d.ts +16 -0
  22. package/dist/inbox.js +48 -0
  23. package/dist/index.d.ts +45 -2
  24. package/dist/index.js +376 -113
  25. package/dist/media-controller.d.ts +18 -0
  26. package/dist/media-controller.js +118 -3
  27. package/dist/media-readiness.d.ts +1 -1
  28. package/dist/media-ui.d.ts +16 -5
  29. package/dist/media-ui.js +15 -11
  30. package/dist/message-links.d.ts +5 -0
  31. package/dist/message-links.js +30 -0
  32. package/dist/message-order.d.ts +4 -0
  33. package/dist/message-order.js +17 -0
  34. package/dist/native-outbox.d.ts +49 -0
  35. package/dist/native-outbox.js +51 -0
  36. package/dist/pollVoteQueue.d.ts +3 -0
  37. package/dist/pollVoteQueue.js +29 -0
  38. package/dist/polls.d.ts +6 -2
  39. package/dist/polls.js +85 -18
  40. package/dist/popup.d.ts +9 -0
  41. package/dist/popup.js +7 -0
  42. package/dist/recent-media.js +1 -0
  43. package/dist/safety.d.ts +2 -1
  44. package/dist/safety.js +11 -5
  45. package/dist/saved.d.ts +10 -0
  46. package/dist/saved.js +46 -0
  47. package/dist/search.d.ts +9 -0
  48. package/dist/search.js +41 -0
  49. package/dist/social.d.ts +19 -0
  50. package/dist/social.js +35 -0
  51. package/dist/visual/RobonoIcon.js +2 -1
  52. package/dist/voice-composer.js +2 -2
  53. package/package.json +20 -4
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.0
4
+
5
+ Use the compact Messenger media toolbar, autoplay video after audio setup, and offer native full-screen playback. Dismiss iOS menus before presenting Saved media, Forward/Delete/Report or Search; keep native pickers free of a competing modal. Reserve the actual timestamp width so edited messages do not overlap it.
6
+
7
+ Add shared Edit/Delete actions, draft-preserving composer editing, delete confirmation and search/quote navigation. Media adapters report opening/playback independently of bubble visibility. Media replacement/removal, authorized forwarding, persistent Saved copies and native outgoing draft recovery are implemented. Physical iPhone checks cover selected flows; physical Android acceptance remains outstanding.
8
+
9
+ Add text/voice translation to text or voice, shared translation popup, browser/Expo spoken playback and expiring-result cleanup. Add optional viewer downloads (off by default): device photo library, iPhone Save to Files sheet and bounded Android folder export. Streamed video exports an authorized local copy without replacing playback. Requires expo-file-system >=55.0.5. iPhone checks cover playback, Saved files, restart recovery and popup transitions. Android device acceptance and physical export-sheet checks remain pending.
10
+
11
+ Add `MessagingInbox`, the shared search popup and optional expiring typing/online labels in the existing header. Clear private unread counts independently of public read receipts. Closed polls disable their controls on both native and web renderers. Requires the matching 0.2.0 core release; iPhone fixture acceptance is recorded separately from Android acceptance.
12
+
13
+ Render unfinished sends as ordinary chat bubbles with compact status icons and in-place retry. Keep the composer available during attachment sends. Stage browser and Expo attachments locally until Send; add native thumbnails and preview without consuming the draft.
14
+
15
+ Use the server-provided total member count for large groups instead of counting a partial member page.
16
+
3
17
  ## 0.1.0
4
18
 
5
19
  Optional messaging screens and media controls, attachment composer, recording, playback, quoting, reactions, polls, translation, transcription, block and report flows. Expo adapters and optional calling integration.
package/README.md CHANGED
@@ -54,9 +54,15 @@ This entry targets Expo SDK 55–56; the core components do not require Expo. Co
54
54
  ```tsx
55
55
  import {
56
56
  ExpoMessagingScreen, createExpoMessagingStorage,
57
- createExpoMessagingAudioSession,
57
+ createExpoMessagingAudioSession, createExpoMessagingClient,
58
58
  } from '@robono/messaging-react-native/expo';
59
59
 
60
+ const messagingClient = createExpoMessagingClient({
61
+ url: appConfig.messagingEndpoint,
62
+ userId: session.userId,
63
+ getAccessToken: () => sessions.accessToken(),
64
+ });
65
+
60
66
  const storage = createExpoMessagingStorage({
61
67
  url: appConfig.messagingMediaEndpoint,
62
68
  getAccessToken: () => sessions.accessToken(),
@@ -136,13 +142,13 @@ The website preview renders the same bubbles, inline voice controls, full-screen
136
142
 
137
143
  The standard chat uses compact grouped bubbles, timestamps at the lower right, inline voice controls and an expandable attachment tray below the composer. Attach dismisses the keyboard; tap it again to return to typing. Android Back closes the tray first. The microphone remains available beside the text field, including while text is typed; Send is enabled when there is text or a finished voice recording. Camera remains available when capture is enabled, including with typed text or a reviewed voice recording. Captures join the existing pending attachments. New designs start with a light chat palette; existing saved colors remain unchanged. The builder’s “Use classic chat colors” action applies the default palette to the draft without changing enabled features.
138
144
 
139
- Voice-only conversations use Robono Messenger’s compact composer: the duration-limit placeholder, embedded microphone and adjacent Send control. The Expo adapter records and reviews audio inline, with elapsed time, microphone metering, playback and removal before sending. The builder uses the same controls with a local browser microphone recording; no audio is uploaded from the preview. When texting is enabled, tap the microphone to record in the composer and tap it again to stop. Each completed recording becomes a separate playable attachment in the shared horizontal row, and the microphone is available for another recording. Typed text is preserved; Send submits the voice message and any accompanying text as separate messages. Custom media adapters can use `components.VoiceComposer`, `VoiceMessageComposer` and `VoiceDraftPlayback`; `renderTextComposer` restores the text controls alongside the reviewed recording.
145
+ Voice-only conversations use Robono Messenger’s compact composer: the duration-limit placeholder, embedded microphone and adjacent Send control. The Expo adapter records and reviews audio inline, with elapsed time, microphone metering, playback and removal before sending. The builder uses the same controls with a local browser microphone recording; no audio is uploaded from the preview. When texting is enabled, tap the microphone to record in the composer and tap it again to stop. Each completed recording becomes a separate playable attachment in the shared horizontal row, and the microphone is available for another recording. Typed text is preserved; Send puts accompanying text on the last attachment as its caption. Custom media adapters can use `components.VoiceComposer`, `VoiceMessageComposer` and `VoiceDraftPlayback`; `renderTextComposer` restores the text controls alongside the reviewed recording.
140
146
 
141
147
  Recent attachments can appear directly beneath the attachment buttons. Photos, Videos and Document filter this strip; tapping the selected category again shows all enabled types. Tapping a thumbnail adds it above the composer as a pending attachment; its magnifying-glass button opens a preview instead. Remove unwanted attachments or press Send to submit the selection with any typed text. Camera starts capture. When no recent-media source is supplied, the category buttons open the device picker. Supply `attachmentChoices` with an ID, kind, name, and optional thumbnail URI/duration. Only enabled attachment types appear. With `MessagingScreen`, selecting a tile calls `pickAttachment` with `options.attachmentId`; use `options.intent` to distinguish selection (`send`, retained for adapter compatibility) from preview. Returning photo, video or document media stages it in the composer; returning null cancels without selecting it. Voice recordings also become pending attachments after recording stops. With `ExpoMessagingScreen`, supply `resolveAttachmentChoice(id, signal)` to return an authorized cache copy; the standard preview, validation, send and cleanup flow handles the rest. Keep originals in the user's library untouched. The host controls library access and which recent items it supplies.
142
148
 
143
149
  Camera capture and library selection are separate controls. `appearance.showPhotoLibrary` and `showVideoLibrary` hide library choices without removing the corresponding message-type permission needed for camera captures. Both default to true for existing integrations. The builder manages these together with Camera, so enabling capture does not select Photos/Videos or insert example media. Parent and network message-type permissions remain enforced.
144
150
 
145
- The Expo adapter prepares voice assets in private storage when recording stops, retaining local playback copies until removal, submission or disposal. This does not send a chat message. Send submits all selected attachments in order, followed by any typed text. Custom adapters can supply components.VoiceAttachment for draft playback and releaseAttachment for local cleanup.
151
+ The Expo adapter keeps selected and recorded attachments locally until Send. Recording stops into a playable draft without uploading. Send immediately queues the bubbles, then uploads the selected files. A caption belongs to the final attachment; a quote belongs to the first. The batch preserves selection order when uploads finish out of order. Custom adapters can supply components.VoiceAttachment for draft playback and releaseAttachment for local cleanup.
146
152
 
147
153
 
148
154
  ## Group conversations, reactions and polls
@@ -163,4 +169,73 @@ The default header’s three-dot menu provides Block/Unblock and Report when the
163
169
 
164
170
  Blocking retains history and stops direct messages and calls for that pair in your app. Shared group messages remain visible. Reporting is separate: it shares the selected message, or up to five recent incoming messages, and the reason with your app’s moderators. It confirms success only after storage acknowledges the report. The SDK reuses the request ID on retry. Owners and administrators review reports in the Messaging workspace; private media is reviewed through your app’s authorized storage tools.
165
171
 
166
- Enable Reactions to show an emoji ribbon beside the long-pressed bubble, or the hover smile icon on desktop. Selected reactions stay attached below the message. Polls are interactive chat messages created from the attachment menu. Transcript and Translate toggle small text immediately under the original; the original timestamp stays with the source message.
172
+ Enable Reactions to show an emoji ribbon beside the long-pressed bubble, or the hover smile icon on desktop. Selected reactions stay attached below the message. Polls are interactive chat messages created from the attachment menu. Transcript shows readable text under a voice message. Translate opens the shared compact popup with **Translate to text** and **Translate to voice**. Both text and voice messages support either output. The Expo screen supplies the spoken-result player and uses the normal audio session, so recordings and other playback do not overlap. The original message and timestamp stay in place. Provide `language` for the viewer’s target language and connect `MessagingClient.transformRequest` to the authenticated `createMessagingTransformBackendAdapter` on your server.
173
+
174
+ ### November 1 behavior update (unpublished)
175
+
176
+ The default palette follows Messenger. Existing saved customer colors remain in
177
+ place. Direct chats use the brand header; groups use Messenger’s blue header.
178
+ Bubble padding is fixed; the legacy `compact` property is accepted for backwards
179
+ compatibility but no longer changes core spacing.
180
+
181
+ Photo/video/file selections remain removable drafts; tapping a draft opens its
182
+ viewer without deleting the selection. Expo supplies small image/video previews
183
+ using `expo-image-manipulator` and `expo-video-thumbnails`; add those optional peers
184
+ when using the Expo entry. Copy uses `expo-clipboard`. Native media downloads use
185
+ photo-library permission; sharing uses the platform share sheet. New managed photo/video uploads have an authenticated preview (at most 480 pixels and 128 KiB) after the updated storage worker, inspector, media handler and migration 178 are deployed. Previews count toward normal storage/transfer usage. Older large uploads without a preview remain tap-to-open; originals over 2 MiB are never automatically downloaded to build thumbnails.
186
+
187
+ `appearance.showWaveform` controls display only. Verified waveform samples stay
188
+ in `media.waveform`. The playback track remains seekable when the waveform is
189
+ hidden. Managed storage computes waveform data independently of this preference.
190
+
191
+ Groups offer polls; direct chats offer a recipient-only Yes/No question whose
192
+ first answer is final. Both use centered popups on all platforms. Deploy migration
193
+ `20261101017400_messaging_captions_questions.sql` and the updated messaging handler
194
+ before releasing these SDK changes. Deploy the updated media inspector before the
195
+ updated managed-media handler. These source changes have not been published.
196
+
197
+ ### Optional downloads in the viewer
198
+
199
+ Select **Download button** in the website's **Features & preview → Appearance**, or
200
+ set `appearance.showDownloadButton: true`. The Expo viewer shows the same Download
201
+ action for photos, videos and files; it stays hidden by default. Photos and videos
202
+ save to the device photo library after the user grants permission. On iPhone,
203
+ documents open the native sheet with Save to Files. On Android, the user chooses a
204
+ folder and the document is copied there in bounded chunks. Cancelling creates no
205
+ file, and a failed copy removes its own partial output. Use `expo-file-system`
206
+ 55.0.5 or later for Android document saving. Originals remain in private storage.
207
+ This setting controls the visible action, not the authorization needed to view media.
208
+
209
+ `createExpoMessagingClient` keeps outgoing text, selected attachments and failed
210
+ sends in your app's private document storage, separated by endpoint and user.
211
+ `ExpoMessagingScreen` restores small previews and reuses the original upload/send
212
+ identity when retrying. Call `client.signOut()` on logout to remove that user's
213
+ saved work. `dispose()` preserves unfinished work for reopening. Use
214
+ `persistence: false` to disable storage. No received history or download links are
215
+ persisted by this store. The OS app sandbox protects these files; this is not an
216
+ additional application encryption layer.
217
+
218
+ The shared message menu and media preview include Forward and sender Delete.
219
+ Forward checks both chats and uploads a separate private attachment copy; retrying
220
+ uses the same send ID. Edits can replace/remove attachments before a recipient
221
+ opens them. Removing the only attachment requires text. Caption edits keep the
222
+ original file. The ordinary composer draft is retained throughout editing.
223
+
224
+ `MessagingInbox` offers Mute/Unmute and Delete chat on long press (right-click on
225
+ web), plus accessibility actions. Deletion clears only that user's view, up to the
226
+ message shown when confirmation opened. New messages bring the chat back. When
227
+ composing your own native navigation, pass
228
+ `onDeleted={id => messagingClient.forgetConversation(id)}` to clear its local work.
229
+ Updated backend support is required; old adapters hide these controls.
230
+
231
+ ### Saved and multiple-message actions
232
+
233
+ Long press a message, then choose Select to select more rows. The compact action bar supports chronological forwarding and deletion of eligible unread outgoing messages. A single selection also supports Copy, Save and Edit. Back clears the selection.
234
+
235
+ `createExpoMessagingClient` also supplies Saved: explicit local text and attachment copies in the app-private directory, separated by endpoint, account and namespace. The shared header opens Saved. Saving rechecks message access before and after making the copy, and marks incoming content consumed. Saved copies are independent of network retention; they never reuse signed URLs. `client.signOut()` deletes this account’s saved copies. Disabling persistence also disables Saved. Device storage is not a cloud backup or an additional app encryption layer. For a custom engine, supply a `MessagingSavedStore` to `MessagingClient` and `openSavedAttachment` to the shared screen.
236
+
237
+ ### Social previews
238
+
239
+ Install `react-native-webview` with the Expo peer dependencies and rebuild the native app. `ExpoMessagingScreen` supplies the player and the standard shared popup; a custom engine can supply `components.SocialPlayer`. The updated server adapter and hosted messaging endpoint advertise support. Recognized links gain a small play action, while tapping the link still opens the original app/site. Players are loaded only after an explicit tap and fresh message authorization, require explicit playback, and are removed on close/background/navigation. Opening a player stops the current voice-message player and uses the supplied audio-session coordinator. No application cookies or local-file access are shared with the embedded page. Some providers/private posts cannot be embedded; the popup keeps an Open-original link.
240
+
241
+ The same provider parser is used by Messenger, the browser and the backend, including Snapchat and Rumble. Preview opens contribute to the per-network `social.opened` metric. This source change still requires coordinated endpoint and package deployment; installing a newer UI against an older adapter does not enable unsupported controls.