4 changed files with 90 additions and 8 deletions
@ -1,17 +1,63 @@ |
|||||||
import { useFavoriteRelays } from '@/providers/FavoriteRelaysProvider' |
import { useFavoriteRelays } from '@/providers/FavoriteRelaysProvider' |
||||||
|
import { |
||||||
|
closestCenter, |
||||||
|
DndContext, |
||||||
|
DragEndEvent, |
||||||
|
KeyboardSensor, |
||||||
|
PointerSensor, |
||||||
|
useSensor, |
||||||
|
useSensors |
||||||
|
} from '@dnd-kit/core' |
||||||
|
import { restrictToParentElement, restrictToVerticalAxis } from '@dnd-kit/modifiers' |
||||||
|
import { |
||||||
|
arrayMove, |
||||||
|
SortableContext, |
||||||
|
sortableKeyboardCoordinates, |
||||||
|
verticalListSortingStrategy |
||||||
|
} from '@dnd-kit/sortable' |
||||||
import { useTranslation } from 'react-i18next' |
import { useTranslation } from 'react-i18next' |
||||||
import RelayItem from './RelayItem' |
import RelayItem from './RelayItem' |
||||||
|
|
||||||
export default function FavoriteRelayList() { |
export default function FavoriteRelayList() { |
||||||
const { t } = useTranslation() |
const { t } = useTranslation() |
||||||
const { favoriteRelays } = useFavoriteRelays() |
const { favoriteRelays, reorderFavoriteRelays } = useFavoriteRelays() |
||||||
|
|
||||||
|
const sensors = useSensors( |
||||||
|
useSensor(PointerSensor), |
||||||
|
useSensor(KeyboardSensor, { |
||||||
|
coordinateGetter: sortableKeyboardCoordinates |
||||||
|
}) |
||||||
|
) |
||||||
|
|
||||||
|
const handleDragEnd = (event: DragEndEvent) => { |
||||||
|
const { active, over } = event |
||||||
|
|
||||||
|
if (over && active.id !== over.id) { |
||||||
|
const oldIndex = favoriteRelays.findIndex((relay) => relay === active.id) |
||||||
|
const newIndex = favoriteRelays.findIndex((relay) => relay === over.id) |
||||||
|
|
||||||
|
const reorderedRelays = arrayMove(favoriteRelays, oldIndex, newIndex) |
||||||
|
reorderFavoriteRelays(reorderedRelays) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
return ( |
return ( |
||||||
<div className="space-y-2"> |
<div className="space-y-2"> |
||||||
<div className="text-muted-foreground font-semibold select-none">{t('Relays')}</div> |
<div className="text-muted-foreground font-semibold select-none">{t('Relays')}</div> |
||||||
|
<DndContext |
||||||
|
sensors={sensors} |
||||||
|
collisionDetection={closestCenter} |
||||||
|
onDragEnd={handleDragEnd} |
||||||
|
modifiers={[restrictToVerticalAxis, restrictToParentElement]} |
||||||
|
> |
||||||
|
<SortableContext items={favoriteRelays} strategy={verticalListSortingStrategy}> |
||||||
|
<div className="grid gap-2"> |
||||||
{favoriteRelays.map((relay) => ( |
{favoriteRelays.map((relay) => ( |
||||||
<RelayItem key={relay} relay={relay} /> |
<RelayItem key={relay} relay={relay} /> |
||||||
))} |
))} |
||||||
</div> |
</div> |
||||||
|
</SortableContext> |
||||||
|
</DndContext> |
||||||
|
</div> |
||||||
) |
) |
||||||
} |
} |
||||||
|
|||||||
Loading…
Reference in new issue