touchstudy-core 0.1.8 → 0.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -38,7 +38,7 @@ var BASE_URL = function () {
38
38
  }();
39
39
  var PUSHER_CONFIG = {
40
40
  cluster: "ap1",
41
- key: "dde049326fbe52b2a749"
41
+ key: "9018c77328885a14150b"
42
42
  };
43
43
  var EXAM_CHANNEL = "presence-exam-channel";
44
44
  var EXAM_STUDENT_CHANNEL = "EXAM-CHANNEL-{examCode}-STUDENT-{studentId}";
@@ -1381,11 +1381,10 @@ var MessageStatus;
1381
1381
  })(MessageStatus || (MessageStatus = {}));
1382
1382
 
1383
1383
  var ChatRightItem = function ChatRightItem(_ref) {
1384
- var content = _ref.content,
1384
+ var id = _ref.id,
1385
+ content = _ref.content,
1385
1386
  createdAt = _ref.createdAt,
1386
1387
  isRead = _ref.isRead,
1387
- _ref$type = _ref.type,
1388
- type = _ref$type === void 0 ? exports.ChatItemType.Default : _ref$type,
1389
1388
  examCode = _ref.examCode,
1390
1389
  isSystemLog = _ref.isSystemLog,
1391
1390
  parentId = _ref.parentId,
@@ -1399,8 +1398,11 @@ var ChatRightItem = function ChatRightItem(_ref) {
1399
1398
  examTitle = _ref.examTitle,
1400
1399
  parentContent = _ref.parentContent,
1401
1400
  status = _ref.status,
1401
+ selectedReplyMessageId = _ref.selectedReplyMessageId,
1402
+ selectedReplyItemRef = _ref.selectedReplyItemRef,
1402
1403
  onAddExamMessage = _ref.onAddExamMessage,
1403
- onReTrySendMessage = _ref.onReTrySendMessage;
1404
+ onReTrySendMessage = _ref.onReTrySendMessage,
1405
+ onGotoParentMessage = _ref.onGotoParentMessage;
1404
1406
  var _useState = React.useState(false),
1405
1407
  isShowTime = _useState[0],
1406
1408
  setShowTime = _useState[1];
@@ -1425,16 +1427,17 @@ var ChatRightItem = function ChatRightItem(_ref) {
1425
1427
  setShowTime(isSystemLog || !!isFirst);
1426
1428
  }, [isFirst, isSystemLog]);
1427
1429
  return React__default.createElement("li", {
1430
+ ref: selectedReplyMessageId === id ? selectedReplyItemRef : undefined,
1428
1431
  className: "px-3 " + (!isLast ? "pb-1" : "pb-3") + " " + (!!examCode ? "border border-top-0 border-info" : "") + " " + (!!examCode && isLast ? "border-bottom-1 mb-3" : "border-bottom-0")
1429
1432
  }, showExamHeader && isFirst && React__default.createElement("div", {
1430
1433
  className: "d-flex bg-info justify-content-between px-3 mb-3 py-1 " + styles$1["list__item__header"]
1431
1434
  }, React__default.createElement(reactRouterDom.Link, {
1432
1435
  to: "" + (actionLink || "/"),
1433
1436
  className: "text-black"
1434
- }, examTitle), !!examId && !!examTitle && React__default.createElement("span", {
1437
+ }, examTitle), !!examId && !!examTitle && !!examCode && React__default.createElement("span", {
1435
1438
  className: "pointer text-black",
1436
1439
  onClick: function onClick() {
1437
- return onAddExamMessage === null || onAddExamMessage === void 0 ? void 0 : onAddExamMessage(examId, examTitle);
1440
+ return onAddExamMessage === null || onAddExamMessage === void 0 ? void 0 : onAddExamMessage(examId, examTitle, examCode);
1438
1441
  }
1439
1442
  }, "Add message to exam")), isSystemLog || !!isFirst ? React__default.createElement("p", {
1440
1443
  className: "mb-0 py-1 px-3 fs-6 text-muted text-center"
@@ -1454,14 +1457,17 @@ var ChatRightItem = function ChatRightItem(_ref) {
1454
1457
  }, React__default.createElement("div", {
1455
1458
  className: "d-flex flex-column align-items-end"
1456
1459
  }, parentId && React__default.createElement("p", {
1457
- className: "opacity-50 mb-0 py-2 px-3 fw-medium pointer " + styles$1["list__item__message"] + " " + styles$1["list__item__message--reply-from-right"] + " text-end bg-primary text-white"
1460
+ className: "px-3 bg-light opacity-50 pointer " + styles$1["list__item__message"] + " " + styles$1["list__item__message--reply-from-right"] + " mb-0 fw-medium " + styles$1["reply-text"],
1461
+ onClick: function onClick() {
1462
+ return onGotoParentMessage === null || onGotoParentMessage === void 0 ? void 0 : onGotoParentMessage(parentId);
1463
+ }
1458
1464
  }, React__default.createElement("b", null, "Reply To:"), " ", parentContent), React__default.createElement("p", {
1459
1465
  className: "mb-0 py-2 px-3 fw-medium pointer " + styles$1["list__item__message"] + " " + (parentId ? styles$1["list__item__message--reply-right"] : "") + " text-end bg-primary text-white",
1460
1466
  onClick: handleShowInfo
1461
1467
  }, content), status !== MessageStatus.Default && React__default.createElement("p", {
1462
1468
  onClick: handleReTrySendMessage,
1463
1469
  className: "fs-6 mb-0 " + (status === MessageStatus.SentError ? "text-danger text-decoration-underline pointer" : "")
1464
- }, status), (type !== exports.ChatItemType.Exam || !examCode) && status === MessageStatus.Default && React__default.createElement(reactstrap.Collapse, {
1470
+ }, status), !isSystemLog && status === MessageStatus.Default && React__default.createElement(reactstrap.Collapse, {
1465
1471
  isOpen: isShowInfo
1466
1472
  }, React__default.createElement("p", {
1467
1473
  className: "mb-0 py-1 px-3 fs-6 text-muted text-end"
@@ -1489,7 +1495,8 @@ var ChatLeftItem = function ChatLeftItem(_ref) {
1489
1495
  onReply = _ref.onReply,
1490
1496
  selectedReplyMessageId = _ref.selectedReplyMessageId,
1491
1497
  onToggleReply = _ref.onToggleReply,
1492
- selectedReplyItemRef = _ref.selectedReplyItemRef;
1498
+ selectedReplyItemRef = _ref.selectedReplyItemRef,
1499
+ onGotoParentMessage = _ref.onGotoParentMessage;
1493
1500
  var _useState = React.useState(false),
1494
1501
  isShowTime = _useState[0],
1495
1502
  setShowTime = _useState[1];
@@ -1517,10 +1524,10 @@ var ChatLeftItem = function ChatLeftItem(_ref) {
1517
1524
  }, React__default.createElement(reactRouterDom.Link, {
1518
1525
  to: "" + (actionLink || "/"),
1519
1526
  className: "text-black"
1520
- }, examTitle), !!examId && !!examTitle && React__default.createElement("span", {
1527
+ }, examTitle), !!examId && !!examTitle && !!examCode && React__default.createElement("span", {
1521
1528
  className: "pointer text-black",
1522
1529
  onClick: function onClick() {
1523
- return onAddExamMessage === null || onAddExamMessage === void 0 ? void 0 : onAddExamMessage(examId, examTitle);
1530
+ return onAddExamMessage === null || onAddExamMessage === void 0 ? void 0 : onAddExamMessage(examId, examTitle, examCode);
1524
1531
  }
1525
1532
  }, "Add message to exam")), isSystemLog || !!isFirst ? React__default.createElement("p", {
1526
1533
  className: "mb-0 py-1 px-3 fs-6 text-muted text-center"
@@ -1545,7 +1552,10 @@ var ChatLeftItem = function ChatLeftItem(_ref) {
1545
1552
  })), React__default.createElement("div", {
1546
1553
  className: "d-flex flex-column"
1547
1554
  }, parentId && React__default.createElement("p", {
1548
- className: "opacity-50 mb-0 py-2 px-3 fw-medium pointer " + styles$1["list__item__message"] + " " + styles$1["list__item__message--reply-from"] + " text-start bg-light"
1555
+ className: "opacity-50 mb-0 px-3 fw-medium pointer " + styles$1["list__item__message"] + " " + styles$1["list__item__message--reply-from"] + " " + styles$1["reply-text"] + " text-start bg-light",
1556
+ onClick: function onClick() {
1557
+ return onGotoParentMessage === null || onGotoParentMessage === void 0 ? void 0 : onGotoParentMessage(parentId);
1558
+ }
1549
1559
  }, React__default.createElement("b", null, "Reply To:"), " ", parentContent), React__default.createElement("p", {
1550
1560
  className: "mb-0 py-2 px-3 fw-medium pointer " + styles$1["list__item__message"] + " " + (parentId ? styles$1["list__item__message--reply"] : "") + " text-start bg-light",
1551
1561
  onClick: handleShowInfo
@@ -1585,6 +1595,11 @@ var ChatList = function ChatList(_ref) {
1585
1595
  var handleToggleReply = function handleToggleReply(id) {
1586
1596
  setSelectedReplyMessageId(id === selectedReplyMessageId ? undefined : id);
1587
1597
  };
1598
+ var handleSelectParentMessage = function handleSelectParentMessage(id) {
1599
+ if (id === selectedReplyMessageId) selectedReplyItemRef.current && selectedReplyItemRef.current.scrollIntoView({
1600
+ behavior: "smooth"
1601
+ });else setSelectedReplyMessageId(id);
1602
+ };
1588
1603
  React.useEffect(function () {
1589
1604
  selectedReplyMessageId && selectedReplyItemRef.current && selectedReplyItemRef.current.scrollIntoView({
1590
1605
  behavior: "smooth"
@@ -1607,7 +1622,8 @@ var ChatList = function ChatList(_ref) {
1607
1622
  selectedReplyMessageId: selectedReplyMessageId,
1608
1623
  onToggleReply: handleToggleReply,
1609
1624
  selectedReplyItemRef: selectedReplyItemRef,
1610
- onReTrySendMessage: onReTrySendMessage
1625
+ onReTrySendMessage: onReTrySendMessage,
1626
+ onGotoParentMessage: handleSelectParentMessage
1611
1627
  }));
1612
1628
  }));
1613
1629
  };
@@ -1722,7 +1738,15 @@ var ChatContainer = function ChatContainer(_ref) {
1722
1738
  var chatHeaderProps = _ref.chatHeaderProps,
1723
1739
  chatListProps = _ref.chatListProps,
1724
1740
  inputProps = _ref.inputProps,
1725
- onRead = _ref.onRead;
1741
+ _ref$scrollOffset = _ref.scrollOffset,
1742
+ scrollOffset = _ref$scrollOffset === void 0 ? 0 : _ref$scrollOffset,
1743
+ _ref$isLoading = _ref.isLoading,
1744
+ isLoading = _ref$isLoading === void 0 ? false : _ref$isLoading,
1745
+ isScrollToEnd = _ref.isScrollToEnd,
1746
+ onRead = _ref.onRead,
1747
+ onReachTop = _ref.onReachTop,
1748
+ onReachBottom = _ref.onReachBottom,
1749
+ onEndScrollToEnd = _ref.onEndScrollToEnd;
1726
1750
  var onReply = chatListProps.onReply,
1727
1751
  onAddExamMessage = chatListProps.onAddExamMessage;
1728
1752
  var onChangeOption = chatHeaderProps.onChangeOption;
@@ -1737,10 +1761,10 @@ var ChatContainer = function ChatContainer(_ref) {
1737
1761
  (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.focus();
1738
1762
  onReply === null || onReply === void 0 ? void 0 : onReply(id, content, examId);
1739
1763
  };
1740
- var handleAddExamMessage = function handleAddExamMessage(examId, examTitle) {
1764
+ var handleAddExamMessage = function handleAddExamMessage(examId, examTitle, examCode) {
1741
1765
  var _inputRef$current2;
1742
1766
  (_inputRef$current2 = inputRef.current) === null || _inputRef$current2 === void 0 ? void 0 : _inputRef$current2.focus();
1743
- onAddExamMessage(examId, examTitle);
1767
+ onAddExamMessage(examId, examTitle, examCode);
1744
1768
  };
1745
1769
  var handleChangeExamOption = function handleChangeExamOption(val) {
1746
1770
  var _inputRef$current3;
@@ -1748,6 +1772,16 @@ var ChatContainer = function ChatContainer(_ref) {
1748
1772
  onChangeOption === null || onChangeOption === void 0 ? void 0 : onChangeOption(val);
1749
1773
  };
1750
1774
  var handleScroll = function handleScroll() {
1775
+ if (listRef.current) {
1776
+ var scrollTop = listRef.current.scrollTop;
1777
+ var scrollHeight = listRef.current.scrollHeight;
1778
+ var clientHeight = listRef.current.clientHeight;
1779
+ if (scrollTop + clientHeight + scrollOffset >= scrollHeight) {
1780
+ onReachBottom === null || onReachBottom === void 0 ? void 0 : onReachBottom();
1781
+ } else if (scrollTop <= scrollOffset) {
1782
+ onReachTop === null || onReachTop === void 0 ? void 0 : onReachTop();
1783
+ }
1784
+ }
1751
1785
  if (scrollRef.current) clearTimeout(scrollRef.current);
1752
1786
  scrollRef.current = setTimeout(function () {
1753
1787
  onRead === null || onRead === void 0 ? void 0 : onRead();
@@ -1757,36 +1791,40 @@ var ChatContainer = function ChatContainer(_ref) {
1757
1791
  if (focusRef.current) clearTimeout(focusRef.current);
1758
1792
  focusRef.current = setTimeout(function () {
1759
1793
  onRead === null || onRead === void 0 ? void 0 : onRead();
1760
- }, 800);
1794
+ }, 300);
1761
1795
  };
1762
1796
  React.useEffect(function () {
1763
- var _listRef$current, _listItemRef$current, _listItemRef$current$;
1797
+ var _listRef$current, _chatListProps$messag, _listRef$current3;
1764
1798
  scrollRef.current && clearTimeout(scrollRef.current);
1765
1799
  addEventTimeout.current && clearTimeout(addEventTimeout.current);
1766
1800
  (_listRef$current = listRef.current) === null || _listRef$current === void 0 ? void 0 : _listRef$current.removeEventListener("scroll", handleScroll);
1767
- (_listItemRef$current = listItemRef.current) === null || _listItemRef$current === void 0 ? void 0 : (_listItemRef$current$ = _listItemRef$current.lastElementChild) === null || _listItemRef$current$ === void 0 ? void 0 : _listItemRef$current$.scrollIntoView({
1768
- behavior: "smooth"
1769
- });
1770
- addEventTimeout.current = setTimeout(function () {
1771
- var _listRef$current2;
1772
- (_listRef$current2 = listRef.current) === null || _listRef$current2 === void 0 ? void 0 : _listRef$current2.addEventListener("scroll", handleScroll);
1773
- }, 800);
1801
+ if (isScrollToEnd && !isLoading && (_chatListProps$messag = chatListProps.messages) !== null && _chatListProps$messag !== void 0 && _chatListProps$messag.length) {
1802
+ var _listItemRef$current, _listItemRef$current$;
1803
+ (_listItemRef$current = listItemRef.current) === null || _listItemRef$current === void 0 ? void 0 : (_listItemRef$current$ = _listItemRef$current.lastElementChild) === null || _listItemRef$current$ === void 0 ? void 0 : _listItemRef$current$.scrollIntoView({
1804
+ behavior: "smooth"
1805
+ });
1806
+ onEndScrollToEnd === null || onEndScrollToEnd === void 0 ? void 0 : onEndScrollToEnd();
1807
+ addEventTimeout.current = setTimeout(function () {
1808
+ var _listRef$current2;
1809
+ (_listRef$current2 = listRef.current) === null || _listRef$current2 === void 0 ? void 0 : _listRef$current2.addEventListener("scroll", handleScroll);
1810
+ }, 800);
1811
+ } else (_listRef$current3 = listRef.current) === null || _listRef$current3 === void 0 ? void 0 : _listRef$current3.addEventListener("scroll", handleScroll);
1774
1812
  return function () {
1775
- var _listRef$current3;
1776
- (_listRef$current3 = listRef.current) === null || _listRef$current3 === void 0 ? void 0 : _listRef$current3.removeEventListener("scroll", handleScroll);
1813
+ var _listRef$current4;
1814
+ (_listRef$current4 = listRef.current) === null || _listRef$current4 === void 0 ? void 0 : _listRef$current4.removeEventListener("scroll", handleScroll);
1777
1815
  scrollRef.current && clearTimeout(scrollRef.current);
1778
1816
  addEventTimeout.current && clearTimeout(addEventTimeout.current);
1779
1817
  };
1780
- }, [listItemRef.current, JSON.stringify(chatListProps.messages)]);
1818
+ }, [JSON.stringify(chatListProps.messages), scrollOffset, isLoading, onEndScrollToEnd, onRead, isScrollToEnd]);
1781
1819
  React.useEffect(function () {
1782
1820
  var _inputRef$current4;
1783
1821
  (_inputRef$current4 = inputRef.current) === null || _inputRef$current4 === void 0 ? void 0 : _inputRef$current4.addEventListener("focus", handleFocus);
1784
1822
  return function () {
1785
1823
  var _inputRef$current5;
1786
1824
  (_inputRef$current5 = inputRef.current) === null || _inputRef$current5 === void 0 ? void 0 : _inputRef$current5.removeEventListener("focus", handleFocus);
1787
- if (focusRef.current) clearTimeout(focusRef.current);
1825
+ focusRef.current && clearTimeout(focusRef.current);
1788
1826
  };
1789
- }, []);
1827
+ }, [onRead]);
1790
1828
  return React__default.createElement("div", {
1791
1829
  className: "d-flex flex-column w-100 h-100 border border-1 border-light rounded-3 shadow-sm"
1792
1830
  }, React__default.createElement("div", null, React__default.createElement(ChatHeader, Object.assign({}, chatHeaderProps, {
@@ -1794,7 +1832,12 @@ var ChatContainer = function ChatContainer(_ref) {
1794
1832
  }))), React__default.createElement("div", {
1795
1833
  ref: listRef,
1796
1834
  className: "flex-grow-1 " + styles$1["body"]
1797
- }, React__default.createElement(ChatList, Object.assign({}, chatListProps, {
1835
+ }, isLoading && React__default.createElement("div", {
1836
+ className: "d-flex justify-content-center"
1837
+ }, React__default.createElement(reactstrap.Spinner, {
1838
+ color: "secondary",
1839
+ className: "my-2"
1840
+ }, "Loading...")), React__default.createElement(ChatList, Object.assign({}, chatListProps, {
1798
1841
  listItemRef: listItemRef,
1799
1842
  onReply: handleReply,
1800
1843
  onAddExamMessage: handleAddExamMessage
@@ -1843,7 +1886,7 @@ var CONVERSATION_DEFAULT_FILTER = {
1843
1886
  };
1844
1887
  var MESSAGE_DEFAULT_FILTER = {
1845
1888
  currentPage: 1,
1846
- pageSize: -1,
1889
+ pageSize: 12,
1847
1890
  textSearch: "",
1848
1891
  sortColumnDirection: OrderBy.DESC,
1849
1892
  sortColumnName: MessageSortBy.CreatedAt
@@ -1903,43 +1946,68 @@ var useMessageList = function useMessageList(userId, getListExamOptions) {
1903
1946
  var _useState2 = React.useState(MESSAGE_DEFAULT_FILTER),
1904
1947
  messageFilter = _useState2[0],
1905
1948
  setMessageFilter = _useState2[1];
1949
+ var _useState3 = React.useState(false),
1950
+ isLoading = _useState3[0],
1951
+ setLoading = _useState3[1];
1906
1952
  var getMessageList = function getMessageList(conversationId, examId) {
1907
1953
  try {
1908
- var filter = _extends({}, messageFilter, {
1909
- examId: !examId ? messageFilter.examId : examId
1910
- });
1911
- return Promise.resolve(getMessagesByConversation(conversationId, filter)).then(function (res) {
1912
- var _res$data$items;
1913
- function _temp(_getListExamOptions) {
1914
- _getListExamOptions;
1915
- }
1916
- setMessages(((_res$data$items = res.data.items) === null || _res$data$items === void 0 ? void 0 : _res$data$items.reverse()) || []);
1917
- return getListExamOptions ? Promise.resolve(!!getListExamOptions && getListExamOptions(userId)).then(_temp) : _temp(!!getListExamOptions && getListExamOptions(userId));
1954
+ var _temp3 = function _temp3() {
1955
+ setLoading(false);
1956
+ };
1957
+ setLoading(true);
1958
+ var _temp2 = _catch(function () {
1959
+ var filter = _extends({}, messageFilter, {
1960
+ examId: !examId ? messageFilter.examId : examId
1961
+ });
1962
+ return Promise.resolve(getMessagesByConversation(conversationId, filter)).then(function (res) {
1963
+ function _temp(_getListExamOptions) {
1964
+ _getListExamOptions;
1965
+ }
1966
+ setMessages(function (state) {
1967
+ var _res$data$items;
1968
+ return [].concat(((_res$data$items = res.data.items) === null || _res$data$items === void 0 ? void 0 : _res$data$items.reverse()) || [], state);
1969
+ });
1970
+ return getListExamOptions ? Promise.resolve(!!getListExamOptions && getListExamOptions(userId)).then(_temp) : _temp(!!getListExamOptions && getListExamOptions(userId));
1971
+ });
1972
+ }, function (error) {
1973
+ console.log({
1974
+ error: error
1975
+ });
1918
1976
  });
1977
+ return Promise.resolve(_temp2 && _temp2.then ? _temp2.then(_temp3) : _temp3(_temp2));
1919
1978
  } catch (e) {
1920
1979
  return Promise.reject(e);
1921
1980
  }
1922
1981
  };
1982
+ var handleLoadMore = function handleLoadMore() {
1983
+ if (isLoading) return;
1984
+ var lastItem = messages[0];
1985
+ if (!lastItem) return;
1986
+ var newFilter = _extends({}, messageFilter, {
1987
+ currentPage: 1,
1988
+ beforeDate: lastItem.createdAt
1989
+ });
1990
+ setMessageFilter(newFilter);
1991
+ return JSON.stringify(newFilter) === JSON.stringify(messageFilter);
1992
+ };
1923
1993
  var handleMarkReadMessage = function handleMarkReadMessage(conversationId, messageId) {
1924
1994
  try {
1925
- var _temp2 = _catch(function () {
1995
+ var _temp4 = _catch(function () {
1926
1996
  return Promise.resolve(apiMarkReadMessage(conversationId, messageId)).then(function () {});
1927
1997
  }, function (error) {
1928
1998
  console.log({
1929
1999
  error: error
1930
2000
  });
1931
2001
  });
1932
- return Promise.resolve(_temp2 && _temp2.then ? _temp2.then(function () {}) : void 0);
2002
+ return Promise.resolve(_temp4 && _temp4.then ? _temp4.then(function () {}) : void 0);
1933
2003
  } catch (e) {
1934
2004
  return Promise.reject(e);
1935
2005
  }
1936
2006
  };
1937
2007
  var resetMessages = function resetMessages() {
2008
+ setMessageFilter(MESSAGE_DEFAULT_FILTER);
1938
2009
  setMessages([]);
1939
2010
  };
1940
- var handleChangeMessageFilter = function handleChangeMessageFilter(filter) {
1941
- setMessageFilter(_extends({}, messageFilter, filter));
1942
- };
1943
2011
  var handleChangeExamId = function handleChangeExamId(value) {
1944
2012
  setMessageFilter(_extends({}, messageFilter, {
1945
2013
  examId: value === null || value === void 0 ? void 0 : value.value,
@@ -1947,14 +2015,15 @@ var useMessageList = function useMessageList(userId, getListExamOptions) {
1947
2015
  }));
1948
2016
  };
1949
2017
  return {
2018
+ isLoading: isLoading,
1950
2019
  messageFilter: messageFilter,
1951
2020
  messages: messages,
1952
2021
  getMessageList: getMessageList,
1953
2022
  setMessages: setMessages,
1954
2023
  resetMessages: resetMessages,
1955
- handleChangeMessageFilter: handleChangeMessageFilter,
1956
2024
  handleChangeExamId: handleChangeExamId,
1957
- handleMarkReadMessage: handleMarkReadMessage
2025
+ handleMarkReadMessage: handleMarkReadMessage,
2026
+ handleLoadMore: handleLoadMore
1958
2027
  };
1959
2028
  };
1960
2029
 
@@ -1970,6 +2039,7 @@ var useChatContainer = function useChatContainer(props) {
1970
2039
  var channel = React.useRef();
1971
2040
  var channelName = React.useRef();
1972
2041
  var loadingRef = React.useRef(false);
2042
+ var firstLoadRef = React.useRef(true);
1973
2043
  var dispatch = reactRedux.useDispatch();
1974
2044
  var roles = reactRedux.useSelector(function (state) {
1975
2045
  var _state$common, _state$common$user;
@@ -1985,16 +2055,26 @@ var useChatContainer = function useChatContainer(props) {
1985
2055
  var _useState3 = React.useState(MessageStatus.Default),
1986
2056
  messageStatus = _useState3[0],
1987
2057
  setMessageStatus = _useState3[1];
2058
+ var _useState4 = React.useState(true),
2059
+ isScrollToEnd = _useState4[0],
2060
+ setScrollToEnd = _useState4[1];
1988
2061
  var _useExamList = useExamList(isStudent),
1989
2062
  exams = _useExamList.exams,
1990
2063
  getListExam = _useExamList.getListExam;
1991
2064
  var _useMessageList = useMessageList(isStudent ? selectedConversation === null || selectedConversation === void 0 ? void 0 : (_selectedConversation = selectedConversation.teacher) === null || _selectedConversation === void 0 ? void 0 : _selectedConversation.id : selectedConversation === null || selectedConversation === void 0 ? void 0 : (_selectedConversation2 = selectedConversation.student) === null || _selectedConversation2 === void 0 ? void 0 : _selectedConversation2.id, !userId ? getListExam : undefined),
2065
+ isLoadingMessages = _useMessageList.isLoading,
1992
2066
  messages = _useMessageList.messages,
1993
2067
  messageFilter = _useMessageList.messageFilter,
1994
2068
  getMessageList = _useMessageList.getMessageList,
1995
2069
  resetMessages = _useMessageList.resetMessages,
1996
2070
  handleChangeExamId = _useMessageList.handleChangeExamId,
1997
- setMessages = _useMessageList.setMessages;
2071
+ setMessages = _useMessageList.setMessages,
2072
+ handleLoadMore = _useMessageList.handleLoadMore;
2073
+ var handleToggleScrollToEnd = function handleToggleScrollToEnd() {
2074
+ setScrollToEnd(function (state) {
2075
+ return !state;
2076
+ });
2077
+ };
1998
2078
  var handleAddMessage = function handleAddMessage() {
1999
2079
  try {
2000
2080
  var _message$content, _message$content$trim;
@@ -2007,6 +2087,7 @@ var useChatContainer = function useChatContainer(props) {
2007
2087
  })) return Promise.resolve();
2008
2088
  loadingRef.current = true;
2009
2089
  if (!(selectedConversation !== null && selectedConversation !== void 0 && selectedConversation.id) || !(message !== null && message !== void 0 && (_message$content = message.content) !== null && _message$content !== void 0 && (_message$content$trim = _message$content.trim()) !== null && _message$content$trim !== void 0 && _message$content$trim.length)) return Promise.resolve();
2090
+ setScrollToEnd(true);
2010
2091
  setMessages(function (state) {
2011
2092
  return [].concat(state, [{
2012
2093
  id: 0,
@@ -2019,7 +2100,7 @@ var useChatContainer = function useChatContainer(props) {
2019
2100
  id: message.examId,
2020
2101
  startTime: moment().format("YYYY-MM-DDTHH:mm:ss"),
2021
2102
  title: message.examTitle || "",
2022
- code: "temp",
2103
+ code: message.examCode || "",
2023
2104
  createdAt: moment().format("YYYY-MM-DDTHH:mm:ss")
2024
2105
  } : undefined,
2025
2106
  isRead: false,
@@ -2059,14 +2140,16 @@ var useChatContainer = function useChatContainer(props) {
2059
2140
  return Promise.reject(e);
2060
2141
  }
2061
2142
  };
2062
- var handleAddExamMessage = function handleAddExamMessage(examId, title) {
2143
+ var handleAddExamMessage = function handleAddExamMessage(examId, title, examCode) {
2063
2144
  setMessage(!!message ? _extends({}, message, {
2064
2145
  examId: examId,
2146
+ examCode: examCode,
2065
2147
  examTitle: title,
2066
2148
  parentId: undefined,
2067
2149
  parentContent: ""
2068
2150
  }) : {
2069
2151
  examId: examId,
2152
+ examCode: examCode,
2070
2153
  content: "",
2071
2154
  examTitle: title,
2072
2155
  parentId: undefined,
@@ -2158,7 +2241,8 @@ var useChatContainer = function useChatContainer(props) {
2158
2241
  return results;
2159
2242
  }, [JSON.stringify(messages), JSON.stringify(message), isStudent, JSON.stringify(selectedConversation), messageFilter.examId, isStudent, userId, messageStatus]);
2160
2243
  var handleNewMessageSent = function handleNewMessageSent(data) {
2161
- if (!messageFilter.examId || messageFilter.examId && data.examId === messageFilter.examId) {
2244
+ if (!messageFilter.examId && !examId || messageFilter.examId && data.examId === messageFilter.examId || examId && examId === data.examId) {
2245
+ setScrollToEnd(true);
2162
2246
  setMessages(function (state) {
2163
2247
  if (state.some(function (i) {
2164
2248
  return i.id === 0;
@@ -2178,6 +2262,11 @@ var useChatContainer = function useChatContainer(props) {
2178
2262
  }));
2179
2263
  });
2180
2264
  };
2265
+ var handleLoadMoreMessages = function handleLoadMoreMessages() {
2266
+ if (handleLoadMore()) {
2267
+ getMessageConversation();
2268
+ }
2269
+ };
2181
2270
  var cleanupPusher = function cleanupPusher() {
2182
2271
  var _pusher$current, _pusher$current2;
2183
2272
  (_pusher$current = pusher.current) === null || _pusher$current === void 0 ? void 0 : _pusher$current.unbind("new-message-event", handleNewMessageSent);
@@ -2203,13 +2292,15 @@ var useChatContainer = function useChatContainer(props) {
2203
2292
  pusher.current.bind("message-read-event", handleMessageMarkRead);
2204
2293
  }
2205
2294
  return cleanupPusher;
2206
- }, [selectedConversation === null || selectedConversation === void 0 ? void 0 : selectedConversation.id, messageFilter.examId]);
2295
+ }, [selectedConversation === null || selectedConversation === void 0 ? void 0 : selectedConversation.id, messageFilter.examId, examId]);
2207
2296
  React.useEffect(function () {
2208
2297
  var getConversation = function getConversation() {
2209
2298
  try {
2210
2299
  var _temp6 = function _temp6() {
2211
2300
  dispatch(setLoading(false));
2212
2301
  };
2302
+ resetMessages();
2303
+ setScrollToEnd(true);
2213
2304
  if ((conversation === null || conversation === void 0 ? void 0 : conversation.id) !== undefined) {
2214
2305
  setSelectedConversation(conversation);
2215
2306
  return Promise.resolve();
@@ -2242,7 +2333,7 @@ var useChatContainer = function useChatContainer(props) {
2242
2333
  };
2243
2334
  getConversation();
2244
2335
  }, [conversation === null || conversation === void 0 ? void 0 : conversation.id, userId]);
2245
- var handleMarkRead = function handleMarkRead() {
2336
+ var handleMarkRead = React.useCallback(function () {
2246
2337
  try {
2247
2338
  if (!(selectedConversation !== null && selectedConversation !== void 0 && selectedConversation.id)) return Promise.resolve();
2248
2339
  var _temp7 = _catch(function () {
@@ -2256,17 +2347,12 @@ var useChatContainer = function useChatContainer(props) {
2256
2347
  } catch (e) {
2257
2348
  return Promise.reject(e);
2258
2349
  }
2259
- };
2350
+ }, [selectedConversation === null || selectedConversation === void 0 ? void 0 : selectedConversation.id]);
2260
2351
  var getMessageConversation = function getMessageConversation() {
2261
2352
  try {
2262
- var _temp12 = function _temp12() {
2263
- dispatch(setLoading(false));
2264
- };
2265
2353
  if (!roles.length) return Promise.resolve();
2266
2354
  if ((selectedConversation === null || selectedConversation === void 0 ? void 0 : selectedConversation.id) === undefined) return Promise.resolve();
2267
- if (messageFilter.currentPage === 1) resetMessages();
2268
- dispatch(setLoading(true));
2269
- var _temp11 = _catch(function () {
2355
+ return Promise.resolve(_catch(function () {
2270
2356
  var _temp10 = function () {
2271
2357
  if (selectedConversation.id === 0) {
2272
2358
  var _userId = isStudent ? selectedConversation.teacher.id : selectedConversation.student.id;
@@ -2281,7 +2367,11 @@ var useChatContainer = function useChatContainer(props) {
2281
2367
  });
2282
2368
  };
2283
2369
  var _temp8 = function () {
2284
- if (messageFilter.currentPage === 1) return Promise.resolve(handleMarkRead()).then(function () {});
2370
+ if (firstLoadRef.current) {
2371
+ return Promise.resolve(handleMarkRead()).then(function () {
2372
+ firstLoadRef.current = false;
2373
+ });
2374
+ }
2285
2375
  }();
2286
2376
  return _temp8 && _temp8.then ? _temp8.then(_temp9) : _temp9(_temp8);
2287
2377
  }
@@ -2289,21 +2379,24 @@ var useChatContainer = function useChatContainer(props) {
2289
2379
  if (_temp10 && _temp10.then) return _temp10.then(function () {});
2290
2380
  }, function () {
2291
2381
  reactToastify.toast.error("Fail to fetch data!");
2292
- });
2293
- return Promise.resolve(_temp11 && _temp11.then ? _temp11.then(_temp12) : _temp12(_temp11));
2382
+ }));
2294
2383
  } catch (e) {
2295
2384
  return Promise.reject(e);
2296
2385
  }
2297
2386
  };
2387
+ var handleConversationChange = function handleConversationChange() {
2388
+ resetMessages();
2389
+ setScrollToEnd(true);
2390
+ };
2298
2391
  React.useEffect(function () {
2299
2392
  getMessageConversation();
2300
- }, [selectedConversation === null || selectedConversation === void 0 ? void 0 : selectedConversation.id, selectedConversation === null || selectedConversation === void 0 ? void 0 : selectedConversation.teacher.id, selectedConversation === null || selectedConversation === void 0 ? void 0 : selectedConversation.student.id, isStudent, roles.length, JSON.stringify(messageFilter), examId]);
2301
- var userName = isStudent ? selectedConversation === null || selectedConversation === void 0 ? void 0 : (_selectedConversation3 = selectedConversation.teacher) === null || _selectedConversation3 === void 0 ? void 0 : _selectedConversation3.displayName : selectedConversation === null || selectedConversation === void 0 ? void 0 : (_selectedConversation4 = selectedConversation.student) === null || _selectedConversation4 === void 0 ? void 0 : _selectedConversation4.displayName;
2302
- var userAvatar = isStudent ? selectedConversation === null || selectedConversation === void 0 ? void 0 : (_selectedConversation5 = selectedConversation.teacher) === null || _selectedConversation5 === void 0 ? void 0 : _selectedConversation5.avatar : selectedConversation === null || selectedConversation === void 0 ? void 0 : (_selectedConversation6 = selectedConversation.student) === null || _selectedConversation6 === void 0 ? void 0 : _selectedConversation6.avatar;
2393
+ }, [JSON.stringify(selectedConversation), JSON.stringify(roles), JSON.stringify(messageFilter), examId]);
2394
+ var userName = (isStudent ? selectedConversation === null || selectedConversation === void 0 ? void 0 : (_selectedConversation3 = selectedConversation.teacher) === null || _selectedConversation3 === void 0 ? void 0 : _selectedConversation3.displayName : selectedConversation === null || selectedConversation === void 0 ? void 0 : (_selectedConversation4 = selectedConversation.student) === null || _selectedConversation4 === void 0 ? void 0 : _selectedConversation4.displayName) || "";
2395
+ var userAvatar = (isStudent ? selectedConversation === null || selectedConversation === void 0 ? void 0 : (_selectedConversation5 = selectedConversation.teacher) === null || _selectedConversation5 === void 0 ? void 0 : _selectedConversation5.avatar : selectedConversation === null || selectedConversation === void 0 ? void 0 : (_selectedConversation6 = selectedConversation.student) === null || _selectedConversation6 === void 0 ? void 0 : _selectedConversation6.avatar) || "";
2303
2396
  return {
2304
2397
  chatHeaderProps: {
2305
- name: userName || "",
2306
- avatar: userAvatar || "",
2398
+ name: userName,
2399
+ avatar: userAvatar,
2307
2400
  options: exams,
2308
2401
  onChangeOption: handleFilterExam
2309
2402
  },
@@ -2321,15 +2414,19 @@ var useChatContainer = function useChatContainer(props) {
2321
2414
  onSubmit: handleAddMessage,
2322
2415
  onClearReply: !messageFilter.examId || message !== null && message !== void 0 && message.parentContent ? handleClearReply : undefined
2323
2416
  },
2417
+ isScrollToEnd: isScrollToEnd,
2418
+ isLoadingMessages: isLoadingMessages,
2324
2419
  exams: exams,
2325
2420
  messageList: messageList,
2326
2421
  selectedConversation: selectedConversation,
2327
2422
  messageStatus: messageStatus,
2328
2423
  messageFilter: messageFilter,
2424
+ handleToggleScrollToEnd: handleToggleScrollToEnd,
2425
+ handleLoadMoreMessages: handleLoadMoreMessages,
2329
2426
  getMessageList: getMessageList,
2330
2427
  handleFilterExam: handleFilterExam,
2331
2428
  setMessage: setMessage,
2332
- resetMessages: resetMessages,
2429
+ resetMessages: handleConversationChange,
2333
2430
  getMessageConversation: getMessageConversation,
2334
2431
  handleMarkRead: handleMarkRead
2335
2432
  };
@@ -2369,8 +2466,8 @@ var useConversationList = function useConversationList() {
2369
2466
  return i.id === val.id;
2370
2467
  });
2371
2468
  if (index > -1 && JSON.stringify(val) !== JSON.stringify(state[index])) {
2372
- return [].concat(state.slice(0, index), [val], state.slice(index + 1));
2373
- } else return [].concat(state, [val]);
2469
+ return [val].concat(state.slice(0, index), state.slice(index + 1));
2470
+ } else return [val].concat(state);
2374
2471
  });
2375
2472
  setSelectedConversation(function (state) {
2376
2473
  if (!state) return val;