assistant-todo-mobile/src/pages/ToDoList/index.js

211 lines
12 KiB
JavaScript
Raw Normal View History

2024-12-29 08:14:08 -05:00
import {Card, Dialog, Image, InfiniteScroll, List, PullToRefresh, SwipeAction} from 'antd-mobile'
2024-12-29 04:48:35 -05:00
import React, {Fragment, useEffect, useRef, useState} from 'react'
2024-12-27 06:06:20 -05:00
import {
DragDropContext,
Draggable,
Droppable,
// DropResult,
} from 'react-beautiful-dnd'
import {getTaskList} from "../../utils";
import "./index.css"
2025-01-05 05:04:52 -05:00
import {useLocation, useOutletContext} from "react-router-dom";
import dayjs from "dayjs";
import {DATE_TIME_FORMAT} from "../../utils/timeFormatUtil";
2024-12-27 06:06:20 -05:00
const reorder = (
list,
startIndex,
endIndex
) => {
const result = Array.from(list)
const [removed] = result.splice(startIndex, 1)
result.splice(endIndex, 0, removed)
return result
}
const ToDoList = () => {
const [taskList, setTaskList] = useState([])
2025-01-08 06:28:29 -05:00
const [hasMore, setHasMore] = useState(true)
2024-12-29 04:48:35 -05:00
const [pageNumber, setPageNumber] = useState(1)
2025-01-05 05:04:52 -05:00
let loading = false;
2024-12-30 06:24:34 -05:00
const location = useLocation();
2025-01-05 05:04:52 -05:00
const {search: outletSearch} = useOutletContext()
const search = location.state ? location.state.search : outletSearch;
console.log("ToDoList.search", location, outletSearch)
2024-12-29 04:48:35 -05:00
async function loadMore() {
2025-01-05 05:04:52 -05:00
if (loading) {
return
}
loading = true;
console.log("loadMore", loading)
getTaskList({...search, "pageNumber": pageNumber + 1}).then(result => {
2024-12-31 08:53:20 -05:00
setTaskList(val => [...val, ...result.content])
2025-01-05 05:04:52 -05:00
setHasMore(result.page.number < result.page.totalPages)
2024-12-29 04:48:35 -05:00
})
2024-12-29 08:14:08 -05:00
setPageNumber(pageNumber + 1)
2025-01-05 05:04:52 -05:00
loading = false;
2024-12-29 04:48:35 -05:00
}
2024-12-29 08:14:08 -05:00
2024-12-27 06:06:20 -05:00
useEffect(() => {
2025-01-05 05:04:52 -05:00
getTaskList({...search, "pageNumber": pageNumber}).then(result => {
2024-12-31 08:53:20 -05:00
setTaskList(result.content)
2024-12-27 06:06:20 -05:00
})
}, [])
const onDragEnd = (result) => {
if (!result.destination) return
const newList = reorder(taskList, result.source.index, result.destination.index)
setTaskList([...newList])
}
const ref = useRef(null)
return (
2024-12-29 04:48:35 -05:00
<Fragment>
2025-01-05 05:04:52 -05:00
{/* 下拉刷新 */}
2024-12-29 04:48:35 -05:00
<PullToRefresh
onRefresh={async () => {
2025-01-05 05:04:52 -05:00
getTaskList({...search, "pageNumber": 1}).then(result => {
2024-12-31 08:53:20 -05:00
setTaskList(result.content)
2024-12-29 08:14:08 -05:00
setPageNumber(1)
2025-01-05 05:04:52 -05:00
setHasMore(result.page.number < result.page.totalPages)
2024-12-29 04:48:35 -05:00
})
}}
>
2025-01-05 05:04:52 -05:00
<List>
2024-12-29 08:14:08 -05:00
<DragDropContext onDragEnd={onDragEnd}>
<Droppable droppableId='droppable'>
{droppableProvided => (
<div ref={droppableProvided.innerRef}>
{taskList.map((item, index) => (
<Draggable key={item.id} draggableId={item.id} index={index}>
{(provided, snapshot) => (
<div
ref={provided.innerRef}
{...provided.draggableProps}
{...provided.dragHandleProps}
style={{
...provided.draggableProps.style,
opacity: snapshot.isDragging ? 0.8 : 1,
}}
>
<SwipeAction
ref={ref}
closeOnAction={false}
closeOnTouchOutside={false}
rightActions={[
{
key: 'delete',
text: '删除',
color: 'danger',
onClick: async () => {
await Dialog.confirm({
content: '确定要关闭吗?',
})
ref.current?.close()
},
2024-12-29 04:48:35 -05:00
},
2024-12-29 08:14:08 -05:00
{
key: 'close',
text: '关闭',
color: 'warning',
onClick: async () => {
await Dialog.confirm({
content: '确定要关闭吗?',
})
ref.current?.close()
},
2024-12-29 04:48:35 -05:00
},
2024-12-29 08:14:08 -05:00
{
key: 'update',
text: '修改',
color: 'primary',
onClick: async () => {
await Dialog.confirm({
content: '确定要修改吗?',
})
ref.current?.close()
},
2024-12-29 04:48:35 -05:00
},
2024-12-29 08:14:08 -05:00
{
key: 'complete',
text: '完成',
color: 'success',
onClick: async () => {
await Dialog.confirm({
content: '确定要完成吗?',
})
ref.current?.close()
},
2024-12-29 04:48:35 -05:00
},
2024-12-29 08:14:08 -05:00
]}
>
<List.Item
key={item.id}
// prefix={
// <Image
// src={item.avatar}
// style={{ borderRadius: 20 }}
// fit='cover'
// width={40}
// height={40}
// />
// }
// title={<span style={{color: "red"}}>{item.name}</span>}
// children={item.description}
// description={item.state}
// onClick={
// () => {
// console.log("dianji")
// }
// }
title={
<div style={{
display: "flex",
justifyContent: "space-between",
alignItems: "center",
flexDirection: "row",
flexWrap: "nowrap",
fontSize: "large",
color: "black"
}}>
<span>{item.name}</span>
{item.expectedEndTime && <span>
2025-01-05 05:04:52 -05:00
结束时间:{dayjs(item.expectedEndTime).format(DATE_TIME_FORMAT)}</span>}
2024-12-29 08:14:08 -05:00
</div>}
description={item.description}
>
{/*<Card style={{width: "100%"}} title={*/}
{/* <div style={{*/}
{/* display: "flex",*/}
{/* justifyContent: "space-between",*/}
{/* alignItems: "center",*/}
{/* flexDirection: "row",*/}
{/* flexWrap: "nowrap"*/}
{/* }}>*/}
{/* <span>{item.name}</span>*/}
{/* {item.expectedEndTime && <span>*/}
{/* 结束时间:{item.expectedEndTime}</span>}*/}
{/* </div>}*/}
{/*>*/}
{/* {item.description}*/}
{/*</Card>*/}
</List.Item>
</SwipeAction>
</div>
)}
</Draggable>
))}
{droppableProvided.placeholder}
</div>
)}
</Droppable>
</DragDropContext>
</List>
2025-01-05 05:04:52 -05:00
{/*无限滚动*/}
2024-12-29 08:14:08 -05:00
<InfiniteScroll loadMore={loadMore} hasMore={hasMore}/>
2024-12-29 04:48:35 -05:00
</PullToRefresh>
</Fragment>
2024-12-27 06:06:20 -05:00
)
}
export default ToDoList;