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,8 @@
package com.kuit.ourmenu.data.model.menuFolder.request

import kotlinx.serialization.Serializable

@Serializable
data class MenuFolderIndexRequest(
val index: Int,
)
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.kuit.ourmenu.data.repository

import com.kuit.ourmenu.data.model.base.handleBaseResponse
import com.kuit.ourmenu.data.model.menuFolder.request.MenuFolderIndexRequest
import com.kuit.ourmenu.data.service.MenuFolderService
import javax.inject.Inject
import javax.inject.Singleton
Expand Down Expand Up @@ -40,4 +41,20 @@ class MenuFolderRepository @Inject constructor(
sortOrder = sortOrder
).handleBaseResponse().getOrThrow()
}

suspend fun deleteMenuFolder(
menuFolderId: Long
) = runCatching {
menuFolderService.deleteMenuFolder(menuFolderId).handleBaseResponse().getOrThrow()
}

suspend fun updateMenuFolderIndex(
menuFolderId: Long,
request: MenuFolderIndexRequest
) = runCatching {
menuFolderService.updateMenuFolderIndex(
menuFolderId = menuFolderId,
request = request
).handleBaseResponse().getOrThrow()
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
package com.kuit.ourmenu.data.service

import com.kuit.ourmenu.data.model.base.BaseResponse
import com.kuit.ourmenu.data.model.menuFolder.request.MenuFolderIndexRequest
import com.kuit.ourmenu.data.model.menuFolder.response.MenuFolderAllResponse
import com.kuit.ourmenu.data.model.menuFolder.response.MenuFolderDetailResponse
import com.kuit.ourmenu.data.model.menuFolder.response.MenuFolderResponse
import retrofit2.http.Body
import retrofit2.http.DELETE
import retrofit2.http.GET
import retrofit2.http.PATCH
import retrofit2.http.Path
import retrofit2.http.Query

Expand All @@ -27,4 +31,15 @@ interface MenuFolderService {
@Query("size") size: Int,
@Query("sortOrder") sortOrder: String,
): BaseResponse<List<MenuFolderAllResponse>>

@DELETE("api/menu-folders/{menuFolderId}")
suspend fun deleteMenuFolder(
@Path("menuFolderId") menuFolderId: Long
): BaseResponse<Unit>

@PATCH("api/menu-folders/{menuFolderId}/index")
suspend fun updateMenuFolderIndex(
@Path("menuFolderId") menuFolderId: Long,
@Body request: MenuFolderIndexRequest
): BaseResponse<MenuFolderDetailResponse>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
package com.kuit.ourmenu.ui.menuFolder.component

import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
import com.kuit.ourmenu.R
import com.kuit.ourmenu.ui.my.component.LogoutModal
import com.kuit.ourmenu.ui.theme.Neutral400
import com.kuit.ourmenu.ui.theme.Neutral500
import com.kuit.ourmenu.ui.theme.Neutral900
import com.kuit.ourmenu.ui.theme.NeutralWhite
import com.kuit.ourmenu.ui.theme.Primary500Main
import com.kuit.ourmenu.ui.theme.ourMenuTypography

@Composable
fun DeleteMenuFolderModal(
onDismiss: () -> Unit,
onConfirm: () -> Unit
) {
Dialog(onDismissRequest = onDismiss) {
Column(
modifier = Modifier
.background(NeutralWhite, shape = RoundedCornerShape(16.dp))
.padding(20.dp)
.width(288.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
// 닫기 아이콘
Icon(
painter = painterResource(R.drawable.ic_close_24_n400),
contentDescription = null,
tint = Color.Unspecified,
modifier = Modifier
.align(Alignment.End)
.clickable { onDismiss() }
.size(24.dp)
)

Spacer(modifier = Modifier.height(8.dp))

// 제목
Text(
text = stringResource(R.string.delete_menu_folder_modal_title),
style = ourMenuTypography().pretendard_700_18,
color = Neutral900,
textAlign = TextAlign.Center,
modifier = Modifier.fillMaxWidth()
)

Spacer(modifier = Modifier.height(12.dp))

Text(
text = stringResource(R.string.delete_menu_folder_modal_content),
style = ourMenuTypography().pretendard_500_14,
color = Neutral500,
textAlign = TextAlign.Center,
modifier = Modifier.fillMaxWidth()
)

Spacer(modifier = Modifier.height(16.dp))

// 버튼 Row
Column(
modifier = Modifier.fillMaxWidth()
) {

Button(
onClick = {
onConfirm()
onDismiss()
},
modifier = Modifier
.fillMaxWidth()
.height(48.dp),
shape = RoundedCornerShape(8.dp),
colors = ButtonDefaults.buttonColors(
containerColor = Primary500Main,
contentColor = NeutralWhite
),
) {
Text(
text = stringResource(R.string.delete),
style = ourMenuTypography().pretendard_700_18,
color = NeutralWhite
)
}

Spacer(modifier = Modifier.height(8.dp))

Button(
onClick = {
onDismiss()
},
modifier = Modifier
.fillMaxWidth()
.height(48.dp),
shape = RoundedCornerShape(8.dp),
colors = ButtonDefaults.buttonColors(
containerColor = Neutral400,
contentColor = NeutralWhite
),
) {
Text(
text = stringResource(R.string.cancel),
style = ourMenuTypography().pretendard_700_18,
color = NeutralWhite
)
}
}
}
}
}

@Preview(showBackground = true)
@Composable
private fun DeleteMenuFolderModalPreview() {
DeleteMenuFolderModal(
onDismiss = {},
onConfirm = {}
)
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.kuit.ourmenu.ui.menuFolder.component

import androidx.compose.animation.core.Animatable
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
Expand All @@ -19,21 +20,21 @@ import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableFloatStateOf
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.dp
import coil3.compose.AsyncImage
import com.kuit.ourmenu.R
Expand All @@ -44,10 +45,12 @@ import com.kuit.ourmenu.ui.theme.NeutralWhite
import com.kuit.ourmenu.ui.theme.Primary500Main
import com.kuit.ourmenu.ui.theme.ourMenuTypography
import kotlinx.coroutines.launch
import kotlin.math.roundToInt


@Composable
fun MenuFolderButton(
modifier: Modifier = Modifier,
menuFolder: MenuFolderList,
isSwiped: Boolean, // 현재 버튼이 스와이프된 상태인지 확인
onSwipe: () -> Unit, // 새로운 버튼이 스와이프될 때 호출
Expand All @@ -56,31 +59,64 @@ fun MenuFolderButton(
onEditClick: () -> Unit = {},
onDeleteClick: () -> Unit = {}
) {
var offsetX by remember { mutableFloatStateOf(0f) }
val density = LocalDensity.current
val offset = remember {
Animatable(initialValue = 0f)
}
val scope = rememberCoroutineScope()
val maxSwipe = 128f // 최대 스와이프 범위 (삭제 + 수정 버튼 너비)
val maxSwipe = with(density) {
128.dp.toPx() // 최대 스와이프 범위를 dp에서 px로 변환
}

LaunchedEffect(isSwiped) {
if (!isSwiped) {
offset.snapTo(0f)
}
}

Box(
modifier = Modifier
modifier = modifier
.height(132.dp)
.fillMaxWidth()
.pointerInput(Unit) {
// detectHorizontalDragGestures(
// onDragEnd = {
// scope.launch {
// if (offsetX < -80f) {
// onSwipe() // 다른 버튼을 닫고 이 버튼만 스와이프
// offsetX = -maxSwipe
// } else {
// offsetX = 0f
// onReset() // 스와이프가 닫히면 상태 초기화
// }
// }
// }
// ) { change, dragAmount ->
// change.consume()
// offsetX = (offsetX + dragAmount).coerceIn(-maxSwipe, 0f)
// }
detectHorizontalDragGestures(
onDragEnd = {
onHorizontalDrag = { _, dragAmount ->
scope.launch {
if (offsetX < -80f) {
onSwipe() // 다른 버튼을 닫고 이 버튼만 스와이프
offsetX = -maxSwipe
} else {
offsetX = 0f
onReset() // 스와이프가 닫히면 상태 초기화
val newOffset = (offset.value + dragAmount)
.coerceIn(-maxSwipe, 0f)
offset.snapTo(newOffset)
}
},
onDragEnd = {
if (offset.value < -maxSwipe / 2) {
scope.launch {
offset.animateTo(-maxSwipe)
}
onSwipe()
} else {
scope.launch {
offset.animateTo(0f)
}
onReset()
}
}
) { change, dragAmount ->
change.consume()
offsetX = (offsetX + dragAmount).coerceIn(-maxSwipe, 0f)
}
)
}
) {
Box(
Expand All @@ -94,10 +130,12 @@ fun MenuFolderButton(
// 스와이프 상태일 때만 offset 적용
Box(
modifier = Modifier
.offset(x = if (isSwiped) offsetX.dp else 0.dp)
.clickable(onClick = onButtonClick)
// .offset(x = if (isSwiped) offset.value.dp else 0.dp)
.offset { IntOffset(offset.value.roundToInt(), 0) }

) {
MenuFolderContent(
onClick = onButtonClick,
menuFolder = menuFolder
)
}
Expand Down Expand Up @@ -161,6 +199,7 @@ fun MenuFolderDeleteButton(onDeleteClick: () -> Unit = {}) {

@Composable
fun MenuFolderContent(
onClick: () -> Unit = {},
menuFolder: MenuFolderList,
) {
val menuCount = menuFolder.menuIds.size
Expand All @@ -176,6 +215,7 @@ fun MenuFolderContent(
modifier = Modifier
.fillMaxSize()
.clip(RoundedCornerShape(12.dp))
.clickable(onClick = onClick)
)

Box(
Expand Down Expand Up @@ -239,6 +279,7 @@ private fun MenuFolderButtonPreview() {
)

MenuFolderButton(
modifier = Modifier,
menuFolder = dummyMenuFolder,
false, {}, {})
}
Loading