mirror of
https://github.com/Unleash/unleash.git
synced 2025-09-24 17:51:14 +02:00
* refactor: update mui packages * refactor: run mui codemods * refactor: format files after codemods * refactor: fix broken types * refactor: clean up theme * refactor: fix broken tests * refactor: replace @mui/styles with tss-react * refactor: move breakpoints into classes for tss * refactor: fix crash on missing feature description * refactor: remove void classNames * refactor: adjust styles to new defaults * refactor: remove broken rollout slider e2e test * refactor: fix duplicate e2e testid * refactor: update makeStyles after rebase * refactor: add missing snapshot after rebase * refactor: fix TableCellSortable focus styles * refactor: use 1.4 as the default line-height * refactor: hide webkit search field icons * refactor: fix select box label * refactor: make AutocompleteBox smaller * refactor: make heading smaller * refactor: fix toast close icon color * refactor: update snapshots * refactor: add missing test event awaits * refactor: fix default button line-height
97 lines
3.0 KiB
TypeScript
97 lines
3.0 KiB
TypeScript
import { useStyles } from 'component/feedback/FeedbackCES/FeedbackCESForm.styles';
|
|
import { Button, TextField } from '@mui/material';
|
|
import React, { useState } from 'react';
|
|
import produce from 'immer';
|
|
import useToast from 'hooks/useToast';
|
|
import { IFeedbackCESState } from 'component/feedback/FeedbackCESContext/FeedbackCESContext';
|
|
import { FeedbackCESScore } from 'component/feedback/FeedbackCES/FeedbackCESScore';
|
|
import { sendFeedbackInput } from 'component/feedback/FeedbackCES/sendFeedbackInput';
|
|
|
|
export interface IFeedbackCESFormProps {
|
|
state: IFeedbackCESState;
|
|
onClose: () => void;
|
|
}
|
|
|
|
export interface IFeedbackCESForm {
|
|
score: number;
|
|
comment: string;
|
|
path: string;
|
|
}
|
|
|
|
export const FeedbackCESForm = ({ state, onClose }: IFeedbackCESFormProps) => {
|
|
const [loading, setLoading] = useState(false);
|
|
const { setToastData } = useToast();
|
|
const { classes: styles } = useStyles();
|
|
|
|
const [form, setForm] = useState<Partial<IFeedbackCESForm>>({
|
|
path: state.path,
|
|
});
|
|
|
|
const onCommentChange = (event: React.ChangeEvent<HTMLTextAreaElement>) => {
|
|
setForm(
|
|
produce(draft => {
|
|
draft.comment = event.target.value;
|
|
})
|
|
);
|
|
};
|
|
|
|
const onSubmit = async (event: React.FormEvent) => {
|
|
event.preventDefault();
|
|
|
|
if (loading) {
|
|
return;
|
|
}
|
|
|
|
try {
|
|
setLoading(true);
|
|
await sendFeedbackInput(form);
|
|
setToastData({
|
|
type: 'success',
|
|
title: 'Feedback sent. Thank you!',
|
|
confetti: true,
|
|
});
|
|
onClose();
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
};
|
|
|
|
return (
|
|
<div className={styles.container}>
|
|
<h1 className={styles.title}>Please help us improve</h1>
|
|
<form
|
|
className={styles.form}
|
|
onSubmit={onSubmit}
|
|
aria-live="polite"
|
|
>
|
|
<p className={styles.subtitle}>{state.title}</p>
|
|
<FeedbackCESScore form={form} setForm={setForm} />
|
|
<div hidden={!form.score}>
|
|
<label htmlFor="comment" className={styles.textLabel}>
|
|
{state.text}
|
|
</label>
|
|
<TextField
|
|
value={form.comment ?? ''}
|
|
onChange={onCommentChange}
|
|
multiline
|
|
rows={3}
|
|
variant="outlined"
|
|
fullWidth
|
|
/>
|
|
</div>
|
|
<div className={styles.buttons} hidden={!form.score}>
|
|
<Button
|
|
type="submit"
|
|
color="primary"
|
|
variant="contained"
|
|
className={styles.button}
|
|
disabled={!form.score || loading}
|
|
>
|
|
Send feedback
|
|
</Button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
);
|
|
};
|