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(initialState); type Props = { children: React.ReactNode; }; export const useUserPosition = () => { return useContext(UserPositionContext); }; export const UserPositionProvider: FC = ({ children }) => { //位置情報 const [locationStatus, setLocationStatus] = useState(null); const [position, setPosition] = useState( 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 ( {children} ); };