import React, {Fragment, useEffect, useRef, useState} from 'react'; import {Dropdown, List, MenuProps, message, Popconfirm} from 'antd'; import VirtualList from 'rc-virtual-list'; import {Button, Drawer} from 'antd'; import {ListDiary, SelectDiary} from "@/components/type/Diary"; import TextArea from "antd/es/input/TextArea"; import style from "@/components/DiaryOption.module.css" import dayjs from "dayjs"; import {addTaskLogAPI, deleteTaskLogByIdAPI, editEnableFlagAPI} from "@/components/service/Diary"; import {ListRef} from "rc-virtual-list/lib/List"; import {copyToClipboard} from "@/lib/copyToClipboard"; import {useWindowSize} from "@/hooks/useWindowSize"; import {DetailModelForm} from "@/ui/task/project/DetailModelForm"; import {OPERATION_BUTTON_TYPE} from "@/lib/task/project/data"; const DiaryOption = (props: SelectDiary) => { // 抽屉 start const [open, setOpen] = useState(false); const onClose = () => { setOpen(false); }; // 抽屉 end const [shouldScroll, setShouldScroll] = React.useState(true); // 设置高度 start const {height} = useWindowSize(); const [containerHeight, setContainerHeight] = useState(400); useEffect(() => { setDiaryList([]) }, []); useEffect(() => { if (!open) return; // 使用 setTimeout 确保 Drawer 内容已渲染 const timer = setTimeout(() => { const innerDiv = document.querySelector('.ant-drawer-body'); const titleButtonHeight = document.querySelector('.titleButton'); // clientHeight:可视高度(包括 padding,但不包括 border、margin 和滚动条) // offsetHeight:总高度(包括 padding、border 和滚动条,但不包括 margin) // scrollHeight:内容总高度(包括不可见部分) if (innerDiv && titleButtonHeight) { console.log(innerDiv.clientHeight) setContainerHeight(innerDiv.clientHeight - titleButtonHeight.clientHeight) } }, 100); return () => clearTimeout(timer); // console.log({contentRef}) // const observer = new ResizeObserver((entries) => { // const entry = entries[0]; // setContentHeight(entry.contentRect.height); // }); // // observer.observe(contentRef.current); // // return () => observer.disconnect(); }, [open, height]); // 设置高度 end // 头按钮设置 start const [currentIndex, setCurrentIndex] = useState(1); // 头按钮设置 end // 数据 start const [diaryList, setDiaryList] = useState([]); const [diaryReduceList, setDiaryReduceList] = useState([]) const [page, setPage] = useState(1); const [selectLoading,setSelectLoading]=useState(false); const noMore = { id: '0', keyId: 'o0', createdDate: new Date(), description: '没有更多了', taskId: props.taskId, enableFlag: 'day-separate' }; const [noMoreFlag, setNoMoreFlag] = useState(false) const [sendValue, setSendValue] = useState(); const [sendValueFlag, setSendValueFlag] = useState(false); const handleSend = () => { if (sendValueFlag) { return } setSendValueFlag(true); if (!sendValue?.trim()) { message.info("发送信息不能为空"); return; } addTaskLogAPI({ description: sendValue!, taskId: props.taskId, enableFlag: '1' }).then(res => { setDiaryList([res.data.data, ...diaryList]) setSendValue(undefined) setShouldScroll(true); }).finally(() => { setSendValueFlag(false); }) } const appendData = (showMessage = true) => { if (!open) { return } setSelectLoading(true) const fakeDataUrl = process.env.NEXT_PUBLIC_TODO_REQUEST_URL + `/task/message/diary/select`; fetch(fakeDataUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', // 指定 JSON 格式 'Authorization': `Bearer ${localStorage.getItem('platform-security')}`, }, body: JSON.stringify({pageNumber: page, pageSize: 100, data: {taskId: props.taskId}}) }) .then((res) => res.json()) .then((body) => { const results = Array.isArray(body.data.content) ? body.data.content : []; if (results.length === 0) { diaryList.push(noMore); setNoMoreFlag(true); } setDiaryList(diaryList.concat(results)); setPage(page + 1); showMessage && message.success(`${results.length} more items loaded!`); if (!showMessage) { if (listRef && listRef.current && typeof listRef.current.scrollTo == 'function') { listRef.current.scrollTo({top: 9999999}); } } setSelectLoading(false) }); }; useEffect(() => { appendData(false); }, [open]); useEffect(() => { console.log("处理日志集合", diaryList) const returnResult: ListDiary[] = [] diaryList.filter(taskLog => { if (currentIndex === 0) { return true } else if (currentIndex === 1 && taskLog.enableFlag !== "0") { return true } else if (currentIndex === 2 && taskLog.enableFlag !== "1") { return true } else return false; }).reduce((map, taskLog) => { if (!map.has(dayjs(taskLog.createdDate).format("YYYY-MM-DD"))) { map.set(dayjs(taskLog.createdDate).format("YYYY-MM-DD"), []); } map.get(dayjs(taskLog.createdDate).format("YYYY-MM-DD"))?.push(taskLog); return map; }, new Map()).forEach((value, Key) => { returnResult.push(...value) returnResult.push({ description: dayjs(Key).isSame(dayjs(), 'date') ? "今天" : dayjs(Key).format("YYYY-MM-DD"), id: dayjs(Key).format("YYYY-MM-DD"), enableFlag: "day-separate", taskId: props.taskId, createdDate: new Date() }) }) setDiaryReduceList(returnResult.reverse()); }, [diaryList, currentIndex]); const listRef = useRef(null); const onScroll = (e: React.UIEvent) => { // Refer to: https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight#problems_and_solutions // if ( // Math.abs(e.currentTarget.scrollHeight - e.currentTarget.scrollTop - containerHeight) <= 1 && // !noMoreFlag // ) { // appendData(); // } if (e.currentTarget.scrollTop === 0 && !noMoreFlag) { appendData(); setShouldScroll(false); } }; // 数据 end // 滚动处理 start // 条件滚动 useEffect(() => { console.log({shouldScroll}, {listRef}) if (shouldScroll && listRef.current) { listRef.current.scrollTo({ top: 99999, }); } }, [diaryList, shouldScroll, open]); // 滚动处理 end // 点击操作 start const [clickTaskDiary, setClickTaskDiary] = useState() const onClickTaskDiary = (item: ListDiary, operate: string) => { if (clickTaskDiary == item && operate == 'L') { setClickTaskDiary(undefined) } else { setClickTaskDiary(item) } } // 删除操作 const [popConfirmOpen, setPopConfirmOpen] = useState(false); const [popConfirmLoading, setPopConfirmLoading] = useState(false); const popConfirmOk = () => { setPopConfirmLoading(true) if (clickTaskDiary) { deleteTaskLogByIdAPI(clickTaskDiary.id).then(res => { if (res.data.status.success) { setDiaryList(diaryList.filter(taskLog => taskLog.id != clickTaskDiary.id)) message.info("删除成功") setPopConfirmLoading(false) setPopConfirmOpen(false) } else { message.error(res.data.status.message) } }) } } const handleCancel = () => { setPopConfirmOpen(false) } const editEnableFlag = (enableFlag: string) => { if (clickTaskDiary) { editEnableFlagAPI(clickTaskDiary.id, enableFlag).then(res => { if (res.data.status.success) { setDiaryList(diaryList.map(taskLog => { if (taskLog.id == clickTaskDiary.id) { taskLog.enableFlag = enableFlag; } return taskLog; })) message.info("设置成功") } else { message.error(res.data.status.message) } }) } } const [addTaskOpen, setAddTaskOpen] = useState(false) const commonItems: MenuProps['items'] = [ { label: '复制', key: '1', onClick: () => { copyToClipboard(clickTaskDiary!.description).then(res => { res && message.info(`复制成功${clickTaskDiary!.description.length > 5 ? clickTaskDiary!.description.substring(0, 5) + "..." : clickTaskDiary!.description}`) }) } }, { label: '创建计划', key: '3', onClick: () => { // 打开添加任务窗口 setAddTaskOpen(true) } }, { label: '删除', key: '4', onClick: () => { setPopConfirmOpen(true) } }, { label: '取消', key: '5', onClick: () => { setClickTaskDiary(undefined) } }, ] const items: MenuProps['items'] = []; items.push(...commonItems) items.splice(1, 0, { label: '失效', key: '2', onClick: () => { editEnableFlag("0") }, }) const itemsEnable: MenuProps['items'] = []; itemsEnable.push(...commonItems) itemsEnable.splice(1, 0, { label: '生效', key: '2', onClick: () => { editEnableFlag("1") }, }) // 点击操作 end return (