Skip to content

Commit 06958a3

Browse files
committed
update
1 parent 8db915a commit 06958a3

12 files changed

Lines changed: 299 additions & 157 deletions

File tree

core/domain/src/commonMain/kotlin/com/mifos/core/domain/di/UseCaseModule.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import com.mifos.core.domain.useCases.ActivateGroupUseCase
1515
import com.mifos.core.domain.useCases.ActivateSavingsUseCase
1616
import com.mifos.core.domain.useCases.AddClientPinpointLocationUseCase
1717
import com.mifos.core.domain.useCases.AddDataTableEntryUseCase
18+
import com.mifos.core.domain.useCases.AddNoteUseCase
1819
import com.mifos.core.domain.useCases.ApproveCheckerUseCase
1920
import com.mifos.core.domain.useCases.ApproveSavingsApplicationUseCase
2021
import com.mifos.core.domain.useCases.CreateChargesUseCase
@@ -28,6 +29,7 @@ import com.mifos.core.domain.useCases.DeleteCheckerUseCase
2829
import com.mifos.core.domain.useCases.DeleteClientAddressPinpointUseCase
2930
import com.mifos.core.domain.useCases.DeleteDataTableEntryUseCase
3031
import com.mifos.core.domain.useCases.DeleteIdentifierUseCase
32+
import com.mifos.core.domain.useCases.DeleteNoteUseCase
3133
import com.mifos.core.domain.useCases.DownloadDocumentUseCase
3234
import com.mifos.core.domain.useCases.FetchCenterDetailsUseCase
3335
import com.mifos.core.domain.useCases.FetchCollectionSheetUseCase
@@ -75,6 +77,7 @@ import com.mifos.core.domain.useCases.ServerConfigValidatorUseCase
7577
import com.mifos.core.domain.useCases.SubmitCollectionSheetUseCase
7678
import com.mifos.core.domain.useCases.SubmitProductiveSheetUseCase
7779
import com.mifos.core.domain.useCases.UpdateClientPinpointUseCase
80+
import com.mifos.core.domain.useCases.UpdateNoteUseCase
7881
import com.mifos.core.domain.useCases.UploadClientImageUseCase
7982
import com.mifos.core.domain.useCases.UsernameValidationUseCase
8083
import com.mifos.core.domain.useCases.ValidateServerApiPathUseCase
@@ -159,4 +162,7 @@ val UseCaseModule = module {
159162
factoryOf(::GetGroupDetailsUseCase)
160163
factoryOf(::GetLoanAndLoanRepaymentUseCase)
161164
factoryOf(::GetSavingsAccountAndTemplateUseCase)
165+
factoryOf(::AddNoteUseCase)
166+
factoryOf(::UpdateNoteUseCase)
167+
factoryOf(::DeleteNoteUseCase)
162168
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*
2+
* Copyright 2025 Mifos Initiative
3+
*
4+
* This Source Code Form is subject to the terms of the Mozilla Public
5+
* License, v. 2.0. If a copy of the MPL was not distributed with this
6+
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
7+
*
8+
* See https://github.com/openMF/android-client/blob/master/LICENSE.md
9+
*/
10+
package com.mifos.core.domain.useCases
11+
12+
import com.mifos.core.common.utils.DataState
13+
import com.mifos.core.common.utils.asDataStateFlow
14+
import com.mifos.core.data.repository.NoteRepository
15+
import com.mifos.core.model.objects.payloads.NotesPayload
16+
import com.mifos.core.network.GenericResponse
17+
import kotlinx.coroutines.flow.Flow
18+
import kotlinx.coroutines.flow.flow
19+
20+
class AddNoteUseCase(
21+
val repository: NoteRepository,
22+
) {
23+
operator fun invoke(
24+
resourceType: String,
25+
resourceId: Long,
26+
notesPayload: NotesPayload,
27+
): Flow<DataState<GenericResponse>> = flow {
28+
emit(repository.addNewNote(resourceType, resourceId, notesPayload))
29+
}.asDataStateFlow()
30+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/*
2+
* Copyright 2025 Mifos Initiative
3+
*
4+
* This Source Code Form is subject to the terms of the Mozilla Public
5+
* License, v. 2.0. If a copy of the MPL was not distributed with this
6+
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
7+
*
8+
* See https://github.com/openMF/android-client/blob/master/LICENSE.md
9+
*/
10+
package com.mifos.core.domain.useCases
11+
12+
import com.mifos.core.common.utils.DataState
13+
import com.mifos.core.common.utils.asDataStateFlow
14+
import com.mifos.core.data.repository.NoteRepository
15+
import com.mifos.core.network.GenericResponse
16+
import kotlinx.coroutines.flow.Flow
17+
import kotlinx.coroutines.flow.flow
18+
19+
class DeleteNoteUseCase(
20+
val repository: NoteRepository,
21+
) {
22+
operator fun invoke(
23+
resourceType: String,
24+
resourceId: Long,
25+
noteId: Long,
26+
): Flow<DataState<GenericResponse>> = flow {
27+
emit(repository.deleteNote(resourceType, resourceId, noteId))
28+
}.asDataStateFlow()
29+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
* Copyright 2025 Mifos Initiative
3+
*
4+
* This Source Code Form is subject to the terms of the Mozilla Public
5+
* License, v. 2.0. If a copy of the MPL was not distributed with this
6+
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
7+
*
8+
* See https://github.com/openMF/android-client/blob/master/LICENSE.md
9+
*/
10+
package com.mifos.core.domain.useCases
11+
12+
import com.mifos.core.common.utils.DataState
13+
import com.mifos.core.common.utils.asDataStateFlow
14+
import com.mifos.core.data.repository.NoteRepository
15+
import com.mifos.core.model.objects.payloads.NotesPayload
16+
import com.mifos.core.network.GenericResponse
17+
import kotlinx.coroutines.flow.Flow
18+
import kotlinx.coroutines.flow.flow
19+
20+
class UpdateNoteUseCase(
21+
val repository: NoteRepository,
22+
) {
23+
operator fun invoke(
24+
resourceType: String,
25+
resourceId: Long,
26+
noteId: Long,
27+
notesPayload: NotesPayload,
28+
): Flow<DataState<GenericResponse>> = flow {
29+
emit(repository.updateNote(resourceType, resourceId, noteId, notesPayload))
30+
}.asDataStateFlow()
31+
}

feature/note/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ kotlin {
2525
implementation(compose.ui)
2626
implementation(projects.core.common)
2727
implementation(projects.core.model)
28+
implementation(projects.core.domain)
2829
implementation(libs.kotlinx.serialization.json)
2930
}
3031
}

feature/note/src/commonMain/kotlin/com/mifos/feature/note/addEditNotes/AddEditNoteRoute.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,13 @@ data class AddEditNoteRoute(
2222
)
2323

2424
fun NavGraphBuilder.addEditNoteRoute(
25-
onBackPressed: (Boolean?) -> Unit,
25+
onBackPressed: () -> Unit,
26+
onNavigateWithUpdatedList: (Int, String?) -> Unit,
2627
) {
2728
composable<AddEditNoteRoute> {
2829
AddEditNoteScreen(
2930
onBackPressed = onBackPressed,
31+
onNavigateWithUpdatedList = onNavigateWithUpdatedList,
3032
)
3133
}
3234
}

feature/note/src/commonMain/kotlin/com/mifos/feature/note/addEditNotes/AddEditNoteScreen.kt

Lines changed: 79 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import androidx.compose.foundation.rememberScrollState
2626
import androidx.compose.foundation.verticalScroll
2727
import androidx.compose.material3.ButtonDefaults
2828
import androidx.compose.material3.MaterialTheme
29-
import androidx.compose.material3.OutlinedTextField
3029
import androidx.compose.material3.OutlinedTextFieldDefaults
3130
import androidx.compose.material3.Text
3231
import androidx.compose.runtime.Composable
@@ -38,6 +37,7 @@ import androidx.compose.ui.unit.dp
3837
import androidx.lifecycle.compose.collectAsStateWithLifecycle
3938
import com.mifos.core.designsystem.component.MifosCircularProgress
4039
import com.mifos.core.designsystem.component.MifosOutlinedButton
40+
import com.mifos.core.designsystem.component.MifosOutlinedTextField
4141
import com.mifos.core.designsystem.component.MifosScaffold
4242
import com.mifos.core.designsystem.theme.DesignToken
4343
import com.mifos.core.designsystem.theme.MifosTypography
@@ -49,14 +49,19 @@ import org.koin.compose.viewmodel.koinViewModel
4949

5050
@Composable
5151
internal fun AddEditNoteScreen(
52-
onBackPressed: (Boolean?) -> Unit,
52+
onBackPressed: () -> Unit,
53+
onNavigateWithUpdatedList: (Int, String?) -> Unit,
5354
viewModel: AddEditNoteViewModel = koinViewModel(),
5455
) {
5556
val state by viewModel.stateFlow.collectAsStateWithLifecycle()
5657

5758
EventsEffect(viewModel.eventFlow) { event ->
5859
when (event) {
59-
AddEditNoteEvent.NavigateBack -> onBackPressed(state.isRequiredUpdateListNote)
60+
AddEditNoteEvent.NavigateBack -> onBackPressed()
61+
AddEditNoteEvent.NavigateBackWithUpdateList -> onNavigateWithUpdatedList(
62+
state.resourceId,
63+
state.resourceType,
64+
)
6065
}
6166
}
6267

@@ -87,9 +92,11 @@ fun AddEditNoteScreenDialog(
8792
},
8893
)
8994
}
95+
9096
AddEditNoteState.DialogState.Loading -> {
9197
MifosCircularProgress()
9298
}
99+
93100
AddEditNoteState.DialogState.MisTouchBack -> {
94101
MifosAlertDialog(
95102
onDismissRequest = {
@@ -104,6 +111,7 @@ fun AddEditNoteScreenDialog(
104111
icon = null,
105112
)
106113
}
114+
107115
null -> Unit
108116
}
109117
}
@@ -140,9 +148,11 @@ private fun AddEditNote(
140148

141149
Column(
142150
modifier = Modifier
143-
.verticalScroll(scrollState)
144151
.fillMaxWidth()
145-
.padding(horizontal = DesignToken.spacing.large),
152+
.padding(
153+
horizontal = DesignToken.spacing.large,
154+
vertical = DesignToken.spacing.small,
155+
),
146156
verticalArrangement = Arrangement.spacedBy(DesignToken.spacing.large),
147157
) {
148158
Text(
@@ -151,70 +161,77 @@ private fun AddEditNote(
151161
color = MaterialTheme.colorScheme.onSurface,
152162
)
153163

154-
OutlinedTextField(
155-
value = state.textFieldNotesPayload.note ?: "",
156-
onValueChange = {
157-
onAction(AddEditNoteAction.TextFieldNotesPayload(state.textFieldNotesPayload.copy(note = it)))
158-
},
159-
singleLine = false,
160-
shape = DesignToken.shapes.large,
161-
label = {
162-
Text(
163-
text = stringResource(state.label),
164-
style = MaterialTheme.typography.bodySmall,
165-
color = MaterialTheme.colorScheme.onSurfaceVariant,
166-
)
167-
},
164+
Column(
168165
modifier = Modifier
169-
.fillMaxWidth()
170-
.heightIn(min = 600.dp),
171-
textStyle = MaterialTheme.typography.bodyLarge.copy(textAlign = TextAlign.Start),
172-
colors = OutlinedTextFieldDefaults.colors(
173-
unfocusedBorderColor = MaterialTheme.colorScheme.secondaryContainer,
174-
),
175-
)
176-
177-
Row(
178-
modifier = Modifier.fillMaxWidth(),
179-
horizontalArrangement = Arrangement.spacedBy(DesignToken.spacing.extraSmall),
166+
.verticalScroll(scrollState),
167+
verticalArrangement = Arrangement.spacedBy(DesignToken.spacing.large),
180168
) {
181-
MifosOutlinedButton(
182-
modifier = Modifier.weight(1f),
183-
text = {
184-
Text(
185-
text = stringResource(Res.string.feature_note_button_back),
169+
MifosOutlinedTextField(
170+
value = state.textFieldNotesPayload.note ?: "",
171+
onValueChange = {
172+
onAction(
173+
AddEditNoteAction.TextFieldNotesPayload(
174+
state.textFieldNotesPayload.copy(
175+
note = it,
176+
),
177+
),
186178
)
187179
},
188-
colors = ButtonDefaults.outlinedButtonColors(
189-
contentColor = MaterialTheme.colorScheme.primary,
190-
containerColor = MaterialTheme.colorScheme.onPrimary,
180+
maxLines = 18,
181+
singleLine = false,
182+
shape = DesignToken.shapes.large,
183+
label = stringResource(state.label),
184+
modifier = Modifier
185+
.fillMaxWidth()
186+
.heightIn(min = 550.dp),
187+
textStyle = MaterialTheme.typography.bodyLarge.copy(textAlign = TextAlign.Start),
188+
colors = OutlinedTextFieldDefaults.colors(
189+
unfocusedBorderColor = MaterialTheme.colorScheme.secondaryContainer,
191190
),
192-
onClick = {
193-
onAction(AddEditNoteAction.MisTouchBackDialog)
194-
},
195191
)
196192

197-
MifosOutlinedButton(
198-
modifier = Modifier.weight(1f),
199-
text = {
200-
Text(text = stringResource(state.addUpdateButton))
201-
},
202-
onClick = {
203-
if (state.editEnabled) {
204-
onAction(AddEditNoteAction.EditNote(state.textFieldNotesPayload))
205-
} else {
206-
onAction(AddEditNoteAction.AddNote(state.textFieldNotesPayload))
207-
}
208-
if (state.isError) {
209-
onAction(AddEditNoteAction.NavigateBack)
210-
}
211-
},
212-
colors = ButtonDefaults.outlinedButtonColors(
213-
contentColor = MaterialTheme.colorScheme.onPrimary,
214-
containerColor = MaterialTheme.colorScheme.primary,
215-
),
216-
enabled = !state.textFieldNotesPayload.note.isNullOrEmpty(),
217-
)
193+
Row(
194+
modifier = Modifier.fillMaxWidth(),
195+
horizontalArrangement = Arrangement.spacedBy(DesignToken.spacing.extraSmall),
196+
) {
197+
MifosOutlinedButton(
198+
modifier = Modifier.weight(1f),
199+
text = {
200+
Text(
201+
text = stringResource(Res.string.feature_note_button_back),
202+
)
203+
},
204+
colors = ButtonDefaults.outlinedButtonColors(
205+
contentColor = MaterialTheme.colorScheme.primary,
206+
containerColor = MaterialTheme.colorScheme.onPrimary,
207+
),
208+
onClick = {
209+
onAction(AddEditNoteAction.MisTouchBackDialog)
210+
},
211+
)
212+
213+
MifosOutlinedButton(
214+
modifier = Modifier.weight(1f),
215+
text = {
216+
Text(text = stringResource(state.addUpdateButton))
217+
},
218+
onClick = {
219+
if (state.editEnabled) {
220+
onAction(AddEditNoteAction.EditNote(state.textFieldNotesPayload))
221+
} else {
222+
onAction(AddEditNoteAction.AddNote(state.textFieldNotesPayload))
223+
}
224+
if (state.isError) {
225+
onAction(AddEditNoteAction.NavigateBack)
226+
}
227+
},
228+
colors = ButtonDefaults.outlinedButtonColors(
229+
contentColor = MaterialTheme.colorScheme.onPrimary,
230+
containerColor = MaterialTheme.colorScheme.primary,
231+
),
232+
enabled = !state.textFieldNotesPayload.note.isNullOrEmpty(),
233+
)
234+
}
218235
}
219236
}
220237
}

0 commit comments

Comments
 (0)