Skip to content
This repository was archived by the owner on Nov 5, 2024. It is now read-only.

Commit 9c2dd78

Browse files
committed
migrated to new date and time picker
1 parent 9c89568 commit 9c2dd78

File tree

10 files changed

+172
-20
lines changed

10 files changed

+172
-20
lines changed

Diff for: screen/loans/src/main/java/com/ivy/loans/loan/LoanScreenEvent.kt

+2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ sealed interface LoanScreenEvent {
1111
data class OnReOrderModalShow(val show: Boolean) : LoanScreenEvent
1212
data object OnAddLoan : LoanScreenEvent
1313
data object OnLoanModalDismiss : LoanScreenEvent
14+
data object OnChangeDate : LoanScreenEvent
15+
data object OnChangeTime : LoanScreenEvent
1416

1517
/** Toggles paid off loans visibility */
1618
data object OnTogglePaidOffLoanVisibility : LoanScreenEvent

Diff for: screen/loans/src/main/java/com/ivy/loans/loan/LoanScreenState.kt

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.ivy.legacy.datamodel.Account
44
import com.ivy.loans.loan.data.DisplayLoan
55
import com.ivy.wallet.ui.theme.modal.LoanModalData
66
import kotlinx.collections.immutable.ImmutableList
7+
import java.time.Instant
78

89
data class LoanScreenState(
910
val baseCurrency: String,
@@ -15,4 +16,5 @@ data class LoanScreenState(
1516
val totalOweAmount: String,
1617
val totalOwedAmount: String,
1718
val paidOffLoanVisibility: Boolean,
19+
val dateTime: Instant
1820
)

Diff for: screen/loans/src/main/java/com/ivy/loans/loan/LoanViewModel.kt

+61-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import androidx.compose.runtime.mutableStateOf
77
import androidx.lifecycle.viewModelScope
88
import com.ivy.base.legacy.SharedPrefs
99
import com.ivy.base.model.processByType
10+
import com.ivy.base.time.TimeConverter
11+
import com.ivy.base.time.TimeProvider
1012
import com.ivy.data.db.dao.read.LoanRecordDao
1113
import com.ivy.data.db.dao.read.SettingsDao
1214
import com.ivy.data.db.dao.write.WriteLoanDao
@@ -20,6 +22,7 @@ import com.ivy.legacy.utils.getDefaultFIATCurrency
2022
import com.ivy.legacy.utils.ioThread
2123
import com.ivy.loans.loan.data.DisplayLoan
2224
import com.ivy.ui.ComposeViewModel
25+
import com.ivy.ui.time.impl.DateTimePicker
2326
import com.ivy.wallet.domain.action.account.AccountsAct
2427
import com.ivy.wallet.domain.action.loan.LoansAct
2528
import com.ivy.wallet.domain.deprecated.logic.LoanCreator
@@ -33,6 +36,8 @@ import kotlinx.collections.immutable.persistentListOf
3336
import kotlinx.collections.immutable.toImmutableList
3437
import kotlinx.coroutines.Dispatchers
3538
import kotlinx.coroutines.launch
39+
import java.time.Instant
40+
import java.time.LocalDateTime
3641
import java.util.UUID
3742
import javax.inject.Inject
3843

@@ -48,6 +53,9 @@ class LoanViewModel @Inject constructor(
4853
private val loansAct: LoansAct,
4954
private val accountsAct: AccountsAct,
5055
private val loanWriter: WriteLoanDao,
56+
private val timeConverter: TimeConverter,
57+
private val timeProvider: TimeProvider,
58+
private val dateTimePicker: DateTimePicker,
5159
) : ComposeViewModel<LoanScreenState, LoanScreenEvent>() {
5260

5361
private val baseCurrencyCode = mutableStateOf(getDefaultFIATCurrency().currencyCode)
@@ -56,6 +64,7 @@ class LoanViewModel @Inject constructor(
5664
private val selectedAccount = mutableStateOf<Account?>(null)
5765
private val loanModalData = mutableStateOf<LoanModalData?>(null)
5866
private val reorderModalVisible = mutableStateOf(false)
67+
private var dateTime = mutableStateOf<Instant>(timeProvider.utcNow())
5968

6069
/** If true paid off loans will be visible */
6170
private val paidOffLoanVisibility = mutableStateOf(true)
@@ -81,7 +90,8 @@ class LoanViewModel @Inject constructor(
8190
reorderModalVisible = getReorderModalVisible(),
8291
totalOweAmount = getTotalOweAmount(totalOweAmount, defaultCurrencyCode),
8392
totalOwedAmount = getTotalOwedAmount(totalOwedAmount, defaultCurrencyCode),
84-
paidOffLoanVisibility = getPaidOffLoanVisibility()
93+
paidOffLoanVisibility = getPaidOffLoanVisibility(),
94+
dateTime = dateTime.value
8595
)
8696
}
8797

@@ -126,6 +136,7 @@ class LoanViewModel @Inject constructor(
126136

127137
is LoanScreenEvent.OnLoanModalDismiss -> {
128138
loanModalData.value = null
139+
dateTime.value = timeProvider.utcNow()
129140
}
130141

131142
is LoanScreenEvent.OnReOrderModalShow -> {
@@ -143,13 +154,22 @@ class LoanViewModel @Inject constructor(
143154
LoanScreenEvent.OnTogglePaidOffLoanVisibility -> {
144155
updatePaidOffLoanVisibility()
145156
}
157+
158+
is LoanScreenEvent.OnChangeDate -> {
159+
handleChangeDate()
160+
}
161+
is LoanScreenEvent.OnChangeTime -> {
162+
handleChangeTime()
163+
}
146164
}
147165
}
148166

149167
private fun start() {
150168
viewModelScope.launch(Dispatchers.Default) {
151169
TestIdlingResource.increment()
152170

171+
dateTime.value = timeProvider.utcNow()
172+
153173
defaultCurrencyCode = ioThread {
154174
settingsDao.findFirst().currency
155175
}.also {
@@ -226,6 +246,46 @@ class LoanViewModel @Inject constructor(
226246
}
227247
}
228248

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+
229289
private fun createLoan(data: CreateLoanData) {
230290
viewModelScope.launch {
231291
TestIdlingResource.increment()

Diff for: screen/loans/src/main/java/com/ivy/loans/loan/LoansScreen.kt

+10-1
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ import com.ivy.wallet.ui.theme.modal.LoanModal
6262
import com.ivy.wallet.ui.theme.modal.LoanModalData
6363
import com.ivy.wallet.ui.theme.toComposeColor
6464
import kotlinx.collections.immutable.persistentListOf
65+
import java.time.Instant
6566
import java.time.LocalDateTime
6667

6768
@Composable
@@ -176,6 +177,13 @@ private fun BoxWithConstraintsScope.UI(
176177
dismiss = {
177178
onEventHandler.invoke(LoanScreenEvent.OnLoanModalDismiss)
178179
},
180+
dateTime = state.dateTime,
181+
onSetDate = {
182+
onEventHandler.invoke(LoanScreenEvent.OnChangeDate)
183+
},
184+
onSetTime = {
185+
onEventHandler.invoke(LoanScreenEvent.OnChangeTime)
186+
}
179187
)
180188
}
181189

@@ -460,7 +468,8 @@ private fun Preview(theme: Theme = Theme.LIGHT) {
460468
),
461469
reorderModalVisible = false,
462470
selectedAccount = null,
463-
paidOffLoanVisibility = true
471+
paidOffLoanVisibility = true,
472+
dateTime = Instant.now()
464473
)
465474
IvyWalletPreview(theme) {
466475
UI(

Diff for: screen/loans/src/main/java/com/ivy/loans/loandetails/LoanDetailsScreen.kt

+16-4
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ import com.ivy.wallet.ui.theme.modal.LoanRecordModal
8585
import com.ivy.wallet.ui.theme.modal.ProgressModal
8686
import com.ivy.wallet.ui.theme.toComposeColor
8787
import kotlinx.collections.immutable.persistentListOf
88+
import java.time.Instant
8889
import java.time.LocalDateTime
8990
import java.time.ZoneOffset
9091
import java.util.UUID
@@ -200,7 +201,8 @@ private fun BoxWithConstraintsScope.UI(
200201
}
201202
}
202203

203-
LoanModal(modal = state.loanModalData, onCreateLoan = {
204+
LoanModal(
205+
modal = state.loanModalData, onCreateLoan = {
204206
// do nothing
205207
}, onEditLoan = { loan, createLoanTransaction ->
206208
onEventHandler.invoke(LoanModalEvent.OnEditLoanModal(loan, createLoanTransaction))
@@ -210,7 +212,14 @@ private fun BoxWithConstraintsScope.UI(
210212
onEventHandler.invoke(LoanDetailsScreenEvent.OnCreateAccount(createAccountData))
211213
}, accounts = state.accounts, onPerformCalculations = {
212214
onEventHandler.invoke(LoanModalEvent.PerformCalculation)
213-
})
215+
}, dateTime = state.dateTime,
216+
onSetDate = {
217+
onEventHandler.invoke(LoanModalEvent.OnChangeDate)
218+
},
219+
onSetTime = {
220+
onEventHandler.invoke(LoanModalEvent.OnChangeTime)
221+
},
222+
)
214223

215224
LoanRecordModal(
216225
modal = state.loanRecordModalData, onCreate = {
@@ -224,6 +233,7 @@ private fun BoxWithConstraintsScope.UI(
224233
}, onCreateAccount = { createAccountData ->
225234
onEventHandler.invoke(LoanDetailsScreenEvent.OnCreateAccount(createAccountData))
226235
},
236+
dateTime = state.dateTime,
227237
onSetDate = {
228238
onEventHandler.invoke(LoanRecordModalEvent.OnChangeDate)
229239
},
@@ -903,7 +913,8 @@ private fun Preview_Empty() {
903913
isDeleteModalVisible = false,
904914
loanModalData = null,
905915
loanRecordModalData = null,
906-
waitModalVisible = false
916+
waitModalVisible = false,
917+
dateTime = Instant.now()
907918
)
908919
) {}
909920
}
@@ -963,7 +974,8 @@ private fun Preview_Records(theme: Theme = Theme.LIGHT) {
963974
isDeleteModalVisible = false,
964975
loanModalData = null,
965976
loanRecordModalData = null,
966-
waitModalVisible = false
977+
waitModalVisible = false,
978+
dateTime = Instant.now()
967979
)
968980
) {}
969981
}

Diff for: screen/loans/src/main/java/com/ivy/loans/loandetails/LoanDetailsScreenState.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import com.ivy.loans.loan.data.DisplayLoanRecord
66
import com.ivy.wallet.ui.theme.modal.LoanModalData
77
import com.ivy.wallet.ui.theme.modal.LoanRecordModalData
88
import kotlinx.collections.immutable.ImmutableList
9+
import java.time.Instant
910

1011
data class LoanDetailsScreenState(
1112
val baseCurrency: String,
@@ -20,5 +21,6 @@ data class LoanDetailsScreenState(
2021
val loanModalData: LoanModalData?,
2122
val loanRecordModalData: LoanRecordModalData?,
2223
val waitModalVisible: Boolean,
23-
val isDeleteModalVisible: Boolean
24+
val isDeleteModalVisible: Boolean,
25+
val dateTime: Instant
2426
)

Diff for: screen/loans/src/main/java/com/ivy/loans/loandetails/LoanDetailsViewModel.kt

+58-1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ import kotlinx.collections.immutable.ImmutableList
4747
import kotlinx.collections.immutable.persistentListOf
4848
import kotlinx.collections.immutable.toImmutableList
4949
import kotlinx.coroutines.launch
50+
import java.time.Instant
5051
import java.time.LocalDateTime
5152
import java.util.UUID
5253
import javax.inject.Inject
@@ -86,6 +87,7 @@ class LoanDetailsViewModel @Inject constructor(
8687
private val loanRecordModalData = mutableStateOf<LoanRecordModalData?>(null)
8788
private val waitModalVisible = mutableStateOf(false)
8889
private val isDeleteModalVisible = mutableStateOf(false)
90+
private var dateTime = mutableStateOf<Instant>(timeProvider.utcNow())
8991
lateinit var screen: LoanDetailsScreen
9092

9193
@Composable
@@ -107,7 +109,8 @@ class LoanDetailsViewModel @Inject constructor(
107109
loanModalData = loanModalData.value,
108110
loanRecordModalData = loanRecordModalData.value,
109111
waitModalVisible = waitModalVisible.value,
110-
isDeleteModalVisible = isDeleteModalVisible.value
112+
isDeleteModalVisible = isDeleteModalVisible.value,
113+
dateTime = dateTime.value
111114
)
112115
}
113116

@@ -143,6 +146,7 @@ class LoanDetailsViewModel @Inject constructor(
143146

144147
LoanRecordModalEvent.OnDismissLoanRecord -> {
145148
loanRecordModalData.value = null
149+
dateTime.value = timeProvider.utcNow()
146150
}
147151

148152
is LoanRecordModalEvent.OnEditLoanRecord -> {
@@ -163,6 +167,7 @@ class LoanDetailsViewModel @Inject constructor(
163167
when (event) {
164168
LoanModalEvent.OnDismissLoanModal -> {
165169
loanModalData.value = null
170+
dateTime.value = timeProvider.utcNow()
166171
}
167172

168173
is LoanModalEvent.OnEditLoanModal -> {
@@ -173,6 +178,14 @@ class LoanDetailsViewModel @Inject constructor(
173178
waitModalVisible.value = true
174179
}
175180

181+
LoanModalEvent.OnChangeDate -> {
182+
handleLoanChangeDate()
183+
}
184+
185+
LoanModalEvent.OnChangeTime -> {
186+
handleLoanChangeTime()
187+
}
188+
176189
else -> {}
177190
}
178191
}
@@ -239,6 +252,8 @@ class LoanDetailsViewModel @Inject constructor(
239252
viewModelScope.launch {
240253
TestIdlingResource.increment()
241254

255+
dateTime.value = timeProvider.utcNow()
256+
242257
defaultCurrencyCode = ioThread {
243258
settingsDao.findFirst().currency
244259
}.also {
@@ -499,6 +514,48 @@ class LoanDetailsViewModel @Inject constructor(
499514
dateTime = newDateTimeUtc
500515
)
501516
)
517+
dateTime.value = newDateTimeUtc
518+
}
519+
}
520+
521+
private fun handleLoanChangeDate() {
522+
dateTimePicker.pickDate(
523+
initialDate = loanModalData.value?.loan?.dateTime?.let {
524+
with(timeConverter) { it.toUTC() }
525+
} ?: timeProvider.utcNow()
526+
) { localDate ->
527+
528+
val localTime = loanModalData.value?.loan?.dateTime?.let {
529+
with(timeConverter) { it.toLocalTime() }
530+
} ?: timeProvider.localTimeNow()
531+
532+
updateLoanDateTime(localDate.atTime(localTime))
533+
}
534+
}
535+
536+
private fun handleLoanChangeTime() {
537+
dateTimePicker.pickTime(
538+
initialTime = loanModalData.value?.loan?.dateTime?.let {
539+
with(timeConverter) { it.toLocalTime() }
540+
} ?: timeProvider.localTimeNow()
541+
) { localTime ->
542+
val localDate = loanModalData.value?.loan?.dateTime?.let {
543+
with(timeConverter) { it.toLocalDate() }
544+
} ?: timeProvider.localDateNow()
545+
546+
updateLoanDateTime(localDate.atTime(localTime))
547+
}
548+
}
549+
550+
private fun updateLoanDateTime(newDateTime: LocalDateTime) {
551+
val newDateTimeUtc = with(timeConverter) { newDateTime.toUTC() }
552+
loanModalData.value?.let { currentData ->
553+
loanModalData.value = currentData.copy(
554+
loan = currentData.loan?.copy(
555+
dateTime = newDateTime
556+
)
557+
)
558+
dateTime.value = newDateTimeUtc
502559
}
503560
}
504561

Diff for: screen/loans/src/main/java/com/ivy/loans/loandetails/events/LoanModalEvent.kt

+2
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,6 @@ sealed interface LoanModalEvent : LoanDetailsScreenEvent {
88
LoanModalEvent
99

1010
data object PerformCalculation : LoanModalEvent
11+
data object OnChangeDate : LoanModalEvent
12+
data object OnChangeTime : LoanModalEvent
1113
}

0 commit comments

Comments
 (0)