mirror of
https://github.com/cinnyapp/cinny.git
synced 2025-11-05 06:50:28 +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