Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ import com.mifos.feature.loan.navigation.addLoanAccountScreen
import com.mifos.feature.loan.navigation.groupLoanScreen
import com.mifos.feature.loan.navigation.loanNavGraph
import com.mifos.feature.loan.navigation.navigateToGroupLoanScreen
import com.mifos.feature.loan.navigation.navigateToLoanAccountScreen
import com.mifos.feature.loan.navigation.navigateToLoanAccountSummaryScreen
import com.mifos.feature.note.navigation.navigateToNoteScreen
import com.mifos.feature.note.navigation.noteNavGraph
Expand Down Expand Up @@ -171,7 +172,7 @@ internal fun FeatureNavHost(
clientNavGraph(
navController = appState.navController,
paddingValues = padding,
addLoanAccount = appState.navController::navigateToLoanAccountSummaryScreen,
addLoanAccount = appState.navController::navigateToLoanAccountScreen,
addSavingsAccount = { clientId ->
appState.navController.navigateToAddSavingsAccount(0, clientId, false)
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,5 @@ interface ClientDetailsRepository {

suspend fun getClient(clientId: Int): ClientEntity

suspend fun getImage(clientId: Int): Flow<DataState<String>>
fun getImage(clientId: Int): Flow<DataState<String>>
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ class ClientDetailsRepositoryImp(
return dataManagerClient.getClient(clientId)
}

override suspend fun getImage(clientId: Int): Flow<DataState<String>> {
override fun getImage(clientId: Int): Flow<DataState<String>> {
return dataManagerClient.getClientImage(clientId)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,13 @@ class UploadClientImageUseCase(
) {

operator fun invoke(id: Int, image: MultiPartFormDataContent): Flow<DataState<String>> = flow {
emit(DataState.Loading)

try {
emit(DataState.Loading)
repository.uploadClientImage(id, image)
DataState.Success(getString(Res.string.core_domain_client_image_uploaded_successfully))
emit(DataState.Success(getString(Res.string.core_domain_client_image_uploaded_successfully)))
} catch (e: Exception) {
DataState.Error(e)
emit(DataState.Error(e))
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ class DataManagerClient(
return mBaseApiManager.clientsApi.uploadClientImage(clientId, file)
}

suspend fun getClientImage(clientId: Int): Flow<DataState<String>> {
fun getClientImage(clientId: Int): Flow<DataState<String>> {
return mBaseApiManager.clientsApi.getClientImage(clientId)
.asDataStateFlow()
.map {
Expand Down
1 change: 1 addition & 0 deletions feature/center/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ kotlin{
implementation(projects.core.domain)
implementation(compose.material3)
implementation(compose.components.resources)
implementation(compose.components.uiToolingPreview)
implementation(compose.ui)
implementation(libs.androidx.paging.common)
implementation(libs.coil.kt.compose)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,16 +66,19 @@ import com.mifos.core.designsystem.component.MifosScaffold
import com.mifos.core.designsystem.component.MifosSweetError
import com.mifos.core.designsystem.component.MifosTextFieldDropdown
import com.mifos.core.ui.components.MifosAlertDialog
import com.mifos.core.ui.util.DevicePreview
import com.mifos.room.entities.center.CenterPayloadEntity
import com.mifos.room.entities.organisation.OfficeEntity
import kotlinx.datetime.Clock
import org.jetbrains.compose.resources.getString
import org.jetbrains.compose.resources.stringResource
import org.jetbrains.compose.ui.tooling.preview.Preview
import org.jetbrains.compose.ui.tooling.preview.PreviewParameter
import org.jetbrains.compose.ui.tooling.preview.PreviewParameterProvider
import org.koin.compose.viewmodel.koinViewModel

@Composable
internal fun CreateNewCenterScreen(
onBackPressed: () -> Unit,
onCreateSuccess: () -> Unit,
viewModel: CreateNewCenterViewModel = koinViewModel(),
) {
Expand All @@ -94,6 +97,7 @@ internal fun CreateNewCenterScreen(
viewModel.createNewCenter(it)
},
onCreateSuccess = onCreateSuccess,
onBackPressed = onBackPressed,
)
}

Expand All @@ -103,13 +107,14 @@ internal fun CreateNewCenterScreen(
onRetry: () -> Unit,
createCenter: (CenterPayloadEntity) -> Unit,
onCreateSuccess: () -> Unit,
onBackPressed: () -> Unit,
) {
val snackbarHostState = remember { SnackbarHostState() }

MifosScaffold(
title = stringResource(Res.string.feature_center_create_new_center),
snackbarHostState = snackbarHostState,
onBackPressed = {},
onBackPressed = onBackPressed,
) { paddingValues ->
Column(modifier = Modifier.padding(paddingValues)) {
when (state) {
Expand Down Expand Up @@ -306,46 +311,30 @@ private fun CreateNewCenterContent(
}
}

@DevicePreview
@Composable
private fun CreateNewCenterLoadingPreview() {
CreateNewCenterScreen(
state = CreateNewCenterUiState.Loading,
onRetry = {},
createCenter = {},
onCreateSuccess = {},
)
}
class CreateNewCenterUiStateProvider : PreviewParameterProvider<CreateNewCenterUiState> {

@DevicePreview
@Composable
private fun CreateNewCenterErrorPreview() {
CreateNewCenterScreen(
state = CreateNewCenterUiState.Error(Res.string.feature_center_failed_to_load_offices),
onRetry = {},
createCenter = {},
onCreateSuccess = {},
override val values = sequenceOf(
CreateNewCenterUiState.Loading,
CreateNewCenterUiState.Error(Res.string.feature_center_failed_to_load_offices),
CreateNewCenterUiState.Offices(sampleOfficeList),
CreateNewCenterUiState.CenterCreatedSuccessfully,
)
}

@DevicePreview
@Preview
@Composable
private fun CreateNewCenterOfficesPreview() {
private fun CreateNewCenterPreview(
@PreviewParameter(CreateNewCenterUiStateProvider::class) state: CreateNewCenterUiState,
) {
CreateNewCenterScreen(
state = CreateNewCenterUiState.Offices(emptyList()),
state = state,
onRetry = {},
createCenter = {},
onCreateSuccess = {},
onBackPressed = {},
)
}

@DevicePreview
@Composable
private fun CreateNewCenterCenterCreatedSuccessfullyPreview() {
CreateNewCenterScreen(
state = CreateNewCenterUiState.CenterCreatedSuccessfully,
onRetry = {},
createCenter = {},
onCreateSuccess = {},
)
val sampleOfficeList = List(10) {
OfficeEntity(id = it)
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ fun NavGraphBuilder.centerNavGraph(
loadClientsOfGroup = { },
)
createCenterScreenRoute(
onBackPressed = navController::popBackStack,
onCreateSuccess = navController::popBackStack,
)
}
Expand Down Expand Up @@ -105,13 +106,15 @@ fun NavGraphBuilder.centerGroupListScreenRoute(
}

fun NavGraphBuilder.createCenterScreenRoute(
onBackPressed: () -> Unit,
onCreateSuccess: () -> Unit,
) {
composable(
route = CenterScreens.CreateCenterScreen.route,
) {
CreateNewCenterScreen(
onCreateSuccess = onCreateSuccess,
onBackPressed = onBackPressed,
)
}
}
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,12 @@
*
* See https://github.com/openMF/android-client/blob/master/LICENSE.md
*/
package com.mifos.feature.client.clientDetails
package com.mifos.feature.client.utils

import androidx.compose.runtime.Composable
import com.mifos.feature.client.utils.PlatformCameraLauncher
import android.telephony.PhoneNumberUtils

@Composable
actual fun rememberPlatformCameraLauncher(
clientId: Int,
viewModel: ClientDetailsViewModel,
): PlatformCameraLauncher {
TODO("Not yet implemented")
actual object PhoneNumberUtil {
actual fun isGlobalPhoneNumber(phoneNumber: String): Boolean {
return PhoneNumberUtils.isGlobalPhoneNumber(phoneNumber)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,15 @@
*/
package com.mifos.feature.client.utils

import android.Manifest
import androidx.compose.runtime.Composable
import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.PermissionState
import com.google.accompanist.permissions.isGranted
import com.google.accompanist.permissions.rememberPermissionState
import io.github.vinceglb.filekit.PlatformFile
import io.github.vinceglb.filekit.dialogs.compose.PhotoResultLauncher
import io.github.vinceglb.filekit.dialogs.compose.rememberCameraPickerLauncher

@OptIn(ExperimentalPermissionsApi::class)
actual class PlatformCameraLauncher
Expand All @@ -28,3 +33,20 @@ internal constructor(
}
}
}

@OptIn(ExperimentalPermissionsApi::class)
@Composable
actual fun rememberPlatformCameraLauncher(
onImageCapturedPath: (PlatformFile?) -> Unit,
): PlatformCameraLauncher {
val permissionState = rememberPermissionState(Manifest.permission.CAMERA)

val launcher = rememberCameraPickerLauncher { file ->
onImageCapturedPath(file)
}

return PlatformCameraLauncher(
permissionState = permissionState,
launcher = launcher,
)
}
Loading