@@ -3,17 +3,18 @@ package org.simple.clinic.summary.nextappointment
33import android.content.Context
44import android.os.Parcelable
55import 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
1011import com.google.android.material.card.MaterialCardView
1112import io.reactivex.Observable
1213import io.reactivex.rxkotlin.cast
1314import io.reactivex.subjects.PublishSubject
1415import org.simple.clinic.R
1516import org.simple.clinic.ReportAnalyticsEvents
16- import org.simple.clinic.databinding.PatientsummaryNextAppointmentCardBinding
17+ import org.simple.clinic.common.ui.theme.SimpleTheme
1718import org.simple.clinic.di.injector
1819import org.simple.clinic.mobius.MobiusDelegate
1920import org.simple.clinic.navigation.v2.Router
@@ -23,9 +24,8 @@ import org.simple.clinic.summary.AppointmentSheetOpenedFrom
2324import org.simple.clinic.summary.PatientSummaryChildView
2425import org.simple.clinic.summary.PatientSummaryModelUpdateCallback
2526import org.simple.clinic.summary.PatientSummaryScreenKey
26- import org.simple.clinic.util.Unicode
27+ import org.simple.clinic.summary.nextappointment.ui.NextAppointment
2728import org.simple.clinic.util.UserClock
28- import org.simple.clinic.util.resolveColor
2929import org.simple.clinic.util.unsafeLazy
3030import java.time.LocalDate
3131import 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 ) {
0 commit comments