From 1149207a6afed8e0d24bf61836eccf29adbc7346 Mon Sep 17 00:00:00 2001 From: Suraj Ramchandran <30753067+Suraj-Ram@users.noreply.github.com> Date: Wed, 31 Jan 2024 18:26:01 -0500 Subject: [PATCH] Added duplicate plan button w/ API request --- .../components/Plan/DuplicatePlanButton.tsx | 58 +++++++++++++++++++ packages/frontend/pages/home.tsx | 10 +++- 2 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 packages/frontend/components/Plan/DuplicatePlanButton.tsx diff --git a/packages/frontend/components/Plan/DuplicatePlanButton.tsx b/packages/frontend/components/Plan/DuplicatePlanButton.tsx new file mode 100644 index 000000000..bcdc068db --- /dev/null +++ b/packages/frontend/components/Plan/DuplicatePlanButton.tsx @@ -0,0 +1,58 @@ +import { CopyIcon } from "@chakra-ui/icons"; +import { API } from "@graduate/api-client"; +import { CreatePlanDto, PlanModel } from "@graduate/common"; +import { useRouter } from "next/router"; +import { Dispatch, SetStateAction, useState } from "react"; +import { toast } from "react-toastify"; +import { mutate } from "swr"; +import { USE_STUDENT_WITH_PLANS_SWR_KEY } from "../../hooks"; +import { cleanDndIdsFromPlan, handleApiClientError } from "../../utils"; +import { BlueButton } from "../Button"; + +interface DuplicatePlanButton { + plan: PlanModel; + setSelectedPlanId: Dispatch>; +} + +export const DuplicatePlanButton: React.FC = ({ + plan, + setSelectedPlanId, +}) => { + const router = useRouter(); + const [buttonLoading, setButtonLoading] = useState(false); + + const duplicatePlan = async () => { + // TODO: figure out when to do with this + setButtonLoading(true); + + const updatedPlan: CreatePlanDto = { + name: "Copy of " + plan.name, + catalogYear: plan.catalogYear, + major: plan.major, + concentration: plan.concentration, + schedule: cleanDndIdsFromPlan(plan).schedule, + }; + try { + const createdPlan = await API.plans.create(updatedPlan); + mutate(USE_STUDENT_WITH_PLANS_SWR_KEY); + setSelectedPlanId(createdPlan.id); + toast.success("Plan duplicated successfully"); + setButtonLoading(false); + } catch (error) { + handleApiClientError(error as Error, router); + setButtonLoading(false); + } + }; + + return ( + } + ml="xs" + size="md" + isLoading={buttonLoading} + > + Duplicate Plan + + ); +}; diff --git a/packages/frontend/pages/home.tsx b/packages/frontend/pages/home.tsx index a80b31729..5420262d2 100644 --- a/packages/frontend/pages/home.tsx +++ b/packages/frontend/pages/home.tsx @@ -34,10 +34,12 @@ import { Sidebar, TransferCourses, } from "../components"; +import { DuplicatePlanButton } from "../components/Plan/DuplicatePlanButton"; import { fetchStudentAndPrepareForDnd, useStudentWithPlans } from "../hooks"; import { - cleanDndIdsFromPlan, + // createEmptySchedule, DELETE_COURSE_AREA_DND_ID, + cleanDndIdsFromPlan, handleApiClientError, logger, toast, @@ -278,6 +280,12 @@ const HomePage: NextPage = () => { /> {selectedPlan && } + {selectedPlan && ( + + )} {selectedPlan && (