Let members edit their profile and invite others (#12)

* Add HealthChat API and extended profile services

Expose OpenID tokens and homeserver credentials from the client proxy, and
add fork-only services for the HealthChat member directory backend
(api.healthchat.ch) plus a service that reads MSC4133 extended profile
fields directly from the homeserver. Groundwork for the members tab and
the profile screens.

Claude-Session: https://claude.ai/code/session_013qdTbAWsZj2quQzEkagXaS

* Show extended profile details on the profile screens

Add a UserProfileScreenHook that lets the fork inject an extra Form
section below the header of the user profile and room member details
screens. The HealthChat implementation loads the MSC4133 extended
profile fields and renders them with tappable phone/email/website
links, hiding the section entirely for profiles without any fields.

Strings live in a new fork-only HealthChat.strings table (de/en/fr,
generated as HealthChatL10n via SwiftGen) since Untranslated.strings
pins the English bundle.

Claude-Session: https://claude.ai/code/session_013qdTbAWsZj2quQzEkagXaS

* Add a member directory tab

Add a HomeTabsHook that lets the fork append an extra tab to the home
tab bar, and a HealthChat members flow behind it: a directory of all
approved members from the HealthChat API with server-side search,
pending-approval and error states, chat shortcuts and pushed member
profiles. Chats and calls are handed back to the session flow via the
hook's actions publisher.

Claude-Session: https://claude.ai/code/session_013qdTbAWsZj2quQzEkagXaS

* Let members edit their profile and invite others

Add a native profile editor for the HealthChat extended profile fields
(13 fields plus avatar, saved as a partial diff through the HealthChat
API so displayname derivation and Zitadel sync stay server-side), an
invitation sheet (email plus personal note) and a profile-completeness
hint on the member directory.

A new UserDetailsEditScreenHook lets the fork substitute the profile
editor behind the settings user row — the stock display-name editor
would let users edit a value the next profile update derives away.

Claude-Session: https://claude.ai/code/session_013qdTbAWsZj2quQzEkagXaS
This commit is contained in:
2026-09-22 17:04:37 +02:00
committed by Sedat Qaja
parent c0f167ccf7
commit 209a36cbea
47 changed files with 1631 additions and 86 deletions
@@ -340,6 +340,13 @@ extension PreviewTests {
}
}
@Test
func healthChatInviteMemberScreen() async throws {
for (index, preview) in HealthChatInviteMemberScreen_Previews._allPreviews.enumerated() {
try await assertSnapshots(matching: preview, step: index)
}
}
@Test
func healthChatMemberDirectoryScreen() async throws {
for (index, preview) in HealthChatMemberDirectoryScreen_Previews._allPreviews.enumerated() {
@@ -347,6 +354,13 @@ extension PreviewTests {
}
}
@Test
func healthChatProfileEditScreen() async throws {
for (index, preview) in HealthChatProfileEditScreen_Previews._allPreviews.enumerated() {
try await assertSnapshots(matching: preview, step: index)
}
}
@Test
func highlightedTimelineItemModifier() async throws {
for (index, preview) in HighlightedTimelineItemModifier_Previews._allPreviews.enumerated() {
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:5f38be86565d33d4b05fc8900bd1eab780c2274c8e1ad412e9a7f1d6a564545c
size 102677
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ea5b29ae3a83d73ff3c518bcff5fd7beb4f4ec0649e03c9baad29c25ac66ab81
size 109760
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c2e0cc83bbd0965fa3dac8c95474d4a49e07090d79e188ac8735fcdd2a95b805
size 52217
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:db0c766615367a567ae970a4c0dd10f17b26a2e05a2dbc85a5f855e6fc2e609c
size 58946
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:13130e09d9e5ae841fc6e269dcf9420cffe64f69583d3580a56b7334d353e7fc
size 109359
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2cba1ef512bad9756ada9561ce7a8a94040d32249c3b3caa136eb14c42c9af42
size 111733
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0deb076847dba35be2cac3b4985ca562640b533b4a3fdfff077c2e3f87b8d964
size 63549
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7f1e02b607867f252f52c17ee681c379f9f19f4ea149591f0a972efa597cff7a
size 64395
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:835f7263895535cfec1d671cedeb84751be94545c1ca3670e55ee8d1e09b2bf7
size 115087
oid sha256:5dca1592ef70e7460d8445380ee694b0b470a9e19606252201c65041b4026046
size 116242
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9d45d4bce9720d2953fc778eb008fd5a126a45cf01ecf9eeb98ad2ef203733ed
size 117358
oid sha256:08da7f3910560b00052315c152be0c9c3aa7db8bd54c5e94e60f1f27c95e4ca9
size 118373
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:4f5f4c69f3edb9af10ce7286084d969b67d949c5d3499d3ef49eb1b82caa19a7
size 68274
oid sha256:92ea3078cb7500856dc31a0d83c051eb619e045165c26b0052e09d8ca693514f
size 69212
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a52d8441c8052e6b633dbf0aba62d55912ab177008764b06d65c99420a002085
size 69205
oid sha256:9cc8f7ff144aa1e72d67a4cc90dcb4888f6e71bf77f8daf1ad27f7f3c13340bf
size 70058
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:fbe25e139b3b4f8c380361365fa8f32ac66b5e17d1de68640900dabd6e7daf96
size 138163
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b4aaf0ae37a6e29c9ec4c2e8f93b24c570d7fab5b99060ee3ee3e22918450042
size 146640
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:1a796b5a0b707ea279b70a6c119106866df83c1eb57b3953fd572d02bdf53d7d
size 87763
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:100fa2d919cd78d957c7c8dac52e7013fec340ee01ccd18f0351229a7cf78e75
size 94975