|
9 | 9 | MdOutlineAttachFile,
|
10 | 10 | MdOutlineCreate,
|
11 | 11 | MdOutlineSend,
|
| 12 | + MdOutlineErrorOutline, |
12 | 13 | } from 'react-icons/md';
|
13 | 14 | import { Button, Icon, Label, Track } from 'components';
|
14 | 15 | import { ReactComponent as BykLogoWhite } from 'assets/logo-white.svg';
|
@@ -515,23 +516,32 @@ const Chat: FC<ChatProps> = ({
|
515 | 516 | };
|
516 | 517 |
|
517 | 518 | if (responseText !== '') {
|
518 |
| - const res = await postMessageMutation.mutateAsync({ |
519 |
| - message: newMessage, |
520 |
| - editing: editMessage, |
521 |
| - }); |
522 |
| - const message = { ...res.data.response, id: res.data.response.baseId }; |
523 |
| - if (selectedMessage) { |
524 |
| - const index = messagesList.findIndex( |
525 |
| - (m) => m.id === selectedMessage.id |
526 |
| - ); |
527 |
| - const updatedMessages = [...messagesList]; |
528 |
| - updatedMessages[index] = message; |
529 |
| - setMessagesList(updatedMessages); |
530 |
| - } else { |
531 |
| - setMessagesList((oldMessages) => [...oldMessages, message]); |
| 519 | + try { |
| 520 | + const res = await postMessageMutation.mutateAsync({ |
| 521 | + message: newMessage, |
| 522 | + editing: editMessage, |
| 523 | + }); |
| 524 | + const message = { |
| 525 | + ...res.data.response, |
| 526 | + id: res.data.response.baseId, |
| 527 | + }; |
| 528 | + |
| 529 | + if (selectedMessage) { |
| 530 | + const index = messagesList.findIndex( |
| 531 | + (m) => m.id === selectedMessage.id |
| 532 | + ); |
| 533 | + const updatedMessages = [...messagesList]; |
| 534 | + updatedMessages[index] = message; |
| 535 | + setMessagesList(updatedMessages); |
| 536 | + } else { |
| 537 | + setMessagesList((oldMessages) => [...oldMessages, message]); |
| 538 | + } |
| 539 | + } catch (error) { |
| 540 | + setMessagesList((oldMessages) => [...oldMessages, newMessage]); |
| 541 | + } finally { |
| 542 | + setResponseText(''); |
| 543 | + setSelectedMessage(null); |
532 | 544 | }
|
533 |
| - setResponseText(''); |
534 |
| - setSelectedMessage(null); |
535 | 545 | }
|
536 | 546 | };
|
537 | 547 |
|
@@ -566,6 +576,51 @@ const Chat: FC<ChatProps> = ({
|
566 | 576 | }
|
567 | 577 | };
|
568 | 578 |
|
| 579 | + const checkIsMessageEditable = (message: Message): boolean => { |
| 580 | + return ( |
| 581 | + isChatEditingAllowed && |
| 582 | + chat.customerSupportId === userInfo.idCode && |
| 583 | + message.authorId === userInfo.idCode && |
| 584 | + message.id |
| 585 | + ); |
| 586 | + }; |
| 587 | + |
| 588 | + const deleteMessageFromList = (message: Message) => { |
| 589 | + setMessagesList((oldMessages) => { |
| 590 | + const filteredMessages = oldMessages.filter( |
| 591 | + (m) => m.authorTimestamp !== message.authorTimestamp |
| 592 | + ); |
| 593 | + return filteredMessages; |
| 594 | + }); |
| 595 | + }; |
| 596 | + |
| 597 | + const handleRetry = async (message: Message) => { |
| 598 | + deleteMessageFromList(message); |
| 599 | + const retryMessage = { |
| 600 | + ...message, |
| 601 | + authorTimestamp: new Date().toISOString(), |
| 602 | + }; |
| 603 | + |
| 604 | + try { |
| 605 | + const res = await postMessageMutation.mutateAsync({ |
| 606 | + message: retryMessage, |
| 607 | + editing: false, |
| 608 | + }); |
| 609 | + setMessagesList((oldMessages) => { |
| 610 | + const updatedMessages = [ |
| 611 | + ...oldMessages, |
| 612 | + { |
| 613 | + ...res.data.response, |
| 614 | + id: res.data.response.baseId, |
| 615 | + }, |
| 616 | + ]; |
| 617 | + return updatedMessages; |
| 618 | + }); |
| 619 | + } catch (error) { |
| 620 | + setMessagesList((oldMessages) => [...oldMessages, retryMessage]); |
| 621 | + } |
| 622 | + }; |
| 623 | + |
569 | 624 | useQuery<{ config: BotConfig }>({
|
570 | 625 | queryKey: ['configs/bot-config', 'prod'],
|
571 | 626 | onSuccess(data: any) {
|
@@ -634,25 +689,46 @@ const Chat: FC<ChatProps> = ({
|
634 | 689 |
|
635 | 690 | <div className="active-chat__messages">
|
636 | 691 | {group.messages.map((message, i) => (
|
637 |
| - <ChatMessage |
638 |
| - message={message} |
639 |
| - readStatus={messageReadStatusRef} |
640 |
| - key={`${message.id ?? ''}-${i}`} |
641 |
| - onSelect={(m) => { |
642 |
| - if ( |
643 |
| - isChatEditingAllowed && |
644 |
| - chat.customerSupportId === userInfo.idCode && |
645 |
| - message.authorId === userInfo.idCode |
646 |
| - ) |
647 |
| - handleSelectMessage(m); |
648 |
| - }} |
649 |
| - selected={selectedMessage?.id === message.id} |
650 |
| - editableMessage={ |
651 |
| - isChatEditingAllowed && |
652 |
| - chat.customerSupportId === userInfo.idCode && |
653 |
| - message.authorId === userInfo.idCode |
654 |
| - } |
655 |
| - /> |
| 692 | + <div key={`${message.authorTimestamp}-${i}`}> |
| 693 | + <ChatMessage |
| 694 | + message={message} |
| 695 | + readStatus={messageReadStatusRef} |
| 696 | + onSelect={(m) => { |
| 697 | + if (checkIsMessageEditable(message)) |
| 698 | + handleSelectMessage(m); |
| 699 | + }} |
| 700 | + selected={selectedMessage?.id === message.id} |
| 701 | + editableMessage={checkIsMessageEditable(message)} |
| 702 | + /> |
| 703 | + {!message.id && ( |
| 704 | + <div className="active-chat__message-failed-wrapper active-chat__message-failed"> |
| 705 | + <MdOutlineErrorOutline fontSize={22} /> |
| 706 | + <div className="active-chat__message-failed-content"> |
| 707 | + <span> |
| 708 | + {t('chat.active.messageSendingFailed')} |
| 709 | + </span> |
| 710 | + <div className="active-chat__message-failed-buttons"> |
| 711 | + <Button |
| 712 | + appearance="text" |
| 713 | + className="active-chat__message-failed" |
| 714 | + onClick={() => handleRetry(message)} |
| 715 | + > |
| 716 | + <strong>{t('chat.active.sendAgain')}</strong> |
| 717 | + </Button> |
| 718 | + <Button |
| 719 | + appearance="text" |
| 720 | + className="active-chat__message-failed" |
| 721 | + onClick={() => { |
| 722 | + deleteMessageFromList(message); |
| 723 | + }} |
| 724 | + > |
| 725 | + <strong>{t('global.delete')}</strong> |
| 726 | + </Button> |
| 727 | + </div> |
| 728 | + </div> |
| 729 | + </div> |
| 730 | + )} |
| 731 | + </div> |
656 | 732 | ))}
|
657 | 733 | </div>
|
658 | 734 | </>
|
|
0 commit comments