Skip to content

Commit 0fca393

Browse files
authored
[Feat] MyDashboard페이지 D&D 위치변경 저장
[Feat] MyDashboard페이지 D&D 위치변경 저장
2 parents 0b32def + 17d600e commit 0fca393

File tree

4 files changed

+41
-3
lines changed

4 files changed

+41
-3
lines changed

package-lock.json

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"axios": "^1.8.3",
1717
"clsx": "^2.1.1",
1818
"date-fns": "^4.1.0",
19+
"dexie": "^4.0.11",
1920
"lodash": "^4.17.21",
2021
"lucide-react": "^0.485.0",
2122
"moment": "^2.30.1",

src/lib/dashboardOrderDB.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import Dexie from "dexie";
2+
3+
// DB 인스턴스 생성
4+
export const db = new Dexie("DashboardOrderDB");
5+
6+
// 테이블 구조 정의
7+
db.version(1).stores({
8+
dashboardOrders: "&teamId", // teamId를 키로 사용
9+
});
10+
11+
// 테이블 객체 export
12+
export const dashboardOrdersTable = db.table("dashboardOrders");

src/pages/mydashboard.tsx

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import {
2929
arrayMove,
3030
} from "@dnd-kit/sortable";
3131
import SortableCardButton from "@/components/button/SortableCardButton";
32+
import { dashboardOrdersTable } from "@/lib/dashboardOrderDB";
3233

3334
interface Dashboard {
3435
id: number;
@@ -57,7 +58,7 @@ export default function MyDashboardPage() {
5758
const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);
5859
const [isConfirmDeleteModalOpen, setIsConfirmDeleteModalOpen] =
5960
useState(false);
60-
const itemsPerPage = 6; // 버튼 포함 6개
61+
const itemsPerPage = 6;
6162

6263
const sensors = useSensors(
6364
useSensor(PointerSensor, {
@@ -81,7 +82,18 @@ export default function MyDashboardPage() {
8182
const fetchDashboards = async () => {
8283
try {
8384
const res = await getDashboards({});
84-
setDashboardList(res.dashboards);
85+
const localOrder = await dashboardOrdersTable.get(TEAM_ID);
86+
87+
let orderedList = res.dashboards;
88+
if (localOrder?.order) {
89+
orderedList = res.dashboards
90+
.slice()
91+
.sort(
92+
(a, b) =>
93+
localOrder.order.indexOf(a.id) - localOrder.order.indexOf(b.id)
94+
);
95+
}
96+
setDashboardList(orderedList);
8597
} catch (error) {
8698
console.error("대시보드 불러오기 실패:", error);
8799
}
@@ -122,7 +134,7 @@ export default function MyDashboardPage() {
122134
setSelectedDashboardId(null);
123135
};
124136

125-
const handleDragEnd = (event: DragEndEvent) => {
137+
const handleDragEnd = async (event: DragEndEvent) => {
126138
const { active, over } = event;
127139
if (!over || active.id === over.id) return;
128140

@@ -131,6 +143,12 @@ export default function MyDashboardPage() {
131143

132144
const newOrder = arrayMove(dashboardList, oldIndex, newIndex);
133145
setDashboardList(newOrder);
146+
147+
//D&D 로컬 순서 저장
148+
await dashboardOrdersTable.put({
149+
teamId: TEAM_ID,
150+
order: newOrder.map((d) => d.id),
151+
});
134152
};
135153

136154
if (!isInitialized || !user) {

0 commit comments

Comments
 (0)