touchstudy-core 0.1.175 → 0.1.176

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: {
@@ -6263,6 +6326,12 @@ var HighSchoolGrade;
6263
6326
  TextbookEditorType[TextbookEditorType["Korea"] = 1] = "Korea";
6264
6327
  TextbookEditorType[TextbookEditorType["Math"] = 2] = "Math";
6265
6328
  })(exports.TextbookEditorType || (exports.TextbookEditorType = {}));
6329
+ var PrintStatus;
6330
+ (function (PrintStatus) {
6331
+ PrintStatus[PrintStatus["Idle"] = 0] = "Idle";
6332
+ PrintStatus[PrintStatus["Saving"] = 1] = "Saving";
6333
+ PrintStatus[PrintStatus["Saved"] = 2] = "Saved";
6334
+ })(PrintStatus || (PrintStatus = {}));
6266
6335
 
6267
6336
  (function (SchoolType) {
6268
6337
  SchoolType[SchoolType["Default"] = 0] = "Default";
@@ -6271,6 +6340,12 @@ var HighSchoolGrade;
6271
6340
  SchoolType[SchoolType["High"] = 3] = "High";
6272
6341
  })(exports.SchoolType || (exports.SchoolType = {}));
6273
6342
 
6343
+ (function (SubjectTimerStatus) {
6344
+ SubjectTimerStatus[SubjectTimerStatus["NotStarted"] = 0] = "NotStarted";
6345
+ SubjectTimerStatus[SubjectTimerStatus["Started"] = 1] = "Started";
6346
+ SubjectTimerStatus[SubjectTimerStatus["Paused"] = 2] = "Paused";
6347
+ })(exports.SubjectTimerStatus || (exports.SubjectTimerStatus = {}));
6348
+
6274
6349
  var canAccess = function canAccess(userRoles, componentRoles) {
6275
6350
  if (!Array.isArray(userRoles)) {
6276
6351
  return false;
@@ -6520,6 +6595,11 @@ var getRemainTime = function getRemainTime(startTime, duration) {
6520
6595
  if (timePass > durationInNumber) return 0;
6521
6596
  return durationInNumber - timePass;
6522
6597
  };
6598
+ var getCountTime = function getCountTime(startTime, duration) {
6599
+ var timePass = diffFromNow(startTime, "second");
6600
+ if (typeof timePass !== "number") return null;
6601
+ return duration + timePass;
6602
+ };
6523
6603
 
6524
6604
  var formatDateTime = function formatDateTime(inputDate) {
6525
6605
  var date = new Date(inputDate);
@@ -8244,6 +8324,27 @@ var getSubjectListApi = function getSubjectListApi(textSearch) {
8244
8324
  return Promise.reject(e);
8245
8325
  }
8246
8326
  };
8327
+ var getStudentSubjectListApi = function getStudentSubjectListApi() {
8328
+ try {
8329
+ return Promise.resolve(api.get(SUBJECT_URL + "/timers"));
8330
+ } catch (e) {
8331
+ return Promise.reject(e);
8332
+ }
8333
+ };
8334
+ var startStudentSubjectTimerApi = function startStudentSubjectTimerApi(subjectId) {
8335
+ try {
8336
+ return Promise.resolve(api.post(SUBJECT_URL + "/" + subjectId + "/timers"));
8337
+ } catch (e) {
8338
+ return Promise.reject(e);
8339
+ }
8340
+ };
8341
+ var pauseStudentSubjectApi = function pauseStudentSubjectApi(subjectId, recordId, data) {
8342
+ try {
8343
+ return Promise.resolve(api.post(SUBJECT_URL + "/" + subjectId + "/timers/" + recordId, data));
8344
+ } catch (e) {
8345
+ return Promise.reject(e);
8346
+ }
8347
+ };
8247
8348
 
8248
8349
  var SubjectSelector = function SubjectSelector(_ref) {
8249
8350
  var value = _ref.value,
@@ -10313,6 +10414,7 @@ var grey = {
10313
10414
  var green = {
10314
10415
  0: '#FFFFFF',
10315
10416
  100: '#F0FFF6',
10417
+ 200: '#D2FFE4',
10316
10418
  300: '#89F0B2',
10317
10419
  500: '#3DC674',
10318
10420
  700: '#349056',
@@ -33862,11 +33964,11 @@ var TextbookRow = function TextbookRow(_ref) {
33862
33964
  });
33863
33965
  var _useTranslation = reactI18next.useTranslation(),
33864
33966
  t = _useTranslation.t;
33865
- 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) {
33967
+ 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) {
33866
33968
  var _infoUser$email, _infoUser$email$trim;
33867
33969
  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);
33868
- })))) && data.totalUses <= 0;
33869
- 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;
33970
+ })));
33971
+ 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);
33870
33972
  var isSharable = !data.isPublic && data.isShared && onAcademy && (isAdminSite || isSuperAdminUser || !isAdmin && data.createdBy.id === infoUser.id);
33871
33973
  var handleUpdateTextbook = function handleUpdateTextbook() {
33872
33974
  onUpdateTextbook(data);
@@ -34887,10 +34989,10 @@ var useTextbookManagement = function useTextbookManagement(_ref) {
34887
34989
  var isAdminSite = role === exports.Role.Admin;
34888
34990
  var onAcademy = !!(user !== null && user !== void 0 && user.academyDomain);
34889
34991
  var isSuperAdminUser = !!user && user.isSuperAdmin;
34890
- 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) {
34992
+ 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) {
34891
34993
  var _user$email, _user$email$trim;
34892
34994
  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);
34893
- }))) && selectedTextbook.totalUses <= 0;
34995
+ }));
34894
34996
  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);
34895
34997
  var handleOpenConfirmDeleteChapterDialog = function handleOpenConfirmDeleteChapterDialog(chapter) {
34896
34998
  setSelectedChapter(chapter);
@@ -34992,6 +35094,24 @@ var useTextbookManagement = function useTextbookManagement(_ref) {
34992
35094
  return Promise.reject(e);
34993
35095
  }
34994
35096
  };
35097
+ var handleSaveData = React.useCallback(function (values) {
35098
+ try {
35099
+ if (!coverImage && !(values !== null && values !== void 0 && values.coverImage)) {
35100
+ return Promise.resolve();
35101
+ }
35102
+ return Promise.resolve(_catch(function () {
35103
+ var coverImg = coverImage || (values === null || values === void 0 ? void 0 : values.coverImage);
35104
+ return Promise.resolve(updateTextbookApi$1(_extends({}, values, {
35105
+ coverImage: coverImg
35106
+ }), (selectedTextbook === null || selectedTextbook === void 0 ? void 0 : selectedTextbook.id) || 0, isSuperAdmin)).then(function () {});
35107
+ }, function (error) {
35108
+ reactToastify.toast.error(getErrorMessage(t, error));
35109
+ throw error;
35110
+ }));
35111
+ } catch (e) {
35112
+ return Promise.reject(e);
35113
+ }
35114
+ }, [coverImage, isSuperAdmin, JSON.stringify(selectedTextbook)]);
34995
35115
  React.useEffect(function () {
34996
35116
  if (!textbookId) return;
34997
35117
  handleGetTextbookDetail();
@@ -35010,6 +35130,7 @@ var useTextbookManagement = function useTextbookManagement(_ref) {
35010
35130
  isSuperAdminUser: isSuperAdminUser,
35011
35131
  openDialog: openDialog,
35012
35132
  handleSubmit: handleSubmit,
35133
+ handleSaveData: handleSaveData,
35013
35134
  selectedTextbook: selectedTextbook,
35014
35135
  handleOpenDialog: handleOpenDialog,
35015
35136
  handleCloseDialog: handleCloseDialog,
@@ -35303,6 +35424,8 @@ var CompareTypeOptions = [{
35303
35424
  label: "synonym_processing",
35304
35425
  value: exports.QuestionAnswerType.SynonymProcessing
35305
35426
  }];
35427
+ var SAVE_TIME_INTERVAL_IN_MILLISECONDS = 60 * 1000;
35428
+ var SAVE_TIME_MAX_DIFF_IN_MILLISECONDS = 1000;
35306
35429
 
35307
35430
  var CustomTextbookTab = function CustomTextbookTab(props) {
35308
35431
  var children = props.children,
@@ -38478,8 +38601,9 @@ var TextbookOwnersTab = function TextbookOwnersTab(_ref) {
38478
38601
  }));
38479
38602
  };
38480
38603
 
38481
- var _excluded$m = ["isCreatedByAdmin", "isSuperAdminUser", "isSuperAdmin", "isAdmin", "textbookId", "selected", "coverImage", "disabled", "ownersDisabled", "onChangeTab", "onUploadImage"];
38604
+ var _excluded$m = ["isCreatedByAdmin", "isSuperAdminUser", "isSuperAdmin", "isAdmin", "textbookId", "selected", "coverImage", "disabled", "ownersDisabled", "selectedTextbook", "handleSaveData", "onChangeTab", "onUploadImage"];
38482
38605
  var PreparedTextbookForm = function PreparedTextbookForm(_ref) {
38606
+ var _valuesTextbook$curre;
38483
38607
  var isCreatedByAdmin = _ref.isCreatedByAdmin,
38484
38608
  isSuperAdminUser = _ref.isSuperAdminUser,
38485
38609
  isSuperAdmin = _ref.isSuperAdmin,
@@ -38489,6 +38613,8 @@ var PreparedTextbookForm = function PreparedTextbookForm(_ref) {
38489
38613
  coverImage = _ref.coverImage,
38490
38614
  disabled = _ref.disabled,
38491
38615
  ownersDisabled = _ref.ownersDisabled,
38616
+ selectedTextbook = _ref.selectedTextbook,
38617
+ handleSaveData = _ref.handleSaveData,
38492
38618
  onChangeTab = _ref.onChangeTab,
38493
38619
  onUploadImage = _ref.onUploadImage,
38494
38620
  formikProps = _objectWithoutPropertiesLoose(_ref, _excluded$m);
@@ -38497,6 +38623,20 @@ var PreparedTextbookForm = function PreparedTextbookForm(_ref) {
38497
38623
  dirty = formikProps.dirty,
38498
38624
  submitCount = formikProps.submitCount,
38499
38625
  setValues = formikProps.setValues;
38626
+ var theme = material.useTheme();
38627
+ var savedRunRef = React.useRef(Date.now());
38628
+ var runTimeRef = React.useRef(Date.now());
38629
+ var valuesTextbook = React.useRef(null);
38630
+ var isFirstLoadRef = React.useRef(true);
38631
+ var _React$useState = React__default.useState(PrintStatus.Idle),
38632
+ saveStatus = _React$useState[0],
38633
+ setSaveStatus = _React$useState[1];
38634
+ var timeoutRef = React.useRef(null);
38635
+ var isProcessingRef = React.useRef(false);
38636
+ var pendingValuesRef = React.useRef(null);
38637
+ var _useState = React.useState(),
38638
+ lastEdited = _useState[0],
38639
+ setLastEdited = _useState[1];
38500
38640
  React.useEffect(function () {
38501
38641
  var handleBeforeUnload = function handleBeforeUnload(event) {
38502
38642
  var message = i18n.t("are_you_sure_you_want_to_quit_yours_changes_may_not_be_saved");
@@ -38517,9 +38657,99 @@ var PreparedTextbookForm = function PreparedTextbookForm(_ref) {
38517
38657
  var newValues = _resetAllCategoriesAndQuestionTypesBySubject(values, val);
38518
38658
  setValues(newValues);
38519
38659
  };
38660
+ React.useEffect(function () {
38661
+ if (!valuesTextbook.current && isFirstLoadRef.current && !_$8.isEqual(values, DEFAULT_TEXTBOOK_REQUEST)) {
38662
+ valuesTextbook.current = _$8.cloneDeep(values);
38663
+ isFirstLoadRef.current = false;
38664
+ }
38665
+ }, [values]);
38666
+ var _handleSave = function handleSave(valuesProps) {
38667
+ try {
38668
+ var _temp = _finallyRethrows(function () {
38669
+ return _catch(function () {
38670
+ isProcessingRef.current = true;
38671
+ setSaveStatus(PrintStatus.Saving);
38672
+ var valuesToSave = valuesProps || values;
38673
+ return Promise.resolve(handleSaveData(valuesToSave)).then(function () {
38674
+ valuesTextbook.current = _$8.cloneDeep(valuesToSave);
38675
+ var now = Date.now();
38676
+ savedRunRef.current = now;
38677
+ runTimeRef.current = now;
38678
+ setSaveStatus(PrintStatus.Saved);
38679
+ });
38680
+ }, function (error) {
38681
+ setSaveStatus(PrintStatus.Idle);
38682
+ console.error(error);
38683
+ });
38684
+ }, function (_wasThrown, _result) {
38685
+ isProcessingRef.current = false;
38686
+ if (pendingValuesRef.current) {
38687
+ if (timeoutRef.current) {
38688
+ clearTimeout(timeoutRef.current);
38689
+ }
38690
+ timeoutRef.current = setTimeout(function () {
38691
+ timeoutRef.current = null;
38692
+ var pendingValues = pendingValuesRef.current;
38693
+ if (pendingValues) {
38694
+ _handleSave(pendingValues);
38695
+ pendingValuesRef.current = null;
38696
+ }
38697
+ }, SAVE_TIME_INTERVAL_IN_MILLISECONDS);
38698
+ }
38699
+ if (_wasThrown) throw _result;
38700
+ return _result;
38701
+ });
38702
+ return Promise.resolve(_temp && _temp.then ? _temp.then(function () {}) : void 0);
38703
+ } catch (e) {
38704
+ return Promise.reject(e);
38705
+ }
38706
+ };
38707
+ React.useEffect(function () {
38708
+ var now = Date.now();
38709
+ if (valuesTextbook.current && !_$8.isEqual(values, valuesTextbook.current)) setLastEdited(now);
38710
+ if (!_$8.isEmpty(errors) || !valuesTextbook.current || !(selectedTextbook !== null && selectedTextbook !== void 0 && selectedTextbook.id)) return;
38711
+ if (valuesTextbook.current && _$8.isEqual(values, valuesTextbook.current)) return;
38712
+ if (isProcessingRef.current) {
38713
+ pendingValuesRef.current = _$8.cloneDeep(values);
38714
+ return;
38715
+ }
38716
+ var timeSinceLastRun = now - runTimeRef.current;
38717
+ var maxTime = SAVE_TIME_INTERVAL_IN_MILLISECONDS + SAVE_TIME_MAX_DIFF_IN_MILLISECONDS;
38718
+ if (timeSinceLastRun > maxTime) {
38719
+ runTimeRef.current = now;
38720
+ timeSinceLastRun = 0;
38721
+ }
38722
+ if (timeSinceLastRun >= SAVE_TIME_INTERVAL_IN_MILLISECONDS) {
38723
+ if (timeoutRef.current) {
38724
+ clearTimeout(timeoutRef.current);
38725
+ timeoutRef.current = null;
38726
+ pendingValuesRef.current = null;
38727
+ }
38728
+ _handleSave();
38729
+ } else {
38730
+ pendingValuesRef.current = _$8.cloneDeep(values);
38731
+ var intevalTime = SAVE_TIME_INTERVAL_IN_MILLISECONDS - timeSinceLastRun;
38732
+ timeoutRef.current = setTimeout(function () {
38733
+ timeoutRef.current = null;
38734
+ var pendingValues = pendingValuesRef.current;
38735
+ if (pendingValues) {
38736
+ clearTimeout(timeoutRef.current);
38737
+ _handleSave(pendingValues);
38738
+ pendingValuesRef.current = null;
38739
+ }
38740
+ }, intevalTime);
38741
+ }
38742
+ return function () {
38743
+ if (timeoutRef.current) {
38744
+ clearTimeout(timeoutRef.current);
38745
+ }
38746
+ };
38747
+ }, [values, errors]);
38520
38748
  var inforErrors = errors.coverImage || errors.grade || errors.isbn || errors.preparedType || errors.publicationDate || errors.publisher;
38521
38749
  var contentsErrors = errors.chapters;
38522
38750
  var textbookOwnersErrors = errors.textbookOwners;
38751
+ var hasError = !_$8.isEmpty(errors);
38752
+ var isSaved = !lastEdited || _$8.isEqual(values, (_valuesTextbook$curre = valuesTextbook.current) != null ? _valuesTextbook$curre : {});
38523
38753
  return React__default.createElement(formik.Form, null, React__default.createElement(material.Stack, {
38524
38754
  direction: "column",
38525
38755
  gap: 3
@@ -38607,7 +38837,45 @@ var PreparedTextbookForm = function PreparedTextbookForm(_ref) {
38607
38837
  }), React__default.createElement(material.FormLabel, {
38608
38838
  htmlFor: "type",
38609
38839
  className: "text-center"
38610
- }, i18n.t("math"))))), React__default.createElement(material.Box, null, React__default.createElement(material.Button, {
38840
+ }, i18n.t("math"))))), React__default.createElement(material.Stack, {
38841
+ flexDirection: "row",
38842
+ gap: "8px"
38843
+ }, React__default.createElement(material.Stack, {
38844
+ padding: "6px 12px",
38845
+ sx: {
38846
+ transition: "opacity 0.3s ease",
38847
+ opacity: saveStatus === PrintStatus.Idle && isSaved ? 0 : 1,
38848
+ pointerEvents: "none",
38849
+ gap: "8px",
38850
+ flexDirection: "row",
38851
+ justifyContent: "center",
38852
+ alignItems: "center"
38853
+ }
38854
+ }, saveStatus === PrintStatus.Saving && React__default.createElement(ai.AiOutlineLoading3Quarters, {
38855
+ style: {
38856
+ animation: "spin 1s linear infinite"
38857
+ }
38858
+ }), 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, {
38859
+ color: red[900]
38860
+ }) : React__default.createElement(fa6.FaClockRotateLeft, {
38861
+ size: "14px"
38862
+ })), React__default.createElement(material.Typography, {
38863
+ sx: {
38864
+ color: theme.palette.grey[700],
38865
+ fontSize: "14px",
38866
+ display: "flex",
38867
+ alignItems: "center",
38868
+ gap: 1,
38869
+ "@keyframes spin": {
38870
+ "0%": {
38871
+ transform: "rotate(0deg)"
38872
+ },
38873
+ "100%": {
38874
+ transform: "rotate(360deg)"
38875
+ }
38876
+ }
38877
+ }
38878
+ }, saveStatus === PrintStatus.Saving && i18n.t("saving"), saveStatus === PrintStatus.Saved && isSaved && i18n.t("all_changes_saved"), saveStatus !== PrintStatus.Saving && (selectedTextbook === null || selectedTextbook === void 0 ? void 0 : selectedTextbook.id) && !isSaved && i18n.t("all_changes_are_not_saved_yet"))), React__default.createElement(material.Button, {
38611
38879
  type: "submit",
38612
38880
  sx: {
38613
38881
  width: "fit-content"
@@ -38714,6 +38982,7 @@ var PreparedTextbookView = function PreparedTextbookView(_ref) {
38714
38982
  isSuperAdminUser = _useTextbookManagemen.isSuperAdminUser,
38715
38983
  isAdmin = _useTextbookManagemen.isAdmin,
38716
38984
  coverImage = _useTextbookManagemen.coverImage,
38985
+ handleSaveData = _useTextbookManagemen.handleSaveData,
38717
38986
  selectedTextbook = _useTextbookManagemen.selectedTextbook,
38718
38987
  handleSubmit = _useTextbookManagemen.handleSubmit,
38719
38988
  handleUploadImage = _useTextbookManagemen.handleUploadImage;
@@ -38736,7 +39005,9 @@ var PreparedTextbookView = function PreparedTextbookView(_ref) {
38736
39005
  isAdmin: isAdmin,
38737
39006
  isSuperAdmin: isSuperAdmin,
38738
39007
  selected: selected,
39008
+ handleSaveData: handleSaveData,
38739
39009
  textbookId: textbookId,
39010
+ selectedTextbook: selectedTextbook,
38740
39011
  onChangeTab: handleChangeTab,
38741
39012
  onUploadImage: handleUploadImage,
38742
39013
  coverImage: coverImage,
@@ -39598,7 +39869,7 @@ var TheAcademyDropdown = function TheAcademyDropdown(_ref) {
39598
39869
  var handleGoToMainPage = function handleGoToMainPage() {
39599
39870
  if (!user) return;
39600
39871
  var isAcademy = user.academyDomain || user.isLearningSpace;
39601
- var mainUrl = !isAcademy ? homeAcademyUrl : homeUrl;
39872
+ var mainUrl = isAcademy ? homeAcademyUrl : homeUrl;
39602
39873
  pushTo(history, mainUrl);
39603
39874
  };
39604
39875
  var handleImageError = function handleImageError() {
@@ -40253,6 +40524,491 @@ var singleLogo = function singleLogo(_ref) {
40253
40524
  }))));
40254
40525
  };
40255
40526
 
40527
+ var TimerItem = function TimerItem(_ref) {
40528
+ var data = _ref.data,
40529
+ seconds = _ref.seconds,
40530
+ loading = _ref.loading,
40531
+ activeTimerId = _ref.activeTimerId,
40532
+ onStartOrPauseTimer = _ref.onStartOrPauseTimer;
40533
+ var theme = material.useTheme();
40534
+ var _useTranslation = reactI18next.useTranslation(),
40535
+ t = _useTranslation.t;
40536
+ var handleStartOrPauseTimer = function handleStartOrPauseTimer() {
40537
+ onStartOrPauseTimer(data);
40538
+ };
40539
+ var isStarted = activeTimerId === data.id && data.status === exports.SubjectTimerStatus.Started;
40540
+ var displayedTime = React.useMemo(function () {
40541
+ switch (data.status) {
40542
+ case exports.SubjectTimerStatus.Started:
40543
+ return activeTimerId !== data.id ? formatTime$2(Math.floor(data.duration / 1000), t) : formatTime$2(seconds != null ? seconds : 0, t);
40544
+ case exports.SubjectTimerStatus.NotStarted:
40545
+ return t("press_to_start");
40546
+ default:
40547
+ return formatTime$2(Math.floor(data.duration / 1000), t);
40548
+ }
40549
+ }, [data.id, data.status, data.duration, seconds, activeTimerId, t]);
40550
+ return React__default.createElement(MenuItem, {
40551
+ className: "" + styles["timer-menu-item"],
40552
+ sx: {
40553
+ py: 1,
40554
+ bgcolor: theme.palette.background.paper,
40555
+ borderRadius: 0.75,
40556
+ minHeight: "52px"
40557
+ },
40558
+ disabled: loading,
40559
+ onClick: handleStartOrPauseTimer
40560
+ }, React__default.createElement(material.Stack, {
40561
+ direction: "row",
40562
+ gap: 1,
40563
+ sx: {
40564
+ justifyContent: "space-between",
40565
+ alignItems: "center",
40566
+ width: "100%"
40567
+ }
40568
+ }, React__default.createElement(material.Typography, {
40569
+ className: styles["subject-name"] + " " + styles["truncate"],
40570
+ fontSize: "14px",
40571
+ fontWeight: 600
40572
+ }, data.name), React__default.createElement(material.Box, {
40573
+ sx: {
40574
+ display: "flex",
40575
+ alignItems: "center",
40576
+ gap: 1.5
40577
+ }
40578
+ }, React__default.createElement(material.Typography, {
40579
+ className: "" + styles["duration"],
40580
+ sx: {
40581
+ color: isStarted ? theme.palette.common.black : theme.palette.success.light,
40582
+ fontSize: "14px",
40583
+ fontWeight: 700
40584
+ }
40585
+ }, displayedTime), !isStarted && React__default.createElement(material.Box, {
40586
+ className: "" + styles["icon-start"]
40587
+ }, React__default.createElement(io5.IoPlayCircleSharp, {
40588
+ size: 20
40589
+ })))));
40590
+ };
40591
+ var TOTAL_SECONDS_IN_A_MINUTE = 60;
40592
+ var TOTAL_SECONDS_IN_AN_HOUR = 60 * 60;
40593
+ var formatTime$2 = function formatTime(totalSeconds, t) {
40594
+ var hours = Math.floor(totalSeconds / TOTAL_SECONDS_IN_AN_HOUR);
40595
+ var minutes = Math.floor(totalSeconds % TOTAL_SECONDS_IN_AN_HOUR / TOTAL_SECONDS_IN_A_MINUTE);
40596
+ var seconds = totalSeconds % TOTAL_SECONDS_IN_A_MINUTE;
40597
+ if (hours > 0) {
40598
+ return "" + hours.toString().padStart(2, "0") + t("hour_h") + " " + minutes.toString().padStart(2, "0") + t("minutes") + " " + seconds.toString().padStart(2, "0") + t("seconds");
40599
+ }
40600
+ if (minutes > 0) {
40601
+ return "" + minutes.toString().padStart(2, "0") + t("minutes") + " " + seconds.toString().padStart(2, "0") + t("seconds");
40602
+ }
40603
+ return "" + seconds.toString().padStart(2, "0") + t("seconds");
40604
+ };
40605
+
40606
+ var TimerCountItem = function TimerCountItem(_ref) {
40607
+ var data = _ref.data,
40608
+ activeTimerId = _ref.activeTimerId,
40609
+ onChangeTime = _ref.onChangeTime;
40610
+ var requestAnimationRef = React.useRef(null);
40611
+ var user = reactRedux.useSelector(function (state) {
40612
+ var _state$common;
40613
+ return state === null || state === void 0 ? void 0 : (_state$common = state.common) === null || _state$common === void 0 ? void 0 : _state$common.user;
40614
+ });
40615
+ React.useEffect(function () {
40616
+ if (data.status !== exports.SubjectTimerStatus.Started || !(user !== null && user !== void 0 && user.academyDomain) && !(user !== null && user !== void 0 && user.isLearningSpace) || data.id !== activeTimerId) return;
40617
+ var _animate = function animate() {
40618
+ var startTime = data.startTime,
40619
+ lastResumeTime = data.lastResumeTime,
40620
+ duration = data.duration;
40621
+ var startOfTime = lastResumeTime !== DATE_TIME_MIN_VALUE ? lastResumeTime : startTime;
40622
+ if (startOfTime === DATE_TIME_MIN_VALUE) return;
40623
+ var time = getCountTime(startOfTime, Math.floor(duration / 1000));
40624
+ if (typeof time !== "number") {
40625
+ onChangeTime(data, undefined);
40626
+ return;
40627
+ }
40628
+ onChangeTime(data, time);
40629
+ requestAnimationRef.current = requestAnimationFrame(_animate);
40630
+ };
40631
+ requestAnimationRef.current = requestAnimationFrame(_animate);
40632
+ return function () {
40633
+ !!requestAnimationRef.current && cancelAnimationFrame(requestAnimationRef.current);
40634
+ };
40635
+ }, [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]);
40636
+ return React__default.createElement(React.Fragment, null);
40637
+ };
40638
+
40639
+ var formatDate = function formatDate(t, date) {
40640
+ return utcToLocalTime(date, t("date_format"));
40641
+ };
40642
+ var TimerDropdown = function TimerDropdown() {
40643
+ var _user$academyDomain$t, _user$academyDomain, _user$academyDomain$t2;
40644
+ var _useTranslation = reactI18next.useTranslation(),
40645
+ t = _useTranslation.t;
40646
+ var theme = material.useTheme();
40647
+ var user = reactRedux.useSelector(function (state) {
40648
+ var _state$common;
40649
+ return state === null || state === void 0 ? void 0 : (_state$common = state.common) === null || _state$common === void 0 ? void 0 : _state$common.user;
40650
+ });
40651
+ var _useState = React.useState(null),
40652
+ open = _useState[0],
40653
+ setOpen = _useState[1];
40654
+ var _useState2 = React.useState([]),
40655
+ timers = _useState2[0],
40656
+ setTimers = _useState2[1];
40657
+ var _useState3 = React.useState(),
40658
+ seconds = _useState3[0],
40659
+ setSeconds = _useState3[1];
40660
+ var _useState4 = React.useState(),
40661
+ activeTimerId = _useState4[0],
40662
+ setActiveTimerId = _useState4[1];
40663
+ var _useState5 = React.useState(false),
40664
+ loadingItem = _useState5[0],
40665
+ setLoadingItem = _useState5[1];
40666
+ var _useState6 = React.useState(false),
40667
+ isFetching = _useState6[0],
40668
+ setFetching = _useState6[1];
40669
+ var fetchedRef = React.useRef();
40670
+ 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 : "";
40671
+ var handleChangeTime = function handleChangeTime(data, time) {
40672
+ if (!(user !== null && user !== void 0 && user.id) || !academyDomain && !(user !== null && user !== void 0 && user.isLearningSpace)) return;
40673
+ if (academyDomain !== fetchedRef.current && data.id !== activeTimerId) return;
40674
+ setSeconds(time);
40675
+ var key = user.id + "-" + data.id + "-" + SUBJECT_TIMER_KEY + academyDomain;
40676
+ saveDuration(key, time * 1000);
40677
+ };
40678
+ var handleOpen = function handleOpen(event) {
40679
+ setOpen(event.currentTarget);
40680
+ };
40681
+ var handleClose = function handleClose() {
40682
+ setOpen(null);
40683
+ };
40684
+ var handleStartOrPauseTimer = function handleStartOrPauseTimer(data) {
40685
+ try {
40686
+ var _temp2 = function _temp2(_result3) {
40687
+ if (_exit) return _result3;
40688
+ setLoadingItem(false);
40689
+ };
40690
+ var _exit = false;
40691
+ var isActive = activeTimerId === data.id;
40692
+ var isPaused = data.status === exports.SubjectTimerStatus.Paused;
40693
+ setLoadingItem(true);
40694
+ var _temp = _catch(function () {
40695
+ return Promise.resolve(handlePauseAllTimers(data.id)).then(function () {
40696
+ return function () {
40697
+ if (data.recordId) {
40698
+ return function () {
40699
+ if (!isActive && !isPaused) {
40700
+ setActiveTimerId(data.id);
40701
+ setTimers(function (timers) {
40702
+ return timers.map(function (timer) {
40703
+ return timer.id === data.id ? _extends({}, timer, {
40704
+ lastResumeTime: moment().utc().toISOString()
40705
+ }) : timer;
40706
+ });
40707
+ });
40708
+ setLoadingItem(false);
40709
+ _exit = true;
40710
+ } else {
40711
+ return Promise.resolve(pauseStudentSubjectApi(data.id, data.recordId, {
40712
+ status: isPaused ? exports.SubjectTimerStatus.Started : exports.SubjectTimerStatus.Paused,
40713
+ startTime: isPaused ? moment().utc().valueOf() : 0,
40714
+ pauseTime: !isPaused ? moment().utc().valueOf() : 0,
40715
+ duration: isActive && seconds ? seconds * 1000 : data.duration
40716
+ })).then(function (res) {
40717
+ setTimers(function (timers) {
40718
+ return timers.map(function (timer) {
40719
+ return timer.id === data.id ? res.data : timer;
40720
+ });
40721
+ });
40722
+ setActiveTimerId(!isPaused && isActive ? undefined : data.id);
40723
+ });
40724
+ }
40725
+ }();
40726
+ } else {
40727
+ return Promise.resolve(startStudentSubjectTimerApi(data.id)).then(function (res) {
40728
+ setTimers(function (timers) {
40729
+ return timers.map(function (timer) {
40730
+ return timer.id === data.id ? res.data : timer;
40731
+ });
40732
+ });
40733
+ setActiveTimerId(!isPaused && isActive ? undefined : data.id);
40734
+ });
40735
+ }
40736
+ }();
40737
+ });
40738
+ }, function () {
40739
+ reactToastify.toast.error(t(isPaused ? "failed_to_start_the_subject_name" : "failed_to_pause_the_subject_name", {
40740
+ name: data.name
40741
+ }));
40742
+ });
40743
+ return Promise.resolve(_temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp));
40744
+ } catch (e) {
40745
+ return Promise.reject(e);
40746
+ }
40747
+ };
40748
+ var handlePauseAllTimers = function handlePauseAllTimers(exceptId) {
40749
+ try {
40750
+ !exceptId && setLoadingItem(true);
40751
+ var tasks = timers.filter(function (i) {
40752
+ return i.status === exports.SubjectTimerStatus.Started && i.id !== exceptId;
40753
+ }).map(function (i) {
40754
+ return handlePauseTimer(i);
40755
+ });
40756
+ return Promise.resolve(Promise.all(tasks)).then(function () {
40757
+ !exceptId && setLoadingItem(false);
40758
+ });
40759
+ } catch (e) {
40760
+ return Promise.reject(e);
40761
+ }
40762
+ };
40763
+ var handlePauseTimer = function handlePauseTimer(data, updateState) {
40764
+ if (updateState === void 0) {
40765
+ updateState = true;
40766
+ }
40767
+ try {
40768
+ if (data.status === exports.SubjectTimerStatus.Paused) return Promise.resolve(data);
40769
+ return Promise.resolve(_catch(function () {
40770
+ return Promise.resolve(pauseStudentSubjectApi(data.id, data.recordId, {
40771
+ status: exports.SubjectTimerStatus.Paused,
40772
+ duration: activeTimerId === data.id && seconds ? seconds * 1000 : data.duration,
40773
+ pauseTime: moment().utc().valueOf()
40774
+ })).then(function (res) {
40775
+ if (updateState) setTimers(function (state) {
40776
+ return state.map(function (i) {
40777
+ return i.id === data.id ? res.data : i;
40778
+ });
40779
+ });
40780
+ return res.data;
40781
+ });
40782
+ }, function () {
40783
+ activeTimerId === data.id && reactToastify.toast.error(t("failed_to_pause_the_subject_name", {
40784
+ name: data.name
40785
+ }));
40786
+ }));
40787
+ } catch (e) {
40788
+ return Promise.reject(e);
40789
+ }
40790
+ };
40791
+ var getDataFromLocalStorage = React.useCallback(function (items) {
40792
+ if (fetchedRef.current !== academyDomain) return [];
40793
+ return items.map(function (item) {
40794
+ var key = (user === null || user === void 0 ? void 0 : user.id) + "-" + item.id + "-" + SUBJECT_TIMER_KEY + academyDomain;
40795
+ var duration = getLocalDuration(key, item);
40796
+ var lastResumeTime = moment().utc().toISOString();
40797
+ return _extends({}, item, {
40798
+ duration: duration !== null ? duration : item.duration,
40799
+ lastResumeTime: lastResumeTime
40800
+ });
40801
+ });
40802
+ }, [user === null || user === void 0 ? void 0 : user.id, academyDomain]);
40803
+ React.useEffect(function () {
40804
+ var fetchData = function fetchData() {
40805
+ try {
40806
+ var _temp4 = function _temp4() {
40807
+ setFetching(false);
40808
+ };
40809
+ if (!(user !== null && user !== void 0 && user.id) || !academyDomain && !(user !== null && user !== void 0 && user.isLearningSpace)) return Promise.resolve();
40810
+ if (fetchedRef.current == academyDomain && !open) return Promise.resolve();
40811
+ setFetching(true);
40812
+ var _temp3 = _catch(function () {
40813
+ return Promise.resolve(getStudentSubjectListApi()).then(function (res) {
40814
+ var _items$find;
40815
+ var _res$data$items = res.data.items,
40816
+ items = _res$data$items === void 0 ? [] : _res$data$items;
40817
+ fetchedRef.current = academyDomain;
40818
+ setTimers(getDataFromLocalStorage(items));
40819
+ setActiveTimerId((_items$find = items.find(function (i) {
40820
+ return i.status === exports.SubjectTimerStatus.Started;
40821
+ })) === null || _items$find === void 0 ? void 0 : _items$find.id);
40822
+ });
40823
+ }, function (error) {
40824
+ reactToastify.toast.error(getErrorMessage(t, error));
40825
+ });
40826
+ return Promise.resolve(_temp3 && _temp3.then ? _temp3.then(_temp4) : _temp4(_temp3));
40827
+ } catch (e) {
40828
+ return Promise.reject(e);
40829
+ }
40830
+ };
40831
+ fetchData();
40832
+ }, [t, getDataFromLocalStorage, user === null || user === void 0 ? void 0 : user.isLearningSpace, open]);
40833
+ var today = formatDate(t);
40834
+ var isRunning = timers.some(function (timer) {
40835
+ return timer.status === exports.SubjectTimerStatus.Started;
40836
+ });
40837
+ var selectedTimer = timers.find(function (i) {
40838
+ return i.id === activeTimerId;
40839
+ });
40840
+ return React__default.createElement(React.Fragment, null, React__default.createElement(IconButton, {
40841
+ onClick: handleOpen,
40842
+ sx: {
40843
+ width: 44,
40844
+ height: 44,
40845
+ mx: 1,
40846
+ borderRadius: "6px",
40847
+ padding: "8px",
40848
+ background: !isRunning ? grey[50] : green[100],
40849
+ "&: hover": {
40850
+ background: !isRunning ? grey[200] : green[200]
40851
+ }
40852
+ }
40853
+ }, React__default.createElement(material.Stack, {
40854
+ justifyContent: "center",
40855
+ alignItems: "center",
40856
+ width: "100%",
40857
+ height: "100%",
40858
+ sx: {
40859
+ borderRadius: "50%",
40860
+ backgroundColor: "#FFF"
40861
+ }
40862
+ }, React__default.createElement(io5.IoTimer, {
40863
+ color: !isRunning ? grey[700] : green[500],
40864
+ size: "16.25px"
40865
+ }))), selectedTimer && React__default.createElement(TimerCountItem, {
40866
+ data: selectedTimer,
40867
+ activeTimerId: activeTimerId,
40868
+ onChangeTime: handleChangeTime
40869
+ }), React__default.createElement(Popover, {
40870
+ open: !!open,
40871
+ anchorEl: open,
40872
+ onClose: handleClose,
40873
+ anchorOrigin: {
40874
+ vertical: "bottom",
40875
+ horizontal: "right"
40876
+ },
40877
+ transformOrigin: {
40878
+ vertical: "top",
40879
+ horizontal: "right"
40880
+ },
40881
+ slotProps: {
40882
+ paper: {
40883
+ sx: {
40884
+ px: 2,
40885
+ mt: 1,
40886
+ ml: 0.75,
40887
+ width: 320,
40888
+ borderRadius: 2,
40889
+ boxShadow: 3,
40890
+ bgcolor: theme.palette.grey[50]
40891
+ }
40892
+ }
40893
+ }
40894
+ }, React__default.createElement(material.Box, {
40895
+ sx: {
40896
+ py: 2,
40897
+ display: "flex",
40898
+ alignItems: "center",
40899
+ justifyContent: "space-between"
40900
+ }
40901
+ }, React__default.createElement(material.Box, {
40902
+ sx: {
40903
+ display: "flex",
40904
+ gap: 1,
40905
+ alignItems: "center"
40906
+ }
40907
+ }, React__default.createElement(material.Box, {
40908
+ display: "flex",
40909
+ alignItems: "center"
40910
+ }, React__default.createElement(io5.IoTimer, null)), React__default.createElement(material.Typography, {
40911
+ variant: "subtitle1",
40912
+ fontWeight: "bold",
40913
+ fontSize: "14px"
40914
+ }, t("study_timer"))), React__default.createElement(material.Typography, {
40915
+ color: "textSecondary",
40916
+ whiteSpace: "nowrap",
40917
+ fontSize: "14px"
40918
+ }, today)), React__default.createElement(material.Divider, {
40919
+ sx: {
40920
+ bgcolor: theme.palette.grey[700]
40921
+ }
40922
+ }), React__default.createElement(material.Stack, {
40923
+ className: "" + styles["timer-menu"],
40924
+ gap: 1.5,
40925
+ flexDirection: "column",
40926
+ sx: {
40927
+ py: 2,
40928
+ maxHeight: "360px"
40929
+ }
40930
+ }, !isFetching && React__default.createElement(ListView, {
40931
+ data: timers,
40932
+ render: function render(item, index) {
40933
+ return React__default.createElement(TimerItem, {
40934
+ key: index,
40935
+ data: item,
40936
+ loading: loadingItem,
40937
+ seconds: activeTimerId === item.id ? seconds : undefined,
40938
+ activeTimerId: activeTimerId,
40939
+ onStartOrPauseTimer: handleStartOrPauseTimer
40940
+ });
40941
+ }
40942
+ }), isFetching && React__default.createElement(material.Stack, {
40943
+ sx: {
40944
+ width: "100%",
40945
+ py: 2
40946
+ },
40947
+ justifyContent: "center",
40948
+ alignItems: "center"
40949
+ }, React__default.createElement(material.Typography, {
40950
+ className: "text-muted"
40951
+ }, React__default.createElement(material.CircularProgress, {
40952
+ size: "16px",
40953
+ color: "success"
40954
+ }))), !timers.length && !isFetching && React__default.createElement(material.Box, null, React__default.createElement(material.Typography, {
40955
+ className: "text-muted"
40956
+ }, t("no_data")))), React__default.createElement(material.Divider, {
40957
+ sx: {
40958
+ bgcolor: theme.palette.grey[700]
40959
+ }
40960
+ }), React__default.createElement(material.Box, {
40961
+ sx: {
40962
+ p: 2,
40963
+ textAlign: "right"
40964
+ }
40965
+ }, React__default.createElement(material.Button, {
40966
+ disableTouchRipple: true,
40967
+ onClick: function onClick() {
40968
+ return handlePauseAllTimers();
40969
+ },
40970
+ disabled: loadingItem,
40971
+ sx: {
40972
+ fontWeight: 700,
40973
+ color: theme.palette.success.main,
40974
+ padding: "8px 12px",
40975
+ bgcolor: theme.palette.background.paper,
40976
+ "&:hover": {
40977
+ bgcolor: theme.palette.grey[200]
40978
+ },
40979
+ "&:disabled": {
40980
+ opacity: 0.5
40981
+ }
40982
+ }
40983
+ }, loadingItem ? t("saving") : t("pause")))));
40984
+ };
40985
+ var SUBJECT_TIMER_KEY = "stk";
40986
+ var saveDuration = function saveDuration(key, duration) {
40987
+ localStorage.setItem(key, "" + duration);
40988
+ };
40989
+ var getLocalDuration = function getLocalDuration(key, timer) {
40990
+ try {
40991
+ var res = localStorage.getItem(key);
40992
+ var duration = +(res != null ? res : "");
40993
+ if (!duration || Number.isNaN(duration) || duration <= timer.duration) return null;
40994
+ return duration;
40995
+ } catch (error) {
40996
+ return null;
40997
+ }
40998
+ };
40999
+
41000
+ var HeaderLink = function HeaderLink(_ref) {
41001
+ var data = _ref.data,
41002
+ render = _ref.render;
41003
+ var activePaths = data.activePaths,
41004
+ path = data.path;
41005
+ var pathname = window.location.pathname.toLowerCase();
41006
+ var isActive = (activePaths === null || activePaths === void 0 ? void 0 : activePaths.some(function (a) {
41007
+ return pathname.startsWith(a);
41008
+ })) || pathname.startsWith(path);
41009
+ return React__default.createElement(React.Fragment, null, render(data, isActive));
41010
+ };
41011
+
40256
41012
  var Header = function Header(_ref) {
40257
41013
  var academyListRoute = _ref.academyListRoute,
40258
41014
  homeRoute = _ref.homeRoute,
@@ -40375,7 +41131,9 @@ var Header = function Header(_ref) {
40375
41131
  justifyContent: "center",
40376
41132
  height: "100%",
40377
41133
  className: styles["logo"] + " d-flex d-lg-none"
40378
- }, React__default.createElement(singleLogo, null))), React__default.createElement(material.Stack, {
41134
+ }, React__default.createElement(singleLogo, null))), !isTeacherSide && React__default.createElement(material.Stack, {
41135
+ className: "me-2 ms-2"
41136
+ }, React__default.createElement(TimerDropdown, null)), React__default.createElement(material.Stack, {
40379
41137
  className: "me-2",
40380
41138
  display: "none"
40381
41139
  }, React__default.createElement(TheLanguageDropdown, null)), showAnnouncement && renderNotificationLink && React__default.createElement(AnnouncementContainer, {
@@ -40384,17 +41142,6 @@ var Header = function Header(_ref) {
40384
41142
  renderViewNoteLink: renderViewNoteLink
40385
41143
  })));
40386
41144
  };
40387
- var HeaderLink = function HeaderLink(_ref3) {
40388
- var data = _ref3.data,
40389
- render = _ref3.render;
40390
- var activePaths = data.activePaths,
40391
- path = data.path;
40392
- var pathname = location.pathname.toLowerCase();
40393
- var isActive = (activePaths === null || activePaths === void 0 ? void 0 : activePaths.some(function (a) {
40394
- return pathname.startsWith(a);
40395
- })) || pathname.startsWith(path);
40396
- return React__default.createElement(React.Fragment, null, render(data, isActive));
40397
- };
40398
41145
 
40399
41146
  var useLayoutContext = function useLayoutContext(role, showLoadingAcademy, domain) {
40400
41147
  var _currentPusher$connec2;
@@ -40779,6 +41526,7 @@ exports.formatTime = formatTime;
40779
41526
  exports.formatTimeSecond = formatTimeSecond;
40780
41527
  exports.getAcademyDomain = getAcademyDomain;
40781
41528
  exports.getAccessToken = getAccessToken;
41529
+ exports.getCountTime = getCountTime;
40782
41530
  exports.getErrorMessage = getErrorMessage;
40783
41531
  exports.getLanguage = getLanguage;
40784
41532
  exports.getLearningSpace = getLearningSpace;