1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- import React from "react";
- import { useC2C } from "./useC2C";
- import randomColor from "randomcolor";
- import debounce from "lodash.debounce";
- import { atom, useRecoilState } from "recoil";
- const getUser = () => {
- if (localStorage.user) {
- const localUser = {
- name: "Player",
- color: randomColor({ luminosity: "dark" }),
- ...JSON.parse(localStorage.user),
- };
- // Id is given by server
- delete localUser.id;
- persistUser(localUser);
- return localUser;
- }
- const newUser = {
- name: "Player",
- color: randomColor({ luminosity: "dark" }),
- };
- persistUser(newUser);
- return newUser;
- };
- const persistUser = (user) => {
- localStorage.setItem("user", JSON.stringify(user));
- };
- export const userAtom = atom({
- key: "user",
- default: getUser(),
- });
- function useUser() {
- const [user, setUserState] = useRecoilState(userAtom);
- const [c2c, joined] = useC2C();
- React.useEffect(() => {
- if (joined) {
- setUserState((prevUser) => ({
- ...prevUser,
- id: c2c.userId,
- }));
- }
- }, [joined, c2c.userId, setUserState]);
- const setUser = React.useCallback(
- (newUser) => {
- setUserState((prevUser) => ({ ...newUser, id: prevUser.id }));
- persistUser(newUser);
- },
- [setUserState]
- );
- // eslint-disable-next-line react-hooks/exhaustive-deps
- const debouncedEmitUpdateUser = React.useCallback(
- debounce((newUser) => {
- c2c.publish("userUpdate", newUser, true);
- }, 500),
- [c2c]
- );
- React.useEffect(() => {
- if (user && user.id) {
- debouncedEmitUpdateUser(user);
- }
- }, [user, debouncedEmitUpdateUser]);
- return [user, setUser];
- }
- export default useUser;
|