From 324065ae3f557c6973958494e46a6bac79f07fe2 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Mon, 11 Aug 2025 21:39:04 +0530 Subject: [PATCH] add room permissions hook --- src/app/hooks/useRoomPermissions.ts | 60 +++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/app/hooks/useRoomPermissions.ts diff --git a/src/app/hooks/useRoomPermissions.ts b/src/app/hooks/useRoomPermissions.ts new file mode 100644 index 00000000..cb6f69a2 --- /dev/null +++ b/src/app/hooks/useRoomPermissions.ts @@ -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, + 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, + powerLevels: IPowerLevels +): RoomPermissionsAPI => { + const api: RoomPermissionsAPI = useMemo( + () => getRoomPermissionsAPI(creators, powerLevels), + [creators, powerLevels] + ); + + return api; +};