import React, {useEffect, useRef, useState} from 'react'; import {Avatar, Dropdown, Input, List, MenuProps, message} 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} from "@/components/service/Diary"; import {ListBodyRef} from "antd/es/transfer/ListBody"; import {ListRef} from "rc-virtual-list/lib/List"; const CONTAINER_HEIGHT = 400; const PAGE_SIZE = 20; const DiaryOption = (props: SelectDiary) => { // 抽屉 start const [open, setOpen] = useState(false); const showDrawer = () => { setOpen(true); }; const onClose = () => { setOpen(false); }; // 抽屉 end // 头按钮设置 start const [currentIndex, setCurrentIndex] = useState(1); // 头按钮设置 end // 数据 start const [diaryList, setDiaryList] = useState([]); const [diaryReduceList, setDiaryReduceList] = useState([]) const [page, setPage] = useState(1); 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) }).finally(() => { setSendValueFlag(false); }) } const appendData = (showMessage = 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 }); } } }); }; useEffect(() => { appendData(false); // 视口高度 window.innerHeight }, []); useEffect(() => { console.log("处理日志集合", diaryList) const returnResult: ListDiary[] = [] diaryList.filter(taskLog => { if (currentIndex === 0) { return true } else if (currentIndex === 1 && taskLog.enableFlag === "1") { return true } else if (currentIndex === 2 && taskLog.enableFlag === "0") { 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 - CONTAINER_HEIGHT) <= 1 && !noMoreFlag ) { appendData(); } }; // 数据 end // 点击操作 start const [clickTaskDiary, setClickTaskDiary] = useState() const onClickTAskDiary = (item: ListDiary, operate: string) => { if (clickTaskDiary == item && operate == 'L') { setClickTaskDiary(undefined) } else { setClickTaskDiary(item) } } const items: MenuProps['items'] = [ { label: '复制', key: '1', onClick: () => { } }, { label: '失效', key: '2', }, { label: '创建计划', key: '3', }, { label: '删除', key: '4', }, { label: '取消', key: '5', }, ]; // 点击操作 end return ( <>