import { Fragment, memo, useEffect, useRef, useState } from "react";
import {
BiDotsHorizontalRounded,
BiExit,
BiSolidUser,
BiPencil,
BiLink,
BiWrench,
} from "react-icons/bi";
import Logo from "../assets/logo.svg";
import LogoAlternative from "../assets/fully_alternative_logo.svg";
import {
// AnimatedCanvas,
LoadingSpinner,
DatePicker,
TextPreloader,
// CoolMouseBg,
} from "../trash/trash-components";
import { AdminReq, classUserFRequest, RaspGet } from "../trash/req_mgr";
import { AnimatePresence, LayoutGroup, motion } from "motion/react";
import { apiFormatDate, isTimeBeforeNow } from "../trash/dengi";
import { useAtom } from "jotai";
import { API_BASE_URL } from "../App";
import { copyDXLink, ifstyle } from "../trash/helpers";
import { useWebHaptics } from "web-haptics/react";
import { DengiCaching } from "../trash/dengiCashingSystem";
/**
* @param {{classIDAtom,adminAtom,setsetRoute,routeAtom,pickmeModeAtom,dengi_cash: DengiCaching}} param0
*/
export function DX4App({
classIDAtom,
adminAtom,
setsetRoute,
routeAtom,
pickmeModeAtom,
dengi_cash,
}) {
const [classId, setUserId] = useAtom(classIDAtom);
const [adminId, _setAdminId] = useAtom(adminAtom);
const [openUserSettings, setOpenUserSettings] = useState(false);
const setRoute = useAtom(routeAtom)[1];
const [pickmeMode, setPickmeMode] = useAtom(pickmeModeAtom);
const [rasp, setRasp] = useState([false, {}, 0]);
const [selectedDate, setSelectedDate] = useState(new Date());
const [managing, setManaging] = useState(false);
useEffect(() => {
let cancelled = false;
setRasp([false, {}]);
const cacheName = `rasp-${classId}-${selectedDate.toDateString()}`;
if (!dengi_cash.wasCached(cacheName)) {
RaspGet(API_BASE_URL, classId, selectedDate).then(
(d) => {
if (d[0] == 1) {
try {
if (!cancelled)
setRasp([
true,
d[1]["data"] && d[1]["data"][0] ? d[1]["data"] : -322,
d[1]["type"] ? d[1]["type"] : -1,
]);
//console.log(d, d[1] ? d[1] : false);
dengi_cash.cache(cacheName, [
d[1]["data"] && d[1]["data"][0] ? d[1]["data"] : -322,
d[1]["type"] ? d[1]["type"] : -1,
]);
} catch (exception) {
//console.error(exception);
if (!cancelled) setRasp([true, exception.toString()]);
}
} else {
if (!cancelled) setRasp([true, "ошибка: " + d[1].toString()]);
//console.log(d[1]);
}
},
(err) => {
if (cancelled) return;
setRasp([true, "ошибка: " + err]);
},
);
} else {
if (cancelled) return;
setRasp([true, ...dengi_cash.get(cacheName)]);
}
return () => {
cancelled = true;
};
//console.log(dengi_cash);
}, [selectedDate]);
const [userFrNames, setUserFrNames] = useState({
admin: false,
class: false,
});
const lessonsEndedTriggered = useRef(false);
//TODO: Auto change day v2
useEffect(() => {
if (
lessonsEndedTriggered.current ||
typeof rasp[1] != "object" ||
rasp[1].lenght <= 0 ||
apiFormatDate(selectedDate) !== apiFormatDate(new Date())
)
return;
try {
if (!rasp[1].at) return;
const tEnd = rasp[1].at(-1)["t-end"];
if (!/\d{1,2}:\d{2}$/.test(tEnd)) return; // not time type
if (isTimeBeforeNow(tEnd)) {
//console.log(true);
const d = new Date(selectedDate);
d.setDate(d.getDate() + 1);
setSelectedDate(d);
lessonsEndedTriggered.current = true;
console.log("LOG: Auto change day triggired");
}
} catch (err) {
console.error(err);
return;
}
}, [rasp]);
useEffect(() => {
(async () => {
let cancelled = false;
const promises = [];
if (classId !== "")
promises.push(
dengi_cash.withCacheAsync(`userfr-${classId}`, async () =>
classUserFRequest(API_BASE_URL, classId),
),
);
else promises.push(Promise.resolve([0]));
if (adminId !== "")
promises.push(
dengi_cash.withCacheAsync(`admindata-${adminId}`, async () =>
AdminReq(API_BASE_URL, adminId),
),
);
else promises.push(Promise.resolve([0]));
Promise.all(promises).then(([classRes, adminRes]) => {
if (cancelled) return;
const classF = classRes[0] === 1 ? classRes[1].userclassname : false;
const adminF = adminRes[0] === 1 ? adminRes[1].adminName : false;
setUserFrNames({ admin: adminF, class: classF });
if (adminRes[0] === 1)
setManaging([-1, 2].includes(adminRes[1].adminPrems));
});
return () => {
cancelled = true;
};
})();
}, [classId, adminId]);
/**
* @param {KeyboardEvent} event
*/
const handleKeyPress = (event) => {
switch (event.key) {
case "a":
case "ArrowLeft":
setSelectedDate((prevDate) => {
const newDate = new Date(prevDate);
newDate.setDate(newDate.getDate() - 1);
return newDate;
});
break;
case "d":
case "ArrowRight":
setSelectedDate((prevDate) => {
const newDate = new Date(prevDate);
newDate.setDate(newDate.getDate() + 1);
return newDate;
});
break;
default:
break;
}
};
useEffect(() => {
window.addEventListener("keydown", handleKeyPress);
if(window['DX_OPEN_DATE']){
setSelectedDate(window['DX_OPEN_DATE'])
window['DX_OPEN_DATE'] = undefined
}
return () => {
window.removeEventListener("keydown", handleKeyPress);
};
}, []);
if (classId === "") {
setsetRoute(setRoute, "/");
}
const { trigger } = useWebHaptics();
const raspDragStartX = useRef(0);
return (
<>