@@ -7,6 +7,8 @@ import androidx.compose.runtime.mutableStateOf
7
7
import androidx.lifecycle.viewModelScope
8
8
import com.ivy.base.legacy.SharedPrefs
9
9
import com.ivy.base.model.processByType
10
+ import com.ivy.base.time.TimeConverter
11
+ import com.ivy.base.time.TimeProvider
10
12
import com.ivy.data.db.dao.read.LoanRecordDao
11
13
import com.ivy.data.db.dao.read.SettingsDao
12
14
import com.ivy.data.db.dao.write.WriteLoanDao
@@ -20,6 +22,7 @@ import com.ivy.legacy.utils.getDefaultFIATCurrency
20
22
import com.ivy.legacy.utils.ioThread
21
23
import com.ivy.loans.loan.data.DisplayLoan
22
24
import com.ivy.ui.ComposeViewModel
25
+ import com.ivy.ui.time.impl.DateTimePicker
23
26
import com.ivy.wallet.domain.action.account.AccountsAct
24
27
import com.ivy.wallet.domain.action.loan.LoansAct
25
28
import com.ivy.wallet.domain.deprecated.logic.LoanCreator
@@ -33,6 +36,8 @@ import kotlinx.collections.immutable.persistentListOf
33
36
import kotlinx.collections.immutable.toImmutableList
34
37
import kotlinx.coroutines.Dispatchers
35
38
import kotlinx.coroutines.launch
39
+ import java.time.Instant
40
+ import java.time.LocalDateTime
36
41
import java.util.UUID
37
42
import javax.inject.Inject
38
43
@@ -48,6 +53,9 @@ class LoanViewModel @Inject constructor(
48
53
private val loansAct : LoansAct ,
49
54
private val accountsAct : AccountsAct ,
50
55
private val loanWriter : WriteLoanDao ,
56
+ private val timeConverter : TimeConverter ,
57
+ private val timeProvider : TimeProvider ,
58
+ private val dateTimePicker : DateTimePicker ,
51
59
) : ComposeViewModel<LoanScreenState, LoanScreenEvent>() {
52
60
53
61
private val baseCurrencyCode = mutableStateOf(getDefaultFIATCurrency().currencyCode)
@@ -56,6 +64,7 @@ class LoanViewModel @Inject constructor(
56
64
private val selectedAccount = mutableStateOf<Account ?>(null )
57
65
private val loanModalData = mutableStateOf<LoanModalData ?>(null )
58
66
private val reorderModalVisible = mutableStateOf(false )
67
+ private var dateTime = mutableStateOf<Instant >(timeProvider.utcNow())
59
68
60
69
/* * If true paid off loans will be visible */
61
70
private val paidOffLoanVisibility = mutableStateOf(true )
@@ -81,7 +90,8 @@ class LoanViewModel @Inject constructor(
81
90
reorderModalVisible = getReorderModalVisible(),
82
91
totalOweAmount = getTotalOweAmount(totalOweAmount, defaultCurrencyCode),
83
92
totalOwedAmount = getTotalOwedAmount(totalOwedAmount, defaultCurrencyCode),
84
- paidOffLoanVisibility = getPaidOffLoanVisibility()
93
+ paidOffLoanVisibility = getPaidOffLoanVisibility(),
94
+ dateTime = dateTime.value
85
95
)
86
96
}
87
97
@@ -126,6 +136,7 @@ class LoanViewModel @Inject constructor(
126
136
127
137
is LoanScreenEvent .OnLoanModalDismiss -> {
128
138
loanModalData.value = null
139
+ dateTime.value = timeProvider.utcNow()
129
140
}
130
141
131
142
is LoanScreenEvent .OnReOrderModalShow -> {
@@ -143,13 +154,22 @@ class LoanViewModel @Inject constructor(
143
154
LoanScreenEvent .OnTogglePaidOffLoanVisibility -> {
144
155
updatePaidOffLoanVisibility()
145
156
}
157
+
158
+ is LoanScreenEvent .OnChangeDate -> {
159
+ handleChangeDate()
160
+ }
161
+ is LoanScreenEvent .OnChangeTime -> {
162
+ handleChangeTime()
163
+ }
146
164
}
147
165
}
148
166
149
167
private fun start () {
150
168
viewModelScope.launch(Dispatchers .Default ) {
151
169
TestIdlingResource .increment()
152
170
171
+ dateTime.value = timeProvider.utcNow()
172
+
153
173
defaultCurrencyCode = ioThread {
154
174
settingsDao.findFirst().currency
155
175
}.also {
@@ -226,6 +246,46 @@ class LoanViewModel @Inject constructor(
226
246
}
227
247
}
228
248
249
+ private fun handleChangeDate () {
250
+ dateTimePicker.pickDate(
251
+ initialDate = loanModalData.value?.loan?.dateTime?.let {
252
+ with (timeConverter) { it.toUTC() }
253
+ } ? : timeProvider.utcNow()
254
+ ) { localDate ->
255
+ val localTime = loanModalData.value?.loan?.dateTime?.let {
256
+ with (timeConverter) { it.toLocalTime() }
257
+ } ? : timeProvider.localTimeNow()
258
+
259
+ updateDateTime(localDate.atTime(localTime))
260
+ }
261
+ }
262
+
263
+ private fun handleChangeTime () {
264
+ dateTimePicker.pickTime(
265
+ initialTime = loanModalData.value?.loan?.dateTime?.let {
266
+ with (timeConverter) { it.toLocalTime() }
267
+ } ? : timeProvider.localTimeNow()
268
+ ) { localTime ->
269
+ val localDate = loanModalData.value?.loan?.dateTime?.let {
270
+ with (timeConverter) { it.toLocalDate() }
271
+ } ? : timeProvider.localDateNow()
272
+
273
+ updateDateTime(localDate.atTime(localTime))
274
+ }
275
+ }
276
+
277
+ private fun updateDateTime (newDateTime : LocalDateTime ) {
278
+ val newDateTimeUtc = with (timeConverter) { newDateTime.toUTC() }
279
+ loanModalData.value?.let { currentData ->
280
+ loanModalData.value = currentData.copy(
281
+ loan = currentData.loan?.copy(
282
+ dateTime = newDateTime
283
+ )
284
+ )
285
+ dateTime.value = newDateTimeUtc
286
+ }
287
+ }
288
+
229
289
private fun createLoan (data : CreateLoanData ) {
230
290
viewModelScope.launch {
231
291
TestIdlingResource .increment()
0 commit comments