Skip to content

Commit 7db21dd

Browse files
Merge pull request #5841 from simpledotorg/master
2 parents 106b8f7 + 5630d1d commit 7db21dd

45 files changed

Lines changed: 785 additions & 268 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
### Changes
1818

1919
- Update Titration nudge threshold for diabetic patients in SriLanka from `140/90` to `130/80`
20+
- Add BMI container to patient registration screen
21+
- Add BMI container to patient summary screen
2022

2123
## 2026.05.11
2224

app/src/main/java/org/simple/clinic/feature/Feature.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,5 @@ enum class Feature(
3030
ShowDiagnosisButton(false, "show_diagnosis_button"),
3131
SortOverdueBasedOnReturnScore(false, "sort_overdue_based_on_return_score"),
3232
ShowReturnScoreDebugValues(false, "show_return_score_debug_values"),
33+
ShowBMIContainer(false, "show_bmi_container"),
3334
}

app/src/main/java/org/simple/clinic/medicalhistory/newentry/NewMedicalHistoryEffect.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package org.simple.clinic.medicalhistory.newentry
22

33
import org.simple.clinic.medicalhistory.OngoingMedicalHistoryEntry
4+
import org.simple.clinic.patientattribute.BMIReading
45
import java.util.UUID
56

67
sealed class NewMedicalHistoryEffect
78

8-
data class RegisterPatient(val ongoingMedicalHistoryEntry: OngoingMedicalHistoryEntry) : NewMedicalHistoryEffect()
9+
data class RegisterPatient(
10+
val ongoingMedicalHistoryEntry: OngoingMedicalHistoryEntry,
11+
val bmiReading: BMIReading?
12+
) : NewMedicalHistoryEffect()
913

1014
data object LoadOngoingPatientEntry : NewMedicalHistoryEffect()
1115

@@ -31,4 +35,8 @@ data object ShowChangeDiagnosisErrorDialog : NewMedicalHistoryViewEffect()
3135

3236
data object ShowOngoingDiabetesTreatmentErrorDialog : NewMedicalHistoryViewEffect()
3337

38+
data class OpenBMIEntrySheet(
39+
val bmiReading: BMIReading?
40+
) : NewMedicalHistoryViewEffect()
41+
3442
data object GoBack : NewMedicalHistoryViewEffect()

app/src/main/java/org/simple/clinic/medicalhistory/newentry/NewMedicalHistoryEffectHandler.kt

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,15 @@ import dagger.Lazy
66
import dagger.assisted.Assisted
77
import dagger.assisted.AssistedFactory
88
import dagger.assisted.AssistedInject
9+
import io.reactivex.Completable
910
import io.reactivex.ObservableTransformer
1011
import io.reactivex.Scheduler
1112
import org.simple.clinic.facility.Facility
1213
import org.simple.clinic.medicalhistory.MedicalHistoryRepository
1314
import org.simple.clinic.medicalhistory.OngoingMedicalHistoryEntry
1415
import org.simple.clinic.patient.PatientRepository
16+
import org.simple.clinic.patientattribute.BMIReading
17+
import org.simple.clinic.patientattribute.PatientAttributeRepository
1518
import org.simple.clinic.sync.DataSync
1619
import org.simple.clinic.user.User
1720
import org.simple.clinic.util.scheduler.SchedulersProvider
@@ -23,6 +26,7 @@ class NewMedicalHistoryEffectHandler @AssistedInject constructor(
2326
private val schedulersProvider: SchedulersProvider,
2427
private val patientRepository: PatientRepository,
2528
private val medicalHistoryRepository: MedicalHistoryRepository,
29+
private val patientAttributeRepository: PatientAttributeRepository,
2630
private val dataSync: DataSync,
2731
private val currentUser: Lazy<User>,
2832
private val currentFacility: Lazy<Facility>,
@@ -57,30 +61,44 @@ class NewMedicalHistoryEffectHandler @AssistedInject constructor(
5761
val loggedInUser = currentUser.get()
5862
val facility = currentFacility.get()
5963
val ongoingMedicalHistoryEntry = registerPatientEffect.ongoingMedicalHistoryEntry
64+
val bmiReading = registerPatientEffect.bmiReading
6065

61-
RegisterPatientData(loggedInUser, facility, ongoingMedicalHistoryEntry)
66+
RegisterPatientData(loggedInUser, facility, ongoingMedicalHistoryEntry, bmiReading)
6267
}
63-
.map { (user, facility, ongoingMedicalHistoryEntry) ->
68+
.map { registerPatientData ->
6469
patientRepository
6570
.saveOngoingEntryAsPatient(
6671
patientEntry = patientRepository.ongoingEntry(),
67-
loggedInUser = user,
68-
facility = facility,
72+
loggedInUser = registerPatientData.user,
73+
facility = registerPatientData.facility,
6974
patientUuid = uuidGenerator.v4(),
7075
addressUuid = uuidGenerator.v4(),
7176
supplyUuidForBpPassport = uuidGenerator::v4,
7277
supplyUuidForAlternativeId = uuidGenerator::v4,
7378
supplyUuidForPhoneNumber = uuidGenerator::v4,
7479
dateOfBirthFormatter = dateOfBirthFormatter
75-
) to ongoingMedicalHistoryEntry
80+
) to registerPatientData
7681
}
77-
.flatMapSingle { (registeredPatient, ongoingMedicalHistoryEntry) ->
82+
.flatMapSingle { (registeredPatient, registeredPatientData) ->
83+
84+
val saveBmi = Completable.fromAction {
85+
registeredPatientData.bmiReading?.let {
86+
patientAttributeRepository.save(
87+
bmiReading = it,
88+
patientUuid = registeredPatient.patientUuid,
89+
loggedInUserUuid = registeredPatientData.user.uuid,
90+
uuid = uuidGenerator.v4(),
91+
)
92+
}
93+
}
94+
7895
medicalHistoryRepository
7996
.save(
8097
uuid = uuidGenerator.v4(),
8198
patientUuid = registeredPatient.patientUuid,
82-
historyEntry = ongoingMedicalHistoryEntry
99+
historyEntry = registeredPatientData.ongoingMedicalHistoryEntry
83100
)
101+
.andThen(saveBmi)
84102
.toSingleDefault(PatientRegistered(registeredPatient.patientUuid))
85103
}
86104
}
@@ -114,6 +132,7 @@ class NewMedicalHistoryEffectHandler @AssistedInject constructor(
114132
private data class RegisterPatientData(
115133
val user: User,
116134
val facility: Facility,
117-
val ongoingMedicalHistoryEntry: OngoingMedicalHistoryEntry
135+
val ongoingMedicalHistoryEntry: OngoingMedicalHistoryEntry,
136+
val bmiReading: BMIReading?
118137
)
119138
}

app/src/main/java/org/simple/clinic/medicalhistory/newentry/NewMedicalHistoryEvent.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import org.simple.clinic.facility.Facility
44
import org.simple.clinic.medicalhistory.Answer
55
import org.simple.clinic.medicalhistory.MedicalHistoryQuestion
66
import org.simple.clinic.patient.OngoingNewPatientEntry
7+
import org.simple.clinic.patientattribute.BMIReading
78
import org.simple.clinic.widgets.UiEvent
89
import java.util.UUID
910

@@ -29,10 +30,19 @@ data class CurrentFacilityLoaded(val facility: Facility) : NewMedicalHistoryEven
2930

3031
data class SyncTriggered(val registeredPatientUuid: UUID) : NewMedicalHistoryEvent()
3132

33+
data class BMIReadingAdded(
34+
val bmiReading: BMIReading
35+
) : NewMedicalHistoryEvent()
36+
3237
data object ChangeDiagnosisNotNowClicked : NewMedicalHistoryEvent() {
3338
override val analyticsName = "New Medical History:Change Diagnosis:Not Now Clicked"
3439
}
3540

3641
data object BackClicked : NewMedicalHistoryEvent() {
3742
override val analyticsName: String = "New Medical History:Back Clicked"
3843
}
44+
45+
data object AddOrEditBMIClicked : NewMedicalHistoryEvent() {
46+
override val analyticsName: String = "New Medical History:Add BMI Clicked"
47+
}
48+

app/src/main/java/org/simple/clinic/medicalhistory/newentry/NewMedicalHistoryModel.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,21 @@ import org.simple.clinic.medicalhistory.Answer.Yes
1111
import org.simple.clinic.medicalhistory.MedicalHistoryQuestion
1212
import org.simple.clinic.medicalhistory.OngoingMedicalHistoryEntry
1313
import org.simple.clinic.patient.OngoingNewPatientEntry
14+
import org.simple.clinic.patientattribute.BMIReading
1415

1516
@Parcelize
1617
data class NewMedicalHistoryModel(
1718
val country: Country,
1819
val ongoingPatientEntry: OngoingNewPatientEntry?,
1920
val ongoingMedicalHistoryEntry: OngoingMedicalHistoryEntry,
21+
val bmiReading: BMIReading?,
2022
val currentFacility: Facility?,
2123
val nextButtonState: ButtonState?,
2224
val hasShownChangeDiagnosisError: Boolean,
2325
val showIsSmokingQuestion: Boolean,
2426
val showSmokelessTobaccoQuestion: Boolean,
2527
val isScreeningFeatureEnabled: Boolean,
28+
val showBMIContainer: Boolean,
2629
) : Parcelable {
2730

2831
val hasLoadedPatientEntry: Boolean
@@ -79,16 +82,19 @@ data class NewMedicalHistoryModel(
7982
showIsSmokingQuestion: Boolean,
8083
showSmokelessTobaccoQuestion: Boolean,
8184
isScreeningFeatureEnabled: Boolean,
85+
showBMIContainer: Boolean,
8286
): NewMedicalHistoryModel = NewMedicalHistoryModel(
8387
country = country,
8488
ongoingPatientEntry = null,
8589
ongoingMedicalHistoryEntry = OngoingMedicalHistoryEntry(),
90+
bmiReading = null,
8691
currentFacility = null,
8792
nextButtonState = null,
8893
hasShownChangeDiagnosisError = false,
8994
showIsSmokingQuestion = showIsSmokingQuestion,
9095
showSmokelessTobaccoQuestion = showSmokelessTobaccoQuestion,
9196
isScreeningFeatureEnabled = isScreeningFeatureEnabled,
97+
showBMIContainer = showBMIContainer,
9298
)
9399
}
94100

@@ -115,4 +121,9 @@ data class NewMedicalHistoryModel(
115121
fun changeDiagnosisErrorShown(): NewMedicalHistoryModel {
116122
return copy(hasShownChangeDiagnosisError = true)
117123
}
124+
125+
fun changeBMIReading(bmiReading: BMIReading?): NewMedicalHistoryModel {
126+
return copy(bmiReading = bmiReading)
127+
}
128+
118129
}

app/src/main/java/org/simple/clinic/medicalhistory/newentry/NewMedicalHistoryScreen.kt

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package org.simple.clinic.medicalhistory.newentry
22

33
import android.content.Context
44
import android.os.Bundle
5+
import android.os.Parcelable
56
import android.view.LayoutInflater
67
import android.view.View
78
import android.view.ViewGroup
@@ -29,9 +30,14 @@ import org.simple.clinic.mobius.DisposableViewEffect
2930
import org.simple.clinic.navigation.v2.HandlesBack
3031
import org.simple.clinic.navigation.v2.Router
3132
import org.simple.clinic.navigation.v2.ScreenKey
33+
import org.simple.clinic.navigation.v2.Succeeded
34+
import org.simple.clinic.patientattribute.BMIReading
35+
import org.simple.clinic.patientattribute.entry.BMIEntrySheet
3236
import org.simple.clinic.summary.OpenIntention
37+
import org.simple.clinic.summary.PatientSummaryScreen.ScreenRequest
3338
import org.simple.clinic.summary.PatientSummaryScreenKey
3439
import org.simple.clinic.util.UtcClock
40+
import org.simple.clinic.util.setFragmentResultListener
3541
import org.simple.clinic.util.unsafeLazy
3642
import java.time.Instant
3743
import java.util.UUID
@@ -73,6 +79,17 @@ class NewMedicalHistoryScreen : Fragment(), NewMedicalHistoryUiActions, HandlesB
7379
context.injector<Injector>().inject(this)
7480
}
7581

82+
override fun onCreate(savedInstanceState: Bundle?) {
83+
super.onCreate(savedInstanceState)
84+
setFragmentResultListener(
85+
ScreenRequest.BMIEntrySheet
86+
) { requestKey, result ->
87+
if (result is Succeeded) {
88+
handleScreenResult(requestKey, result)
89+
}
90+
}
91+
}
92+
7693
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
7794
return ComposeView(requireContext()).apply {
7895
setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
@@ -87,7 +104,11 @@ class NewMedicalHistoryScreen : Fragment(), NewMedicalHistoryUiActions, HandlesB
87104
navigationIconClick = { onBackPressed() },
88105
onNextClick = {
89106
viewModel.dispatch(SaveMedicalHistoryClicked())
107+
},
108+
onAddBMIClick = {
109+
viewModel.dispatch(AddOrEditBMIClicked)
90110
}
111+
91112
) { question, answer ->
92113
viewModel.dispatch(NewMedicalHistoryAnswerToggled(question, answer))
93114
}
@@ -96,6 +117,18 @@ class NewMedicalHistoryScreen : Fragment(), NewMedicalHistoryUiActions, HandlesB
96117
}
97118
}
98119

120+
private fun handleScreenResult(requestKey: Parcelable, result: Succeeded) {
121+
when (requestKey) {
122+
is ScreenRequest.BMIEntrySheet -> {
123+
val bmiReading = (result.result as BMIEntrySheet.BMIAdded).bmiReading
124+
125+
if (bmiReading != null) {
126+
viewModel.dispatch(BMIReadingAdded(bmiReading))
127+
}
128+
}
129+
}
130+
}
131+
99132
override fun openPatientSummaryScreen(patientUuid: UUID) {
100133
router.push(PatientSummaryScreenKey(patientUuid, OpenIntention.ViewNewPatient, Instant.now(utcClock)))
101134
}
@@ -108,6 +141,10 @@ class NewMedicalHistoryScreen : Fragment(), NewMedicalHistoryUiActions, HandlesB
108141
SelectOngoingDiabetesTreatmentErrorDialog.show(fragmentManager = activity.supportFragmentManager)
109142
}
110143

144+
override fun openBMIEntrySheet(bmiReading: BMIReading?) {
145+
router.pushExpectingResult(ScreenRequest.BMIEntrySheet, BMIEntrySheet.Key(bmiReading))
146+
}
147+
111148
override fun goBack() {
112149
router.pop()
113150
}

app/src/main/java/org/simple/clinic/medicalhistory/newentry/NewMedicalHistoryUiActions.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.simple.clinic.medicalhistory.newentry
22

3+
import org.simple.clinic.patientattribute.BMIReading
34
import java.util.UUID
45

56
interface NewMedicalHistoryUiActions {
@@ -13,5 +14,6 @@ interface NewMedicalHistoryUiActions {
1314
fun showChangeDiagnosisErrorDialog()
1415
fun showOngoingDiabetesTreatmentErrorDialog()
1516

17+
fun openBMIEntrySheet(bmiReading: BMIReading?)
1618
fun goBack()
1719
}

app/src/main/java/org/simple/clinic/medicalhistory/newentry/NewMedicalHistoryUpdate.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ class NewMedicalHistoryUpdate : Update<NewMedicalHistoryModel, NewMedicalHistory
2323
is SyncTriggered -> dispatch(OpenPatientSummaryScreen(event.registeredPatientUuid))
2424
is ChangeDiagnosisNotNowClicked -> registerPatient(model)
2525
is BackClicked -> dispatch(GoBack)
26+
is AddOrEditBMIClicked -> dispatch(OpenBMIEntrySheet(model.bmiReading))
27+
is BMIReadingAdded -> next(model.changeBMIReading(event.bmiReading))
2628
}
2729
}
2830

@@ -72,7 +74,7 @@ class NewMedicalHistoryUpdate : Update<NewMedicalHistoryModel, NewMedicalHistory
7274
} else {
7375
next(
7476
model.registeringPatient(),
75-
RegisterPatient(model.ongoingMedicalHistoryEntry)
77+
RegisterPatient(model.ongoingMedicalHistoryEntry, model.bmiReading)
7678
)
7779
}
7880
}

app/src/main/java/org/simple/clinic/medicalhistory/newentry/NewMedicalHistoryViewEffectHandler.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class NewMedicalHistoryViewEffectHandler(
1717
ShowHypertensionDiagnosisOrReferralRequiredError -> uiActions.showHypertensionDiagnosisRequiredOrReferralErrorDialog()
1818
ShowChangeDiagnosisErrorDialog -> uiActions.showChangeDiagnosisErrorDialog()
1919
ShowOngoingDiabetesTreatmentErrorDialog -> uiActions.showOngoingDiabetesTreatmentErrorDialog()
20+
is OpenBMIEntrySheet -> uiActions.openBMIEntrySheet(viewEffect.bmiReading)
2021
GoBack -> uiActions.goBack()
2122
}.exhaustive()
2223
}

0 commit comments

Comments
 (0)