Files
traque/mobile/traque-app/hook/useSocketAuth.jsx
2026-02-18 00:38:10 +01:00

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};
};