Adapt the HealthChat hooks to the upstream 26.09.1 screen APIs

The rebase onto release/26.09.1 moved three things the fork depends on.

Upstream now owns a UserProfileScreenHook of its own (#5980), which rewrites a
screen's view state rather than injecting a view. The fork's section hook keeps
its behaviour under the fork-only name ExtendedProfileSectionHook, so both can
live side by side and upstream's file stays untouched. Upstream's new @AppHook
macro generates the same register<Name> methods, so registration is unchanged.

UserProfileScreenCoordinatorParameters lost appSettings and reordered its
arguments, and UserDetailsEditScreenCoordinator now publishes its own
UserDetailsEditScreenCoordinatorAction instead of borrowing the room one
(#5893). The members flow and the profile editor follow both.

AppSettings.override gained oAuthClientURIPath (#5934), whose default appends
apps/ios to the website URL. HealthChat passes nil to keep the registered
client_uri at https://healthchat.ch exactly as the shipped build has it —
changing what the app registers with MAS is not a side effect a rebase should
have.
This commit is contained in:
2026-09-22 18:46:08 +02:00
committed by Sedat Qaja
parent dcae1ffc6b
commit 7adc963cf9
6 changed files with 12 additions and 12 deletions
@@ -20,6 +20,8 @@ struct HealthChatAppSettingsHook: AppSettingsHookProtocol {
hideBrandChrome: false,
pushGatewayBaseURL: "https://sygnal.healthchat.ch",
oAuthRedirectURL: "ch.healthchat.element:/oauth/callback",
// nil keeps the registered client_uri at the bare website URL, as shipped before upstream's `apps/ios` default.
oAuthClientURIPath: nil,
websiteURL: "https://healthchat.ch",
logoURL: "https://app.healthchat.ch/themes/element/img/logos/element-logo.png",
copyrightURL: appSettings.copyrightURL,
@@ -9,7 +9,7 @@ import Combine
import SwiftUI
@MainActor protocol UserDetailsEditCoordinatorProtocol: CoordinatorProtocol {
var actions: AnyPublisher<RoomDetailsEditScreenCoordinatorAction, Never> { get }
var actions: AnyPublisher<UserDetailsEditScreenCoordinatorAction, Never> { get }
}
nonisolated protocol UserDetailsEditScreenHookProtocol: Sendable {
@@ -121,10 +121,9 @@ final class HealthChatMembersFlowCoordinator {
let parameters = UserProfileScreenCoordinatorParameters(userID: userID,
isPresentedModally: false,
userSession: flowParameters.userSession,
userIndicatorController: flowParameters.userIndicatorController,
appHooks: flowParameters.appHooks,
analytics: flowParameters.analytics,
appSettings: flowParameters.appSettings,
appHooks: flowParameters.appHooks)
userIndicatorController: flowParameters.userIndicatorController)
let coordinator = UserProfileScreenCoordinator(parameters: parameters)
coordinator.actionsPublisher.sink { [weak self] action in
@@ -151,8 +150,7 @@ final class HealthChatMembersFlowCoordinator {
userSession: flowParameters.userSession,
mediaUploadingPreprocessor: MediaUploadingPreprocessor(appSettings: flowParameters.appSettings),
navigationStackCoordinator: navigationStackCoordinator,
userIndicatorController: flowParameters.userIndicatorController,
appSettings: flowParameters.appSettings)
userIndicatorController: flowParameters.userIndicatorController)
let coordinator = flowParameters.appHooks.userDetailsEditScreenHook.makeCoordinator(parameters: parameters)
coordinator.actions.sink { [weak self] action in
@@ -22,8 +22,8 @@ final class HealthChatProfileEditScreenCoordinator: CoordinatorProtocol, UserDet
private let viewModel: HealthChatProfileEditScreenViewModelProtocol
private var cancellables = Set<AnyCancellable>()
private let actionsSubject: PassthroughSubject<RoomDetailsEditScreenCoordinatorAction, Never> = .init()
var actions: AnyPublisher<RoomDetailsEditScreenCoordinatorAction, Never> {
private let actionsSubject: PassthroughSubject<UserDetailsEditScreenCoordinatorAction, Never> = .init()
var actions: AnyPublisher<UserDetailsEditScreenCoordinatorAction, Never> {
actionsSubject.eraseToAnyPublisher()
}