import { Alert, Autocomplete, Button, Container, Group, Modal, Progress, SegmentedControl, Select, SelectItem, Space, Stack, Text, Textarea, TextInput } from "@mantine/core"; import {useForm} from '@mantine/form'; import React, {useEffect, useLayoutEffect, useState} from "react"; import {useTranslation} from "react-i18next"; import {Feedback} from "./types/feedback"; import ModalTasks from "./ModalTasks"; import axios from "axios"; interface ModalFeedbackProps { config: Feedback.Config, show: boolean onClose: () => void onSubmit: (task: Feedback.Data) => void onRecorder: () => void onScreenshot: () => void screenshot?: Screenshot.Data screenshotError?: string record?: Record.Data uploadProgress?: number uploadProgressTusScreenshot?: number tusUploadedScreenshot: boolean recorderError?: Error types: Array<{ label: string, value: string }> } export default function ModalFeedback({ config, show, onClose, onSubmit, screenshot, screenshotError, onScreenshot, record, onRecorder, uploadProgress, uploadProgressTusScreenshot, tusUploadedScreenshot, recorderError, types }: ModalFeedbackProps) { const {t} = useTranslation('feedbackSupport', {useSuspense: false}) const defaultTypes = [ {label: t('ModalFeedback.types.bug'), value: t('ModalFeedback.types.bug')}, {label: t('ModalFeedback.types.suggestion'), value: t('ModalFeedback.types.suggestion')}, {label: t('ModalFeedback.types.ui'), value: t('ModalFeedback.types.ui')} ] const [feedbackType, setFeedbackType] = useState<'comment' | 'close'>('comment') const [showTasks, setShowTasks] = useState(false) const [task, setTask] = useState() const [assignData, setAssignData] = useState([]) const form = useForm({ initialValues: { assign: '', type: '', title: '', description: '' }, validate: { type: (value) => !value ? t("ModalFeedback.form.errors.type") : null, title: (value) => !value.length ? t("ModalFeedback.form.errors.title") : null, description: (value) => !value.length ? t('ModalFeedback.form.errors.description') : null } }) const loader = ( ) let uploading = false if (uploadProgress !== undefined && uploadProgress > 0) { uploading = true } if (uploadProgressTusScreenshot !== undefined && uploadProgressTusScreenshot > 0 && !tusUploadedScreenshot) { uploading = true } const handleSubmit = (data: Feedback.Data) => { form.reset() setTask(undefined) onSubmit(data) } const handleClose = () => { form.reset() setTask(undefined) onClose() } let autocompleteData: string[] = [] const title = form.values.title if (title.trim().length > 0 && title.includes('#') && title[title.length - 1] === '#') { const stringStart = title.substring(0, title.length - 1) autocompleteData = [stringStart + '#assign:', stringStart + '#comment:', stringStart + '#close'] } let typeData = defaultTypes if (types.length) { typeData = types } const handleShowTask = () => { form.reset() setTask(undefined) form.setFieldValue('type', '') form.setFieldValue('title', '') setShowTasks(true) } const handleSelectTask = (task: Api.Task | undefined) => { if (task) { setTask(task) setFeedbackType('comment') form.setValues({ type: task.name, title: `#comment:${task.id}` }) } setShowTasks(false) } useEffect(() => { if (task !== undefined) { if (feedbackType === 'comment') { form.setFieldValue('title', `#comment:${task.id}`) } else if (feedbackType === 'close') { form.setValues({ title: `#comment:${task.id} #close`, assign: '' }) } } }, [feedbackType]) useEffect(() => { if ('userRights' in config && config.userRights?.includes('assign')) { axios.get<{ data: { workers: Api.Worker[] } }>(`${config.url}/workers`, { params: { project: config.project }, headers: config.headers || {} }).then((res) => { const data: SelectItem[] = [] res.data.data.workers.forEach((worker) => { data.push({ value: worker.id.toString(), label: worker.fullname }) }) setAssignData(data) }) } }, []) // @ts-ignore return ( <>

{t('ModalFeedback.title')}

{config.hotkey && <> {t('ModalFeedback.shortcutInfo')} } {screenshotError !== undefined && screenshotError === 'failed' && <> {t('ModalFeedback.screenshotError')} } {'userRights' in config && (config.userRights?.includes("comment") || config.userRights?.includes("close")) && <> }
handleSubmit(data))}> {task === undefined && <> }