mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-08-14 11:30:18 +00:00
Six defects, all in the window between creating the profile and moving the invitation onto it. Pane. The form was shown in ModalManager.center, which on desktop sets ChatModel.chatId to null - and the chat view *is* the centre pane. Tapping "Add profile" in a prepared invitation therefore closed that chat, discarding the typed compose draft with it, and only the success path reopened it: cancelling the form, or any failure, left "No selected chat" with the invitation nowhere on screen. From the one-time link picker, which is itself a start-pane modal, the form appeared in a different pane with the picker still live beside it and no scrim, so a profile could be selected while the form was open - and apiChangeConnectionUser recreates the connection, invalidating the pccConnId the form was about to use. The manager is now passed in: end for the compose picker, matching the incognito modal it already opens there, and start for the one-time link picker, matching its own. In-flight guard. The flag was per-picker and released when the profile existed, not when the invitation had moved. Both are wrong: onCreated only launches the reassignment, and on Android the picker's composition is disposed while the form is on top of it, so the flag it comes back with is a fresh false. There was no spinner, no dimming and every row was live during the switch, so a second tap created a second profile or started a competing reassignment. onCreated is now suspending so the flag covers the whole flow, and the flag is a single top-level state both pickers read. The compose picker had no in-progress state at all and now has one, and its new row was also the only one missing the profileChangeProhibited guard. Active user and host. The reassignment resolves the invitation under whatever profile is active when it runs. A notification tap switches the active user from another dispatcher, and a remote host connect/disconnect switches the host, so both are checked before handing over rather than reassigning under the wrong profile. Torn-down form. isLastModalOpen was used only to decide whether to close the form, and the flow continued when it was false - reassigning and switching under a screen the user had already left. It now stops. Connection not moved. The one-time link picker dismissed itself and turned the app-wide incognito default off whether or not apiChangeConnectionUser succeeded. Unlike the prepared-chat reassignment, that call provisions a new queue, so it is what fails offline - leaving a profile just created for the invitation stranded with nothing pointing at it and the picker gone. It now keeps the picker open and only clears incognito once the connection has actually moved. Reopening the chat. chatModel.chatId was set unconditionally after the switch, before the check that the switch actually happened, pointing the chat view at a chat that had just moved to another profile and defeating the guard in updateChats that clears it. Also applies the users refresh on the main thread, where the receiver loop updates the same list, and skips it when the host has changed underneath.