1- import { useUserServerPerms } from '@/lib/store' ;
1+ import { useUserHighestRolePosition , useUserServerPerms } from '@/lib/store' ;
22import { createRole , decrementRolePosition , deleteRole , incrementRolePosition , updateRole } from '@/services/roles.service' ;
33import { Role , Server } from '@/types/dbtypes' ;
44import { ServerPermissions } from '@/types/permissions' ;
55import { useSupabaseClient } from '@supabase/auth-helpers-react' ;
66import { useForm } from 'react-hook-form' ;
77
8- const permissionEnumToNameMap = new Map ( [
9- [ ServerPermissions . OWNER , 'Owner' ] ,
10- [ ServerPermissions . ADMINISTRATOR , 'Administrator' ] ,
11- [ ServerPermissions . MANAGE_CHANNELS , 'Manage Channels' ] ,
12- [ ServerPermissions . MANAGE_ROLES , 'Manage Roles' ] ,
13- [ ServerPermissions . MANAGE_SERVER , 'Manage Server' ] ,
14- [ ServerPermissions . MANAGE_CHANNELS , 'Manage Channels' ] ,
15- [ ServerPermissions . MANAGE_USERS , 'Manage Users' ] ,
16- [ ServerPermissions . MANAGE_ROLES , 'Manage Roles' ] ,
17- [ ServerPermissions . MANAGE_MESSAGES , 'Manage Messages' ] ,
18- [ ServerPermissions . MANAGE_INVITES , 'Manage Invites' ] ,
19- [ ServerPermissions . CREATE_INVITES , 'Create Invites' ] ,
8+ const permissionEnumToInfoMap = new Map ( [
9+ [ ServerPermissions . OWNER , [ 'Owner' , '' ] ] ,
10+ [ ServerPermissions . ADMINISTRATOR , [ 'Administrator' , 'Grants all permissions in the server (assign this with caution!)' ] ] ,
11+ [ ServerPermissions . MANAGE_CHANNELS , [ 'Manage Channels' , 'Allows the user to create, edit, and delete channels' ] ] ,
12+ [ ServerPermissions . MANAGE_ROLES , [ 'Manage Roles' , 'Allows the user to create, edit, and delete roles' ] ] ,
13+ [ ServerPermissions . MANAGE_SERVER , [ 'Manage Server' , 'Allows the user to edit server settings like name, descripion, and icon' ] ] ,
14+ [ ServerPermissions . MANAGE_USERS , [ 'Manage Users' , 'Allows the user to kick and ban users' ] ] ,
15+ [ ServerPermissions . MANAGE_MESSAGES , [ 'Manage Messages' , 'Allows the user to delete and pin messages' ] ] ,
16+ [ ServerPermissions . MANAGE_INVITES , [ 'Manage Invites' , 'Allows the user to edit, and delete invites' ] ] ,
17+ [ ServerPermissions . CREATE_INVITES , [ 'Create Invites' , 'Allows the user to create invites' ] ] ,
2018] ) ;
2119
2220type RoleEditFormResult = {
@@ -28,16 +26,24 @@ type RoleEditFormResult = {
2826
2927export function RoleEditForm ( { role, server, roles_length } : { role : Role , server : Server , roles_length : number } ) {
3028 const { register, handleSubmit, formState : { errors } } = useForm < RoleEditFormResult > ( ) ;
31-
29+ const userHighestRolePosition = useUserHighestRolePosition ( ) ;
3230 const supabase = useSupabaseClient ( ) ;
33- const isFormDisabled = ( role && role . is_system ) || false ;
31+ const isFormDisabled = role . is_system || role . position <= userHighestRolePosition ;
32+ const userPerms = useUserServerPerms ( ) ;
33+
34+ console . log ( userHighestRolePosition ) ;
3435 const serverPermissions = Object . entries ( ServerPermissions ) . filter (
3536 ( [ key , value ] ) => typeof value === 'number' && key !== 'NONE' && key !== 'OWNER'
3637 ) ;
3738
3839 const onSubmit = async ( formData : RoleEditFormResult ) => {
40+ console . log ( formData ) ;
3941 if ( typeof formData . permissions === 'string' ) {
40- formData . permissions = [ formData . permissions ] ;
42+ formData . permissions = [ formData . permissions ] ;
43+ }
44+
45+ else if ( typeof formData . permissions === 'boolean' ) {
46+ formData . permissions = [ '0' ] ;
4147 }
4248
4349 const perms = formData . permissions . reduce ( ( acc , cur ) => acc | parseInt ( cur ) , 0 ) ;
@@ -64,8 +70,6 @@ export function RoleEditForm({role, server, roles_length }: {role: Role, server:
6470 }
6571 } ;
6672
67- const userPerms = useUserServerPerms ( ) ;
68-
6973 return (
7074 < form onSubmit = { handleSubmit ( onSubmit ) } >
7175 < p className = "text-base text-gray-400 text-left w-full" > Display</ p >
@@ -96,7 +100,7 @@ export function RoleEditForm({role, server, roles_length }: {role: Role, server:
96100 console . log ( 'up' ) ;
97101 await incrementRolePosition ( supabase , role . id ) ;
98102 } }
99- disabled = { isFormDisabled || role . position === 1 }
103+ disabled = { isFormDisabled || role . position === 1 || role . position - 1 <= userHighestRolePosition }
100104 >
101105 Up
102106 </ button >
@@ -114,10 +118,10 @@ export function RoleEditForm({role, server, roles_length }: {role: Role, server:
114118 </ div >
115119 < p className = "text-base text-gray-400 text-left w-full" > Permissions</ p >
116120 { serverPermissions . map ( ( [ permission , value ] ) => (
117- < div key = { permission } >
121+ < div key = { permission } className = "flex flex-row w-full" >
118122 < input
119123 type = "checkbox"
120- className = "w-5 h-5"
124+ className = "w-5 h-5 mr-2 checked:accent-green-600 disabled:accent-green-600/50 "
121125 value = { value }
122126 defaultChecked = { (
123127 ! role
@@ -132,13 +136,18 @@ export function RoleEditForm({role, server, roles_length }: {role: Role, server:
132136 }
133137 { ...register ( 'permissions' ) }
134138 />
135- { /* @ts -expect-error permission is always a keyof ServerPermissions. This error will never be thrown */ }
136- < label > { permissionEnumToNameMap . get ( ServerPermissions [ permission ] ) } </ label >
139+ < div >
140+ { /* @ts -expect-error permission is always a keyof ServerPermissions. This error will never be thrown */ }
141+ < label > { permissionEnumToInfoMap . get ( ServerPermissions [ permission ] ) [ 0 ] } </ label >
142+ { /* @ts -expect-error permission is always a keyof ServerPermissions. This error will never be thrown */ }
143+ < p className = "text-sm text-gray-400 text-left w-full" > { permissionEnumToInfoMap . get ( ServerPermissions [ permission ] ) [ 1 ] } </ p >
144+ </ div >
145+
137146 </ div >
138147 ) ) }
139- < div className = "flex flex-row space-x-2" >
148+ < div className = "flex flex-row space-x-2 w-full " >
140149 < button
141- className = "bg-red-500 hover:bg-red-700 disabled:bg-red-900 rounded-md h-6 w-8 mt-2"
150+ className = "bg-red-500 hover:bg-red-700 disabled:bg-grey-600 rounded-md h-6 mt-2 w-full "
142151 type = "button"
143152 disabled = { isFormDisabled }
144153 onClick = { async ( ) => {
@@ -149,7 +158,7 @@ export function RoleEditForm({role, server, roles_length }: {role: Role, server:
149158 Delete
150159 </ button >
151160 < button
152- className = "bg-green-500 hover:bg-green-700 disabled:bg-green-900 rounded-md h-6 w-8 mt-2"
161+ className = "bg-green-500 hover:bg-green-700 disabled:bg-grey-600 rounded-md h-6 mt-2 w-full "
153162 disabled = { isFormDisabled }
154163 type = "submit"
155164 >
0 commit comments