Skip to content
4 changes: 2 additions & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ android {
applicationId = "com.moneymong.moneymong"
minSdk = 24
targetSdk = 35
versionCode = 32
versionName = "2.0.2"
versionCode = 33
versionName = "2.1.0"

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package com.moneymong.moneymong.design_system.component.tag

import androidx.annotation.DrawableRes
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding
Expand All @@ -12,13 +14,21 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.moneymong.moneymong.design_system.R
import com.moneymong.moneymong.design_system.theme.Blue04
import com.moneymong.moneymong.design_system.theme.Body2
import com.moneymong.moneymong.design_system.theme.Body3
import com.moneymong.moneymong.design_system.theme.Gray03
import com.moneymong.moneymong.design_system.theme.Gray05
import com.moneymong.moneymong.design_system.theme.Gray06
import com.moneymong.moneymong.design_system.theme.Gray08
import com.moneymong.moneymong.design_system.theme.White
import com.moneymong.moneymong.ui.noRippleClickable

@Composable
fun MDSTag(
Expand Down Expand Up @@ -54,6 +64,64 @@ fun MDSTag(
}
}

@Composable
fun MDSOutlineTag(
modifier: Modifier = Modifier,
text: String,
selected: Boolean = false,
@DrawableRes iconResource: Int? = null,
onClick: () -> Unit = {},
) {
Row(
modifier = modifier
.border(
width = 1.4.dp,
color = if (selected) Blue04 else Gray03,
shape = RoundedCornerShape(size = Int.MAX_VALUE.dp)
)
.clip(RoundedCornerShape(size = Int.MAX_VALUE.dp))
.background(
color = White,
shape = RoundedCornerShape(size = Int.MAX_VALUE.dp)
)
.clickable(
enabled = iconResource == null,
onClick = onClick
)
.padding(horizontal = 12.dp, vertical = 6.dp),
horizontalArrangement = Arrangement.spacedBy(2.dp),
verticalAlignment = Alignment.CenterVertically
) {
Text(
text = text,
color = if (selected) Gray08 else Gray06,
style = Body3,
)
when {
!selected && iconResource != null -> {
Icon(
modifier = Modifier
.size(18.dp)
.noRippleClickable(onClick),
painter = painterResource(id = iconResource),
contentDescription = "Tag icon",
tint = Gray05
)
}

selected -> {
Icon(
modifier = Modifier
.size(18.dp),
painter = painterResource(id = R.drawable.ic_check),
contentDescription = "Tag icon",
tint = Blue04
)
}
}
}
}

@Preview(showBackground = true)
@Composable
fun MDSTagPreview() {
Expand All @@ -70,7 +138,28 @@ fun MDSTagPreview() {
text = "tag",
backgroundColor = Blue04,
contentColor = White,
iconResource = com.moneymong.moneymong.design_system.R.drawable.ic_pencil
iconResource = R.drawable.ic_pencil
)
}
}

@Preview(showBackground = true)
@Composable
fun MDSOutlineTagPreview() {
Row(
modifier = Modifier.padding(8.dp),
horizontalArrangement = Arrangement.spacedBy(8.dp)
) {
MDSOutlineTag(
text = "tag",
selected = false,
onClick = {},
)
MDSOutlineTag(
text = "tag",
selected = true,
iconResource = R.drawable.ic_close_default,
onClick = {},
)
}
}
}
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,5 @@
package com.moneymong.moneymong.model.agency

data class CategoryDeleteRequest(
val categoryId: Long,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.moneymong.moneymong.model.agency

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

data class CategoryResponse(
val id: Long,
val name: String,
)
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,6 @@ data class LedgerTransactionRequest(
val amount: Int,
val description: String,
val paymentDate: String,
val documentImageUrls: List<String> = emptyList()
val documentImageUrls: List<String> = emptyList(),
val category: String? = null,
)
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@ data class LedgerTransactionDetailRequest(
val storeInfo: String,
val amount: Int,
val description: String,
val paymentDate: String
val paymentDate: String,
val category: String? = null,
)
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,6 @@ data class LedgerTransactionDetailResponse(
val paymentDate: String,
val receiptImageUrls: List<ReceiptImageURL>,
val documentImageUrls: List<DocumentImageURL>,
val authorName: String
val authorName: String,
val category: String?,
)
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,17 @@ 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.CategoryDeleteRequest
import com.moneymong.moneymong.model.agency.CategoryReadResponse
import com.moneymong.moneymong.model.agency.MyAgencyResponse
import com.moneymong.moneymong.model.agency.RegisterAgencyResponse
import com.moneymong.moneymong.model.member.InvitationCodeResponse
import retrofit2.http.Body
import retrofit2.http.DELETE
import retrofit2.http.GET
import retrofit2.http.HTTP
import retrofit2.http.PATCH
import retrofit2.http.POST
import retrofit2.http.Path
Expand Down Expand Up @@ -38,6 +43,11 @@ interface AgencyApi {
@Query("keyword") name: String
): Result<List<AgencyGetResponse>>

@GET("api/v1/agencies/categories")
suspend fun fetchCategories(
@Query("agencyId") agencyId: Long
): Result<CategoryReadResponse>

// POST
@POST("/api/v2/agencies/invitation-code")
suspend fun agencyCodeNumbers(
Expand All @@ -49,6 +59,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 All @@ -60,4 +75,9 @@ interface AgencyApi {
suspend fun deleteAgency(
@Path("agencyId") agencyId: Int
): Result<Unit>

@HTTP(method = "DELETE", path = "api/v1/agencies/categories", hasBody = true)
suspend fun deleteCategory(
@Body request: CategoryDeleteRequest
): Result<Unit>
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ interface LedgerDetailApi {
): Result<Unit>

// PUT
@PUT("api/v1/ledger/ledger-detail/{detailId}")
@PUT("api/v2/ledger/ledger-detail/{detailId}")
suspend fun updateLedgerTransactionDetail(
@Path("detailId") detailId: Int,
@Body body: LedgerTransactionDetailRequest
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ 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.CategoryDeleteRequest
import com.moneymong.moneymong.model.agency.CategoryReadResponse
import com.moneymong.moneymong.model.agency.MyAgencyResponse
import com.moneymong.moneymong.model.agency.RegisterAgencyResponse

Expand All @@ -14,4 +18,7 @@ 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>
suspend fun fetchCategories(agencyId: Long): Result<CategoryReadResponse>
suspend fun deleteCategory(request: CategoryDeleteRequest): Result<Unit>
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ 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.CategoryDeleteRequest
import com.moneymong.moneymong.model.agency.CategoryReadResponse
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 +39,16 @@ class AgencyRemoteDataSourceImpl @Inject constructor(
): Result<AgencyJoinResponse> {
return agencyApi.agencyCodeNumbers(body = data)
}

override suspend fun createCategory(request: CategoryCreateRequest): Result<CategoryCreateResponse> {
return agencyApi.createCategory(request = request)
}

override suspend fun fetchCategories(agencyId: Long): Result<CategoryReadResponse> {
return agencyApi.fetchCategories(agencyId = agencyId)
}

override suspend fun deleteCategory(request: CategoryDeleteRequest): Result<Unit> {
return agencyApi.deleteCategory(request = request)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ 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.CategoryDeleteRequest
import com.moneymong.moneymong.model.agency.CategoryReadResponse
import com.moneymong.moneymong.model.agency.MyAgencyResponse
import com.moneymong.moneymong.model.agency.RegisterAgencyResponse
import kotlinx.coroutines.delay
Expand Down Expand Up @@ -36,6 +40,18 @@ class AgencyRemoteDataSourceMock : AgencyRemoteDataSource {
)
}

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

override suspend fun fetchCategories(agencyId: Long): Result<CategoryReadResponse> {
return Result.success(CategoryReadResponse(agencyId = agencyId, categories = emptyList()))
}

override suspend fun deleteCategory(request: CategoryDeleteRequest): Result<Unit> {
return Result.success(Unit)
}

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,10 @@ 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.CategoryDeleteRequest
import com.moneymong.moneymong.model.agency.CategoryReadResponse
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 +53,13 @@ class AgencyRepositoryImpl @Inject constructor(

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

override suspend fun createCategory(request: CategoryCreateRequest): Result<CategoryCreateResponse> =
agencyRemoteDataSource.createCategory(request = request)

override suspend fun fetchCategories(agencyId: Long): Result<CategoryReadResponse> =
agencyRemoteDataSource.fetchCategories(agencyId = agencyId)

override suspend fun deleteCategory(request: CategoryDeleteRequest): Result<Unit> =
agencyRemoteDataSource.deleteCategory(request = request)
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ 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.CategoryDeleteRequest
import com.moneymong.moneymong.model.agency.CategoryReadResponse
import com.moneymong.moneymong.model.agency.MyAgencyResponse
import com.moneymong.moneymong.model.agency.RegisterAgencyResponse
import kotlinx.coroutines.flow.Flow
Expand All @@ -15,7 +19,9 @@ interface AgencyRepository {
suspend fun fetchMyAgencyList(): Result<List<MyAgencyResponse>>
suspend fun fetchAgencyByName(agencyName: String): Result<List<AgencyGetResponse>>
suspend fun agencyCodeNumbers(data: AgencyJoinRequest): Result<AgencyJoinResponse>

suspend fun saveAgencyId(agencyId: Int)
suspend fun fetchAgencyId(): Int
suspend fun createCategory(request: CategoryCreateRequest): Result<CategoryCreateResponse>
suspend fun fetchCategories(agencyId: Long): Result<CategoryReadResponse>
suspend fun deleteCategory(request: CategoryDeleteRequest): Result<Unit>
}
Loading
Loading