/* Copyright 2018-2024 New Vector Ltd. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ import React, { useEffect, useRef, useState, type JSX } from "react"; import QuestionDialog from "./QuestionDialog"; import { _t } from "../../../languageHandler"; import Field from "../elements/Field"; import AccessibleButton from "../elements/AccessibleButton"; import SdkConfig from "../../../SdkConfig"; import Modal from "../../../Modal"; import BugReportDialog from "./BugReportDialog"; import InfoDialog from "./InfoDialog"; import { submitFeedback } from "../../../rageshake/submit-rageshake"; import { useStateToggle } from "../../../hooks/useStateToggle"; import StyledCheckbox from "../elements/StyledCheckbox"; import ExternalLink from "../elements/ExternalLink"; interface IProps { feature?: string; onFinished(): void; } const FeedbackDialog: React.FC = (props: IProps) => { const feedbackRef = useRef(null); const [comment, setComment] = useState(""); const [canContact, toggleCanContact] = useStateToggle(false); useEffect(() => { // autofocus doesn't work on textareas feedbackRef.current?.focus(); }, []); const onDebugLogsLinkClick = (): void => { props.onFinished(); Modal.createDialog(BugReportDialog, {}); }; const hasFeedback = !!SdkConfig.get().bug_report_endpoint_url; const onFinished = (sendFeedback: boolean): void => { if (hasFeedback && sendFeedback) { const label = props.feature ? `${props.feature}-feedback` : "feedback"; submitFeedback(label, comment, canContact); Modal.createDialog(InfoDialog, { title: _t("feedback|sent"), description: _t("bug_reporting|thank_you"), }); } props.onFinished(); }; let feedbackSection: JSX.Element | undefined; if (hasFeedback) { feedbackSection = (

{_t("feedback|comment_label")}

{_t("feedback|platform_username")}

{ setComment(ev.target.value); }} ref={feedbackRef} /> {_t("feedback|may_contact_label")}
); } let bugReports: JSX.Element | undefined; if (hasFeedback) { bugReports = (

{_t( "feedback|pro_type", {}, { debugLogsLink: (sub) => ( {sub} ), }, )}

); } const existingIssuesUrl = SdkConfig.getObject("feedback").get("existing_issues_url"); const newIssueUrl = SdkConfig.getObject("feedback").get("new_issue_url"); return (

{_t("common|report_a_bug")}

{_t( "feedback|existing_issue_link", {}, { existingIssuesLink: (sub) => { return ( {sub} ); }, newIssueLink: (sub) => { return ( {sub} ); }, }, )}

{bugReports}
{feedbackSection} } button={hasFeedback ? _t("feedback|send_feedback_action") : _t("action|go_back")} buttonDisabled={hasFeedback && !comment} onFinished={onFinished} /> ); }; export default FeedbackDialog;