Skip to content

Commit 4da61cc

Browse files
committed
implement leave/delete server options
1 parent a4a5b19 commit 4da61cc

2 files changed

Lines changed: 53 additions & 2 deletions

File tree

components/home/Server.tsx

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ import * as DropdownMenu from '@radix-ui/react-dropdown-menu';
2424
import { ServerPermissions } from '@/types/permissions';
2525
import PlusIcon from '@/components/icons/PlusIcon';
2626
import GearIcon from '@/components/icons/GearIcon';
27+
import { deleteServer, leaveServer } from '@/services/server.service';
28+
import TrashIcon from '@/components/icons/TrashIcon';
2729

2830
export default function Server({
2931
server,
@@ -57,6 +59,8 @@ export default function Server({
5759
handleAsync();
5860
}, [server, supabase]);
5961

62+
console.log((serverPermissions & 1) === 0 ? 'Not owner' : 'Owner' );
63+
6064
if (expand) {
6165
return (
6266
<div className="relative overflow-x-visible">
@@ -127,6 +131,35 @@ export default function Server({
127131
<span className="ml-2 w-full">Server Settings</span>
128132
</div>
129133
</DropdownMenu.Item>
134+
<DropdownMenu.Separator className="DropdownMenuSeparator" />
135+
{(serverPermissions & 1) === 0 && (
136+
<DropdownMenu.Item asChild
137+
className="flex justify-center items-center text-red-500 hover:text-grey-300 cursor-pointer"
138+
onClick={async () => {
139+
await leaveServer(supabase, user!.id, server.id);
140+
}}
141+
hidden={(serverPermissions & 1) === 1}
142+
>
143+
<div className="flex flex-row w-full">
144+
<GearIcon width={5} height={5} />
145+
<span className="ml-2 w-full">Leave Server</span>
146+
</div>
147+
</DropdownMenu.Item>
148+
)}
149+
{(serverPermissions & 1) === 1 && (
150+
<DropdownMenu.Item asChild
151+
className="flex justify-center items-center text-red-500 hover:text-grey-300 cursor-pointer"
152+
onClick={async () => {
153+
// TODO: Add confirmation modal
154+
await deleteServer(supabase, server.id);
155+
}}
156+
>
157+
<div className="flex flex-row w-full">
158+
<TrashIcon />
159+
<span className="ml-2 w-full">Delete Server</span>
160+
</div>
161+
</DropdownMenu.Item>
162+
)}
130163
</DropdownMenu.Content>
131164
</DropdownMenu.Portal>
132165
</DropdownMenu.Root>

services/server.service.ts

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,19 +65,37 @@ export type UpdateServerResponseError = UpdateServerResponse['error'];
6565

6666
export async function deleteServer(
6767
supabase: SupabaseClient<Database>,
68-
user_id: string,
6968
server_id: number
7069
) {
7170
// NOTE: only the owner should be able to delete a server. This is enforced by RLS
7271
// NOTE: Supabase has been set up to cascade delete all items related to a server (roles/invites/channels/messages)
7372
// So we can delete the server itself
74-
return await supabase.from('servers').delete().eq('id', server_id);
73+
return await supabase
74+
.from('servers')
75+
.delete()
76+
.eq('id', server_id);
7577
}
7678

7779
type DeleteServerResponse = Awaited<ReturnType<typeof deleteServer>>;
7880
export type DeleteServerResponseSuccess = DeleteServerResponse['data'];
7981
export type DeleteServerResponseError = DeleteServerResponse['error'];
8082

83+
export async function leaveServer(
84+
supabase: SupabaseClient<Database>,
85+
user_id: string,
86+
server_id: number
87+
) {
88+
return await supabase
89+
.from('server_users')
90+
.delete()
91+
.eq('profile_id', user_id)
92+
.eq('server_id', server_id);
93+
}
94+
95+
type LeaveServerResponse = Awaited<ReturnType<typeof leaveServer>>;
96+
export type LeaveServerResponseSuccess = LeaveServerResponse['data'];
97+
export type LeaveServerResponseError = LeaveServerResponse['error'];
98+
8199
export async function getServersForUser(
82100
supabase: SupabaseClient<Database>,
83101
user_id: string

0 commit comments

Comments
 (0)