/* eslint-disable eqeqeq */ import { AddReply } from '@/components/DragModal/formdoms'; import ReplyCard from '@/components/Reply/ReplyCard'; import { doFetch, getFetch } from '@/utils/doFetch'; import { LoadingOutlined, SendOutlined } from '@ant-design/icons'; import { useModel, useParams } from '@umijs/max'; import { useRequest } from 'ahooks'; import { Avatar, Drawer, message, Select, Tooltip } from 'antd'; import { useEffect, useRef, useState } from 'react'; function Reply({ drawer, userList, children, extra, full }) { const { id } = useParams(); const [doreply, setdoreply] = useState(false); const { initialState: { currentUser, curitem }, setInitialState, } = useModel('@@initialState'); const formRef = useRef(); const [submitdata, setsubmitdata] = useState({ project_id: parseInt(id), item_id: null, bereply_userid: drawer?.userInfo?.id, other: [], }); useEffect(() => { setsubmitdata((s) => ({ ...s, project_id: parseInt(id), bereply_userid: drawer?.userInfo?.id, other: drawer?.open ? doreply?.other ?? [] : [], })); }, [drawer?.userInfo?.id, id, doreply?.other, drawer?.open]); const allmsg = useRequest( async () => { if (!drawer.open) return; let res = await getFetch({ url: '/webtool/v1/allmsg', params: { item_id: drawer?.id ?? 0 } }); return res?.data; }, { refreshDeps: [drawer?.id, drawer?.open, curitem], }, ); const { run, loading } = useRequest( (params) => { return doFetch(params); }, { manual: true, debounceWait: 600, onSuccess: (res) => { allmsg?.refresh(); if (res?.code === 0) { formRef.current.setFieldsValue({ reply: '' }); setdoreply(false); setsubmitdata(s=>({ ...s, other:[] })) } }, }, ); return ( <Drawer maskStyle={{ backgroundColor: 'transparent', }} contentWrapperStyle={full ? {} : { maxWidth: 1280 }} placement="right" extra={extra(setdoreply)} width={full?"100vw":"100%"} destroyOnClose {...drawer} closable={drawer?.closable} > <div onClick={() => { setdoreply(false); }} > <div style={{ padding: 18 }}>{children}</div> {allmsg?.data?.map((it) => { return ( <ReplyCard key={it?.id} {...it} drawer={drawer} doreply={doreply} run={run} loading={loading} currentUser={currentUser} curitem={curitem} formRef={formRef} setdoreply={(val) => { setdoreply(val); }} /> ); })} <div style={{ height: doreply ? 490 : 66 }}></div> </div> {drawer?.val === 'reply' && currentUser?.user_name && ( <div style={{ position: 'fixed', bottom: 0, backgroundColor: '#fff', padding: '12px', borderTop: '1px solid #ddd', width:full? drawer?.bp?'calc(100vw - 24px)':"calc(70vw - 24px)" :"auto" }} onClick={() => { if (doreply === false) { setdoreply(drawer?.userInfo); } }} > <div style={{ height: doreply ? 460 : 40, overflow: 'hidden', display: 'flex', transition: 'all 0.2s', width: '100%', flexDirection: 'column', }} > <div className="center"> <div className="info"> <Tooltip title={currentUser.user_name}> <Avatar size="large" src={currentUser?.head_url || null}> {currentUser?.head_url ? null : currentUser.user_name?.charAt(0)} </Avatar> </Tooltip> </div> <div className="spread" style={{ flex: 1 }}> <div style={{ position: 'absolute', top: 0, left: 0, right: 0, margin: 'auto', width: 54, height: 3, borderRadius: 6, backgroundColor: '#ccc', }} ></div> <div className="centerl" style={{ flex: 1 }}> <span> 回复 <b>{doreply?.user_name ?? '-'}</b> </span> <b style={{ padding: '0 12px', fontSize: 16 }}>@</b> <Select mode="multiple" allowClear value={submitdata?.other} onChange={(val) => { setsubmitdata((s) => ({ ...s, other: val, })); }} placeholder="请选择" options={userList ?.filter((it) => it.id !== currentUser?.id && it?.id !== doreply?.id) ?.map((it) => { return { label: it?.user_name, value: it?.id, }; })} style={{ width: '120px' }} maxTagCount={1} ></Select> </div> <div className="sorts" style={{ width: 66, height: 32, backgroundColor: 'rgb(24, 144, 255)', color: '#fff', }} onClick={async (e) => { e.stopPropagation(); if (loading || !doreply) { setdoreply(drawer?.userInfo); return; } const reply = formRef.current.getFieldFormatValue('reply'); const div = document.createElement('div'); div.innerHTML = reply; if (div.innerText === '' || div.innerText.replace(/\s*/g, '') === '') { message.warning('请至少回复一句话!'); return; } let extra = {}; if (doreply?.curid) { extra = { msg_id: doreply?.curid }; } // 设置提及人员 const other = submitdata?.other?.toString() ?? ''; if (doreply?.type == 'edit2') { run({ url: '/webtool/v1/msg/' + doreply?.curitemid, params: { ...submitdata, ...extra, other, item_id: drawer?.id, reply, }, method: 'PUT', }); return; } if (doreply?.type == 'edit1') { run({ url: '/webtool/v1/msg/' + doreply?.curid, params: { ...submitdata, other, item_id: drawer?.id, reply, }, method: 'PUT', }); return; } run({ url: '/webtool/v1/msg', params: { ...submitdata, ...extra, other, item_id: drawer?.id, reply, bereply_userid: doreply?.id, }, }); }} > <b>回复</b> {loading ? ( <LoadingOutlined></LoadingOutlined> ) : ( <SendOutlined style={{ color: '#fff' }} /> )} </div> </div> </div> <div style={{ padding: "0 4px",flex:1,marginTop:-12 }}> <AddReply formRef={formRef}></AddReply> </div> </div> </div> )} </Drawer> ); } export default Reply;