72 lines
1.7 KiB
JavaScript
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
|
|
};
|
|
};
|