mirror of
https://github.com/streamich/react-use.git
synced 2026-01-18 14:06:52 +00:00
feat: add usePermission
This commit is contained in:
parent
ba6d375e07
commit
4da40b9cbb
20
docs/usePermission.md
Normal file
20
docs/usePermission.md
Normal 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>
|
||||
);
|
||||
};
|
||||
```
|
||||
14
src/__stories__/usePermission.story.tsx
Normal file
14
src/__stories__/usePermission.story.tsx
Normal 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 />);
|
||||
@ -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
46
src/usePermission.ts
Normal 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;
|
||||
Loading…
x
Reference in New Issue
Block a user