From 42262ab33258fa7d539f9e6c2be10d036f6cbc7c Mon Sep 17 00:00:00 2001 From: Yashrif Arifin Date: Fri, 8 Sep 2023 12:57:12 +0600 Subject: [PATCH 1/3] fix(auth): purgeUser action not changing state --- flourish-client/src/App.tsx | 7 ++- flourish-client/src/hooks/useSignOut.ts | 2 +- .../src/pages/auth/component/Layout.tsx | 4 ++ flourish-client/src/pages/auth/index.tsx | 10 +++- flourish-client/src/pages/dashboard/index.tsx | 7 +++ .../src/store/actions/userAction.ts | 0 flourish-client/src/store/slices/authSlice.ts | 52 ------------------- flourish-client/src/store/slices/userSlice.ts | 11 ++-- 8 files changed, 32 insertions(+), 61 deletions(-) create mode 100644 flourish-client/src/pages/dashboard/index.tsx delete mode 100644 flourish-client/src/store/actions/userAction.ts delete mode 100644 flourish-client/src/store/slices/authSlice.ts diff --git a/flourish-client/src/App.tsx b/flourish-client/src/App.tsx index 808f72f..cacd49e 100644 --- a/flourish-client/src/App.tsx +++ b/flourish-client/src/App.tsx @@ -1,17 +1,14 @@ import { Box } from "@chakra-ui/react"; import { BrowserRouter, Route, Routes } from "react-router-dom"; -// import { customLayoutPaths } from "./assets/data/app"; import Auth from "./pages/auth"; import SignIn from "./pages/auth/signin"; import SignUp from "./pages/auth/signup"; import Homepage from "./pages/homepage"; import { useAppSelector } from "./hooks/useStore"; +import Dashboard from "./pages/dashboard"; const App = () => { - // const currentRoute = window.location.pathname; - // const isLayout = !customLayoutPaths.includes(currentRoute); - const isSignedIn = useAppSelector((state) => state.flags.isSignedIn); return ( @@ -34,6 +31,8 @@ const App = () => { } /> )} + {isSignedIn && } />} + 404} /> diff --git a/flourish-client/src/hooks/useSignOut.ts b/flourish-client/src/hooks/useSignOut.ts index 5aaf7e6..f0ebbb3 100644 --- a/flourish-client/src/hooks/useSignOut.ts +++ b/flourish-client/src/hooks/useSignOut.ts @@ -10,8 +10,8 @@ export const useSignOut = () => { const navigate = useNavigate(); const signOut = () => { - dispatch(setIsSignedIn(false)); dispatch(purgeUser()); + dispatch(setIsSignedIn(false)); navigate(nav.home); }; diff --git a/flourish-client/src/pages/auth/component/Layout.tsx b/flourish-client/src/pages/auth/component/Layout.tsx index d4d6fba..d6cfdc7 100644 --- a/flourish-client/src/pages/auth/component/Layout.tsx +++ b/flourish-client/src/pages/auth/component/Layout.tsx @@ -3,6 +3,7 @@ import { Box, Flex, Heading, Text, keyframes } from "@chakra-ui/react"; import { Link, useLocation } from "react-router-dom"; import { footerContent, headerContent } from "../../../assets/data/auth"; +import { useAppSelector } from "../../../hooks/useStore"; const Layout = ({ header, @@ -16,6 +17,8 @@ const Layout = ({ const [keyIndex, setKeyIndex] = useState(1); const { pathname } = useLocation(); + const token = useAppSelector((state) => state.user.token); + useEffect(() => { setKeyIndex((e) => e + 1); }, [pathname]); @@ -63,6 +66,7 @@ to { opacity: 1; } alignItems={"baseline"} justifyContent={"center"} justifySelf={"flex-end"} + opacity={token ? 0 : 1} > {footer.description} diff --git a/flourish-client/src/pages/auth/index.tsx b/flourish-client/src/pages/auth/index.tsx index 130d1a6..607d762 100644 --- a/flourish-client/src/pages/auth/index.tsx +++ b/flourish-client/src/pages/auth/index.tsx @@ -4,8 +4,11 @@ import { Link, Outlet } from "react-router-dom"; import logo from "../../assets/img/logo.png"; import SignInImage from "../../assets/svg/Auth"; import Container from "../../components/common/Container"; +import { useAppSelector } from "../../hooks/useStore"; const Auth = () => { + const token = useAppSelector((state) => state.user.token); + return ( { }} mb={"16"} > - + {"logo"} diff --git a/flourish-client/src/pages/dashboard/index.tsx b/flourish-client/src/pages/dashboard/index.tsx new file mode 100644 index 0000000..230fcaf --- /dev/null +++ b/flourish-client/src/pages/dashboard/index.tsx @@ -0,0 +1,7 @@ +import React from "react"; + +const Dashboard = () => { + return
Dashboard
; +}; + +export default Dashboard; diff --git a/flourish-client/src/store/actions/userAction.ts b/flourish-client/src/store/actions/userAction.ts deleted file mode 100644 index e69de29..0000000 diff --git a/flourish-client/src/store/slices/authSlice.ts b/flourish-client/src/store/slices/authSlice.ts deleted file mode 100644 index 8625f57..0000000 --- a/flourish-client/src/store/slices/authSlice.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { createSlice, PayloadAction } from "@reduxjs/toolkit"; - -import { Status } from "../../types/Status"; -import { User } from "../../types/User"; -import { signIn, signUp } from "../actions/authActions"; - -const initialState: User = { - token: "", - name: "", - email: "", - status: Status.IDLE, -}; - -const apiSlice = createSlice({ - name: "auth", - initialState, - reducers: {}, - extraReducers: (builder) => { - /* --------------------------------- Sign Up -------------------------------- */ - - builder.addCase(signUp.pending, (state) => { - state.status = Status.PENDING; - }); - - builder.addCase(signUp.fulfilled, (state) => { - state.status = Status.FULFILLED; - }); - - builder.addCase(signUp.rejected, (state) => { - state.status = Status.REJECTED; - }); - - /* --------------------------------- Sign In -------------------------------- */ - - builder.addCase(signIn.pending, (state) => { - state.status = Status.PENDING; - }); - - builder.addCase(signIn.fulfilled, (state, action: PayloadAction) => { - state.status = Status.FULFILLED; - console.log(action); - state.token = action.payload; - }); - - builder.addCase(signIn.rejected, (state) => { - state.status = Status.REJECTED; - state.token = ""; - }); - }, -}); - -export default apiSlice.reducer; diff --git a/flourish-client/src/store/slices/userSlice.ts b/flourish-client/src/store/slices/userSlice.ts index 4072fd9..ddcd799 100644 --- a/flourish-client/src/store/slices/userSlice.ts +++ b/flourish-client/src/store/slices/userSlice.ts @@ -17,7 +17,10 @@ const userSlice = createSlice({ initialState, reducers: { purgeUser: (state) => { - state = initialState; + state.email = ""; + state.token = ""; + state.name = ""; + state.status = Status.IDLE; }, }, extraReducers: (builder) => { @@ -51,13 +54,15 @@ const userSlice = createSlice({ builder.addCase(signIn.rejected, (state) => { state.status = Status.REJECTED; - state.token = ""; }); /* ---------------------------------- PURGE --------------------------------- */ builder.addCase(PURGE, (state) => { - state = initialState; + state.email = ""; + state.token = ""; + state.name = ""; + state.status = Status.IDLE; }); }, }); From d20f3834978cfc8fd77a5364c725c741038fe0cc Mon Sep 17 00:00:00 2001 From: Yashrif Arifin Date: Sat, 9 Sep 2023 02:43:34 +0600 Subject: [PATCH 2/3] feat: add questionnaire fields --- flourish-client/src/App.tsx | 22 ++- .../src/api/{apiSignUp.ts => apiAuth.ts} | 8 + .../api/{apiSignIn.ts => apiQuestionnaire.ts} | 2 +- flourish-client/src/assets/data/auth.ts | 6 +- .../src/assets/data/dashboard/dashboard.tsx | 27 +++ .../dashboard/questionnaire/questionnaire.tsx | 38 ++++ flourish-client/src/assets/data/nav.ts | 23 --- flourish-client/src/assets/data/routes.ts | 48 +++++ flourish-client/src/assets/data/server.ts | 10 +- flourish-client/src/assets/img/logo.png | Bin 57372 -> 55920 bytes flourish-client/src/assets/svg/Auth.tsx | 4 +- .../src/components/common/Header.tsx | 21 +- flourish-client/src/hooks/useSignOut.ts | 4 +- .../src/pages/auth/signin/index.tsx | 5 +- .../src/pages/auth/signup/index.tsx | 5 +- .../src/pages/dashboard/components/Menu.tsx | 101 ++++++++++ .../src/pages/dashboard/components/NavBar.tsx | 72 +++++++ flourish-client/src/pages/dashboard/index.tsx | 69 ++++++- .../questionnaire/QuestionnaireField.tsx | 97 +++++++++ .../pages/dashboard/questionnaire/index.tsx | 186 ++++++++++++++++++ .../src/store/actions/authActions.ts | 8 +- .../src/store/actions/questionnaireActions.ts | 9 + flourish-client/src/theme/global.css | 2 +- flourish-client/src/theme/theme.tsx | 1 + flourish-client/src/types/Questionnaire.ts | 8 + 25 files changed, 713 insertions(+), 63 deletions(-) rename flourish-client/src/api/{apiSignUp.ts => apiAuth.ts} (67%) rename flourish-client/src/api/{apiSignIn.ts => apiQuestionnaire.ts} (84%) create mode 100644 flourish-client/src/assets/data/dashboard/dashboard.tsx create mode 100644 flourish-client/src/assets/data/dashboard/questionnaire/questionnaire.tsx delete mode 100644 flourish-client/src/assets/data/nav.ts create mode 100644 flourish-client/src/assets/data/routes.ts create mode 100644 flourish-client/src/pages/dashboard/components/Menu.tsx create mode 100644 flourish-client/src/pages/dashboard/components/NavBar.tsx create mode 100644 flourish-client/src/pages/dashboard/questionnaire/QuestionnaireField.tsx create mode 100644 flourish-client/src/pages/dashboard/questionnaire/index.tsx create mode 100644 flourish-client/src/store/actions/questionnaireActions.ts create mode 100644 flourish-client/src/types/Questionnaire.ts diff --git a/flourish-client/src/App.tsx b/flourish-client/src/App.tsx index cacd49e..6ae0b0d 100644 --- a/flourish-client/src/App.tsx +++ b/flourish-client/src/App.tsx @@ -7,6 +7,8 @@ import SignUp from "./pages/auth/signup"; import Homepage from "./pages/homepage"; import { useAppSelector } from "./hooks/useStore"; import Dashboard from "./pages/dashboard"; +import Questions from "./pages/dashboard/questionnaire"; +import { nav } from "./assets/data/routes"; const App = () => { const isSignedIn = useAppSelector((state) => state.flags.isSignedIn); @@ -25,13 +27,25 @@ const App = () => { } /> {!isSignedIn && ( - }> + }> } /> - } /> - } /> + } /> + } /> + + )} + + {isSignedIn && ( + }> + } /> + Members} /> + Members} /> + sessionRequest} + /> + Overview} /> )} - {isSignedIn && } />} 404} /> diff --git a/flourish-client/src/api/apiSignUp.ts b/flourish-client/src/api/apiAuth.ts similarity index 67% rename from flourish-client/src/api/apiSignUp.ts rename to flourish-client/src/api/apiAuth.ts index bc5642e..25285a2 100644 --- a/flourish-client/src/api/apiSignUp.ts +++ b/flourish-client/src/api/apiAuth.ts @@ -2,6 +2,14 @@ import { api as apiData } from "../assets/data/server"; import { SignIn, SignUp } from "../types/Form"; import { api } from "./config/apiConfig"; +export const apiSignIn = async (data: SignIn) => { + const response = await api.post(apiData.signIn, { + ...data, + }); + + return response.data.token; +}; + export const apiSignUp = async (data: SignUp) => { const response = await api.post(apiData.signUp[data.type], { ...(data as SignIn), diff --git a/flourish-client/src/api/apiSignIn.ts b/flourish-client/src/api/apiQuestionnaire.ts similarity index 84% rename from flourish-client/src/api/apiSignIn.ts rename to flourish-client/src/api/apiQuestionnaire.ts index c9d6675..9d2af0b 100644 --- a/flourish-client/src/api/apiSignIn.ts +++ b/flourish-client/src/api/apiQuestionnaire.ts @@ -1,5 +1,5 @@ import { api as apiData } from "../assets/data/server"; -import { SignIn } from "../types/Form"; +import { SignIn, SignUp } from "../types/Form"; import { api } from "./config/apiConfig"; export const apiSignIn = async (data: SignIn) => { diff --git a/flourish-client/src/assets/data/auth.ts b/flourish-client/src/assets/data/auth.ts index 1da2680..b62f7f9 100644 --- a/flourish-client/src/assets/data/auth.ts +++ b/flourish-client/src/assets/data/auth.ts @@ -1,4 +1,4 @@ -import { nav } from "./nav"; +import { routes } from "./routes"; export const headerContent = { signIn: { @@ -16,12 +16,12 @@ export const headerContent = { export const footerContent = { signIn: { title: "Sign Up", - href: nav.signUp, + href: routes.signUp, description: "Don't have an account?", }, signUp: { title: "Sign In", - href: nav.signIn, + href: routes.signIn, description: "Already have an account?", }, }; diff --git a/flourish-client/src/assets/data/dashboard/dashboard.tsx b/flourish-client/src/assets/data/dashboard/dashboard.tsx new file mode 100644 index 0000000..ed1b420 --- /dev/null +++ b/flourish-client/src/assets/data/dashboard/dashboard.tsx @@ -0,0 +1,27 @@ +import { RxDashboard, RxQuestionMarkCircled } from "react-icons/rx"; + +import { userTypes } from "../../../types/User"; +import { routes } from "../routes"; + +export const menu = { + [userTypes.ADMIN]: [ + { + title: "Dashboard", + href: routes.dashboard, + icon: , + }, + { + title: "Questionnaires", + href: routes.questionnaire, + icon: , + }, + ], +}; + +export const navBar = { + [userTypes.ADMIN]: [ + { title: "Members", href: routes.members }, + { title: "Session Request", href: routes.sessionRequest }, + { title: "Overview", href: routes.overview }, + ], +}; diff --git a/flourish-client/src/assets/data/dashboard/questionnaire/questionnaire.tsx b/flourish-client/src/assets/data/dashboard/questionnaire/questionnaire.tsx new file mode 100644 index 0000000..62fce5c --- /dev/null +++ b/flourish-client/src/assets/data/dashboard/questionnaire/questionnaire.tsx @@ -0,0 +1,38 @@ +import { IoAddCircleOutline, IoRemoveCircleOutline } from "react-icons/io5"; + +export const questionnaireData = { + name: { title: "Questionnaire Group", placeholder: "Enter a name" }, + questionnaires: "All Questionnaires", + questionnaireField: { + title: "Question", + placeholder: "Enter a question", + }, + options: "Options and Points", + optionField: { + option: "Option", + points: "Points", + }, + + button: { + questionnaire: { + add: { + title: "Add a Questionnaire", + icon: , + }, + remove: { + title: "", + icon: , + }, + }, + option: { + title: "Add a option", + icon: , + }, + save: { + title: "Save", + }, + reset: { + title: "Reset", + }, + }, +}; diff --git a/flourish-client/src/assets/data/nav.ts b/flourish-client/src/assets/data/nav.ts deleted file mode 100644 index 3036b49..0000000 --- a/flourish-client/src/assets/data/nav.ts +++ /dev/null @@ -1,23 +0,0 @@ -export const nav = { - home: "/", - auth: "/auth", - signIn: "/auth/signin", - signUp: "/auth/signup", - dashboard: "/dashboard", -}; - -export const header = [ - { title: "Resources", href: "/resources" }, - { - title: "Support", - href: "/support", - }, -]; - -export const headerNav = { - signIn: { title: "Sign In", href: nav.signIn }, - dashboard: { - title: "Dashboard", - href: "/dashboard", - }, -}; diff --git a/flourish-client/src/assets/data/routes.ts b/flourish-client/src/assets/data/routes.ts new file mode 100644 index 0000000..271899e --- /dev/null +++ b/flourish-client/src/assets/data/routes.ts @@ -0,0 +1,48 @@ +export const nav = { + home: "", + auth: "auth", + dashboard: "dashboard", + signIn: "signin", + signUp: "signup", + questionnaire: "questionnaires", + resource: "resource", + support: "support", + members: "members", + sessionRequest: "session-request", + overview: "overview", +}; + +export const routes = { + home: `/${nav.home}`, + auth: `/${nav.auth}`, + signIn: `/${nav.auth}/${nav.signIn}`, + signUp: `/${nav.auth}/${nav.signUp}`, + dashboard: `/${nav.dashboard}`, + questionnaire: `/${nav.dashboard}/${nav.questionnaire}`, + resource: `/${nav.resource}`, + support: `/${nav.support}`, + members: `/${nav.dashboard}/${nav.members}`, + sessionRequest: `/${nav.dashboard}/${nav.sessionRequest}`, + overview: `/${nav.dashboard}/${nav.overview}`, +}; + +export const header = [ + { title: "Resources", href: routes.resource }, + { + title: "Support", + href: routes.support, + }, +]; + +export const headerNav = { + signIn: { title: "Sign In", href: routes.signIn }, + dashboard: { + title: "Dashboard", + href: routes.dashboard, + }, +}; + +export const signOut = { + title: "Sign Out", + href: routes.home, +}; diff --git a/flourish-client/src/assets/data/server.ts b/flourish-client/src/assets/data/server.ts index 7d99db7..2503e84 100644 --- a/flourish-client/src/assets/data/server.ts +++ b/flourish-client/src/assets/data/server.ts @@ -1,11 +1,11 @@ import { userTypes } from "../../types/User"; export const api = { - base: "https://flourish.onrender.com", + base: "https://flourish.onrender.com/", signUp: { - [userTypes.CLIENT]: "/client/signup", - [userTypes.ADMIN]: "/adminCounselor/signup", - [userTypes.COUNSELOR]: "counselor/signup", + [userTypes.CLIENT]: "client/signup/", + [userTypes.ADMIN]: "adminCounselor/signup/", + [userTypes.COUNSELOR]: "counselor/signup/", }, - signIn: "/login", + signIn: "login/", }; diff --git a/flourish-client/src/assets/img/logo.png b/flourish-client/src/assets/img/logo.png index bb1d53b831d3767726c4cdbeb0f20d0e8be2fe49..1d6717214f4d9ecb59960dba4a4c38f43df5fa60 100644 GIT binary patch literal 55920 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 literal 57372 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 diff --git a/flourish-client/src/assets/svg/Auth.tsx b/flourish-client/src/assets/svg/Auth.tsx index 1c8147d..0522efc 100644 --- a/flourish-client/src/assets/svg/Auth.tsx +++ b/flourish-client/src/assets/svg/Auth.tsx @@ -1,10 +1,10 @@ import { SVGProps } from "react"; import { useLocation } from "react-router-dom"; -import { nav } from "../data/nav"; +import { routes } from "../data/routes"; const SignIn = (props: SVGProps) => { const { pathname } = useLocation(); - const isSignUp = pathname !== nav.signUp; + const isSignUp = pathname !== routes.signUp; return ( { const isSignedIn = useAppSelector((state) => state.flags.isSignedIn); - const userName = useAppSelector((state) => state.user.name); + const name = useAppSelector((state) => state.user.name); const { signOut } = useSignOut(); const renderLink = ({ title, href }: { title: string; href: string }) => ( @@ -32,7 +36,7 @@ const Header = () => { letterSpacing={"-.25px"} textDecoration={"none"} whiteSpace={"nowrap"} - color={"secondary"} + color={"font.secondary"} fontSize={"2xl"} fontWeight={"medium"} pt={"0.6rem"} @@ -40,10 +44,9 @@ const Header = () => { borderBottom={"1px solid transparent"} transition={"all .3s"} _hover={{ - borderColor: "primary", color: "font.heroLight", textShadow: "0 0.4rem 0.8rem rgba(28, 126, 214, 0.25)", - boxShadow: "0 0.6rem 0.4rem -0.4rem rgba(28, 126, 214, 0.5)", + boxShadow: "0 0.6rem 0 -0.4rem rgba(28, 126, 214, 0.5)", }} > {title} @@ -104,7 +107,7 @@ const Header = () => { bg: "transparent", }} > - + @@ -154,11 +157,9 @@ const Header = () => { color: "font.heroLight", textShadow: "0 0.4rem 0.8rem rgba(28, 126, 214, 0.25)", }} - onClick={() => { - signOut(); - }} + onClick={signOut} > - Sign Out + {signOutTitle.title} diff --git a/flourish-client/src/hooks/useSignOut.ts b/flourish-client/src/hooks/useSignOut.ts index f0ebbb3..83b672e 100644 --- a/flourish-client/src/hooks/useSignOut.ts +++ b/flourish-client/src/hooks/useSignOut.ts @@ -1,6 +1,6 @@ import { useNavigate } from "react-router-dom"; -import { nav } from "../assets/data/nav"; +import { routes } from "../assets/data/routes"; import { setIsSignedIn } from "../store/slices/flagSlice"; import { purgeUser } from "../store/slices/userSlice"; import { useAppDispatch } from "./useStore"; @@ -12,7 +12,7 @@ export const useSignOut = () => { const signOut = () => { dispatch(purgeUser()); dispatch(setIsSignedIn(false)); - navigate(nav.home); + navigate(routes.home); }; return { signOut }; diff --git a/flourish-client/src/pages/auth/signin/index.tsx b/flourish-client/src/pages/auth/signin/index.tsx index a1007ce..7f6dcae 100644 --- a/flourish-client/src/pages/auth/signin/index.tsx +++ b/flourish-client/src/pages/auth/signin/index.tsx @@ -13,7 +13,7 @@ import { headerContent, successMessage, } from "../../../assets/data/auth"; -import { nav } from "../../../assets/data/nav"; +import { routes } from "../../../assets/data/routes"; import ButtonFull from "../../../components/common/button/ButtonFull"; import { useAppDispatch } from "../../../hooks/useStore"; import { signIn as signInAction } from "../../../store/actions/authActions"; @@ -48,7 +48,7 @@ const SignInForm = () => { setIsFulfilled(true); setTimeout(() => { dispatch(setIsSignedIn(true)); - navigate(nav.dashboard); + navigate(routes.dashboard); }, 3000); break; @@ -158,7 +158,6 @@ const SignInForm = () => { py={"24"} fontSize={"xl"} type="submit" - borderWidth={"2px"} > {footerContent.signUp.title} diff --git a/flourish-client/src/pages/auth/signup/index.tsx b/flourish-client/src/pages/auth/signup/index.tsx index 52b3346..2cc90ec 100644 --- a/flourish-client/src/pages/auth/signup/index.tsx +++ b/flourish-client/src/pages/auth/signup/index.tsx @@ -16,7 +16,7 @@ import { headerContent, successMessage, } from "../../../assets/data/auth"; -import { nav } from "../../../assets/data/nav"; +import { routes } from "../../../assets/data/routes"; import ButtonFull from "../../../components/common/button/ButtonFull"; import { useAppDispatch } from "../../../hooks/useStore"; import { signUp as signUpAction } from "../../../store/actions/authActions"; @@ -66,7 +66,7 @@ const SignUpForm = () => { case Status.FULFILLED: setIsFulfilled(true); setTimeout(() => { - navigate(nav.signIn); + navigate(routes.signIn); }, 3000); break; case Status.REJECTED: @@ -211,7 +211,6 @@ const SignUpForm = () => { py={"24"} fontSize={"xl"} type="submit" - borderWidth={"2px"} > Sign Up diff --git a/flourish-client/src/pages/dashboard/components/Menu.tsx b/flourish-client/src/pages/dashboard/components/Menu.tsx new file mode 100644 index 0000000..068c6e4 --- /dev/null +++ b/flourish-client/src/pages/dashboard/components/Menu.tsx @@ -0,0 +1,101 @@ +import { ReactNode, useEffect, useState } from "react"; +import { Box, ButtonGroup, Flex, Text } from "@chakra-ui/react"; +import { IoLogOutOutline } from "react-icons/io5"; +import { Link, useLocation } from "react-router-dom"; + +import { menu, navBar } from "../../../assets/data/dashboard/dashboard"; +import { nav, signOut as signOutTitle } from "../../../assets/data/routes"; +import { useSignOut } from "../../../hooks/useSignOut"; + +const Menu = () => { + const { signOut } = useSignOut(); + const { pathname } = useLocation(); + const [currentPath, setCurrentPath] = useState("#"); + + useEffect(() => { + setCurrentPath( + navBar.ADMIN.some( + ({ href }) => + href.split("/").at(-1) === (pathname.split("/").at(-1) as string) + ) + ? nav.dashboard + : (pathname.split("/").at(-1) as string) || + (pathname.split("/").at(-2) as string) + ); + }, [pathname]); + + const renderMenu = ({ + title, + href, + icon, + active = true, + onclick, + }: { + title: string; + href: string; + icon?: ReactNode; + active?: boolean; + onclick?: () => void; + }): React.ReactNode => { + return ( + + + + {icon} + + {title} + + + ); + }; + + return ( + + + {menu.ADMIN.map(renderMenu)} + + {renderMenu({ + ...signOutTitle, + icon: , + active: false, + onclick: () => signOut(), + })} + + ); +}; + +export default Menu; diff --git a/flourish-client/src/pages/dashboard/components/NavBar.tsx b/flourish-client/src/pages/dashboard/components/NavBar.tsx new file mode 100644 index 0000000..d395d97 --- /dev/null +++ b/flourish-client/src/pages/dashboard/components/NavBar.tsx @@ -0,0 +1,72 @@ +import { ReactNode, useEffect, useState } from "react"; +import { Box, Flex } from "@chakra-ui/react"; +import { Link, useLocation } from "react-router-dom"; + +import { navBar } from "../../../assets/data/dashboard/dashboard"; +import { nav } from "../../../assets/data/routes"; + +const NavBar = () => { + const { pathname } = useLocation(); + const [currentRoute, setCurrentRoute] = useState("#"); + + useEffect(() => { + const newRoute = + (pathname.split("/").at(-1) as string) || + (pathname.split("/").at(-2) as string); + + setCurrentRoute(newRoute === nav.dashboard ? nav.members : newRoute); + }, [pathname]); + + const renderLink = ({ + title, + href, + }: { + title: string; + href: string; + }): ReactNode => ( + + + {title} + + + ); + + return ( + + {navBar.ADMIN.map(renderLink)} + + ); +}; + +export default NavBar; diff --git a/flourish-client/src/pages/dashboard/index.tsx b/flourish-client/src/pages/dashboard/index.tsx index 230fcaf..5e8181d 100644 --- a/flourish-client/src/pages/dashboard/index.tsx +++ b/flourish-client/src/pages/dashboard/index.tsx @@ -1,7 +1,72 @@ -import React from "react"; +import { Avatar, Box, Flex, Grid, Image } from "@chakra-ui/react"; +import { Link, Outlet, useLocation } from "react-router-dom"; + +import { navBar } from "../../assets/data/dashboard/dashboard"; +import { nav, routes } from "../../assets/data/routes"; +import logo from "../../assets/img/logo.png"; +import Container from "../../components/common/Container"; +import { useAppSelector } from "../../hooks/useStore"; +import Menu from "./components/Menu"; +import NavBar from "./components/NavBar"; const Dashboard = () => { - return

Dashboard
; + const { pathname } = useLocation(); + const name = useAppSelector((state) => state.user.name); + + return ( + + + + + {"logo"} + + + + + {[...navBar.ADMIN, { href: nav.dashboard }].some( + ({ href }) => + href.split("/").at(-1) === (pathname.split("/").at(-1) as string) + ) ? ( + + ) : ( + + )} + + + + + + + + + + + + + + ); }; export default Dashboard; diff --git a/flourish-client/src/pages/dashboard/questionnaire/QuestionnaireField.tsx b/flourish-client/src/pages/dashboard/questionnaire/QuestionnaireField.tsx new file mode 100644 index 0000000..7ecec93 --- /dev/null +++ b/flourish-client/src/pages/dashboard/questionnaire/QuestionnaireField.tsx @@ -0,0 +1,97 @@ +import { + FormControl, + FormLabel, + Editable, + EditablePreview, + EditableInput, + FormErrorMessage, + Text, + Flex, +} from "@chakra-ui/react"; +import React from "react"; +import { questionnaireData } from "../../../assets/data/dashboard/questionnaire/questionnaire"; +import ButtonFull from "../../../components/common/button/ButtonFull"; + +const QuestionnaireField = ({ + data, + index, + errors, + register, + remove, +}: { + data: any; + errors: any; + index: number; + remove: any; + register: any; +}) => ( + + + + {questionnaireData.questionnaireField.title} – {index + 1} + + : + + + + + + + + {errors?.questionnaireFields?.[index] && + (errors?.questionnaireFields?.[index]?.question + ?.message as React.ReactNode)} + + + + remove(index)} + bg={"transparent"} + _hover={{ bg: "transparent", transform: "scale(1.1)" }} + > + + + {questionnaireData.button.questionnaire.remove.icon} + + {questionnaireData.button.questionnaire.remove.title} + + + +); + +export default QuestionnaireField; diff --git a/flourish-client/src/pages/dashboard/questionnaire/index.tsx b/flourish-client/src/pages/dashboard/questionnaire/index.tsx new file mode 100644 index 0000000..feefdfb --- /dev/null +++ b/flourish-client/src/pages/dashboard/questionnaire/index.tsx @@ -0,0 +1,186 @@ +import { + Box, + Divider, + Editable, + EditableInput, + EditablePreview, + Flex, + FormControl, + FormErrorMessage, + FormLabel, + Heading, + List, + Text, +} from "@chakra-ui/react"; +import { useFieldArray, useForm } from "react-hook-form"; +import { questionnaireData } from "../../../assets/data/dashboard/questionnaire/questionnaire"; +import Container from "../../../components/common/Container"; +import ButtonFull from "../../../components/common/button/ButtonFull"; +import { Questionnaire as QuestionnaireType } from "../../../types/Questionnaire"; +import QuestionnaireField from "./QuestionnaireField"; + +const QuestionnaireFormInit: QuestionnaireType = { + name: "", + questionnaireFields: [], + options: "", + evaluation_range: "", +}; + +const Questionnaire = () => { + const { + handleSubmit, + control, + register, + reset, + formState: { errors, isSubmitting }, + } = useForm({ defaultValues: QuestionnaireFormInit }); + + const { fields, append, remove } = useFieldArray({ + control, + name: "questionnaireFields", + }); + + return ( + +
console.log(data))} + style={{ + display: "flex", + flexDirection: "column", + gap: "2.4rem", + }} + > + + {/* ------------------------------ Reset Button ------------------------------ */} + + + reset({ + ...QuestionnaireFormInit, + }) + } + > + {questionnaireData.button.reset.title} + + + {/* ------------------------------- Save Button ------------------------------ */} + + + {questionnaireData.button.save.title} + + + + {/* --------------------------- Questionnaire Name --------------------------- */} + + + + + {questionnaireData.name.title}{" "} + + : + + + + + + + + + {errors?.name && (errors?.name?.message as React.ReactNode)} + + + + {/* -------------------------- Questionnaire Fields -------------------------- */} + + + {questionnaireData.questionnaires} + + + + {/* ------------------------------ Questionnaire ----------------------------- */} + + + {fields.map((field, index) => ( + + ))} + + + { + append({ + question: "", + }); + }} + > + + + {questionnaireData.button.questionnaire.add.icon} + + {questionnaireData.button.questionnaire.add.title} + + +
+
+ ); +}; + +export default Questionnaire; diff --git a/flourish-client/src/store/actions/authActions.ts b/flourish-client/src/store/actions/authActions.ts index 02db660..cd62c81 100644 --- a/flourish-client/src/store/actions/authActions.ts +++ b/flourish-client/src/store/actions/authActions.ts @@ -1,18 +1,18 @@ import { createAsyncThunk } from "@reduxjs/toolkit"; import { SignIn, SignUp } from "../../types/Form"; -import { apiSignUp } from "../../api/apiSignUp"; -import { apiSignIn } from "../../api/apiSignIn"; +import { apiSignUp } from "../../api/apiAuth"; +import { apiSignIn } from "../../api/apiAuth"; export const signUp = createAsyncThunk( - "flourish/signUp", + "auth/signUp", async (data: SignUp) => { return await apiSignUp(data); } ); export const signIn = createAsyncThunk( - "flourish/signIn", + "auth/signIn", async (data: SignIn) => { return await apiSignIn(data); } diff --git a/flourish-client/src/store/actions/questionnaireActions.ts b/flourish-client/src/store/actions/questionnaireActions.ts new file mode 100644 index 0000000..e45969e --- /dev/null +++ b/flourish-client/src/store/actions/questionnaireActions.ts @@ -0,0 +1,9 @@ +import { createAsyncThunk } from "@reduxjs/toolkit"; + +import { SignIn, SignUp } from "../../types/Form"; +import { apiSignUp } from "../../api/apiAuth"; +import { apiSignIn } from "../../api/apiAuth"; + +export const signUp = createAsyncThunk("auth/signUp", async (data: SignUp) => { + return await apiSignUp(data); +}); diff --git a/flourish-client/src/theme/global.css b/flourish-client/src/theme/global.css index 8a1ed15..6c6c1b8 100644 --- a/flourish-client/src/theme/global.css +++ b/flourish-client/src/theme/global.css @@ -38,7 +38,7 @@ body { /* Scroll Bar */ ::-webkit-scrollbar { - width: 1.4rem; + width: 1rem; } ::-webkit-scrollbar-track { diff --git a/flourish-client/src/theme/theme.tsx b/flourish-client/src/theme/theme.tsx index 308bfef..2601668 100644 --- a/flourish-client/src/theme/theme.tsx +++ b/flourish-client/src/theme/theme.tsx @@ -49,6 +49,7 @@ const theme = extendTheme({ }, success: "#40c057", + error: "#f03e3e", font: { // hero: "#204289", diff --git a/flourish-client/src/types/Questionnaire.ts b/flourish-client/src/types/Questionnaire.ts new file mode 100644 index 0000000..fd5006b --- /dev/null +++ b/flourish-client/src/types/Questionnaire.ts @@ -0,0 +1,8 @@ +export interface Questionnaire { + name: string; + questionnaireFields: { + question: string; + }[]; + options: string; + evaluation_range: string; +} From 2bc35479e5caadf241df7048fae70e3a686c32d8 Mon Sep 17 00:00:00 2001 From: Yashrif Arifin Date: Sat, 9 Sep 2023 16:24:30 +0600 Subject: [PATCH 3/3] feat: add questionnaire list --- flourish-client/src/App.tsx | 19 +- flourish-client/src/api/apiAuth.ts | 11 +- flourish-client/src/api/apiQuestionnaire.ts | 10 +- flourish-client/src/api/config/apiConfig.ts | 11 + .../src/assets/data/dashboard/dashboard.tsx | 3 +- flourish-client/src/assets/data/server.ts | 3 + .../components/common/button/ButtonFull.tsx | 4 +- .../src/pages/dashboard/components/Menu.tsx | 61 +++--- .../src/pages/dashboard/components/NavBar.tsx | 4 +- flourish-client/src/pages/dashboard/index.tsx | 7 +- .../questionnaire/QuestionnaireDetails.tsx | 10 + .../questionnaire/QuestionnaireList.tsx | 31 +++ .../components/Questionnaire.tsx | 193 ++++++++++++++++++ .../components/QuestionnaireCard.tsx | 70 +++++++ .../{ => components}/QuestionnaireField.tsx | 33 +-- .../pages/dashboard/questionnaire/index.tsx | 193 ++---------------- .../src/store/actions/questionnaireActions.ts | 14 +- .../src/store/slices/questionnaireSlice.ts | 48 +++++ flourish-client/src/store/slices/userSlice.ts | 30 ++- flourish-client/src/store/store.ts | 6 +- flourish-client/src/types/Questionnaire.ts | 13 +- flourish-client/src/types/User.ts | 14 +- 22 files changed, 513 insertions(+), 275 deletions(-) create mode 100644 flourish-client/src/pages/dashboard/questionnaire/QuestionnaireDetails.tsx create mode 100644 flourish-client/src/pages/dashboard/questionnaire/QuestionnaireList.tsx create mode 100644 flourish-client/src/pages/dashboard/questionnaire/components/Questionnaire.tsx create mode 100644 flourish-client/src/pages/dashboard/questionnaire/components/QuestionnaireCard.tsx rename flourish-client/src/pages/dashboard/questionnaire/{ => components}/QuestionnaireField.tsx (77%) create mode 100644 flourish-client/src/store/slices/questionnaireSlice.ts diff --git a/flourish-client/src/App.tsx b/flourish-client/src/App.tsx index 6ae0b0d..fb8aac6 100644 --- a/flourish-client/src/App.tsx +++ b/flourish-client/src/App.tsx @@ -1,17 +1,23 @@ import { Box } from "@chakra-ui/react"; import { BrowserRouter, Route, Routes } from "react-router-dom"; +import { setupInterceptors } from "./api/config/apiConfig"; +import { nav } from "./assets/data/routes"; +import { useAppSelector } from "./hooks/useStore"; import Auth from "./pages/auth"; import SignIn from "./pages/auth/signin"; import SignUp from "./pages/auth/signup"; -import Homepage from "./pages/homepage"; -import { useAppSelector } from "./hooks/useStore"; import Dashboard from "./pages/dashboard"; -import Questions from "./pages/dashboard/questionnaire"; -import { nav } from "./assets/data/routes"; +import Questionnaire from "./pages/dashboard/questionnaire"; +import Homepage from "./pages/homepage"; +import QuestionnaireDetails from "./pages/dashboard/questionnaire/QuestionnaireDetails"; +import QuestionnaireList from "./pages/dashboard/questionnaire/QuestionnaireList"; const App = () => { const isSignedIn = useAppSelector((state) => state.flags.isSignedIn); + const token = useAppSelector((state) => state?.user?.token); + + if (token) setupInterceptors(token); return ( { {isSignedIn && ( }> - } /> + }> + } /> + } /> + Members} /> Members} /> { +export const apiSignIn = async (data: SignIn): Promise => { const response = await api.post(apiData.signIn, { ...data, }); - return response.data.token; + return response.data; }; -export const apiSignUp = async (data: SignUp) => { - const response = await api.post(apiData.signUp[data.type], { +export const apiSignUp = async (data: SignUp): Promise => { + await api.post(apiData.signUp[data.type], { ...(data as SignIn), }); - - return response.data; }; diff --git a/flourish-client/src/api/apiQuestionnaire.ts b/flourish-client/src/api/apiQuestionnaire.ts index 9d2af0b..a94a1b0 100644 --- a/flourish-client/src/api/apiQuestionnaire.ts +++ b/flourish-client/src/api/apiQuestionnaire.ts @@ -1,11 +1,9 @@ import { api as apiData } from "../assets/data/server"; -import { SignIn, SignUp } from "../types/Form"; +import { Questionnaire } from "../types/Questionnaire"; import { api } from "./config/apiConfig"; -export const apiSignIn = async (data: SignIn) => { - const response = await api.post(apiData.signIn, { - ...data, - }); +export const getQuestionnaire = async (): Promise => { + const response = await api.get(apiData.questionnaire.adminCounselor, {}); - return response.data.token; + return response.data; }; diff --git a/flourish-client/src/api/config/apiConfig.ts b/flourish-client/src/api/config/apiConfig.ts index cdb6adb..1346b85 100644 --- a/flourish-client/src/api/config/apiConfig.ts +++ b/flourish-client/src/api/config/apiConfig.ts @@ -1,9 +1,13 @@ import axios, { AxiosError, AxiosInstance } from "axios"; + import { api as apiData } from "../../assets/data/server"; export const api: AxiosInstance = axios.create({ baseURL: apiData.base, timeout: 30000, // 30 seconds + headers: { + "Content-Type": "application/json", + }, }); const errorHandler = (error: AxiosError) => { @@ -22,3 +26,10 @@ const errorHandler = (error: AxiosError) => { api.interceptors.response.use(undefined, (error) => { return errorHandler(error); }); + +export const setupInterceptors = (token: string) => { + api.interceptors.request.use((config) => { + config.headers.Authorization = `token ${token}`; + return config; + }); +}; diff --git a/flourish-client/src/assets/data/dashboard/dashboard.tsx b/flourish-client/src/assets/data/dashboard/dashboard.tsx index ed1b420..fdcfb52 100644 --- a/flourish-client/src/assets/data/dashboard/dashboard.tsx +++ b/flourish-client/src/assets/data/dashboard/dashboard.tsx @@ -1,7 +1,7 @@ import { RxDashboard, RxQuestionMarkCircled } from "react-icons/rx"; import { userTypes } from "../../../types/User"; -import { routes } from "../routes"; +import { nav, routes } from "../routes"; export const menu = { [userTypes.ADMIN]: [ @@ -9,6 +9,7 @@ export const menu = { title: "Dashboard", href: routes.dashboard, icon: , + exclude: [nav.questionnaire], }, { title: "Questionnaires", diff --git a/flourish-client/src/assets/data/server.ts b/flourish-client/src/assets/data/server.ts index 2503e84..987168e 100644 --- a/flourish-client/src/assets/data/server.ts +++ b/flourish-client/src/assets/data/server.ts @@ -8,4 +8,7 @@ export const api = { [userTypes.COUNSELOR]: "counselor/signup/", }, signIn: "login/", + questionnaire: { + [userTypes.ADMIN]: "adminCounselor/questionnaire/", + }, }; diff --git a/flourish-client/src/components/common/button/ButtonFull.tsx b/flourish-client/src/components/common/button/ButtonFull.tsx index d9c529c..c848a10 100644 --- a/flourish-client/src/components/common/button/ButtonFull.tsx +++ b/flourish-client/src/components/common/button/ButtonFull.tsx @@ -4,8 +4,8 @@ import { Button } from "@chakra-ui/react"; const ButtonFull = (props: any) => { const { children, - px, - py, + px = "16", + py = "20", bg, fontSize, fontWeight, diff --git a/flourish-client/src/pages/dashboard/components/Menu.tsx b/flourish-client/src/pages/dashboard/components/Menu.tsx index 068c6e4..a95bc78 100644 --- a/flourish-client/src/pages/dashboard/components/Menu.tsx +++ b/flourish-client/src/pages/dashboard/components/Menu.tsx @@ -1,42 +1,37 @@ -import { ReactNode, useEffect, useState } from "react"; import { Box, ButtonGroup, Flex, Text } from "@chakra-ui/react"; +import { ReactNode } from "react"; import { IoLogOutOutline } from "react-icons/io5"; import { Link, useLocation } from "react-router-dom"; -import { menu, navBar } from "../../../assets/data/dashboard/dashboard"; -import { nav, signOut as signOutTitle } from "../../../assets/data/routes"; +import { menu } from "../../../assets/data/dashboard/dashboard"; +import { signOut as signOutTitle } from "../../../assets/data/routes"; import { useSignOut } from "../../../hooks/useSignOut"; const Menu = () => { const { signOut } = useSignOut(); const { pathname } = useLocation(); - const [currentPath, setCurrentPath] = useState("#"); - - useEffect(() => { - setCurrentPath( - navBar.ADMIN.some( - ({ href }) => - href.split("/").at(-1) === (pathname.split("/").at(-1) as string) - ) - ? nav.dashboard - : (pathname.split("/").at(-1) as string) || - (pathname.split("/").at(-2) as string) - ); - }, [pathname]); + const allPaths = pathname.split("/").filter((path) => path !== ""); const renderMenu = ({ title, href, icon, - active = true, + exclude, + activeEffect = true, onclick, }: { title: string; href: string; icon?: ReactNode; - active?: boolean; + exclude?: string[]; + activeEffect?: boolean; onclick?: () => void; }): React.ReactNode => { + const isActive = + activeEffect && + allPaths.includes(href.split("/").at(-1) as string) && + !allPaths?.some((path) => exclude?.includes(path)); + return ( { px={24} py={16} transition={"all .15s ease-in-out"} - bg={ - active && currentPath === href.split("/").at(-1) - ? "bg.tintsTransparent.2" - : "" - } - color={ - active && currentPath === href.split("/").at(-1) - ? "font.heroLight" - : "font.muted" - } + bg={isActive ? "bg.tintsTransparent.2" : ""} + color={isActive ? "font.heroLight" : "font.muted"} _hover={{ bg: "bg.tintsTransparent.2", color: "font.heroLight", }} > { }; return ( - + - {menu.ADMIN.map(renderMenu)} + {menu.adminCounselor.map(renderMenu)} {renderMenu({ ...signOutTitle, icon: , - active: false, + activeEffect: false, onclick: () => signOut(), })} diff --git a/flourish-client/src/pages/dashboard/components/NavBar.tsx b/flourish-client/src/pages/dashboard/components/NavBar.tsx index d395d97..fd3db56 100644 --- a/flourish-client/src/pages/dashboard/components/NavBar.tsx +++ b/flourish-client/src/pages/dashboard/components/NavBar.tsx @@ -17,6 +17,8 @@ const NavBar = () => { setCurrentRoute(newRoute === nav.dashboard ? nav.members : newRoute); }, [pathname]); + console.log(currentRoute) + const renderLink = ({ title, href, @@ -64,7 +66,7 @@ const NavBar = () => { return ( - {navBar.ADMIN.map(renderLink)} + {navBar.adminCounselor.map(renderLink)} ); }; diff --git a/flourish-client/src/pages/dashboard/index.tsx b/flourish-client/src/pages/dashboard/index.tsx index 5e8181d..21e7960 100644 --- a/flourish-client/src/pages/dashboard/index.tsx +++ b/flourish-client/src/pages/dashboard/index.tsx @@ -33,9 +33,11 @@ const Dashboard = () => { alignItems={"center"} justifyContent={"space-between"} > - {[...navBar.ADMIN, { href: nav.dashboard }].some( + {[...navBar.adminCounselor, { href: nav.dashboard }].some( ({ href }) => - href.split("/").at(-1) === (pathname.split("/").at(-1) as string) + href.split("/").at(-1) === + ((pathname.split("/").at(-1) as string) || + (pathname.split("/").at(-2) as string)) ) ? ( ) : ( @@ -56,6 +58,7 @@ const Dashboard = () => { w={"full"} mx={24} my={24} + py={32} bg={"white"} borderRadius={"xl"} overflowY={"scroll"} diff --git a/flourish-client/src/pages/dashboard/questionnaire/QuestionnaireDetails.tsx b/flourish-client/src/pages/dashboard/questionnaire/QuestionnaireDetails.tsx new file mode 100644 index 0000000..39cdc58 --- /dev/null +++ b/flourish-client/src/pages/dashboard/questionnaire/QuestionnaireDetails.tsx @@ -0,0 +1,10 @@ +import React from "react"; +import { useParams } from "react-router-dom"; + +const QuestionnaireDetails = () => { + const { id } = useParams(); + + return
{id}
; +}; + +export default QuestionnaireDetails; diff --git a/flourish-client/src/pages/dashboard/questionnaire/QuestionnaireList.tsx b/flourish-client/src/pages/dashboard/questionnaire/QuestionnaireList.tsx new file mode 100644 index 0000000..9821841 --- /dev/null +++ b/flourish-client/src/pages/dashboard/questionnaire/QuestionnaireList.tsx @@ -0,0 +1,31 @@ +import { Box, SimpleGrid } from "@chakra-ui/react"; +import { useEffect } from "react"; +import { useAppDispatch, useAppSelector } from "../../../hooks/useStore"; +import { fetchQuestionnaire } from "../../../store/actions/questionnaireActions"; +import QuestionnaireCard from "./components/QuestionnaireCard"; +import { Outlet } from "react-router-dom"; + +const QuestionnaireList = () => { + const dispatch = useAppDispatch(); + const questionnaires = useAppSelector( + (state) => state.questionnaire.questionnaires + ); + + useEffect(() => { + dispatch(fetchQuestionnaire()); + }, [dispatch]); + + return ( + + {questionnaires.map((questionnaire, index) => ( + + ))} + + ); +}; + +export default QuestionnaireList; diff --git a/flourish-client/src/pages/dashboard/questionnaire/components/Questionnaire.tsx b/flourish-client/src/pages/dashboard/questionnaire/components/Questionnaire.tsx new file mode 100644 index 0000000..6f41bc9 --- /dev/null +++ b/flourish-client/src/pages/dashboard/questionnaire/components/Questionnaire.tsx @@ -0,0 +1,193 @@ +import { + Box, + Divider, + Editable, + EditableInput, + EditablePreview, + Flex, + FormControl, + FormErrorMessage, + FormLabel, + Heading, + List, + Text, +} from "@chakra-ui/react"; +import { useEffect } from "react"; +import { useFieldArray, useForm } from "react-hook-form"; +import { questionnaireData } from "../../../../assets/data/dashboard/questionnaire/questionnaire"; +import Container from "../../../../components/common/Container"; +import ButtonFull from "../../../../components/common/button/ButtonFull"; +import { useAppDispatch, useAppSelector } from "../../../../hooks/useStore"; +import { fetchQuestionnaire } from "../../../../store/actions/questionnaireActions"; +import QuestionnaireField from "./QuestionnaireField"; + +const Questionnaire = () => { + const dispatch = useAppDispatch(); + const questionnaires = useAppSelector( + (state) => state.questionnaire.questionnaires[0] + ); + const status = useAppSelector((state) => state.questionnaire.status); + + const { + handleSubmit, + control, + register, + reset, + formState: { errors, isSubmitting }, + } = useForm({ defaultValues: questionnaires }); + + const { fields, append, remove } = useFieldArray({ + control, + name: "questionnaireFields", + }); + + useEffect(() => { + dispatch(fetchQuestionnaire()); + }, [dispatch]); + + return ( + +
console.log(data))} + style={{ + display: "flex", + flexDirection: "column", + gap: "2.4rem", + }} + > + + {/* ------------------------------ Reset Button ------------------------------ */} + + + reset({ + ...questionnaires, + }) + } + > + {questionnaireData.button.reset.title} + + + {/* ------------------------------- Save Button ------------------------------ */} + + + {questionnaireData.button.save.title} + + + + {/* --------------------------- Questionnaire Name --------------------------- */} + + + + + {questionnaireData.name.title}{" "} + + : + + + + + + + + + {errors?.name && (errors?.name?.message as React.ReactNode)} + + + + {/* -------------------------- Questionnaire Fields -------------------------- */} + + + + {questionnaireData.questionnaires} + + + + + {/* ------------------------------ Questionnaire ----------------------------- */} + + + {fields.map((field, index) => ( + + ))} + + + { + append({ + question: "", + }); + }} + > + + + {questionnaireData.button.questionnaire.add.icon} + + {questionnaireData.button.questionnaire.add.title} + + +
+
+ ); +}; + +export default Questionnaire; diff --git a/flourish-client/src/pages/dashboard/questionnaire/components/QuestionnaireCard.tsx b/flourish-client/src/pages/dashboard/questionnaire/components/QuestionnaireCard.tsx new file mode 100644 index 0000000..e93017b --- /dev/null +++ b/flourish-client/src/pages/dashboard/questionnaire/components/QuestionnaireCard.tsx @@ -0,0 +1,70 @@ +import { + Card, + CardHeader, + Heading, + CardBody, + CardFooter, + Button, + Text, + VStack, +} from "@chakra-ui/react"; +import React from "react"; +import { Questionnaire } from "../../../../types/Questionnaire"; +import ButtonFull from "../../../../components/common/button/ButtonFull"; +import { Link } from "react-router-dom"; +import { routes } from "../../../../assets/data/routes"; + +const QuestionnaireCard = ({ + questionnaire, +}: { + questionnaire: Questionnaire; +}) => { + const renderedQuestionnaire = () => { + const questions = questionnaire.questionnaireFields.map( + ({ question }, index) => { + if (index >= 2) return null; + return ( + + {question} + + ); + } + ); + + return ( + + {questions} + + ); + }; + + return ( + + + + {questionnaire.name} + + + {renderedQuestionnaire()} + + + + View Details + + + + + ); +}; + +export default QuestionnaireCard; diff --git a/flourish-client/src/pages/dashboard/questionnaire/QuestionnaireField.tsx b/flourish-client/src/pages/dashboard/questionnaire/components/QuestionnaireField.tsx similarity index 77% rename from flourish-client/src/pages/dashboard/questionnaire/QuestionnaireField.tsx rename to flourish-client/src/pages/dashboard/questionnaire/components/QuestionnaireField.tsx index 7ecec93..0cf235e 100644 --- a/flourish-client/src/pages/dashboard/questionnaire/QuestionnaireField.tsx +++ b/flourish-client/src/pages/dashboard/questionnaire/components/QuestionnaireField.tsx @@ -1,16 +1,23 @@ import { - FormControl, - FormLabel, Editable, - EditablePreview, EditableInput, + EditablePreview, + Flex, + FormControl, FormErrorMessage, + FormLabel, Text, - Flex, } from "@chakra-ui/react"; -import React from "react"; -import { questionnaireData } from "../../../assets/data/dashboard/questionnaire/questionnaire"; -import ButtonFull from "../../../components/common/button/ButtonFull"; +import { + FieldArrayWithId, + FieldErrors, + UseFieldArrayRemove, + UseFormRegister, +} from "react-hook-form"; + +import { questionnaireData } from "../../../../assets/data/dashboard/questionnaire/questionnaire"; +import ButtonFull from "../../../../components/common/button/ButtonFull"; +import { Questionnaire } from "../../../../types/Questionnaire"; const QuestionnaireField = ({ data, @@ -19,11 +26,11 @@ const QuestionnaireField = ({ register, remove, }: { - data: any; - errors: any; + data: FieldArrayWithId; + errors: FieldErrors; index: number; - remove: any; - register: any; + remove: UseFieldArrayRemove; + register: UseFormRegister; }) => ( { - const { - handleSubmit, - control, - register, - reset, - formState: { errors, isSubmitting }, - } = useForm({ defaultValues: QuestionnaireFormInit }); + const dispatch = useAppDispatch(); + const questionnaires = useAppSelector( + (state) => state.questionnaire.questionnaires + ); - const { fields, append, remove } = useFieldArray({ - control, - name: "questionnaireFields", - }); + useEffect(() => { + dispatch(fetchQuestionnaire()); + }, [dispatch]); return ( - -
console.log(data))} - style={{ - display: "flex", - flexDirection: "column", - gap: "2.4rem", - }} - > - - {/* ------------------------------ Reset Button ------------------------------ */} - - - reset({ - ...QuestionnaireFormInit, - }) - } - > - {questionnaireData.button.reset.title} - - - {/* ------------------------------- Save Button ------------------------------ */} - - - {questionnaireData.button.save.title} - - - - {/* --------------------------- Questionnaire Name --------------------------- */} - - - - - {questionnaireData.name.title}{" "} - - : - - - - - - - - - {errors?.name && (errors?.name?.message as React.ReactNode)} - - - - {/* -------------------------- Questionnaire Fields -------------------------- */} - - - {questionnaireData.questionnaires} - - - - {/* ------------------------------ Questionnaire ----------------------------- */} - - - {fields.map((field, index) => ( - - ))} - - - { - append({ - question: "", - }); - }} - > - - - {questionnaireData.button.questionnaire.add.icon} - - {questionnaireData.button.questionnaire.add.title} - - -
-
+ + + ); }; diff --git a/flourish-client/src/store/actions/questionnaireActions.ts b/flourish-client/src/store/actions/questionnaireActions.ts index e45969e..8ab8598 100644 --- a/flourish-client/src/store/actions/questionnaireActions.ts +++ b/flourish-client/src/store/actions/questionnaireActions.ts @@ -1,9 +1,11 @@ import { createAsyncThunk } from "@reduxjs/toolkit"; -import { SignIn, SignUp } from "../../types/Form"; -import { apiSignUp } from "../../api/apiAuth"; -import { apiSignIn } from "../../api/apiAuth"; +import { getQuestionnaire } from "../../api/apiQuestionnaire"; +import { Questionnaire } from "../../types/Questionnaire"; -export const signUp = createAsyncThunk("auth/signUp", async (data: SignUp) => { - return await apiSignUp(data); -}); +export const fetchQuestionnaire = createAsyncThunk( + "flourish/questionnaire", + async (): Promise => { + return await getQuestionnaire(); + } +); diff --git a/flourish-client/src/store/slices/questionnaireSlice.ts b/flourish-client/src/store/slices/questionnaireSlice.ts new file mode 100644 index 0000000..6e5b8ce --- /dev/null +++ b/flourish-client/src/store/slices/questionnaireSlice.ts @@ -0,0 +1,48 @@ +import { createSlice } from "@reduxjs/toolkit"; +import { PURGE } from "redux-persist"; + +import { Questionnaire } from "../../types/Questionnaire"; +import { Status } from "../../types/Status"; +import { fetchQuestionnaire } from "../actions/questionnaireActions"; + +interface reducerType { + questionnaires: Questionnaire[]; + status: Status; +} + +const initialState: reducerType = { + questionnaires: [], + status: Status.IDLE, +}; + +const questionnaireSlice = createSlice({ + name: "questionnaire", + initialState, + reducers: { + purgeQuestionnaire: () => {}, + }, + extraReducers: (builder) => { + builder.addCase(fetchQuestionnaire.pending, (state) => { + state.status = Status.PENDING; + }); + builder.addCase(fetchQuestionnaire.fulfilled, (state, action) => { + state.questionnaires = action.payload; + state.status = Status.FULFILLED; + }); + builder.addCase(fetchQuestionnaire.rejected, (state) => { + state.questionnaires = []; + state.status = Status.REJECTED; + }); + + /* ---------------------------------- PURGE --------------------------------- */ + + builder.addCase(PURGE, (state) => { + state.questionnaires = []; + state.status = Status.IDLE; + }); + }, +}); + +export default questionnaireSlice.reducer; +export const { purgeQuestionnaire } = questionnaireSlice.actions; +export const { name } = questionnaireSlice; diff --git a/flourish-client/src/store/slices/userSlice.ts b/flourish-client/src/store/slices/userSlice.ts index ddcd799..30c0a75 100644 --- a/flourish-client/src/store/slices/userSlice.ts +++ b/flourish-client/src/store/slices/userSlice.ts @@ -1,14 +1,21 @@ -import { createSlice, PayloadAction } from "@reduxjs/toolkit"; +import { createSlice } from "@reduxjs/toolkit"; import { PURGE } from "redux-persist"; import { Status } from "../../types/Status"; import { User } from "../../types/User"; import { signIn, signUp } from "../actions/authActions"; -const initialState: User = { +interface reducerType extends User { + status: Status; +} + +const initialState: reducerType = { token: "", - name: "", email: "", + name: "", + adminCounselor: "", + counselor: "", + client: "", status: Status.IDLE, }; @@ -44,15 +51,18 @@ const userSlice = createSlice({ state.status = Status.PENDING; }); - builder.addCase( - signIn.fulfilled, - (state, action: PayloadAction) => { - state.status = Status.FULFILLED; - state.token = action.payload; - } - ); + builder.addCase(signIn.fulfilled, (state, action) => { + state.email = action.payload.email; + state.token = action.payload.token; + state.name = action.payload.name; + state.adminCounselor = action.payload.adminCounselor; + state.counselor = action.payload.counselor; + state.client = action.payload.client; + state.status = Status.FULFILLED; + }); builder.addCase(signIn.rejected, (state) => { + state = { ...initialState }; state.status = Status.REJECTED; }); diff --git a/flourish-client/src/store/store.ts b/flourish-client/src/store/store.ts index 7027014..6fdd30f 100644 --- a/flourish-client/src/store/store.ts +++ b/flourish-client/src/store/store.ts @@ -11,8 +11,11 @@ import { } from "redux-persist"; import storage from "redux-persist/lib/storage"; -import userSlice, { name as userSliceName } from "./slices/userSlice"; import flagSlice, { name as flagSliceName } from "./slices/flagSlice"; +import questionnaireSlice, { + name as questionnaireSliceName, +} from "./slices/questionnaireSlice"; +import userSlice, { name as userSliceName } from "./slices/userSlice"; const persistConfig = { key: "flourish", @@ -22,6 +25,7 @@ const persistConfig = { const rootReducer = combineReducers({ [userSliceName]: userSlice, [flagSliceName]: flagSlice, + [questionnaireSliceName]: questionnaireSlice, }); const persistedReducer = persistReducer(persistConfig, rootReducer); diff --git a/flourish-client/src/types/Questionnaire.ts b/flourish-client/src/types/Questionnaire.ts index fd5006b..8f59e1d 100644 --- a/flourish-client/src/types/Questionnaire.ts +++ b/flourish-client/src/types/Questionnaire.ts @@ -1,8 +1,15 @@ +import { userTypes } from "./User"; + export interface Questionnaire { + id: string | null; name: string; - questionnaireFields: { - question: string; - }[]; + questionnaireFields: QuestionnaireFields[]; options: string; evaluation_range: string; + [userTypes.ADMIN]: string; +} + +export interface QuestionnaireFields { + id?: string; + question: string; } diff --git a/flourish-client/src/types/User.ts b/flourish-client/src/types/User.ts index 03aacef..ffc328e 100644 --- a/flourish-client/src/types/User.ts +++ b/flourish-client/src/types/User.ts @@ -1,14 +1,14 @@ -import { Status } from "./Status"; - export enum userTypes { - ADMIN = "ADMIN", - CLIENT = "CLIENT", - COUNSELOR = "COUNSELOR", + ADMIN = "adminCounselor", + CLIENT = "counselor", + COUNSELOR = "client", } export interface User { token: string; - name: string; email: string; - status: Status; + name: string; + adminCounselor: string | null; + counselor: string | null; + client: string | null; }