Skip to content

Commit 7c26265

Browse files
authored
bug-fix: Change feedback process to submit on feedback icon click (#936)
Fixes: [AC-1071](https://sendbird.atlassian.net/browse/AC-1071) ### Changelogs - Changed behaivour of the feedback process: - old: On feedback icon button click -> open feedback form/menu - new: On feedback icon button click -> submit feedback -> open feedback form/menu [AC-1071]: https://sendbird.atlassian.net/browse/AC-1071?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ
1 parent 21065e3 commit 7c26265

File tree

2 files changed

+50
-36
lines changed

2 files changed

+50
-36
lines changed

src/modules/Channel/components/MessageFeedbackModal/index.tsx

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ import { FeedbackRating } from '@sendbird/chat/message';
1111
import { useKeyDown } from '../../../../hooks/useKeyDown/useKeyDown';
1212

1313
export interface MessageFeedbackModalProps {
14-
selectedFeedback: FeedbackRating;
14+
selectedFeedback: FeedbackRating | undefined;
1515
message: CoreMessageType;
1616
onClose?: () => void;
17-
onSubmit?: (comment: string) => void;
18-
onUpdate?: (comment: string) => void;
17+
onSubmit?: (selectedFeedback: FeedbackRating, comment: string) => void;
18+
onUpdate?: (selectedFeedback: FeedbackRating, comment: string) => void;
1919
onRemove?: () => void;
2020
}
2121

@@ -33,17 +33,19 @@ export default function MessageFeedbackModal(props: MessageFeedbackModalProps):
3333
const { isMobile } = useMediaQueryContext();
3434

3535
const isEdit = message?.myFeedback && selectedFeedback === message.myFeedback.rating;
36+
const hasComment = message?.myFeedback?.comment;
37+
3638
const onSubmitWrapper = () => {
3739
if (!selectedFeedback) return;
3840
const comment = inputRef.current.value ?? '';
3941
if (isEdit) {
4042
if (comment !== message.myFeedback.comment) {
41-
onUpdate?.(comment);
43+
onUpdate?.(selectedFeedback, comment);
4244
} else {
4345
onClose?.();
4446
}
4547
} else if (!message.myFeedback) {
46-
onSubmit?.(comment);
48+
onSubmit?.(selectedFeedback, comment);
4749
}
4850
};
4951

@@ -97,7 +99,7 @@ export default function MessageFeedbackModal(props: MessageFeedbackModalProps):
9799
</Button>
98100
<Button onClick={() => onSubmitWrapper()}>
99101
<Label type={LabelTypography.BUTTON_3} color={LabelColors.ONCONTENT_1}>
100-
{ isEdit ? stringSet.BUTTON__SAVE : stringSet.BUTTON__SUBMIT }
102+
{ hasComment ? stringSet.BUTTON__SAVE : stringSet.BUTTON__SUBMIT }
101103
</Label>
102104
</Button>
103105
</div>

src/ui/MessageContent/index.tsx

Lines changed: 42 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,6 @@ export default function MessageContent(props: MessageContentProps): ReactElement
139139
const [mouseHover, setMouseHover] = useState(false);
140140
const [supposedHover, setSupposedHover] = useState(false);
141141
// Feedback states
142-
const [selectedFeedback, setSelectedFeedback] = useState<FeedbackRating>(null);
143142
const [showFeedbackOptionsMenu, setShowFeedbackOptionsMenu] = useState(false);
144143
const [showFeedbackModal, setShowFeedbackModal] = useState(false);
145144
const [feedbackFailedText, setFeedbackFailedText] = useState('');
@@ -171,10 +170,17 @@ export default function MessageContent(props: MessageContentProps): ReactElement
171170
const feedbackMessageClassName = isFeedbackEnabled ? 'sendbird-message-content__feedback' : '';
172171

173172
const onCloseFeedbackForm = () => {
174-
setSelectedFeedback(null);
175173
setShowFeedbackModal(false);
176174
};
177175

176+
const openFeedbackFormOrMenu = () => {
177+
if (isMobile) {
178+
setShowFeedbackOptionsMenu(true);
179+
} else {
180+
setShowFeedbackModal(true);
181+
}
182+
};
183+
178184
// onMouseDown: (e: React.MouseEvent<T>) => void;
179185
// onTouchStart: (e: React.TouchEvent<T>) => void;
180186
// onMouseUp: (e: React.MouseEvent<T>) => void;
@@ -339,12 +345,19 @@ export default function MessageContent(props: MessageContentProps): ReactElement
339345
>
340346
<FeedbackIconButton
341347
isSelected={message?.myFeedback?.rating === FeedbackRating.GOOD}
342-
onClick={() => {
343-
setSelectedFeedback(FeedbackRating.GOOD);
344-
if (isMobile && message?.myFeedback?.rating === FeedbackRating.GOOD) {
345-
setShowFeedbackOptionsMenu(true);
348+
onClick={async () => {
349+
if (!message?.myFeedback?.rating) {
350+
try {
351+
await message.submitFeedback({
352+
rating: FeedbackRating.GOOD,
353+
});
354+
openFeedbackFormOrMenu();
355+
} catch (error) {
356+
config?.logger?.error?.('Channel: Submit feedback failed.', error);
357+
setFeedbackFailedText(stringSet.FEEDBACK_FAILED_SUBMIT);
358+
}
346359
} else {
347-
setShowFeedbackModal(true);
360+
openFeedbackFormOrMenu();
348361
}
349362
}}
350363
disabled={message?.myFeedback && message.myFeedback.rating !== FeedbackRating.GOOD}
@@ -357,12 +370,19 @@ export default function MessageContent(props: MessageContentProps): ReactElement
357370
</FeedbackIconButton>
358371
<FeedbackIconButton
359372
isSelected={message?.myFeedback?.rating === FeedbackRating.BAD}
360-
onClick={() => {
361-
setSelectedFeedback(FeedbackRating.BAD);
362-
if (isMobile && message?.myFeedback?.rating === FeedbackRating.BAD) {
363-
setShowFeedbackOptionsMenu(true);
373+
onClick={async () => {
374+
if (!message?.myFeedback?.rating) {
375+
try {
376+
await message.submitFeedback({
377+
rating: FeedbackRating.BAD,
378+
});
379+
openFeedbackFormOrMenu();
380+
} catch (error) {
381+
config?.logger?.error?.('Channel: Submit feedback failed.', error);
382+
setFeedbackFailedText(stringSet.FEEDBACK_FAILED_SUBMIT);
383+
}
364384
} else {
365-
setShowFeedbackModal(true);
385+
openFeedbackFormOrMenu();
366386
}
367387
}}
368388
disabled={message?.myFeedback && message.myFeedback.rating !== FeedbackRating.BAD}
@@ -465,7 +485,7 @@ export default function MessageContent(props: MessageContentProps): ReactElement
465485
)
466486
}
467487
{
468-
showFeedbackOptionsMenu && (
488+
message?.myFeedback?.rating && showFeedbackOptionsMenu && (
469489
<MobileFeedbackMenu
470490
hideMenu={() => {
471491
setShowFeedbackOptionsMenu(false);
@@ -475,32 +495,24 @@ export default function MessageContent(props: MessageContentProps): ReactElement
475495
setShowFeedbackModal(true);
476496
}}
477497
onRemoveFeedback={async () => {
478-
await message.deleteFeedback(message.myFeedback.id);
479-
setSelectedFeedback(null);
498+
try {
499+
await message.deleteFeedback(message.myFeedback.id);
500+
} catch (error) {
501+
config?.logger?.error?.('Channel: Delete feedback failed.', error);
502+
setFeedbackFailedText(stringSet.FEEDBACK_FAILED_DELETE);
503+
}
480504
setShowFeedbackOptionsMenu(false);
481505
}}
482506
/>
483507
)
484508
}
485509
{/* Feedback modal */}
486510
{
487-
showFeedbackModal && (
511+
message?.myFeedback?.rating && showFeedbackModal && (
488512
<MessageFeedbackModal
489-
selectedFeedback={selectedFeedback}
513+
selectedFeedback={message.myFeedback.rating}
490514
message={message}
491-
onSubmit={async (comment: string) => {
492-
try {
493-
await message.submitFeedback({
494-
rating: selectedFeedback,
495-
comment,
496-
});
497-
} catch (error) {
498-
config?.logger?.error?.('Channel: Submit feedback failed.', error);
499-
setFeedbackFailedText(stringSet.FEEDBACK_FAILED_SUBMIT);
500-
}
501-
onCloseFeedbackForm();
502-
}}
503-
onUpdate={async (comment: string) => {
515+
onUpdate={async (selectedFeedback: FeedbackRating, comment: string) => {
504516
const newFeedback: Feedback = new Feedback({
505517
id: message.myFeedback.id,
506518
rating: selectedFeedback,

0 commit comments

Comments
 (0)