1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-09-24 17:51:14 +02:00
unleash.unleash/frontend/src/component/feedback/FeedbackCES/FeedbackCESForm.tsx
olav 24c11332b5 chore: update MUI to v5 (#923)
* 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
2022-05-02 15:52:41 +02:00

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>
);
};