mayank1513/vscode-extension-trello-kanban-board

View on GitHub
src/utils/drag.ts

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
import { BoardType } from "@/interface";
import { DraggableLocation, DropResult } from "react-beautiful-dnd";

function moveTask(
  state: BoardType,
  destination: DraggableLocation,
  source: DraggableLocation,
  setState: (state: BoardType) => void
) {
  const columns = [...state.columns];
  const sourceCol = columns.find((c) => c.id === source.droppableId);
  let destinationCol;
  if (destination.droppableId === "columns") {
    destinationCol = columns[Math.min(destination.index, columns.length - 1)];
  } else {
    destinationCol = columns.find((c) => c.id === destination.droppableId);
  }
  const taskId = sourceCol?.tasksIds.splice(source.index, 1)[0];
  const tasks = { ...state.tasks };
  if (taskId) {
    tasks[taskId].columnId = destination.droppableId;
    destinationCol?.tasksIds.splice(destination.index, 0, taskId);
    setState({ ...state, columns });
  }
}

export function handleDragEnd(result: DropResult, state: BoardType, setState: (state: BoardType) => void) {
  const { source, destination, draggableId } = result;
  if (!destination) return;

  if (destination.droppableId === source.droppableId && destination.index === source.index) return;

  /** column id always starts with "column-" */
  const columns = [...state.columns];
  if (draggableId.startsWith("column-")) {
    const column = columns.splice(source.index, 1)[0];
    columns.splice(destination.index, 0, column);
    setState({ ...state, columns: columns });
  } else {
    moveTask(state, destination, source, setState);
  }
}