"use client"; import LoadingSpinner from "@/components/shared/LoadingSpinner"; import { Confetti } from "@formbricks/ui"; import { useEnvironment } from "@/lib/environments/environments"; import { useEnvironmentMutation } from "@/lib/environments/mutateEnvironments"; import { useEvents } from "@/lib/events/events"; import { timeSince } from "@formbricks/lib/time"; import { ArrowDownIcon, CheckIcon, ExclamationTriangleIcon } from "@heroicons/react/24/solid"; import clsx from "clsx"; import Link from "next/link"; import { useEffect, useMemo, useState } from "react"; import { ErrorComponent } from "@formbricks/ui"; interface WidgetStatusIndicatorProps { environmentId: string; type: "large" | "mini"; } export default function WidgetStatusIndicator({ environmentId, type }: WidgetStatusIndicatorProps) { const { events, isLoadingEvents, isErrorEvents } = useEvents(environmentId); const { triggerEnvironmentMutate } = useEnvironmentMutation(environmentId); const { environment, isErrorEnvironment, isLoadingEnvironment } = useEnvironment(environmentId); const [confetti, setConfetti] = useState(false); useEffect(() => { if (!environment?.widgetSetupCompleted && events && events.length > 0) { triggerEnvironmentMutate({ widgetSetupCompleted: true }); } }, [environment, triggerEnvironmentMutate, events]); const stati = { notImplemented: { icon: ArrowDownIcon, color: "slate", title: "Connect Formbricks to your app.", subtitle: "You have not yet connected Formbricks to your app. Follow setup guide.", }, running: { icon: CheckIcon, color: "green", title: "Receiving data.", subtitle: "Last action received:" }, issue: { icon: ExclamationTriangleIcon, color: "amber", title: "There might be an issue.", subtitle: "Last action received:", }, }; const status = useMemo(() => { if (events && events.length > 0) { const lastEvent = events[0]; const currentTime = new Date(); const lastEventTime = new Date(lastEvent.createdAt); const timeDifference = currentTime.getTime() - lastEventTime.getTime(); if (timeDifference <= 24 * 60 * 60 * 1000) { setConfetti(true); return "running"; } else { return "issue"; } } else { return "notImplemented"; } }, [events]); const currentStatus = stati[status]; if (isLoadingEvents || isLoadingEnvironment) { return (
); } if (isErrorEvents || isErrorEnvironment) { return ; } if (type === "large") { return (

{currentStatus.title}

{currentStatus.subtitle}{" "} {status !== "notImplemented" && {timeSince(events[0].createdAt)}}

{confetti && }
); } if (type === "mini") { return (

{currentStatus.subtitle}{" "} {status !== "notImplemented" && {timeSince(events[0].createdAt)}}

); } else { return null; } }