
* Refactored Schedule component * Merge branch 'main' into feature/availability-page-revamp * wip * Turned value into number, many other TS tweaks * NodeJS 16x works 100% on my local, but out of scope for this already massive PR * Fixed TS errors in viewer.tsx and schedule/index.ts * Reverted next.config.js * Fixed minor remnant from moving types to @lib/types * schema comment * some changes to form handling * add comments * Turned ConfigType into number; which seems to be the value preferred by tRPC * Fixed localized time display during onboarding * Update components/ui/form/Schedule.tsx Co-authored-by: Alex Johansson <alexander@n1s.se> * Added showToast to indicate save success * Converted number to Date, and also always establish time based on current date * prevent height flickering of availability by removing mb-2 of input field * availabilty: re-added mb-2 but added min-height * Quite a few bugs discovered, but this seems functional Co-authored-by: KATT <alexander@n1s.se> Co-authored-by: Bailey Pumfleet <pumfleet@hey.com> Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> Co-authored-by: Peer Richelsen <peeroke@gmail.com>
80 lines
2.2 KiB
TypeScript
80 lines
2.2 KiB
TypeScript
import { Availability } from "@prisma/client";
|
|
import type { NextApiRequest, NextApiResponse } from "next";
|
|
|
|
import { getSession } from "@lib/auth";
|
|
import prisma from "@lib/prisma";
|
|
import { TimeRange } from "@lib/types/schedule";
|
|
|
|
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
|
|
const session = await getSession({ req: req });
|
|
const userId = session?.user?.id;
|
|
if (!userId) {
|
|
res.status(401).json({ message: "Not authenticated" });
|
|
return;
|
|
}
|
|
|
|
if (!req.body.schedule || req.body.schedule.length !== 7) {
|
|
return res.status(400).json({ message: "Bad Request." });
|
|
}
|
|
|
|
const availability = req.body.schedule.reduce(
|
|
(availability: Availability[], times: TimeRange[], day: number) => {
|
|
const addNewTime = (time: TimeRange) =>
|
|
({
|
|
days: [day],
|
|
startTime: time.start,
|
|
endTime: time.end,
|
|
} as Availability);
|
|
|
|
const filteredTimes = times.filter((time) => {
|
|
let idx;
|
|
if (
|
|
(idx = availability.findIndex(
|
|
(schedule) => schedule.startTime === time.start && schedule.endTime === time.end
|
|
)) !== -1
|
|
) {
|
|
availability[idx].days.push(day);
|
|
return false;
|
|
}
|
|
return true;
|
|
});
|
|
filteredTimes.forEach((time) => {
|
|
availability.push(addNewTime(time));
|
|
});
|
|
return availability;
|
|
},
|
|
[] as Availability[]
|
|
);
|
|
|
|
if (req.method === "POST") {
|
|
try {
|
|
await prisma.availability.deleteMany({
|
|
where: {
|
|
userId,
|
|
},
|
|
});
|
|
await Promise.all(
|
|
availability.map((schedule: Availability) =>
|
|
prisma.availability.create({
|
|
data: {
|
|
days: schedule.days,
|
|
startTime: schedule.startTime,
|
|
endTime: schedule.endTime,
|
|
user: {
|
|
connect: {
|
|
id: userId,
|
|
},
|
|
},
|
|
},
|
|
})
|
|
)
|
|
);
|
|
return res.status(200).json({
|
|
message: "created",
|
|
});
|
|
} catch (error) {
|
|
console.error(error);
|
|
return res.status(500).json({ message: "Unable to create schedule." });
|
|
}
|
|
}
|
|
}
|