mirror of
https://git.rezel.net/LudoTech/traque.git
synced 2026-04-10 16:30:18 +02:00
61 lines
1.8 KiB
JavaScript
61 lines
1.8 KiB
JavaScript
// React
|
|
import { useState, useEffect, useCallback, useRef } from 'react';
|
|
// Hook
|
|
import { useLocalStorage } from './useLocalStorage';
|
|
// Services
|
|
import { emitLogin, emitLogout } from "../services/socketEmitter";
|
|
|
|
export const useSocketAuth = () => {
|
|
const [loggedIn, setLoggedIn] = useState(false);
|
|
const [savedPassword, setSavedPassword] = useLocalStorage("team_password", null);
|
|
const isMounted = useRef(true);
|
|
|
|
useEffect(() => {
|
|
isMounted.current = true;
|
|
return () => {
|
|
isMounted.current = false;
|
|
};
|
|
}, []);
|
|
|
|
const login = useCallback((password) => {
|
|
return new Promise((resolve, reject) => {
|
|
const timeout = setTimeout(() => {
|
|
if (!isMounted.current) return;
|
|
console.warn("Server did not respond to login emit.");
|
|
reject();
|
|
}, 2000);
|
|
|
|
emitLogin(password, (response) => {
|
|
clearTimeout(timeout);
|
|
|
|
if (!isMounted.current) return;
|
|
|
|
if (response.isLoggedIn) {
|
|
console.log("Log in accepted.");
|
|
setLoggedIn(true);
|
|
setSavedPassword(password);
|
|
resolve(response);
|
|
} else {
|
|
console.log("Log in refused.");
|
|
setLoggedIn(false);
|
|
reject();
|
|
}
|
|
});
|
|
});
|
|
}, [setSavedPassword]);
|
|
|
|
useEffect(() => {
|
|
if (!loggedIn && savedPassword) {
|
|
login(savedPassword);
|
|
}
|
|
}, [loggedIn, login, savedPassword]);
|
|
|
|
const logout = useCallback(() => {
|
|
setLoggedIn(false);
|
|
setSavedPassword(null);
|
|
emitLogout();
|
|
}, [setSavedPassword]);
|
|
|
|
return {login, logout, password: savedPassword, loggedIn};
|
|
};
|