import { Drawer } from 'antd'; import produce from 'immer'; import React, { useEffect, useState } from 'react'; import { useMediaQuery } from 'react-responsive'; import AddUserModal from './components/ChatModal'; import MessageInput from './components/index'; import MessageHeader from './components/MessageHeader'; import MessageList from './components/MessageList'; import RoomList from './components/RoomList'; import { useChannel } from './hooks/useWebSocket'; import { getRoom, patchUpdateRoom } from './services/chat'; import styles from './style.module.css'; import { xs } from './utils/responsive'; type PropType = { username: string; room_id: string; to: (room_id?: string) => void; user_id: string; members: any[]; qiniu_url: string; }; const ChatRoom: React.FC = ({ room_id, username, to, user_id, members, qiniu_url }) => { const isXs = useMediaQuery(xs); const [chat, setChat] = useState({}); const [visible, setVisible] = useState(false); const [addVisible, setAddVisible] = useState(false); const [selectedUserIds, setSelectedUserIds] = useState([]); const [indeterminate, setIndeterminate] = React.useState(false); const [checkAll, setCheckAll] = React.useState(false); const onCheckAllChange = (e) => { setSelectedUserIds( e.target.checked ? members.filter((s) => chat.room?.allow_user_ids.every((i) => i !== s.user_id)).map((v) => v.user_id) : [] ); setIndeterminate(false); setCheckAll(e.target.checked); }; useChannel( `chat-room-record-${username}`, username, (obj) => { const { data } = obj; if (data.room_id !== room_id) { return; } if (data.message) { setChat( produce((draft: any) => { draft.records = chat.records.concat([data]); }) ); } }, { room_id } ); useEffect(() => { if (room_id) { getRoom(username, room_id) .then((res) => { setChat( produce((draft: any) => { draft.records = res.records; draft.room = res.room; draft.onlineUserIDs = res.online_user_ids; }) ); }) .catch(() => { to(); }); } }, [room_id, to, username]); const checked = (v) => { return chat.room ? selectedUserIds.includes(v.user_id) || chat.room.allow_user_ids.some((i) => i === v.user_id) : false; }; const disabled = (v) => { return chat.room ? chat.room.allow_user_ids.some((i) => i === v.user_id) : true; }; return (
{isXs ? (
) : (
)}
checked(v)} disabled={(v) => disabled(v)} title="添加成员" okText="增加" defaultValue={chat.room ? chat.room.name : ''} onOk={() => { if (chat.room) { setChat( produce((draft: any) => { if (draft.room) { draft.room.allow_user_ids = chat.room.allow_user_ids.concat(selectedUserIds); } }) ); patchUpdateRoom( username, chat.room.id, chat.room.name, selectedUserIds.concat(chat.room.allow_user_ids) ).then(() => { setVisible(false); setAddVisible(false); setSelectedUserIds([]); }); } }} />
); }; export default ChatRoom;