testes/src_2/features/rh/hooks/usePonto.js

72 lines
1.7 KiB
JavaScript

import { useState, useCallback } from 'react';
import { pontoService } from '../services/pontoService';
/**
* Hook customizado para o módulo de Ponto Eletrônico.
* Encapsula geolocalização e tratamentos de erro null-safe.
*/
export const usePonto = () => {
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
const [location, setLocation] = useState(null);
/**
* Obtém a localização atual do dispositivo.
*/
const getGeoLocation = useCallback(() => {
return new Promise((resolve, reject) => {
if (!navigator.geolocation) {
reject(new Error('Geolocalização não suportada no navegador.'));
return;
}
navigator.geolocation.getCurrentPosition(
(position) => {
const coords = {
lat: position.coords.latitude,
lng: position.coords.longitude
};
setLocation(coords);
resolve(coords);
},
(err) => {
reject(new Error('Falha ao obter localização. Verifique as permissões.'));
}
);
});
}, []);
/**
* Executa a batida de ponto.
*/
const baterPonto = async (tipo) => {
setLoading(true);
setError(null);
try {
const coords = await getGeoLocation().catch(() => null); // Null-safe
const result = await pontoService.registrarPonto({
tipo,
location: coords,
device: navigator.userAgent
});
return result;
} catch (err) {
setError(err.message);
return { success: false, error: err.message };
} finally {
setLoading(false);
}
};
return {
baterPonto,
loading,
error,
location,
getGeoLocation
};
};