import { Checklist, EventBusy, Timelapse } from '@mui/icons-material' import { Avatar, Box, Button, CircularProgress, Container, Grid, List, ListItem, ListItemContent, ListItemDecorator, Sheet, Typography, } from '@mui/joy' import moment from 'moment' import React, { useEffect, useState } from 'react' import { Link, useParams } from 'react-router-dom' import { API_URL } from '../../Config' import { GetAllCircleMembers } from '../../utils/Fetcher' import { Fetch } from '../../utils/TokenManager' import HistoryCard from './HistoryCard' const ChoreHistory = () => { const [choreHistory, setChoresHistory] = useState([]) const [userHistory, setUserHistory] = useState([]) const [performers, setPerformers] = useState([]) const [historyInfo, setHistoryInfo] = useState([]) const [isLoading, setIsLoading] = useState(true) // Add loading state const { choreId } = useParams() useEffect(() => { setIsLoading(true) // Start loading Promise.all([ Fetch(`${API_URL}/chores/${choreId}/history`).then(res => res.json()), GetAllCircleMembers().then(res => res.json()), ]) .then(([historyData, usersData]) => { setChoresHistory(historyData.res) const newUserChoreHistory = {} historyData.res.forEach(choreHistory => { const userId = choreHistory.completedBy newUserChoreHistory[userId] = (newUserChoreHistory[userId] || 0) + 1 }) setUserHistory(newUserChoreHistory) setPerformers(usersData.res) updateHistoryInfo(historyData.res, newUserChoreHistory, usersData.res) }) .catch(error => { console.error('Error fetching data:', error) // Handle errors, e.g., show an error message to the user }) .finally(() => { setIsLoading(false) // Finish loading }) }, [choreId]) const updateHistoryInfo = (histories, userHistories, performers) => { // average delay for task completaion from due date: const averageDelay = histories.reduce((acc, chore) => { if (chore.dueDate) { // Only consider chores with a due date return acc + moment(chore.completedAt).diff(chore.dueDate, 'hours') } return acc }, 0) / histories.length const averageDelayMoment = moment.duration(averageDelay, 'hours') const maximumDelay = histories.reduce((acc, chore) => { if (chore.dueDate) { // Only consider chores with a due date const delay = moment(chore.completedAt).diff(chore.dueDate, 'hours') return delay > acc ? delay : acc } return acc }, 0) const maxDelayMoment = moment.duration(maximumDelay, 'hours') // find max value in userHistories: const userCompletedByMost = Object.keys(userHistories).reduce((a, b) => userHistories[a] > userHistories[b] ? a : b, ) const userCompletedByLeast = Object.keys(userHistories).reduce((a, b) => userHistories[a] < userHistories[b] ? a : b, ) const historyInfo = [ { icon: ( ), text: `${histories.length} completed`, subtext: `${Object.keys(userHistories).length} users contributed`, }, { icon: ( ), text: `Completed within ${moment .duration(averageDelayMoment) .humanize()}`, subtext: `Maximum delay was ${moment .duration(maxDelayMoment) .humanize()}`, }, { icon: , text: `${ performers.find(p => p.userId === Number(userCompletedByMost)) ?.displayName } completed most`, subtext: `${userHistories[userCompletedByMost]} time/s`, }, ] if (userCompletedByLeast !== userCompletedByMost) { historyInfo.push({ icon: ( { performers.find(p => p.userId === userCompletedByLeast) ?.displayName } ), text: `${ performers.find(p => p.userId === Number(userCompletedByLeast)) .displayName } completed least`, subtext: `${userHistories[userCompletedByLeast]} time/s`, }) } setHistoryInfo(historyInfo) } if (isLoading) { return // Show loading indicator } if (!choreHistory.length) { return ( No History Yet You haven't completed any tasks. Once you start finishing tasks, they'll show up here. ) } return ( Summary: {/* {choreHistory.length} completed {Object.keys(userHistory).length} users contributed */} {historyInfo.map((info, index) => ( {info.icon} {info.text} {info.subtext} ))} {/* User History Cards */} History: {/* Chore History List (Updated Style) */} {choreHistory.map((historyEntry, index) => ( ))} ) } export default ChoreHistory