Skip to content
Open
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .prettierrc
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,6 @@
"tabWidth": 2,
"useTabs": false,
"plugins": ["prettier-plugin-organize-imports"],
"organizeImportsTypeOrder": "first"
"organizeImportsTypeOrder": "first",
"endOfLine": "auto"
}
41 changes: 39 additions & 2 deletions packages/client/components/app/menus/UserContextMenu.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { JSX, Match, Show, Switch } from "solid-js";
import { createEffect, JSX, Match, Show, Switch } from "solid-js";

import { Trans } from "@lingui-solid/solid/macro";
import { useNavigate } from "@solidjs/router";
Expand Down Expand Up @@ -56,6 +56,10 @@ export function UserContextMenu(props: {
// server context
const params = useSmartParams();

createEffect(() => {
console.log(props.channel?.type);
Comment thread
amycatgirl marked this conversation as resolved.
Outdated
});

/**
* Open direct message channel
*/
Expand Down Expand Up @@ -189,6 +193,17 @@ export function UserContextMenu(props: {
navigator.clipboard.writeText(props.user.id);
}

/**
* Remove user from group
*/
function removeMember() {
openModal({
type: "remove_member",
user: props.user,
group: props.channel!,
});
}

return (
<ContextMenu class="UserContextMenu">
<Show when={props.inVoice && !props.user.self}>
Expand Down Expand Up @@ -328,6 +343,23 @@ export function UserContextMenu(props: {
</Show>
</Show>

<Show
when={
props.channel?.type === "Group" &&
!props.user.self &&
props.channel.havePermission("ManageChannel") &&
!props.channel.owner?.self
}
>
<ContextMenuButton
icon={MdPersonRemove}
onClick={removeMember}
destructive
>
<Trans>Remove Member</Trans>
</ContextMenuButton>
</Show>

<Show
when={
!props.user.self &&
Expand All @@ -345,6 +377,8 @@ export function UserContextMenu(props: {
</ContextMenuButton>
</Show>

<ContextMenuDivider />

<Show when={!props.user.self}>
<ContextMenuButton icon={MdReport} onClick={reportUser} destructive>
<Trans>Report user</Trans>
Expand Down Expand Up @@ -414,11 +448,14 @@ export function UserContextMenu(props: {
* Provide floating user menus on this element
* @param user User
* @param member Server Member
* @param contextMessage Message
* @param contextGroup Group
*/
export function floatingUserMenus(
user: User,
member?: ServerMember,
contextMessage?: Message,
contextGroup?: Channel,
): JSX.Directives["floating"] & object {
return {
userCard: {
Expand All @@ -435,7 +472,7 @@ export function floatingUserMenus(
user={user}
member={member}
contextMessage={contextMessage}
channel={contextMessage?.channel}
channel={contextMessage?.channel ?? contextGroup}
/>
);
},
Expand Down
3 changes: 3 additions & 0 deletions packages/client/components/modal/modals.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ import { MFAFlowModal } from "./modals/MFAFlow";
import { MFARecoveryModal } from "./modals/MFARecovery";
import { OnboardingModal } from "./modals/Onboarding";
import { PolicyChangeModal } from "./modals/PolicyChange";
import { RemoveMemberModal } from "./modals/RemoveMember";
import { RenameSessionModal } from "./modals/RenameSession";
import { ReportContentModal } from "./modals/ReportContent";
import { ResetBotTokenModal } from "./modals/ResetBotToken";
Expand Down Expand Up @@ -183,6 +184,8 @@ export function RenderModal(props: ActiveModal & { onClose: () => void }) {
return <ResetBotTokenModal {...modalProps} />;
case "edit_category":
return <EditCategoryModal {...modalProps} />;
case "remove_member":
return <RemoveMemberModal {...modalProps} />;

default:
console.error(
Expand Down
50 changes: 50 additions & 0 deletions packages/client/components/modal/modals/RemoveMember.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import { Trans } from "@lingui-solid/solid/macro";

import { Avatar, Column, Dialog, DialogProps, Text } from "@revolt/ui";

import { useMutation } from "@tanstack/solid-query";
import { useModals } from "..";
import { Modals } from "../types";

/**
* Ban a server member with reason
*/
export function RemoveMemberModal(
props: DialogProps & Modals & { type: "remove_member" },
) {
const { showError } = useModals();

const removeMember = useMutation(() => ({
mutationFn: (user: string) => {
return props.group.removeMember(user);
},
onError: showError,
}));

return (
<Dialog
show={props.show}
onClose={props.onClose}
title={<Trans>Remove Member</Trans>}
actions={[
{ text: <Trans>Cancel</Trans> },
{
text: <Trans>Remove</Trans>,
onClick: () => removeMember.mutateAsync(props.user.id),
},
]}
isDisabled={removeMember.isPending}
>
<Column align>
<Avatar src={props.user.animatedAvatarURL} size={64} />
<Text>
<Trans>
Are you sure you want to remove{" "}
{props.user?.displayName ?? props.user.username} from{" "}
{props.group.name}?
</Trans>
</Text>
</Column>
</Dialog>
);
}
7 changes: 6 additions & 1 deletion packages/client/components/modal/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ import {
Emoji,
File,
ImageEmbed,
Message,
MFA,
MFATicket,
Message,
PublicBot,
PublicChannelInvite,
Server,
Expand Down Expand Up @@ -314,4 +314,9 @@ export type Modals =
type: "edit_category";
server: Server;
category: CategoryData;
}
| {
type: "remove_member";
group: Channel;
user: User;
};
16 changes: 11 additions & 5 deletions packages/client/src/interface/channels/text/MemberSidebar.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Match, Show, Switch, createEffect, createMemo, on } from "solid-js";
import { createEffect, createMemo, Match, on, Show, Switch } from "solid-js";

import { useLingui } from "@lingui-solid/solid/macro";
import { VirtualContainer } from "@minht11/solid-virtual-container";
Expand All @@ -16,9 +16,9 @@ import {
OverflowingText,
Row,
Tooltip,
UserStatus,
Username,
typography,
Username,
UserStatus,
} from "@revolt/ui";

interface Props {
Expand Down Expand Up @@ -311,7 +311,7 @@ export function GroupMemberSidebar(props: Props) {
width: "100%",
}}
>
<Member user={item.item} />
<Member user={item.item} group={props.channel} />
</div>
)}
</VirtualContainer>
Expand Down Expand Up @@ -378,7 +378,11 @@ const NameStatusStack = styled("div", {
/**
* Member
*/
function Member(props: { user?: User; member?: ServerMember }) {
function Member(props: {
user?: User;
member?: ServerMember;
group?: Channel;
}) {
const { t } = useLingui();

/**
Expand Down Expand Up @@ -408,6 +412,8 @@ function Member(props: { user?: User; member?: ServerMember }) {
use:floating={floatingUserMenus(
(props.user ?? props.member?.user)!,
props.member,
undefined,
props.group,
)}
>
<MenuButton
Expand Down
Loading