Use touches instead of dnd on mobile
Browsers don't support drag events for touch devices. To have a consistent implementation for desktop and mobile, we would need to use mousedown/touchstart, mouseup/touchend and mousemove/touchmove. For now, this commit makes changing the order possible on touch devices with simple touches.
This commit is contained in:
		
							parent
							
								
									5d678ced23
								
							
						
					
					
						commit
						2051dd0e88
					
				@ -10,12 +10,28 @@ const WalletCard = dynamic(() => import('@/components/wallet-card'), { ssr: fals
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
export const getServerSideProps = getGetServerSideProps({ authRequired: true })
 | 
					export const getServerSideProps = getGetServerSideProps({ authRequired: true })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async function reorder (wallets, sourceIndex, targetIndex) {
 | 
				
			||||||
 | 
					  const newOrder = [...wallets]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const [source] = newOrder.splice(sourceIndex, 1)
 | 
				
			||||||
 | 
					  const newTargetIndex = sourceIndex < targetIndex ? targetIndex - 1 : targetIndex
 | 
				
			||||||
 | 
					  const append = sourceIndex < targetIndex
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  newOrder.splice(newTargetIndex + (append ? 1 : 0), 0, source)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  await Promise.all(
 | 
				
			||||||
 | 
					    newOrder.map((w, i) =>
 | 
				
			||||||
 | 
					      w.setPriority(i).catch(console.error)
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default function Wallet ({ ssrData }) {
 | 
					export default function Wallet ({ ssrData }) {
 | 
				
			||||||
  const { wallets } = useWallets()
 | 
					  const { wallets } = useWallets()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const [mounted, setMounted] = useState(false)
 | 
					  const [mounted, setMounted] = useState(false)
 | 
				
			||||||
  const [sourceIndex, setSourceIndex] = useState()
 | 
					  const [sourceIndex, setSourceIndex] = useState(null)
 | 
				
			||||||
  const [targetIndex, setTargetIndex] = useState()
 | 
					  const [targetIndex, setTargetIndex] = useState(null)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  useEffect(() => {
 | 
					  useEffect(() => {
 | 
				
			||||||
    // mounted is required since draggable is false
 | 
					    // mounted is required since draggable is false
 | 
				
			||||||
@ -43,19 +59,16 @@ export default function Wallet ({ ssrData }) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if (sourceIndex === targetIndex) return
 | 
					    if (sourceIndex === targetIndex) return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const newOrder = [...wallets]
 | 
					    await reorder(wallets, sourceIndex, targetIndex)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const [source] = newOrder.splice(sourceIndex, 1)
 | 
					  const onTouchStart = (i) => async (e) => {
 | 
				
			||||||
    const newTargetIndex = sourceIndex < targetIndex ? targetIndex - 1 : targetIndex
 | 
					    if (sourceIndex !== null) {
 | 
				
			||||||
    const append = sourceIndex < targetIndex
 | 
					      await reorder(wallets, sourceIndex, i)
 | 
				
			||||||
 | 
					      setSourceIndex(null)
 | 
				
			||||||
    newOrder.splice(newTargetIndex + (append ? 1 : 0), 0, source)
 | 
					    } else {
 | 
				
			||||||
 | 
					      setSourceIndex(i)
 | 
				
			||||||
    await Promise.all(
 | 
					    }
 | 
				
			||||||
      newOrder.map((w, i) =>
 | 
					 | 
				
			||||||
        w.setPriority(i).catch(console.error)
 | 
					 | 
				
			||||||
      )
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
@ -91,12 +104,14 @@ export default function Wallet ({ ssrData }) {
 | 
				
			|||||||
            })
 | 
					            })
 | 
				
			||||||
            .map((w, i) => {
 | 
					            .map((w, i) => {
 | 
				
			||||||
              const draggable = mounted && w.enabled
 | 
					              const draggable = mounted && w.enabled
 | 
				
			||||||
 | 
					
 | 
				
			||||||
              return (
 | 
					              return (
 | 
				
			||||||
                <div
 | 
					                <div
 | 
				
			||||||
                  key={w.name}
 | 
					                  key={w.name}
 | 
				
			||||||
                  draggable={draggable}
 | 
					                  draggable={draggable}
 | 
				
			||||||
                  style={{ cursor: draggable ? 'move' : 'default' }}
 | 
					                  style={{ cursor: draggable ? 'move' : 'default' }}
 | 
				
			||||||
                  onDragStart={draggable ? onDragStart(i) : undefined}
 | 
					                  onDragStart={draggable ? onDragStart(i) : undefined}
 | 
				
			||||||
 | 
					                  onTouchStart={draggable ? onTouchStart(i) : undefined}
 | 
				
			||||||
                  onDragEnter={draggable ? onDragEnter(i) : undefined}
 | 
					                  onDragEnter={draggable ? onDragEnter(i) : undefined}
 | 
				
			||||||
                  className={
 | 
					                  className={
 | 
				
			||||||
                    !draggable
 | 
					                    !draggable
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user