owncast/web/components/chat/ChatModerationActionMenu/ChatModerationActionMenu.tsx

131 lines
3.1 KiB
TypeScript
Raw Normal View History

import {
CloseCircleOutlined,
ExclamationCircleOutlined,
EyeInvisibleOutlined,
SmallDashOutlined,
} from '@ant-design/icons';
import { Dropdown, Menu, MenuProps, Space, Modal, message } from 'antd';
import { useState } from 'react';
refactor(stories): co-locate stories with components (#2078) * refactor: move ActionButton component * refactor: move BanUserButton component * refactor: move ChatActionMessage component * refactor: move ChatContainer component * refactor: move AuthModal component * refactor: move BrowserNotifyModal component * refactor: move ChatUserMessage component * refactor: move ChatJoinMessage component * refactor: move ChatTextField component * refactor: move ChatUserBadge component * refactor: move FollowerCollection and SingleFollower components * fix: bad import path * refactor: move FollowModal component * refactor: move Modal component * refactor: move ContentHeader component * refactor: move ChatSystemMessage component * refactor: move Header component * refactor: move Footer component * refactor: move StatusBar component * refactor: move OfflineBanner component * refactor: move OwncastPlayer component * refactor: move IndieAuthModal component * refactor: move SocialLinks component * refactor: move VideoPoster component * refactor: move FollowModal component * refactor: move FediAuthModal.tsx component * refactor: move UserDropdown component * refactor: move ChatSocialMessage component * refactor: move Logo component * refactor: move NotifyReminderPopup component * refactor: move NameChangeModal component * refactor: move FatalErrorStateModal component * refactor: move ChatModeratorNotification component * refactor: move ChatModerationActionMenu and ChatModerationDetailsModal components * refactor: move CustomPageContent component * refactor: move storybook Introduction file * refactor: update storybook story import path * refactor: move storybook preview styles * refactor: move storybook doc pages * refactor: move Color and ImageAsset components * fix: bad import path * fix: bad import path in story file
2022-09-03 21:38:52 +03:00
import ChatModerationDetailsModal from '../ChatModerationDetailsModal/ChatModerationDetailsModal';
import s from './ChatModerationActionMenu.module.scss';
import ChatModeration from '../../../services/moderation-service';
const { confirm } = Modal;
interface Props {
accessToken: string;
messageID: string;
userID: string;
userDisplayName: string;
}
export default function ChatModerationActionMenu(props: Props) {
const { messageID, userID, userDisplayName, accessToken } = props;
const [showUserDetailsModal, setShowUserDetailsModal] = useState(false);
const handleBanUser = async () => {
try {
await ChatModeration.banUser(userID, accessToken);
} catch (e) {
console.error(e);
message.error(e);
}
};
const handleHideMessage = async () => {
try {
await ChatModeration.removeMessage(messageID, accessToken);
} catch (e) {
console.error(e);
message.error(e);
}
};
const confirmHideMessage = async () => {
confirm({
icon: <ExclamationCircleOutlined />,
content: `Are you sure you want to remove this message from ${userDisplayName}?`,
onOk() {
handleHideMessage();
},
});
};
const confirmBanUser = async () => {
confirm({
icon: <ExclamationCircleOutlined />,
content: `Are you sure you want to ban ${userDisplayName} from chat?`,
onOk() {
handleBanUser();
},
});
};
const onMenuClick: MenuProps['onClick'] = ({ key }) => {
if (key === 'hide-message') {
confirmHideMessage();
} else if (key === 'ban-user') {
confirmBanUser();
} else if (key === 'more-info') {
setShowUserDetailsModal(true);
}
};
const menu = (
<Menu
onClick={onMenuClick}
items={[
{
label: (
<div>
<span className={s.icon}>
<EyeInvisibleOutlined />
</span>
Hide Message
</div>
),
key: 'hide-message',
},
{
label: (
<div>
<span className={s.icon}>
<CloseCircleOutlined />
</span>
Ban User
</div>
),
key: 'ban-user',
},
{
label: <div>More Info...</div>,
key: 'more-info',
},
]}
/>
);
return (
<>
<Dropdown overlay={menu} trigger={['click']}>
<button type="button" onClick={e => e.preventDefault()}>
<Space>
<SmallDashOutlined />
</Space>
</button>
</Dropdown>
<Modal
visible={showUserDetailsModal}
okText="Ban User"
okButtonProps={{ danger: true }}
onOk={handleBanUser}
onCancel={() => {
setShowUserDetailsModal(false);
}}
>
<ChatModerationDetailsModal userId={userID} accessToken={accessToken} />
</Modal>
</>
);
}