touchstudy-core 0.1.192 → 0.1.193

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.
@@ -16,9 +16,9 @@ import React__default, { useState, useEffect, Fragment as Fragment$1, useRef, us
16
16
  import { useTheme, Container, Typography, Stack, List, ListItem, FormGroup, FormControlLabel, Checkbox, Button, Box, Dialog, DialogTitle, IconButton, useMediaQuery, DialogContent, TextField, DialogActions, styled, FormLabel, Pagination, Paper, InputBase, Tooltip, tooltipClasses, Grid, ClickAwayListener, CircularProgress, FormControl, RadioGroup, Radio, Accordion, AccordionSummary, AccordionDetails, InputAdornment, Card as Card$1, Avatar, Table, TableHead, TableRow, TableCell, TableBody, Divider, Skeleton, Tabs, Tab, Drawer, TableContainer, tableCellClasses, Popover, Switch, InputLabel, Chip, ListItemButton, ListItemAvatar, ListItemText, Badge, CardMedia as CardMedia$1, MenuList } from '@mui/material';
17
17
  import moment from 'moment';
18
18
  export { default as moment } from 'moment';
19
- import { FaSave, FaCaretDown, FaTimes, FaTrash, FaSortUp, FaSortDown, FaPlusCircle, FaEye, FaPlus, FaCalendar, FaUser, FaBookOpen, FaUpload, FaCheckCircle, FaShare, FaExchangeAlt, FaPencilAlt, FaBell } from 'react-icons/fa';
19
+ import { FaSave, FaCaretDown, FaTrash, FaTimes, FaSortUp, FaSortDown, FaPlusCircle, FaEye, FaPlus, FaCalendar, FaUser, FaBookOpen, FaUpload, FaCheckCircle, FaShare, FaExchangeAlt, FaPencilAlt, FaBell } from 'react-icons/fa';
20
20
  import { IoMdArrowBack, IoIosAdd, IoMdSync, IoIosAlert, IoIosArrowDown, IoIosSearch, IoIosArrowUp, IoMdAdd } from 'react-icons/io';
21
- import { IoClose, IoSearch, IoCloseOutline, IoTime, IoChatbubbleEllipsesSharp, IoPrint, IoChevronDown, IoCheckmarkCircle, IoChevronUpOutline, IoChevronDownOutline, IoReceiptSharp, IoBook, IoWarning, IoCalendarClear, IoPerson, IoInformationCircle, IoTrash, IoAddCircle, IoCheckmark, IoCloseCircle, IoLogOut } from 'react-icons/io5';
21
+ import { IoClose, IoSearch, IoTime, IoChatbubbleEllipsesSharp, IoPrint, IoChevronDown, IoCheckmarkCircle, IoChevronUpOutline, IoChevronDownOutline, IoReceiptSharp, IoBook, IoWarning, IoCalendarClear, IoPerson, IoInformationCircle, IoTrash, IoAddCircle, IoCheckmark, IoCloseCircle, IoLogOut } from 'react-icons/io5';
22
22
  import _$a from 'lodash';
23
23
  import { useSelector, useDispatch } from 'react-redux';
24
24
  import axios from 'axios';
@@ -1580,6 +1580,7 @@ var recent_class_exams = "최근 수업 시험";
1580
1580
  var there_are_no_problems_you_were_working_on = "풀던 문제가 없습니다.";
1581
1581
  var incomplete_exam = "미참가";
1582
1582
  var completed_exam = "참가";
1583
+ var failed_to_send_the_image_error = "이미지를 보내지 못했습니다: {{ message }}";
1583
1584
  var lang_ko = {
1584
1585
  problem_solving: problem_solving,
1585
1586
  my_story: my_story,
@@ -2787,7 +2788,8 @@ var lang_ko = {
2787
2788
  recent_class_exams: recent_class_exams,
2788
2789
  there_are_no_problems_you_were_working_on: there_are_no_problems_you_were_working_on,
2789
2790
  incomplete_exam: incomplete_exam,
2790
- completed_exam: completed_exam
2791
+ completed_exam: completed_exam,
2792
+ failed_to_send_the_image_error: failed_to_send_the_image_error
2791
2793
  };
2792
2794
 
2793
2795
  var problem_solving$1 = "Problem Solving";
@@ -4022,6 +4024,7 @@ var recent_class_exams$1 = "Recent Class Exams";
4022
4024
  var there_are_no_problems_you_were_working_on$1 = "There are no problems you were working on";
4023
4025
  var incomplete_exam$1 = "Incomplete";
4024
4026
  var completed_exam$1 = "Completed";
4027
+ var failed_to_send_the_image_error$1 = "Failed to send the image: {{ message }}";
4025
4028
  var lang_en = {
4026
4029
  problem_solving: problem_solving$1,
4027
4030
  my_story: my_story$1,
@@ -5231,7 +5234,8 @@ var lang_en = {
5231
5234
  recent_class_exams: recent_class_exams$1,
5232
5235
  there_are_no_problems_you_were_working_on: there_are_no_problems_you_were_working_on$1,
5233
5236
  incomplete_exam: incomplete_exam$1,
5234
- completed_exam: completed_exam$1
5237
+ completed_exam: completed_exam$1,
5238
+ failed_to_send_the_image_error: failed_to_send_the_image_error$1
5235
5239
  };
5236
5240
 
5237
5241
  i18n.use(initReactI18next).init({
@@ -7362,15 +7366,18 @@ var useVirtualList = function useVirtualList(defaultFilter, getItemsApi) {
7362
7366
  var _useState2 = useState(0),
7363
7367
  totalPages = _useState2[0],
7364
7368
  setTotalPages = _useState2[1];
7365
- var _useState3 = useState(),
7366
- selectedItem = _useState3[0],
7367
- setSelectedItem = _useState3[1];
7368
- var _useState4 = useState(false),
7369
- isLoading = _useState4[0],
7370
- setLoading = _useState4[1];
7371
- var _useState5 = useState(),
7372
- filter = _useState5[0],
7373
- setFilter = _useState5[1];
7369
+ var _useState3 = useState(0),
7370
+ totalItems = _useState3[0],
7371
+ setTotalItems = _useState3[1];
7372
+ var _useState4 = useState(),
7373
+ selectedItem = _useState4[0],
7374
+ setSelectedItem = _useState4[1];
7375
+ var _useState5 = useState(false),
7376
+ isLoading = _useState5[0],
7377
+ setLoading = _useState5[1];
7378
+ var _useState6 = useState(),
7379
+ filter = _useState6[0],
7380
+ setFilter = _useState6[1];
7374
7381
  var handleChangeSelectedItem = function handleChangeSelectedItem(data) {
7375
7382
  setSelectedItem(data);
7376
7383
  };
@@ -7389,6 +7396,7 @@ var useVirtualList = function useVirtualList(defaultFilter, getItemsApi) {
7389
7396
  return Promise.resolve(getItemsApi(filter)).then(function (res) {
7390
7397
  var responseData = res.data;
7391
7398
  setTotalPages((responseData === null || responseData === void 0 ? void 0 : responseData.totalPages) || 0);
7399
+ setTotalItems((responseData === null || responseData === void 0 ? void 0 : responseData.totalItems) || 0);
7392
7400
  var responseItems = (responseData === null || responseData === void 0 ? void 0 : responseData.items) || [];
7393
7401
  var results = responseItems;
7394
7402
  if (filter !== null && filter !== void 0 && filter.currentPage && filter.currentPage > 1) {
@@ -7405,16 +7413,13 @@ var useVirtualList = function useVirtualList(defaultFilter, getItemsApi) {
7405
7413
  }
7406
7414
  };
7407
7415
  var handleLoadMore = useCallback(function () {
7408
- if (!filter || !filter.currentPage || filter.currentPage >= totalPages) {
7409
- return;
7410
- }
7416
+ if (isLoading) return;
7411
7417
  setFilter(function (state) {
7412
- var _filter$currentPage;
7413
- return !state ? state : _extends({}, state, {
7414
- currentPage: ((_filter$currentPage = filter.currentPage) != null ? _filter$currentPage : 0) + 1
7418
+ return !state || state.currentPage === undefined || state.currentPage >= totalPages ? state : _extends({}, state, {
7419
+ currentPage: state.currentPage + 1
7415
7420
  });
7416
7421
  });
7417
- }, [filter === null || filter === void 0 ? void 0 : filter.currentPage, totalPages]);
7422
+ }, [totalPages, isLoading]);
7418
7423
  var handleItemAdded = function handleItemAdded(item) {
7419
7424
  var results = [].concat(_$a.uniqBy([item].concat(items), "id"));
7420
7425
  setItems(results);
@@ -7431,7 +7436,13 @@ var useVirtualList = function useVirtualList(defaultFilter, getItemsApi) {
7431
7436
  var handleChangeFilter = function handleChangeFilter(newFilter) {
7432
7437
  setFilter(newFilter);
7433
7438
  };
7439
+ var resetData = function resetData() {
7440
+ setTotalPages(0);
7441
+ setTotalItems(0);
7442
+ setItems([]);
7443
+ };
7434
7444
  useEffect(function () {
7445
+ resetData();
7435
7446
  setFilter(function (state) {
7436
7447
  if (JSON.stringify(state) == JSON.stringify(defaultFilter)) getItems();
7437
7448
  return defaultFilter;
@@ -7446,6 +7457,8 @@ var useVirtualList = function useVirtualList(defaultFilter, getItemsApi) {
7446
7457
  selectedItem: selectedItem,
7447
7458
  items: items,
7448
7459
  isLoading: isLoading,
7460
+ totalItems: totalItems,
7461
+ resetData: resetData,
7449
7462
  handleChangeFilter: handleChangeFilter,
7450
7463
  setItems: setItems,
7451
7464
  handleChangeSelectedItem: handleChangeSelectedItem,
@@ -9649,24 +9662,27 @@ var InputChat = function InputChat(_ref) {
9649
9662
  width: "fit-content"
9650
9663
  }
9651
9664
  }, React__default.createElement("img", {
9652
- src: selectedFile === null || selectedFile === void 0 ? void 0 : selectedFile.content,
9665
+ src: selectedFile,
9653
9666
  style: {
9654
9667
  height: "100px",
9655
9668
  objectFit: "contain",
9656
9669
  objectPosition: "center"
9657
9670
  }
9658
- }), React__default.createElement("div", {
9671
+ }), React__default.createElement(IconButton, {
9672
+ size: "small",
9673
+ color: "error",
9659
9674
  style: {
9660
9675
  position: "absolute",
9661
9676
  right: 0,
9662
9677
  top: 0,
9663
- cursor: "pointer"
9678
+ padding: "8px",
9679
+ cursor: "pointer",
9680
+ background: grey[100]
9664
9681
  },
9665
9682
  onClick: handleDeleteSelectedImage
9666
- }, React__default.createElement(IoCloseOutline, {
9667
- color: "#fff",
9668
- size: 30
9669
- }))), React__default.createElement(TinyChatEditor, {
9683
+ }, React__default.createElement(FaTrash, {
9684
+ size: 16
9685
+ }))), !selectedFile && React__default.createElement(TinyChatEditor, {
9670
9686
  initValue: text,
9671
9687
  onChange: onChangeInput,
9672
9688
  disabled: isCompleted
@@ -10367,14 +10383,17 @@ var useChatContainer = function useChatContainer(props) {
10367
10383
  selectedConversation = _useState[0],
10368
10384
  setSelectedConversation = _useState[1];
10369
10385
  var _useState2 = useState(),
10370
- selectedFile = _useState2[0],
10371
- setSelectedFile = _useState2[1];
10372
- var _useState3 = useState(),
10373
- message = _useState3[0],
10374
- setMessage = _useState3[1];
10375
- var _useState4 = useState(true),
10376
- isScrollToEnd = _useState4[0],
10377
- setScrollToEnd = _useState4[1];
10386
+ file = _useState2[0],
10387
+ setFile = _useState2[1];
10388
+ var _useState3 = useState(null),
10389
+ backgroundImage = _useState3[0],
10390
+ setBackgroundImage = _useState3[1];
10391
+ var _useState4 = useState(),
10392
+ message = _useState4[0],
10393
+ setMessage = _useState4[1];
10394
+ var _useState5 = useState(true),
10395
+ isScrollToEnd = _useState5[0],
10396
+ setScrollToEnd = _useState5[1];
10378
10397
  var isAdmin = roles === null || roles === void 0 ? void 0 : roles.includes(Role.Admin);
10379
10398
  var _useMessageList = useMessageList({
10380
10399
  student: student
@@ -10397,34 +10416,39 @@ var useChatContainer = function useChatContainer(props) {
10397
10416
  };
10398
10417
  var handleAddMessage = function handleAddMessage() {
10399
10418
  try {
10400
- var _temp6 = function _temp6() {
10419
+ var _temp3 = function _temp3(_result2) {
10420
+ if (_exit) return _result2;
10401
10421
  loadingRef.current = false;
10402
10422
  };
10423
+ var _exit = false;
10403
10424
  if (loadingRef.current) return Promise.resolve();
10404
10425
  loadingRef.current = true;
10405
10426
  if (!(selectedConversation !== null && selectedConversation !== void 0 && selectedConversation.id)) return Promise.resolve();
10406
10427
  setScrollToEnd(true);
10407
- var _temp5 = _catch(function () {
10408
- function _temp4() {
10409
- function _temp2() {
10410
- handleChangeInput('');
10411
- setSelectedFile(null);
10412
- }
10413
- var _temp = function (_message$content) {
10428
+ var _temp2 = _catch(function () {
10429
+ if (file) {
10430
+ return Promise.resolve(handleUploadImageData(file)).then(function (selectedFile) {
10431
+ if (!selectedFile) {
10432
+ _exit = true;
10433
+ return;
10434
+ }
10435
+ return Promise.resolve(apiAddMessage(selectedConversation === null || selectedConversation === void 0 ? void 0 : selectedConversation.id, _extends({}, selectedFile, {
10436
+ contentType: 1
10437
+ }))).then(function () {
10438
+ setFile(undefined);
10439
+ setBackgroundImage(null);
10440
+ });
10441
+ });
10442
+ } else {
10443
+ var _temp4 = function (_message$content) {
10414
10444
  if (message !== null && message !== void 0 && (_message$content = message.content) !== null && _message$content !== void 0 && _message$content.trim().length) {
10415
- return Promise.resolve(apiAddMessage(selectedConversation === null || selectedConversation === void 0 ? void 0 : selectedConversation.id, _extends({}, message))).then(function () {});
10445
+ return Promise.resolve(apiAddMessage(selectedConversation === null || selectedConversation === void 0 ? void 0 : selectedConversation.id, _extends({}, message))).then(function () {
10446
+ handleChangeInput('');
10447
+ });
10416
10448
  }
10417
10449
  }();
10418
- return _temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp);
10450
+ if (_temp4 && _temp4.then) return _temp4.then(function () {});
10419
10451
  }
10420
- var _temp3 = function () {
10421
- if (selectedFile !== null && selectedFile !== void 0 && selectedFile.content) {
10422
- return Promise.resolve(apiAddMessage(selectedConversation === null || selectedConversation === void 0 ? void 0 : selectedConversation.id, _extends({}, selectedFile, {
10423
- contentType: 1
10424
- }))).then(function () {});
10425
- }
10426
- }();
10427
- return _temp3 && _temp3.then ? _temp3.then(_temp4) : _temp4(_temp3);
10428
10452
  }, function (error) {
10429
10453
  setMessages(function (state) {
10430
10454
  return [].concat(state.filter(function (i) {
@@ -10433,31 +10457,51 @@ var useChatContainer = function useChatContainer(props) {
10433
10457
  });
10434
10458
  toast.error(getErrorMessage(t, error));
10435
10459
  });
10436
- return Promise.resolve(_temp5 && _temp5.then ? _temp5.then(_temp6) : _temp6(_temp5));
10460
+ return Promise.resolve(_temp2 && _temp2.then ? _temp2.then(_temp3) : _temp3(_temp2));
10437
10461
  } catch (e) {
10438
10462
  return Promise.reject(e);
10439
10463
  }
10440
10464
  };
10441
10465
  var handleUploadImage = function handleUploadImage(file) {
10442
- return file ? Promise.resolve(_finally(function () {
10443
- return _catch(function () {
10466
+ try {
10467
+ if (file) {
10468
+ setFile(file);
10469
+ var reader = new FileReader();
10470
+ reader.onload = function () {
10471
+ setBackgroundImage(reader.result);
10472
+ };
10473
+ reader.readAsDataURL(file);
10474
+ }
10475
+ return Promise.resolve();
10476
+ } catch (e) {
10477
+ return Promise.reject(e);
10478
+ }
10479
+ };
10480
+ var handleUploadImageData = function handleUploadImageData(file) {
10481
+ try {
10482
+ return Promise.resolve(_catch(function () {
10444
10483
  var formData = new FormData();
10445
10484
  formData.append("upload", file);
10446
10485
  return Promise.resolve(apiUploadImageFile(formData)).then(function (res) {
10447
10486
  var _res$data;
10448
- setSelectedFile({
10487
+ return {
10449
10488
  content: res === null || res === void 0 ? void 0 : (_res$data = res.data) === null || _res$data === void 0 ? void 0 : _res$data.url
10450
- });
10489
+ };
10451
10490
  });
10452
10491
  }, function (error) {
10492
+ toast.error(t("failed_to_send_the_image_error", {
10493
+ message: getErrorMessage(t, error)
10494
+ }));
10453
10495
  setMessages(function (state) {
10454
10496
  return [].concat(state.filter(function (i) {
10455
10497
  return (i === null || i === void 0 ? void 0 : i.id) !== 0;
10456
10498
  }));
10457
10499
  });
10458
- toast.error(getErrorMessage(t, error));
10459
- });
10460
- }, function () {})) : Promise.resolve();
10500
+ return null;
10501
+ }));
10502
+ } catch (e) {
10503
+ return Promise.reject(e);
10504
+ }
10461
10505
  };
10462
10506
  var handleChangeInput = function handleChangeInput(text) {
10463
10507
  setMessage({
@@ -10466,7 +10510,7 @@ var useChatContainer = function useChatContainer(props) {
10466
10510
  };
10467
10511
  var handleNewMessageSent = function handleNewMessageSent(data) {
10468
10512
  try {
10469
- var _temp7 = function _temp7(_updateLastTimeReadCo) {
10513
+ var _temp5 = function _temp5(_updateLastTimeReadCo) {
10470
10514
  _updateLastTimeReadCo;
10471
10515
  };
10472
10516
  if (!data) return Promise.resolve();
@@ -10475,14 +10519,14 @@ var useChatContainer = function useChatContainer(props) {
10475
10519
  return [].concat(state, [data]);
10476
10520
  });
10477
10521
  var _selectedConversation = selectedConversation === null || selectedConversation === void 0 ? void 0 : selectedConversation.id;
10478
- return Promise.resolve(_selectedConversation ? Promise.resolve(updateLastTimeReadConversation(selectedConversation.id)).then(_temp7) : _temp7(_selectedConversation));
10522
+ return Promise.resolve(_selectedConversation ? Promise.resolve(updateLastTimeReadConversation(selectedConversation.id)).then(_temp5) : _temp5(_selectedConversation));
10479
10523
  } catch (e) {
10480
10524
  return Promise.reject(e);
10481
10525
  }
10482
10526
  };
10483
10527
  var handleNewConversation = function handleNewConversation(data) {
10484
10528
  try {
10485
- var _temp8 = function _temp8(_updateLastTimeReadCo2) {
10529
+ var _temp6 = function _temp6(_updateLastTimeReadCo2) {
10486
10530
  _updateLastTimeReadCo2;
10487
10531
  };
10488
10532
  if (!data) return Promise.resolve();
@@ -10492,7 +10536,7 @@ var useChatContainer = function useChatContainer(props) {
10492
10536
  return [].concat(state, [item]);
10493
10537
  });
10494
10538
  var _selectedConversation2 = selectedConversation === null || selectedConversation === void 0 ? void 0 : selectedConversation.id;
10495
- return Promise.resolve(_selectedConversation2 ? Promise.resolve(updateLastTimeReadConversation(selectedConversation.id)).then(_temp8) : _temp8(_selectedConversation2));
10539
+ return Promise.resolve(_selectedConversation2 ? Promise.resolve(updateLastTimeReadConversation(selectedConversation.id)).then(_temp6) : _temp6(_selectedConversation2));
10496
10540
  } catch (e) {
10497
10541
  return Promise.reject(e);
10498
10542
  }
@@ -10511,7 +10555,8 @@ var useChatContainer = function useChatContainer(props) {
10511
10555
  }
10512
10556
  };
10513
10557
  var handleDeleteSelectedImage = function handleDeleteSelectedImage() {
10514
- setSelectedFile(null);
10558
+ setFile(undefined);
10559
+ setBackgroundImage(null);
10515
10560
  };
10516
10561
  var cleanupPusher = function cleanupPusher() {
10517
10562
  pusher === null || pusher === void 0 ? void 0 : pusher.unbind("new-message-event", handleNewMessageSent);
@@ -10597,7 +10642,7 @@ var useChatContainer = function useChatContainer(props) {
10597
10642
  handleDeleteMessage: handleDeleteMessage
10598
10643
  },
10599
10644
  inputProps: {
10600
- selectedFile: selectedFile,
10645
+ selectedFile: backgroundImage,
10601
10646
  text: (message === null || message === void 0 ? void 0 : message.content) || "",
10602
10647
  onChangeInput: handleChangeInput,
10603
10648
  onSubmit: handleAddMessage,
@@ -10680,10 +10725,11 @@ var useVirtualListView = function useVirtualListView(props) {
10680
10725
  handleLoadMore();
10681
10726
  }
10682
10727
  };
10728
+ var decounceScroll = _$a.debounce(onScroll, 300);
10683
10729
  var rowCount = data.length + (loading ? 1 : 0);
10684
10730
  return {
10685
10731
  rowCount: rowCount,
10686
- onScroll: onScroll
10732
+ onScroll: decounceScroll
10687
10733
  };
10688
10734
  };
10689
10735
 
@@ -16089,7 +16135,7 @@ var useStudentInfoDrawer = function useStudentInfoDrawer(props) {
16089
16135
  var _temp2 = function _temp2() {
16090
16136
  setLoading(false);
16091
16137
  };
16092
- if (!studentId) return Promise.resolve();
16138
+ if (!studentId || !open) return Promise.resolve();
16093
16139
  setLoading(true);
16094
16140
  var _temp = _catch(function () {
16095
16141
  return Promise.resolve(getUserByIdApi(studentId)).then(function (res) {
@@ -16102,7 +16148,7 @@ var useStudentInfoDrawer = function useStudentInfoDrawer(props) {
16102
16148
  }
16103
16149
  };
16104
16150
  getStudent();
16105
- }, [studentId]);
16151
+ }, [open, studentId]);
16106
16152
  useEffect(function () {
16107
16153
  if (open && inert) {
16108
16154
  var _document$getElementB;