ChatModerationActionMenu.tsx 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import {
  2. CloseCircleOutlined,
  3. ExclamationCircleOutlined,
  4. EyeInvisibleOutlined,
  5. SmallDashOutlined,
  6. } from '@ant-design/icons';
  7. import { Dropdown, Menu, MenuProps, Space, message, Modal as AntModal } from 'antd';
  8. import { FC, useState } from 'react';
  9. import { Modal } from '../../ui/Modal/Modal';
  10. import { ChatModerationDetailsModal } from '~/components/chat/ChatModerationDetailsModal/ChatModerationDetailsModal';
  11. import styles from './ChatModerationActionMenu.module.scss';
  12. import ChatModeration from '~/services/moderation-service';
  13. const { confirm } = AntModal;
  14. export type ChatModerationActionMenuProps = {
  15. accessToken: string;
  16. messageID: string;
  17. userID: string;
  18. userDisplayName: string;
  19. };
  20. export const ChatModerationActionMenu: FC<ChatModerationActionMenuProps> = ({
  21. messageID,
  22. userID,
  23. userDisplayName,
  24. accessToken,
  25. }) => {
  26. const [showUserDetailsModal, setShowUserDetailsModal] = useState(false);
  27. const handleBanUser = async () => {
  28. try {
  29. await ChatModeration.banUser(userID, accessToken);
  30. } catch (e) {
  31. console.error(e);
  32. message.error(e);
  33. }
  34. };
  35. const handleHideMessage = async () => {
  36. try {
  37. await ChatModeration.removeMessage(messageID, accessToken);
  38. } catch (e) {
  39. console.error(e);
  40. message.error(e);
  41. }
  42. };
  43. const confirmHideMessage = async () => {
  44. confirm({
  45. icon: <ExclamationCircleOutlined />,
  46. content: `Are you sure you want to remove this message from ${userDisplayName}?`,
  47. onOk() {
  48. handleHideMessage();
  49. },
  50. });
  51. };
  52. const confirmBanUser = async () => {
  53. confirm({
  54. icon: <ExclamationCircleOutlined />,
  55. content: `Are you sure you want to ban ${userDisplayName} from chat?`,
  56. onOk() {
  57. handleBanUser();
  58. },
  59. });
  60. };
  61. const onMenuClick: MenuProps['onClick'] = ({ key }) => {
  62. if (key === 'hide-message') {
  63. confirmHideMessage();
  64. } else if (key === 'ban-user') {
  65. confirmBanUser();
  66. } else if (key === 'more-info') {
  67. setShowUserDetailsModal(true);
  68. }
  69. };
  70. const menu = (
  71. <Menu
  72. onClick={onMenuClick}
  73. items={[
  74. {
  75. label: (
  76. <div>
  77. <span className={styles.icon}>
  78. <EyeInvisibleOutlined />
  79. </span>
  80. Hide Message
  81. </div>
  82. ),
  83. key: 'hide-message',
  84. },
  85. {
  86. label: (
  87. <div>
  88. <span className={styles.icon}>
  89. <CloseCircleOutlined />
  90. </span>
  91. Ban User
  92. </div>
  93. ),
  94. key: 'ban-user',
  95. },
  96. {
  97. label: <div>More Info...</div>,
  98. key: 'more-info',
  99. },
  100. ]}
  101. />
  102. );
  103. return (
  104. <>
  105. <Dropdown overlay={menu} trigger={['click']}>
  106. <button type="button" onClick={e => e.preventDefault()}>
  107. <Space>
  108. <SmallDashOutlined />
  109. </Space>
  110. </button>
  111. </Dropdown>
  112. <Modal
  113. title={userDisplayName}
  114. visible={showUserDetailsModal}
  115. handleCancel={() => {
  116. setShowUserDetailsModal(false);
  117. }}
  118. >
  119. <ChatModerationDetailsModal userId={userID} accessToken={accessToken} />
  120. </Modal>
  121. </>
  122. );
  123. };