This repository has been archived on 2026-03-06. You can view files and clone it, but cannot push or open issues or pull requests.
todo/client/node_modules/.cache/babel-loader/696e6deaf78525c67190fca7c8a990734dd425540c18ec1a0a3de947dddf5482.json
2025-06-13 14:04:40 +08:00

1 line
31 KiB
JSON

{"ast":null,"code":"var _jsxFileName = \"D:\\\\aiproject\\\\goAgent\\\\todo\\\\client\\\\src\\\\components\\\\TodoApp.js\",\n _s = $RefreshSig$();\nimport React, { useState, useEffect } from 'react';\nimport styled from 'styled-components';\nimport { format, parseISO, isToday, isYesterday, isTomorrow } from 'date-fns';\nimport { getTodos, createTodo, updateTodo, deleteTodo, copyPendingTodos } from '../services/api';\nimport TodoForm from './TodoForm';\nimport TodoList from './TodoList';\nimport HistoryTodos from './HistoryTodos';\nimport { jsxDEV as _jsxDEV } from \"react/jsx-dev-runtime\";\nconst AppContainer = styled.div`\n background: rgba(255, 255, 255, 0.95);\n backdrop-filter: blur(10px);\n border-radius: 20px;\n padding: 40px;\n box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);\n width: 100%;\n max-width: 1200px;\n max-height: 95vh;\n overflow-y: auto;\n min-height: 600px;\n`;\n_c = AppContainer;\nconst Header = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 40px;\n padding-bottom: 25px;\n border-bottom: 2px solid #f0f0f0;\n`;\n_c2 = Header;\nconst Title = styled.h1`\n color: #333;\n font-size: 32px;\n font-weight: 300;\n margin: 0;\n`;\n_c3 = Title;\nconst HeaderActions = styled.div`\n display: flex;\n gap: 12px;\n align-items: center;\n`;\n_c4 = HeaderActions;\nconst CopyPendingButton = styled.button`\n background: rgba(255, 152, 0, 0.1);\n color: #ff9800;\n border: 2px solid rgba(255, 152, 0, 0.2);\n padding: 10px 20px;\n border-radius: 8px;\n font-size: 14px;\n cursor: pointer;\n transition: all 0.3s ease;\n display: flex;\n align-items: center;\n gap: 8px;\n\n &:hover {\n background: rgba(255, 152, 0, 0.15);\n border-color: #ff9800;\n transform: translateY(-1px);\n }\n\n &::before {\n content: '📋';\n font-size: 16px;\n }\n`;\n_c5 = CopyPendingButton;\nconst HistoryButton = styled.button`\n background: rgba(102, 126, 234, 0.1);\n color: #667eea;\n border: 2px solid rgba(102, 126, 234, 0.2);\n padding: 10px 20px;\n border-radius: 8px;\n font-size: 14px;\n cursor: pointer;\n transition: all 0.3s ease;\n display: flex;\n align-items: center;\n gap: 8px;\n\n &:hover {\n background: rgba(102, 126, 234, 0.15);\n border-color: #667eea;\n transform: translateY(-1px);\n }\n\n &::before {\n content: '📚';\n font-size: 16px;\n }\n`;\n_c6 = HistoryButton;\nconst LogoutButton = styled.button`\n background: transparent;\n color: #666;\n border: 2px solid #e1e5e9;\n padding: 10px 20px;\n border-radius: 8px;\n font-size: 14px;\n cursor: pointer;\n transition: all 0.3s ease;\n\n &:hover {\n border-color: #667eea;\n color: #667eea;\n }\n`;\n_c7 = LogoutButton;\nconst Content = styled.div`\n display: flex;\n flex-direction: column;\n gap: 35px;\n`;\n_c8 = Content;\nconst LoadingMessage = styled.div`\n text-align: center;\n color: #666;\n font-size: 18px;\n padding: 60px;\n`;\n_c9 = LoadingMessage;\nconst EmptyMessage = styled.div`\n text-align: center;\n color: #999;\n font-size: 18px;\n padding: 60px;\n background: rgba(102, 126, 234, 0.05);\n border-radius: 16px;\n border: 2px dashed #e1e5e9;\n`;\n_c0 = EmptyMessage;\nfunction TodoApp({\n onLogout\n}) {\n _s();\n const [todos, setTodos] = useState([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState('');\n const [showHistory, setShowHistory] = useState(false);\n const [successMessage, setSuccessMessage] = useState('');\n useEffect(() => {\n loadTodos();\n }, []);\n const loadTodos = async () => {\n try {\n setLoading(true);\n const data = await getTodos();\n setTodos(data);\n } catch (err) {\n setError('加载待办事项失败');\n console.error('Load todos error:', err);\n } finally {\n setLoading(false);\n }\n };\n const handleAddTodo = async todoData => {\n try {\n const newTodo = await createTodo(todoData);\n setTodos(prev => [newTodo, ...prev]);\n } catch (err) {\n setError('添加待办事项失败');\n console.error('Add todo error:', err);\n }\n };\n const handleToggleTodo = async (id, completed) => {\n try {\n const updatedTodo = await updateTodo(id, {\n completed\n });\n setTodos(prev => prev.map(todo => todo.id === id ? {\n ...todo,\n completed\n } : todo));\n } catch (err) {\n setError('更新待办事项失败');\n console.error('Toggle todo error:', err);\n }\n };\n const handleDeleteTodo = async id => {\n try {\n await deleteTodo(id);\n setTodos(prev => prev.filter(todo => todo.id !== id));\n setSuccessMessage('待办事项已删除');\n setTimeout(() => setSuccessMessage(''), 3000);\n } catch (err) {\n setError('删除待办事项失败');\n console.error('Delete todo error:', err);\n }\n };\n const handleCopyPendingTodos = async () => {\n try {\n const result = await copyPendingTodos();\n if (result.copiedCount > 0) {\n setSuccessMessage(result.message);\n // 重新加载待办事项以显示复制的内容\n await loadTodos();\n } else {\n setSuccessMessage('没有找到需要复制的未完成待办事项');\n }\n setTimeout(() => setSuccessMessage(''), 5000);\n } catch (err) {\n setError('复制待办事项失败');\n console.error('Copy pending todos error:', err);\n }\n };\n\n // 按日期分组待办事项\n const groupTodosByDate = todos => {\n const groups = {};\n todos.forEach(todo => {\n const date = todo.date;\n if (!groups[date]) {\n groups[date] = [];\n }\n groups[date].push(todo);\n });\n\n // 按日期排序\n const sortedDates = Object.keys(groups).sort((a, b) => new Date(b) - new Date(a));\n return sortedDates.map(date => ({\n date,\n todos: groups[date].sort((a, b) => {\n // 按优先级排序\n const priorityOrder = {\n urgent: 4,\n high: 3,\n medium: 2,\n low: 1\n };\n return priorityOrder[b.priority] - priorityOrder[a.priority];\n })\n }));\n };\n const formatDateLabel = dateString => {\n const date = parseISO(dateString);\n if (isToday(date)) {\n return '今天';\n } else if (isYesterday(date)) {\n return '昨天';\n } else if (isTomorrow(date)) {\n return '明天';\n } else {\n // 简化日期格式,不使用中文语言包\n const month = date.getMonth() + 1;\n const day = date.getDate();\n const weekdays = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];\n const weekday = weekdays[date.getDay()];\n return `${month}月${day}日 ${weekday}`;\n }\n };\n const groupedTodos = groupTodosByDate(todos);\n\n // 如果正在显示历史视图\n if (showHistory) {\n return /*#__PURE__*/_jsxDEV(AppContainer, {\n children: /*#__PURE__*/_jsxDEV(HistoryTodos, {\n onBack: () => setShowHistory(false)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 260,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 259,\n columnNumber: 7\n }, this);\n }\n if (loading) {\n return /*#__PURE__*/_jsxDEV(AppContainer, {\n children: /*#__PURE__*/_jsxDEV(LoadingMessage, {\n children: \"\\u52A0\\u8F7D\\u4E2D...\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 268,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 267,\n columnNumber: 7\n }, this);\n }\n return /*#__PURE__*/_jsxDEV(AppContainer, {\n children: [/*#__PURE__*/_jsxDEV(Header, {\n children: [/*#__PURE__*/_jsxDEV(Title, {\n children: \"\\u5DE5\\u4F5C\\u5F85\\u529E\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 276,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(HeaderActions, {\n children: [/*#__PURE__*/_jsxDEV(CopyPendingButton, {\n onClick: handleCopyPendingTodos,\n children: \"\\u590D\\u5236\\u672A\\u5B8C\\u6210\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 278,\n columnNumber: 11\n }, this), /*#__PURE__*/_jsxDEV(HistoryButton, {\n onClick: () => setShowHistory(true),\n children: \"\\u5386\\u53F2\\u8BB0\\u5F55\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 281,\n columnNumber: 11\n }, this), /*#__PURE__*/_jsxDEV(LogoutButton, {\n onClick: onLogout,\n children: \"\\u9000\\u51FA\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 284,\n columnNumber: 11\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 277,\n columnNumber: 9\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 275,\n columnNumber: 7\n }, this), /*#__PURE__*/_jsxDEV(Content, {\n children: [/*#__PURE__*/_jsxDEV(TodoForm, {\n onAddTodo: handleAddTodo\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 289,\n columnNumber: 9\n }, this), error && /*#__PURE__*/_jsxDEV(\"div\", {\n style: {\n color: '#e74c3c',\n textAlign: 'center',\n padding: '15px',\n fontSize: '16px'\n },\n children: error\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 292,\n columnNumber: 11\n }, this), successMessage && /*#__PURE__*/_jsxDEV(\"div\", {\n style: {\n color: '#27ae60',\n textAlign: 'center',\n padding: '15px',\n fontSize: '16px',\n background: 'rgba(39, 174, 96, 0.1)',\n borderRadius: '8px',\n marginBottom: '20px'\n },\n children: successMessage\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 298,\n columnNumber: 11\n }, this), groupedTodos.length === 0 ? /*#__PURE__*/_jsxDEV(EmptyMessage, {\n children: \"\\uD83D\\uDCDD \\u8FD8\\u6CA1\\u6709\\u5F85\\u529E\\u4E8B\\u9879\\uFF0C\\u70B9\\u51FB\\u4E0A\\u65B9\\u6DFB\\u52A0\\u7B2C\\u4E00\\u4E2A\\u5427\\uFF01\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 312,\n columnNumber: 11\n }, this) : groupedTodos.map(({\n date,\n todos\n }) => {\n const dateObj = parseISO(date);\n const isTodayList = isToday(dateObj);\n return /*#__PURE__*/_jsxDEV(TodoList, {\n dateLabel: formatDateLabel(date),\n todos: todos,\n onToggleTodo: handleToggleTodo,\n onDeleteTodo: handleDeleteTodo,\n isToday: isTodayList\n }, date, false, {\n fileName: _jsxFileName,\n lineNumber: 321,\n columnNumber: 15\n }, this);\n })]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 288,\n columnNumber: 7\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 274,\n columnNumber: 5\n }, this);\n}\n_s(TodoApp, \"X0yvO0+xq+VOBB+O073nuXUYeOw=\");\n_c1 = TodoApp;\nexport default TodoApp;\nvar _c, _c2, _c3, _c4, _c5, _c6, _c7, _c8, _c9, _c0, _c1;\n$RefreshReg$(_c, \"AppContainer\");\n$RefreshReg$(_c2, \"Header\");\n$RefreshReg$(_c3, \"Title\");\n$RefreshReg$(_c4, \"HeaderActions\");\n$RefreshReg$(_c5, \"CopyPendingButton\");\n$RefreshReg$(_c6, \"HistoryButton\");\n$RefreshReg$(_c7, \"LogoutButton\");\n$RefreshReg$(_c8, \"Content\");\n$RefreshReg$(_c9, \"LoadingMessage\");\n$RefreshReg$(_c0, \"EmptyMessage\");\n$RefreshReg$(_c1, \"TodoApp\");","map":{"version":3,"names":["React","useState","useEffect","styled","format","parseISO","isToday","isYesterday","isTomorrow","getTodos","createTodo","updateTodo","deleteTodo","copyPendingTodos","TodoForm","TodoList","HistoryTodos","jsxDEV","_jsxDEV","AppContainer","div","_c","Header","_c2","Title","h1","_c3","HeaderActions","_c4","CopyPendingButton","button","_c5","HistoryButton","_c6","LogoutButton","_c7","Content","_c8","LoadingMessage","_c9","EmptyMessage","_c0","TodoApp","onLogout","_s","todos","setTodos","loading","setLoading","error","setError","showHistory","setShowHistory","successMessage","setSuccessMessage","loadTodos","data","err","console","handleAddTodo","todoData","newTodo","prev","handleToggleTodo","id","completed","updatedTodo","map","todo","handleDeleteTodo","filter","setTimeout","handleCopyPendingTodos","result","copiedCount","message","groupTodosByDate","groups","forEach","date","push","sortedDates","Object","keys","sort","a","b","Date","priorityOrder","urgent","high","medium","low","priority","formatDateLabel","dateString","month","getMonth","day","getDate","weekdays","weekday","getDay","groupedTodos","children","onBack","fileName","_jsxFileName","lineNumber","columnNumber","onClick","onAddTodo","style","color","textAlign","padding","fontSize","background","borderRadius","marginBottom","length","dateObj","isTodayList","dateLabel","onToggleTodo","onDeleteTodo","_c1","$RefreshReg$"],"sources":["D:/aiproject/goAgent/todo/client/src/components/TodoApp.js"],"sourcesContent":["import React, { useState, useEffect } from 'react';\r\nimport styled from 'styled-components';\r\nimport { format, parseISO, isToday, isYesterday, isTomorrow } from 'date-fns';\r\nimport { getTodos, createTodo, updateTodo, deleteTodo, copyPendingTodos } from '../services/api';\r\nimport TodoForm from './TodoForm';\r\nimport TodoList from './TodoList';\r\nimport HistoryTodos from './HistoryTodos';\r\n\r\nconst AppContainer = styled.div`\r\n background: rgba(255, 255, 255, 0.95);\r\n backdrop-filter: blur(10px);\r\n border-radius: 20px;\r\n padding: 40px;\r\n box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);\r\n width: 100%;\r\n max-width: 1200px;\r\n max-height: 95vh;\r\n overflow-y: auto;\r\n min-height: 600px;\r\n`;\r\n\r\nconst Header = styled.div`\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n margin-bottom: 40px;\r\n padding-bottom: 25px;\r\n border-bottom: 2px solid #f0f0f0;\r\n`;\r\n\r\nconst Title = styled.h1`\r\n color: #333;\r\n font-size: 32px;\r\n font-weight: 300;\r\n margin: 0;\r\n`;\r\n\r\nconst HeaderActions = styled.div`\r\n display: flex;\r\n gap: 12px;\r\n align-items: center;\r\n`;\r\n\r\nconst CopyPendingButton = styled.button`\r\n background: rgba(255, 152, 0, 0.1);\r\n color: #ff9800;\r\n border: 2px solid rgba(255, 152, 0, 0.2);\r\n padding: 10px 20px;\r\n border-radius: 8px;\r\n font-size: 14px;\r\n cursor: pointer;\r\n transition: all 0.3s ease;\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n\r\n &:hover {\r\n background: rgba(255, 152, 0, 0.15);\r\n border-color: #ff9800;\r\n transform: translateY(-1px);\r\n }\r\n\r\n &::before {\r\n content: '📋';\r\n font-size: 16px;\r\n }\r\n`;\r\n\r\nconst HistoryButton = styled.button`\r\n background: rgba(102, 126, 234, 0.1);\r\n color: #667eea;\r\n border: 2px solid rgba(102, 126, 234, 0.2);\r\n padding: 10px 20px;\r\n border-radius: 8px;\r\n font-size: 14px;\r\n cursor: pointer;\r\n transition: all 0.3s ease;\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n\r\n &:hover {\r\n background: rgba(102, 126, 234, 0.15);\r\n border-color: #667eea;\r\n transform: translateY(-1px);\r\n }\r\n\r\n &::before {\r\n content: '📚';\r\n font-size: 16px;\r\n }\r\n`;\r\n\r\nconst LogoutButton = styled.button`\r\n background: transparent;\r\n color: #666;\r\n border: 2px solid #e1e5e9;\r\n padding: 10px 20px;\r\n border-radius: 8px;\r\n font-size: 14px;\r\n cursor: pointer;\r\n transition: all 0.3s ease;\r\n\r\n &:hover {\r\n border-color: #667eea;\r\n color: #667eea;\r\n }\r\n`;\r\n\r\nconst Content = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n gap: 35px;\r\n`;\r\n\r\nconst LoadingMessage = styled.div`\r\n text-align: center;\r\n color: #666;\r\n font-size: 18px;\r\n padding: 60px;\r\n`;\r\n\r\nconst EmptyMessage = styled.div`\r\n text-align: center;\r\n color: #999;\r\n font-size: 18px;\r\n padding: 60px;\r\n background: rgba(102, 126, 234, 0.05);\r\n border-radius: 16px;\r\n border: 2px dashed #e1e5e9;\r\n`;\r\n\r\nfunction TodoApp({ onLogout }) {\r\n const [todos, setTodos] = useState([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState('');\r\n const [showHistory, setShowHistory] = useState(false);\r\n const [successMessage, setSuccessMessage] = useState('');\r\n\r\n useEffect(() => {\r\n loadTodos();\r\n }, []);\r\n\r\n const loadTodos = async () => {\r\n try {\r\n setLoading(true);\r\n const data = await getTodos();\r\n setTodos(data);\r\n } catch (err) {\r\n setError('加载待办事项失败');\r\n console.error('Load todos error:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const handleAddTodo = async (todoData) => {\r\n try {\r\n const newTodo = await createTodo(todoData);\r\n setTodos(prev => [newTodo, ...prev]);\r\n } catch (err) {\r\n setError('添加待办事项失败');\r\n console.error('Add todo error:', err);\r\n }\r\n };\r\n\r\n const handleToggleTodo = async (id, completed) => {\r\n try {\r\n const updatedTodo = await updateTodo(id, { completed });\r\n setTodos(prev => \r\n prev.map(todo => \r\n todo.id === id ? { ...todo, completed } : todo\r\n )\r\n );\r\n } catch (err) {\r\n setError('更新待办事项失败');\r\n console.error('Toggle todo error:', err);\r\n }\r\n };\r\n\r\n const handleDeleteTodo = async (id) => {\r\n try {\r\n await deleteTodo(id);\r\n setTodos(prev => prev.filter(todo => todo.id !== id));\r\n setSuccessMessage('待办事项已删除');\r\n setTimeout(() => setSuccessMessage(''), 3000);\r\n } catch (err) {\r\n setError('删除待办事项失败');\r\n console.error('Delete todo error:', err);\r\n }\r\n };\r\n\r\n const handleCopyPendingTodos = async () => {\r\n try {\r\n const result = await copyPendingTodos();\r\n if (result.copiedCount > 0) {\r\n setSuccessMessage(result.message);\r\n // 重新加载待办事项以显示复制的内容\r\n await loadTodos();\r\n } else {\r\n setSuccessMessage('没有找到需要复制的未完成待办事项');\r\n }\r\n setTimeout(() => setSuccessMessage(''), 5000);\r\n } catch (err) {\r\n setError('复制待办事项失败');\r\n console.error('Copy pending todos error:', err);\r\n }\r\n };\r\n\r\n // 按日期分组待办事项\r\n const groupTodosByDate = (todos) => {\r\n const groups = {};\r\n \r\n todos.forEach(todo => {\r\n const date = todo.date;\r\n if (!groups[date]) {\r\n groups[date] = [];\r\n }\r\n groups[date].push(todo);\r\n });\r\n\r\n // 按日期排序\r\n const sortedDates = Object.keys(groups).sort((a, b) => new Date(b) - new Date(a));\r\n \r\n return sortedDates.map(date => ({\r\n date,\r\n todos: groups[date].sort((a, b) => {\r\n // 按优先级排序\r\n const priorityOrder = { urgent: 4, high: 3, medium: 2, low: 1 };\r\n return priorityOrder[b.priority] - priorityOrder[a.priority];\r\n })\r\n }));\r\n };\r\n\r\n const formatDateLabel = (dateString) => {\r\n const date = parseISO(dateString);\r\n \r\n if (isToday(date)) {\r\n return '今天';\r\n } else if (isYesterday(date)) {\r\n return '昨天';\r\n } else if (isTomorrow(date)) {\r\n return '明天';\r\n } else {\r\n // 简化日期格式,不使用中文语言包\r\n const month = date.getMonth() + 1;\r\n const day = date.getDate();\r\n const weekdays = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];\r\n const weekday = weekdays[date.getDay()];\r\n return `${month}月${day}日 ${weekday}`;\r\n }\r\n };\r\n\r\n const groupedTodos = groupTodosByDate(todos);\r\n\r\n // 如果正在显示历史视图\r\n if (showHistory) {\r\n return (\r\n <AppContainer>\r\n <HistoryTodos onBack={() => setShowHistory(false)} />\r\n </AppContainer>\r\n );\r\n }\r\n\r\n if (loading) {\r\n return (\r\n <AppContainer>\r\n <LoadingMessage>加载中...</LoadingMessage>\r\n </AppContainer>\r\n );\r\n }\r\n\r\n return (\r\n <AppContainer>\r\n <Header>\r\n <Title>工作待办</Title>\r\n <HeaderActions>\r\n <CopyPendingButton onClick={handleCopyPendingTodos}>\r\n 复制未完成\r\n </CopyPendingButton>\r\n <HistoryButton onClick={() => setShowHistory(true)}>\r\n 历史记录\r\n </HistoryButton>\r\n <LogoutButton onClick={onLogout}>退出</LogoutButton>\r\n </HeaderActions>\r\n </Header>\r\n \r\n <Content>\r\n <TodoForm onAddTodo={handleAddTodo} />\r\n \r\n {error && (\r\n <div style={{ color: '#e74c3c', textAlign: 'center', padding: '15px', fontSize: '16px' }}>\r\n {error}\r\n </div>\r\n )}\r\n \r\n {successMessage && (\r\n <div style={{ \r\n color: '#27ae60', \r\n textAlign: 'center', \r\n padding: '15px', \r\n fontSize: '16px',\r\n background: 'rgba(39, 174, 96, 0.1)',\r\n borderRadius: '8px',\r\n marginBottom: '20px'\r\n }}>\r\n {successMessage}\r\n </div>\r\n )}\r\n \r\n {groupedTodos.length === 0 ? (\r\n <EmptyMessage>\r\n 📝 还没有待办事项,点击上方添加第一个吧!\r\n </EmptyMessage>\r\n ) : (\r\n groupedTodos.map(({ date, todos }) => {\r\n const dateObj = parseISO(date);\r\n const isTodayList = isToday(dateObj);\r\n \r\n return (\r\n <TodoList\r\n key={date}\r\n dateLabel={formatDateLabel(date)}\r\n todos={todos}\r\n onToggleTodo={handleToggleTodo}\r\n onDeleteTodo={handleDeleteTodo}\r\n isToday={isTodayList}\r\n />\r\n );\r\n })\r\n )}\r\n </Content>\r\n </AppContainer>\r\n );\r\n}\r\n\r\nexport default TodoApp; "],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}