{"ast":null,"code":"import _regeneratorRuntime from \"@babel/runtime/regenerator\";\nimport _objectWithoutProperties from \"@babel/runtime/helpers/objectWithoutProperties\";\nimport _slicedToArray from \"@babel/runtime/helpers/slicedToArray\";\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nfunction usePermission(methods, options) {\n  var isMounted = useRef(true);\n\n  var _useState = useState(null),\n      _useState2 = _slicedToArray(_useState, 2),\n      status = _useState2[0],\n      setStatus = _useState2[1];\n\n  var _ref = options || {},\n      _ref$get = _ref.get,\n      get = _ref$get === void 0 ? true : _ref$get,\n      _ref$request = _ref.request,\n      request = _ref$request === void 0 ? false : _ref$request,\n      permissionOptions = _objectWithoutProperties(_ref, [\"get\", \"request\"]);\n\n  var getPermission = useCallback(function _callee() {\n    var response;\n    return _regeneratorRuntime.async(function _callee$(_context) {\n      while (1) {\n        switch (_context.prev = _context.next) {\n          case 0:\n            _context.next = 2;\n            return _regeneratorRuntime.awrap(methods.getMethod(Object.keys(permissionOptions).length > 0 ? permissionOptions : undefined));\n\n          case 2:\n            response = _context.sent;\n            if (isMounted.current) setStatus(response);\n            return _context.abrupt(\"return\", response);\n\n          case 5:\n          case \"end\":\n            return _context.stop();\n        }\n      }\n    }, null, null, null, Promise);\n  }, [methods.getMethod]);\n  var requestPermission = useCallback(function _callee2() {\n    var response;\n    return _regeneratorRuntime.async(function _callee2$(_context2) {\n      while (1) {\n        switch (_context2.prev = _context2.next) {\n          case 0:\n            _context2.next = 2;\n            return _regeneratorRuntime.awrap(methods.requestMethod(Object.keys(permissionOptions).length > 0 ? permissionOptions : undefined));\n\n          case 2:\n            response = _context2.sent;\n            if (isMounted.current) setStatus(response);\n            return _context2.abrupt(\"return\", response);\n\n          case 5:\n          case \"end\":\n            return _context2.stop();\n        }\n      }\n    }, null, null, null, Promise);\n  }, [methods.requestMethod]);\n  useEffect(function runMethods() {\n    if (request) requestPermission();\n    if (!request && get) getPermission();\n  }, [get, request, requestPermission, getPermission]);\n  useEffect(function didMount() {\n    isMounted.current = true;\n    return function () {\n      isMounted.current = false;\n    };\n  }, []);\n  return [status, requestPermission, getPermission];\n}\n\nexport function createPermissionHook(methods) {\n  return function (options) {\n    return usePermission(methods, options);\n  };\n}","map":{"version":3,"sources":["../src/PermissionsHook.ts"],"names":[],"mappings":";;;AAAA,SAAS,WAAT,EAAsB,SAAtB,EAAiC,MAAjC,EAAyC,QAAzC,QAAyD,OAAzD;;AA6BA,SAAS,aAAT,CACE,OADF,EAEE,OAFF,EAE0C;AAExC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAD,CAAxB;;AAFwC,kBAGZ,QAAQ,CAAoB,IAApB,CAHI;AAAA;AAAA,MAGjC,MAHiC;AAAA,MAGzB,SAHyB;;AAAA,aAIsB,OAAO,IAAI,EAJjC;AAAA,sBAIhC,GAJgC;AAAA,MAIhC,GAJgC,yBAI1B,IAJ0B;AAAA,0BAIpB,OAJoB;AAAA,MAIpB,OAJoB,6BAIV,KAJU;AAAA,MAIA,iBAJA;;AAMxC,MAAM,aAAa,GAAG,WAAW,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6CACT,OAAO,CAAC,SAAR,CACrB,MAAM,CAAC,IAAP,CAAY,iBAAZ,EAA+B,MAA/B,GAAwC,CAAxC,GAA6C,iBAA7C,GAA6E,SADxD,CADS;;AAAA;AAC1B,YAAA,QAD0B;AAIhC,gBAAI,SAAS,CAAC,OAAd,EAAuB,SAAS,CAAC,QAAD,CAAT;AAJS,6CAKzB,QALyB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAAD,EAM9B,CAAC,OAAO,CAAC,SAAT,CAN8B,CAAjC;AAQA,MAAM,iBAAiB,GAAG,WAAW,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6CACb,OAAO,CAAC,aAAR,CACrB,MAAM,CAAC,IAAP,CAAY,iBAAZ,EAA+B,MAA/B,GAAwC,CAAxC,GAA6C,iBAA7C,GAA6E,SADxD,CADa;;AAAA;AAC9B,YAAA,QAD8B;AAIpC,gBAAI,SAAS,CAAC,OAAd,EAAuB,SAAS,CAAC,QAAD,CAAT;AAJa,8CAK7B,QAL6B;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAAD,EAMlC,CAAC,OAAO,CAAC,aAAT,CANkC,CAArC;AAQA,EAAA,SAAS,CACP,SAAS,UAAT,GAAmB;AACjB,QAAI,OAAJ,EAAa,iBAAiB;AAC9B,QAAI,CAAC,OAAD,IAAY,GAAhB,EAAqB,aAAa;AACnC,GAJM,EAKP,CAAC,GAAD,EAAM,OAAN,EAAe,iBAAf,EAAkC,aAAlC,CALO,CAAT;AASA,EAAA,SAAS,CAAC,SAAS,QAAT,GAAiB;AACzB,IAAA,SAAS,CAAC,OAAV,GAAoB,IAApB;AACA,WAAO,YAAK;AACV,MAAA,SAAS,CAAC,OAAV,GAAoB,KAApB;AACD,KAFD;AAGD,GALQ,EAKN,EALM,CAAT;AAOA,SAAO,CAAC,MAAD,EAAS,iBAAT,EAA4B,aAA5B,CAAP;AACD;;AAMD,OAAM,SAAU,oBAAV,CACJ,OADI,EAC+C;AAEnD,SAAO,UAAC,OAAD;AAAA,WACL,aAAa,CAAsB,OAAtB,EAA+B,OAA/B,CADR;AAAA,GAAP;AAED","sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { PermissionResponse } from './PermissionsInterface';\n\n// These types are identical, but improves the readability for suggestions in editors\ntype RequestPermissionMethod<Permission extends PermissionResponse> = () => Promise<Permission>;\ntype GetPermissionMethod<Permission extends PermissionResponse> = () => Promise<Permission>;\n\ninterface PermissionHookMethods<Permission extends PermissionResponse, Options = never> {\n  /** The permission method that requests the user to grant permission. */\n  requestMethod: (options?: Options) => Promise<Permission>;\n  /** The permission method that only fetches the current permission status. */\n  getMethod: (options?: Options) => Promise<Permission>;\n}\n\ninterface PermissionHookBehavior {\n  /** If the hook should automatically fetch the current permission status, without asking the user. */\n  get?: boolean;\n  /** If the hook should automatically request the user to grant permission. */\n  request?: boolean;\n}\n\nexport type PermissionHookOptions<Options extends object> = PermissionHookBehavior & Options;\n\n/**\n * Get or request permission for protected functionality within the app.\n * It uses separate permission requesters to interact with a single permission.\n * By default, the hook will only retrieve the permission status.\n */\nfunction usePermission<Permission extends PermissionResponse, Options extends object>(\n  methods: PermissionHookMethods<Permission, Options>,\n  options?: PermissionHookOptions<Options>\n): [Permission | null, RequestPermissionMethod<Permission>, GetPermissionMethod<Permission>] {\n  const isMounted = useRef(true);\n  const [status, setStatus] = useState<Permission | null>(null);\n  const { get = true, request = false, ...permissionOptions } = options || {};\n\n  const getPermission = useCallback(async () => {\n    const response = await methods.getMethod(\n      Object.keys(permissionOptions).length > 0 ? (permissionOptions as Options) : undefined\n    );\n    if (isMounted.current) setStatus(response);\n    return response;\n  }, [methods.getMethod]);\n\n  const requestPermission = useCallback(async () => {\n    const response = await methods.requestMethod(\n      Object.keys(permissionOptions).length > 0 ? (permissionOptions as Options) : undefined\n    );\n    if (isMounted.current) setStatus(response);\n    return response;\n  }, [methods.requestMethod]);\n\n  useEffect(\n    function runMethods() {\n      if (request) requestPermission();\n      if (!request && get) getPermission();\n    },\n    [get, request, requestPermission, getPermission]\n  );\n\n  // Workaround for unmounting components receiving state updates\n  useEffect(function didMount() {\n    isMounted.current = true;\n    return () => {\n      isMounted.current = false;\n    };\n  }, []);\n\n  return [status, requestPermission, getPermission];\n}\n\n/**\n * Create a new permission hook with the permission methods built-in.\n * This can be used to quickly create specific permission hooks in every module.\n */\nexport function createPermissionHook<Permission extends PermissionResponse, Options extends object>(\n  methods: PermissionHookMethods<Permission, Options>\n) {\n  return (options?: PermissionHookOptions<Options>) =>\n    usePermission<Permission, Options>(methods, options);\n}\n"],"sourceRoot":""},"metadata":{},"sourceType":"module"}