frontPanel/src/pages/Questions/DraggableList/index.tsx

55 lines
1.4 KiB
TypeScript
Raw Normal View History

2023-08-03 07:45:06 +00:00
import { useEffect, useState } from "react";
import { Box } from "@mui/material";
import { DragDropContext } from "react-beautiful-dnd";
import { StrictModeDroppable } from "./StrictModeDroppable";
import { DraggableListItem } from "./DraggableListItem";
import { reorder } from "./helper";
import type { DropResult } from "react-beautiful-dnd";
2023-08-08 11:01:37 +00:00
import type { Quizes } from "../../../stores/quizes";
export type ExtendedQuizes = Quizes & {
onDelete: () => void;
};
2023-08-03 07:45:06 +00:00
type DraggableListProps = {
2023-08-08 11:01:37 +00:00
items: ExtendedQuizes[];
2023-08-03 07:45:06 +00:00
};
export const DraggableList = ({ items }: DraggableListProps) => {
const [listItems, setListItems] = useState(items);
useEffect(() => {
setListItems(items);
}, [items]);
const onDragEnd = ({ destination, source }: DropResult) => {
if (destination) {
const newItems = reorder(listItems, source.index, destination.index);
setListItems(newItems);
}
};
return (
<DragDropContext onDragEnd={onDragEnd}>
<StrictModeDroppable droppableId="droppable-list">
{(provided) => (
<Box ref={provided.innerRef} {...provided.droppableProps}>
2023-08-08 11:01:37 +00:00
{listItems.map(({ onDelete }, index) => (
<DraggableListItem
key={index}
index={index}
onDelete={onDelete}
/>
2023-08-03 07:45:06 +00:00
))}
{provided.placeholder}
</Box>
)}
</StrictModeDroppable>
</DragDropContext>
);
};