mirror of
				https://github.com/cinnyapp/cinny.git
				synced 2025-11-04 14:30:29 +03:00 
			
		
		
		
	add room permissions hook
This commit is contained in:
		
							parent
							
								
									88e8f73f53
								
							
						
					
					
						commit
						324065ae3f
					
				
					 1 changed files with 60 additions and 0 deletions
				
			
		
							
								
								
									
										60
									
								
								src/app/hooks/useRoomPermissions.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								src/app/hooks/useRoomPermissions.ts
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,60 @@
 | 
			
		|||
import { useMemo } from 'react';
 | 
			
		||||
import {
 | 
			
		||||
  IPowerLevels,
 | 
			
		||||
  PowerLevelActions,
 | 
			
		||||
  PowerLevelNotificationsAction,
 | 
			
		||||
  readPowerLevel,
 | 
			
		||||
} from './usePowerLevels';
 | 
			
		||||
 | 
			
		||||
export type RoomPermissionsAPI = {
 | 
			
		||||
  event: (type: string, userId: string) => boolean;
 | 
			
		||||
  stateEvent: (type: string, userId: string) => boolean;
 | 
			
		||||
  action: (action: PowerLevelActions, userId: string) => boolean;
 | 
			
		||||
  notificationAction: (action: PowerLevelNotificationsAction, userId: string) => boolean;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const getRoomPermissionsAPI = (
 | 
			
		||||
  creators: Set<string>,
 | 
			
		||||
  powerLevels: IPowerLevels
 | 
			
		||||
): RoomPermissionsAPI => {
 | 
			
		||||
  const api: RoomPermissionsAPI = {
 | 
			
		||||
    event: (type, userId) => {
 | 
			
		||||
      if (creators.has(userId)) return true;
 | 
			
		||||
      const userPower = readPowerLevel.user(powerLevels, userId);
 | 
			
		||||
      const requiredPL = readPowerLevel.event(powerLevels, type);
 | 
			
		||||
      return userPower >= requiredPL;
 | 
			
		||||
    },
 | 
			
		||||
    stateEvent: (type, userId) => {
 | 
			
		||||
      if (creators.has(userId)) return true;
 | 
			
		||||
      const userPower = readPowerLevel.user(powerLevels, userId);
 | 
			
		||||
      const requiredPL = readPowerLevel.state(powerLevels, type);
 | 
			
		||||
      return userPower >= requiredPL;
 | 
			
		||||
    },
 | 
			
		||||
    action: (action, userId) => {
 | 
			
		||||
      if (creators.has(userId)) return true;
 | 
			
		||||
      const userPower = readPowerLevel.user(powerLevels, userId);
 | 
			
		||||
      const requiredPL = readPowerLevel.action(powerLevels, action);
 | 
			
		||||
      return userPower >= requiredPL;
 | 
			
		||||
    },
 | 
			
		||||
    notificationAction: (action, userId) => {
 | 
			
		||||
      if (creators.has(userId)) return true;
 | 
			
		||||
      const userPower = readPowerLevel.user(powerLevels, userId);
 | 
			
		||||
      const requiredPL = readPowerLevel.notification(powerLevels, action);
 | 
			
		||||
      return userPower >= requiredPL;
 | 
			
		||||
    },
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  return api;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const useRoomPermissions = (
 | 
			
		||||
  creators: Set<string>,
 | 
			
		||||
  powerLevels: IPowerLevels
 | 
			
		||||
): RoomPermissionsAPI => {
 | 
			
		||||
  const api: RoomPermissionsAPI = useMemo(
 | 
			
		||||
    () => getRoomPermissionsAPI(creators, powerLevels),
 | 
			
		||||
    [creators, powerLevels]
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  return api;
 | 
			
		||||
};
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue