diff --git a/sheaf/app/src/main/java/systems/lupine/sheaf/ui/people/PeopleScreen.kt b/sheaf/app/src/main/java/systems/lupine/sheaf/ui/people/PeopleScreen.kt index ff5952c..0254688 100644 --- a/sheaf/app/src/main/java/systems/lupine/sheaf/ui/people/PeopleScreen.kt +++ b/sheaf/app/src/main/java/systems/lupine/sheaf/ui/people/PeopleScreen.kt @@ -64,9 +64,15 @@ fun PeopleScreen( onDispose { lifecycleOwner.lifecycle.removeObserver(observer) } } - val filteredMembers = remember(memberQuery, membersState.members) { - if (memberQuery.isBlank()) membersState.members - else membersState.members.filter { + // The list endpoint returns archived members too; keep them out of the + // roster (and its count). Archived members are viewed/restored from + // Settings > System > Archived members. + val activeMembers = remember(membersState.members) { + membersState.members.filter { !it.isArchived } + } + val filteredMembers = remember(memberQuery, activeMembers) { + if (memberQuery.isBlank()) activeMembers + else activeMembers.filter { it.displayNameOrName.contains(memberQuery.trim(), ignoreCase = true) || it.pronouns?.contains(memberQuery.trim(), ignoreCase = true) == true } @@ -153,7 +159,7 @@ fun PeopleScreen( isLoading = membersState.isLoading, error = membersState.error, members = filteredMembers, - rawMemberCount = membersState.members.size, + rawMemberCount = activeMembers.size, query = memberQuery, onQueryChange = { memberQuery = it }, showSearch = searchOpen, diff --git a/sheaf/app/src/main/java/systems/lupine/sheaf/ui/settings/SettingsViewModel.kt b/sheaf/app/src/main/java/systems/lupine/sheaf/ui/settings/SettingsViewModel.kt index acaccfc..d6ba3f0 100644 --- a/sheaf/app/src/main/java/systems/lupine/sheaf/ui/settings/SettingsViewModel.kt +++ b/sheaf/app/src/main/java/systems/lupine/sheaf/ui/settings/SettingsViewModel.kt @@ -135,7 +135,9 @@ class SettingsViewModel @Inject constructor( _state.update { it.copy(isLoading = false, error = e.toUserMessage()) } return@launch } - val memberCount = runCatching { api.listMembers().size }.getOrDefault(0) + // Exclude archived members; the list endpoint returns them but + // they aren't part of the active roster the count represents. + val memberCount = runCatching { api.listMembers().count { !it.isArchived } }.getOrDefault(0) val groupCount = runCatching { api.listGroups().size }.getOrDefault(0) val frontingCount = runCatching { api.getCurrentFronts().flatMap { it.memberIds }.toSet().size