From 9745cbeb2fb42921fe3f46e880a6f617bbbd1790 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A1muel=20Fekete?= Date: Sat, 13 Jan 2024 11:41:38 +0100 Subject: [PATCH] user feedback & message to event_rating --- .../client/src/api/contexts/RatingContext.tsx | 4 ++ .../src/api/contexts/RatingProvider.tsx | 32 ++++++--- .../client/src/api/hooks/eventQueryHooks.ts | 2 +- packages/client/src/api/hooks/ratingHooks.ts | 10 ++- .../client/src/pages/ratings/Rating.page.tsx | 8 ++- .../ratings/components/CriterionRateForm.tsx | 2 +- .../components/DesktopRatingProgressBar.tsx | 8 ++- .../ratings/components/SubmitRatingModal.tsx | 70 +++++++++++++++++++ packages/common/src/lib/types/eventRatings.ts | 8 ++- .../functions/src/functions/ratings/submit.ts | 12 +++- packages/functions/src/functions/seed.ts | 4 +- .../functions/src/typeorm/configOptions.ts | 3 +- .../src/typeorm/entities/EventRating.ts | 3 + .../1705141629515-message_to_rating.ts | 14 ++++ 14 files changed, 155 insertions(+), 25 deletions(-) create mode 100644 packages/client/src/pages/ratings/components/SubmitRatingModal.tsx create mode 100644 packages/functions/src/typeorm/migrations/1705141629515-message_to_rating.ts diff --git a/packages/client/src/api/contexts/RatingContext.tsx b/packages/client/src/api/contexts/RatingContext.tsx index d8ace20..90bbc65 100644 --- a/packages/client/src/api/contexts/RatingContext.tsx +++ b/packages/client/src/api/contexts/RatingContext.tsx @@ -18,6 +18,8 @@ export type RatingContextType = { rateCriteria: (criterionId: number[]) => void nextCategory: () => void previousCategory: () => void + submitRating: (message?: string) => void + openSubmitModal: (onSuccessfulOpen: () => void) => void } export const RatingContext = createContext({ @@ -37,4 +39,6 @@ export const RatingContext = createContext({ rateCriteria: () => {}, nextCategory: () => {}, previousCategory: () => {}, + submitRating: () => {}, + openSubmitModal: () => {}, }) diff --git a/packages/client/src/api/contexts/RatingProvider.tsx b/packages/client/src/api/contexts/RatingProvider.tsx index 35ee999..5b833b5 100644 --- a/packages/client/src/api/contexts/RatingProvider.tsx +++ b/packages/client/src/api/contexts/RatingProvider.tsx @@ -94,6 +94,15 @@ export const RatingProvider = ({ children }: PropsWithChildren) => { setRatedCriteria(newArray) } + const openSubmitModal = (onSuccessfulOpen: () => void) => { + if (category?.criteria.some((c) => !ratedCriteria.includes(generateCriterionId(c.id)))) { + setValidate(true) + toast({ title: 'Minden szempont kitöltése kötelező!', status: 'warning' }) + return + } + onSuccessfulOpen() + } + const nextCategory = () => { if (!data) { return @@ -191,15 +200,18 @@ export const RatingProvider = ({ children }: PropsWithChildren) => { setStage(newStage) } - const submitRating = () => { - submitMutation.mutate(ratingId, { - onSuccess: () => { - reset() - toast({ title: 'Értékelés véglegesítve!', status: 'success' }) - navigate(`${PATHS.EVENTS}/${data?.eventId}`) - }, - onError: (e) => onError(e, toast), - }) + const submitRating = (message?: string) => { + submitMutation.mutate( + { ratingId, message }, + { + onSuccess: () => { + reset() + toast({ title: 'Értékelés véglegesítve!', status: 'success' }) + navigate(`${PATHS.EVENTS}/${data?.eventId}`) + }, + onError: (e) => onError(e, toast), + } + ) } const reset = () => { @@ -231,6 +243,8 @@ export const RatingProvider = ({ children }: PropsWithChildren) => { rateCriterion, nextCategory, previousCategory, + submitRating, + openSubmitModal, }} > {children} diff --git a/packages/client/src/api/hooks/eventQueryHooks.ts b/packages/client/src/api/hooks/eventQueryHooks.ts index dfaa379..f10ec5b 100644 --- a/packages/client/src/api/hooks/eventQueryHooks.ts +++ b/packages/client/src/api/hooks/eventQueryHooks.ts @@ -33,7 +33,7 @@ export const useFetchRateableEventsFromCache = () => { const res = await functionAxios.get('cached/events/rateable') return res.data.sort((e1, e2) => -e1.startDate.localeCompare(e2.startDate)) }, - { retry: false } + { retry: false, enabled: false } // cache likely won't be used in the future ) } diff --git a/packages/client/src/api/hooks/ratingHooks.ts b/packages/client/src/api/hooks/ratingHooks.ts index d254213..c891688 100644 --- a/packages/client/src/api/hooks/ratingHooks.ts +++ b/packages/client/src/api/hooks/ratingHooks.ts @@ -7,6 +7,7 @@ import { GetEventRating, PageTurn, PontozoError, + SubmitEventRating, } from '@pontozo/common' import { useMutation, useQuery } from '@tanstack/react-query' import { functionAxios } from '../../util/axiosConfig' @@ -18,9 +19,14 @@ export const useStartRatingMutation = () => { ) } +type SubmitEventRatingMutation = SubmitEventRating & { + ratingId: number +} + export const useSubmitRatingMutation = () => { - return useMutation( - async (ratingId: number) => (await functionAxios.post(`${FUNC_HOST}/ratings/${ratingId}/submit`)).data + return useMutation( + async (data: SubmitEventRatingMutation) => + (await functionAxios.post(`${FUNC_HOST}/ratings/${data.ratingId}/submit`, { message: data.message })).data ) } diff --git a/packages/client/src/pages/ratings/Rating.page.tsx b/packages/client/src/pages/ratings/Rating.page.tsx index ecf1853..dec427a 100644 --- a/packages/client/src/pages/ratings/Rating.page.tsx +++ b/packages/client/src/pages/ratings/Rating.page.tsx @@ -1,14 +1,15 @@ import { Button, HStack, useMediaQuery } from '@chakra-ui/react' +import { RatingStatus } from '@pontozo/common' import { createPortal } from 'react-dom' import { FaChevronLeft, FaChevronRight } from 'react-icons/fa' import { useParams } from 'react-router-dom' import { HelmetTitle } from 'src/components/commons/HelmetTitle' -import { RatingStatus } from '../../../../common/src' import { useRatingContext } from '../../api/contexts/useRatingContext' import { LoadingSpinner } from '../../components/commons/LoadingSpinner' import { CategoryWithCriteriaList } from './components/CategoryWithCriteriaList' import { DesktopRatingProgressBar } from './components/DesktopRatingProgressBar' import { MobileRatingProgressBar } from './components/MobileRatingProgressBar' +import { SubmitRatingModal } from './components/SubmitRatingModal' export const RatingPage = () => { const { ratingId } = useParams() @@ -28,9 +29,10 @@ export const RatingPage = () => { - {(eventRatingInfo?.status === RatingStatus.STARTED || hasNext) && ( + {eventRatingInfo?.status === RatingStatus.STARTED && !hasNext && } + {hasNext && ( )} diff --git a/packages/client/src/pages/ratings/components/CriterionRateForm.tsx b/packages/client/src/pages/ratings/components/CriterionRateForm.tsx index 8dd2af3..e5aa5ff 100644 --- a/packages/client/src/pages/ratings/components/CriterionRateForm.tsx +++ b/packages/client/src/pages/ratings/components/CriterionRateForm.tsx @@ -46,7 +46,7 @@ export const CriterionRateForm = ({ criterion }: Props) => { {criterion.text1 && {criterion.text1}} {criterion.text2 && {criterion.text2}} {criterion.text3 && {criterion.text3}} - {criterion.allowEmpty && Nem tudom megítélni} + {criterion.allowEmpty && Nem tudom megítélni/nem releváns} diff --git a/packages/client/src/pages/ratings/components/DesktopRatingProgressBar.tsx b/packages/client/src/pages/ratings/components/DesktopRatingProgressBar.tsx index d6091a2..588d990 100644 --- a/packages/client/src/pages/ratings/components/DesktopRatingProgressBar.tsx +++ b/packages/client/src/pages/ratings/components/DesktopRatingProgressBar.tsx @@ -9,6 +9,7 @@ import { formatDateRange } from 'src/util/formatDateRange' import { PATHS } from 'src/util/paths' import './progressBar.css' import { ProgressBarItem } from './ProgressBarItem' +import { SubmitRatingModal } from './SubmitRatingModal' export const DesktopRatingProgressBar = () => { const { eventRatingInfo, nextCategory, previousCategory, hasNext, hasPrev } = useRatingContext() @@ -72,9 +73,10 @@ export const DesktopRatingProgressBar = () => { - {(eventRatingInfo.status === RatingStatus.STARTED || hasNext) && ( - )} diff --git a/packages/client/src/pages/ratings/components/SubmitRatingModal.tsx b/packages/client/src/pages/ratings/components/SubmitRatingModal.tsx new file mode 100644 index 0000000..267d434 --- /dev/null +++ b/packages/client/src/pages/ratings/components/SubmitRatingModal.tsx @@ -0,0 +1,70 @@ +import { + Button, + FormControl, + FormLabel, + Modal, + ModalBody, + ModalCloseButton, + ModalContent, + ModalFooter, + ModalHeader, + ModalOverlay, + Text, + Textarea, + useDisclosure, +} from '@chakra-ui/react' +import { useState } from 'react' +import { FaChevronRight } from 'react-icons/fa' +import { useRatingContext } from 'src/api/contexts/useRatingContext' + +type Props = { + variant?: string + color?: string + colorScheme?: string +} + +export const SubmitRatingModal = ({ variant, color, colorScheme }: Props) => { + const { submitRating, openSubmitModal } = useRatingContext() + const [value, setValue] = useState('') + const { isOpen, onClose, onOpen } = useDisclosure() + return ( + <> + + + + + Értékelés véglegesítése + + + + Köszönjük, hogy értékelted a versenyt! Az értékélest a 'Küldés' gombbal tudod véglegesíteni, ezután már nem fogod tudni + szerkeszteni. Ha szeretnél még szöveges formában visszajelzést küldeni a szervezőknek, azt megteheted az alábbi + szövegdobozban. + + + Szöveges visszajelzés (opcionális) +