touchstudy-core 0.1.177 → 0.1.178

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
@@ -70,6 +70,7 @@ var reactHookForm = require('react-hook-form');
70
70
  var yup$1 = require('@hookform/resolvers/yup');
71
71
  var pi = require('react-icons/pi');
72
72
  var Container = _interopDefault(require('@mui/material/Container'));
73
+ var ai = require('react-icons/ai');
73
74
  var bs = require('react-icons/bs');
74
75
  var Popover = _interopDefault(require('@mui/material/Popover'));
75
76
  var MenuItem = _interopDefault(require('@mui/material/MenuItem'));
@@ -536,6 +537,7 @@ var teacher_in_charge = "담당 교사";
536
537
  var counselor = "상담교사";
537
538
  var new_question = "새로운 질문";
538
539
  var hour = "시간";
540
+ var hour_h = "시간";
539
541
  var minute = "분";
540
542
  var second = "두번째";
541
543
  var question_order = "{{number}} 번";
@@ -1029,6 +1031,7 @@ var teacher_required = "선생님은 필수입니다";
1029
1031
  var total_users = "총 사용자";
1030
1032
  var added_date = "추가된 날짜";
1031
1033
  var sync_exam_results = "시험 결과 동기화";
1034
+ var sync_textbook_results = "교재 결과 동기화";
1032
1035
  var update_data_fail = "데이터 업데이트 실패";
1033
1036
  var add_students_to_class = "수업에 학생 추가";
1034
1037
  var add_teachers_to_class = "수업에 교사 추가";
@@ -1039,9 +1042,13 @@ var question_management = "질문 관리";
1039
1042
  var student_data = "학생 데이터";
1040
1043
  var problem_number_question_chart = "문제 {{number}}번";
1041
1044
  var are_you_sure_to_sync_exam_results_to_academy = "시험 결과를 아카데미 {{ academyName }}에 동기화하시겠습니까(백그라운드에서 실행되며 시간이 다소 소요됨)";
1045
+ var are_you_sure_to_sync_textbook_results_to_academy = "교재 학습 결과를 아카데미 {{ academyName }}에 동기화하시겠습니까? (백그라운드에서 실행되며 시간이 다소 소요됨)";
1042
1046
  var messages = {
1043
- exam_sessions_are_being_synchronized: "{{ total }} 개의 시험 세션이 동기화되고 있습니다"
1047
+ exam_sessions_are_being_synchronized: "{{ total }} 개의 시험 세션이 동기화되고 있습니다",
1048
+ textbook_sessions_are_being_synchronized: "{{ total }} 개의 교재 학습 세션이 동기화되고 있습니다"
1044
1049
  };
1050
+ var sync_exam = "시험 동기화";
1051
+ var sync_textbook = "교재 동기화";
1045
1052
  var submit = "제출하다";
1046
1053
  var must_select_a_teacher_first = "먼저 교사를 선택해야 합니다";
1047
1054
  var student_grade_is_invalid = "학생 등급은 1에서 12 사이여야 합니다";
@@ -1105,6 +1112,7 @@ var academy_invite_detail = "아카데미 초대 세부정보";
1105
1112
  var are_you_sure_to_delete_academy_invite = "이 아카데미 초대를 삭제하시겠습니까?";
1106
1113
  var day = "낮";
1107
1114
  var days = "날";
1115
+ var month = "월";
1108
1116
  var emails = "이메일";
1109
1117
  var is_accepted = "승인됨";
1110
1118
  var re_send = "다시 보내기";
@@ -1488,6 +1496,8 @@ var order_matters = "순서 상관 있음";
1488
1496
  var order_does_not_matter = "순서 상관 없음";
1489
1497
  var synonym_processing = "답 이음동의어 처리";
1490
1498
  var compare_type = "비교 유형";
1499
+ var all_changes_saved = "모든 변경 사항이 저장되었습니다";
1500
+ var saving = "절약";
1491
1501
  var textbook_name = "교재 이름";
1492
1502
  var korean_language = "국어";
1493
1503
  var answer_cannot_be_empty = "답변은 비워둘 수 없습니다";
@@ -1534,6 +1544,13 @@ var admin_to_teachers = "관리자에서 교사들에게";
1534
1544
  var teacher_to_teachers = "교사에서 교사들에게";
1535
1545
  var student_required = "학생은 필수입니다";
1536
1546
  var teachers_required = "교사가 필요합니다";
1547
+ var all_changes_are_not_saved_yet = "아직 모든 변경 사항이 저장되지 않았습니다";
1548
+ var pause = "일시정지";
1549
+ var press_to_start = "눌러서 시작하기";
1550
+ var study_timer = "순공 타이머";
1551
+ var show_timer = "타이머 표시";
1552
+ var failed_to_pause_the_subject_name = "과목 '{{name}}'를 일시 중지하는 데 실패했습니다";
1553
+ var failed_to_start_the_subject_name = "과목 '{{name}}'를 시작하는 데 실패했습니다";
1537
1554
  var lang_ko = {
1538
1555
  problem_solving: problem_solving,
1539
1556
  my_story: my_story,
@@ -1725,6 +1742,7 @@ var lang_ko = {
1725
1742
  counselor: counselor,
1726
1743
  new_question: new_question,
1727
1744
  hour: hour,
1745
+ hour_h: hour_h,
1728
1746
  minute: minute,
1729
1747
  second: second,
1730
1748
  question_order: question_order,
@@ -2213,6 +2231,7 @@ var lang_ko = {
2213
2231
  total_users: total_users,
2214
2232
  added_date: added_date,
2215
2233
  sync_exam_results: sync_exam_results,
2234
+ sync_textbook_results: sync_textbook_results,
2216
2235
  update_data_fail: update_data_fail,
2217
2236
  add_students_to_class: add_students_to_class,
2218
2237
  add_teachers_to_class: add_teachers_to_class,
@@ -2223,7 +2242,10 @@ var lang_ko = {
2223
2242
  student_data: student_data,
2224
2243
  problem_number_question_chart: problem_number_question_chart,
2225
2244
  are_you_sure_to_sync_exam_results_to_academy: are_you_sure_to_sync_exam_results_to_academy,
2245
+ are_you_sure_to_sync_textbook_results_to_academy: are_you_sure_to_sync_textbook_results_to_academy,
2226
2246
  messages: messages,
2247
+ sync_exam: sync_exam,
2248
+ sync_textbook: sync_textbook,
2227
2249
  submit: submit,
2228
2250
  must_select_a_teacher_first: must_select_a_teacher_first,
2229
2251
  student_grade_is_invalid: student_grade_is_invalid,
@@ -2287,6 +2309,7 @@ var lang_ko = {
2287
2309
  are_you_sure_to_delete_academy_invite: are_you_sure_to_delete_academy_invite,
2288
2310
  day: day,
2289
2311
  days: days,
2312
+ month: month,
2290
2313
  emails: emails,
2291
2314
  is_accepted: is_accepted,
2292
2315
  re_send: re_send,
@@ -2658,6 +2681,8 @@ var lang_ko = {
2658
2681
  order_does_not_matter: order_does_not_matter,
2659
2682
  synonym_processing: synonym_processing,
2660
2683
  compare_type: compare_type,
2684
+ all_changes_saved: all_changes_saved,
2685
+ saving: saving,
2661
2686
  textbook_name: textbook_name,
2662
2687
  korean_language: korean_language,
2663
2688
  answer_cannot_be_empty: answer_cannot_be_empty,
@@ -2703,7 +2728,14 @@ var lang_ko = {
2703
2728
  admin_to_teachers: admin_to_teachers,
2704
2729
  teacher_to_teachers: teacher_to_teachers,
2705
2730
  student_required: student_required,
2706
- teachers_required: teachers_required
2731
+ teachers_required: teachers_required,
2732
+ all_changes_are_not_saved_yet: all_changes_are_not_saved_yet,
2733
+ pause: pause,
2734
+ press_to_start: press_to_start,
2735
+ study_timer: study_timer,
2736
+ show_timer: show_timer,
2737
+ failed_to_pause_the_subject_name: failed_to_pause_the_subject_name,
2738
+ failed_to_start_the_subject_name: failed_to_start_the_subject_name
2707
2739
  };
2708
2740
 
2709
2741
  var problem_solving$1 = "Problem Solving";
@@ -2922,6 +2954,7 @@ var counselor$1 = "Counselor";
2922
2954
  var new_question$1 = "New Question";
2923
2955
  var hour$1 = "hr";
2924
2956
  var hours = "hrs";
2957
+ var hour_h$1 = "h";
2925
2958
  var minute$1 = "min";
2926
2959
  var second$1 = "second";
2927
2960
  var question_order$1 = "Number {{number}}";
@@ -3390,6 +3423,7 @@ var teacher_required$1 = "Teacher is required";
3390
3423
  var total_users$1 = "Total users";
3391
3424
  var added_date$1 = "Added date";
3392
3425
  var sync_exam_results$1 = "Sync exam results";
3426
+ var sync_textbook_results$1 = "Sync textbook results";
3393
3427
  var update_data_fail$1 = "Update data fail";
3394
3428
  var add_students_to_class$1 = "Add students to class";
3395
3429
  var add_teachers_to_class$1 = "Add teachers to class";
@@ -3400,9 +3434,13 @@ var question_management$1 = "Question Management";
3400
3434
  var student_data$1 = "Student Data";
3401
3435
  var problem_number_question_chart$1 = "Q. {{number}}";
3402
3436
  var are_you_sure_to_sync_exam_results_to_academy$1 = "Are you sure to sync exam results to academy \"{{ academyName }}\" (it will run in the background and take a while)";
3437
+ var are_you_sure_to_sync_textbook_results_to_academy$1 = "Are you sure to sync textbook results to academy \"{{ academyName }}\" (it will run in the background and take a while)";
3403
3438
  var messages$1 = {
3404
- exam_sessions_are_being_synchronized: "{{ total }} exam sessions are being synchronized"
3439
+ exam_sessions_are_being_synchronized: "{{ total }} exam sessions are being synchronized",
3440
+ textbook_sessions_are_being_synchronized: "{{ total }} textbook sessions are being synchronized"
3405
3441
  };
3442
+ var sync_exam$1 = "Sync Exam";
3443
+ var sync_textbook$1 = "Sync Textbook";
3406
3444
  var submit$1 = "Submit";
3407
3445
  var must_select_a_teacher_first$1 = "Must select a teacher first";
3408
3446
  var student_grade_is_invalid$1 = "Student grade must be from 1 to 12";
@@ -3466,6 +3504,7 @@ var academy_invite_detail$1 = "Academy Invite Detail";
3466
3504
  var are_you_sure_to_delete_academy_invite$1 = "Are you sure to delete this academy invite?";
3467
3505
  var day$1 = "day";
3468
3506
  var days$1 = "days";
3507
+ var month$1 = "month";
3469
3508
  var emails$1 = "Emails";
3470
3509
  var is_accepted$1 = "Is Accepted";
3471
3510
  var re_send$1 = "Resend";
@@ -3850,6 +3889,8 @@ var order_matters$1 = "Order matters";
3850
3889
  var order_does_not_matter$1 = "Order doesn't matter";
3851
3890
  var synonym_processing$1 = "Answer Synonym processing";
3852
3891
  var compare_type$1 = "Compare Type";
3892
+ var all_changes_saved$1 = "All changes saved";
3893
+ var saving$1 = "Saving";
3853
3894
  var textbook_name$1 = "Textbook name";
3854
3895
  var korean_language$1 = "Korean";
3855
3896
  var answer_cannot_be_empty$1 = "Answer cannot be empty";
@@ -3896,6 +3937,13 @@ var admin_to_teachers$1 = "Admin to teachers";
3896
3937
  var teacher_to_teachers$1 = "Teacher to teachers";
3897
3938
  var student_required$1 = "Student is required";
3898
3939
  var teachers_required$1 = "Teachers are required";
3940
+ var all_changes_are_not_saved_yet$1 = "All changes are not saved yet";
3941
+ var pause$1 = "Pause";
3942
+ var press_to_start$1 = "Press to start";
3943
+ var study_timer$1 = "Focused Study Timer";
3944
+ var show_timer$1 = "Show timer";
3945
+ var failed_to_pause_the_subject_name$1 = "Failed to pause the subject '{{name}}'";
3946
+ var failed_to_start_the_subject_name$1 = "Failed to start the subject '{{name}}'";
3899
3947
  var lang_en = {
3900
3948
  problem_solving: problem_solving$1,
3901
3949
  my_story: my_story$1,
@@ -4113,6 +4161,7 @@ var lang_en = {
4113
4161
  new_question: new_question$1,
4114
4162
  hour: hour$1,
4115
4163
  hours: hours,
4164
+ hour_h: hour_h$1,
4116
4165
  minute: minute$1,
4117
4166
  second: second$1,
4118
4167
  question_order: question_order$1,
@@ -4576,6 +4625,7 @@ var lang_en = {
4576
4625
  total_users: total_users$1,
4577
4626
  added_date: added_date$1,
4578
4627
  sync_exam_results: sync_exam_results$1,
4628
+ sync_textbook_results: sync_textbook_results$1,
4579
4629
  update_data_fail: update_data_fail$1,
4580
4630
  add_students_to_class: add_students_to_class$1,
4581
4631
  add_teachers_to_class: add_teachers_to_class$1,
@@ -4586,7 +4636,10 @@ var lang_en = {
4586
4636
  student_data: student_data$1,
4587
4637
  problem_number_question_chart: problem_number_question_chart$1,
4588
4638
  are_you_sure_to_sync_exam_results_to_academy: are_you_sure_to_sync_exam_results_to_academy$1,
4639
+ are_you_sure_to_sync_textbook_results_to_academy: are_you_sure_to_sync_textbook_results_to_academy$1,
4589
4640
  messages: messages$1,
4641
+ sync_exam: sync_exam$1,
4642
+ sync_textbook: sync_textbook$1,
4590
4643
  submit: submit$1,
4591
4644
  must_select_a_teacher_first: must_select_a_teacher_first$1,
4592
4645
  student_grade_is_invalid: student_grade_is_invalid$1,
@@ -4650,6 +4703,7 @@ var lang_en = {
4650
4703
  are_you_sure_to_delete_academy_invite: are_you_sure_to_delete_academy_invite$1,
4651
4704
  day: day$1,
4652
4705
  days: days$1,
4706
+ month: month$1,
4653
4707
  emails: emails$1,
4654
4708
  is_accepted: is_accepted$1,
4655
4709
  re_send: re_send$1,
@@ -5022,6 +5076,8 @@ var lang_en = {
5022
5076
  order_does_not_matter: order_does_not_matter$1,
5023
5077
  synonym_processing: synonym_processing$1,
5024
5078
  compare_type: compare_type$1,
5079
+ all_changes_saved: all_changes_saved$1,
5080
+ saving: saving$1,
5025
5081
  textbook_name: textbook_name$1,
5026
5082
  korean_language: korean_language$1,
5027
5083
  answer_cannot_be_empty: answer_cannot_be_empty$1,
@@ -5067,7 +5123,14 @@ var lang_en = {
5067
5123
  admin_to_teachers: admin_to_teachers$1,
5068
5124
  teacher_to_teachers: teacher_to_teachers$1,
5069
5125
  student_required: student_required$1,
5070
- teachers_required: teachers_required$1
5126
+ teachers_required: teachers_required$1,
5127
+ all_changes_are_not_saved_yet: all_changes_are_not_saved_yet$1,
5128
+ pause: pause$1,
5129
+ press_to_start: press_to_start$1,
5130
+ study_timer: study_timer$1,
5131
+ show_timer: show_timer$1,
5132
+ failed_to_pause_the_subject_name: failed_to_pause_the_subject_name$1,
5133
+ failed_to_start_the_subject_name: failed_to_start_the_subject_name$1
5071
5134
  };
5072
5135
 
5073
5136
  i18n__default.use(reactI18next.initReactI18next).init({
@@ -5523,7 +5586,7 @@ var PrintExamView2 = function PrintExamView2(_ref) {
5523
5586
  }, t("print_pdf"))));
5524
5587
  };
5525
5588
 
5526
- var styles = {"lighter":"#F0FFF6","light":"#89F0B2","less_dark":"#3DC674","dark":"#349056","darker":"#18442A","gray_50":"#FBFBF9","gray_100":"#EAEAE5","gray_300":"#D0D0C8","gray_500":"#9A9A98","gray_700":"#5D5D5B","gray_900":"#363634","red_900":"#DB4D4D","green_support_900":"#3ACB46","yellow_900":"#FEAF06","purple_900":"#C3099A","btn-login-google":"_2HqmH","math-jax":"_3Pfdk","block-login":"_wWIyO","box-login":"_38Lo1","btn-primary":"_rd4Uy","dropdown-menu":"_1krbH","header-avatar":"_RQaHE","dropdown-menu-flag":"_XK8oS","dropdown-content":"_3ys4W","dropdown-change":"_ToOW_","item-address":"_3sQlR","item-logout":"_3bqSM","title-address":"_1jgSI","img-avatar":"_35Ttz","item-contact":"_1wc7o","content-text":"_3S4f2","dropdown-content-language":"_3ajui","dropdown-item-language":"_3Y_y4","dropdown-item-language-active":"_CzNMi","dropdown-academy":"_3CMVp","image-academy":"_2ibYC","academy-btn":"_1JMRU","switch-icon":"_N4FNf","dropdown-content-academy":"_31Dr0","dropdown-academy-item":"_3bjcz","noGutters":"_31ZQk","custom-col-2":"_3yXyK","custom-col-3":"_1RsJQ","custom-col-5":"_L42CP","custom-col-10":"_2u6eL","custom-row":"_8x7OP","custom-col":"_1JmTh","custom-col-4":"_3HO1e","custom-col-8":"_Oy31M","custom-col-12":"_3aUKo","custom-container":"_39LRs","form-label":"__Ut-u","form-control":"_2k4dX","btn-outline-primary":"_2PWdX","sort-icons":"_mQvLF","active":"_3oAH-","form-select":"_3W3aw","truncate":"_3NJzN","headers":"_3xnI5","logo-container":"_3YG70","tabBox":"_1CQPn","routerBox":"_3hx2T","tabText":"_3UyhW","router-link-active":"_1TGKA","router-link":"_1AqMh","userImg":"_2RI6G","disabled-link":"_3aVHg","line-clamp":"_3fpky"};
5589
+ var styles = {"lighter":"#F0FFF6","light":"#89F0B2","less_dark":"#3DC674","dark":"#349056","darker":"#18442A","gray_50":"#FBFBF9","gray_100":"#EAEAE5","gray_300":"#D0D0C8","gray_500":"#9A9A98","gray_700":"#5D5D5B","gray_900":"#363634","red_900":"#DB4D4D","green_support_900":"#3ACB46","yellow_900":"#FEAF06","purple_900":"#C3099A","btn-login-google":"_2HqmH","math-jax":"_3Pfdk","block-login":"_wWIyO","box-login":"_38Lo1","btn-primary":"_rd4Uy","dropdown-menu":"_1krbH","header-avatar":"_RQaHE","dropdown-menu-flag":"_XK8oS","dropdown-content":"_3ys4W","dropdown-change":"_ToOW_","item-address":"_3sQlR","item-logout":"_3bqSM","title-address":"_1jgSI","img-avatar":"_35Ttz","item-contact":"_1wc7o","content-text":"_3S4f2","dropdown-content-language":"_3ajui","dropdown-item-language":"_3Y_y4","dropdown-item-language-active":"_CzNMi","dropdown-academy":"_3CMVp","image-academy":"_2ibYC","academy-btn":"_1JMRU","switch-icon":"_N4FNf","dropdown-content-academy":"_31Dr0","dropdown-academy-item":"_3bjcz","noGutters":"_31ZQk","custom-col-2":"_3yXyK","custom-col-3":"_1RsJQ","custom-col-5":"_L42CP","custom-col-10":"_2u6eL","custom-row":"_8x7OP","custom-col":"_1JmTh","custom-col-4":"_3HO1e","custom-col-8":"_Oy31M","custom-col-12":"_3aUKo","custom-container":"_39LRs","form-label":"__Ut-u","form-control":"_2k4dX","btn-outline-primary":"_2PWdX","sort-icons":"_mQvLF","active":"_3oAH-","form-select":"_3W3aw","truncate":"_3NJzN","headers":"_3xnI5","logo-container":"_3YG70","tabBox":"_1CQPn","routerBox":"_3hx2T","tabText":"_3UyhW","router-link-active":"_1TGKA","router-link":"_1AqMh","userImg":"_2RI6G","disabled-link":"_3aVHg","line-clamp":"_3fpky","timer-menu":"_3bvVg","timer-menu-item":"_z624V","subject-name":"_2KJX4","duration":"_1mwlk","icon-start":"_maff_"};
5527
5590
 
5528
5591
  var config = {
5529
5592
  loader: {
@@ -6265,6 +6328,12 @@ var HighSchoolGrade;
6265
6328
  TextbookEditorType[TextbookEditorType["Korea"] = 1] = "Korea";
6266
6329
  TextbookEditorType[TextbookEditorType["Math"] = 2] = "Math";
6267
6330
  })(exports.TextbookEditorType || (exports.TextbookEditorType = {}));
6331
+ var PrintStatus;
6332
+ (function (PrintStatus) {
6333
+ PrintStatus[PrintStatus["Idle"] = 0] = "Idle";
6334
+ PrintStatus[PrintStatus["Saving"] = 1] = "Saving";
6335
+ PrintStatus[PrintStatus["Saved"] = 2] = "Saved";
6336
+ })(PrintStatus || (PrintStatus = {}));
6268
6337
 
6269
6338
  (function (SchoolType) {
6270
6339
  SchoolType[SchoolType["Default"] = 0] = "Default";
@@ -6273,6 +6342,12 @@ var HighSchoolGrade;
6273
6342
  SchoolType[SchoolType["High"] = 3] = "High";
6274
6343
  })(exports.SchoolType || (exports.SchoolType = {}));
6275
6344
 
6345
+ (function (SubjectTimerStatus) {
6346
+ SubjectTimerStatus[SubjectTimerStatus["NotStarted"] = 0] = "NotStarted";
6347
+ SubjectTimerStatus[SubjectTimerStatus["Started"] = 1] = "Started";
6348
+ SubjectTimerStatus[SubjectTimerStatus["Paused"] = 2] = "Paused";
6349
+ })(exports.SubjectTimerStatus || (exports.SubjectTimerStatus = {}));
6350
+
6276
6351
  var canAccess = function canAccess(userRoles, componentRoles) {
6277
6352
  if (!Array.isArray(userRoles)) {
6278
6353
  return false;
@@ -6522,6 +6597,11 @@ var getRemainTime = function getRemainTime(startTime, duration) {
6522
6597
  if (timePass > durationInNumber) return 0;
6523
6598
  return durationInNumber - timePass;
6524
6599
  };
6600
+ var getCountTime = function getCountTime(startTime, duration) {
6601
+ var timePass = diffFromNow(startTime, "second");
6602
+ if (typeof timePass !== "number") return null;
6603
+ return duration + timePass;
6604
+ };
6525
6605
 
6526
6606
  var formatDateTime = function formatDateTime(inputDate) {
6527
6607
  var date = new Date(inputDate);
@@ -8246,6 +8326,27 @@ var getSubjectListApi = function getSubjectListApi(textSearch) {
8246
8326
  return Promise.reject(e);
8247
8327
  }
8248
8328
  };
8329
+ var getStudentSubjectListApi = function getStudentSubjectListApi() {
8330
+ try {
8331
+ return Promise.resolve(api.get(SUBJECT_URL + "/timers"));
8332
+ } catch (e) {
8333
+ return Promise.reject(e);
8334
+ }
8335
+ };
8336
+ var startStudentSubjectTimerApi = function startStudentSubjectTimerApi(subjectId) {
8337
+ try {
8338
+ return Promise.resolve(api.post(SUBJECT_URL + "/" + subjectId + "/timers"));
8339
+ } catch (e) {
8340
+ return Promise.reject(e);
8341
+ }
8342
+ };
8343
+ var pauseStudentSubjectApi = function pauseStudentSubjectApi(subjectId, recordId, data) {
8344
+ try {
8345
+ return Promise.resolve(api.post(SUBJECT_URL + "/" + subjectId + "/timers/" + recordId, data));
8346
+ } catch (e) {
8347
+ return Promise.reject(e);
8348
+ }
8349
+ };
8249
8350
 
8250
8351
  var SubjectSelector = function SubjectSelector(_ref) {
8251
8352
  var value = _ref.value,
@@ -10315,6 +10416,7 @@ var grey = {
10315
10416
  var green = {
10316
10417
  0: '#FFFFFF',
10317
10418
  100: '#F0FFF6',
10419
+ 200: '#D2FFE4',
10318
10420
  300: '#89F0B2',
10319
10421
  500: '#3DC674',
10320
10422
  700: '#349056',
@@ -33911,11 +34013,11 @@ var TextbookRow = function TextbookRow(_ref) {
33911
34013
  });
33912
34014
  var _useTranslation = reactI18next.useTranslation(),
33913
34015
  t = _useTranslation.t;
33914
- var isEditable = (!onAcademy || isAdminSite || isSuperAdmin || isSuperAdminUser || !isAdmin && data.isShared && (((_data$createdBy = data.createdBy) === null || _data$createdBy === void 0 ? void 0 : _data$createdBy.id) === (infoUser === null || infoUser === void 0 ? void 0 : infoUser.id) || ((_data$textbookOwners = data.textbookOwners) === null || _data$textbookOwners === void 0 ? void 0 : _data$textbookOwners.some(function (i) {
34016
+ var isEditable = !onAcademy || isAdminSite || isSuperAdmin || isSuperAdminUser || !isAdmin && data.isShared && (((_data$createdBy = data.createdBy) === null || _data$createdBy === void 0 ? void 0 : _data$createdBy.id) === (infoUser === null || infoUser === void 0 ? void 0 : infoUser.id) || ((_data$textbookOwners = data.textbookOwners) === null || _data$textbookOwners === void 0 ? void 0 : _data$textbookOwners.some(function (i) {
33915
34017
  var _infoUser$email, _infoUser$email$trim;
33916
34018
  return (i === null || i === void 0 ? void 0 : i.email.trim().toUpperCase()) === (infoUser === null || infoUser === void 0 ? void 0 : (_infoUser$email = infoUser.email) === null || _infoUser$email === void 0 ? void 0 : (_infoUser$email$trim = _infoUser$email.trim()) === null || _infoUser$email$trim === void 0 ? void 0 : _infoUser$email$trim.toUpperCase()) && (i === null || i === void 0 ? void 0 : i.academyId) === (academy === null || academy === void 0 ? void 0 : academy.id);
33917
- })))) && data.totalUses <= 0;
33918
- var isDeleteAble = !onAcademy || isAdminSite || isSuperAdmin || isSuperAdminUser || !isAdmin && data.isShared && ((_data$createdBy2 = data.createdBy) === null || _data$createdBy2 === void 0 ? void 0 : _data$createdBy2.id) === (infoUser === null || infoUser === void 0 ? void 0 : infoUser.id) && data.totalUses <= 0;
34019
+ })));
34020
+ var isDeleteAble = !onAcademy || isAdminSite || isSuperAdmin || isSuperAdminUser || !isAdmin && data.isShared && ((_data$createdBy2 = data.createdBy) === null || _data$createdBy2 === void 0 ? void 0 : _data$createdBy2.id) === (infoUser === null || infoUser === void 0 ? void 0 : infoUser.id);
33919
34021
  var isSharable = !data.isPublic && data.isShared && onAcademy && (isAdminSite || isSuperAdminUser || !isAdmin && data.createdBy.id === infoUser.id);
33920
34022
  var handleUpdateTextbook = function handleUpdateTextbook() {
33921
34023
  onUpdateTextbook(data);
@@ -34936,10 +35038,10 @@ var useTextbookManagement = function useTextbookManagement(_ref) {
34936
35038
  var isAdminSite = role === exports.Role.Admin;
34937
35039
  var onAcademy = !!(user !== null && user !== void 0 && user.academyDomain);
34938
35040
  var isSuperAdminUser = !!user && user.isSuperAdmin;
34939
- var isEditable = !selectedTextbook || (!onAcademy || isAdminSite || isSuperAdmin || isSuperAdminUser || !isAdmin && selectedTextbook.isShared && (((_selectedTextbook$cre = selectedTextbook.createdBy) === null || _selectedTextbook$cre === void 0 ? void 0 : _selectedTextbook$cre.id) === (user === null || user === void 0 ? void 0 : user.id) || selectedTextbook.textbookOwners.some(function (i) {
35041
+ var isEditable = !selectedTextbook || !onAcademy || isAdminSite || isSuperAdmin || isSuperAdminUser || !isAdmin && selectedTextbook.isShared && (((_selectedTextbook$cre = selectedTextbook.createdBy) === null || _selectedTextbook$cre === void 0 ? void 0 : _selectedTextbook$cre.id) === (user === null || user === void 0 ? void 0 : user.id) || selectedTextbook.textbookOwners.some(function (i) {
34940
35042
  var _user$email, _user$email$trim;
34941
35043
  return i.email.trim().toUpperCase() === (user === null || user === void 0 ? void 0 : (_user$email = user.email) === null || _user$email === void 0 ? void 0 : (_user$email$trim = _user$email.trim()) === null || _user$email$trim === void 0 ? void 0 : _user$email$trim.toUpperCase()) && i.academyId === (academy === null || academy === void 0 ? void 0 : academy.id);
34942
- }))) && selectedTextbook.totalUses <= 0;
35044
+ }));
34943
35045
  var disabledTextbookOwners = !selectedTextbook && isAdmin || selectedTextbook && (!isEditable || isTeacher && ((_selectedTextbook$cre2 = selectedTextbook.createdBy) === null || _selectedTextbook$cre2 === void 0 ? void 0 : _selectedTextbook$cre2.id) !== (user === null || user === void 0 ? void 0 : user.id) || isAdmin && !isSuperAdminUser);
34944
35046
  var handleOpenConfirmDeleteChapterDialog = function handleOpenConfirmDeleteChapterDialog(chapter) {
34945
35047
  setSelectedChapter(chapter);
@@ -35041,6 +35143,24 @@ var useTextbookManagement = function useTextbookManagement(_ref) {
35041
35143
  return Promise.reject(e);
35042
35144
  }
35043
35145
  };
35146
+ var handleSaveData = React.useCallback(function (values) {
35147
+ try {
35148
+ if (!coverImage && !(values !== null && values !== void 0 && values.coverImage)) {
35149
+ return Promise.resolve();
35150
+ }
35151
+ return Promise.resolve(_catch(function () {
35152
+ var coverImg = coverImage || (values === null || values === void 0 ? void 0 : values.coverImage);
35153
+ return Promise.resolve(updateTextbookApi$1(_extends({}, values, {
35154
+ coverImage: coverImg
35155
+ }), (selectedTextbook === null || selectedTextbook === void 0 ? void 0 : selectedTextbook.id) || 0, isSuperAdmin)).then(function () {});
35156
+ }, function (error) {
35157
+ reactToastify.toast.error(getErrorMessage(t, error));
35158
+ throw error;
35159
+ }));
35160
+ } catch (e) {
35161
+ return Promise.reject(e);
35162
+ }
35163
+ }, [coverImage, isSuperAdmin, JSON.stringify(selectedTextbook)]);
35044
35164
  React.useEffect(function () {
35045
35165
  if (!textbookId) return;
35046
35166
  handleGetTextbookDetail();
@@ -35059,6 +35179,7 @@ var useTextbookManagement = function useTextbookManagement(_ref) {
35059
35179
  isSuperAdminUser: isSuperAdminUser,
35060
35180
  openDialog: openDialog,
35061
35181
  handleSubmit: handleSubmit,
35182
+ handleSaveData: handleSaveData,
35062
35183
  selectedTextbook: selectedTextbook,
35063
35184
  handleOpenDialog: handleOpenDialog,
35064
35185
  handleCloseDialog: handleCloseDialog,
@@ -35352,6 +35473,8 @@ var CompareTypeOptions = [{
35352
35473
  label: "synonym_processing",
35353
35474
  value: exports.QuestionAnswerType.SynonymProcessing
35354
35475
  }];
35476
+ var SAVE_TIME_INTERVAL_IN_MILLISECONDS = 60 * 1000;
35477
+ var SAVE_TIME_MAX_DIFF_IN_MILLISECONDS = 1000;
35355
35478
 
35356
35479
  var CustomTextbookTab = function CustomTextbookTab(props) {
35357
35480
  var children = props.children,
@@ -38527,8 +38650,9 @@ var TextbookOwnersTab = function TextbookOwnersTab(_ref) {
38527
38650
  }));
38528
38651
  };
38529
38652
 
38530
- var _excluded$n = ["isCreatedByAdmin", "isSuperAdminUser", "isSuperAdmin", "isAdmin", "textbookId", "selected", "coverImage", "disabled", "ownersDisabled", "onChangeTab", "onUploadImage"];
38653
+ var _excluded$n = ["isCreatedByAdmin", "isSuperAdminUser", "isSuperAdmin", "isAdmin", "textbookId", "selected", "coverImage", "disabled", "ownersDisabled", "selectedTextbook", "handleSaveData", "onChangeTab", "onUploadImage"];
38531
38654
  var PreparedTextbookForm = function PreparedTextbookForm(_ref) {
38655
+ var _valuesTextbook$curre;
38532
38656
  var isCreatedByAdmin = _ref.isCreatedByAdmin,
38533
38657
  isSuperAdminUser = _ref.isSuperAdminUser,
38534
38658
  isSuperAdmin = _ref.isSuperAdmin,
@@ -38538,6 +38662,8 @@ var PreparedTextbookForm = function PreparedTextbookForm(_ref) {
38538
38662
  coverImage = _ref.coverImage,
38539
38663
  disabled = _ref.disabled,
38540
38664
  ownersDisabled = _ref.ownersDisabled,
38665
+ selectedTextbook = _ref.selectedTextbook,
38666
+ handleSaveData = _ref.handleSaveData,
38541
38667
  onChangeTab = _ref.onChangeTab,
38542
38668
  onUploadImage = _ref.onUploadImage,
38543
38669
  formikProps = _objectWithoutPropertiesLoose(_ref, _excluded$n);
@@ -38546,6 +38672,20 @@ var PreparedTextbookForm = function PreparedTextbookForm(_ref) {
38546
38672
  dirty = formikProps.dirty,
38547
38673
  submitCount = formikProps.submitCount,
38548
38674
  setValues = formikProps.setValues;
38675
+ var theme = material.useTheme();
38676
+ var savedRunRef = React.useRef(Date.now());
38677
+ var runTimeRef = React.useRef(Date.now());
38678
+ var valuesTextbook = React.useRef(null);
38679
+ var isFirstLoadRef = React.useRef(true);
38680
+ var _React$useState = React__default.useState(PrintStatus.Idle),
38681
+ saveStatus = _React$useState[0],
38682
+ setSaveStatus = _React$useState[1];
38683
+ var timeoutRef = React.useRef(null);
38684
+ var isProcessingRef = React.useRef(false);
38685
+ var pendingValuesRef = React.useRef(null);
38686
+ var _useState = React.useState(),
38687
+ lastEdited = _useState[0],
38688
+ setLastEdited = _useState[1];
38549
38689
  React.useEffect(function () {
38550
38690
  var handleBeforeUnload = function handleBeforeUnload(event) {
38551
38691
  var message = i18n.t("are_you_sure_you_want_to_quit_yours_changes_may_not_be_saved");
@@ -38566,9 +38706,99 @@ var PreparedTextbookForm = function PreparedTextbookForm(_ref) {
38566
38706
  var newValues = _resetAllCategoriesAndQuestionTypesBySubject(values, val);
38567
38707
  setValues(newValues);
38568
38708
  };
38709
+ React.useEffect(function () {
38710
+ if (!valuesTextbook.current && isFirstLoadRef.current && !_$8.isEqual(values, DEFAULT_TEXTBOOK_REQUEST)) {
38711
+ valuesTextbook.current = _$8.cloneDeep(values);
38712
+ isFirstLoadRef.current = false;
38713
+ }
38714
+ }, [values]);
38715
+ var _handleSave = function handleSave(valuesProps) {
38716
+ try {
38717
+ var _temp = _finallyRethrows(function () {
38718
+ return _catch(function () {
38719
+ isProcessingRef.current = true;
38720
+ setSaveStatus(PrintStatus.Saving);
38721
+ var valuesToSave = valuesProps || values;
38722
+ return Promise.resolve(handleSaveData(valuesToSave)).then(function () {
38723
+ valuesTextbook.current = _$8.cloneDeep(valuesToSave);
38724
+ var now = Date.now();
38725
+ savedRunRef.current = now;
38726
+ runTimeRef.current = now;
38727
+ setSaveStatus(PrintStatus.Saved);
38728
+ });
38729
+ }, function (error) {
38730
+ setSaveStatus(PrintStatus.Idle);
38731
+ console.error(error);
38732
+ });
38733
+ }, function (_wasThrown, _result) {
38734
+ isProcessingRef.current = false;
38735
+ if (pendingValuesRef.current) {
38736
+ if (timeoutRef.current) {
38737
+ clearTimeout(timeoutRef.current);
38738
+ }
38739
+ timeoutRef.current = setTimeout(function () {
38740
+ timeoutRef.current = null;
38741
+ var pendingValues = pendingValuesRef.current;
38742
+ if (pendingValues) {
38743
+ _handleSave(pendingValues);
38744
+ pendingValuesRef.current = null;
38745
+ }
38746
+ }, SAVE_TIME_INTERVAL_IN_MILLISECONDS);
38747
+ }
38748
+ if (_wasThrown) throw _result;
38749
+ return _result;
38750
+ });
38751
+ return Promise.resolve(_temp && _temp.then ? _temp.then(function () {}) : void 0);
38752
+ } catch (e) {
38753
+ return Promise.reject(e);
38754
+ }
38755
+ };
38756
+ React.useEffect(function () {
38757
+ var now = Date.now();
38758
+ if (valuesTextbook.current && !_$8.isEqual(values, valuesTextbook.current)) setLastEdited(now);
38759
+ if (!_$8.isEmpty(errors) || !valuesTextbook.current || !(selectedTextbook !== null && selectedTextbook !== void 0 && selectedTextbook.id)) return;
38760
+ if (valuesTextbook.current && _$8.isEqual(values, valuesTextbook.current)) return;
38761
+ if (isProcessingRef.current) {
38762
+ pendingValuesRef.current = _$8.cloneDeep(values);
38763
+ return;
38764
+ }
38765
+ var timeSinceLastRun = now - runTimeRef.current;
38766
+ var maxTime = SAVE_TIME_INTERVAL_IN_MILLISECONDS + SAVE_TIME_MAX_DIFF_IN_MILLISECONDS;
38767
+ if (timeSinceLastRun > maxTime) {
38768
+ runTimeRef.current = now;
38769
+ timeSinceLastRun = 0;
38770
+ }
38771
+ if (timeSinceLastRun >= SAVE_TIME_INTERVAL_IN_MILLISECONDS) {
38772
+ if (timeoutRef.current) {
38773
+ clearTimeout(timeoutRef.current);
38774
+ timeoutRef.current = null;
38775
+ pendingValuesRef.current = null;
38776
+ }
38777
+ _handleSave();
38778
+ } else {
38779
+ pendingValuesRef.current = _$8.cloneDeep(values);
38780
+ var intevalTime = SAVE_TIME_INTERVAL_IN_MILLISECONDS - timeSinceLastRun;
38781
+ timeoutRef.current = setTimeout(function () {
38782
+ timeoutRef.current = null;
38783
+ var pendingValues = pendingValuesRef.current;
38784
+ if (pendingValues) {
38785
+ clearTimeout(timeoutRef.current);
38786
+ _handleSave(pendingValues);
38787
+ pendingValuesRef.current = null;
38788
+ }
38789
+ }, intevalTime);
38790
+ }
38791
+ return function () {
38792
+ if (timeoutRef.current) {
38793
+ clearTimeout(timeoutRef.current);
38794
+ }
38795
+ };
38796
+ }, [values, errors]);
38569
38797
  var inforErrors = errors.coverImage || errors.grade || errors.isbn || errors.preparedType || errors.publicationDate || errors.publisher;
38570
38798
  var contentsErrors = errors.chapters;
38571
38799
  var textbookOwnersErrors = errors.textbookOwners;
38800
+ var hasError = !_$8.isEmpty(errors);
38801
+ var isSaved = !lastEdited || _$8.isEqual(values, (_valuesTextbook$curre = valuesTextbook.current) != null ? _valuesTextbook$curre : {});
38572
38802
  return React__default.createElement(formik.Form, null, React__default.createElement(material.Stack, {
38573
38803
  direction: "column",
38574
38804
  gap: 3
@@ -38656,7 +38886,45 @@ var PreparedTextbookForm = function PreparedTextbookForm(_ref) {
38656
38886
  }), React__default.createElement(material.FormLabel, {
38657
38887
  htmlFor: "type",
38658
38888
  className: "text-center"
38659
- }, i18n.t("math"))))), React__default.createElement(material.Box, null, React__default.createElement(material.Button, {
38889
+ }, i18n.t("math"))))), React__default.createElement(material.Stack, {
38890
+ flexDirection: "row",
38891
+ gap: "8px"
38892
+ }, !!(selectedTextbook !== null && selectedTextbook !== void 0 && selectedTextbook.id) && React__default.createElement(material.Stack, {
38893
+ padding: "6px 12px",
38894
+ sx: {
38895
+ transition: "opacity 0.3s ease",
38896
+ opacity: saveStatus === PrintStatus.Idle && isSaved ? 0 : 1,
38897
+ pointerEvents: "none",
38898
+ gap: "8px",
38899
+ flexDirection: "row",
38900
+ justifyContent: "center",
38901
+ alignItems: "center"
38902
+ }
38903
+ }, saveStatus === PrintStatus.Saving && React__default.createElement(ai.AiOutlineLoading3Quarters, {
38904
+ style: {
38905
+ animation: "spin 1s linear infinite"
38906
+ }
38907
+ }), saveStatus === PrintStatus.Saved && isSaved && React__default.createElement(io5.IoCheckmark, null), saveStatus !== PrintStatus.Saving && !isSaved && React__default.createElement(React.Fragment, null, hasError ? React__default.createElement(md.MdError, {
38908
+ color: red[900]
38909
+ }) : React__default.createElement(fa6.FaClockRotateLeft, {
38910
+ size: "14px"
38911
+ })), React__default.createElement(material.Typography, {
38912
+ sx: {
38913
+ color: theme.palette.grey[700],
38914
+ fontSize: "14px",
38915
+ display: "flex",
38916
+ alignItems: "center",
38917
+ gap: 1,
38918
+ "@keyframes spin": {
38919
+ "0%": {
38920
+ transform: "rotate(0deg)"
38921
+ },
38922
+ "100%": {
38923
+ transform: "rotate(360deg)"
38924
+ }
38925
+ }
38926
+ }
38927
+ }, saveStatus === PrintStatus.Saving && i18n.t("saving"), saveStatus === PrintStatus.Saved && isSaved && i18n.t("all_changes_saved"), saveStatus !== PrintStatus.Saving && !isSaved && i18n.t("all_changes_are_not_saved_yet"))), React__default.createElement(material.Button, {
38660
38928
  type: "submit",
38661
38929
  sx: {
38662
38930
  width: "fit-content"
@@ -38763,6 +39031,7 @@ var PreparedTextbookView = function PreparedTextbookView(_ref) {
38763
39031
  isSuperAdminUser = _useTextbookManagemen.isSuperAdminUser,
38764
39032
  isAdmin = _useTextbookManagemen.isAdmin,
38765
39033
  coverImage = _useTextbookManagemen.coverImage,
39034
+ handleSaveData = _useTextbookManagemen.handleSaveData,
38766
39035
  selectedTextbook = _useTextbookManagemen.selectedTextbook,
38767
39036
  handleSubmit = _useTextbookManagemen.handleSubmit,
38768
39037
  handleUploadImage = _useTextbookManagemen.handleUploadImage;
@@ -38785,7 +39054,9 @@ var PreparedTextbookView = function PreparedTextbookView(_ref) {
38785
39054
  isAdmin: isAdmin,
38786
39055
  isSuperAdmin: isSuperAdmin,
38787
39056
  selected: selected,
39057
+ handleSaveData: handleSaveData,
38788
39058
  textbookId: textbookId,
39059
+ selectedTextbook: selectedTextbook,
38789
39060
  onChangeTab: handleChangeTab,
38790
39061
  onUploadImage: handleUploadImage,
38791
39062
  coverImage: coverImage,
@@ -40302,6 +40573,491 @@ var singleLogo = function singleLogo(_ref) {
40302
40573
  }))));
40303
40574
  };
40304
40575
 
40576
+ var TimerItem = function TimerItem(_ref) {
40577
+ var data = _ref.data,
40578
+ seconds = _ref.seconds,
40579
+ loading = _ref.loading,
40580
+ activeTimerId = _ref.activeTimerId,
40581
+ onStartOrPauseTimer = _ref.onStartOrPauseTimer;
40582
+ var theme = material.useTheme();
40583
+ var _useTranslation = reactI18next.useTranslation(),
40584
+ t = _useTranslation.t;
40585
+ var handleStartOrPauseTimer = function handleStartOrPauseTimer() {
40586
+ onStartOrPauseTimer(data);
40587
+ };
40588
+ var isStarted = activeTimerId === data.id && data.status === exports.SubjectTimerStatus.Started;
40589
+ var displayedTime = React.useMemo(function () {
40590
+ switch (data.status) {
40591
+ case exports.SubjectTimerStatus.Started:
40592
+ return activeTimerId !== data.id ? formatTime$2(Math.floor(data.duration / 1000), t) : formatTime$2(seconds != null ? seconds : 0, t);
40593
+ case exports.SubjectTimerStatus.NotStarted:
40594
+ return t("press_to_start");
40595
+ default:
40596
+ return formatTime$2(Math.floor(data.duration / 1000), t);
40597
+ }
40598
+ }, [data.id, data.status, data.duration, seconds, activeTimerId, t]);
40599
+ return React__default.createElement(MenuItem, {
40600
+ className: "" + styles["timer-menu-item"],
40601
+ sx: {
40602
+ py: 1,
40603
+ bgcolor: theme.palette.background.paper,
40604
+ borderRadius: 0.75,
40605
+ minHeight: "52px"
40606
+ },
40607
+ disabled: loading,
40608
+ onClick: handleStartOrPauseTimer
40609
+ }, React__default.createElement(material.Stack, {
40610
+ direction: "row",
40611
+ gap: 1,
40612
+ sx: {
40613
+ justifyContent: "space-between",
40614
+ alignItems: "center",
40615
+ width: "100%"
40616
+ }
40617
+ }, React__default.createElement(material.Typography, {
40618
+ className: styles["subject-name"] + " " + styles["truncate"],
40619
+ fontSize: "14px",
40620
+ fontWeight: 600
40621
+ }, data.name), React__default.createElement(material.Box, {
40622
+ sx: {
40623
+ display: "flex",
40624
+ alignItems: "center",
40625
+ gap: 1.5
40626
+ }
40627
+ }, React__default.createElement(material.Typography, {
40628
+ className: "" + styles["duration"],
40629
+ sx: {
40630
+ color: isStarted ? theme.palette.common.black : theme.palette.success.light,
40631
+ fontSize: "14px",
40632
+ fontWeight: 700
40633
+ }
40634
+ }, displayedTime), !isStarted && React__default.createElement(material.Box, {
40635
+ className: "" + styles["icon-start"]
40636
+ }, React__default.createElement(io5.IoPlayCircleSharp, {
40637
+ size: 20
40638
+ })))));
40639
+ };
40640
+ var TOTAL_SECONDS_IN_A_MINUTE = 60;
40641
+ var TOTAL_SECONDS_IN_AN_HOUR = 60 * 60;
40642
+ var formatTime$2 = function formatTime(totalSeconds, t) {
40643
+ var hours = Math.floor(totalSeconds / TOTAL_SECONDS_IN_AN_HOUR);
40644
+ var minutes = Math.floor(totalSeconds % TOTAL_SECONDS_IN_AN_HOUR / TOTAL_SECONDS_IN_A_MINUTE);
40645
+ var seconds = totalSeconds % TOTAL_SECONDS_IN_A_MINUTE;
40646
+ if (hours > 0) {
40647
+ return "" + hours.toString().padStart(2, "0") + t("hour_h") + " " + minutes.toString().padStart(2, "0") + t("minutes") + " " + seconds.toString().padStart(2, "0") + t("seconds");
40648
+ }
40649
+ if (minutes > 0) {
40650
+ return "" + minutes.toString().padStart(2, "0") + t("minutes") + " " + seconds.toString().padStart(2, "0") + t("seconds");
40651
+ }
40652
+ return "" + seconds.toString().padStart(2, "0") + t("seconds");
40653
+ };
40654
+
40655
+ var TimerCountItem = function TimerCountItem(_ref) {
40656
+ var data = _ref.data,
40657
+ activeTimerId = _ref.activeTimerId,
40658
+ onChangeTime = _ref.onChangeTime;
40659
+ var requestAnimationRef = React.useRef(null);
40660
+ var user = reactRedux.useSelector(function (state) {
40661
+ var _state$common;
40662
+ return state === null || state === void 0 ? void 0 : (_state$common = state.common) === null || _state$common === void 0 ? void 0 : _state$common.user;
40663
+ });
40664
+ React.useEffect(function () {
40665
+ if (data.status !== exports.SubjectTimerStatus.Started || !(user !== null && user !== void 0 && user.academyDomain) && !(user !== null && user !== void 0 && user.isLearningSpace) || data.id !== activeTimerId) return;
40666
+ var _animate = function animate() {
40667
+ var startTime = data.startTime,
40668
+ lastResumeTime = data.lastResumeTime,
40669
+ duration = data.duration;
40670
+ var startOfTime = lastResumeTime !== DATE_TIME_MIN_VALUE ? lastResumeTime : startTime;
40671
+ if (startOfTime === DATE_TIME_MIN_VALUE) return;
40672
+ var time = getCountTime(startOfTime, Math.floor(duration / 1000));
40673
+ if (typeof time !== "number") {
40674
+ onChangeTime(data, undefined);
40675
+ return;
40676
+ }
40677
+ onChangeTime(data, time);
40678
+ requestAnimationRef.current = requestAnimationFrame(_animate);
40679
+ };
40680
+ requestAnimationRef.current = requestAnimationFrame(_animate);
40681
+ return function () {
40682
+ !!requestAnimationRef.current && cancelAnimationFrame(requestAnimationRef.current);
40683
+ };
40684
+ }, [JSON.stringify(data), user === null || user === void 0 ? void 0 : user.id, user === null || user === void 0 ? void 0 : user.academyDomain, user === null || user === void 0 ? void 0 : user.isLearningSpace, activeTimerId]);
40685
+ return React__default.createElement(React.Fragment, null);
40686
+ };
40687
+
40688
+ var formatDate = function formatDate(t, date) {
40689
+ return utcToLocalTime(date, t("date_format"));
40690
+ };
40691
+ var TimerDropdown = function TimerDropdown() {
40692
+ var _user$academyDomain$t, _user$academyDomain, _user$academyDomain$t2;
40693
+ var _useTranslation = reactI18next.useTranslation(),
40694
+ t = _useTranslation.t;
40695
+ var theme = material.useTheme();
40696
+ var user = reactRedux.useSelector(function (state) {
40697
+ var _state$common;
40698
+ return state === null || state === void 0 ? void 0 : (_state$common = state.common) === null || _state$common === void 0 ? void 0 : _state$common.user;
40699
+ });
40700
+ var _useState = React.useState(null),
40701
+ open = _useState[0],
40702
+ setOpen = _useState[1];
40703
+ var _useState2 = React.useState([]),
40704
+ timers = _useState2[0],
40705
+ setTimers = _useState2[1];
40706
+ var _useState3 = React.useState(),
40707
+ seconds = _useState3[0],
40708
+ setSeconds = _useState3[1];
40709
+ var _useState4 = React.useState(),
40710
+ activeTimerId = _useState4[0],
40711
+ setActiveTimerId = _useState4[1];
40712
+ var _useState5 = React.useState(false),
40713
+ loadingItem = _useState5[0],
40714
+ setLoadingItem = _useState5[1];
40715
+ var _useState6 = React.useState(false),
40716
+ isFetching = _useState6[0],
40717
+ setFetching = _useState6[1];
40718
+ var fetchedRef = React.useRef();
40719
+ var academyDomain = (_user$academyDomain$t = user === null || user === void 0 ? void 0 : (_user$academyDomain = user.academyDomain) === null || _user$academyDomain === void 0 ? void 0 : (_user$academyDomain$t2 = _user$academyDomain.toLowerCase) === null || _user$academyDomain$t2 === void 0 ? void 0 : _user$academyDomain$t2.call(_user$academyDomain)) != null ? _user$academyDomain$t : "";
40720
+ var handleChangeTime = function handleChangeTime(data, time) {
40721
+ if (!(user !== null && user !== void 0 && user.id) || !academyDomain && !(user !== null && user !== void 0 && user.isLearningSpace)) return;
40722
+ if (academyDomain !== fetchedRef.current && data.id !== activeTimerId) return;
40723
+ setSeconds(time);
40724
+ var key = user.id + "-" + data.id + "-" + SUBJECT_TIMER_KEY + academyDomain;
40725
+ saveDuration(key, time * 1000);
40726
+ };
40727
+ var handleOpen = function handleOpen(event) {
40728
+ setOpen(event.currentTarget);
40729
+ };
40730
+ var handleClose = function handleClose() {
40731
+ setOpen(null);
40732
+ };
40733
+ var handleStartOrPauseTimer = function handleStartOrPauseTimer(data) {
40734
+ try {
40735
+ var _temp2 = function _temp2(_result3) {
40736
+ if (_exit) return _result3;
40737
+ setLoadingItem(false);
40738
+ };
40739
+ var _exit = false;
40740
+ var isActive = activeTimerId === data.id;
40741
+ var isPaused = data.status === exports.SubjectTimerStatus.Paused;
40742
+ setLoadingItem(true);
40743
+ var _temp = _catch(function () {
40744
+ return Promise.resolve(handlePauseAllTimers(data.id)).then(function () {
40745
+ return function () {
40746
+ if (data.recordId) {
40747
+ return function () {
40748
+ if (!isActive && !isPaused) {
40749
+ setActiveTimerId(data.id);
40750
+ setTimers(function (timers) {
40751
+ return timers.map(function (timer) {
40752
+ return timer.id === data.id ? _extends({}, timer, {
40753
+ lastResumeTime: moment().utc().toISOString()
40754
+ }) : timer;
40755
+ });
40756
+ });
40757
+ setLoadingItem(false);
40758
+ _exit = true;
40759
+ } else {
40760
+ return Promise.resolve(pauseStudentSubjectApi(data.id, data.recordId, {
40761
+ status: isPaused ? exports.SubjectTimerStatus.Started : exports.SubjectTimerStatus.Paused,
40762
+ startTime: isPaused ? moment().utc().valueOf() : 0,
40763
+ pauseTime: !isPaused ? moment().utc().valueOf() : 0,
40764
+ duration: isActive && seconds ? seconds * 1000 : data.duration
40765
+ })).then(function (res) {
40766
+ setTimers(function (timers) {
40767
+ return timers.map(function (timer) {
40768
+ return timer.id === data.id ? res.data : timer;
40769
+ });
40770
+ });
40771
+ setActiveTimerId(!isPaused && isActive ? undefined : data.id);
40772
+ });
40773
+ }
40774
+ }();
40775
+ } else {
40776
+ return Promise.resolve(startStudentSubjectTimerApi(data.id)).then(function (res) {
40777
+ setTimers(function (timers) {
40778
+ return timers.map(function (timer) {
40779
+ return timer.id === data.id ? res.data : timer;
40780
+ });
40781
+ });
40782
+ setActiveTimerId(!isPaused && isActive ? undefined : data.id);
40783
+ });
40784
+ }
40785
+ }();
40786
+ });
40787
+ }, function () {
40788
+ reactToastify.toast.error(t(isPaused ? "failed_to_start_the_subject_name" : "failed_to_pause_the_subject_name", {
40789
+ name: data.name
40790
+ }));
40791
+ });
40792
+ return Promise.resolve(_temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp));
40793
+ } catch (e) {
40794
+ return Promise.reject(e);
40795
+ }
40796
+ };
40797
+ var handlePauseAllTimers = function handlePauseAllTimers(exceptId) {
40798
+ try {
40799
+ !exceptId && setLoadingItem(true);
40800
+ var tasks = timers.filter(function (i) {
40801
+ return i.status === exports.SubjectTimerStatus.Started && i.id !== exceptId;
40802
+ }).map(function (i) {
40803
+ return handlePauseTimer(i);
40804
+ });
40805
+ return Promise.resolve(Promise.all(tasks)).then(function () {
40806
+ !exceptId && setLoadingItem(false);
40807
+ });
40808
+ } catch (e) {
40809
+ return Promise.reject(e);
40810
+ }
40811
+ };
40812
+ var handlePauseTimer = function handlePauseTimer(data, updateState) {
40813
+ if (updateState === void 0) {
40814
+ updateState = true;
40815
+ }
40816
+ try {
40817
+ if (data.status === exports.SubjectTimerStatus.Paused) return Promise.resolve(data);
40818
+ return Promise.resolve(_catch(function () {
40819
+ return Promise.resolve(pauseStudentSubjectApi(data.id, data.recordId, {
40820
+ status: exports.SubjectTimerStatus.Paused,
40821
+ duration: activeTimerId === data.id && seconds ? seconds * 1000 : data.duration,
40822
+ pauseTime: moment().utc().valueOf()
40823
+ })).then(function (res) {
40824
+ if (updateState) setTimers(function (state) {
40825
+ return state.map(function (i) {
40826
+ return i.id === data.id ? res.data : i;
40827
+ });
40828
+ });
40829
+ return res.data;
40830
+ });
40831
+ }, function () {
40832
+ activeTimerId === data.id && reactToastify.toast.error(t("failed_to_pause_the_subject_name", {
40833
+ name: data.name
40834
+ }));
40835
+ }));
40836
+ } catch (e) {
40837
+ return Promise.reject(e);
40838
+ }
40839
+ };
40840
+ var getDataFromLocalStorage = React.useCallback(function (items) {
40841
+ if (fetchedRef.current !== academyDomain) return [];
40842
+ return items.map(function (item) {
40843
+ var key = (user === null || user === void 0 ? void 0 : user.id) + "-" + item.id + "-" + SUBJECT_TIMER_KEY + academyDomain;
40844
+ var duration = getLocalDuration(key, item);
40845
+ var lastResumeTime = moment().utc().toISOString();
40846
+ return _extends({}, item, {
40847
+ duration: duration !== null ? duration : item.duration,
40848
+ lastResumeTime: lastResumeTime
40849
+ });
40850
+ });
40851
+ }, [user === null || user === void 0 ? void 0 : user.id, academyDomain]);
40852
+ React.useEffect(function () {
40853
+ var fetchData = function fetchData() {
40854
+ try {
40855
+ var _temp4 = function _temp4() {
40856
+ setFetching(false);
40857
+ };
40858
+ if (!(user !== null && user !== void 0 && user.id) || !academyDomain && !(user !== null && user !== void 0 && user.isLearningSpace)) return Promise.resolve();
40859
+ if (fetchedRef.current == academyDomain && !open) return Promise.resolve();
40860
+ setFetching(true);
40861
+ var _temp3 = _catch(function () {
40862
+ return Promise.resolve(getStudentSubjectListApi()).then(function (res) {
40863
+ var _items$find;
40864
+ var _res$data$items = res.data.items,
40865
+ items = _res$data$items === void 0 ? [] : _res$data$items;
40866
+ fetchedRef.current = academyDomain;
40867
+ setTimers(getDataFromLocalStorage(items));
40868
+ setActiveTimerId((_items$find = items.find(function (i) {
40869
+ return i.status === exports.SubjectTimerStatus.Started;
40870
+ })) === null || _items$find === void 0 ? void 0 : _items$find.id);
40871
+ });
40872
+ }, function (error) {
40873
+ reactToastify.toast.error(getErrorMessage(t, error));
40874
+ });
40875
+ return Promise.resolve(_temp3 && _temp3.then ? _temp3.then(_temp4) : _temp4(_temp3));
40876
+ } catch (e) {
40877
+ return Promise.reject(e);
40878
+ }
40879
+ };
40880
+ fetchData();
40881
+ }, [t, getDataFromLocalStorage, user === null || user === void 0 ? void 0 : user.isLearningSpace, open]);
40882
+ var today = formatDate(t);
40883
+ var isRunning = timers.some(function (timer) {
40884
+ return timer.status === exports.SubjectTimerStatus.Started;
40885
+ });
40886
+ var selectedTimer = timers.find(function (i) {
40887
+ return i.id === activeTimerId;
40888
+ });
40889
+ return React__default.createElement(React.Fragment, null, React__default.createElement(IconButton, {
40890
+ onClick: handleOpen,
40891
+ sx: {
40892
+ width: 44,
40893
+ height: 44,
40894
+ mx: 1,
40895
+ borderRadius: "6px",
40896
+ padding: "8px",
40897
+ background: !isRunning ? grey[50] : green[100],
40898
+ "&: hover": {
40899
+ background: !isRunning ? grey[200] : green[200]
40900
+ }
40901
+ }
40902
+ }, React__default.createElement(material.Stack, {
40903
+ justifyContent: "center",
40904
+ alignItems: "center",
40905
+ width: "100%",
40906
+ height: "100%",
40907
+ sx: {
40908
+ borderRadius: "50%",
40909
+ backgroundColor: "#FFF"
40910
+ }
40911
+ }, React__default.createElement(io5.IoTimer, {
40912
+ color: !isRunning ? grey[700] : green[500],
40913
+ size: "16.25px"
40914
+ }))), selectedTimer && React__default.createElement(TimerCountItem, {
40915
+ data: selectedTimer,
40916
+ activeTimerId: activeTimerId,
40917
+ onChangeTime: handleChangeTime
40918
+ }), React__default.createElement(Popover, {
40919
+ open: !!open,
40920
+ anchorEl: open,
40921
+ onClose: handleClose,
40922
+ anchorOrigin: {
40923
+ vertical: "bottom",
40924
+ horizontal: "right"
40925
+ },
40926
+ transformOrigin: {
40927
+ vertical: "top",
40928
+ horizontal: "right"
40929
+ },
40930
+ slotProps: {
40931
+ paper: {
40932
+ sx: {
40933
+ px: 2,
40934
+ mt: 1,
40935
+ ml: 0.75,
40936
+ width: 320,
40937
+ borderRadius: 2,
40938
+ boxShadow: 3,
40939
+ bgcolor: theme.palette.grey[50]
40940
+ }
40941
+ }
40942
+ }
40943
+ }, React__default.createElement(material.Box, {
40944
+ sx: {
40945
+ py: 2,
40946
+ display: "flex",
40947
+ alignItems: "center",
40948
+ justifyContent: "space-between"
40949
+ }
40950
+ }, React__default.createElement(material.Box, {
40951
+ sx: {
40952
+ display: "flex",
40953
+ gap: 1,
40954
+ alignItems: "center"
40955
+ }
40956
+ }, React__default.createElement(material.Box, {
40957
+ display: "flex",
40958
+ alignItems: "center"
40959
+ }, React__default.createElement(io5.IoTimer, null)), React__default.createElement(material.Typography, {
40960
+ variant: "subtitle1",
40961
+ fontWeight: "bold",
40962
+ fontSize: "14px"
40963
+ }, t("study_timer"))), React__default.createElement(material.Typography, {
40964
+ color: "textSecondary",
40965
+ whiteSpace: "nowrap",
40966
+ fontSize: "14px"
40967
+ }, today)), React__default.createElement(material.Divider, {
40968
+ sx: {
40969
+ bgcolor: theme.palette.grey[700]
40970
+ }
40971
+ }), React__default.createElement(material.Stack, {
40972
+ className: "" + styles["timer-menu"],
40973
+ gap: 1.5,
40974
+ flexDirection: "column",
40975
+ sx: {
40976
+ py: 2,
40977
+ maxHeight: "360px"
40978
+ }
40979
+ }, !isFetching && React__default.createElement(ListView, {
40980
+ data: timers,
40981
+ render: function render(item, index) {
40982
+ return React__default.createElement(TimerItem, {
40983
+ key: index,
40984
+ data: item,
40985
+ loading: loadingItem,
40986
+ seconds: activeTimerId === item.id ? seconds : undefined,
40987
+ activeTimerId: activeTimerId,
40988
+ onStartOrPauseTimer: handleStartOrPauseTimer
40989
+ });
40990
+ }
40991
+ }), isFetching && React__default.createElement(material.Stack, {
40992
+ sx: {
40993
+ width: "100%",
40994
+ py: 2
40995
+ },
40996
+ justifyContent: "center",
40997
+ alignItems: "center"
40998
+ }, React__default.createElement(material.Typography, {
40999
+ className: "text-muted"
41000
+ }, React__default.createElement(material.CircularProgress, {
41001
+ size: "16px",
41002
+ color: "success"
41003
+ }))), !timers.length && !isFetching && React__default.createElement(material.Box, null, React__default.createElement(material.Typography, {
41004
+ className: "text-muted"
41005
+ }, t("no_data")))), React__default.createElement(material.Divider, {
41006
+ sx: {
41007
+ bgcolor: theme.palette.grey[700]
41008
+ }
41009
+ }), React__default.createElement(material.Box, {
41010
+ sx: {
41011
+ p: 2,
41012
+ textAlign: "right"
41013
+ }
41014
+ }, React__default.createElement(material.Button, {
41015
+ disableTouchRipple: true,
41016
+ onClick: function onClick() {
41017
+ return handlePauseAllTimers();
41018
+ },
41019
+ disabled: loadingItem,
41020
+ sx: {
41021
+ fontWeight: 700,
41022
+ color: theme.palette.success.main,
41023
+ padding: "8px 12px",
41024
+ bgcolor: theme.palette.background.paper,
41025
+ "&:hover": {
41026
+ bgcolor: theme.palette.grey[200]
41027
+ },
41028
+ "&:disabled": {
41029
+ opacity: 0.5
41030
+ }
41031
+ }
41032
+ }, loadingItem ? t("saving") : t("pause")))));
41033
+ };
41034
+ var SUBJECT_TIMER_KEY = "stk";
41035
+ var saveDuration = function saveDuration(key, duration) {
41036
+ localStorage.setItem(key, "" + duration);
41037
+ };
41038
+ var getLocalDuration = function getLocalDuration(key, timer) {
41039
+ try {
41040
+ var res = localStorage.getItem(key);
41041
+ var duration = +(res != null ? res : "");
41042
+ if (!duration || Number.isNaN(duration) || duration <= timer.duration) return null;
41043
+ return duration;
41044
+ } catch (error) {
41045
+ return null;
41046
+ }
41047
+ };
41048
+
41049
+ var HeaderLink = function HeaderLink(_ref) {
41050
+ var data = _ref.data,
41051
+ render = _ref.render;
41052
+ var activePaths = data.activePaths,
41053
+ path = data.path;
41054
+ var pathname = window.location.pathname.toLowerCase();
41055
+ var isActive = (activePaths === null || activePaths === void 0 ? void 0 : activePaths.some(function (a) {
41056
+ return pathname.startsWith(a);
41057
+ })) || pathname.startsWith(path);
41058
+ return React__default.createElement(React.Fragment, null, render(data, isActive));
41059
+ };
41060
+
40305
41061
  var Header = function Header(_ref) {
40306
41062
  var academyListRoute = _ref.academyListRoute,
40307
41063
  homeRoute = _ref.homeRoute,
@@ -40424,7 +41180,9 @@ var Header = function Header(_ref) {
40424
41180
  justifyContent: "center",
40425
41181
  height: "100%",
40426
41182
  className: styles["logo"] + " d-flex d-lg-none"
40427
- }, React__default.createElement(singleLogo, null))), React__default.createElement(material.Stack, {
41183
+ }, React__default.createElement(singleLogo, null))), !isTeacherSide && React__default.createElement(material.Stack, {
41184
+ className: "me-2 ms-2"
41185
+ }, React__default.createElement(TimerDropdown, null)), React__default.createElement(material.Stack, {
40428
41186
  className: "me-2",
40429
41187
  display: "none"
40430
41188
  }, React__default.createElement(TheLanguageDropdown, null)), showAnnouncement && renderNotificationLink && React__default.createElement(AnnouncementContainer, {
@@ -40433,17 +41191,6 @@ var Header = function Header(_ref) {
40433
41191
  renderViewNoteLink: renderViewNoteLink
40434
41192
  })));
40435
41193
  };
40436
- var HeaderLink = function HeaderLink(_ref3) {
40437
- var data = _ref3.data,
40438
- render = _ref3.render;
40439
- var activePaths = data.activePaths,
40440
- path = data.path;
40441
- var pathname = location.pathname.toLowerCase();
40442
- var isActive = (activePaths === null || activePaths === void 0 ? void 0 : activePaths.some(function (a) {
40443
- return pathname.startsWith(a);
40444
- })) || pathname.startsWith(path);
40445
- return React__default.createElement(React.Fragment, null, render(data, isActive));
40446
- };
40447
41194
 
40448
41195
  var useLayoutContext = function useLayoutContext(role, showLoadingAcademy, domain) {
40449
41196
  var _currentPusher$connec2;
@@ -40828,6 +41575,7 @@ exports.formatTime = formatTime;
40828
41575
  exports.formatTimeSecond = formatTimeSecond;
40829
41576
  exports.getAcademyDomain = getAcademyDomain;
40830
41577
  exports.getAccessToken = getAccessToken;
41578
+ exports.getCountTime = getCountTime;
40831
41579
  exports.getErrorMessage = getErrorMessage;
40832
41580
  exports.getLanguage = getLanguage;
40833
41581
  exports.getLearningSpace = getLearningSpace;