.add touch events to useResizeColumns (#1748)

.add onTouchStart to mergeProps
.add touch-action css to resizer
.mod increase resizer width or it is very hard to activate using touch devices
This commit is contained in:
Jakob Hjelmer Nielsen 2019-12-10 14:39:02 +01:00 committed by Tanner Linsley
parent 9563dae006
commit ccc89379da
3 changed files with 87 additions and 18 deletions

View File

@ -17,5 +17,24 @@
"code": 8444 "code": 8444
} }
} }
},
"dist\\index.js": {
"bundled": 105386,
"minified": 49565,
"gzipped": 13008
},
"dist\\index.es.js": {
"bundled": 104543,
"minified": 48815,
"gzipped": 12856,
"treeshaked": {
"rollup": {
"code": 80,
"import_statements": 21
},
"webpack": {
"code": 8444
}
}
} }
} }

View File

@ -35,18 +35,18 @@ const Styles = styled.div`
border-right: 0; border-right: 0;
} }
${'' /* The resizer styles! */}
.resizer { .resizer {
display: inline-block; display: inline-block;
background: blue; background: blue;
width: 5px; width: 10px;
height: 100%; height: 100%;
position: absolute; position: absolute;
right: 0; right: 0;
top: 0; top: 0;
transform: translateX(50%); transform: translateX(50%);
z-index: 1; z-index: 1;
${'' /* prevents from scrolling while dragging on touch devices */}
touch-action:none;
&.isResizing { &.isResizing {
background: red; background: red;

View File

@ -106,27 +106,76 @@ const useInstanceBeforeDimensions = instance => {
} }
}) })
const onMouseDown = (e, header) => { const onResizeStart = (e, header) => {
let isTouchEvent = false
if (e.type === 'touchstart') {
// lets not respond to multiple touches (e.g. 2 or 3 fingers)
if (e.touches && e.touches.length > 1) {
return
}
isTouchEvent = true
}
const headersToResize = getLeafHeaders(header) const headersToResize = getLeafHeaders(header)
const headerIdWidths = headersToResize.map(d => [d.id, d.totalWidth]) const headerIdWidths = headersToResize.map(d => [d.id, d.totalWidth])
const clientX = e.clientX const clientX = isTouchEvent ? Math.round(e.touches[0].clientX) : e.clientX
const onMouseMove = e => { const dispatchMove = clientXPos => {
const clientX = e.clientX dispatch({ type: actions.columnResizing, clientX: clientXPos })
}
const dispatchEnd = () => dispatch({ type: actions.columnDoneResizing })
dispatch({ type: actions.columnResizing, clientX }) const handlersAndEvents = {
mouse: {
moveEvent: 'mousemove',
moveHandler: e => dispatchMove(e.clientX),
upEvent: 'mouseup',
upHandler: e => {
document.removeEventListener(
'mousemove',
handlersAndEvents.mouse.moveHandler
)
document.removeEventListener(
'mouseup',
handlersAndEvents.mouse.upHandler
)
dispatchEnd()
},
},
touch: {
moveEvent: 'touchmove',
moveHandler: e => {
if (e.cancelable) {
e.preventDefault()
e.stopPropagation()
}
dispatchMove(e.touches[0].clientX)
return false
},
upEvent: 'touchend',
upHandler: e => {
document.removeEventListener(
handlersAndEvents.touch.moveEvent,
handlersAndEvents.touch.moveHandler
)
document.removeEventListener(
handlersAndEvents.touch.upEvent,
handlersAndEvents.touch.moveHandler
)
dispatchEnd()
},
},
} }
const onMouseUp = e => { const events = isTouchEvent
document.removeEventListener('mousemove', onMouseMove) ? handlersAndEvents.touch
document.removeEventListener('mouseup', onMouseUp) : handlersAndEvents.mouse
document.addEventListener(events.moveEvent, events.moveHandler, {
dispatch({ type: actions.columnDoneResizing }) passive: false,
} })
document.addEventListener(events.upEvent, events.upHandler, {
document.addEventListener('mousemove', onMouseMove) passive: false,
document.addEventListener('mouseup', onMouseUp) })
dispatch({ dispatch({
type: actions.columnStartResizing, type: actions.columnStartResizing,
@ -155,7 +204,8 @@ const useInstanceBeforeDimensions = instance => {
header.getResizerProps = userProps => { header.getResizerProps = userProps => {
return mergeProps( return mergeProps(
{ {
onMouseDown: e => e.persist() || onMouseDown(e, header), onMouseDown: e => e.persist() || onResizeStart(e, header),
onTouchStart: e => e.persist() || onResizeStart(e, header),
style: { style: {
cursor: 'ew-resize', cursor: 'ew-resize',
}, },