Commit Graph
1377 Commits
Author SHA1 Message Date
spaced4ndy c7b3e362ec core, ui: badge credential details in developer tools (#7527) 2026-09-17 16:18:04 +00:00
spaced4ndy dd5c47d02d ui: "how it works" link and card styling on badge screen (#7524) 2026-09-16 15:13:01 +00:00
spaced4ndy c52044f3c3 ui: show progress spinner on redeeming code (#7523) 2026-09-16 14:43:28 +00:00
spaced4ndy f38c7e0f2b core, ui: badge redeem errors and fixes (#7515)
- redeem errors are typed (CEBadgeRedeemError) instead of matched by text in the apps
- service timeout (A_SERVICE) decodes in the apps and offers Retry via the existing retry alert
- unexpected redeem errors show the error itself instead of a generic message
- service error codes are a typed enum in the apps (BadgeServiceErrorCode)
- CRBadgeRedeemed returns badge state, so the apps skip a second round-trip after redeem
- setBadgeAlertAcked is scoped to user_id
- badgeChanged updates non-active profiles, so other profiles' badges don't go stale
- pitch banner is not shown to a profile that already has a badge
- one badgeTypeName per platform, used by the badge screen and the badge info alert
- BadgeAlertKind and BadgeAlertPrice decode via standard JSON, no custom decoders
- dead "Support ended" title branch removed from Your Badge view
- kotlin: users from badge responses carry remoteHostId
- kotlin: redeem code field keeps the IME's cursor and composition state
- kotlin: "Get your code" shown in all flavours
- kotlin: "Don't show again" -> "Dismiss", matching iOS
- kotlin: parseBadgeCode moved next to its FFI in platform/Core.kt
- kotlin: BadgesView no longer cross-fades on badge state updates
- kotlin: section title not uppercased
- ios: redeem code field parses once per change
- ios: A_SERVICE rejected reason is not decoded
- CLI: "cannot redeem badge code: ..." with the source of the error
- comments clarified
2026-09-16 14:15:11 +00:00
spaced4ndy 6a7eae2751 ui: redeem code (#7482) 2026-09-15 14:23:13 +00:00
spaced4ndy bac8d187ba Merge branch 'master' into badges 2026-09-14 17:13:58 +04:00
EvgenyandEvgeny @ SimpleX Chat 5ffbe733a8 core: attach badge proofs to files over size limit (#7455)
* core: attach badge proofs to files over size limit

* types

* more types

* implement file badge proofs

* tests

* move file limits to config, add tests

* more tests, work correctly in "send as group" case

* fix races in tests

* group badge tests

* query plans

* add history support, fixes

* simplify

* refactor

* refactor

* type

* restructure schema for proofs

* rename, refactor

* refactor

* fix, refactor

* refactor

* ui

* comments

* alerts

* update nix, ios library

* updare sharing

* update simplexmq

* update text

* improve messages

* api types

* postgres schema

* fix

* test

* query plans

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-09-12 14:33:52 +01:00
spaced4ndy db4b73962d Merge branch 'master' into badges 2026-09-10 13:23:28 +04:00
Narasimha-sc 6e3c668fb9 ios, android, desktop: do not add loaded items of another chat to the opened chat (#7450)
* ios, android, desktop: do not add loaded items of another chat to the opened chat

apiLoadMessages could apply a loaded page to a chat it was not loaded for,
mixing messages of two chats in one list:

- the chat id was not checked at all for .last pagination, and the loading
  coroutine is not cancelled when the chat is closed (PreloadItems wraps it
  into NonCancellable, apiFindMessages runs in a scope of its own), so a .last
  page loaded for the previously opened chat was appended to the items of the
  chat opened while it was loading;
- for the other paginations the chat id was checked before the items were
  loaded, but they are applied on the main thread after a dispatch, so the chat
  could be switched in between.

Check the chat id (and the remote host id in kotlin) right before the items are
applied, in every pagination except .initial and opening around item that set
chat id themselves. Empty chatItems remain allowed for .last that is used for
searching.

* android, desktop: test that loaded items of another chat are not added to the opened chat

Reproduces the bug deterministically, without depending on the timing of the
race: processLoadedChat is called with a page loaded for another chat while the
opened chat has its own items.

Without the fix the items of the two chats end up in one list:

    lastPageLoadedForAnotherChatIsNotAddedToOpenedChat
      expected:<[101, 102]> but was:<[101, 102, 201, 202]>
    beforePageLoadedForAnotherChatIsNotAddedToOpenedChat
      expected:<[101, 102]> but was:<[201, 202, 101, 102]>
    aroundPageLoadedForAnotherChatIsNotAddedToOpenedChat
      expected:<[101, 102]> but was:<[101, 102, 201, 202]>
2026-09-05 15:28:00 +01:00
spaced4ndy c623f4284c Merge branch 'master' into badges 2026-09-02 13:53:35 +04:00
EvgenyandEvgeny @ SimpleX Chat 735662902f core, ui: make badge expiration non-optional (#7445)
* core, ui: make badge expiration non-optional

* update

* update bot types

* fix to use non-optional badge expiry

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-09-02 08:14:09 +01:00
EvgenyandEvgeny @ SimpleX Chat f99c474ca6 core: send badge ZK-proofs to XFTP servers, add file expiry time (#7430)
* core: send badge ZK-proofs to XFTP servers

* update simplexmq, use keys and header from simplexmq

* core: add file expiry time

* refactor

* remove posix module

* rename migrations

* bot api

* update UI

* import

* show item from loaded information

* ios: update core library

* text

* send entitlements in handshake

* simplexmq

* query plans

* update simplexmq

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-09-01 23:16:15 +01:00
Evgeny Poberezkin ed2cf1d98f Merge branch 'master' into badges 2026-08-29 19:14:04 +01:00
Evgeny Poberezkin 070cb366b0 Merge branch 'stable' 2026-08-29 19:13:15 +01:00
Evgeny Poberezkin 2961fecc35 ui: update strings 2026-08-29 19:12:40 +01:00
Evgeny Poberezkin 498d7da837 Merge branch 'stable' 2026-08-29 18:59:49 +01:00
EvgenyandEvgeny @ SimpleX Chat d1c6a5717a ui: show countdown until SimpleX domains sale launch (#7434)
* ui: show countdown until SimpleX domains sale launch

* list

* ios: update

* update kotlin, ios countdown

* kotlin countdown

* fix formats

* padding

* update

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-08-29 18:59:12 +01:00
Evgeny Poberezkin 78332d0c73 Merge branch 'master' into badges 2026-08-27 07:59:57 +01:00
EvgenyandEvgeny @ SimpleX Chat 10adabf5f7 ui: show role (if exists) and remove "new" in open channel/group alerts (#7417)
* ui: show role (if exists) and remove "new" in open channel/group alerts

* restore removed strings

* info color

* docs

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-08-26 11:43:36 +01:00
EvgenyandEvgeny @ SimpleX Chat 17cdef1692 core: include channel link and name when forwarding messages (#7409)
* core: include channel link and name when forwarding messages

* wip

* simplify

* add member ID

* refactor

* refactor

* refactor

* update api types

* store forward source group type

* rename

* api types

* simpler layout

* layout, translations

* refactor ios

* public

* simpler

* refactor kotlin

* padding

* padding

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-08-24 21:36:57 +01:00
Evgeny Poberezkin 02106833fb Merge branch 'stable' 2026-08-20 12:00:43 +01:00
EvgenyandEvgeny @ SimpleX Chat 0ec028a668 ui: update post link in whats new (#7400)
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-08-20 11:59:52 +01:00
ecb008b792 core, ui: auto-accept group invitations per user profile (#7377)
* core, ui: auto-accept group invitations per user profile

Add a per-profile toggle for auto-accepting group invitations, and regroup it
with the existing contact-requests setting under a single Auto-accept section
in Privacy & Security, relabelled "Contact requests in groups".

The join is fully async. processGroupInvitation already had an async accept
path, used when the invitation matches a group link the user opened:
prepareAgentJoin + createMemberConnectionAsync + joinAgentConnectionAsync,
with the outcome reported later against the CFJoinConn command id. Auto-accept
takes that same path instead of going through APIJoinGroup, so it works while
the app is closed and never blocks message processing.

An auto-accepted invitation still records a CIRcvGroupInvitation item in the
chat with the inviting contact, so there is a record of who added the user to
which group.

Two details worth noting for review:

hostContact is reported to clients only for group links. Clients respond to it
by replacing the transient host connection view with the group and removing
that chat - correct for a group link, where the contact is a placeholder, but
wrong for a plain invitation, where it is a real contact.

A resent invitation returns the existing group, because createGroupInvitation
is idempotent on inv_queue_info. The join therefore only runs while the
membership is still GSMemInvited, so a resend cannot open a second connection.

* booldef

* order

* refactor

* update translation key

* query plans

* ios: export translations

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
Co-authored-by: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com>
2026-08-19 00:10:54 +01:00
Evgeny 083fb0a705 ui: store country (#7389)
* ui: store country

* ios: 7.0.1 build 348

* update version

* android: update versions

* remove UK
2026-08-18 12:24:36 +01:00
spaced4ndy 9c845222e4 ui: badges app store integration (#7374) 2026-08-17 16:12:09 +00:00
Evgeny Poberezkin 491f244fdc ios: fix store 2026-08-17 12:14:13 +01:00
EvgenyandEvgeny @ SimpleX Chat a0c72200e8 ios: add CF page (#7369)
* ios: add cf page

* add cf images

* reduce image count

* different design

* button

* simplify

* texts

* layout

* update texts

* zoom

* add to settings

* update text

* more text

* settings

* remove translation

* only US

* update

* update link

* update

* padding

* update

* update

* safe area

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-08-17 12:12:12 +01:00
spaced4ndy cd670548b9 ui: badges WIP views (#7321) 2026-08-14 07:36:02 +00:00
Narasimha-scandEvgeny 486c2abf26 ui: connect when a SimpleX link is pasted as a markdown hyperlink (#7348)
* ui: connect when a SimpleX link is pasted as a markdown hyperlink

* remove comments

Co-authored-by: Evgeny <evgeny@poberezkin.com>

---------

Co-authored-by: Evgeny <evgeny@poberezkin.com>
2026-08-12 14:54:45 +01:00
EvgenyandEvgeny @ SimpleX Chat ec6e975001 ios: update whats new (#7359)
* ios: update whats new

* custom view

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-08-10 13:00:38 +01:00
Narasimha-sc bd298a1d4a ios, android, desktop: fix draft in support chat appearing in group chat (#7309)
Group chat and its support chats have the same chat id, so a draft saved
in "chat with admins" was restored in the group chat and shown as its draft
in the chat list. Include chat scope in the draft chat id.

Also save the draft when support chat is closed without changing chat id -
in that case KeyChangeEffect that saves drafts doesn't run.
2026-07-28 13:55:49 +01:00
spaced4ndy 7c931d08ea ui: show "connect to name" button starting with 5 characters; ios: show button in New chat view search (#7318)
* ui: show "connect to name" button starting with 5 characters

* show button in new chat view search
2026-07-28 12:03:42 +01:00
spaced4ndy b414d7579a ios: fix connection dialogue not shown if app is opened via link before onboarding (#7301)
* ios: fix connection dialogue not shown if app is opened via link before onboarding

* wip

* debug

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* comment
2026-07-27 18:00:32 +01:00
spaced4ndy 6152f2a7ee ios: fix chat not opening when contact connects via 1-time link (#7315) 2026-07-27 15:04:45 +00:00
Evgeny Poberezkin 09254c5a53 ui: update whats new 2026-07-25 16:14:22 +01:00
spaced4ndy 5c196d0e2d ui: rename "how to register name" button (#7300) 2026-07-24 15:25:52 +00:00
spaced4ndy 08711dbc33 ios: fix app crashing after onboarding (#7299) 2026-07-24 14:47:16 +00:00
spaced4ndy 3755dc43be ios: fix receipts toggles in user settings (#7298) 2026-07-24 14:33:54 +00:00
spaced4ndy 53daafa675 ios: put "connect to name" button below search in top bar layout (#7297) 2026-07-24 14:19:52 +00:00
Narasimha-sc 9586c97439 ui: show XFTP servers used for a file in message info (#7088)
Surface the XFTP servers that hosted a file's chunks in the message info
screen (Android, desktop, iOS), so a user can see which servers they are
downloading from (or, for sent files, uploading to) whenever they want to know.

APIGetChatItemInfo now returns fileXftpServers, derived from the stored file
description (private snd descr for sent items, rcv descr for received items);
extraction is best-effort and never fails the call.
2026-07-22 08:28:54 +01:00
shandEvgeny Poberezkin 2ea5940e81 core, ui: per-server roles for self-hosted servers (#7254)
* core, ui: plan per-server roles for self-hosted servers

* core: add per-server roles field to UserServer

* core: add nullable role columns to protocol_servers

* core: persist per-server roles

* core: validate server coverage using per-server roles

* test: cover per-server roles resolution and coverage

* multiplatform: per-server role toggles for self-hosted servers

* ios: per-server role toggles for self-hosted servers

* core: per-server role overrides with per-role defaults

* test: cover three-state per-server role resolution

* fix: derive Eq for ServerRolesOverride

* multiplatform: three-state role dropdowns on saved servers

* ios: three-state role pickers on saved servers

* test: per-server roles independent across two servers

* test: enable names role in name-resolution tests

* style: trim comments in per-server roles code

* chore: rename server_roles migration to 20260716 (last)

* core: per-server roles override operator roles, inherit when unset

* multiplatform: per-server role default inherits from operator

* ios: per-server role default inherits from operator

* refactor(servers): tidy per-server roles per review

- dedup no-operator default into ServerRoles.noOperatorDefault (Kotlin/Swift)
- iOS: move roles-section control flow to the call site via a named gate,
  and parse the server address once instead of up to three times
- Kotlin: collapse redundant derivedState; revert defaultOn->default rename
  for cross-platform parity
- drop unused Hashable conformance on Swift ServerRoles
- add agentServerCfgs test for names inheritance from an operator
- remove no-op enableNamesRole calls from dormant DirectoryTests
- fix ChatClient import ordering

* chore(migration): date server_roles migration 20260720

* only show roles when server is enabled, move section above QR code

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2026-07-20 16:35:13 +01:00
Narasimha-scandEvgeny a1325c9788 ios, desktop, android: clearer error message when connecting via removed link (AUTH) (#7268)
* ios, desktop, android: clearer error message when connecting via removed link (AUTH)

* Update apps/ios/Shared/Model/SimpleXAPI.swift

Co-authored-by: Evgeny <evgeny@poberezkin.com>

* android, desktop: use concise AUTH error message to match iOS

* update localizations

---------

Co-authored-by: Evgeny <evgeny@poberezkin.com>
2026-07-18 08:45:07 +01:00
EvgenyandEvgeny @ SimpleX Chat d95f924b73 ui: improve profile descriptions (#7262)
* ui: improve profile descriptions

* update

* fix

* improve layout

* fix alert

* more improvements

* recizable iOS field

* change max lines

* fixes

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-07-18 08:13:05 +01:00
spaced4ndy d60da754dc ui: what's new in 7.0 (#7265) 2026-07-17 18:36:45 +04:00
spaced4ndy 73b9127360 ui: add search to subscribers list view; android, desktop: lazy list (#7264)
* ui: add search to subscribers list view; android, desktop: lazy list

* wip
2026-07-16 12:17:38 +01:00
6375457685 core: add optional profile description (#7256)
* core: add optional profile description

* bot types

* kotlin ui

* query plans

* postgres schema

* fix ui

* fix UI

* refactor

* description in business chats

* share address

* sign address card when shared by owner

* from owner string

* remove unused string

* refactor

* fix

* ProfileDescriptionText

* refactor modals

* ios ui

* nix config

* correction

Co-authored-by: simplex-chat-agent[bot] <287173099+simplex-chat-agent[bot]@users.noreply.github.com>

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
Co-authored-by: simplex-chat-agent[bot] <287173099+simplex-chat-agent[bot]@users.noreply.github.com>
2026-07-15 17:54:21 +01:00
spaced4ndy 0fef34914d core, ui: security code verification in channels (verify member key) (#7255) 2026-07-15 10:46:31 +00:00
spaced4ndy e53508ecca core, ui: make msgVerified optional (#7247) 2026-07-13 21:20:36 +00:00
spaced4ndy d7af648d2a ui: hide message signing preference, etc. (#7246) 2026-07-13 13:06:25 +00:00
EvgenyandEvgeny @ SimpleX Chat 414f4b6ce1 core, ui: show domain for business chat in CLI, test, improve UI (#7235)
* core: preserve domain during group handshake

* query plans

* ui changes

* remove unnecessary change

* improve ui

* name UI

* card layout

* fix footers, entry field

* error icon

* fix height

* fix layout

* fix layout

* remove unused string

* focus name field

* refactor, fix

* improve button

* refactor

* fix ios race

* core: add domain to channel /i output

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-07-12 09:41:05 +01:00