forked from microsoft/BotFramework-WebChat
-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathActivityFeedback.tsx
More file actions
69 lines (57 loc) · 2.53 KB
/
ActivityFeedback.tsx
File metadata and controls
69 lines (57 loc) · 2.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import classNames from 'classnames';
import React, { memo, useCallback, type FormEventHandler, type KeyboardEventHandler } from 'react';
import { Extract, wrapWith } from 'react-wrap-with';
import { useRefFrom } from 'use-ref-from';
import useStyleSet from '../hooks/useStyleSet';
import FeedbackLoopWithMessage from './private/FeedbackLoopWithMessage';
import FeedbackLoopWithoutMessage from './private/FeedbackLoopWithoutMessage';
import ActivityFeedbackComposer from './providers/ActivityFeedbackComposer';
import useFeedbackText from './providers/useFeedbackText';
import useFocusAction from './providers/useFocusAction';
import useSelectedAction from './providers/useSelectedAction';
import useShouldShowFeedbackForm from './providers/useShouldShowFeedbackForm';
import useSubmitCallback from './providers/useSubmitCallback';
function InternalActivityFeedback() {
const [{ feedbackForm }] = useStyleSet();
const [feedbackText, setFeedbackText] = useFeedbackText();
const [selectedAction, setSelectedAction] = useSelectedAction();
const [shouldShowFeedbackForm] = useShouldShowFeedbackForm();
const focusAction = useFocusAction();
const submit = useSubmitCallback();
const feedbackTextRef = useRefFrom(feedbackText);
const selectedActionRef = useRefFrom(selectedAction);
const handleReset = useCallback<FormEventHandler<HTMLFormElement>>(() => {
focusAction(selectedActionRef.current);
setFeedbackText(undefined);
setSelectedAction(undefined);
}, [focusAction, selectedActionRef, setFeedbackText, setSelectedAction]);
const handleSubmit = useCallback<FormEventHandler<HTMLFormElement>>(
event => {
event.preventDefault();
submit(selectedActionRef.current, feedbackTextRef.current);
},
[feedbackTextRef, selectedActionRef, submit]
);
const handleKeyDown = useCallback<KeyboardEventHandler<HTMLFormElement>>(
event => {
if (event.key === 'Escape' && selectedActionRef.current) {
event.stopPropagation();
event.currentTarget.reset();
}
},
[selectedActionRef]
);
return (
<form
className={classNames('webchat__feedback-form-real', feedbackForm + '')}
onKeyDown={handleKeyDown}
onReset={handleReset}
onSubmit={handleSubmit}
>
{shouldShowFeedbackForm ? <FeedbackLoopWithMessage /> : <FeedbackLoopWithoutMessage />}
</form>
);
}
const ActivityFeedback = wrapWith(ActivityFeedbackComposer, { activity: Extract })(InternalActivityFeedback);
ActivityFeedback.displayName = 'ActivityFeedback';
export default memo(ActivityFeedback);