This commit is contained in:
2024-10-15 17:54:13 +05:00
parent ba69acf1ad
commit 45e972780a
11 changed files with 126 additions and 199 deletions
+23 -157
View File
@@ -1,15 +1,7 @@
/* eslint-disable react-hooks/exhaustive-deps */
/* eslint-disable @typescript-eslint/no-explicit-any */
import {
eachMinuteOfInterval,
format,
parse,
addDays,
subDays,
isEqual,
} from "date-fns";
import { format, addDays, subDays } from "date-fns";
import { useEffect, useRef, useState } from "react";
import TabButton from "../components/TabButton";
import api from "../utils/api";
import { ru } from "date-fns/locale";
import useStore from "../stores/useStore";
@@ -24,6 +16,7 @@ import ChevronRightIcon from "../components/icons/ChevronRightIcon";
import IUser from "../types/IUser";
import IError from "../types/IError";
import Schedule from "../components/Schedule";
import IScheduledSession from "../types/IScheduledSession";
function DashboardPage() {
const { user } = useAuthStore();
@@ -31,20 +24,19 @@ function DashboardPage() {
company,
setCompany,
selectedBuild,
setSelectedBuild,
builds,
setBuilds,
managers,
setManagers,
schedules,
setSchedules,
selectedDay,
setSelectedDay,
} = useStore();
const [, setDuration] = useState<number>();
const [scheduledSessions, setScheduledSessions] = useState<any[]>();
const [, setGeneratedScheduledSessions] = useState<any[]>();
const [dateTimes, setDateTimes] = useState<Date[]>();
// const [, setDuration] = useState<number>();
const [scheduledSessions, setScheduledSessions] = useState<
IScheduledSession[]
>([]);
// const [, setGeneratedScheduledSessions] = useState<any[]>();
// const [dateTimes, setDateTimes] = useState<Date[]>();
const [, setCurrentTime] = useState<string>(format(new Date(), "HH:mm"));
const [, setIsLoadingScheduledSessions] = useState(true);
const scheduledSessionsRef = useRef<HTMLDivElement>(null);
@@ -61,78 +53,6 @@ function DashboardPage() {
setSelectedDay(new Date());
}
function findSessionsByTime(time: Date) {
if (!scheduledSessions || !scheduledSessions.length) return [];
const foundScheduledSessions = scheduledSessions?.filter(
(scheduledSession) => isEqual(new Date(scheduledSession.startAt), time)
);
return foundScheduledSessions;
}
function generateScheduledSessions() {
if (!selectedBuild) return;
const newGeneratedScheduledSession: any[] = [];
dateTimes?.forEach((time) => {
const foundSessionsByTime = findSessionsByTime(time);
const sessions: any[] = [];
if (foundSessionsByTime) {
sessions.push(...foundSessionsByTime);
}
for (
let index = 0;
index < selectedBuild.sessionLimit - foundSessionsByTime.length;
index++
) {
sessions.push({});
}
newGeneratedScheduledSession.push({
time,
sessions,
});
});
setGeneratedScheduledSessions(newGeneratedScheduledSession);
}
useEffect(() => {
if (!scheduledSessions || !selectedBuild || !selectedDay) return;
generateScheduledSessions();
}, [scheduledSessions, selectedBuild, selectedDay]);
useEffect(() => {
if (!schedules || !selectedDay || !selectedBuild) return;
console.log("schedules", schedules);
const foundSchedule = schedules.find(
(schedule) => schedule.buildId === selectedBuild.id
);
if (!foundSchedule) {
setDateTimes([]);
return;
}
const step = foundSchedule.sessionDuration + foundSchedule.sessionBreak; // 35
const newTimes = eachMinuteOfInterval(
{
start: parse(foundSchedule.startTime, "HH:mm", new Date(selectedDay)), // 11:00
end: parse(foundSchedule.endTime, "HH:mm", new Date(selectedDay)), // 20:00
},
{ step }
);
setDateTimes(newTimes);
setDuration(foundSchedule.sessionDuration);
}, [schedules, selectedDay, selectedBuild]);
async function getCompany() {
if (!user) {
console.log("No User", user);
@@ -141,6 +61,7 @@ function DashboardPage() {
try {
const result: any = await api.get(`companies/${user.companyId}`).json();
setCompany(result);
} catch (error) {
if (error instanceof Error) {
@@ -159,6 +80,7 @@ function DashboardPage() {
const result: any = await api
.get(`companies/${user.companyId}/builds`)
.json();
setBuilds(result);
} catch (error) {
if (error instanceof Error) {
@@ -196,22 +118,19 @@ function DashboardPage() {
return;
}
if (!selectedBuild || !selectedBuild.id) {
console.log("No selectedBuild");
return;
}
if (useLoader) setIsLoadingScheduledSessions(true);
try {
const result: any = await api
.get(
`companies/${company.id}/builds/${
selectedBuild.id
`companies/${
company.id
}/scheduled_sessions?date=${selectedDay.toISOString()}`
)
.json();
console.log(result);
setScheduledSessions(result);
} catch (error) {
if (error instanceof Error) {
@@ -222,44 +141,6 @@ function DashboardPage() {
if (useLoader) setIsLoadingScheduledSessions(false);
}
// async function updateScheduledSessionManager(
// scheduledSessionId: string,
// managerId: string | null
// ) {
// if (!company || !scheduledSessions) return;
// try {
// const result: any = await api
// .put(
// `companies/${company.id}/scheduled_sessions/${scheduledSessionId}`,
// {
// json: { userId: managerId },
// }
// )
// .json();
// setScheduledSessions(
// scheduledSessions.map((scheduledSession) =>
// scheduledSession.id === result.id ? result : scheduledSession
// )
// );
// } catch (error) {
// if (error instanceof Error) {
// console.log("Error: ", error.message);
// }
// }
// }
async function getSchedules() {
if (!company || !selectedBuild) return;
const result: any[] = await api
.get(`companies/${company.id}/builds/${selectedBuild.id}/schedules`)
.json();
setSchedules(result);
}
useEffect(() => {
getCompany();
@@ -274,16 +155,19 @@ function DashboardPage() {
useEffect(() => {
if (!company) return;
getBuilds();
}, [company]);
useEffect(() => {
if (!builds) return;
setSelectedBuild(builds[0]);
getManagers();
}, [builds]);
useEffect(() => {
if (!managers || !selectedDay || !selectedBuild) return;
if (!managers || !selectedDay || !company || !builds) return;
getScheduledSessions(true);
const interval = setInterval(() => {
@@ -293,35 +177,17 @@ function DashboardPage() {
return () => {
clearInterval(interval);
};
}, [managers, selectedDay, selectedBuild]);
useEffect(() => {
if (!company || !selectedBuild) return;
getSchedules();
getManagers();
}, [selectedBuild]);
}, [managers, selectedDay, company, builds]);
useEffect(() => {
scheduledSessionsRef.current?.scrollTo({ top: 0, behavior: "smooth" });
}, [selectedDay, selectedBuild]);
}, [selectedDay]);
return (
<div className="flex h-screen main">
<div className="flex flex-col w-full left">
<div className="flex bg-[#F0F1F2]">
<Menu />
{builds?.map((build) => (
<TabButton
key={build.id}
handleClick={() => setSelectedBuild(build)}
active={
(selectedBuild && build.id === selectedBuild?.id) || false
}
>
{build.name}
</TabButton>
))}
</div>
<div className="flex justify-between items-center px-4 py-2 h-12 border-r border-b border-[#DAE0E5]">
@@ -436,10 +302,10 @@ function DashboardPage() {
)}
</div> */}
{selectedBuild?.sessionLimit && scheduledSessions && (
{company && scheduledSessions && (
<Schedule
selectedDay={selectedDay}
slots={selectedBuild.sessionLimit}
slots={company.sessionLimit}
events={scheduledSessions}
/>
)}