mirror of
https://github.com/openMF/mifos-mobile.git
synced 2026-02-06 11:26:51 +00:00
Merge ff2452954b into 1600b41ad2
This commit is contained in:
commit
9da76b05d0
@ -29,6 +29,8 @@ import org.mifos.mobile.core.ui.utils.BaseViewModel
|
|||||||
import org.mifos.mobile.feature.loan.application.component.DocumentType
|
import org.mifos.mobile.feature.loan.application.component.DocumentType
|
||||||
import org.mifos.mobile.feature.loan.application.component.SignatureUploadType
|
import org.mifos.mobile.feature.loan.application.component.SignatureUploadType
|
||||||
import kotlin.io.encoding.ExperimentalEncodingApi
|
import kotlin.io.encoding.ExperimentalEncodingApi
|
||||||
|
import kotlin.time.Clock
|
||||||
|
import kotlin.time.ExperimentalTime
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* `ViewModel` for the Upload Documents screen.
|
* `ViewModel` for the Upload Documents screen.
|
||||||
@ -88,10 +90,9 @@ internal class UploadDocsViewModel :
|
|||||||
mutableStateFlow.update {
|
mutableStateFlow.update {
|
||||||
it.copy(
|
it.copy(
|
||||||
dialogState = null,
|
dialogState = null,
|
||||||
signatureDocumentFile = action.image,
|
signatureDocumentFile = action.imageArray.toBase64DataUri(),
|
||||||
// TODO:: Generate Unique Name & Calculate Size
|
signatureFileName = generateUniqueFileName("signature", "png"),
|
||||||
signatureFileName = "signature.png",
|
signatureSize = formatFileSize(action.imageArray.size.toLong()),
|
||||||
signatureSize = "100 KB",
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -172,19 +173,11 @@ internal class UploadDocsViewModel :
|
|||||||
try {
|
try {
|
||||||
val image = FileKit.openFilePicker(type = FileKitType.Image)
|
val image = FileKit.openFilePicker(type = FileKitType.Image)
|
||||||
image?.let { file ->
|
image?.let { file ->
|
||||||
val sizeInKB = file.size() / 1024
|
|
||||||
val sizeInMb = sizeInKB / 1024
|
|
||||||
val showFileSize = if (sizeInMb >= 1) {
|
|
||||||
"$sizeInMb MB"
|
|
||||||
} else {
|
|
||||||
"$sizeInKB KB"
|
|
||||||
}
|
|
||||||
|
|
||||||
mutableStateFlow.update {
|
mutableStateFlow.update {
|
||||||
it.copy(
|
it.copy(
|
||||||
propertyDocumentsFile = file.readBytes().toBase64DataUri(),
|
propertyDocumentsFile = file.readBytes().toBase64DataUri(),
|
||||||
propertyDocumentFileName = file.name,
|
propertyDocumentFileName = file.name,
|
||||||
propertyDocumentsSize = showFileSize,
|
propertyDocumentsSize = formatFileSize(file.size()),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -204,19 +197,11 @@ internal class UploadDocsViewModel :
|
|||||||
try {
|
try {
|
||||||
val image = FileKit.openFilePicker(type = FileKitType.Image)
|
val image = FileKit.openFilePicker(type = FileKitType.Image)
|
||||||
image?.let { file ->
|
image?.let { file ->
|
||||||
val sizeInKB = file.size() / 1024
|
|
||||||
val sizeInMb = sizeInKB / 1024
|
|
||||||
val showFileSize = if (sizeInMb >= 1) {
|
|
||||||
"$sizeInMb MB"
|
|
||||||
} else {
|
|
||||||
"$sizeInKB KB"
|
|
||||||
}
|
|
||||||
|
|
||||||
mutableStateFlow.update {
|
mutableStateFlow.update {
|
||||||
it.copy(
|
it.copy(
|
||||||
bankStatementFile = file.readBytes().toBase64DataUri(),
|
bankStatementFile = file.readBytes().toBase64DataUri(),
|
||||||
bankStatementFileName = file.name,
|
bankStatementFileName = file.name,
|
||||||
bankStatementSize = showFileSize,
|
bankStatementSize = formatFileSize(file.size()),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -252,20 +237,12 @@ internal class UploadDocsViewModel :
|
|||||||
val image = FileKit.openFilePicker(type = FileKitType.Image)
|
val image = FileKit.openFilePicker(type = FileKitType.Image)
|
||||||
|
|
||||||
image?.let { file ->
|
image?.let { file ->
|
||||||
val sizeInKB = file.size() / 1024
|
|
||||||
val sizeInMb = sizeInKB / 1024
|
|
||||||
val showFileSize = if (sizeInMb >= 1) {
|
|
||||||
"$sizeInMb MB"
|
|
||||||
} else {
|
|
||||||
"$sizeInKB KB"
|
|
||||||
}
|
|
||||||
|
|
||||||
mutableStateFlow.update {
|
mutableStateFlow.update {
|
||||||
it.copy(
|
it.copy(
|
||||||
dialogState = null,
|
dialogState = null,
|
||||||
signatureDocumentFile = file.readBytes().toBase64DataUri(),
|
signatureDocumentFile = file.readBytes().toBase64DataUri(),
|
||||||
signatureFileName = file.name,
|
signatureFileName = file.name,
|
||||||
signatureSize = showFileSize,
|
signatureSize = formatFileSize(file.size()),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -342,6 +319,34 @@ internal class UploadDocsViewModel :
|
|||||||
private fun handleUploadDocumentResult(action: UploadDocsAction.Internal.UploadDocumentResultReceived) {
|
private fun handleUploadDocumentResult(action: UploadDocsAction.Internal.UploadDocumentResultReceived) {
|
||||||
// TODO: Implement logic to handle the upload result, e.g., show a toast or update state.
|
// TODO: Implement logic to handle the upload result, e.g., show a toast or update state.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculates and formats the file size from bytes to a human-readable string.
|
||||||
|
*
|
||||||
|
* @param bytes The size in bytes.
|
||||||
|
* @return A formatted string showing size in MB or KB.
|
||||||
|
*/
|
||||||
|
private fun formatFileSize(bytes: Long): String {
|
||||||
|
val sizeInKB = bytes / 1024
|
||||||
|
val sizeInMb = sizeInKB / 1024
|
||||||
|
return if (sizeInMb >= 1) {
|
||||||
|
"$sizeInMb MB"
|
||||||
|
} else {
|
||||||
|
"$sizeInKB KB"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates a unique filename with a timestamp.
|
||||||
|
*
|
||||||
|
* @param prefix The prefix for the filename .
|
||||||
|
* @param extension The file extension without the dot.
|
||||||
|
* @return A unique filename in the format "prefix_timestamp.extension".
|
||||||
|
*/
|
||||||
|
@OptIn(ExperimentalTime::class)
|
||||||
|
private fun generateUniqueFileName(prefix: String, extension: String): String {
|
||||||
|
return "${prefix}_${Clock.System.now().toEpochMilliseconds()}.$extension"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -441,9 +446,9 @@ internal sealed interface UploadDocsAction {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* User action to upload a signed image.
|
* User action to upload a signed image.
|
||||||
* @property image The base64-encoded string of the signature image.
|
* `@property` imageArray Raw bytes of the signature image.
|
||||||
*/
|
*/
|
||||||
data class UploadSign(val image: String) : UploadDocsAction
|
data class UploadSign(val imageArray: ByteArray) : UploadDocsAction
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User action to initiate the upload of a document.
|
* User action to initiate the upload of a document.
|
||||||
|
|||||||
@ -59,7 +59,6 @@ import mifos_mobile.feature.loan_application.generated.resources.sign
|
|||||||
import mifos_mobile.feature.loan_application.generated.resources.sign_here
|
import mifos_mobile.feature.loan_application.generated.resources.sign_here
|
||||||
import org.jetbrains.compose.resources.StringResource
|
import org.jetbrains.compose.resources.StringResource
|
||||||
import org.jetbrains.compose.resources.stringResource
|
import org.jetbrains.compose.resources.stringResource
|
||||||
import org.mifos.mobile.core.common.toBase64DataUri
|
|
||||||
import org.mifos.mobile.core.designsystem.component.CardVariant
|
import org.mifos.mobile.core.designsystem.component.CardVariant
|
||||||
import org.mifos.mobile.core.designsystem.component.MifosButton
|
import org.mifos.mobile.core.designsystem.component.MifosButton
|
||||||
import org.mifos.mobile.core.designsystem.component.MifosCustomCard
|
import org.mifos.mobile.core.designsystem.component.MifosCustomCard
|
||||||
@ -291,7 +290,7 @@ private fun SignatureContent(
|
|||||||
backgroundColor = Color.White,
|
backgroundColor = Color.White,
|
||||||
)
|
)
|
||||||
if (data != null) {
|
if (data != null) {
|
||||||
val data = data.encodeToByteArray().toBase64DataUri()
|
val data = data.encodeToByteArray()
|
||||||
onAction(UploadDocsAction.UploadSign(data))
|
onAction(UploadDocsAction.UploadSign(data))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user