2021-01-01 02:06:56 +00:00
|
|
|
import { useEffect, useState, useRef, useCallback } from "react";
|
2020-12-05 06:16:06 +00:00
|
|
|
|
2021-01-01 02:06:56 +00:00
|
|
|
import useDebounce from "./useDebounce";
|
|
|
|
|
|
|
|
function useNetworkedState(
|
|
|
|
defaultState,
|
|
|
|
session,
|
|
|
|
eventName,
|
|
|
|
debounceRate = 100
|
|
|
|
) {
|
2020-12-05 06:16:06 +00:00
|
|
|
const [state, _setState] = useState(defaultState);
|
|
|
|
// Used to control whether the state needs to be sent to the socket
|
2021-01-01 02:06:56 +00:00
|
|
|
const dirtyRef = useRef(false);
|
2020-12-05 06:16:06 +00:00
|
|
|
|
|
|
|
// Update dirty at the same time as state
|
2020-12-31 06:56:51 +00:00
|
|
|
const setState = useCallback((update, sync = true) => {
|
2020-12-05 06:16:06 +00:00
|
|
|
_setState(update);
|
2021-01-01 02:06:56 +00:00
|
|
|
dirtyRef.current = sync;
|
2020-12-31 06:56:51 +00:00
|
|
|
}, []);
|
2020-12-05 06:16:06 +00:00
|
|
|
|
2021-01-01 02:06:56 +00:00
|
|
|
const eventNameRef = useRef(eventName);
|
|
|
|
useEffect(() => {
|
|
|
|
eventNameRef.current = eventName;
|
|
|
|
}, [eventName]);
|
|
|
|
|
|
|
|
const debouncedState = useDebounce(state, debounceRate);
|
2020-12-05 06:16:06 +00:00
|
|
|
useEffect(() => {
|
2021-01-01 02:06:56 +00:00
|
|
|
if (session.socket && dirtyRef.current) {
|
|
|
|
session.socket.emit(eventName, debouncedState);
|
|
|
|
dirtyRef.current = false;
|
2020-12-05 06:16:06 +00:00
|
|
|
}
|
2021-01-01 02:06:56 +00:00
|
|
|
}, [session.socket, eventName, debouncedState]);
|
2020-12-05 06:16:06 +00:00
|
|
|
|
2020-12-11 02:24:39 +00:00
|
|
|
useEffect(() => {
|
|
|
|
function handleSocketEvent(data) {
|
|
|
|
_setState(data);
|
|
|
|
}
|
|
|
|
|
2021-01-01 01:44:56 +00:00
|
|
|
session.socket?.on(eventName, handleSocketEvent);
|
2020-12-11 02:24:39 +00:00
|
|
|
return () => {
|
2021-01-01 01:44:56 +00:00
|
|
|
session.socket?.off(eventName, handleSocketEvent);
|
2020-12-11 02:24:39 +00:00
|
|
|
};
|
2020-12-31 06:56:51 +00:00
|
|
|
}, [session.socket, eventName]);
|
2020-12-11 02:24:39 +00:00
|
|
|
|
2020-12-05 06:16:06 +00:00
|
|
|
return [state, setState];
|
|
|
|
}
|
|
|
|
|
|
|
|
export default useNetworkedState;
|