"use client"; import { useId, useState } from "react"; import { MessageSquarePlus, X } from "lucide-react"; import { cn } from "@/lib/utils"; import { trackBetaEvent } from "@/lib/beta/betaAnalytics"; import { BETA_FEEDBACK_KIND_LABELS, MAX_FEEDBACK_MESSAGE_LENGTH, submitBetaFeedback, type BetaFeedbackKind, type BetaFeedbackRating, } from "@/lib/beta/betaFeedback"; type BetaFeedbackButtonProps = { route?: string; subject?: string; chapterTitle?: string; missionTitle?: string; stepLabel?: string; className?: string; }; const KIND_ORDER: BetaFeedbackKind[] = [ "helped_understand", "still_confusing", "wrong_or_doubtful", "too_long", "need_more_examples", "class_confusing", "bug", "content_issue", "ui_issue", "too_hard", "too_easy", "liked", "other", ]; export function BetaFeedbackButton({ route, subject, chapterTitle, missionTitle, stepLabel, className, }: BetaFeedbackButtonProps) { const [open, setOpen] = useState(false); const [kind, setKind] = useState("class_confusing"); const [rating, setRating] = useState(null); const [message, setMessage] = useState(""); const [submitted, setSubmitted] = useState(false); const [error, setError] = useState(null); const titleId = useId(); const messageId = useId(); const context = { route, subject, chapterTitle, missionTitle, stepLabel }; function openPanel() { setOpen(true); setSubmitted(false); setError(null); trackBetaEvent({ name: "feedback_opened", ...context }); } function closePanel() { setOpen(false); } function handleSubmit() { const result = submitBetaFeedback({ kind, rating: rating ?? undefined, message, ...context }); if (!result.ok) { setError(result.error === "empty_message" ? "Please write a short message first." : "Storage unavailable on this device."); return; } setSubmitted(true); setMessage(""); setRating(null); } return (
{open ? (

Beta feedback

Tell us what confused you or what broke.

{submitted ? (

Thanks! Feedback saved.

Stored on this device for beta testing.

) : (
Rating (optional) {([1, 2, 3, 4, 5] as BetaFeedbackRating[]).map((value) => ( ))}