Skip to content

Commit 243bc54

Browse files
committed
migrated from react-sortable-hoc to dnd-kit
1 parent 191e8d5 commit 243bc54

File tree

4 files changed

+84
-27
lines changed

4 files changed

+84
-27
lines changed

packages/naksha-mapbox-list/package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,17 @@
3434
"typescript": "^4.7.3"
3535
},
3636
"dependencies": {
37-
"@bumaga/tabs": "^0.2.0",
3837
"@biodiv-platform/naksha-commons": "*",
38+
"@bumaga/tabs": "^0.2.0",
39+
"@dnd-kit/core": "^6.3.1",
40+
"@dnd-kit/sortable": "^10.0.0",
41+
"@dnd-kit/utilities": "^3.2.2",
3942
"boundingbox": "^1.4.0",
4043
"clsx": "^1.1.1",
4144
"colorbrewer": "^1.5.2",
4245
"geohash": "^0.0.1",
4346
"highlight-search-result": "^1.0.4",
4447
"immer": "^9.0.15",
45-
"react-sortable-hoc": "^2.0.0",
4648
"react-tiny-popover": "^7.0.1",
4749
"react-virtual": "^2.10.4",
4850
"react-virtualized-auto-sizer": "^1.0.6",

packages/naksha-mapbox-list/src/components/sidebar/common/layer-item.tsx

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { useT } from "@biodiv-platform/naksha-commons";
22
import React, { useMemo, useState } from "react";
3-
import { SortableHandle } from "react-sortable-hoc";
43
import { RWebShare } from "react-web-share";
54
import { tw } from "twind";
65

@@ -25,20 +24,19 @@ import GridLegend from "./grid-legend";
2524
import { PopoverWrapper } from "./info-popover";
2625
import LayerItemStyle from "./layer-item-style";
2726

28-
const DragHandle = SortableHandle(() => (
29-
<div className={tw`mt-1 w-6 text-center cursor-move`}>
30-
<GrabberIcon />
31-
</div>
32-
));
33-
3427
interface LayerItemProps {
3528
item: GeoserverLayer;
3629
extended?: boolean;
30+
dragHandleProps?: any;
3731
}
3832

3933
declare const window;
4034

41-
export default function LayerItem({ item, extended }: LayerItemProps) {
35+
export default function LayerItem({
36+
item,
37+
extended,
38+
dragHandleProps,
39+
}: LayerItemProps) {
4240
const { t } = useT();
4341
const {
4442
layer,
@@ -97,7 +95,14 @@ export default function LayerItem({ item, extended }: LayerItemProps) {
9795
onChange={onToggleLayer}
9896
isLoading={isLoading}
9997
/>
100-
{extended && <DragHandle />}
98+
{extended && (
99+
<div
100+
className={tw`mt-1 w-6 text-center cursor-move`}
101+
{...dragHandleProps}
102+
>
103+
<GrabberIcon />
104+
</div>
105+
)}
101106
</div>
102107
<img
103108
className={tw`flex-shrink-0 overflow-hidden h-16 w-16 p-1 mb-2 object-cover border border-gray-200 rounded`}

packages/naksha-mapbox-list/src/components/sidebar/selected/index.tsx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { arrayMoveImmutable } from "../../../utils/array-move";
22
import React from "react";
3-
43
import useLayers from "../../../hooks/use-layers";
54
import { SelectedItemList } from "./selected-item-list";
65
import { Button } from "../../core";
@@ -11,7 +10,7 @@ export default function SelectedTabPanel() {
1110
const { layer } = useLayers();
1211
const { t } = useT();
1312

14-
const onSortEnd = ({ oldIndex, newIndex }) => {
13+
const handleSortEnd = (oldIndex: number, newIndex: number) => {
1514
layer.setSelectedIds(
1615
arrayMoveImmutable(layer.selectedIds, oldIndex, newIndex)
1716
);
@@ -26,8 +25,7 @@ export default function SelectedTabPanel() {
2625
)}
2726
<SelectedItemList
2827
layerList={layer.selectedLayers}
29-
useDragHandle={true}
30-
onSortEnd={onSortEnd}
28+
onSortEnd={handleSortEnd}
3129
/>
3230
</div>
3331
);
Lines changed: 64 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,68 @@
11
import React from "react";
2-
import { SortableContainer, SortableElement } from "react-sortable-hoc";
3-
2+
import {
3+
SortableContext,
4+
useSortable,
5+
verticalListSortingStrategy,
6+
} from "@dnd-kit/sortable";
7+
import { CSS } from "@dnd-kit/utilities";
8+
import { DndContext } from "@dnd-kit/core";
49
import LayerItem from "../common/layer-item";
10+
import { GeoserverLayer } from "../../../interfaces";
11+
12+
export const SelectedItem = ({
13+
item,
14+
extended,
15+
}: {
16+
item: GeoserverLayer;
17+
extended: boolean;
18+
}) => {
19+
const { attributes, listeners, setNodeRef, transform, transition } =
20+
useSortable({ id: item.id });
21+
22+
const style = {
23+
transform: CSS.Transform.toString(transform),
24+
transition,
25+
};
26+
27+
return (
28+
<div ref={setNodeRef} style={style}>
29+
<LayerItem
30+
item={item}
31+
extended={extended}
32+
dragHandleProps={{ ...attributes, ...listeners }}
33+
/>
34+
</div>
35+
);
36+
};
37+
38+
interface SelectedItemListProps {
39+
layerList: GeoserverLayer[];
40+
onSortEnd: (oldIndex: number, newIndex: number) => void;
41+
}
542

6-
export const SelectedItem = SortableElement(({ item, extended }) => (
7-
<LayerItem item={item} extended={extended} />
8-
));
43+
export const SelectedItemList = ({
44+
layerList,
45+
onSortEnd,
46+
}: SelectedItemListProps) => {
47+
const handleDragEnd = (event: any) => {
48+
const { active, over } = event;
49+
if (over && active.id !== over.id) {
50+
const oldIndex = layerList.findIndex((item) => item.id === active.id);
51+
const newIndex = layerList.findIndex((item) => item.id === over.id);
52+
onSortEnd(oldIndex, newIndex);
53+
}
54+
};
955

10-
export const SelectedItemList = SortableContainer(({ layerList }) => (
11-
<div>
12-
{layerList.map((item, index) => (
13-
<SelectedItem key={item.id} index={index} item={item} extended={true} />
14-
))}
15-
</div>
16-
));
56+
return (
57+
<DndContext onDragEnd={handleDragEnd}>
58+
<SortableContext
59+
items={layerList.map((item) => item.id)}
60+
strategy={verticalListSortingStrategy}
61+
>
62+
{layerList.map((item) => (
63+
<SelectedItem key={item.id} item={item} extended={true} />
64+
))}
65+
</SortableContext>
66+
</DndContext>
67+
);
68+
};

0 commit comments

Comments
 (0)