-
Notifications
You must be signed in to change notification settings - Fork 0
/
useShakeAmount.ts
46 lines (35 loc) · 1.14 KB
/
useShakeAmount.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import { useCallback, useEffect, useMemo, useRef, useState } from "react"
import { useAcceleration } from "./useAcceleration"
/**
* 端末を振った量を計算する
*/
export const useShakeAmount = (start = true) => {
const { acceleration, requirePermission } = useAcceleration()
const [shakeAmount, setShakeAmount] = useState(0)
const deltas = useRef<number[]>([])
deltas.current.push((acceleration.x ** 2 + acceleration.y ** 2 + acceleration.z ** 2) / 5)
useEffect(() => {
if (!start) {
return
}
const timer = setInterval(() => {
if (deltas.current.length < 10) {
return
}
const deltaSum = deltas.current.reduce((acc, c) => acc + c, 0) / deltas.current.length
if (Number.isNaN(deltaSum)) {
return
}
setShakeAmount((prev) => prev + deltaSum)
deltas.current = []
}, 300)
return () => clearInterval(timer)
}, [start])
const resetAmount = useCallback(() => {
setShakeAmount(0)
}, [])
return useMemo(
() => ({ resetAmount, shakeAmount, acceleration, requirePermission }),
[resetAmount, shakeAmount, acceleration, requirePermission],
)
}