VayuUI

usePermission

A hook to query, monitor, and request browser permissions in real-time.

The usePermission hook wraps the Permissions API to query and monitor permission state, and provides a request() method that triggers the appropriate browser prompt.

Demo

Browser Permissions

šŸ“·Camera
loading
šŸŽ¤Microphone
loading
šŸ“Geolocation
loading
šŸ””Notifications
loading
šŸ“‹Clipboard Read
loading

Source Code

Copy this code into src/hooks/usePermission.ts:

import { useCallback, useEffect, useState } from 'react';

export type PermissionName =
  | 'camera'
  | 'microphone'
  | 'geolocation'
  | 'notifications'
  | 'clipboard-read'
  | 'clipboard-write'
  | 'push'
  | 'midi';

export type PermissionState = 'granted' | 'denied' | 'prompt' | 'unsupported' | 'loading';

export const usePermission = (permissionName: PermissionName) => {
  const [state, setState] = useState<PermissionState>('loading');

  useEffect(() => {
    navigator.permissions
      .query({ name: permissionName as any })
      .then((status) => {
        setState(status.state as PermissionState);
        status.addEventListener('change', () => setState(status.state as PermissionState));
      })
      .catch(() => setState('unsupported'));
  }, [permissionName]);

  const request = useCallback(async () => {
    // Trigger the appropriate browser prompt
    // See full source for implementation
  }, [permissionName]);

  return {
    state,
    isGranted: state === 'granted',
    isDenied: state === 'denied',
    isPrompt: state === 'prompt',
    isSupported: state !== 'unsupported',
    request,
  };
};

Usage

import { usePermission } from '@/hooks/usePermission';

const CameraAccess = () => {
  const { state, isGranted, request } = usePermission('camera');

  if (isGranted) return <p>āœ… Camera access granted</p>;

  return <button onClick={request}>Grant Camera ({state})</button>;
};

API Reference

Parameters

ParameterTypeDescription
permissionNamePermissionNameThe permission to query

Return Value

PropertyTypeDescription
statePermissionState"granted" | "denied" | "prompt" | "unsupported" | "loading"
isGrantedbooleanWhether the permission is granted
isDeniedbooleanWhether the permission is denied
isPromptbooleanWhether the user hasn't been asked yet
isSupportedbooleanWhether the Permissions API supports this permission
request() => Promise<void>Triggers the browser's permission prompt

On this page