feat: add usePermission

This commit is contained in:
allen 2019-06-27 00:57:38 +08:00
parent ba6d375e07
commit 4da40b9cbb
4 changed files with 82 additions and 0 deletions

20
docs/usePermission.md Normal file
View File

@ -0,0 +1,20 @@
# `usePermission`
React UI hook that query permission status from the user depends on the specific AP.
## Usage
```jsx
import {usePermission} from 'react-use';
const Demo = () => {
const state = usePermission({ name: 'microphone' });
return (
<pre>
{JSON.stringify(state, null, 2)}
</pre>
);
};
```

View File

@ -0,0 +1,14 @@
import { storiesOf } from '@storybook/react';
import * as React from 'react';
import { usePermission } from '..';
import ShowDocs from './util/ShowDocs';
const Demo = () => {
const state = usePermission({ name: 'microphone' });
return <pre>{JSON.stringify(state, null, 2)}</pre>;
};
storiesOf('UI|usePermission', module)
.add('Docs', () => <ShowDocs md={require('../../docs/usePermission.md')} />)
.add('Demo', () => <Demo />);

View File

@ -47,6 +47,7 @@ import useNumber from './useNumber';
import useObservable from './useObservable';
import useOrientation from './useOrientation';
import usePageLeave from './usePageLeave';
import usePermission from './usePermission';
import usePrevious from './usePrevious';
import usePromise from './usePromise';
import useRaf from './useRaf';
@ -123,6 +124,7 @@ export {
useObservable,
useOrientation,
usePageLeave,
usePermission,
usePrevious,
usePromise,
useRaf,

46
src/usePermission.ts Normal file
View File

@ -0,0 +1,46 @@
import { useEffect, useState } from 'react';
import { off, on } from './util';
type PermissionDesc =
| PermissionDescriptor
| DevicePermissionDescriptor
| MidiPermissionDescriptor
| PushPermissionDescriptor;
const noop = () => {};
const usePermission = (permissionDesc: PermissionDesc): string => {
const [state, setState] = useState('');
let mounted = true;
let permissionStatus: PermissionStatus | null = null;
const onChange = () => {
if (mounted && permissionStatus) {
setState(permissionStatus.state);
}
};
const changeState = () => {
onChange();
on(permissionStatus, 'change', onChange);
};
useEffect(() => {
navigator.permissions
.query(permissionDesc)
.then(status => {
permissionStatus = status;
changeState();
})
.catch(noop);
return () => {
mounted = false;
permissionStatus && off(permissionStatus, 'change', onChange);
};
}, []);
return state;
};
export default usePermission;