diff --git a/apps/nowait-admin/src/pages/AdminBooth/components/MenuSection.tsx b/apps/nowait-admin/src/pages/AdminBooth/components/MenuSection.tsx
index 1dffa50d..45de6e35 100644
--- a/apps/nowait-admin/src/pages/AdminBooth/components/MenuSection.tsx
+++ b/apps/nowait-admin/src/pages/AdminBooth/components/MenuSection.tsx
@@ -12,9 +12,28 @@ import MenuRemoveModal from "./Modal/MenuRemoveModal";
import { useDeleteMenu } from "../../../hooks/booth/menu/useDeleteMenu";
import { useToggleMenuSoldOut } from "../../../hooks/booth/menu/useToggleMenuSoldOut";
import { useUpdateMenuSort } from "../../../hooks/booth/menu/useUpadateMenuSort";
-import { useVerticalLockStyle } from "../../../utils/useVerticalLockStyle";
import { SwipeableRow } from "./Swipe/SwipeableRow";
+function lockVertical(
+ style?: React.CSSProperties
+): React.CSSProperties | undefined {
+ if (!style || !style.transform) return style;
+ const t = String(style.transform);
+ const m2d = t.match(/translate\((-?\d+\.?\d*)px,\s*(-?\d+\.?\d*)px\)/);
+ if (m2d) {
+ const [, , y] = m2d;
+ return { ...style, transform: `translate(0px, ${y}px)` };
+ }
+ const m3d = t.match(
+ /translate3d\((-?\d+\.?\d*)px,\s*(-?\d+\.?\d*)px,\s*(-?\d+\.?\d*)px\)/
+ );
+ if (m3d) {
+ const [, , y, z] = m3d;
+ return { ...style, transform: `translate3d(0px, ${y}px, ${z}px)` };
+ }
+ return style;
+}
+
// 세 자리마다 , 붙여서 가격표시
const formatNumber = (num: number) => {
if (!num) return "";
@@ -132,6 +151,7 @@ const MenuSection = ({ isTablet }: { isTablet: boolean }) => {
adminDisplayName: string;
description: string;
price: string;
+ image?: File | string;
}) => {
const payload = {
menuId: updated.id,
@@ -153,6 +173,25 @@ const MenuSection = ({ isTablet }: { isTablet: boolean }) => {
console.log("메뉴 수정에 실패했습니다.");
},
});
+
+ if (updated.image && updated.image instanceof File) {
+ uploadMenuImage(
+ { menuId: updated.id, image: updated.image },
+ {
+ onSuccess: (imgData) => {
+ const url = imgData.url;
+ setMenus((prev) =>
+ prev.map((m) =>
+ m.id === updated.id ? { ...m, imageUrl: url } : m
+ )
+ );
+ },
+ onError: () => {
+ console.log("이미지 업로드 실패");
+ },
+ }
+ );
+ }
};
const handleDeleteMenu = () => {
@@ -201,12 +240,12 @@ const MenuSection = ({ isTablet }: { isTablet: boolean }) => {
const reordered = Array.from(menus);
const [removed] = reordered.splice(result.source.index, 1);
reordered.splice(result.destination.index, 0, removed);
- const next = reordered.map((m, i) => ({ ...m, sortOrder: i })); // 서버가 1-base면 i+1
+ const next = reordered.map((m, i) => ({ ...m, sortOrder: i }));
setMenus(next);
const body = next.map(({ id, sortOrder }) => ({
menuId: id,
- sortOrder, // 1-base면 sortOrder: sortOrder + 1
+ sortOrder,
}));
updateMenuSort(body, {
onSuccess: (res) => {
@@ -287,17 +326,22 @@ const MenuSection = ({ isTablet }: { isTablet: boolean }) => {
isDragDisabled={!editMode}
>
{(provided) => {
- const lockedStyle = useVerticalLockStyle(
+ const lockedStyle = lockVertical(
provided.draggableProps.style
);
- const rowContent = (
+ return editMode ? (
+ // ✅ 편집 모드: SwipeableRow 사용 안 함 (충돌 차단)
+ {/* rowContent 대신, 핸들 아이콘에만 dragHandleProps를 붙여줘야 해 */}
!editMode && openEditModal(menu)}
>
@@ -317,37 +361,55 @@ const MenuSection = ({ isTablet }: { isTablet: boolean }) => {
-
- {editMode ? (
-

- ) : (
-
toggleSoldOut(idx)}
- />
- )}
-
+ {/* ✨ 여기만 드래그 핸들! */}
+
- );
- return (
+ ) : (
+ // ✅ 보기 모드: SwipeableRow로 스와이프 삭제
{
setSelectedMenu(menu);
setIsRemoveModalOpen(true);
}}
contentProps={{
- ...provided.draggableProps,
+ ...provided.draggableProps, // isDragDisabled=true라 드래그는 안됨
style: lockedStyle,
+ className:
+ "flex justify-between items-center py-4 w-full",
}}
>
- {rowContent}
+ openEditModal(menu)}
+ >
+
+

+
+
+
+ {menu.name}
+
+
+ {formatNumber(menu.price)}원
+
+
+
+
+ toggleSoldOut(idx)}
+ />
);
}}
diff --git a/apps/nowait-admin/src/pages/AdminBooth/components/Modal/menuModal.tsx b/apps/nowait-admin/src/pages/AdminBooth/components/Modal/menuModal.tsx
index 4866f47f..01b69f64 100644
--- a/apps/nowait-admin/src/pages/AdminBooth/components/Modal/menuModal.tsx
+++ b/apps/nowait-admin/src/pages/AdminBooth/components/Modal/menuModal.tsx
@@ -40,13 +40,19 @@ const PriceInput: React.FC = ({ price, setPrice }) => {
setPrice(rawValue);
};
+ const displayValue = isFocused
+ ? price
+ : price
+ ? formatNumber(parseInt(price))
+ : "";
+
return (
setIsFocused(true)}
onBlur={() => setIsFocused(false)}
diff --git a/apps/nowait-user/src/assets/icon/arrow-right.svg b/apps/nowait-user/src/assets/icon/arrow-right.svg
index d262d24a..61898d4d 100644
--- a/apps/nowait-user/src/assets/icon/arrow-right.svg
+++ b/apps/nowait-user/src/assets/icon/arrow-right.svg
@@ -1,3 +1,3 @@
-