diff --git a/src/ParseGeoPoint.js b/src/ParseGeoPoint.ts similarity index 77% rename from src/ParseGeoPoint.js rename to src/ParseGeoPoint.ts index 3af089e98..b821dc838 100644 --- a/src/ParseGeoPoint.js +++ b/src/ParseGeoPoint.ts @@ -1,7 +1,3 @@ -/** - * @flow - */ - /** * Creates a new GeoPoint with any of the following forms:
*
@@ -102,7 +98,7 @@ class ParseGeoPoint {
     };
   }
 
-  equals(other: mixed): boolean {
+  equals(other: any): boolean {
     return (
       other instanceof ParseGeoPoint &&
       this.latitude === other.latitude &&
@@ -183,12 +179,18 @@ class ParseGeoPoint {
   /**
    * Creates a GeoPoint with the user's current location, if available.
    *
+   * @param {object} options The options.
+   * @param {boolean} [options.enableHighAccuracy=false] A boolean value that indicates the application would like to receive the best possible results. If true and if the device is able to provide a more accurate position, it will do so. Note that this can result in slower response times or increased power consumption (with a GPS chip on a mobile device for example). On the other hand, if false, the device can take the liberty to save resources by responding more quickly and/or using less power. Default: false.
+   * @param {number} [options.timeout=Infinity] A positive long value representing the maximum length of time (in milliseconds) the device is allowed to take in order to return a position. The default value is Infinity, meaning that getCurrentPosition() won't return until the position is available.
+   * @param {number} [options.maximumAge=0] A positive long value indicating the maximum age in milliseconds of a possible cached position that is acceptable to return. If set to 0, it means that the device cannot use a cached position and must attempt to retrieve the real current position. If set to Infinity the device must return a cached position regardless of its age. Default: 0.
    * @static
-   * @returns {Parse.GeoPoint} User's current location
+   * @returns {Promise} User's current location
    */
-  static current() {
-    return navigator.geolocation.getCurrentPosition(location => {
-      return new ParseGeoPoint(location.coords.latitude, location.coords.longitude);
+  static current(options): Promise {
+    return new Promise((resolve, reject) => {
+      navigator.geolocation.getCurrentPosition(location => {
+        resolve(new ParseGeoPoint(location.coords.latitude, location.coords.longitude));
+      }, reject, options);
     });
   }
 }
diff --git a/src/__tests__/ParseGeoPoint-test.js b/src/__tests__/ParseGeoPoint-test.js
index 49c1424ed..3bc9346c0 100644
--- a/src/__tests__/ParseGeoPoint-test.js
+++ b/src/__tests__/ParseGeoPoint-test.js
@@ -1,16 +1,6 @@
 jest.autoMockOff();
 
 const ParseGeoPoint = require('../ParseGeoPoint').default;
-global.navigator.geolocation = {
-  getCurrentPosition: cb => {
-    return cb({
-      coords: {
-        latitude: 10,
-        longitude: 20,
-      },
-    });
-  },
-};
 
 describe('GeoPoint', () => {
   it('can be constructed from various inputs', () => {
@@ -217,8 +207,31 @@ describe('GeoPoint', () => {
   });
 
   it('can get current location', async () => {
-    const geoPoint = ParseGeoPoint.current();
+    global.navigator.geolocation = {
+      getCurrentPosition: (success, _, options) => {
+        success({
+          coords: {
+            latitude: 10,
+            longitude: 20,
+          },
+        });
+        expect(options).toEqual({ timeout: 5000 });
+      },
+    };
+    const geoPoint = await ParseGeoPoint.current({ timeout: 5000 });
     expect(geoPoint.latitude).toBe(10);
     expect(geoPoint.longitude).toBe(20);
   });
+
+  it('can get current location error', async () => {
+    global.navigator.geolocation = {
+      getCurrentPosition: (_, error, options) => {
+        error({
+          message: 'PERMISSION_DENIED',
+        });
+        expect(options).toEqual({ timeout: 5000 });
+      },
+    };
+    await expect(ParseGeoPoint.current({ timeout: 5000 })).rejects.toEqual({ message: 'PERMISSION_DENIED' });
+  });
 });
diff --git a/types/ParseGeoPoint.d.ts b/types/ParseGeoPoint.d.ts
index 9dfca7d53..a48a469d9 100644
--- a/types/ParseGeoPoint.d.ts
+++ b/types/ParseGeoPoint.d.ts
@@ -1,8 +1,3 @@
-// @ts-nocheck
-export default ParseGeoPoint;
-/**
- * @flow
- */
 /**
  * Creates a new GeoPoint with any of the following forms:
*
@@ -27,14 +22,8 @@ export default ParseGeoPoint;
  * @alias Parse.GeoPoint
  */
 declare class ParseGeoPoint {
-    static _validate(latitude: number, longitude: number): void;
-    /**
-     * Creates a GeoPoint with the user's current location, if available.
-     *
-     * @static
-     * @returns {Parse.GeoPoint} User's current location
-     */
-    static current(): Parse.GeoPoint;
+    _latitude: number;
+    _longitude: number;
     /**
      * @param {(number[] | object | number)} arg1 Either a list of coordinate pairs, an object with `latitude`, `longitude`, or the latitude or the point.
      * @param {number} arg2 The longitude of the GeoPoint
@@ -43,9 +32,6 @@ declare class ParseGeoPoint {
         latitude: number;
         longitude: number;
     } | number, arg2?: number);
-    _latitude: number;
-    _longitude: number;
-    set latitude(arg: number);
     /**
      * North-south portion of the coordinate, in range [-90, 90].
      * Throws an exception if set out of range in a modern browser.
@@ -54,7 +40,7 @@ declare class ParseGeoPoint {
      * @returns {number}
      */
     get latitude(): number;
-    set longitude(arg: number);
+    set latitude(val: number);
     /**
      * East-west portion of the coordinate, in range [-180, 180].
      * Throws if set out of range in a modern browser.
@@ -63,6 +49,7 @@ declare class ParseGeoPoint {
      * @returns {number}
      */
     get longitude(): number;
+    set longitude(val: number);
     /**
      * Returns a JSON representation of the GeoPoint, suitable for Parse.
      *
@@ -73,7 +60,7 @@ declare class ParseGeoPoint {
         latitude: number;
         longitude: number;
     };
-    equals(other: mixed): boolean;
+    equals(other: any): boolean;
     /**
      * Returns the distance from this GeoPoint to another in radians.
      *
@@ -95,4 +82,17 @@ declare class ParseGeoPoint {
      * @returns {number}
      */
     milesTo(point: ParseGeoPoint): number;
+    static _validate(latitude: number, longitude: number): void;
+    /**
+     * Creates a GeoPoint with the user's current location, if available.
+     *
+     * @param {object} options The options.
+     * @param {boolean} [options.enableHighAccuracy=false] A boolean value that indicates the application would like to receive the best possible results. If true and if the device is able to provide a more accurate position, it will do so. Note that this can result in slower response times or increased power consumption (with a GPS chip on a mobile device for example). On the other hand, if false, the device can take the liberty to save resources by responding more quickly and/or using less power. Default: false.
+     * @param {number} [options.timeout=Infinity] A positive long value representing the maximum length of time (in milliseconds) the device is allowed to take in order to return a position. The default value is Infinity, meaning that getCurrentPosition() won't return until the position is available.
+     * @param {number} [options.maximumAge=0] A positive long value indicating the maximum age in milliseconds of a possible cached position that is acceptable to return. If set to 0, it means that the device cannot use a cached position and must attempt to retrieve the real current position. If set to Infinity the device must return a cached position regardless of its age. Default: 0.
+     * @static
+     * @returns {Promise} User's current location
+     */
+    static current(options: any): Promise;
 }
+export default ParseGeoPoint;