import dayjs from "dayjs"; import utc from "dayjs/plugin/utc"; import { GetServerSidePropsContext } from "next"; import { serverSideTranslations } from "next-i18next/serverSideTranslations"; import { useEffect, useState } from "react"; import { getSession } from "@lib/auth"; import { getOrSetUserLocaleFromHeaders } from "@lib/core/i18n/i18n.utils"; import { useLocale } from "@lib/hooks/useLocale"; import prisma from "@lib/prisma"; import { inferSSRProps } from "@lib/types/inferSSRProps"; import Loader from "@components/Loader"; import Shell from "@components/Shell"; dayjs.extend(utc); export default function Troubleshoot({ user }: inferSSRProps) { const { t } = useLocale(); const [loading, setLoading] = useState(true); const [availability, setAvailability] = useState([]); const [selectedDate, setSelectedDate] = useState(dayjs()); function convertMinsToHrsMins(mins: number) { let h = Math.floor(mins / 60); let m = mins % 60; h = h < 10 ? "0" + h : h; m = m < 10 ? "0" + m : m; return `${h}:${m}`; } const fetchAvailability = (date) => { const dateFrom = date.startOf("day").utc().format(); const dateTo = date.endOf("day").utc().format(); fetch(`/api/availability/${user.username}?dateFrom=${dateFrom}&dateTo=${dateTo}`) .then((res) => { return res.json(); }) .then((availableIntervals) => { setAvailability(availableIntervals.busy); setLoading(false); }) .catch((e) => { console.error(e); }); }; useEffect(() => { fetchAvailability(selectedDate); }, [selectedDate]); if (loading) { return ; } return (
{t("overview_of_day")}{" "} { setSelectedDate(dayjs(e.target.value)); }} /> {t("hover_over_bold_times_tip")}
{t("your_day_starts_at")} {convertMinsToHrsMins(user.startTime)}
{availability.map((slot) => (
{t("calendar_shows_busy_between")}{" "} {dayjs(slot.start).format("HH:mm")} {" "} {t("and")}{" "} {dayjs(slot.end).format("HH:mm")} {" "} {t("on")} {dayjs(slot.start).format("D")}{" "} {t(dayjs(slot.start).format("MMMM").toLowerCase())} {dayjs(slot.start).format("YYYY")}
))} {availability.length === 0 && }
{t("your_day_ends_at")} {convertMinsToHrsMins(user.endTime)}
); } export const getServerSideProps = async (context: GetServerSidePropsContext) => { const session = await getSession(context); const locale = await getOrSetUserLocaleFromHeaders(context.req); if (!session?.user?.id) { return { redirect: { permanent: false, destination: "/auth/login" } }; } const user = await prisma.user.findFirst({ where: { id: session.user.id, }, select: { startTime: true, endTime: true, username: true, }, }); if (!user) return { redirect: { permanent: false, destination: "/auth/login" } }; return { props: { session, user, ...(await serverSideTranslations(locale, ["common"])), }, }; };