Add mouse and keyboard control scroll. Add auto homing when window resize. #19

Merged
FatttSnake merged 2 commits from FatttSnake into dev 2023-09-13 23:45:46 +08:00

View File

@@ -1,4 +1,4 @@
import React from 'react' import React, { useEffect } from 'react'
import FitFullScreen from '@/components/common/FitFullScreen' import FitFullScreen from '@/components/common/FitFullScreen'
import FitCenter from '@/components/common/FitCenter' import FitCenter from '@/components/common/FitCenter'
import { MainFrameworkContext } from '@/pages/MainFramework' import { MainFrameworkContext } from '@/pages/MainFramework'
@@ -13,7 +13,7 @@ const Home: React.FC = () => {
const fitFullScreenRef = useRef<HTMLDivElement>(null) const fitFullScreenRef = useRef<HTMLDivElement>(null)
const scrollTimeout = useRef(0) const scrollTimeout = useRef(0)
const touchStart = useRef(0) const clickStart = useRef(0)
const [currentContent, setCurrentContent] = useState(0) const [currentContent, setCurrentContent] = useState(0)
@@ -24,6 +24,14 @@ const Home: React.FC = () => {
}) })
}, [setNavbarHidden, setPreventScroll]) }, [setNavbarHidden, setPreventScroll])
useLayoutEffect(() => {
const handleWindowResize = () => {
handleScrollToContent(currentContent)()
}
window.addEventListener('resize', handleWindowResize)
return () => window.removeEventListener('resize', handleWindowResize)
})
const handleScrollToContent = (index: number) => { const handleScrollToContent = (index: number) => {
return () => { return () => {
if (!index) { if (!index) {
@@ -73,11 +81,11 @@ const Home: React.FC = () => {
} }
const handleTouchStart = (event: React.TouchEvent) => { const handleTouchStart = (event: React.TouchEvent) => {
touchStart.current = event.touches[0].clientY clickStart.current = event.touches[0].clientY
} }
const handleTouchEnd = (event: React.TouchEvent) => { const handleTouchEnd = (event: React.TouchEvent) => {
const moveLength = touchStart.current - event.changedTouches[0].clientY const moveLength = clickStart.current - event.changedTouches[0].clientY
if (Math.abs(moveLength) < 100) { if (Math.abs(moveLength) < 100) {
return return
} }
@@ -89,6 +97,32 @@ const Home: React.FC = () => {
} }
} }
const handleMouseDown = (event: React.MouseEvent) => {
clickStart.current = event.clientY
}
const handleMouseUp = (event: React.MouseEvent) => {
const moveLength = clickStart.current - event.clientY
if (Math.abs(moveLength) < 100) {
return
}
if (moveLength > 0) {
handleScrollDown()
} else {
handleScrollUp()
}
}
const handleKeyDown = (event: React.KeyboardEvent) => {
if (event.key === 'ArrowUp') {
handleScrollUp()
}
if (event.key === 'ArrowDown') {
handleScrollDown()
}
}
const content = [ const content = [
{ {
backgroundColor: '#FBFBFB', backgroundColor: '#FBFBFB',
@@ -101,7 +135,15 @@ const Home: React.FC = () => {
return ( return (
<> <>
<div onWheel={handleWheel} onTouchStart={handleTouchStart} onTouchEnd={handleTouchEnd}> <div
tabIndex={0}
onWheel={handleWheel}
onTouchStart={handleTouchStart}
onTouchEnd={handleTouchEnd}
onMouseDown={handleMouseDown}
onMouseUp={handleMouseUp}
onKeyDown={handleKeyDown}
>
{content.map((element, index) => { {content.map((element, index) => {
return <FitFullScreen key={index} {...element} /> return <FitFullScreen key={index} {...element} />
})} })}