packages/article-feedback/widgets/feedback-form/app.tsx (125 lines of code) (raw):

import React, {memo, useState} from 'react'; import type {FC} from 'react'; import {ControlsHeightContext, ControlsHeight} from '@jetbrains/ring-ui-built/components/global/controls-height'; import Button from '@jetbrains/ring-ui-built/components/button/button'; import ButtonSet from '@jetbrains/ring-ui-built/components/button-set/button-set'; import Input, {Size} from '@jetbrains/ring-ui-built/components/input/input'; import Link from '@jetbrains/ring-ui-built/components/link/link'; import API from '../api'; const host = await YTApp.register(); const api = new API(host); const user = await api.getUser(); const AppComponent: FC = () => { const [liked, setLiked] = useState(user.liked); const [leftMessage, setLeftMessage] = useState(user.leftMessage); const [message, setMessage] = useState(''); const [userName, setUserName] = useState(''); const [userEmail, setUserEmail] = useState(''); const isDisabled = React.useMemo(() => { return !message.trim() || (user.isGuest && !userName); }, [message, userName]); const onLike = async () => { if (user.isGuest) { await api.postGuestLike(); } else { await api.postLike(); } setLiked(true); }; const onDislike = async () => { setLiked(false); }; const onChangeMyMind = async () => { setLiked(undefined); setLeftMessage(false); setMessage(''); setUserName(''); setUserEmail(''); }; const onSend = async () => { if (isDisabled) { return; } if (user.isGuest) { await api.postGuestDislike(message, userName, userEmail); } else { await api.postDislike(message); } setLeftMessage(true); }; const onMessageChange = async ( event: React.ChangeEvent<HTMLTextAreaElement> ) => { setMessage(event.target.value); }; const onUserNameChange = async ( event: React.ChangeEvent<HTMLInputElement> ) => { setUserName(event.target.value); }; const onUserEmailChange = async ( event: React.ChangeEvent<HTMLInputElement> ) => { setUserEmail(event.target.value); }; return ( <ControlsHeightContext.Provider value={ControlsHeight.S}> <form className="widget" onSubmit={onSend}> {liked === undefined && ( <> <div data-test="feedback-question">{'Was this article helpful?'}</div> <ButtonSet> <Button onClick={onLike} data-test="yes-button">{'Yes'}</Button> <Button onClick={onDislike} data-test="no-button">{'No'}</Button> </ButtonSet> </> )} {(liked === true || leftMessage) && ( <> <div>{'Thanks for your feedback!'}</div> <Link onClick={onChangeMyMind}>{'I changed my mind'}</Link> </> )} {liked === false && !leftMessage && ( <> <div>{'How can we improve?'}</div> {user.isGuest && ( <> <Input label={'Name'} value={userName} onChange={onUserNameChange} data-test="name-input" /> <Input label={'Email'} value={userEmail} onChange={onUserEmailChange} data-test="email-input" /> </> )} <Input multiline value={message} onChange={onMessageChange} size={Size.L} className="message" placeholder={'Tell us what you think would make this article better'} /> <ButtonSet> <Button disabled={isDisabled} onClick={onSend} data-test="send-button" > {'Submit'} </Button> </ButtonSet> </> )} </form> </ControlsHeightContext.Provider> ); }; export const App = memo(AppComponent);