Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 71 additions & 19 deletions src/web-view/src/components/group-command-list.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,23 @@
import { Plus, FolderPlus } from "lucide-react";
import { useCallback, useMemo } from "react";
import {
DndContext,
closestCenter,
KeyboardSensor,
PointerSensor,
useSensor,
type DragEndEvent,
} from "@dnd-kit/core";
import {
arrayMove,
SortableContext,
sortableKeyboardCoordinates,
verticalListSortingStrategy,
} from "@dnd-kit/sortable";
import { type ButtonConfig } from "../types";
import { Button } from "~/core";
import { GroupCommandItem } from "./group-command-item";
import { useCommandOperations } from "../hooks/use-command-operations";
import { useSortableList } from "../hooks/use-sortable-list";

const MAX_NESTING_DEPTH = 2; // 0-indexed, so 3 levels total (0,1,2)

Expand Down Expand Up @@ -31,11 +45,40 @@ export const GroupCommandList = ({
addGroup,
} = useCommandOperations(commands, onChange);

const { SortableWrapper } = useSortableList({
items: commands,
onReorder: onChange,
const pointerSensor = useSensor(PointerSensor, {
activationConstraint: {
distance: 8,
},
});

const keyboardSensor = useSensor(KeyboardSensor, {
coordinateGetter: sortableKeyboardCoordinates,
});

const sensors = useMemo(() => [pointerSensor, keyboardSensor], [pointerSensor, keyboardSensor]);

const sortableItemIds = useMemo(() =>
commands.map((_, index) => `${index}`),
[commands]
);

const handleDragEnd = useCallback(
(event: DragEndEvent) => {
const { active, over } = event;

if (over && active.id !== over.id) {
const oldIndex = Number(active.id);
const newIndex = Number(over.id);

if (!isNaN(oldIndex) && !isNaN(newIndex)) {
const newItems = arrayMove(commands, oldIndex, newIndex);
onChange(newItems);
}
}
},
[commands, onChange]
);

return (
<div className="space-y-4">
{title && (
Expand All @@ -44,21 +87,30 @@ export const GroupCommandList = ({
</div>
)}

<SortableWrapper>
<div className="space-y-3">
{commands.map((command, index) => (
<GroupCommandItem
key={index}
id={`${index}`}
command={command}
index={index}
onUpdate={updateCommand}
onDelete={deleteCommand}
onEditGroup={onEditGroup ? () => onEditGroup(index) : undefined}
/>
))}
</div>
</SortableWrapper>
<DndContext
sensors={sensors}
collisionDetection={closestCenter}
onDragEnd={handleDragEnd}
>
<SortableContext
items={sortableItemIds}
strategy={verticalListSortingStrategy}
>
<div className="space-y-3">
{commands.map((command, index) => (
<GroupCommandItem
key={index}
id={`${index}`}
command={command}
index={index}
onUpdate={updateCommand}
onDelete={deleteCommand}
onEditGroup={onEditGroup ? () => onEditGroup(index) : undefined}
/>
))}
</div>
</SortableContext>
</DndContext>

<div className="flex gap-2">
<Button
Expand Down