Skip to content

Commit 6605bb8

Browse files
siddh1004sagarwal
andauthored
1 parent a6021de commit 6605bb8

File tree

7 files changed

+287
-247
lines changed

7 files changed

+287
-247
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
- Migrate blood sugar summary view to Jetpack Compose
1616
- Migrate medical history summary view to Jetpack Compose
1717
- Migrate assigned facility view to Jetpack Compose
18+
- Migrate next appointment view to Jetpack Compose
1819

1920
## 2025.05.20
2021

app/src/main/java/org/simple/clinic/summary/assignedfacility/AssignedFacilityView.kt

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import android.annotation.SuppressLint
44
import android.content.Context
55
import android.os.Parcelable
66
import android.util.AttributeSet
7-
import android.view.LayoutInflater
87
import androidx.compose.runtime.getValue
98
import androidx.compose.runtime.mutableStateOf
109
import androidx.compose.runtime.setValue
@@ -13,7 +12,6 @@ import androidx.compose.ui.platform.ViewCompositionStrategy
1312
import com.google.android.material.card.MaterialCardView
1413
import io.reactivex.Observable
1514
import org.simple.clinic.common.ui.theme.SimpleTheme
16-
import org.simple.clinic.databinding.PatientsummaryAssignedFacilityContentBinding
1715
import org.simple.clinic.di.injector
1816
import org.simple.clinic.facility.Facility
1917
import org.simple.clinic.mobius.DeferredEventSource
@@ -38,15 +36,8 @@ class AssignedFacilityView(
3836
var changeAssignedFacilityClicks: ChangeAssignedFacilityClicked? = null
3937
var assignedFacilityChanges: AssignedFacilityChanges? = null
4038

41-
private var binding: PatientsummaryAssignedFacilityContentBinding? = null
42-
4339
private var assignedFacilityName by mutableStateOf("")
4440

45-
init {
46-
val layoutInflater = LayoutInflater.from(context)
47-
binding = PatientsummaryAssignedFacilityContentBinding.inflate(layoutInflater, this, true)
48-
}
49-
5041
@Inject
5142
lateinit var router: Router
5243

app/src/main/java/org/simple/clinic/summary/nextappointment/NextAppointmentCardView.kt

Lines changed: 34 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,18 @@ package org.simple.clinic.summary.nextappointment
33
import android.content.Context
44
import android.os.Parcelable
55
import android.util.AttributeSet
6-
import android.view.LayoutInflater
7-
import android.view.View
8-
import androidx.core.text.buildSpannedString
9-
import androidx.core.text.color
6+
import androidx.compose.runtime.getValue
7+
import androidx.compose.runtime.mutableStateOf
8+
import androidx.compose.runtime.setValue
9+
import androidx.compose.ui.platform.ComposeView
10+
import androidx.compose.ui.platform.ViewCompositionStrategy
1011
import com.google.android.material.card.MaterialCardView
1112
import io.reactivex.Observable
1213
import io.reactivex.rxkotlin.cast
1314
import io.reactivex.subjects.PublishSubject
1415
import org.simple.clinic.R
1516
import org.simple.clinic.ReportAnalyticsEvents
16-
import org.simple.clinic.databinding.PatientsummaryNextAppointmentCardBinding
17+
import org.simple.clinic.common.ui.theme.SimpleTheme
1718
import org.simple.clinic.di.injector
1819
import org.simple.clinic.mobius.MobiusDelegate
1920
import org.simple.clinic.navigation.v2.Router
@@ -23,9 +24,8 @@ import org.simple.clinic.summary.AppointmentSheetOpenedFrom
2324
import org.simple.clinic.summary.PatientSummaryChildView
2425
import org.simple.clinic.summary.PatientSummaryModelUpdateCallback
2526
import org.simple.clinic.summary.PatientSummaryScreenKey
26-
import org.simple.clinic.util.Unicode
27+
import org.simple.clinic.summary.nextappointment.ui.NextAppointment
2728
import org.simple.clinic.util.UserClock
28-
import org.simple.clinic.util.resolveColor
2929
import org.simple.clinic.util.unsafeLazy
3030
import java.time.LocalDate
3131
import java.time.format.DateTimeFormatter
@@ -67,19 +67,13 @@ class NextAppointmentCardView(
6767
LocalDate.now(userClock)
6868
}
6969

70-
private var binding: PatientsummaryNextAppointmentCardBinding? = null
7170
private var modelUpdateCallback: PatientSummaryModelUpdateCallback? = null
7271

7372
var nextAppointmentActionClicks: NextAppointmentActionClicked? = null
7473

75-
private val appointmentDateTextView
76-
get() = binding!!.appointmentDateTextView
77-
78-
private val appointmentFacilityTextView
79-
get() = binding!!.appointmentFacilityTextView
80-
81-
private val nextAppointmentActionsButton
82-
get() = binding!!.nextAppointmentActionButton
74+
private var appointmentFacilityName by mutableStateOf("")
75+
private var actionButtonText by mutableStateOf("")
76+
private var appointmentSate by mutableStateOf<NextAppointmentState>(NextAppointmentState.NoAppointment)
8377

8478
private val hotEvents = PublishSubject.create<NextAppointmentEvent>()
8579

@@ -105,21 +99,29 @@ class NextAppointmentCardView(
10599
)
106100
}
107101

108-
init {
109-
val layoutInflater = LayoutInflater.from(context)
110-
binding = PatientsummaryNextAppointmentCardBinding.inflate(layoutInflater, this, true)
111-
}
112-
113102
override fun onFinishInflate() {
114103
super.onFinishInflate()
115104
if (isInEditMode) {
116105
return
117106
}
118107
context.injector<Injector>().inject(this)
119108

120-
nextAppointmentActionsButton.setOnClickListener {
121-
nextAppointmentActionClicks?.invoke()
122-
}
109+
addView(ComposeView(context).apply {
110+
setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnDetachedFromWindow)
111+
112+
setContent {
113+
SimpleTheme {
114+
NextAppointment(
115+
state = appointmentSate,
116+
dateTimeFormatter = fullDateFormatter,
117+
facilityName = appointmentFacilityName,
118+
actionButtonText = actionButtonText
119+
) {
120+
nextAppointmentActionClicks?.invoke()
121+
}
122+
}
123+
}
124+
})
123125
}
124126

125127
override fun onAttachedToWindow() {
@@ -145,78 +147,35 @@ class NextAppointmentCardView(
145147
}
146148

147149
override fun showNoAppointment() {
148-
appointmentDateTextView.text = buildSpannedString {
149-
color(context.resolveColor(colorRes = R.color.color_on_surface_67)) {
150-
append(context.getString(R.string.next_appointment_none))
151-
}
152-
}
150+
appointmentSate = NextAppointmentState.NoAppointment
153151
}
154152

155153
override fun showAppointmentDate(date: LocalDate) {
156-
appointmentDateTextView.text = buildSpannedString {
157-
color(context.resolveColor(attrRes = R.attr.colorOnSurface)) {
158-
append(fullDateFormatter.format(date))
159-
}
160-
161-
append("${Unicode.nonBreakingSpace}${Unicode.nonBreakingSpace}")
162-
163-
color(context.resolveColor(colorRes = R.color.simple_green_500)) {
164-
append(context.getString(R.string.next_appointment_today))
165-
}
166-
}
154+
appointmentSate = NextAppointmentState.Today(date)
167155
}
168156

169157
override fun showAppointmentDateWithRemainingDays(date: LocalDate, daysRemaining: Int) {
170-
appointmentDateTextView.text = buildSpannedString {
171-
color(context.resolveColor(attrRes = R.attr.colorOnSurface)) {
172-
append(fullDateFormatter.format(date))
173-
}
174-
175-
append("${Unicode.nonBreakingSpace}${Unicode.nonBreakingSpace}")
176-
177-
color(context.resolveColor(colorRes = R.color.simple_green_500)) {
178-
append(resources.getQuantityString(
179-
R.plurals.next_appointment_plurals,
180-
daysRemaining,
181-
daysRemaining
182-
))
183-
}
184-
}
158+
appointmentSate = NextAppointmentState.Scheduled(date, daysRemaining)
185159
}
186160

187161
override fun showAppointmentDateWithOverdueDays(date: LocalDate, overdueDays: Int) {
188-
appointmentDateTextView.text = buildSpannedString {
189-
color(context.resolveColor(attrRes = R.attr.colorOnSurface)) {
190-
append(fullDateFormatter.format(date))
191-
}
192-
193-
append("${Unicode.nonBreakingSpace}${Unicode.nonBreakingSpace}")
194-
195-
color(context.resolveColor(attrRes = R.attr.colorError)) {
196-
append(resources.getQuantityString(
197-
R.plurals.next_appointment_overdue_plurals,
198-
overdueDays,
199-
overdueDays
200-
))
201-
}
202-
}
162+
appointmentSate = NextAppointmentState.Overdue(date, overdueDays)
203163
}
204164

205165
override fun showAddAppointmentButton() {
206-
nextAppointmentActionsButton.text = context.getString(R.string.next_appointment_view_add)
166+
actionButtonText = context.getString(R.string.next_appointment_view_add)
207167
}
208168

209169
override fun showChangeAppointmentButton() {
210-
nextAppointmentActionsButton.text = context.getString(R.string.next_appointment_view_change)
170+
actionButtonText = context.getString(R.string.next_appointment_view_change)
211171
}
212172

213173
override fun showAppointmentFacility(name: String) {
214-
appointmentFacilityTextView.visibility = View.VISIBLE
215-
appointmentFacilityTextView.text = context.getString(R.string.next_appointment_appointment_at_facility, name)
174+
appointmentFacilityName = context.getString(R.string.next_appointment_appointment_at_facility, name)
216175
}
217176

218177
override fun hideAppointmentFacility() {
219-
appointmentFacilityTextView.visibility = View.GONE
178+
appointmentFacilityName = ""
220179
}
221180

222181
override fun openScheduleAppointmentSheet(patientUUID: UUID) {
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.simple.clinic.summary.nextappointment
2+
3+
import java.time.LocalDate
4+
5+
sealed interface NextAppointmentState {
6+
data object NoAppointment : NextAppointmentState
7+
8+
data class Today(val date: LocalDate) : NextAppointmentState
9+
10+
data class Scheduled(val date: LocalDate, val daysRemaining: Int) : NextAppointmentState
11+
12+
data class Overdue(val date: LocalDate, val overdueDays: Int) : NextAppointmentState
13+
}

0 commit comments

Comments
 (0)