Fix dnd on touch devices

This commit is contained in:
schroda
2025-07-08 22:37:57 +02:00
parent 8783956fbc
commit 74f0fec02d
2 changed files with 38 additions and 4 deletions

View File

@@ -16,7 +16,7 @@ import {
SensorOptions,
useSensors,
} from '@dnd-kit/core';
import { AbstractPointerSensorOptions } from '@dnd-kit/core/dist/sensors';
import { AbstractPointerSensorOptions, PointerActivationConstraint } from '@dnd-kit/core/dist/sensors';
import { MediaQuery } from '@/modules/core/utils/MediaQuery.tsx';
export class DndKitUtil {
@@ -28,11 +28,38 @@ export class DndKitUtil {
return MouseSensor;
}
static useGetSensorForDevice(): Sensor<PointerSensorOptions> {
MediaQuery.useIsTouchDevice();
return DndKitUtil.getSensorForDevice();
}
static useGetActivationConstraintForDevice(): PointerActivationConstraint {
const isTouchDevice = MediaQuery.useIsTouchDevice();
if (isTouchDevice) {
return {
delay: 300,
tolerance: 8,
};
}
return {
distance: 8,
};
}
static useSensorsForDevice(options?: AbstractPointerSensorOptions): SensorDescriptor<SensorOptions>[] {
const sensor = DndKitUtil.useGetSensorForDevice();
const activationConstraint = DndKitUtil.useGetActivationConstraintForDevice();
return useSensors(
useSensor(DndKitUtil.getSensorForDevice(), {
useSensor(sensor, {
...options,
activationConstraint: { distance: 15, ...options?.activationConstraint },
activationConstraint: {
...activationConstraint,
...options?.activationConstraint,
},
}),
);
}