* core: round down time of sent messages to prevent replies showing above if they are within one second
* fix item timestamps
* query plans
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
apiChangeConnectionUser returns nil when the user cancels the Retry
alert, and the picker kept its switching status, so the spinner overlay
stayed and the picker stopped responding. Reset the status and the
selected profile, as the error path does, without the alert.
ComposeContextProfilePickerView.changeProfile called changeActiveUser_
outside both 'updated != null' branches, so when
apiChangePreparedContactUser or apiChangePreparedGroupUser returned null
the chat stayed on the old profile but the active user was switched
anyway: the API showed "Error changing profile", and then the profile
switched regardless. The prepared chat is then left behind on a profile
the user is no longer on.
Kotlin only: the iOS twin throws instead of returning null, so its outer
catch already skips the switch.
* ci: fix mac library build to sign and notarize library
* script
* sign and notarize to test
* remove test build
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
ActiveProfilePicker wrote the app-wide incognito preference before the
call that can fail, and never rolled it back, in both directions:
- selecting a profile set incognito=false, then, if
apiChangeConnectionUser returned null, left the connection incognito
while the preference said otherwise
- selecting Incognito set incognito=true before apiSetConnectionIncognito,
and undid nothing when it returned null
Neither is visible at the time: the row reads the connection first
(showingInvitation.value?.conn?.incognito), which was not changed. It
surfaces on the next connection started with showingInvitation null,
which falls through to the preference.
Selecting a profile also closed the picker unconditionally, so a failed
apiChangeConnectionUser left the connection on the old profile with the
picker dismissed as if it had worked. Both APIs alert on error, so the
failure was reported - but the picker still closed.
Move all three inside the branch that runs only when the change landed.
* desktop: fix crash in SimpleX address screen when there is no profile
* desktop: close SimpleX address screen when there is no profile
* desktop: rerun address screen self-close when its modal is reused or the stack changes
* desktop: close SimpleX address screen only when it is the top modal
* plans: correct address no-profile crash triggers and fix description
* plans: correct address no-profile crash fix description and verification
* plans: tighten address no-profile crash wording
* plans: add self-destruct trigger to address no-profile crash
* plans: qualify self-destruct trigger on desktop
* plans: drop desktop-only title from address no-profile crash
* plans: no connected mobile, not no mobile
* spec, product: document isLastModal and address screen without profile
* plans, spec, product: plan sections, address row spec, GAP-08 and GAP-09
* spec, product, plans: fix GAP-08/09 wording, table placement, ModalManager line
* spec, product: GAP-08/09 accuracy, gap count, clickable ModalManager location
* product, plans: GAP-09 at the level the code supports; qualify picker auto-open
* spec, product, plans: fix GAP-09 locations, stale line links, wording
* spec, product, plans: update plain-text line numbers; GAP-09 read wording
* plans: name the picker auto-open condition
* spec, plans: wording; security note
* plans: self-destruct did not crash on Android master; not a trigger
* plans: self-destruct path possible but unconfirmed; Android recovers silently
* spec, product, plans: drop GAP-09 and unrelated line refreshes
* plan: Android self-destruct path confirmed in logcat
* desktop: close Chat preferences screen when there is no profile, as the address screen does
* ci: use default registries for empty variables
* ci: drop package publish tags
* ci: record releases in simplex-chat-libs
* ci: skip recorded versions in publish plan
* nodejs: raise default test timeout for migrations
* nodejs: print download progress without console.error
* nodejs: use the default timeout in migrating core tests
* badge-service: accept a list of Apple roots
* badge-service: document root_certificates
---------
Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com>
* ci: drop dlltool from nodejs libs release
* nodejs: download libsimplex into the user cache
* nodejs: load libsimplex at runtime per backend
* support bot: select db backend with --db
* python: match backend switch error text
* nodejs: download prebuilt add-on at runtime
* ci: build nodejs add-on for libs release
* calculator bot: load libs and add-on in image
* support bot: document add-on override
* nodejs: keep worker test output free of colors
* nodejs: verify sha-256 of downloaded assets
* python: pin core libs release with sha-256
* ci: add packages release script
* ci: release nodejs add-on and open release PR
* ci: publish packages after release PR
* nodejs: keep npm from building the add-on
* calculator bot: build the add-on in the image
* ci: merge package release workflows
* ci: open release PR when publishing fails
* ci: build the add-on with node-addon-api only
* ci: skip publishing in a called packages workflow
* ci: update package release actions to Node 24
* nodejs: fix receive test timeout
* ci: test packages on pull requests
* nodejs: reuse the database in the close stress test
* ci: keep failed package tests from hanging
* ci: skip preset server tests
* ci: plan package builds from the changes
* ci: test packages with a given libsimplex
* ci: test packages with libsimplex of core changes