diff --git a/apps/client/src/features/base/components/views/kanban/base-kanban.tsx b/apps/client/src/features/base/components/views/kanban/base-kanban.tsx index 16e0b66d9..36ce5d030 100644 --- a/apps/client/src/features/base/components/views/kanban/base-kanban.tsx +++ b/apps/client/src/features/base/components/views/kanban/base-kanban.tsx @@ -1,4 +1,4 @@ -import { useCallback, useMemo } from "react"; +import { useCallback, useMemo, useRef } from "react"; import { Badge } from "@mantine/core"; import { IconPlus } from "@tabler/icons-react"; import { useTranslation } from "react-i18next"; @@ -9,6 +9,7 @@ import { NO_VALUE_CHOICE_ID, } from "@/features/base/types/base.types"; import { useKanbanGroups } from "@/features/base/hooks/use-kanban-groups"; +import { useKanbanAutoScroll } from "@/features/base/hooks/use-kanban-auto-scroll"; import { useUpdateViewMutation } from "@/features/base/queries/base-view-query"; import { useCreateRowMutation, @@ -56,6 +57,14 @@ export function BaseKanban({ const updateRowMutation = useUpdateRowMutation(); const reorderRowMutation = useReorderRowMutation(); const sortsActive = (effectiveView?.config?.sorts?.length ?? 0) > 0; + const boardRef = useRef(null); + const canScrollBoard = useCallback( + ({ source }: { source: { data: Record } }) => + source.data.type === "base-kanban-card" || + source.data.type === "base-kanban-column", + [], + ); + useKanbanAutoScroll(boardRef, canScrollBoard); // Rules of Hooks: call useKanbanGroups unconditionally with `undefined` // when not groupable; switch the render path on isGroupable below. @@ -253,7 +262,7 @@ export function BaseKanban({ {t("Sorted — cards within a column can't be reordered.")} )} -
+
{columns.map((column) => ( } }) => + source.data.type === "base-kanban-card", + [], + ); + useKanbanAutoScroll(bodyRef, canScrollColumn); return (
diff --git a/apps/client/src/features/base/hooks/use-kanban-auto-scroll.ts b/apps/client/src/features/base/hooks/use-kanban-auto-scroll.ts new file mode 100644 index 000000000..9958a2e0a --- /dev/null +++ b/apps/client/src/features/base/hooks/use-kanban-auto-scroll.ts @@ -0,0 +1,17 @@ +import { useEffect, RefObject } from "react"; +import { autoScrollForElements } from "@atlaskit/pragmatic-drag-and-drop-auto-scroll/element"; + +export function useKanbanAutoScroll( + ref: RefObject, + canScroll: ({ + source, + }: { + source: { data: Record }; + }) => boolean = () => true, +) { + useEffect(() => { + const el = ref.current; + if (!el) return; + return autoScrollForElements({ element: el, canScroll }); + }, [ref, canScroll]); +}