@@ -9,15 +9,20 @@ import {
99} from 'react' ;
1010import { getChannelsInServer } from '@/services/channels.service' ;
1111import ServersIcon from '../icons/ServersIcon' ;
12- import { useSupabaseClient } from '@supabase/auth-helpers-react' ;
12+ import { useSupabaseClient , useUser } from '@supabase/auth-helpers-react' ;
1313import styles from '@/styles/Servers.module.css' ;
1414import { Channel , Server as ServerType } from '@/types/dbtypes' ;
1515import { ServerMemberStats } from './ServerMemberStats' ;
1616import { OverflowMarquee } from './OverflowMarquee' ;
17- import { useChannel , useSetChannel } from '@/lib/store' ;
17+ import { useChannel , useServerUserProfilePermissions , useSetChannel } from '@/lib/store' ;
1818import { ChannelMediaIcon } from '../icons/ChannelMediaIcon' ;
19- import { Tooltip } from 'react-tooltip' ;
2019import ChannelName from './ChannelName' ;
20+ import ServerSettingsModal from '@/components/home/modals/ServerSettingsModal' ;
21+ import AddChannelModal from '@/components/home/modals/AddChannelModal' ;
22+ import * as DropdownMenu from '@radix-ui/react-dropdown-menu' ;
23+ import { ServerPermissions } from '@/types/permissions' ;
24+ import PlusIcon from '@/components/icons/PlusIcon' ;
25+ import GearIcon from '@/components/icons/GearIcon' ;
2126
2227export default function Server ( {
2328 server,
@@ -37,6 +42,11 @@ export default function Server({
3742 const [ channels , setChannels ] = useState < Channel [ ] > ( [ ] ) ;
3843 const currentChannel = useChannel ( ) ;
3944
45+ const [ showServerSettingsModal , setShowServerSettingsModal ] = useState ( false ) ;
46+ const [ showAddChannelModal , setShowAddChannelModal ] = useState ( false ) ;
47+
48+ const user = useUser ( ) ;
49+ const serverPermissions = useServerUserProfilePermissions ( server . id , user ?. id ! ) ;
4050 useEffect ( ( ) => {
4151 const handleAsync = async ( ) => {
4252 if ( server ) {
@@ -60,6 +70,16 @@ export default function Server({
6070 if ( expand ) {
6171 return (
6272 < div className = "relative overflow-x-visible" >
73+ < ServerSettingsModal
74+ showModal = { showServerSettingsModal }
75+ setShowModal = { setShowServerSettingsModal }
76+ server = { server }
77+ />
78+ < AddChannelModal
79+ showModal = { showAddChannelModal }
80+ setShowModal = { setShowAddChannelModal }
81+ serverId = { expanded }
82+ />
6383 < div className = "border-b-2 border-grey-700 py-2 px-3 flex bg-grey-600 justify-between rounded-xl items-center relative z-10" >
6484 < div className = "flex items-center" >
6585 < div
@@ -75,15 +95,51 @@ export default function Server({
7595 < ServerMemberStats server = { server } />
7696 </ div >
7797 </ div >
78- < div
79- onMouseEnter = { ( ) => setIsSettingsHovered ( true ) }
80- onMouseLeave = { ( ) => setIsSettingsHovered ( false ) }
81- className = "hover:cursor-pointer"
82- data-tooltip-id = "serverSettings"
83- data-tooltip-place = "right"
84- >
85- < VerticalSettingsIcon hovered = { isSettingsHovered } />
86- </ div >
98+ < DropdownMenu . Root >
99+ < DropdownMenu . Trigger
100+ asChild
101+ disabled = {
102+ ! ( ( serverPermissions & ServerPermissions . MANAGE_MESSAGES ) > 0 ||
103+ ( serverPermissions & ServerPermissions . OWNER ) > 0 ||
104+ ( serverPermissions & ServerPermissions . MANAGE_SERVER ) > 0 )
105+ }
106+ >
107+ < div
108+ onMouseEnter = { ( ) => setIsSettingsHovered ( true ) }
109+ onMouseLeave = { ( ) => setIsSettingsHovered ( false ) }
110+ className = "hover:cursor-pointer"
111+ >
112+ < VerticalSettingsIcon hovered = { isSettingsHovered } />
113+ </ div >
114+ </ DropdownMenu . Trigger >
115+ < DropdownMenu . Portal >
116+ < DropdownMenu . Content className = "ContextMenuContent" side = 'right' >
117+ < DropdownMenu . Item asChild
118+ className = "flex justify-center items-center hover:text-grey-300 cursor-pointer"
119+ onClick = { ( ) => {
120+ setShowAddChannelModal ( true ) ;
121+ } }
122+ >
123+ < div className = "flex flex-row w-full" >
124+ < PlusIcon width = { 5 } height = { 5 } />
125+ < span className = "ml-2 w-full" > New channel</ span >
126+ </ div >
127+ </ DropdownMenu . Item >
128+ < DropdownMenu . Item asChild
129+ className = "flex justify-center items-center hover:text-grey-300 cursor-pointer"
130+ onClick = { ( ) => {
131+ setShowServerSettingsModal ( true ) ;
132+ } }
133+ hidden = { ( serverPermissions & ServerPermissions . MANAGE_SERVER ) === 0 }
134+ >
135+ < div className = "flex flex-row w-full" >
136+ < GearIcon width = { 5 } height = { 5 } />
137+ < span className = "ml-2 w-full" > Server Settings</ span >
138+ </ div >
139+ </ DropdownMenu . Item >
140+ </ DropdownMenu . Content >
141+ </ DropdownMenu . Portal >
142+ </ DropdownMenu . Root >
87143 </ div >
88144 < div className = "channels bg-grey-700 rounded-lg relative -top-3 py-4 px-7 " >
89145 { channels . map ( ( channel : Channel , idx : number ) => (
0 commit comments