jrshikoku/stateBox/useUserPosition.tsx
2025-04-13 13:21:09 +00:00

77 lines
1.9 KiB
TypeScript

import React, {
createContext,
useContext,
useState,
useEffect,
FC,
} from "react";
import {
LocationObject,
requestForegroundPermissionsAsync,
getCurrentPositionAsync,
} from "expo-location";
import { Platform } from "react-native";
import useInterval from "@/lib/useInterval";
type initialStateType = {
position: LocationObject | undefined;
getCurrentPosition: () => void;
locationStatus: boolean | null;
getLocationPermission: () => void;
};
const initialState = {
position: undefined,
getCurrentPosition: () => {},
locationStatus: null,
getLocationPermission: () => {},
};
const UserPositionContext = createContext<initialStateType>(initialState);
type Props = {
children: React.ReactNode;
};
export const useUserPosition = () => {
return useContext(UserPositionContext);
};
export const UserPositionProvider: FC<Props> = ({ children }) => {
//位置情報
const [locationStatus, setLocationStatus] = useState<boolean | null>(null);
const [position, setPosition] = useState<LocationObject | undefined>(
undefined
);
const getLocationPermission = async () => {
return requestForegroundPermissionsAsync().then((data) => {
setLocationStatus(
Platform.OS == "ios"
? data.status == "granted"
: data.android.accuracy == "fine"
);
});
};
const getCurrentPosition = () => {
if (!locationStatus) return () => {};
getCurrentPositionAsync({}).then((location) => setPosition(location));
};
useEffect(() => {
if (Platform.OS == "web") return;
getLocationPermission();
}, []);
useEffect(getCurrentPosition, [locationStatus]);
useInterval(getCurrentPosition, 5000);
return (
<UserPositionContext.Provider
value={{
position,
getCurrentPosition,
locationStatus,
getLocationPermission,
}}
>
{children}
</UserPositionContext.Provider>
);
};