Refactoring

This commit is contained in:
Sebastien Riviere
2026-02-18 10:57:08 +01:00
parent 4d8dcd241c
commit 776bbcd723
23 changed files with 191 additions and 265 deletions

View File

@@ -0,0 +1,80 @@
// React
import { createContext, useContext, useState, useEffect, useCallback, useMemo } from "react";
import DeviceInfo from 'react-native-device-info';
// Hook
import { useLocalStorage } from '../hooks/useLocalStorage';
// Services
import { emitLogin, emitLogout, emitBattery, emitDeviceInfo } from "../services/socket/emitters";
const AuthContext = createContext();
export const AuthProvider = ({ children }) => {
const [loggedIn, setLoggedIn] = useState(false);
const [teamId, setTeamId] = useLocalStorage("team_id", null);
const login = useCallback(async (password) => {
if (loggedIn != false) return;
try {
const response = await emitLogin(password);
setLoggedIn(response.isLoggedIn);
if (response.isLoggedIn) setTeamId(password);
return response.isLoggedIn;
} catch (error) {
setLoggedIn(false);
throw error;
}
}, [loggedIn, setTeamId]);
const logout = useCallback(() => {
if (loggedIn != true) return;
setLoggedIn(false);
setTeamId(null);
emitLogout();
}, [loggedIn, setTeamId]);
// Try to log in with saved teamId
useEffect(() => {
if (!loggedIn && teamId) {
login(teamId);
}
}, [loggedIn, teamId, login]);
// Emit battery level and phone model at log in
useEffect(() => {
if (!loggedIn) return;
const sendInfo = async () => {
const [brand, model, name] = await Promise.all([
DeviceInfo.getBrand(),
DeviceInfo.getModel(),
DeviceInfo.getDeviceName()
]);
emitDeviceInfo({model: brand + " " + model, name: name});
};
const sendBattery = async () => {
const level = await DeviceInfo.getBatteryLevel();
emitBattery(Math.round(level * 100));
};
sendInfo();
sendBattery();
const batteryCheckInterval = setInterval(() => sendBattery(), 5*60*1000); // 5 minutes
return () => clearInterval(batteryCheckInterval);
}, [loggedIn]);
const value = useMemo(() => ({ teamId, loggedIn, login, logout}), [teamId, loggedIn, login, logout]);
return (
<AuthContext.Provider value={value}>
{children}
</AuthContext.Provider>
);
};
export const useAuth = () => {
return useContext(AuthContext);
};

View File

@@ -0,0 +1,72 @@
// React
import { createContext, useContext, useMemo, useState, useEffect } from "react";
// Context
import { useAuth } from "./authContext";
// Services
import { socket } from "../services/socket/connection";
// Constants
import { GAME_STATE } from "../constants";
const TeamContext = createContext();
const useOnEvent = (event, callback) => {
useEffect(() => {
socket.on(event, callback);
return () => {
socket.off(event, callback);
};
}, [event, callback]);
};
export const TeamProvider = ({children}) => {
const { logout } = useAuth();
// update_team
const [teamInfos, setTeamInfos] = useState({});
// game_state
const [gameState, setGAME_STATE] = useState(GAME_STATE.SETUP);
const [startDate, setStartDate] = useState(null);
// current_zone
const [zoneExtremities, setZoneExtremities] = useState(null);
const [nextZoneDate, setNextZoneDate] = useState(null);
// settings
const [messages, setMessages] = useState(null);
const [zoneType, setZoneType] = useState(null);
useOnEvent("update_team", (data) => {
setTeamInfos(teamInfos => ({...teamInfos, ...data}));
});
useOnEvent("game_state", (data) => {
setGAME_STATE(data.state);
setStartDate(data.date);
});
useOnEvent("settings", (data) => {
setMessages(data.messages);
setZoneType(data.zone.type);
//TODO
//setSendPositionDelay(data.sendPositionDelay);
//setOutOfZoneDelay(data.outOfZoneDelay);
});
useOnEvent("current_zone", (data) => {
setZoneExtremities({begin: data.begin, end: data.end});
setNextZoneDate(data.endDate);
});
useOnEvent("logout", logout);
const value = useMemo(() => (
{teamInfos, gameState, startDate, zoneType, zoneExtremities, nextZoneDate, messages}
), [teamInfos, gameState, startDate, zoneType, zoneExtremities, nextZoneDate, messages]);
return (
<TeamContext.Provider value={value}>
{children}
</TeamContext.Provider>
);
};
export const useTeam = () => {
return useContext(TeamContext);
};