44 lines
1.0 KiB
TypeScript
44 lines
1.0 KiB
TypeScript
import {useCallback} from 'react'
|
|
import * as Location from 'expo-location'
|
|
|
|
import {type DeviceLocation} from '#/state/geolocation/types'
|
|
import {getDeviceGeolocation} from '#/state/geolocation/util'
|
|
|
|
export {PermissionStatus} from 'expo-location'
|
|
|
|
export function useRequestDeviceLocation(): () => Promise<
|
|
| {
|
|
granted: true
|
|
location: DeviceLocation | undefined
|
|
}
|
|
| {
|
|
granted: false
|
|
status: {
|
|
canAskAgain: boolean
|
|
/**
|
|
* Enum, use `PermissionStatus` export for comparisons
|
|
*/
|
|
permissionStatus: Location.PermissionStatus
|
|
}
|
|
}
|
|
> {
|
|
return useCallback(async () => {
|
|
const status = await Location.requestForegroundPermissionsAsync()
|
|
|
|
if (status.granted) {
|
|
return {
|
|
granted: true,
|
|
location: await getDeviceGeolocation(),
|
|
}
|
|
} else {
|
|
return {
|
|
granted: false,
|
|
status: {
|
|
canAskAgain: status.canAskAgain,
|
|
permissionStatus: status.status,
|
|
},
|
|
}
|
|
}
|
|
}, [])
|
|
}
|