From 0419adeba6ede089f8b2a5d8960673d8637aebe8 Mon Sep 17 00:00:00 2001 From: Ravi Gulhane <> Date: Wed, 1 Jul 2026 16:45:08 +0530 Subject: [PATCH] 1july --- src/App.tsx | 2 + src/components/DynamicFeedbackForm.tsx | 68 +++ src/components/HyperNavigationFAB.tsx | 2 + src/components/present/PresentFooterNav.tsx | 39 ++ .../present/PresentRespondersList.tsx | 67 +++ src/components/present/PresentStatsBars.tsx | 78 ++++ src/components/present/presentStatsMerge.ts | 61 +++ src/hooks/useEventRegistrationSettings.ts | 20 +- src/lib/api.ts | 132 +++++- src/lib/sessionQuizPollsRtdb.ts | 38 +- src/pages/FeedbackPage.tsx | 93 ++--- src/pages/LoginPage.tsx | 11 +- src/pages/QuizPollPresentPage.tsx | 256 ++++++++++++ src/pages/QuizPollTakePage.tsx | 393 ++++++++++++++++-- src/pages/RatingsPage.tsx | 138 ++---- src/pages/SingleEventPage.tsx | 92 ++-- 16 files changed, 1256 insertions(+), 234 deletions(-) create mode 100644 src/components/present/PresentFooterNav.tsx create mode 100644 src/components/present/PresentRespondersList.tsx create mode 100644 src/components/present/PresentStatsBars.tsx create mode 100644 src/components/present/presentStatsMerge.ts create mode 100644 src/pages/QuizPollPresentPage.tsx diff --git a/src/App.tsx b/src/App.tsx index a7f748b..3608360 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -16,6 +16,7 @@ import { RegisterPage } from "./pages/RegisterPage"; import { RewardsPage } from "./pages/RewardsPage"; import { SingleEventPage } from "./pages/SingleEventPage"; import { QuizPollTakePage } from "./pages/QuizPollTakePage"; +import { QuizPollPresentPage } from "./pages/QuizPollPresentPage"; import { CodeEntryPage } from "./pages/CodeEntryPage"; import { PrivacyPolicyPage } from "./pages/PrivacyPolicyPage"; import { TermsOfServicePage } from "./pages/TermsOfServicePage"; @@ -37,6 +38,7 @@ export default function App() { } /> } /> } /> + } /> } /> } /> } /> diff --git a/src/components/DynamicFeedbackForm.tsx b/src/components/DynamicFeedbackForm.tsx index a5f2135..847fbe4 100644 --- a/src/components/DynamicFeedbackForm.tsx +++ b/src/components/DynamicFeedbackForm.tsx @@ -1,8 +1,24 @@ import { useMemo, useState, type FormEvent } from "react"; +import { Star } from "lucide-react"; import type { VisitorPublicFeedbackForm, VisitorPublicFeedbackFormField } from "../lib/api"; import { postPublicFormSubmit } from "../lib/api"; import { getAttendeeParticipant } from "../lib/attendeeAuth"; +function isStarRatingField(f: VisitorPublicFeedbackFormField): boolean { + const t = (f.type || "").toLowerCase().trim(); + if (t === "stars" || t === "star rating" || t === "star ratings") return true; + if (t === "select") { + const opts = (f.options || []).map((o) => String(o).trim()); + return opts.length === 5 && opts.every((v, i) => v === String(i + 1)); + } + return false; +} + +function starValueValid(raw: unknown): boolean { + const n = typeof raw === "number" ? raw : parseInt(String(raw ?? ""), 10); + return Number.isFinite(n) && n >= 1 && n <= 5; +} + export function DynamicFeedbackForm({ eventId, schema, @@ -30,6 +46,8 @@ export function DynamicFeedbackForm({ const raw = values[key]; if ((f.type || "").toLowerCase() === "checkboxes") { if (!Array.isArray(raw) || raw.length === 0) return false; + } else if (isStarRatingField(f)) { + if (!starValueValid(raw)) return false; } else if (raw === undefined || raw === null || String(raw).trim() === "") { return false; } @@ -138,6 +156,38 @@ function FieldInput({ ); } + if (isStarRatingField(f)) { + const n = typeof value === "number" ? value : parseInt(String(value ?? ""), 10); + const selected = Number.isFinite(n) ? n : 0; + return ( +
+ + {label} + {f.required ? * : null} + +
+ {Array.from({ length: 5 }, (_, i) => { + const star = i + 1; + return ( + + ); + })} +
+
+ ); + } + if (t === "select") { return (