Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
### Changes

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

## 2026.05.11

Expand Down
1 change: 1 addition & 0 deletions app/src/main/java/org/simple/clinic/feature/Feature.kt
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,5 @@ enum class Feature(
ShowDiagnosisButton(false, "show_diagnosis_button"),
SortOverdueBasedOnReturnScore(false, "sort_overdue_based_on_return_score"),
ShowReturnScoreDebugValues(false, "show_return_score_debug_values"),
ShowBMIContainer(false, "show_bmi_container"),
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package org.simple.clinic.medicalhistory.newentry

import org.simple.clinic.medicalhistory.OngoingMedicalHistoryEntry
import org.simple.clinic.patientattribute.BMIReading
import java.util.UUID

sealed class NewMedicalHistoryEffect

data class RegisterPatient(val ongoingMedicalHistoryEntry: OngoingMedicalHistoryEntry) : NewMedicalHistoryEffect()
data class RegisterPatient(
val ongoingMedicalHistoryEntry: OngoingMedicalHistoryEntry,
val bmiReading: BMIReading?
) : NewMedicalHistoryEffect()

data object LoadOngoingPatientEntry : NewMedicalHistoryEffect()

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

data object ShowOngoingDiabetesTreatmentErrorDialog : NewMedicalHistoryViewEffect()

data class OpenBMIEntrySheet(
val bmiReading: BMIReading?
) : NewMedicalHistoryViewEffect()

data object GoBack : NewMedicalHistoryViewEffect()
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,15 @@ import dagger.Lazy
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import io.reactivex.Completable
import io.reactivex.ObservableTransformer
import io.reactivex.Scheduler
import org.simple.clinic.facility.Facility
import org.simple.clinic.medicalhistory.MedicalHistoryRepository
import org.simple.clinic.medicalhistory.OngoingMedicalHistoryEntry
import org.simple.clinic.patient.PatientRepository
import org.simple.clinic.patientattribute.BMIReading
import org.simple.clinic.patientattribute.PatientAttributeRepository
import org.simple.clinic.sync.DataSync
import org.simple.clinic.user.User
import org.simple.clinic.util.scheduler.SchedulersProvider
Expand All @@ -23,6 +26,7 @@ class NewMedicalHistoryEffectHandler @AssistedInject constructor(
private val schedulersProvider: SchedulersProvider,
private val patientRepository: PatientRepository,
private val medicalHistoryRepository: MedicalHistoryRepository,
private val patientAttributeRepository: PatientAttributeRepository,
private val dataSync: DataSync,
private val currentUser: Lazy<User>,
private val currentFacility: Lazy<Facility>,
Expand Down Expand Up @@ -57,30 +61,44 @@ class NewMedicalHistoryEffectHandler @AssistedInject constructor(
val loggedInUser = currentUser.get()
val facility = currentFacility.get()
val ongoingMedicalHistoryEntry = registerPatientEffect.ongoingMedicalHistoryEntry
val bmiReading = registerPatientEffect.bmiReading

RegisterPatientData(loggedInUser, facility, ongoingMedicalHistoryEntry)
RegisterPatientData(loggedInUser, facility, ongoingMedicalHistoryEntry, bmiReading)
}
.map { (user, facility, ongoingMedicalHistoryEntry) ->
.map { registerPatientData ->
patientRepository
.saveOngoingEntryAsPatient(
patientEntry = patientRepository.ongoingEntry(),
loggedInUser = user,
facility = facility,
loggedInUser = registerPatientData.user,
facility = registerPatientData.facility,
patientUuid = uuidGenerator.v4(),
addressUuid = uuidGenerator.v4(),
supplyUuidForBpPassport = uuidGenerator::v4,
supplyUuidForAlternativeId = uuidGenerator::v4,
supplyUuidForPhoneNumber = uuidGenerator::v4,
dateOfBirthFormatter = dateOfBirthFormatter
) to ongoingMedicalHistoryEntry
) to registerPatientData
}
.flatMapSingle { (registeredPatient, ongoingMedicalHistoryEntry) ->
.flatMapSingle { (registeredPatient, registeredPatientData) ->

val saveBmi = Completable.fromAction {
registeredPatientData.bmiReading?.let {
patientAttributeRepository.save(
bmiReading = it,
patientUuid = registeredPatient.patientUuid,
loggedInUserUuid = registeredPatientData.user.uuid,
uuid = uuidGenerator.v4(),
)
}
}

medicalHistoryRepository
.save(
uuid = uuidGenerator.v4(),
patientUuid = registeredPatient.patientUuid,
historyEntry = ongoingMedicalHistoryEntry
historyEntry = registeredPatientData.ongoingMedicalHistoryEntry
)
.andThen(saveBmi)
.toSingleDefault(PatientRegistered(registeredPatient.patientUuid))
}
}
Expand Down Expand Up @@ -114,6 +132,7 @@ class NewMedicalHistoryEffectHandler @AssistedInject constructor(
private data class RegisterPatientData(
val user: User,
val facility: Facility,
val ongoingMedicalHistoryEntry: OngoingMedicalHistoryEntry
val ongoingMedicalHistoryEntry: OngoingMedicalHistoryEntry,
val bmiReading: BMIReading?
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import org.simple.clinic.facility.Facility
import org.simple.clinic.medicalhistory.Answer
import org.simple.clinic.medicalhistory.MedicalHistoryQuestion
import org.simple.clinic.patient.OngoingNewPatientEntry
import org.simple.clinic.patientattribute.BMIReading
import org.simple.clinic.widgets.UiEvent
import java.util.UUID

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

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

data class BMIReadingAdded(
val bmiReading: BMIReading
) : NewMedicalHistoryEvent()

data object ChangeDiagnosisNotNowClicked : NewMedicalHistoryEvent() {
override val analyticsName = "New Medical History:Change Diagnosis:Not Now Clicked"
}

data object BackClicked : NewMedicalHistoryEvent() {
override val analyticsName: String = "New Medical History:Back Clicked"
}

data object AddOrEditBMIClicked : NewMedicalHistoryEvent() {
override val analyticsName: String = "New Medical History:Add BMI Clicked"
}

Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,21 @@ import org.simple.clinic.medicalhistory.Answer.Yes
import org.simple.clinic.medicalhistory.MedicalHistoryQuestion
import org.simple.clinic.medicalhistory.OngoingMedicalHistoryEntry
import org.simple.clinic.patient.OngoingNewPatientEntry
import org.simple.clinic.patientattribute.BMIReading

@Parcelize
data class NewMedicalHistoryModel(
val country: Country,
val ongoingPatientEntry: OngoingNewPatientEntry?,
val ongoingMedicalHistoryEntry: OngoingMedicalHistoryEntry,
val bmiReading: BMIReading?,
val currentFacility: Facility?,
val nextButtonState: ButtonState?,
val hasShownChangeDiagnosisError: Boolean,
val showIsSmokingQuestion: Boolean,
val showSmokelessTobaccoQuestion: Boolean,
val isScreeningFeatureEnabled: Boolean,
val showBMIContainer: Boolean,
) : Parcelable {

val hasLoadedPatientEntry: Boolean
Expand Down Expand Up @@ -79,16 +82,19 @@ data class NewMedicalHistoryModel(
showIsSmokingQuestion: Boolean,
showSmokelessTobaccoQuestion: Boolean,
isScreeningFeatureEnabled: Boolean,
showBMIContainer: Boolean,
): NewMedicalHistoryModel = NewMedicalHistoryModel(
country = country,
ongoingPatientEntry = null,
ongoingMedicalHistoryEntry = OngoingMedicalHistoryEntry(),
bmiReading = null,
currentFacility = null,
nextButtonState = null,
hasShownChangeDiagnosisError = false,
showIsSmokingQuestion = showIsSmokingQuestion,
showSmokelessTobaccoQuestion = showSmokelessTobaccoQuestion,
isScreeningFeatureEnabled = isScreeningFeatureEnabled,
showBMIContainer = showBMIContainer,
)
}

Expand All @@ -115,4 +121,9 @@ data class NewMedicalHistoryModel(
fun changeDiagnosisErrorShown(): NewMedicalHistoryModel {
return copy(hasShownChangeDiagnosisError = true)
}

fun changeBMIReading(bmiReading: BMIReading?): NewMedicalHistoryModel {
return copy(bmiReading = bmiReading)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package org.simple.clinic.medicalhistory.newentry

import android.content.Context
import android.os.Bundle
import android.os.Parcelable
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
Expand Down Expand Up @@ -29,9 +30,14 @@ import org.simple.clinic.mobius.DisposableViewEffect
import org.simple.clinic.navigation.v2.HandlesBack
import org.simple.clinic.navigation.v2.Router
import org.simple.clinic.navigation.v2.ScreenKey
import org.simple.clinic.navigation.v2.Succeeded
import org.simple.clinic.patientattribute.BMIReading
import org.simple.clinic.patientattribute.entry.BMIEntrySheet
import org.simple.clinic.summary.OpenIntention
import org.simple.clinic.summary.PatientSummaryScreen.ScreenRequest
import org.simple.clinic.summary.PatientSummaryScreenKey
import org.simple.clinic.util.UtcClock
import org.simple.clinic.util.setFragmentResultListener
import org.simple.clinic.util.unsafeLazy
import java.time.Instant
import java.util.UUID
Expand Down Expand Up @@ -73,6 +79,17 @@ class NewMedicalHistoryScreen : Fragment(), NewMedicalHistoryUiActions, HandlesB
context.injector<Injector>().inject(this)
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setFragmentResultListener(
ScreenRequest.BMIEntrySheet
) { requestKey, result ->
if (result is Succeeded) {
handleScreenResult(requestKey, result)
}
}
}

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
return ComposeView(requireContext()).apply {
setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
Expand All @@ -87,7 +104,11 @@ class NewMedicalHistoryScreen : Fragment(), NewMedicalHistoryUiActions, HandlesB
navigationIconClick = { onBackPressed() },
onNextClick = {
viewModel.dispatch(SaveMedicalHistoryClicked())
},
onAddBMIClick = {
viewModel.dispatch(AddOrEditBMIClicked)
}

) { question, answer ->
viewModel.dispatch(NewMedicalHistoryAnswerToggled(question, answer))
}
Expand All @@ -96,6 +117,18 @@ class NewMedicalHistoryScreen : Fragment(), NewMedicalHistoryUiActions, HandlesB
}
}

private fun handleScreenResult(requestKey: Parcelable, result: Succeeded) {
when (requestKey) {
is ScreenRequest.BMIEntrySheet -> {
val bmiReading = (result.result as BMIEntrySheet.BMIAdded).bmiReading

if (bmiReading != null) {
viewModel.dispatch(BMIReadingAdded(bmiReading))
Comment thread
siddh1004 marked this conversation as resolved.
}
}
}
}

override fun openPatientSummaryScreen(patientUuid: UUID) {
router.push(PatientSummaryScreenKey(patientUuid, OpenIntention.ViewNewPatient, Instant.now(utcClock)))
}
Expand All @@ -108,6 +141,10 @@ class NewMedicalHistoryScreen : Fragment(), NewMedicalHistoryUiActions, HandlesB
SelectOngoingDiabetesTreatmentErrorDialog.show(fragmentManager = activity.supportFragmentManager)
}

override fun openBMIEntrySheet(bmiReading: BMIReading?) {
router.pushExpectingResult(ScreenRequest.BMIEntrySheet, BMIEntrySheet.Key(bmiReading))
}

override fun goBack() {
router.pop()
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.simple.clinic.medicalhistory.newentry

import org.simple.clinic.patientattribute.BMIReading
import java.util.UUID

interface NewMedicalHistoryUiActions {
Expand All @@ -13,5 +14,6 @@ interface NewMedicalHistoryUiActions {
fun showChangeDiagnosisErrorDialog()
fun showOngoingDiabetesTreatmentErrorDialog()

fun openBMIEntrySheet(bmiReading: BMIReading?)
fun goBack()
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ class NewMedicalHistoryUpdate : Update<NewMedicalHistoryModel, NewMedicalHistory
is SyncTriggered -> dispatch(OpenPatientSummaryScreen(event.registeredPatientUuid))
is ChangeDiagnosisNotNowClicked -> registerPatient(model)
is BackClicked -> dispatch(GoBack)
is AddOrEditBMIClicked -> dispatch(OpenBMIEntrySheet(model.bmiReading))
is BMIReadingAdded -> next(model.changeBMIReading(event.bmiReading))
}
}

Expand Down Expand Up @@ -72,7 +74,7 @@ class NewMedicalHistoryUpdate : Update<NewMedicalHistoryModel, NewMedicalHistory
} else {
next(
model.registeringPatient(),
RegisterPatient(model.ongoingMedicalHistoryEntry)
RegisterPatient(model.ongoingMedicalHistoryEntry, model.bmiReading)
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ class NewMedicalHistoryViewEffectHandler(
ShowHypertensionDiagnosisOrReferralRequiredError -> uiActions.showHypertensionDiagnosisRequiredOrReferralErrorDialog()
ShowChangeDiagnosisErrorDialog -> uiActions.showChangeDiagnosisErrorDialog()
ShowOngoingDiabetesTreatmentErrorDialog -> uiActions.showOngoingDiabetesTreatmentErrorDialog()
is OpenBMIEntrySheet -> uiActions.openBMIEntrySheet(viewEffect.bmiReading)
GoBack -> uiActions.goBack()
}.exhaustive()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ class NewMedicalHistoryViewModel(
features.isEnabled(Feature.LabBasedStatinNudge),
showSmokelessTobaccoQuestion = country.isoCountryCode != Country.ETHIOPIA,
isScreeningFeatureEnabled = features.isEnabled(Feature.Screening),
showBMIContainer = features.isEnabled(Feature.ShowBMIContainer)
),
init = NewMedicalHistoryInit(),
loopFactoryProvider = { viewEffectsConsumer ->
Expand Down
Loading