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
@@ -0,0 +1,6 @@
package com.moneymong.moneymong.model.agency

data class CategoryCreateRequest(
val agencyId: Long,
val name: String,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.moneymong.moneymong.model.agency

data class CategoryCreateResponse(
val agencyId: Long,
val name: String,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.moneymong.moneymong.model.agency

data class CategoryReadResponse(
val categories: List<CategoryResponse>,
)

data class CategoryResponse(
val name: String,
)
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import com.moneymong.moneymong.model.agency.AgencyGetResponse
import com.moneymong.moneymong.model.agency.AgencyJoinRequest
import com.moneymong.moneymong.model.agency.AgencyJoinResponse
import com.moneymong.moneymong.model.agency.AgencyRegisterRequest
import com.moneymong.moneymong.model.agency.CategoryCreateRequest
import com.moneymong.moneymong.model.agency.CategoryCreateResponse
import com.moneymong.moneymong.model.agency.MyAgencyResponse
import com.moneymong.moneymong.model.agency.RegisterAgencyResponse
import com.moneymong.moneymong.model.member.InvitationCodeResponse
Expand Down Expand Up @@ -49,6 +51,11 @@ interface AgencyApi {
@Body request: AgencyRegisterRequest
): Result<RegisterAgencyResponse>

@POST("api/v1/agencies/categories")
suspend fun createCategory(
@Body request: CategoryCreateRequest
): Result<CategoryCreateResponse>

// PATCH
@PATCH("api/v1/agencies/{agencyId}/invitation-code")
suspend fun reInvitationCode(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import com.moneymong.moneymong.model.agency.AgencyGetResponse
import com.moneymong.moneymong.model.agency.AgencyJoinRequest
import com.moneymong.moneymong.model.agency.AgencyJoinResponse
import com.moneymong.moneymong.model.agency.AgencyRegisterRequest
import com.moneymong.moneymong.model.agency.CategoryCreateRequest
import com.moneymong.moneymong.model.agency.CategoryCreateResponse
import com.moneymong.moneymong.model.agency.MyAgencyResponse
import com.moneymong.moneymong.model.agency.RegisterAgencyResponse

Expand All @@ -14,4 +16,5 @@ interface AgencyRemoteDataSource {
suspend fun fetchMyAgencyList(): Result<List<MyAgencyResponse>>
suspend fun fetchAgencyByName(agencyName: String): Result<List<AgencyGetResponse>>
suspend fun agencyCodeNumbers(data: AgencyJoinRequest): Result<AgencyJoinResponse>
suspend fun createCategory(request: CategoryCreateRequest): Result<CategoryCreateResponse>
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import com.moneymong.moneymong.model.agency.AgencyGetResponse
import com.moneymong.moneymong.model.agency.AgencyJoinRequest
import com.moneymong.moneymong.model.agency.AgencyJoinResponse
import com.moneymong.moneymong.model.agency.AgencyRegisterRequest
import com.moneymong.moneymong.model.agency.CategoryCreateRequest
import com.moneymong.moneymong.model.agency.CategoryCreateResponse
import com.moneymong.moneymong.model.agency.MyAgencyResponse
import com.moneymong.moneymong.model.agency.RegisterAgencyResponse
import com.moneymong.moneymong.network.api.AgencyApi
Expand Down Expand Up @@ -35,4 +37,8 @@ class AgencyRemoteDataSourceImpl @Inject constructor(
): Result<AgencyJoinResponse> {
return agencyApi.agencyCodeNumbers(body = data)
}

override suspend fun createCategory(request: CategoryCreateRequest): Result<CategoryCreateResponse> {
return agencyApi.createCategory(request = request)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import com.moneymong.moneymong.model.agency.AgencyGetResponse
import com.moneymong.moneymong.model.agency.AgencyJoinRequest
import com.moneymong.moneymong.model.agency.AgencyJoinResponse
import com.moneymong.moneymong.model.agency.AgencyRegisterRequest
import com.moneymong.moneymong.model.agency.CategoryCreateRequest
import com.moneymong.moneymong.model.agency.CategoryCreateResponse
import com.moneymong.moneymong.model.agency.MyAgencyResponse
import com.moneymong.moneymong.model.agency.RegisterAgencyResponse
import kotlinx.coroutines.delay
Expand Down Expand Up @@ -36,6 +38,10 @@ class AgencyRemoteDataSourceMock : AgencyRemoteDataSource {
)
}

override suspend fun createCategory(request: CategoryCreateRequest): Result<CategoryCreateResponse> {
return Result.success(CategoryCreateResponse(agencyId = 1L, name = "category"))
}

private companion object {
val agenciesMockOfSuccess = listOf(
Result.success(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import com.moneymong.moneymong.model.agency.AgencyGetResponse
import com.moneymong.moneymong.model.agency.AgencyJoinRequest
import com.moneymong.moneymong.model.agency.AgencyJoinResponse
import com.moneymong.moneymong.model.agency.AgencyRegisterRequest
import com.moneymong.moneymong.model.agency.CategoryCreateRequest
import com.moneymong.moneymong.model.agency.CategoryCreateResponse
import com.moneymong.moneymong.model.agency.MyAgencyResponse
import com.moneymong.moneymong.model.agency.RegisterAgencyResponse
import kotlinx.coroutines.flow.Flow
Expand Down Expand Up @@ -49,4 +51,7 @@ class AgencyRepositoryImpl @Inject constructor(

override suspend fun fetchAgencyId(): Int =
agencyLocalDataSource.fetchAgencyId()

override suspend fun createCategory(request: CategoryCreateRequest): Result<CategoryCreateResponse> =
agencyRemoteDataSource.createCategory(request = request)
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import com.moneymong.moneymong.model.agency.AgencyGetResponse
import com.moneymong.moneymong.model.agency.AgencyJoinRequest
import com.moneymong.moneymong.model.agency.AgencyJoinResponse
import com.moneymong.moneymong.model.agency.AgencyRegisterRequest
import com.moneymong.moneymong.model.agency.CategoryCreateRequest
import com.moneymong.moneymong.model.agency.CategoryCreateResponse
import com.moneymong.moneymong.model.agency.MyAgencyResponse
import com.moneymong.moneymong.model.agency.RegisterAgencyResponse
import kotlinx.coroutines.flow.Flow
Expand All @@ -18,4 +20,5 @@ interface AgencyRepository {

suspend fun saveAgencyId(agencyId: Int)
suspend fun fetchAgencyId(): Int
suspend fun createCategory(request: CategoryCreateRequest): Result<CategoryCreateResponse>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.moneymong.moneymong.domain.usecase.agency

import com.moneymong.moneymong.domain.repository.agency.AgencyRepository
import com.moneymong.moneymong.model.agency.CategoryCreateRequest
import com.moneymong.moneymong.model.agency.CategoryCreateResponse
import javax.inject.Inject

class CreateCategoryUseCase @Inject constructor(
private val agencyRepository: AgencyRepository,
) {
suspend operator fun invoke(request: CategoryCreateRequest): Result<CategoryCreateResponse> =
agencyRepository.createCategory(request = request)
}
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@ import com.bumptech.glide.integration.compose.ExperimentalGlideComposeApi
import com.bumptech.glide.integration.compose.GlideImage
import com.moneymong.moneymong.android.util.base64ToFile
import com.moneymong.moneymong.android.util.encodingBase64
import com.moneymong.moneymong.design_system.R
import com.moneymong.moneymong.ui.noRippleClickable
import com.moneymong.moneymong.design_system.R.drawable
import com.moneymong.moneymong.design_system.component.button.MDSButton
Expand Down Expand Up @@ -186,15 +185,16 @@ fun LedgerManualScreen(
if (state.showBottomSheet) {
LedgerManualCategoryBottomSheet(
sheetState = sheetState,
categories = emptyList(),
categories = state.categories,
categoryValue = state.categoryValue,
isSystemCategoryError = state.isSystemCategoryError,
onDismissRequest = {
scope.launch {
sheetState.hide()
}.invokeOnCompletion { viewModel.onDismissBottomSheet() }
},
onChangeCategoryValue = viewModel::onChangeCategoryValue
onChangeCategoryValue = viewModel::onChangeCategoryValue,
onCategoryCreate = viewModel::createCategory,
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import androidx.compose.ui.text.input.TextFieldValue
import com.moneymong.moneymong.android.State
import com.moneymong.moneymong.common.util.toZonedDateTime
import com.moneymong.moneymong.design_system.component.textfield.util.PriceType
import com.moneymong.moneymong.model.agency.CategoryResponse
import com.moneymong.moneymong.model.ledger.FundType
import java.text.SimpleDateFormat

Expand All @@ -28,6 +29,7 @@ data class LedgerManualState(
val errorMessage: String = "",
val showBottomSheet: Boolean = false,
val categoryValue: TextFieldValue = TextFieldValue(),
val categories: List<CategoryResponse>? = null,
) : State {

val enabled: Boolean
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,16 @@ package com.moneymong.moneymong.ledgermanual
import androidx.compose.ui.text.input.TextFieldValue
import com.moneymong.moneymong.android.BaseViewModel
import com.moneymong.moneymong.android.util.toMultipart
import com.moneymong.moneymong.common.error.MoneyMongError
import com.moneymong.moneymong.domain.usecase.agency.CreateCategoryUseCase
import com.moneymong.moneymong.ui.isValidPaymentDate
import com.moneymong.moneymong.ui.isValidPaymentTime
import com.moneymong.moneymong.ui.validateValue
import com.moneymong.moneymong.domain.usecase.agency.FetchAgencyIdUseCase
import com.moneymong.moneymong.domain.usecase.ledger.PostLedgerTransactionUseCase
import com.moneymong.moneymong.domain.usecase.ocr.PostFileUploadUseCase
import com.moneymong.moneymong.domain.usecase.user.FetchUserNicknameUseCase
import com.moneymong.moneymong.model.agency.CategoryCreateRequest
import com.moneymong.moneymong.model.ledger.FundType
import com.moneymong.moneymong.model.ledger.LedgerTransactionRequest
import com.moneymong.moneymong.model.ocr.FileUploadRequest
Expand All @@ -27,7 +30,8 @@ class LedgerManualViewModel @Inject constructor(
private val postLedgerTransactionUseCase: PostLedgerTransactionUseCase,
private val postFileUploadUseCase: PostFileUploadUseCase,
private val fetchAgencyIdUseCase: FetchAgencyIdUseCase,
private val fetchUserNicknameUseCase: FetchUserNicknameUseCase
private val fetchUserNicknameUseCase: FetchUserNicknameUseCase,
private val createCategoryUseCase: CreateCategoryUseCase,
) : BaseViewModel<LedgerManualState, LedgerManualSideEffect>(LedgerManualState()) {

init {
Expand Down Expand Up @@ -92,6 +96,28 @@ class LedgerManualViewModel @Inject constructor(
}
}

fun createCategory() = intent {
val request =
CategoryCreateRequest(agencyId = state.agencyId.toLong(), name = state.categoryValue.text)

createCategoryUseCase(request)
.onSuccess {
reduce {
state.copy(
showBottomSheet = false,
categoryValue = TextFieldValue(),
)
}
}.onFailure {
reduce {
state.copy(
showErrorDialog = true,
errorMessage = it.message ?: MoneyMongError.UnExpectedError.message
)
}
}
}

fun onChangeStoreNameValue(value: TextFieldValue) = blockingIntent {
val validate = value.text.validateValue(length = 20)
if (!validate) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,18 +55,20 @@ import com.moneymong.moneymong.design_system.theme.Gray07
import com.moneymong.moneymong.design_system.theme.Heading1
import com.moneymong.moneymong.design_system.theme.Heading4
import com.moneymong.moneymong.design_system.theme.White
import com.moneymong.moneymong.model.agency.CategoryResponse
import com.moneymong.moneymong.ui.noRippleClickable

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun LedgerManualCategoryBottomSheet(
modifier: Modifier = Modifier,
sheetState: SheetState,
categories: List<String>, // TODO API response
categories: List<CategoryResponse>?,
categoryValue: TextFieldValue,
isSystemCategoryError: Boolean,
onDismissRequest: () -> Unit,
onChangeCategoryValue: (TextFieldValue) -> Unit,
onCategoryCreate: () -> Unit,
) {
var sheetType by remember { mutableStateOf(LedgerManualBottomSheetType.LIST) }

Expand Down Expand Up @@ -106,7 +108,7 @@ fun LedgerManualCategoryBottomSheet(
isSystemCategoryError = isSystemCategoryError,
categories = categories,
onValueChange = onChangeCategoryValue,
onClickRegister = {},
onClickRegister = onCategoryCreate,
onPrev = { sheetType = LedgerManualBottomSheetType.LIST }
)
}
Expand All @@ -119,7 +121,7 @@ fun LedgerManualCategoryBottomSheet(
@Composable
fun LedgerManualCategoryBottomSheetContent(
modifier: Modifier = Modifier,
categories: List<String>,
categories: List<CategoryResponse>?,
onDismissRequest: () -> Unit,
onClickCreate: () -> Unit,
) {
Expand Down Expand Up @@ -165,9 +167,9 @@ fun LedgerManualCategoryBottomSheetContent(
FlowRow(
horizontalArrangement = Arrangement.spacedBy(12.dp),
) {
categories.forEach {
categories?.forEach {
MDSOutlineTag(
text = it,
text = it.name,
iconResource = R.drawable.ic_close_default,
onClick = {},
)
Expand All @@ -181,7 +183,7 @@ fun LedgerManualCategoryCreateBottomSheetContent(
modifier: Modifier = Modifier,
textFieldValue: TextFieldValue,
isSystemCategoryError: Boolean,
categories: List<String>, // TODO API response
categories: List<CategoryResponse>?,
onValueChange: (TextFieldValue) -> Unit,
onClickRegister: () -> Unit,
onPrev: () -> Unit,
Expand All @@ -190,7 +192,7 @@ fun LedgerManualCategoryCreateBottomSheetContent(
var isFilled by remember { mutableStateOf(false) }
val focusRequester = remember { FocusRequester() }
val keyboard = LocalSoftwareKeyboardController.current
val isExists = categories.contains(textFieldValue.text)
val isExists = categories?.any { it.name == textFieldValue.text } ?: false
val helperText by remember(isSystemCategoryError, isExists) {
derivedStateOf {
when {
Expand Down Expand Up @@ -277,7 +279,7 @@ fun LedgerManualCategoryCreateBottomSheetContent(
@Preview(showBackground = true)
@Composable
fun LedgerManualCategoryBottomSheetContentPreview() {
val categories = listOf("testTooLongTextOverFlow", "test")
val categories = listOf(CategoryResponse("testTooLongTextOverFlow"), CategoryResponse("test"))

LedgerManualCategoryBottomSheetContent(
categories = categories,
Expand Down