import { H2 } from '@expo/html-elements'; import { Pedometer } from 'expo-sensors'; import * as React from 'react'; import { ScrollView, Text, View } from 'react-native'; import ListButton from '../components/ListButton'; import usePermissions from '../utilities/usePermissions'; import { useResolvedValue } from '../utilities/useResolvedValue'; function usePedometer({ isActive }: { isActive: boolean }): Pedometer.PedometerResult | null { const [data, setData] = React.useState(null); const listener = React.useRef(null); React.useEffect(() => { return () => { listener.current?.remove(); }; }, []); React.useEffect(() => { if (isActive) { listener.current = Pedometer.watchStepCount(setData); } else { listener.current?.remove(); } }, [isActive]); return data; } function usePedometerHistory({ start, end, }: { start: Date; end: Date; }): Pedometer.PedometerResult | null { const [data, setData] = React.useState(null); const isMounted = React.useRef(true); React.useEffect(() => { return () => { isMounted.current = false; }; }, []); React.useEffect(() => { Pedometer.getStepCountAsync(start, end).then((data) => { if (isMounted.current) { setData(data); } }); }, [start, end]); return data; } function StepTrackerView() { const [isActive, setActive] = React.useState(false); const data = usePedometer({ isActive }); const message = data?.steps ? `Total steps ${data.steps}` : `Waiting...`; return (

Step Tracker

setActive(true)} disabled={isActive} title="Start" /> setActive(false)} disabled={!isActive} title="Stop" /> {message}
); } function StepHistoryMessage() { const today = React.useMemo(() => { return new Date(); }, []); const yesterday = React.useMemo(() => { const yesterday = new Date(); yesterday.setDate(today.getDate() - 1); return yesterday; }, [today]); const data = usePedometerHistory({ start: yesterday, end: today }); const message = data ? `Steps in the last day: ${data.steps}` : `Loading health data...`; return (

Step History

{message}
); } export default function PedometerGuard() { const [isPermissionsGranted] = usePermissions(Pedometer.requestPermissionsAsync); const [isAvailable] = useResolvedValue(Pedometer.isAvailableAsync); if (isAvailable === null) { return null; } if (!isPermissionsGranted || !isAvailable) { // this can also occur if the device doesn't have a pedometer const message = isAvailable ? 'You have not granted permission to use the device motion on this device!' : 'Your device does not have a pedometer'; return ( {message} ); } return ; } function PedometerScreen() { return ( ); } PedometerGuard.navigationOptions = { title: 'Pedometer', };