diff --git a/src/app/components/building-passport/Toolbar.tsx b/src/app/components/building-passport/Toolbar.tsx index aef2505..66670d0 100644 --- a/src/app/components/building-passport/Toolbar.tsx +++ b/src/app/components/building-passport/Toolbar.tsx @@ -21,7 +21,7 @@ import { Button } from "@/app/shadcn_components/ui/button"; import { cva } from "class-variance-authority"; import { getUploadedFile } from "@/app/db/surveyDB/schema/surveyDB"; import BookSurveyModal from "@/app/portfolio/[slug]/components/BookSurveyModal"; -import BookingSuccessToast from "@/app/portfolio/[slug]/components/BookingSuccessToast"; +import SuccessToast from "@/app/portfolio/[slug]/components/SuccessToast"; import { PropertyMeta } from "@/app/db/schema/property"; interface ToolbarProps { @@ -179,8 +179,9 @@ export function Toolbar({ )} {/* βœ… Toast */} - setShowToast(false)} message="Survey Request Recieved!" subtext="We'll be in contact soon. πŸŽ‰" diff --git a/src/app/portfolio/[slug]/(portfolio)/reporting/RecommendationsOptions.tsx b/src/app/portfolio/[slug]/(portfolio)/reporting/RecommendationsOptions.tsx index bc4aad3..5d740bc 100644 --- a/src/app/portfolio/[slug]/(portfolio)/reporting/RecommendationsOptions.tsx +++ b/src/app/portfolio/[slug]/(portfolio)/reporting/RecommendationsOptions.tsx @@ -34,6 +34,7 @@ export interface RecommendationsOptionsProps { disabled?: boolean; scenarios: ScenarioSummary[] portfolioId: number + onSuccess: () => void; } interface ScenarioWithPriority { @@ -113,7 +114,8 @@ function SortableScenarioItem({ export function RecommendationsOptions({ disabled = false, scenarios, - portfolioId + portfolioId, + onSuccess }: RecommendationsOptionsProps) { const [isApplying, setIsApplying] = useState(false); const [open, setOpen] = useState(false); @@ -181,6 +183,8 @@ export function RecommendationsOptions({ body: JSON.stringify(payload) }); + onSuccess(); + setIsApplying(false); setOpen(false); }; diff --git a/src/app/portfolio/[slug]/(portfolio)/reporting/ReportingClientArea.tsx b/src/app/portfolio/[slug]/(portfolio)/reporting/ReportingClientArea.tsx index f22ffa7..ee0198d 100644 --- a/src/app/portfolio/[slug]/(portfolio)/reporting/ReportingClientArea.tsx +++ b/src/app/portfolio/[slug]/(portfolio)/reporting/ReportingClientArea.tsx @@ -23,6 +23,7 @@ import type { } from "./types"; import { ReportingFunctionalityButtons } from "./ReportingFunctionalityButtons"; import { RecommendationsOptions } from "./RecommendationsOptions"; +import SuccessToast from "../../components/SuccessToast"; interface ReportingClientAreaProps { baseline: BaselineMetrics; @@ -88,6 +89,7 @@ export function ReportingClientArea({ const [measuresOpen, setMeasuresOpen] = useState(false); const [appliedHideNonCompliant, setAppliedHideNonCompliant] = useState(false); + const [showToast, setShowToast] = useState(false); const drawerOpen = Boolean(selectedScenarioId); @@ -272,6 +274,7 @@ export function ReportingClientArea({ disabled={scenarioBusy} scenarios={scenarios} portfolioId={portfolioId} + onSuccess={() => setShowToast(true)} /> } @@ -346,6 +349,15 @@ export function ReportingClientArea({ data={measuresData ?? null} error={measuresError} /> + + setShowToast(true)} + message="Recommendation process triggered" + subtext="Recommendations might take a few minutes to update" + timeoutMs={6000} + /> ); } diff --git a/src/app/portfolio/[slug]/components/BookingSuccessToast.tsx b/src/app/portfolio/[slug]/components/SuccessToast.tsx similarity index 84% rename from src/app/portfolio/[slug]/components/BookingSuccessToast.tsx rename to src/app/portfolio/[slug]/components/SuccessToast.tsx index 7b9410d..20567a5 100644 --- a/src/app/portfolio/[slug]/components/BookingSuccessToast.tsx +++ b/src/app/portfolio/[slug]/components/SuccessToast.tsx @@ -5,28 +5,32 @@ import { motion, AnimatePresence } from "framer-motion"; import Confetti from "react-confetti"; import { CheckCircle } from "lucide-react"; -interface BookingSuccessToastProps { +interface SuccessToastProps { show: boolean; + showConfetti: boolean; onClose: () => void; - message?: string; - subtext?: string; + message: string; + subtext: string; + timeoutMs?: number; } -export default function BookingSuccessToast({ +export default function SuccessToast({ show, + showConfetti, onClose, - message = "Booking Confirmed!", - subtext = "You’re all set. πŸŽ‰", -}: BookingSuccessToastProps) { + message, + subtext, + timeoutMs = 4000 +}: SuccessToastProps) { const [confetti, setConfetti] = useState(false); useEffect(() => { if (show) { - setConfetti(true); + setConfetti(showConfetti); const timer = setTimeout(() => { setConfetti(false); onClose(); - }, 4000); + }, timeoutMs); return () => clearTimeout(timer); } }, [show, onClose]);