on d317e13 help sign in
bridge/src/store/pointCursor.js
53 lines 1.3 kB history raw
1import React, {
2 createContext,
3 forwardRef,
4 useCallback,
5 useContext,
6 useState,
7} from 'react';
8import { Nothing } from 'folktale/maybe';
9import { useRollerStore } from './rollerStore';
11export const PointCursorContext = createContext(null);
13// pointCursor is Maybe<number>
14function _usePointCursor(initialPointCursor = Nothing()) {
15 const [pointCursor, setPointCursor] = useState(initialPointCursor);
16 const { setPoint } = useRollerStore();
18 const handleSetPointCursor = useCallback(
19 point => {
20 setPoint(Number(point?.value));
21 setPointCursor(point);
22 },
23 [setPoint, setPointCursor]
24 );
26 return {
27 pointCursor,
28 setPointCursor: handleSetPointCursor,
29 };
32export function PointCursorProvider({ initialPointCursor, children }) {
33 const pointCursor = _usePointCursor(initialPointCursor);
35 return (
36 <PointCursorContext.Provider value={pointCursor}>
37 {children}
38 </PointCursorContext.Provider>
39 );
42// Hook version
43export function usePointCursor() {
44 return useContext(PointCursorContext);
47// HOC version
48export const withPointCursor = Component =>
49 forwardRef((props, ref) => (
50 <PointCursorContext.Consumer>
51 {pointCursor => <Component ref={ref} {...pointCursor} {...props} />}
52 </PointCursorContext.Consumer>
53 ));