Skip to content

Commit a9ada54

Browse files
committed
debug commit
1 parent 95a6156 commit a9ada54

5 files changed

Lines changed: 90 additions & 32 deletions

File tree

components/forms/RoleEditForm.tsx

Lines changed: 35 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,20 @@
1-
import { useUserServerPerms } from '@/lib/store';
1+
import { useUserHighestRolePosition, useUserServerPerms } from '@/lib/store';
22
import { createRole, decrementRolePosition, deleteRole, incrementRolePosition, updateRole } from '@/services/roles.service';
33
import { Role, Server } from '@/types/dbtypes';
44
import { ServerPermissions } from '@/types/permissions';
55
import { useSupabaseClient } from '@supabase/auth-helpers-react';
66
import { 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

2220
type RoleEditFormResult = {
@@ -28,16 +26,24 @@ type RoleEditFormResult = {
2826

2927
export 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
>

components/home/ServerList.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import AddChannelModal from '@/components/home/modals/AddChannelModal';
99
import {
1010
useConnectionRef,
1111
useGetServers,
12+
useGetUserHighestRolePosition,
1213
useGetUserPermsForServer,
1314
useServers,
1415
useUserServerPerms,
@@ -43,6 +44,7 @@ export default function ServerList() {
4344
const getServers = useGetServers();
4445

4546
const getUserServerPerms = useGetUserPermsForServer();
47+
const getUserHighestRolePosition = useGetUserHighestRolePosition();
4648
const userServerPerms = useUserServerPerms();
4749
const isInVoice = useConnectionRef();
4850

@@ -52,10 +54,11 @@ export default function ServerList() {
5254
if (getServers) {
5355
if (user) {
5456
getUserServerPerms(supabase, expanded, user.id);
57+
getUserHighestRolePosition(supabase, expanded, user.id);
5558
getServers(supabase, user.id);
5659
}
5760
}
58-
}, [getServers, supabase, user, getUserServerPerms, expanded]);
61+
}, [getServers, supabase, user, getUserServerPerms, expanded, getUserHighestRolePosition]);
5962

6063
// HACK: At the time of component render, the servers are not yet loaded into the store.
6164
useEffect(() => {

components/home/modals/AddChannelModal.tsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,7 @@ export default function AddChannelModal({
3232
const [channelType, setChannelType] = useState<'media' | 'text'>('text');
3333

3434
const supabase = useSupabaseClient();
35-
3635
const user = useUser();
37-
3836
const getUserServerPerms = useGetUserPermsForServer();
3937

4038
const {
@@ -73,15 +71,19 @@ export default function AddChannelModal({
7371
if (error) {
7472
if ((error as PostgrestError).message) {
7573
setServerError((error as PostgrestError).message);
76-
} else {
74+
}
75+
76+
else {
7777
setServerError(error as string);
7878
}
7979

8080
setTimeout(() => {
8181
setServerError('');
8282
}, 7000);
8383
return;
84-
} else {
84+
}
85+
86+
else {
8587
addChannelRef.current?.close();
8688
setChannelType('text');
8789
setSetShowDesc(false);

lib/store.ts

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import {
2828
getAllDMChannels,
2929
} from '@/services/directmessage.service';
3030
import { Room } from '@/types/client/room';
31-
import { getRolesFromAllServersUserIsIn, getServerRoles } from '@/services/roles.service';
31+
import { getRolesFromAllServersUserIsIn, getServerRoles, getHighestRolePositionForUser } from '@/services/roles.service';
3232
import { ChannelPermissions, ServerPermissions } from '@/types/permissions';
3333

3434
export interface ServerState {
@@ -181,17 +181,28 @@ const useMessagesStore = create<MessagesState>()((set) => ({
181181
export interface UserPermsState {
182182
userPerms: ChannelPermissions;
183183
userServerPerms: ServerPermissions;
184+
userHighestRolePosition: number;
185+
184186
getUserPerms: (supabase: SupabaseClient<Database>, channelId: number) => void;
185187
getUserPermsForServer: (
186188
supabase: SupabaseClient<Database>,
187189
server_id: number,
188190
userId?: string
189191
) => void;
192+
193+
getHighestRolePositionForUser: (
194+
supabase: SupabaseClient<Database>,
195+
serverId: number,
196+
userId: string
197+
) => void;
198+
190199
}
191200

192201
const useUserPermsStore = create<UserPermsState>()((set) => ({
193202
userPerms: 0,
194203
userServerPerms: 0,
204+
userHighestRolePosition: 36767, // Max value for a role position
205+
195206
getUserPerms: async (supabase, channelId) => {
196207
const { data, error } = await getCurrentUserChannelPermissions(
197208
supabase,
@@ -221,6 +232,24 @@ const useUserPermsStore = create<UserPermsState>()((set) => ({
221232
set({ userServerPerms: data });
222233
}
223234
},
235+
236+
getHighestRolePositionForUser: async (supabase, serverId, userId) => {
237+
const { data, error } = await getHighestRolePositionForUser(
238+
supabase,
239+
serverId,
240+
userId
241+
);
242+
243+
if (error) {
244+
console.log(error);
245+
}
246+
247+
console.log('highestRolePosSet ', data);
248+
249+
if (data) {
250+
set({ userHighestRolePosition: data });
251+
}
252+
}
224253
}));
225254

226255
export interface ChannelState {
@@ -649,8 +678,12 @@ export const useFlagUserOffline = () =>
649678
useOnlineStore((state) => state.flagUserOffline);
650679
export const useGetUserPermsForServer = () =>
651680
useUserPermsStore((state) => state.getUserPermsForServer);
681+
export const useGetUserHighestRolePosition = () =>
682+
useUserPermsStore((state) => state.getHighestRolePositionForUser);
652683
export const useUserServerPerms = () =>
653684
useUserPermsStore((state) => state.userServerPerms);
685+
export const useUserHighestRolePosition = () =>
686+
useUserPermsStore((state) => state.userHighestRolePosition);
654687
export const useAddDMChannel = () =>
655688
useDMChannelsStore((state) => state.addDMChannel);
656689
export const useDMChannels = () =>

services/roles.service.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,3 +105,14 @@ export async function decrementRolePosition(
105105
type DecrementRolePositionResponse = Awaited<ReturnType<typeof decrementRolePosition>>;
106106
export type DecrementRolePositionResponseSuccess = DecrementRolePositionResponse['data'];
107107
export type DecrementRolePositionResponseError = DecrementRolePositionResponse['error'];
108+
109+
export async function getHighestRolePositionForUser(
110+
supabase: SupabaseClient<Database>,
111+
server_id: number,
112+
user_id: string
113+
) {
114+
return await supabase
115+
.rpc('get_highest_role_position_for_user', { s_id: server_id, p_id: user_id })
116+
.returns<number>()
117+
.single();
118+
}

0 commit comments

Comments
 (0)