Skip to content

feat(share): add a share extension to send images and text into chats - #1041

Merged
bmc08gt merged 9 commits into
mainfrom
feat/share-extension
Oct 11, 2026
Merged

bmc08gt merged 9 commits into
mainfrom
feat/share-extension

Conversation

@bmc08gt

@bmc08gt bmc08gt commented Oct 11, 2026

Copy link
Copy Markdown
Collaborator

Adds a share extension, so images, text and web links can be sent into a Flipcash chat from the iOS share sheet. Builds on the FlipcashCore move in #1039, which has merged; this replaces #1040.

The extension shows one "Send to" screen: search, a Recent chats list, and up to 5 selected chats. Selecting a chat raises a compose bar with the image thumbnails, a message field prefilled with the shared text or link, and Send. Sends go to each chat in turn; if some fail, Retry resends only to those.

  • Which chats: the Chats tab's selection is extracted into ChatListSelection and used by both ConversationController and the extension, so the picker excludes contact DMs, unjoined groups and archived chats the same way the tab does.
  • Avatars: rows use ContactAvatarView with the cached picture bytes and blurhash the Chats tab row uses. The extension never fetches, so an avatar the app hasn't cached shows its blurhash. This links FlipcashUI and its dependencies (Kingfisher, PhoneNumberKit) into the extension.
  • Suggestions: the app donates an INSendMessageIntent after a successful text or photo send, with the chat's link-form id as conversationIdentifier. The extension preselects a chat when opened from that suggestion.
  • Memory: images decode one at a time and are capped at 2560px to stay under the extension memory limit. Photos are sealed per chat, so a photo sent to 5 chats uploads 5 times.
  • Selection indicator: CheckView is renamed RadioButton and the report flow's inline largecircle.fill.circle is replaced with it, so every selectable row draws the same control.

The bundle ID is com.flipcash.app.ios.FlipcashShare, the one feat/scan-from-shared-image also uses, so only one extension target ships. Whichever branch lands second folds its extension into the first.

Color.success resolves from the main app's asset catalog and draws clear inside the extension, which is why the picker doesn't use it.

Android counterpart: code-payments/code-android-app#1757

Accepts images, text and web links from the share sheet, lets the user pick a chat, and sends from the extension with the shared upload/seal code. Images decode one at a time and are capped at 2560px so the extension stays under its memory limit. Also moves the plaintext/sealed photo send switch into FlipClient.sendMediaMessage(photo:) so the app and extension share it.
feat/scan-from-shared-image already claims com.flipcash.app.ios.FlipcashShare for its
share extension. Both branches use one ID so it only gets registered once and the
two extensions can merge into one target.
The picker listed every non-hidden conversation, which included contact DMs,
unjoined groups and archived chats. Extract the Chats tab's selection into
ChatListSelection and use it from both ConversationController and the
extension, which now also reads group memberships and the archive file.
Render ContactAvatarView with the same picture, cached bytes and blurhash the
Chats tab row uses, instead of initials. Links FlipcashUI into the extension.
…et suggestions

Donate an INSendMessageIntent after a successful text or photo send, with the
chat's link-form id as conversationIdentifier, the format the Share Extension
preselects on.
Color.success resolves a colour asset from the main app's catalog, which
the extension bundle doesn't have, so the selected checkmark drew clear.
The app drew row selection two ways: CheckView (a white ring that fills with
a checkmark) on the Select Region, currency, featured groups, account and
Share to Chats screens, and an inline largecircle.fill.circle symbol in the
report flow. Rename CheckView to RadioButton, use it in all of them and in
the share picker, and drop the report flow's one-off symbol.
@bmc08gt bmc08gt self-assigned this Oct 11, 2026
@bmc08gt
bmc08gt merged commit 2a8c068 into main Oct 11, 2026
2 of 3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant