touchstudy-core 0.1.13 → 0.1.15

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.
Files changed (42) hide show
  1. package/dist/assets/iconChatBubble.d.ts +3 -0
  2. package/dist/assets/iconChecked.d.ts +3 -0
  3. package/dist/assets/iconPersonActive.d.ts +3 -0
  4. package/dist/assets/iconPersonNoActive.d.ts +3 -0
  5. package/dist/assets/iconSendMessenger.d.ts +4 -0
  6. package/dist/components/Chats/ChatContainer.d.ts +0 -1
  7. package/dist/components/Chats/ChatHeader.d.ts +9 -6
  8. package/dist/components/Chats/ChatItem.d.ts +6 -21
  9. package/dist/components/Chats/ChatList.d.ts +1 -2
  10. package/dist/components/Chats/ChatRightItem.d.ts +1 -5
  11. package/dist/components/Chats/InputChat.d.ts +6 -3
  12. package/dist/components/Chats/apiClient/conversationService.d.ts +2 -0
  13. package/dist/components/Chats/configs/constants.d.ts +5 -0
  14. package/dist/components/Chats/configs/types.d.ts +79 -15
  15. package/dist/components/Chats/hooks/useChatContainer.d.ts +20 -25
  16. package/dist/components/Chats/hooks/useDialog.d.ts +6 -0
  17. package/dist/components/Chats/hooks/useMessageList.d.ts +3 -5
  18. package/dist/containers/Login/apiClient/index.d.ts +0 -1
  19. package/dist/containers/Login/views/Login.d.ts +3 -0
  20. package/dist/containers/Login/views/block/BlockLogin.d.ts +3 -0
  21. package/dist/index.css +349 -0
  22. package/dist/index.d.ts +12 -8
  23. package/dist/index.js +1652 -1225
  24. package/dist/index.js.map +1 -1
  25. package/dist/index.modern.js +1631 -1214
  26. package/dist/index.modern.js.map +1 -1
  27. package/dist/layouts/TheAcademyDropdown.d.ts +10 -0
  28. package/dist/redux/commons/action.d.ts +1 -0
  29. package/dist/services/academyService.d.ts +3 -0
  30. package/dist/services/accountService.d.ts +5 -0
  31. package/dist/utils/constants.d.ts +11 -7
  32. package/dist/utils/hooks/index.d.ts +3 -0
  33. package/dist/utils/hooks/useAutoAcademyDomain.d.ts +2 -0
  34. package/dist/utils/{useGoogleSignOut.d.ts → hooks/useGoogleSignOut.d.ts} +1 -1
  35. package/dist/utils/{useLanguage.d.ts → hooks/useLanguage.d.ts} +1 -1
  36. package/dist/utils/hooks/useLogin.d.ts +7 -0
  37. package/dist/utils/hooks/useSwitchAcademy.d.ts +10 -0
  38. package/dist/utils/types/academy.d.ts +6 -0
  39. package/dist/utils/types/login.d.ts +33 -0
  40. package/package.json +2 -1
  41. package/dist/components/Chats/hooks/useConversationList.d.ts +0 -20
  42. package/dist/components/Chats/hooks/useExamList.d.ts +0 -6
package/dist/index.js CHANGED
@@ -10,21 +10,21 @@ var formik = require('formik');
10
10
  var yup = require('yup');
11
11
  var GoogleLogin = require('@leecheuk/react-google-login');
12
12
  var GoogleLogin__default = _interopDefault(GoogleLogin);
13
- var axios = _interopDefault(require('axios'));
14
13
  var reactRedux = require('react-redux');
14
+ var axios = _interopDefault(require('axios'));
15
+ var reactI18next = require('react-i18next');
15
16
  var gapiScript = require('gapi-script');
16
17
  var i18n = _interopDefault(require('i18next'));
17
- var reactI18next = require('react-i18next');
18
18
  var io5 = require('react-icons/io5');
19
19
  require('moment/locale/ko.js');
20
20
  require('moment/locale/en-au.js');
21
+ var go = require('react-icons/go');
22
+ var reactToastify = require('react-toastify');
21
23
  var Select = require('react-select');
22
24
  var Select__default = _interopDefault(Select);
23
25
  var fa = require('react-icons/fa');
24
- var reactRouterDom = require('react-router-dom');
25
- var io = require('react-icons/io');
26
+ var material = require('@mui/material');
26
27
  var Pusher = _interopDefault(require('pusher-js'));
27
- var reactToastify = require('react-toastify');
28
28
  var CreatableSelect = _interopDefault(require('react-select/creatable'));
29
29
  var pi = require('react-icons/pi');
30
30
  var _ = _interopDefault(require('lodash'));
@@ -34,20 +34,23 @@ var setAlert = toolkit.createAction("common/setAlert");
34
34
  var setUser = toolkit.createAction("common/setUser");
35
35
  var setLanguage = toolkit.createAction("common/setLanguage");
36
36
  var reset = toolkit.createAction("common/reset");
37
-
38
- var isLocalHost = Boolean(window.location.hostname === "localhost" || window.location.hostname === "[::1]" || window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));
39
-
40
- var GOOGLE_CLIENT_ID = "64118819726-0qlur4qjrs9jbuu6rnoa0u91g680lmpg.apps.googleusercontent.com";
37
+ var setReFetchUserAcademies = toolkit.createAction("common/setReFetchUserAcademies");
38
+
39
+ var GOOGLE_RECAPTCHA_KEY = process.env.REACT_APP_GOOGLE_RECAPTCHA_KEY || "";
40
+ var GOOGLE_CLIENT_ID = process.env.REACT_APP_GOOGLE_CLIENT_ID || "";
41
+ var GOOGLE_RECAPTCHA_ID = process.env.REACT_APP_GOOGLE_RECAPTCHA_ID || "";
42
+ var GOOGLE_RECAPTCHA_SECRET = process.env.REACT_APP_GOOGLE_RECAPTCHA_SECRET || "";
43
+ var BASE_URL = process.env.REACT_APP_BASE_URL || "";
44
+ var SUPER_ADMIN_BASE_URL = process.env.REACT_APP_SUPER_ADMIN_BASE_URL || "";
45
+ var PUSHER_CONFIG = {
46
+ cluster: process.env.REACT_APP_PUSHER_CONFIG_CLUSTER || "",
47
+ key: process.env.REACT_APP_PUSHER_CONFIG_KEY || ""
48
+ };
41
49
  var ACCESS_TOKEN = "ACCESS_TOKEN";
50
+ var ACADEMY_DOMAIN = "ACADEMY_DOMAIN";
51
+ var AcademyHeaders = "Academy-Headers";
42
52
  var DATE_MIN_VALUE = "0001-01-01T00:00:00+00:00";
43
53
  var DATE_TIME_MIN_VALUE = "0001-01-01T00:00:00";
44
- var BASE_URL = function () {
45
- return isLocalHost ? "https://localhost:7045" : "https://api.studypeak.io";
46
- }();
47
- var PUSHER_CONFIG = {
48
- cluster: "ap1",
49
- key: "9018c77328885a14150b"
50
- };
51
54
  var EXAM_CHANNEL = "presence-exam-channel";
52
55
  var EXAM_STUDENT_CHANNEL = "EXAM-CHANNEL-{examCode}-STUDENT-{studentId}";
53
56
  var getAccessToken = function getAccessToken() {
@@ -57,6 +60,13 @@ var getAccessToken = function getAccessToken() {
57
60
  return null;
58
61
  }
59
62
  };
63
+ var getAcademyDomain = function getAcademyDomain() {
64
+ try {
65
+ return localStorage.getItem(ACADEMY_DOMAIN);
66
+ } catch (err) {
67
+ return null;
68
+ }
69
+ };
60
70
  var encodeParams = function encodeParams(params) {
61
71
  return Object.keys(params).filter(function (key) {
62
72
  return params[key] || params[key] === 0 || params[key] === false;
@@ -79,6 +89,46 @@ var utcToLocalTime = (function (time, FORMAT) {
79
89
  }
80
90
  });
81
91
 
92
+ function _extends() {
93
+ _extends = Object.assign ? Object.assign.bind() : function (target) {
94
+ for (var i = 1; i < arguments.length; i++) {
95
+ var source = arguments[i];
96
+ for (var key in source) {
97
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
98
+ target[key] = source[key];
99
+ }
100
+ }
101
+ }
102
+ return target;
103
+ };
104
+ return _extends.apply(this, arguments);
105
+ }
106
+ function _objectWithoutPropertiesLoose(source, excluded) {
107
+ if (source == null) return {};
108
+ var target = {};
109
+ var sourceKeys = Object.keys(source);
110
+ var key, i;
111
+ for (i = 0; i < sourceKeys.length; i++) {
112
+ key = sourceKeys[i];
113
+ if (excluded.indexOf(key) >= 0) continue;
114
+ target[key] = source[key];
115
+ }
116
+ return target;
117
+ }
118
+
119
+ var stylesGlobal = {"btn-login-google":"_2HqmH","block-login":"_wWIyO","box-login":"_38Lo1","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"};
120
+
121
+ var AuthenticationMessage;
122
+ (function (AuthenticationMessage) {
123
+ AuthenticationMessage["NotAllowedToRegister"] = "NotAllowedToRegister";
124
+ AuthenticationMessage["InvalidGoogleToken"] = "InvalidGoogleToken";
125
+ })(AuthenticationMessage || (AuthenticationMessage = {}));
126
+ (function (Role) {
127
+ Role["Student"] = "Student";
128
+ Role["Teacher"] = "Teacher";
129
+ Role["Admin"] = "Admin";
130
+ })(exports.Role || (exports.Role = {}));
131
+
82
132
  // A type of promise-like that resolves synchronously and supports only one observer
83
133
 
84
134
  const _iteratorSymbol = /*#__PURE__*/ typeof Symbol !== "undefined" ? (Symbol.iterator || (Symbol.iterator = Symbol("Symbol.iterator"))) : "@@iterator";
@@ -98,7 +148,18 @@ function _catch(body, recover) {
98
148
  return result;
99
149
  }
100
150
 
101
- var styles = {"btn-login-google":"_2HqmH","block-login":"_wWIyO","box-login":"_38Lo1","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"};
151
+ // Asynchronously await a promise and invoke a finally continuation that always overrides the result
152
+ function _finally(body, finalizer) {
153
+ try {
154
+ var result = body();
155
+ } catch (e) {
156
+ return finalizer();
157
+ }
158
+ if (result && result.then) {
159
+ return result.then(finalizer, finalizer);
160
+ }
161
+ return finalizer();
162
+ }
102
163
 
103
164
  var api = axios.create({
104
165
  baseURL: BASE_URL,
@@ -120,10 +181,17 @@ var apiUpload = axios.create({
120
181
  [api, apiUpload].forEach(function (i) {
121
182
  return i.interceptors.request.use(function (config) {
122
183
  var token = getAccessToken();
184
+ var searchParams = new URLSearchParams(window.location.search);
185
+ var paramDomain = searchParams.get('domain');
186
+ var academyDomainStorage = getAcademyDomain();
187
+ var academyDomain = paramDomain || academyDomainStorage;
123
188
  if (token) {
124
189
  config.headers.Authorization = "Bearer " + token;
125
190
  localStorage.setItem("LAST_TIME_REQUETST", moment().utc().format("YYYY-MM-DD HH:mm:ss"));
126
191
  }
192
+ if (academyDomain && !config.headers[AcademyHeaders]) {
193
+ config.headers[AcademyHeaders] = "" + academyDomain;
194
+ }
127
195
  return config;
128
196
  }, function (error) {
129
197
  return Promise.reject(error);
@@ -137,32 +205,34 @@ var apiUpload = axios.create({
137
205
  console.log({
138
206
  error: error
139
207
  });
140
- if (((_error$response = error.response) === null || _error$response === void 0 ? void 0 : _error$response.status) === 401) {
141
- window.location.href = "/login";
142
- }
143
- if (((_error$response2 = error.response) === null || _error$response2 === void 0 ? void 0 : _error$response2.status) == 403) {
208
+ if (((_error$response = error.response) === null || _error$response === void 0 ? void 0 : _error$response.status) === 401 || ((_error$response2 = error.response) === null || _error$response2 === void 0 ? void 0 : _error$response2.status) == 403) {
144
209
  localStorage.removeItem(ACCESS_TOKEN);
145
- localStorage.removeItem("USER_EMAIL");
146
210
  window.location.href = "/login";
147
211
  }
148
212
  return Promise.reject(error);
149
213
  });
150
214
  });
151
215
 
152
- var apiLoginGoogle = function apiLoginGoogle(body, role) {
153
- return api.post(BASE_URL + "/api/auth/" + role + "/login", body);
216
+ var AUTH_URL = BASE_URL + "/api/auth";
217
+ var AUTH_SUPER_ADMIN_URL = SUPER_ADMIN_BASE_URL + "/api/auth";
218
+ var getInfo = function getInfo() {
219
+ return api.get(AUTH_URL + "/info");
220
+ };
221
+ var getSuperAdminInfoFromWeb = function getSuperAdminInfoFromWeb() {
222
+ return api.get(AUTH_SUPER_ADMIN_URL + "/info");
223
+ };
224
+ var apiLoginGoogle = function apiLoginGoogle(body) {
225
+ return api.post(AUTH_URL + "/login", body);
226
+ };
227
+ var apiLoginGoogleSuperAdmin = function apiLoginGoogleSuperAdmin(body) {
228
+ return api.post(AUTH_SUPER_ADMIN_URL + "/login", body);
229
+ };
230
+ var apiLoginWithAccessToken = function apiLoginWithAccessToken(body, domain) {
231
+ var _headers;
232
+ return api.post(AUTH_URL + "/login/access-token", body, {
233
+ headers: (_headers = {}, _headers[AcademyHeaders] = domain, _headers)
234
+ });
154
235
  };
155
-
156
- var AuthenticationMessage;
157
- (function (AuthenticationMessage) {
158
- AuthenticationMessage["NotAllowedToRegister"] = "NotAllowedToRegister";
159
- AuthenticationMessage["InvalidGoogleToken"] = "InvalidGoogleToken";
160
- })(AuthenticationMessage || (AuthenticationMessage = {}));
161
- (function (Role) {
162
- Role["Student"] = "Student";
163
- Role["Teacher"] = "Teacher";
164
- Role["Admin"] = "Admin";
165
- })(exports.Role || (exports.Role = {}));
166
236
 
167
237
  var useGoogleSignOut = function useGoogleSignOut(props) {
168
238
  var dispatch = reactRedux.useDispatch();
@@ -181,9 +251,15 @@ var useGoogleSignOut = function useGoogleSignOut(props) {
181
251
  }),
182
252
  signOut = _useGoogleLogout.signOut,
183
253
  loaded = _useGoogleLogout.loaded;
184
- var handleSignOut = function handleSignOut() {
254
+ var handleSignOut = function handleSignOut(isRemoveDomainStorage) {
255
+ if (isRemoveDomainStorage === void 0) {
256
+ isRemoveDomainStorage = false;
257
+ }
185
258
  localStorage.removeItem("USER_INFORMATION");
186
259
  localStorage.removeItem(ACCESS_TOKEN);
260
+ if (isRemoveDomainStorage) {
261
+ localStorage.removeItem(ACADEMY_DOMAIN);
262
+ }
187
263
  try {
188
264
  signOut();
189
265
  } catch (error) {
@@ -200,7 +276,120 @@ var useGoogleSignOut = function useGoogleSignOut(props) {
200
276
  };
201
277
  };
202
278
 
203
- var ERROR_MESSAGE = "Login fail!";
279
+ var ERROR_MESSAGE = "request_login_fail";
280
+ var useLogin = function useLogin(onNavigate, homeAcademyUrl, homeUrl, registerUrl) {
281
+ var dispatch = reactRedux.useDispatch();
282
+ var _useTranslation = reactI18next.useTranslation(),
283
+ t = _useTranslation.t;
284
+ var _useGoogleSignOut = useGoogleSignOut({
285
+ onNavigate: onNavigate
286
+ }),
287
+ handleSignOut = _useGoogleSignOut.handleSignOut;
288
+ var searchParams = new URLSearchParams(window.location.search);
289
+ var paramDomain = searchParams.get('domain');
290
+ var handleLoginGoogle = function handleLoginGoogle(data, isLogout) {
291
+ if (isLogout === void 0) {
292
+ isLogout = true;
293
+ }
294
+ try {
295
+ var academyDomain = paramDomain || getAcademyDomain();
296
+ var isStudent = data.role === exports.Role.Student;
297
+ return Promise.resolve(handleLogin(function () {
298
+ return new Promise(function (resolve, reject) {
299
+ try {
300
+ var _temp = _catch(function () {
301
+ return Promise.resolve(academyDomain ? apiLoginGoogle(data) : apiLoginGoogleSuperAdmin(data)).then(function (loginResponse) {
302
+ var result = loginResponse.data;
303
+ resolve(result);
304
+ });
305
+ }, function (error) {
306
+ !!academyDomain && localStorage.removeItem(ACADEMY_DOMAIN);
307
+ reject(error);
308
+ });
309
+ return Promise.resolve(_temp && _temp.then ? _temp.then(function () {}) : void 0);
310
+ } catch (e) {
311
+ return Promise.reject(e);
312
+ }
313
+ });
314
+ }, isStudent, isLogout)).then(function () {});
315
+ } catch (e) {
316
+ return Promise.reject(e);
317
+ }
318
+ };
319
+ var handleLoginAccessToken = function handleLoginAccessToken(data, isLogout, domain) {
320
+ if (isLogout === void 0) {
321
+ isLogout = true;
322
+ }
323
+ try {
324
+ var isStudent = data.role === exports.Role.Student;
325
+ return Promise.resolve(handleLogin(function () {
326
+ return new Promise(function (resolve, reject) {
327
+ try {
328
+ var _temp2 = _catch(function () {
329
+ return Promise.resolve(apiLoginWithAccessToken(data, domain)).then(function (loginResponse) {
330
+ var result = loginResponse.data;
331
+ resolve(result);
332
+ });
333
+ }, function (error) {
334
+ reject(error);
335
+ });
336
+ return Promise.resolve(_temp2 && _temp2.then ? _temp2.then(function () {}) : void 0);
337
+ } catch (e) {
338
+ return Promise.reject(e);
339
+ }
340
+ });
341
+ }, isStudent, isLogout)).then(function () {});
342
+ } catch (e) {
343
+ return Promise.reject(e);
344
+ }
345
+ };
346
+ var handleLogin = function handleLogin(apiLogin, isStudent, isLogout) {
347
+ if (isLogout === void 0) {
348
+ isLogout = true;
349
+ }
350
+ try {
351
+ var _temp4 = function _temp4() {
352
+ dispatch(setLoading(false));
353
+ };
354
+ dispatch(setLoading(true));
355
+ var _temp3 = _catch(function () {
356
+ return Promise.resolve(apiLogin()).then(function (loginResponse) {
357
+ var isFirstLogin = loginResponse.isFirstLogin,
358
+ token = loginResponse.token,
359
+ user = loginResponse.user;
360
+ var isAcademy = !!(user !== null && user !== void 0 && user.academyDomain);
361
+ var needToRegister = isStudent && isFirstLogin && isAcademy;
362
+ var redirectUrl = needToRegister ? registerUrl : isAcademy ? homeAcademyUrl : homeUrl;
363
+ redirectLoginUser(user, token, redirectUrl);
364
+ });
365
+ }, function (error) {
366
+ var _error$response, _error$response$data, _error$response2, _error$response2$data, _error$response3;
367
+ var message = undefined;
368
+ message = t((error === null || error === void 0 ? void 0 : (_error$response = error.response) === null || _error$response === void 0 ? void 0 : (_error$response$data = _error$response.data) === null || _error$response$data === void 0 ? void 0 : _error$response$data.message) || (error === null || error === void 0 ? void 0 : (_error$response2 = error.response) === null || _error$response2 === void 0 ? void 0 : (_error$response2$data = _error$response2.data) === null || _error$response2$data === void 0 ? void 0 : _error$response2$data.title) || (error === null || error === void 0 ? void 0 : (_error$response3 = error.response) === null || _error$response3 === void 0 ? void 0 : _error$response3.data) || ERROR_MESSAGE);
369
+ message && alert(message);
370
+ isLogout && handleSignOut();
371
+ });
372
+ return Promise.resolve(_temp3 && _temp3.then ? _temp3.then(_temp4) : _temp4(_temp3));
373
+ } catch (e) {
374
+ return Promise.reject(e);
375
+ }
376
+ };
377
+ var redirectLoginUser = function redirectLoginUser(data, token, redirectUrl) {
378
+ localStorage.setItem(ACCESS_TOKEN, token);
379
+ !data.academyDomain && localStorage.removeItem(ACADEMY_DOMAIN);
380
+ !!data.academyDomain && localStorage.setItem(ACADEMY_DOMAIN, data.academyDomain);
381
+ dispatch(setUser(_extends({}, data)));
382
+ if (redirectUrl) {
383
+ onNavigate(redirectUrl);
384
+ }
385
+ };
386
+ return {
387
+ handleLoginGoogle: handleLoginGoogle,
388
+ handleLoginAccessToken: handleLoginAccessToken,
389
+ redirectLoginUser: redirectLoginUser
390
+ };
391
+ };
392
+
204
393
  var schema = yup.object({
205
394
  email: yup.string().email("Email is invalid").required("Email is required"),
206
395
  password: yup.string().required("Password is required"),
@@ -210,65 +399,32 @@ var BlockLogin = function BlockLogin(_ref) {
210
399
  var defaultInfo = _ref.defaultInfo,
211
400
  onNavigate = _ref.onNavigate,
212
401
  _ref$role = _ref.role,
213
- role = _ref$role === void 0 ? exports.Role.Student : _ref$role;
214
- var dispatch = reactRedux.useDispatch();
215
- var _useGoogleSignOut = useGoogleSignOut({
216
- onNavigate: onNavigate
217
- }),
218
- handleSignOut = _useGoogleSignOut.handleSignOut;
402
+ role = _ref$role === void 0 ? exports.Role.Student : _ref$role,
403
+ homeAcademyUrl = _ref.homeAcademyUrl,
404
+ homeUrl = _ref.homeUrl,
405
+ registerUrl = _ref.registerUrl;
406
+ var _useLogin = useLogin(onNavigate, homeAcademyUrl, homeUrl, registerUrl),
407
+ handleLoginGoogle = _useLogin.handleLoginGoogle;
219
408
  var onSuccessGoogle = function onSuccessGoogle(res) {
220
409
  try {
221
- var _temp3 = function () {
222
- if (!!(res !== null && res !== void 0 && res.accessToken)) {
223
- var _temp2 = function _temp2() {
224
- dispatch(setLoading(false));
225
- };
226
- var _res$profileObj = res.profileObj,
227
- email = _res$profileObj.email,
228
- imageUrl = _res$profileObj.imageUrl,
229
- name = _res$profileObj.name;
230
- var accessToken = res.tokenObj.id_token;
231
- var googleId = res.googleId;
232
- var infoLogin = {
233
- imageUrl: imageUrl,
234
- fullName: name,
235
- email: email,
236
- token: accessToken,
237
- googleId: googleId
238
- };
239
- dispatch(setLoading(true));
240
- var _temp = _catch(function () {
241
- return Promise.resolve(apiLoginGoogle(infoLogin, role)).then(function (res1) {
242
- var isFirstLogin = res1.data.isFirstLogin;
243
- var tokenJWT = res1.data.token;
244
- localStorage.setItem("USER_INFORMATION", JSON.stringify(infoLogin));
245
- localStorage.setItem(ACCESS_TOKEN, tokenJWT);
246
- if (role === exports.Role.Student && isFirstLogin) {
247
- onNavigate("/register/info");
248
- } else {
249
- onNavigate("/");
250
- }
251
- });
252
- }, function (error) {
253
- var _error$response, _error$response$data;
254
- var message = undefined;
255
- var type = error === null || error === void 0 ? void 0 : (_error$response = error.response) === null || _error$response === void 0 ? void 0 : (_error$response$data = _error$response.data) === null || _error$response$data === void 0 ? void 0 : _error$response$data.type;
256
- if (type === AuthenticationMessage.NotAllowedToRegister) {
257
- alert("가입 권한이 없는 계정입니다. 관리자에게 문의하세요.");
258
- } else if (type) {
259
- var _error$response2, _error$response2$data;
260
- message = (error === null || error === void 0 ? void 0 : (_error$response2 = error.response) === null || _error$response2 === void 0 ? void 0 : (_error$response2$data = _error$response2.data) === null || _error$response2$data === void 0 ? void 0 : _error$response2$data.message) || ERROR_MESSAGE;
261
- } else {
262
- var _error$response3;
263
- message = (error === null || error === void 0 ? void 0 : (_error$response3 = error.response) === null || _error$response3 === void 0 ? void 0 : _error$response3.data) || ERROR_MESSAGE;
264
- }
265
- message && alert(message);
266
- handleSignOut();
267
- });
268
- return _temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp);
269
- }
270
- }();
271
- return Promise.resolve(_temp3 && _temp3.then ? _temp3.then(function () {}) : void 0);
410
+ if (!!(res !== null && res !== void 0 && res.accessToken)) {
411
+ var _res$profileObj = res.profileObj,
412
+ email = _res$profileObj.email,
413
+ imageUrl = _res$profileObj.imageUrl,
414
+ name = _res$profileObj.name;
415
+ var accessToken = res.tokenObj.id_token;
416
+ var googleId = res.googleId;
417
+ var infoLogin = {
418
+ imageUrl: imageUrl,
419
+ fullName: name,
420
+ email: email,
421
+ token: accessToken,
422
+ googleId: googleId,
423
+ role: role
424
+ };
425
+ handleLoginGoogle(infoLogin);
426
+ }
427
+ return Promise.resolve();
272
428
  } catch (e) {
273
429
  return Promise.reject(e);
274
430
  }
@@ -284,17 +440,17 @@ var BlockLogin = function BlockLogin(_ref) {
284
440
  }, function (formikProps) {
285
441
  var handleSubmit = formikProps.handleSubmit;
286
442
  return React__default.createElement(reactstrap.Row, {
287
- className: "" + styles["box-login"]
443
+ className: "" + stylesGlobal["box-login"]
288
444
  }, React__default.createElement(reactstrap.Col, {
289
445
  className: "p-0 d-flex justify-content-center"
290
446
  }, React__default.createElement(reactstrap.Form, {
291
- className: "" + styles["block-login"],
447
+ className: "" + stylesGlobal["block-login"],
292
448
  onSubmit: handleSubmit
293
449
  }, React__default.createElement("div", {
294
- className: "" + styles["block-form"]
450
+ className: "" + stylesGlobal["block-form"]
295
451
  }, React__default.createElement("img", {
296
452
  src: "/images/logo.jpeg",
297
- className: "" + styles["img-login-rectangle"]
453
+ className: "" + stylesGlobal["img-login-rectangle"]
298
454
  }), React__default.createElement(reactstrap.Col, {
299
455
  className: "p-0 mt-1 mb-4"
300
456
  }, React__default.createElement(GoogleLogin__default, {
@@ -303,7 +459,7 @@ var BlockLogin = function BlockLogin(_ref) {
303
459
  onSuccess: onSuccessGoogle,
304
460
  onFailure: onFailureGoogle,
305
461
  cookiePolicy: "single_host_origin",
306
- className: "" + styles["btn-login-google"],
462
+ className: "" + stylesGlobal["btn-login-google"],
307
463
  isSignedIn: true
308
464
  }))))));
309
465
  });
@@ -323,7 +479,7 @@ var defaultInfo = {
323
479
  captcha: "",
324
480
  rememberMe: false
325
481
  };
326
- var useLogin = function useLogin(onNavigate) {
482
+ var useLogin$1 = function useLogin(onNavigate) {
327
483
  var _useState = React.useState(false),
328
484
  openLogin = _useState[0],
329
485
  setOpenLogin = _useState[1];
@@ -360,13 +516,14 @@ var useLogin = function useLogin(onNavigate) {
360
516
  };
361
517
  };
362
518
 
519
+ var _excluded = ["onNavigate"];
363
520
  var Login = function Login(_ref) {
364
521
  var onNavigate = _ref.onNavigate,
365
- role = _ref.role;
366
- var _useLogin = useLogin(onNavigate),
522
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded);
523
+ var _useLogin = useLogin$1(onNavigate),
367
524
  defaultInfo = _useLogin.defaultInfo;
368
525
  return React__default.createElement("div", {
369
- className: styles["login"] + " container-fluid font-family-lato"
526
+ className: stylesGlobal["login"] + " container-fluid font-family-lato"
370
527
  }, React__default.createElement(reactstrap.Row, {
371
528
  className: "h-100"
372
529
  }, React__default.createElement(reactstrap.Col, {
@@ -374,11 +531,10 @@ var Login = function Login(_ref) {
374
531
  md: 12,
375
532
  xs: 12,
376
533
  className: "d-flex justify-content-center h-100 align-items-center"
377
- }, React__default.createElement(BlockLogin, {
534
+ }, React__default.createElement(BlockLogin, Object.assign({
378
535
  defaultInfo: defaultInfo,
379
- onNavigate: onNavigate,
380
- role: role
381
- }))));
536
+ onNavigate: onNavigate
537
+ }, rest)))));
382
538
  };
383
539
 
384
540
  var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
@@ -582,7 +738,8 @@ var initialState = {
582
738
  type: "",
583
739
  message: ""
584
740
  },
585
- user: null
741
+ user: null,
742
+ isReFetchUserAcademies: false
586
743
  };
587
744
  var commonReducer = toolkit.createReducer(initialState, function (builder) {
588
745
  builder.addCase(setLoading, function (state, action) {
@@ -595,6 +752,8 @@ var commonReducer = toolkit.createReducer(initialState, function (builder) {
595
752
  state.language = action.payload;
596
753
  }).addCase(reset, function (_state, _action) {
597
754
  return initialState;
755
+ }).addCase(setReFetchUserAcademies, function (state, action) {
756
+ state.isReFetchUserAcademies = action.payload;
598
757
  });
599
758
  });
600
759
 
@@ -658,11 +817,6 @@ var Loading = function Loading() {
658
817
  }))) : null;
659
818
  };
660
819
 
661
- var AUTH_URL = BASE_URL + "/api/auth";
662
- var getInfo = function getInfo() {
663
- return api.get(AUTH_URL + "/info");
664
- };
665
-
666
820
  var LayoutContext = function LayoutContext(_ref) {
667
821
  var children = _ref.children,
668
822
  role = _ref.role,
@@ -671,6 +825,8 @@ var LayoutContext = function LayoutContext(_ref) {
671
825
  onNavigate: onNavigate
672
826
  }),
673
827
  handleSignOut = _useGoogleSignOut.handleSignOut;
828
+ var _useTranslation = reactI18next.useTranslation(),
829
+ t = _useTranslation.t;
674
830
  var dispatch = reactRedux.useDispatch();
675
831
  var user = reactRedux.useSelector(function (state) {
676
832
  var _state$common;
@@ -682,7 +838,7 @@ var LayoutContext = function LayoutContext(_ref) {
682
838
  };
683
839
  var checkRoleUser = React.useCallback(function () {
684
840
  if (!user) return;
685
- if (!roles.includes(role)) {
841
+ if (!roles.includes(role) && !!user.academyDomain) {
686
842
  alert(user.email + " not allow to register " + role);
687
843
  resetAuth();
688
844
  }
@@ -699,7 +855,7 @@ var LayoutContext = function LayoutContext(_ref) {
699
855
  }
700
856
  dispatch(setLoading(true));
701
857
  var _temp = _catch(function () {
702
- return Promise.resolve(getInfo()).then(function (info) {
858
+ return Promise.resolve(getAcademyDomain() ? getInfo() : getSuperAdminInfoFromWeb()).then(function (info) {
703
859
  if (!info) {
704
860
  resetAuth();
705
861
  }
@@ -709,7 +865,7 @@ var LayoutContext = function LayoutContext(_ref) {
709
865
  console.log({
710
866
  err: err
711
867
  });
712
- role === "Student" ? alert("학생, 다시 로그인해주세요.") : alert("선생님, 다시 로그인해주세요.");
868
+ alert(t(role === exports.Role.Student ? "student_login_again" : role === exports.Role.Admin ? "admin_login_again" : "teacher_login_again"));
713
869
  resetAuth();
714
870
  });
715
871
  return Promise.resolve(_temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp));
@@ -728,12 +884,12 @@ var ConfirmDialog = function ConfirmDialog(_ref) {
728
884
  var open = _ref.open,
729
885
  text = _ref.text,
730
886
  _ref$cancelText = _ref.cancelText,
731
- cancelText = _ref$cancelText === void 0 ? "No" : _ref$cancelText,
887
+ cancelText = _ref$cancelText === void 0 ? "아니요" : _ref$cancelText,
732
888
  _ref$okText = _ref.okText,
733
- okText = _ref$okText === void 0 ? "Yes" : _ref$okText,
889
+ okText = _ref$okText === void 0 ? "" : _ref$okText,
734
890
  isDelete = _ref.isDelete,
735
891
  _ref$title = _ref.title,
736
- title = _ref$title === void 0 ? "Confirmation" : _ref$title,
892
+ title = _ref$title === void 0 ? "확인" : _ref$title,
737
893
  toggle = _ref.toggle,
738
894
  onConfirm = _ref.onConfirm,
739
895
  confirmText = _ref.confirmText;
@@ -997,6 +1153,7 @@ var number_question = "{{number}}번";
997
1153
  var answer_rate = "정답률";
998
1154
  var seconds = "초";
999
1155
  var search_placeholder = "시험 이름으로 검색하기";
1156
+ var search_by_student = "학생명으로 검색하기";
1000
1157
  var study_touch = "영어연구소";
1001
1158
  var exam_information = "시험정보";
1002
1159
  var issue_number = "문제번호";
@@ -1054,6 +1211,65 @@ var saturday = "토요일";
1054
1211
  var total_lessons = "총 수업";
1055
1212
  var weekly_days_required = "평일 필수";
1056
1213
  var main_teacher = "주 교사";
1214
+ var the_first = "첫번째";
1215
+ var the_second = "두번째";
1216
+ var the_third = "세번째";
1217
+ var the_fourth = "네번째";
1218
+ var the_fifth = "다섯번째";
1219
+ var the_sixth = "여섯번째";
1220
+ var the_seventh = "일곱번째";
1221
+ var the_eighth = "여덟번째";
1222
+ var the_ninth = "아홉번째";
1223
+ var the_tenth = "열번째";
1224
+ var full_name_required = "성명은 필수 항목입니다";
1225
+ var email_required = "이메일은 필수입니다";
1226
+ var enter_full_name = "이름을 입력하세요";
1227
+ var enter_email = "이메일을 입력하세요";
1228
+ var admin = "관리자";
1229
+ var active = "활동적인";
1230
+ var create_new_user = "새 사용자 만들기";
1231
+ var update_user = "사용자 업데이트";
1232
+ var save = "구하다";
1233
+ var create_academy = "아카데미 만들기";
1234
+ var update_academy = "아카데미 업데이트";
1235
+ var connection_string = "연결 문자열";
1236
+ var image = "영상";
1237
+ var enter_academy_name = "학원명을 입력하세요";
1238
+ var enter_connection_string = "연결 문자열을 입력하세요";
1239
+ var academy_name_required = "아카데미 이름이 필요합니다";
1240
+ var connection_string_required = "연결 문자열 이름이 필요합니다";
1241
+ var not_allow_register_account_contact_admin = "가입 권한이 없는 계정입니다. 관리자에게 문의하세요.";
1242
+ var request_login_fail = "로그인 실패 요청!";
1243
+ var student_login_again = "학생, 다시 로그인해주세요.";
1244
+ var teacher_login_again = "선생님, 다시 로그인해주세요.";
1245
+ var admin_login_again = "선생님, 다시 로그인해주세요.";
1246
+ var domain_required = "도메인 이름이 필요합니다";
1247
+ var domain_name = "도메인 이름";
1248
+ var enter_academy_domain = "아카데미 도메인을 입력하세요";
1249
+ var created_by = "창조자";
1250
+ var modification_code = "시험 코드 수정은 불가능합니다.";
1251
+ var total_student_joined = "학생이 합류했습니다";
1252
+ var copy_to_clipboard = "클립 보드에 복사";
1253
+ var code_exam = "시험 코드";
1254
+ var button = {
1255
+ close: "닫기",
1256
+ send: "보내기"
1257
+ };
1258
+ var question_and_answer = "질문 및 답변";
1259
+ var problem_number_question = "문제 {{number}}번";
1260
+ var teacher_in_charge = "담당 교사";
1261
+ var counselor = "상담교사";
1262
+ var new_question = "새로운 질문";
1263
+ var hour = "시간";
1264
+ var minute = "분";
1265
+ var second = "두번째";
1266
+ var question_order = "{{number}} 번";
1267
+ var send_message = "메시지 보내기";
1268
+ var class_inquiry = "수업 문의";
1269
+ var no_academies_available = "이용 가능한 아카데미가 없습니다";
1270
+ var not_allow_register = "역할 등록을 허용하지 않음";
1271
+ var credentials_invalid = "자격 증명이 잘못되었습니다.";
1272
+ var role_is_invalid = "역할이 잘못되었습니다";
1057
1273
  var lang_ko = {
1058
1274
  problem_solving: problem_solving,
1059
1275
  my_story: my_story,
@@ -1099,6 +1315,7 @@ var lang_ko = {
1099
1315
  answer_rate: answer_rate,
1100
1316
  seconds: seconds,
1101
1317
  search_placeholder: search_placeholder,
1318
+ search_by_student: search_by_student,
1102
1319
  study_touch: study_touch,
1103
1320
  exam_information: exam_information,
1104
1321
  issue_number: issue_number,
@@ -1155,7 +1372,64 @@ var lang_ko = {
1155
1372
  saturday: saturday,
1156
1373
  total_lessons: total_lessons,
1157
1374
  weekly_days_required: weekly_days_required,
1158
- main_teacher: main_teacher
1375
+ main_teacher: main_teacher,
1376
+ the_first: the_first,
1377
+ the_second: the_second,
1378
+ the_third: the_third,
1379
+ the_fourth: the_fourth,
1380
+ the_fifth: the_fifth,
1381
+ the_sixth: the_sixth,
1382
+ the_seventh: the_seventh,
1383
+ the_eighth: the_eighth,
1384
+ the_ninth: the_ninth,
1385
+ the_tenth: the_tenth,
1386
+ full_name_required: full_name_required,
1387
+ email_required: email_required,
1388
+ enter_full_name: enter_full_name,
1389
+ enter_email: enter_email,
1390
+ admin: admin,
1391
+ active: active,
1392
+ create_new_user: create_new_user,
1393
+ update_user: update_user,
1394
+ save: save,
1395
+ create_academy: create_academy,
1396
+ update_academy: update_academy,
1397
+ connection_string: connection_string,
1398
+ image: image,
1399
+ enter_academy_name: enter_academy_name,
1400
+ enter_connection_string: enter_connection_string,
1401
+ academy_name_required: academy_name_required,
1402
+ connection_string_required: connection_string_required,
1403
+ not_allow_register_account_contact_admin: not_allow_register_account_contact_admin,
1404
+ request_login_fail: request_login_fail,
1405
+ student_login_again: student_login_again,
1406
+ teacher_login_again: teacher_login_again,
1407
+ admin_login_again: admin_login_again,
1408
+ domain_required: domain_required,
1409
+ domain_name: domain_name,
1410
+ enter_academy_domain: enter_academy_domain,
1411
+ created_by: created_by,
1412
+ modification_code: modification_code,
1413
+ total_student_joined: total_student_joined,
1414
+ copy_to_clipboard: copy_to_clipboard,
1415
+ code_exam: code_exam,
1416
+ button: button,
1417
+ question_and_answer: question_and_answer,
1418
+ problem_number_question: problem_number_question,
1419
+ teacher_in_charge: teacher_in_charge,
1420
+ counselor: counselor,
1421
+ new_question: new_question,
1422
+ hour: hour,
1423
+ minute: minute,
1424
+ second: second,
1425
+ question_order: question_order,
1426
+ send_message: send_message,
1427
+ class_inquiry: class_inquiry,
1428
+ no_academies_available: no_academies_available,
1429
+ not_allow_register: not_allow_register,
1430
+ credentials_invalid: credentials_invalid,
1431
+ role_is_invalid: role_is_invalid,
1432
+ "q&a": "질의응답"
1159
1433
  };
1160
1434
 
1161
1435
  var problem_solving$1 = "Problem Solving";
@@ -1202,6 +1476,7 @@ var number_question$1 = "No.{{number}}";
1202
1476
  var answer_rate$1 = "Answer rate";
1203
1477
  var seconds$1 = "s";
1204
1478
  var search_placeholder$1 = "Search by exam name";
1479
+ var search_by_student$1 = "Search by student name";
1205
1480
  var study_touch$1 = "Study touch";
1206
1481
  var exam_information$1 = "Exam information";
1207
1482
  var issue_number$1 = "Issue number";
@@ -1295,6 +1570,65 @@ var weekly_days_required$1 = "Weekly days are required";
1295
1570
  var main_teacher$1 = "Main teacher";
1296
1571
  var main_teacher_required = "Main teacher is required";
1297
1572
  var teacher = "Teacher";
1573
+ var the_first$1 = "The first";
1574
+ var the_second$1 = "The second";
1575
+ var the_third$1 = "The third";
1576
+ var the_fourth$1 = "The fourth";
1577
+ var the_fifth$1 = "The fifth";
1578
+ var the_sixth$1 = "The sixth";
1579
+ var the_seventh$1 = "The seventh";
1580
+ var the_eighth$1 = "The eighth";
1581
+ var the_ninth$1 = "The ninth";
1582
+ var the_tenth$1 = "The tenth";
1583
+ var full_name_required$1 = "Full name is required";
1584
+ var email_required$1 = "Email is required";
1585
+ var enter_full_name$1 = "Enter full name";
1586
+ var enter_email$1 = "Enter email";
1587
+ var admin$1 = "Admin";
1588
+ var active$1 = "Active";
1589
+ var create_new_user$1 = "Create new user";
1590
+ var update_user$1 = "Update user";
1591
+ var save$1 = "Save";
1592
+ var create_academy$1 = "Create academy";
1593
+ var update_academy$1 = "Update academy";
1594
+ var connection_string$1 = "Connection string";
1595
+ var image$1 = "Image";
1596
+ var enter_academy_name$1 = "Enter academy name";
1597
+ var enter_connection_string$1 = "Enter connection string";
1598
+ var academy_name_required$1 = "Academy name required";
1599
+ var connection_string_required$1 = "Connection string name required";
1600
+ var not_allow_register_account_contact_admin$1 = "This account does not have permission to sign up. Please contact your administrator.";
1601
+ var request_login_fail$1 = "Request login failure!";
1602
+ var student_login_again$1 = "Student, please log in again.";
1603
+ var teacher_login_again$1 = "Teacher, please log in again.";
1604
+ var admin_login_again$1 = "Admin, please log in again.";
1605
+ var domain_required$1 = "Domain name required";
1606
+ var domain_name$1 = "Domain name";
1607
+ var enter_academy_domain$1 = "Enter academy domain";
1608
+ var created_by$1 = "Created by";
1609
+ var modification_code$1 = "Modification of test code is not possible";
1610
+ var total_student_joined$1 = "Students have joined";
1611
+ var code_exam$1 = "Exam code";
1612
+ var copy_to_clipboard$1 = "Copy to clipboard";
1613
+ var button$1 = {
1614
+ close: "Close",
1615
+ send: "Send"
1616
+ };
1617
+ var question_and_answer$1 = "Question And Answer";
1618
+ var problem_number_question$1 = "Problem No.{{number}}";
1619
+ var teacher_in_charge$1 = "Teacher In Charge";
1620
+ var counselor$1 = "Counselor";
1621
+ var new_question$1 = "New Question";
1622
+ var hour$1 = "hour";
1623
+ var minute$1 = "minutes";
1624
+ var second$1 = "second";
1625
+ var question_order$1 = "Number {{number}}";
1626
+ var send_message$1 = "Send Message";
1627
+ var class_inquiry$1 = "Class inquiry";
1628
+ var no_academies_available$1 = "No academies available";
1629
+ var not_allow_register$1 = "Not allow to register role";
1630
+ var credentials_invalid$1 = "Credentials is invalid";
1631
+ var role_is_invalid$1 = "Role is invalid";
1298
1632
  var lang_en = {
1299
1633
  problem_solving: problem_solving$1,
1300
1634
  my_story: my_story$1,
@@ -1340,6 +1674,7 @@ var lang_en = {
1340
1674
  answer_rate: answer_rate$1,
1341
1675
  seconds: seconds$1,
1342
1676
  search_placeholder: search_placeholder$1,
1677
+ search_by_student: search_by_student$1,
1343
1678
  study_touch: study_touch$1,
1344
1679
  exam_information: exam_information$1,
1345
1680
  issue_number: issue_number$1,
@@ -1432,7 +1767,64 @@ var lang_en = {
1432
1767
  weekly_days_required: weekly_days_required$1,
1433
1768
  main_teacher: main_teacher$1,
1434
1769
  main_teacher_required: main_teacher_required,
1435
- teacher: teacher
1770
+ teacher: teacher,
1771
+ the_first: the_first$1,
1772
+ the_second: the_second$1,
1773
+ the_third: the_third$1,
1774
+ the_fourth: the_fourth$1,
1775
+ the_fifth: the_fifth$1,
1776
+ the_sixth: the_sixth$1,
1777
+ the_seventh: the_seventh$1,
1778
+ the_eighth: the_eighth$1,
1779
+ the_ninth: the_ninth$1,
1780
+ the_tenth: the_tenth$1,
1781
+ full_name_required: full_name_required$1,
1782
+ email_required: email_required$1,
1783
+ enter_full_name: enter_full_name$1,
1784
+ enter_email: enter_email$1,
1785
+ admin: admin$1,
1786
+ active: active$1,
1787
+ create_new_user: create_new_user$1,
1788
+ update_user: update_user$1,
1789
+ save: save$1,
1790
+ create_academy: create_academy$1,
1791
+ update_academy: update_academy$1,
1792
+ connection_string: connection_string$1,
1793
+ image: image$1,
1794
+ enter_academy_name: enter_academy_name$1,
1795
+ enter_connection_string: enter_connection_string$1,
1796
+ academy_name_required: academy_name_required$1,
1797
+ connection_string_required: connection_string_required$1,
1798
+ not_allow_register_account_contact_admin: not_allow_register_account_contact_admin$1,
1799
+ request_login_fail: request_login_fail$1,
1800
+ student_login_again: student_login_again$1,
1801
+ teacher_login_again: teacher_login_again$1,
1802
+ admin_login_again: admin_login_again$1,
1803
+ domain_required: domain_required$1,
1804
+ domain_name: domain_name$1,
1805
+ enter_academy_domain: enter_academy_domain$1,
1806
+ created_by: created_by$1,
1807
+ modification_code: modification_code$1,
1808
+ total_student_joined: total_student_joined$1,
1809
+ code_exam: code_exam$1,
1810
+ copy_to_clipboard: copy_to_clipboard$1,
1811
+ button: button$1,
1812
+ question_and_answer: question_and_answer$1,
1813
+ problem_number_question: problem_number_question$1,
1814
+ teacher_in_charge: teacher_in_charge$1,
1815
+ counselor: counselor$1,
1816
+ new_question: new_question$1,
1817
+ hour: hour$1,
1818
+ minute: minute$1,
1819
+ second: second$1,
1820
+ question_order: question_order$1,
1821
+ send_message: send_message$1,
1822
+ class_inquiry: class_inquiry$1,
1823
+ no_academies_available: no_academies_available$1,
1824
+ not_allow_register: not_allow_register$1,
1825
+ credentials_invalid: credentials_invalid$1,
1826
+ role_is_invalid: role_is_invalid$1,
1827
+ "q&a": "Q&A"
1436
1828
  };
1437
1829
 
1438
1830
  i18n.use(reactI18next.initReactI18next).init({
@@ -1526,9 +1918,9 @@ var TheLanguageDropdown = function TheLanguageDropdown() {
1526
1918
  return React__default.createElement(reactstrap.Dropdown, {
1527
1919
  isOpen: dropdownOpen,
1528
1920
  toggle: toggle,
1529
- className: "" + styles["dropdown-menu"]
1921
+ className: "" + stylesGlobal["dropdown-menu"]
1530
1922
  }, React__default.createElement(reactstrap.DropdownToggle, {
1531
- className: styles["header-avatar"] + " d-flex align-items-center"
1923
+ className: stylesGlobal["header-avatar"] + " d-flex align-items-center"
1532
1924
  }, React__default.createElement("span", {
1533
1925
  style: {
1534
1926
  color: "#000",
@@ -1537,7 +1929,7 @@ var TheLanguageDropdown = function TheLanguageDropdown() {
1537
1929
  alignItems: 'center'
1538
1930
  }
1539
1931
  }, !!currentLanguage && React__default.createElement("img", {
1540
- className: "mr-2 " + styles['dropdown-menu-flag'],
1932
+ className: "mr-2 " + stylesGlobal['dropdown-menu-flag'],
1541
1933
  src: currentLanguage.image
1542
1934
  }), !!currentLanguage && currentLanguage.shortName, React__default.createElement(io5.IoChevronDown, {
1543
1935
  className: "ml-2",
@@ -1547,16 +1939,16 @@ var TheLanguageDropdown = function TheLanguageDropdown() {
1547
1939
  marginTop: "2px"
1548
1940
  }
1549
1941
  }))), React__default.createElement(reactstrap.DropdownMenu, {
1550
- className: styles["dropdown-content-language"]
1942
+ className: stylesGlobal["dropdown-content-language"]
1551
1943
  }, LANGUAGES.map(function (lang, index) {
1552
1944
  return React__default.createElement(reactstrap.DropdownItem, {
1553
1945
  key: lang.code,
1554
- className: styles["dropdown-change"] + " px-0 py-0 " + (index === LANGUAGES.length - 1 ? "pb-2" : "pt-2"),
1946
+ className: stylesGlobal["dropdown-change"] + " px-0 py-0 " + (index === LANGUAGES.length - 1 ? "pb-2" : "pt-2"),
1555
1947
  onClick: function onClick() {
1556
1948
  return setItemLanguage(lang.code);
1557
1949
  }
1558
1950
  }, React__default.createElement("div", {
1559
- className: styles["dropdown-item-language"] + " " + styles["item-logout"] + " " + (language == lang.code ? styles['dropdown-item-language-active'] : "") + " d-flex align-items-center w-100"
1951
+ className: stylesGlobal["dropdown-item-language"] + " " + stylesGlobal["item-logout"] + " " + (language == lang.code ? stylesGlobal['dropdown-item-language-active'] : "") + " d-flex align-items-center w-100"
1560
1952
  }, React__default.createElement("span", {
1561
1953
  className: "mr-2 d-flex hover-opacity"
1562
1954
  }, React__default.createElement("img", {
@@ -1569,6 +1961,196 @@ var TheLanguageDropdown = function TheLanguageDropdown() {
1569
1961
  })));
1570
1962
  };
1571
1963
 
1964
+ var ACADEMY_URL = BASE_URL + "/api/academy";
1965
+ var SUPER_ADMIN_ACADEMY_URL = SUPER_ADMIN_BASE_URL + "/api/academies";
1966
+ var getAcademyList = function getAcademyList(role) {
1967
+ return api.get(SUPER_ADMIN_ACADEMY_URL + "/active", {
1968
+ params: {
1969
+ role: role
1970
+ }
1971
+ });
1972
+ };
1973
+ var getUserAcademies = function getUserAcademies(role) {
1974
+ return api.get("" + ACADEMY_URL, {
1975
+ params: {
1976
+ role: role
1977
+ }
1978
+ });
1979
+ };
1980
+ var switchAcademy = function switchAcademy(academyId) {
1981
+ return api.post(ACADEMY_URL + "/switch-academy?academyId=" + academyId);
1982
+ };
1983
+
1984
+ var useSwitchAcademy = function useSwitchAcademy(role, navigate, homeAcademyUrl, homeUrl) {
1985
+ if (role === void 0) {
1986
+ role = exports.Role.Student;
1987
+ }
1988
+ var dispatch = reactRedux.useDispatch();
1989
+ var _useLogin = useLogin(navigate, homeAcademyUrl, homeUrl),
1990
+ handleLoginAccessToken = _useLogin.handleLoginAccessToken;
1991
+ var _useState = React.useState(false),
1992
+ dropdownOpen = _useState[0],
1993
+ setDropdownOpen = _useState[1];
1994
+ var toggleDropdown = function toggleDropdown() {
1995
+ return setDropdownOpen(function (prevState) {
1996
+ return !prevState;
1997
+ });
1998
+ };
1999
+ var _useState2 = React.useState([]),
2000
+ academyList = _useState2[0],
2001
+ setAcademyList = _useState2[1];
2002
+ var user = reactRedux.useSelector(function (state) {
2003
+ var _state$common;
2004
+ return state === null || state === void 0 ? void 0 : (_state$common = state.common) === null || _state$common === void 0 ? void 0 : _state$common.user;
2005
+ });
2006
+ var isReFetchUserAcademies = reactRedux.useSelector(function (state) {
2007
+ var _state$common2;
2008
+ return state === null || state === void 0 ? void 0 : (_state$common2 = state.common) === null || _state$common2 === void 0 ? void 0 : _state$common2.isReFetchUserAcademies;
2009
+ });
2010
+ var getAcademies = function getAcademies(isLoading) {
2011
+ if (isLoading === void 0) {
2012
+ isLoading = true;
2013
+ }
2014
+ try {
2015
+ var _temp3 = function _temp3() {
2016
+ isLoading && dispatch(setLoading(false));
2017
+ };
2018
+ if (!user) return Promise.resolve();
2019
+ var isSuperAdminUser = user && !user.academyDomain;
2020
+ var isSuperAdminRole = user.roles.includes(exports.Role.Admin);
2021
+ isLoading && dispatch(setLoading(true));
2022
+ var _temp2 = _catch(function () {
2023
+ return Promise.resolve(isSuperAdminUser ? getAcademyList(role) : getUserAcademies(role)).then(function (res) {
2024
+ var items = res.data.items || [];
2025
+ if (isReFetchUserAcademies) dispatch(setReFetchUserAcademies(false));
2026
+ setAcademyList(items);
2027
+ var _temp = function () {
2028
+ if (!isSuperAdminRole && isSuperAdminUser && role == exports.Role.Admin && items.length > 0) {
2029
+ return Promise.resolve(handleSwitchAcademy(items[0], false)).then(function () {});
2030
+ }
2031
+ }();
2032
+ if (_temp && _temp.then) return _temp.then(function () {});
2033
+ });
2034
+ }, function (error) {
2035
+ var _error$response, _error$response$data;
2036
+ reactToastify.toast.error((error === null || error === void 0 ? void 0 : (_error$response = error.response) === null || _error$response === void 0 ? void 0 : (_error$response$data = _error$response.data) === null || _error$response$data === void 0 ? void 0 : _error$response$data.tile) || "Get user academies failed");
2037
+ });
2038
+ return Promise.resolve(_temp2 && _temp2.then ? _temp2.then(_temp3) : _temp3(_temp2));
2039
+ } catch (e) {
2040
+ return Promise.reject(e);
2041
+ }
2042
+ };
2043
+ var handleSwitchAcademy = function handleSwitchAcademy(selectedAcademy, isLoading) {
2044
+ if (isLoading === void 0) {
2045
+ isLoading = true;
2046
+ }
2047
+ try {
2048
+ var _temp5 = function _temp5() {
2049
+ isLoading && dispatch(setLoading(false));
2050
+ };
2051
+ isLoading && dispatch(setLoading(true));
2052
+ var academyId = selectedAcademy ? selectedAcademy.id : 0;
2053
+ var academyDomain = selectedAcademy ? selectedAcademy.domain : undefined;
2054
+ var _temp4 = _catch(function () {
2055
+ return Promise.resolve(switchAcademy(academyId)).then(function (res) {
2056
+ var data = res.data;
2057
+ var requestBody = {
2058
+ accessToken: data.accessToken,
2059
+ email: user.email,
2060
+ academyId: academyId,
2061
+ role: role
2062
+ };
2063
+ academyDomain && localStorage.setItem(ACADEMY_DOMAIN, academyDomain);
2064
+ !academyDomain && localStorage.removeItem(ACADEMY_DOMAIN);
2065
+ return Promise.resolve(handleLoginAccessToken(requestBody, false, user.academyDomain ? academyDomain : undefined)).then(function () {});
2066
+ });
2067
+ }, function (error) {
2068
+ var _error$response2, _error$response2$data;
2069
+ reactToastify.toast.error((error === null || error === void 0 ? void 0 : (_error$response2 = error.response) === null || _error$response2 === void 0 ? void 0 : (_error$response2$data = _error$response2.data) === null || _error$response2$data === void 0 ? void 0 : _error$response2$data.title) || "Switch academy failed");
2070
+ });
2071
+ return Promise.resolve(_temp4 && _temp4.then ? _temp4.then(_temp5) : _temp5(_temp4));
2072
+ } catch (e) {
2073
+ return Promise.reject(e);
2074
+ }
2075
+ };
2076
+ React.useEffect(function () {
2077
+ getAcademies();
2078
+ }, [user === null || user === void 0 ? void 0 : user.academyDomain, user === null || user === void 0 ? void 0 : user.email]);
2079
+ React.useEffect(function () {
2080
+ isReFetchUserAcademies && getAcademies(false);
2081
+ }, [isReFetchUserAcademies]);
2082
+ var selectedAcademy = React.useMemo(function () {
2083
+ return academyList.find(function (i) {
2084
+ var _user$academyDomain;
2085
+ return i.domain.trim().toLowerCase() === (user === null || user === void 0 ? void 0 : (_user$academyDomain = user.academyDomain) === null || _user$academyDomain === void 0 ? void 0 : _user$academyDomain.trim().toLowerCase());
2086
+ });
2087
+ }, [user === null || user === void 0 ? void 0 : user.academyDomain, JSON.stringify(academyList)]);
2088
+ return {
2089
+ selectedAcademy: selectedAcademy,
2090
+ dropdownOpen: dropdownOpen,
2091
+ academyList: academyList,
2092
+ toggleDropdown: toggleDropdown,
2093
+ handleSwitchAcademy: handleSwitchAcademy
2094
+ };
2095
+ };
2096
+
2097
+ var TheAcademyDropdown = function TheAcademyDropdown(_ref) {
2098
+ var _selectedAcademy$name, _selectedAcademy$name2;
2099
+ var homeAcademyUrl = _ref.homeAcademyUrl,
2100
+ homeUrl = _ref.homeUrl,
2101
+ navigate = _ref.navigate,
2102
+ role = _ref.role;
2103
+ var _useSwitchAcademy = useSwitchAcademy(role, navigate, homeAcademyUrl, homeUrl),
2104
+ dropdownOpen = _useSwitchAcademy.dropdownOpen,
2105
+ academyList = _useSwitchAcademy.academyList,
2106
+ toggleDropdown = _useSwitchAcademy.toggleDropdown,
2107
+ handleSwitchAcademy = _useSwitchAcademy.handleSwitchAcademy,
2108
+ selectedAcademy = _useSwitchAcademy.selectedAcademy;
2109
+ var firstLetter = selectedAcademy === null || selectedAcademy === void 0 ? void 0 : (_selectedAcademy$name = selectedAcademy.name) === null || _selectedAcademy$name === void 0 ? void 0 : (_selectedAcademy$name2 = _selectedAcademy$name.charAt(0)) === null || _selectedAcademy$name2 === void 0 ? void 0 : _selectedAcademy$name2.toUpperCase();
2110
+ return React__default.createElement(reactstrap.Dropdown, {
2111
+ isOpen: dropdownOpen,
2112
+ toggle: toggleDropdown,
2113
+ className: stylesGlobal["dropdown-menu"] + " " + stylesGlobal["dropdown-academy"]
2114
+ }, React__default.createElement(reactstrap.DropdownToggle, {
2115
+ className: stylesGlobal["header-avatar"] + " d-flex align-items-center"
2116
+ }, React__default.createElement("div", {
2117
+ className: "" + stylesGlobal["image-academy"]
2118
+ }, selectedAcademy !== null && selectedAcademy !== void 0 && selectedAcademy.image ? React__default.createElement("img", {
2119
+ src: selectedAcademy === null || selectedAcademy === void 0 ? void 0 : selectedAcademy.image,
2120
+ alt: selectedAcademy === null || selectedAcademy === void 0 ? void 0 : selectedAcademy.name
2121
+ }) : React__default.createElement("span", null, firstLetter)), React__default.createElement("p", {
2122
+ className: "text-start mb-0",
2123
+ style: {
2124
+ fontSize: 14,
2125
+ fontWeight: 600,
2126
+ color: "#5458D5",
2127
+ minWidth: 150
2128
+ }
2129
+ }, (selectedAcademy === null || selectedAcademy === void 0 ? void 0 : selectedAcademy.name) || "No selected academy"), React__default.createElement("div", {
2130
+ className: "" + stylesGlobal["switch-icon"]
2131
+ }, React__default.createElement(go.GoArrowSwitch, {
2132
+ size: 14
2133
+ }))), React__default.createElement(reactstrap.DropdownMenu, {
2134
+ className: stylesGlobal["dropdown-content-academy"]
2135
+ }, academyList.map(function (academy) {
2136
+ return React__default.createElement(reactstrap.DropdownItem, {
2137
+ key: academy.id,
2138
+ className: stylesGlobal["dropdown-academy-item"] + " px-0 py-0",
2139
+ onClick: function onClick() {
2140
+ return handleSwitchAcademy(academy);
2141
+ }
2142
+ }, React__default.createElement("div", {
2143
+ className: stylesGlobal["dropdown-item-language"] + " " + stylesGlobal["item-logout"] + " " + (academy.id == (selectedAcademy === null || selectedAcademy === void 0 ? void 0 : selectedAcademy.id) ? stylesGlobal["dropdown-item-language-active"] : "") + " d-flex align-items-center w-100"
2144
+ }, React__default.createElement("span", {
2145
+ className: "mr-2 d-flex hover-opacity " + stylesGlobal["image-academy"]
2146
+ }, academy.image ? React__default.createElement("img", {
2147
+ src: academy.image
2148
+ }) : React__default.createElement("span", null, academy.name.charAt(0).toUpperCase())), academy.name));
2149
+ }), !academyList.length && React__default.createElement("p", {
2150
+ className: "px-2 text-center"
2151
+ }, "No academies available")));
2152
+ };
2153
+
1572
2154
  var minutesToTimeSpan = (function (time) {
1573
2155
  var h = Math.floor(time / 60);
1574
2156
  var m = time % 60;
@@ -1596,44 +2178,17 @@ var canAccess = function canAccess(userRoles, componentRoles) {
1596
2178
  return true;
1597
2179
  };
1598
2180
 
1599
- function _extends() {
1600
- _extends = Object.assign ? Object.assign.bind() : function (target) {
1601
- for (var i = 1; i < arguments.length; i++) {
1602
- var source = arguments[i];
1603
- for (var key in source) {
1604
- if (Object.prototype.hasOwnProperty.call(source, key)) {
1605
- target[key] = source[key];
1606
- }
1607
- }
1608
- }
1609
- return target;
1610
- };
1611
- return _extends.apply(this, arguments);
1612
- }
1613
- function _objectWithoutPropertiesLoose(source, excluded) {
1614
- if (source == null) return {};
1615
- var target = {};
1616
- var sourceKeys = Object.keys(source);
1617
- var key, i;
1618
- for (i = 0; i < sourceKeys.length; i++) {
1619
- key = sourceKeys[i];
1620
- if (excluded.indexOf(key) >= 0) continue;
1621
- target[key] = source[key];
1622
- }
1623
- return target;
1624
- }
1625
-
1626
- var _excluded = ["isDefault", "defaultValue", "options", "isDisabled", "scrollBottom", "value", "isMulti"];
1627
- var DropdownIndicator = function DropdownIndicator(props) {
1628
- return React__default.createElement(Select.components.DropdownIndicator, Object.assign({}, props), React__default.createElement(fa.FaCaretDown, {
1629
- color: "#5458D5"
1630
- }));
1631
- };
1632
- var CustomOption = function CustomOption(props) {
1633
- return React__default.createElement(Select.components.Option, Object.assign({}, props), React__default.createElement("div", {
1634
- style: {
1635
- fontSize: "14px",
1636
- fontWeight: 500
2181
+ var _excluded$1 = ["isDefault", "defaultValue", "options", "isDisabled", "scrollBottom", "value", "isMulti"];
2182
+ var DropdownIndicator = function DropdownIndicator(props) {
2183
+ return React__default.createElement(Select.components.DropdownIndicator, Object.assign({}, props), React__default.createElement(fa.FaCaretDown, {
2184
+ color: "#5458D5"
2185
+ }));
2186
+ };
2187
+ var CustomOption = function CustomOption(props) {
2188
+ return React__default.createElement(Select.components.Option, Object.assign({}, props), React__default.createElement("div", {
2189
+ style: {
2190
+ fontSize: "14px",
2191
+ fontWeight: 500
1637
2192
  }
1638
2193
  }, props.data.label));
1639
2194
  };
@@ -1668,7 +2223,7 @@ var CustomSelect = function CustomSelect(_ref) {
1668
2223
  scrollBottom = _ref.scrollBottom,
1669
2224
  value = _ref.value,
1670
2225
  isMulti = _ref.isMulti,
1671
- rest = _objectWithoutPropertiesLoose(_ref, _excluded);
2226
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$1);
1672
2227
  var _useTranslation = reactI18next.useTranslation(),
1673
2228
  t = _useTranslation.t;
1674
2229
  var initialValues = Array.isArray(value) ? options.filter(function (i) {
@@ -1697,7 +2252,161 @@ var CustomSelect = function CustomSelect(_ref) {
1697
2252
  }, rest));
1698
2253
  };
1699
2254
 
1700
- var styles$1 = {"header__avatar":"_2oGcJ","header__select":"_2y2XV","body":"_ntGyI","list":"_m7Fwt","list__item__header":"_3BM8N","list__item__avatar":"_1ReOK","list__item__avatar-container":"_2qbld","list__item__message":"_3s01i","list__item__message--reply-from":"_2Qxi3","list__item__message--reply-from-right":"_34Vx4","list__item__message--reply":"_3uheq","list__item__message--reply-right":"_2iBr7","reply-text":"_3ZPjO"};
2255
+ var styles = {"header__avatar":"_2oGcJ","header__select":"_2y2XV","body":"_ntGyI","list":"_m7Fwt","list__item__header":"_3BM8N","list__item__avatar":"_1ReOK","list__item__avatar-container":"_2qbld","list__item__message":"_3s01i","list__item__message--reply-from":"_2Qxi3","list__item__message--reply-from-right":"_34Vx4","list__item__message--reply":"_3uheq","list__item__message--reply-right":"_2iBr7","reply-text":"_3ZPjO","container-custom":"_38A9k","student-row-col-1":"_Jt5t0","student-row-col-1-active":"_14DKj","row-col-2":"_qHGiR","inputBox":"_2iY67","inputBoxTable":"_3pCw0","background-chat":"_zILbw","wrap-content":"_38gsM","name-sender":"_Lfzyw","content-chat-sender":"_1X73E","content-chat-receiver":"_32V7T","custom-scroll":"_2Uul2","btn-send":"_395lb","btn-chat":"_gDYwm","input-chat":"_22TX5","btn-cancel":"_1u-eg","btn-register":"_22r6_","form-label-dialog":"_jADIA","form-select-width":"_WncPd","padding-content":"_3hz3H"};
2256
+
2257
+ var iconPersonNoActive = function iconPersonNoActive(_ref) {
2258
+ var _ref$width = _ref.width,
2259
+ width = _ref$width === void 0 ? "16" : _ref$width,
2260
+ _ref$height = _ref.height,
2261
+ height = _ref$height === void 0 ? "16" : _ref$height,
2262
+ color = _ref.color;
2263
+ return React__default.createElement("svg", {
2264
+ width: width,
2265
+ height: height,
2266
+ viewBox: "0 0 16 16",
2267
+ fill: color,
2268
+ xmlns: "http://www.w3.org/2000/svg"
2269
+ }, React__default.createElement("path", {
2270
+ d: "M10.395 2.01813C9.78691 1.36156 8.93753 1 8.00003 1C7.05753 1 6.20534 1.35937 5.60003 2.01187C4.98815 2.67156 4.69003 3.56813 4.76003 4.53625C4.89878 6.44625 6.35222 8 8.00003 8C9.64784 8 11.0988 6.44656 11.2397 4.53687C11.3107 3.5775 11.0107 2.68281 10.395 2.01813Z",
2271
+ fill: "#5458D5"
2272
+ }), React__default.createElement("path", {
2273
+ d: "M13.5001 15H2.50006C2.35608 15.0019 2.21349 14.9716 2.08267 14.9115C1.95185 14.8513 1.83609 14.7627 1.74381 14.6522C1.54068 14.4094 1.45881 14.0778 1.51943 13.7425C1.78318 12.2794 2.60631 11.0503 3.90006 10.1875C5.04943 9.42156 6.50537 9 8.00006 9C9.49474 9 10.9507 9.42188 12.1001 10.1875C13.3938 11.05 14.2169 12.2791 14.4807 13.7422C14.5413 14.0775 14.4594 14.4091 14.2563 14.6519C14.1641 14.7625 14.0483 14.8511 13.9175 14.9113C13.7867 14.9715 13.6441 15.0018 13.5001 15Z",
2274
+ fill: "#5458D5"
2275
+ }));
2276
+ };
2277
+
2278
+ var ChatRightItem = function ChatRightItem(_ref) {
2279
+ var content = _ref.content,
2280
+ createdAt = _ref.createdAt,
2281
+ sender = _ref.sender,
2282
+ showTimestamp = _ref.showTimestamp,
2283
+ isStudent = _ref.isStudent,
2284
+ showName = _ref.showName,
2285
+ contentType = _ref.contentType;
2286
+ var _useTranslation = reactI18next.useTranslation(),
2287
+ t = _useTranslation.t;
2288
+ return React__default.createElement("div", null, showTimestamp && React__default.createElement(material.Typography, {
2289
+ fontWeight: 500,
2290
+ fontSize: "12px",
2291
+ lineHeight: "14.32px",
2292
+ color: "#97A1AF",
2293
+ textAlign: "center"
2294
+ }, utcToLocalTime(createdAt, t("date_time_format"))), React__default.createElement(material.Grid, {
2295
+ item: true,
2296
+ xs: 12,
2297
+ display: "flex",
2298
+ justifyContent: "flex-end",
2299
+ padding: "4px 0"
2300
+ }, React__default.createElement(material.Box, null, showName && isStudent && React__default.createElement(material.Box, {
2301
+ gap: "8px",
2302
+ className: " " + styles["name-sender"],
2303
+ display: "flex",
2304
+ alignItems: "center",
2305
+ flexDirection: "row"
2306
+ }, React__default.createElement(iconPersonNoActive, null), React__default.createElement(material.Typography, {
2307
+ fontWeight: 700,
2308
+ fontSize: 14,
2309
+ padding: "4px",
2310
+ lineHeight: "16.71px",
2311
+ color: "#5458D5"
2312
+ }, sender === null || sender === void 0 ? void 0 : sender.fullName)), contentType ? React__default.createElement("img", {
2313
+ src: content,
2314
+ style: {
2315
+ backgroundRepeat: "no-repeat",
2316
+ width: "200px",
2317
+ height: "200px",
2318
+ position: "relative",
2319
+ backgroundSize: "cover"
2320
+ }
2321
+ }) : React__default.createElement("div", {
2322
+ className: styles["wrap-content"] + " " + styles["content-chat-receiver"],
2323
+ style: {
2324
+ "float": "inline-end"
2325
+ }
2326
+ }, React__default.createElement(material.Typography, {
2327
+ fontWeight: 500,
2328
+ fontSize: "14px",
2329
+ lineHeight: "16.71px",
2330
+ color: "#fffff"
2331
+ }, content)))));
2332
+ };
2333
+
2334
+ var ChatLeftItem = function ChatLeftItem(_ref) {
2335
+ var content = _ref.content,
2336
+ sender = _ref.sender,
2337
+ createdAt = _ref.createdAt,
2338
+ showTimestamp = _ref.showTimestamp,
2339
+ isStudent = _ref.isStudent,
2340
+ showName = _ref.showName,
2341
+ contentType = _ref.contentType;
2342
+ var _useTranslation = reactI18next.useTranslation(),
2343
+ t = _useTranslation.t;
2344
+ return React__default.createElement("div", null, showTimestamp && React__default.createElement(material.Typography, {
2345
+ fontWeight: 500,
2346
+ fontSize: "12px",
2347
+ lineHeight: "14.32px",
2348
+ color: "#97A1AF",
2349
+ textAlign: "center"
2350
+ }, utcToLocalTime(createdAt, t("date_time_format"))), React__default.createElement(material.Grid, {
2351
+ item: true,
2352
+ xs: 12,
2353
+ padding: "4px 0"
2354
+ }, showName && React__default.createElement(material.Box, {
2355
+ gap: "4px",
2356
+ display: "flex",
2357
+ padding: "4px",
2358
+ flexDirection: "row",
2359
+ className: "" + styles["name-sender"]
2360
+ }, isStudent ? React__default.createElement(React.Fragment, null, React__default.createElement(material.Typography, {
2361
+ fontWeight: 500,
2362
+ fontSize: 14,
2363
+ lineHeight: "16.71px",
2364
+ color: "#97A1AF"
2365
+ }, t("counselor")), React__default.createElement(material.Typography, {
2366
+ fontWeight: 700,
2367
+ fontSize: 14,
2368
+ lineHeight: "16.71px",
2369
+ color: "#97A1AF"
2370
+ }, sender === null || sender === void 0 ? void 0 : sender.fullName)) : React__default.createElement(React.Fragment, null, React__default.createElement(material.Typography, {
2371
+ fontWeight: 700,
2372
+ fontSize: 14,
2373
+ lineHeight: "16.71px",
2374
+ color: "#5458D5"
2375
+ }, sender === null || sender === void 0 ? void 0 : sender.fullName), React__default.createElement(material.Typography, {
2376
+ fontWeight: 500,
2377
+ fontSize: 14,
2378
+ lineHeight: "16.71px",
2379
+ color: "#5458D5"
2380
+ }, t("student")))), React__default.createElement(material.Box, {
2381
+ padding: "4px 0px"
2382
+ }), contentType ? React__default.createElement("img", {
2383
+ src: content,
2384
+ style: {
2385
+ backgroundRepeat: "no-repeat",
2386
+ width: "200px",
2387
+ height: "200px",
2388
+ position: "relative",
2389
+ backgroundSize: "cover"
2390
+ }
2391
+ }) : React__default.createElement("div", {
2392
+ className: styles["wrap-content"] + " " + styles["content-chat-sender"]
2393
+ }, React__default.createElement(material.Typography, {
2394
+ fontWeight: 500,
2395
+ fontSize: "14px",
2396
+ lineHeight: "16.71px",
2397
+ color: "#414E62"
2398
+ }, content))));
2399
+ };
2400
+
2401
+ (function (ChatItemType) {
2402
+ ChatItemType[ChatItemType["Default"] = 0] = "Default";
2403
+ ChatItemType[ChatItemType["Exam"] = 1] = "Exam";
2404
+ ChatItemType[ChatItemType["Class"] = 2] = "Class";
2405
+ })(exports.ChatItemType || (exports.ChatItemType = {}));
2406
+ var ChatItem = function ChatItem(props) {
2407
+ var isMe = props.isMe;
2408
+ return React__default.createElement(React.Fragment, null, isMe ? React__default.createElement(ChatRightItem, Object.assign({}, props)) : React__default.createElement(ChatLeftItem, Object.assign({}, props)));
2409
+ };
1701
2410
 
1702
2411
  var MessageSortBy;
1703
2412
  (function (MessageSortBy) {
@@ -1711,7 +2420,7 @@ var OrderBy;
1711
2420
  var StudentSortBy;
1712
2421
  (function (StudentSortBy) {
1713
2422
  StudentSortBy["CreatedAt"] = "CreatedAt";
1714
- StudentSortBy["DisplayName"] = "DisplayName";
2423
+ StudentSortBy["FullName"] = "FullName";
1715
2424
  })(StudentSortBy || (StudentSortBy = {}));
1716
2425
  var StudentOrderBy;
1717
2426
  (function (StudentOrderBy) {
@@ -1736,370 +2445,460 @@ var MessageStatus;
1736
2445
  MessageStatus["SentError"] = "Sent fail, Retry";
1737
2446
  })(MessageStatus || (MessageStatus = {}));
1738
2447
 
1739
- var ChatRightItem = function ChatRightItem(_ref) {
1740
- var id = _ref.id,
1741
- content = _ref.content,
1742
- createdAt = _ref.createdAt,
1743
- isRead = _ref.isRead,
1744
- examCode = _ref.examCode,
1745
- isSystemLog = _ref.isSystemLog,
1746
- parentId = _ref.parentId,
1747
- _ref$showExamHeader = _ref.showExamHeader,
1748
- showExamHeader = _ref$showExamHeader === void 0 ? false : _ref$showExamHeader,
1749
- _ref$isFirst = _ref.isFirst,
1750
- isFirst = _ref$isFirst === void 0 ? true : _ref$isFirst,
1751
- isLast = _ref.isLast,
1752
- actionLink = _ref.actionLink,
1753
- examId = _ref.examId,
1754
- examTitle = _ref.examTitle,
1755
- parentContent = _ref.parentContent,
1756
- status = _ref.status,
1757
- selectedReplyMessageId = _ref.selectedReplyMessageId,
1758
- selectedReplyItemRef = _ref.selectedReplyItemRef,
1759
- onAddExamMessage = _ref.onAddExamMessage,
1760
- onReTrySendMessage = _ref.onReTrySendMessage,
1761
- onGotoParentMessage = _ref.onGotoParentMessage;
1762
- var _useState = React.useState(false),
1763
- isShowTime = _useState[0],
1764
- setShowTime = _useState[1];
1765
- var _useState2 = React.useState(false),
1766
- isShowInfo = _useState2[0],
1767
- setShowInfo = _useState2[1];
1768
- var _useTranslation = reactI18next.useTranslation(),
1769
- t = _useTranslation.t;
1770
- var handleShowInfo = function handleShowInfo() {
1771
- setShowInfo(!isShowInfo);
1772
- !isFirst && !isSystemLog && setShowTime(!isShowInfo);
1773
- };
1774
- var handleReTrySendMessage = function handleReTrySendMessage() {
1775
- if (status !== MessageStatus.SentError || !content) return;
1776
- onReTrySendMessage === null || onReTrySendMessage === void 0 ? void 0 : onReTrySendMessage({
1777
- content: content,
1778
- examId: examId,
1779
- examTitle: examTitle,
1780
- parentContent: parentContent,
1781
- parentId: parentId
1782
- });
1783
- };
1784
- React.useEffect(function () {
1785
- setShowTime(isSystemLog || !!isFirst);
1786
- }, [isFirst, isSystemLog]);
1787
- return React__default.createElement("li", {
1788
- ref: selectedReplyMessageId === id ? selectedReplyItemRef : undefined,
1789
- className: "px-3 " + (!isLast ? "pb-1" : "pb-3") + " " + (!!examCode ? "border border-top-0 border-info" : "") + " " + (!!examCode && isLast ? "border-bottom-1 mb-3" : "border-bottom-0")
1790
- }, showExamHeader && isFirst && React__default.createElement("div", {
1791
- className: "d-flex bg-info justify-content-between px-3 mb-3 py-1 " + styles$1["list__item__header"]
1792
- }, React__default.createElement(reactRouterDom.Link, {
1793
- to: "" + (actionLink || "/"),
1794
- className: "text-black"
1795
- }, examTitle), !!examId && !!examTitle && !!examCode && React__default.createElement("span", {
1796
- className: "pointer text-black",
1797
- onClick: function onClick() {
1798
- return onAddExamMessage === null || onAddExamMessage === void 0 ? void 0 : onAddExamMessage(examId, examTitle, examCode);
1799
- }
1800
- }, "Add message to exam")), isSystemLog || !!isFirst ? React__default.createElement("p", {
1801
- className: "mb-0 py-1 px-3 fs-6 text-muted text-center"
1802
- }, utcToLocalTime(createdAt, t("date_time_format"))) : React__default.createElement(reactstrap.Collapse, {
1803
- className: "w-100",
1804
- isOpen: isShowTime
1805
- }, React__default.createElement("p", {
1806
- className: "mb-0 py-1 px-3 fs-6 text-muted text-center"
1807
- }, utcToLocalTime(createdAt, t("date_time_format")))), isSystemLog ? React__default.createElement("div", {
1808
- className: "text-center w-100"
1809
- }, React__default.createElement(reactRouterDom.Link, {
1810
- to: "" + (actionLink || "/"),
1811
- title: "See the results",
1812
- className: "text-primary"
1813
- }, content)) : React__default.createElement("div", {
1814
- className: "d-flex align-items-start w-100 flex-row-reverse"
1815
- }, React__default.createElement("div", {
1816
- className: "d-flex flex-column align-items-end"
1817
- }, parentId && React__default.createElement("p", {
1818
- className: "px-3 bg-light opacity-50 pointer " + styles$1["list__item__message"] + " " + styles$1["list__item__message--reply-from-right"] + " mb-0 fw-medium " + styles$1["reply-text"],
1819
- onClick: function onClick() {
1820
- return onGotoParentMessage === null || onGotoParentMessage === void 0 ? void 0 : onGotoParentMessage(parentId);
1821
- }
1822
- }, React__default.createElement("b", null, "Reply To:"), " ", parentContent), React__default.createElement("p", {
1823
- className: "mb-0 py-2 px-3 fw-medium pointer " + styles$1["list__item__message"] + " " + (parentId ? styles$1["list__item__message--reply-right"] : "") + " text-end bg-primary text-white",
1824
- onClick: handleShowInfo
1825
- }, content), status !== MessageStatus.Default && React__default.createElement("p", {
1826
- onClick: handleReTrySendMessage,
1827
- className: "fs-6 mb-0 " + (status === MessageStatus.SentError ? "text-danger text-decoration-underline pointer" : "")
1828
- }, status), !isSystemLog && status === MessageStatus.Default && React__default.createElement(reactstrap.Collapse, {
1829
- isOpen: isShowInfo
1830
- }, React__default.createElement("p", {
1831
- className: "mb-0 py-1 px-3 fs-6 text-muted text-end"
1832
- }, isRead ? "seen" : "sent")))));
1833
- };
1834
-
1835
- var ChatLeftItem = function ChatLeftItem(_ref) {
1836
- var id = _ref.id,
1837
- avatar = _ref.avatar,
1838
- content = _ref.content,
1839
- createdAt = _ref.createdAt,
1840
- examCode = _ref.examCode,
1841
- isSystemLog = _ref.isSystemLog,
1842
- parentId = _ref.parentId,
1843
- _ref$showExamHeader = _ref.showExamHeader,
1844
- showExamHeader = _ref$showExamHeader === void 0 ? false : _ref$showExamHeader,
1845
- _ref$isFirst = _ref.isFirst,
1846
- isFirst = _ref$isFirst === void 0 ? true : _ref$isFirst,
1847
- isLast = _ref.isLast,
1848
- actionLink = _ref.actionLink,
1849
- examId = _ref.examId,
1850
- examTitle = _ref.examTitle,
1851
- parentContent = _ref.parentContent,
1852
- onAddExamMessage = _ref.onAddExamMessage,
1853
- onReply = _ref.onReply,
1854
- selectedReplyMessageId = _ref.selectedReplyMessageId,
1855
- onToggleReply = _ref.onToggleReply,
1856
- selectedReplyItemRef = _ref.selectedReplyItemRef,
1857
- onGotoParentMessage = _ref.onGotoParentMessage;
1858
- var _useState = React.useState(false),
1859
- isShowTime = _useState[0],
1860
- setShowTime = _useState[1];
1861
- var _useState2 = React.useState(false),
1862
- isShowInfo = _useState2[0],
1863
- setShowInfo = _useState2[1];
1864
- var _useTranslation = reactI18next.useTranslation(),
1865
- t = _useTranslation.t;
1866
- var handleShowInfo = function handleShowInfo() {
1867
- if (!id) return;
1868
- setShowInfo(!isShowInfo);
1869
- onToggleReply === null || onToggleReply === void 0 ? void 0 : onToggleReply(id);
1870
- !isFirst && !isSystemLog && setShowTime(!isShowInfo);
1871
- };
1872
- var handleReply = function handleReply() {
1873
- if (!id) return;
1874
- onReply === null || onReply === void 0 ? void 0 : onReply(id, content || "", examId);
1875
- };
1876
- React.useEffect(function () {
1877
- setShowTime(isSystemLog || !!isFirst);
1878
- }, [isFirst, isSystemLog]);
1879
- return React__default.createElement("li", {
1880
- ref: selectedReplyMessageId === id ? selectedReplyItemRef : undefined,
1881
- className: "px-3 " + (!isLast ? "pb-1" : "pb-3") + " " + (!!examCode ? "border border-top-0 border-info" : "") + " " + (!!examCode && isLast ? "border-bottom-1 mb-3" : "border-bottom-0")
1882
- }, showExamHeader && isFirst && React__default.createElement("div", {
1883
- className: "d-flex bg-info justify-content-between px-3 mb-3 py-1 " + styles$1["list__item__header"]
1884
- }, React__default.createElement(reactRouterDom.Link, {
1885
- to: "" + (actionLink || "/"),
1886
- className: "text-black"
1887
- }, examTitle), !!examId && !!examTitle && !!examCode && React__default.createElement("span", {
1888
- className: "pointer text-black",
1889
- onClick: function onClick() {
1890
- return onAddExamMessage === null || onAddExamMessage === void 0 ? void 0 : onAddExamMessage(examId, examTitle, examCode);
1891
- }
1892
- }, "Add message to exam")), isSystemLog || !!isFirst ? React__default.createElement("p", {
1893
- className: "mb-0 py-1 px-3 fs-6 text-muted text-center"
1894
- }, utcToLocalTime(createdAt, t("date_time_format"))) : React__default.createElement(reactstrap.Collapse, {
1895
- className: "w-100",
1896
- isOpen: isShowTime
1897
- }, React__default.createElement("p", {
1898
- className: "mb-0 py-1 px-3 fs-6 text-muted text-center"
1899
- }, utcToLocalTime(createdAt, t("date_time_format")))), isSystemLog ? React__default.createElement("div", {
1900
- className: "text-center w-100"
1901
- }, React__default.createElement(reactRouterDom.Link, {
1902
- to: "" + (actionLink || "/"),
1903
- title: "See the results",
1904
- className: "text-primary"
1905
- }, content)) : React__default.createElement("div", {
1906
- className: "d-flex align-items-start w-100"
1907
- }, React__default.createElement("div", {
1908
- className: "rounded-circle " + styles$1["list__item__avatar-container"] + " bg-light me-2 mt-1 " + (isFirst ? "" : "opacity-0")
1909
- }, isFirst && React__default.createElement("img", {
1910
- className: styles$1["list__item__avatar"] + " bg-light rounded-circle",
1911
- src: avatar
1912
- })), React__default.createElement("div", {
1913
- className: "d-flex flex-column"
1914
- }, parentId && React__default.createElement("p", {
1915
- className: "opacity-50 mb-0 px-3 fw-medium pointer " + styles$1["list__item__message"] + " " + styles$1["list__item__message--reply-from"] + " " + styles$1["reply-text"] + " text-start bg-light",
1916
- onClick: function onClick() {
1917
- return onGotoParentMessage === null || onGotoParentMessage === void 0 ? void 0 : onGotoParentMessage(parentId);
1918
- }
1919
- }, React__default.createElement("b", null, "Reply To:"), " ", parentContent), React__default.createElement("p", {
1920
- className: "mb-0 py-2 px-3 fw-medium pointer " + styles$1["list__item__message"] + " " + (parentId ? styles$1["list__item__message--reply"] : "") + " text-start bg-light",
1921
- onClick: handleShowInfo
1922
- }, content), !isSystemLog && React__default.createElement(reactstrap.Collapse, {
1923
- className: "w-100",
1924
- isOpen: selectedReplyMessageId === id
1925
- }, React__default.createElement("p", {
1926
- onClick: handleReply,
1927
- className: "mb-0 py-1 px-3 fs-6 text-primary text-left pointer"
1928
- }, "Reply")))));
2448
+ var types = {
2449
+ __proto__: null,
2450
+ get MessageSortBy () { return MessageSortBy; },
2451
+ get OrderBy () { return OrderBy; },
2452
+ get StudentSortBy () { return StudentSortBy; },
2453
+ get StudentOrderBy () { return StudentOrderBy; },
2454
+ get MessageAction () { return MessageAction; },
2455
+ get MessageSourceType () { return MessageSourceType; },
2456
+ get MessageStatus () { return MessageStatus; }
1929
2457
  };
1930
2458
 
1931
- (function (ChatItemType) {
1932
- ChatItemType[ChatItemType["Default"] = 0] = "Default";
1933
- ChatItemType[ChatItemType["Exam"] = 1] = "Exam";
1934
- ChatItemType[ChatItemType["Class"] = 2] = "Class";
1935
- })(exports.ChatItemType || (exports.ChatItemType = {}));
1936
- var ChatItem = function ChatItem(props) {
1937
- var isMe = props.isMe,
1938
- onReTrySendMessage = props.onReTrySendMessage;
1939
- return React__default.createElement(React.Fragment, null, isMe ? React__default.createElement(ChatRightItem, Object.assign({}, props, {
1940
- onReTrySendMessage: onReTrySendMessage
1941
- })) : React__default.createElement(ChatLeftItem, Object.assign({}, props)));
2459
+ var ExamStatus;
2460
+ (function (ExamStatus) {
2461
+ ExamStatus["Default"] = "Default";
2462
+ ExamStatus["Pending"] = "Pending";
2463
+ ExamStatus["Inprogress"] = "Inprogress";
2464
+ ExamStatus["Completed"] = "Completed";
2465
+ })(ExamStatus || (ExamStatus = {}));
2466
+ var Roles;
2467
+ (function (Roles) {
2468
+ Roles["Student"] = "Student";
2469
+ Roles["Teacher"] = "Teacher";
2470
+ Roles["Admin"] = "Admin";
2471
+ })(Roles || (Roles = {}));
2472
+ var MESSAGE_DEFAULT_FILTER = {
2473
+ currentPage: 1,
2474
+ pageSize: 15,
2475
+ textSearch: "",
2476
+ sortColumnDirection: OrderBy.DESC,
2477
+ sortColumnName: MessageSortBy.CreatedAt
1942
2478
  };
1943
2479
 
1944
2480
  var ChatList = function ChatList(_ref) {
1945
2481
  var _ref$messages = _ref.messages,
1946
2482
  messages = _ref$messages === void 0 ? [] : _ref$messages,
1947
- onAddExamMessage = _ref.onAddExamMessage,
1948
- onReply = _ref.onReply,
2483
+ roles = _ref.roles,
1949
2484
  onReTrySendMessage = _ref.onReTrySendMessage,
1950
2485
  listItemRef = _ref.listItemRef;
1951
- var _useState = React.useState(),
1952
- selectedReplyMessageId = _useState[0],
1953
- setSelectedReplyMessageId = _useState[1];
1954
- var selectedReplyItemRef = React.useRef(null);
1955
- var handleToggleReply = function handleToggleReply(id) {
1956
- setSelectedReplyMessageId(id === selectedReplyMessageId ? undefined : id);
1957
- };
1958
- var handleSelectParentMessage = function handleSelectParentMessage(id) {
1959
- if (id === selectedReplyMessageId) selectedReplyItemRef.current && selectedReplyItemRef.current.scrollIntoView({
1960
- behavior: "smooth"
1961
- });else setSelectedReplyMessageId(id);
1962
- };
1963
- React.useEffect(function () {
1964
- selectedReplyMessageId && selectedReplyItemRef.current && selectedReplyItemRef.current.scrollIntoView({
1965
- behavior: "smooth"
2486
+ var filterMessage = React.useMemo(function () {
2487
+ var prevTime = 0;
2488
+ var prevSender;
2489
+ return messages.map(function (message) {
2490
+ var _message$sender, _message$sender2;
2491
+ var currentTime = new Date(message.createdAt).getTime();
2492
+ var showTimestamp = !prevTime || currentTime - prevTime > 20 * 60 * 1000;
2493
+ var showName = ((_message$sender = message.sender) === null || _message$sender === void 0 ? void 0 : _message$sender.fullName) !== prevSender;
2494
+ prevSender = (_message$sender2 = message.sender) === null || _message$sender2 === void 0 ? void 0 : _message$sender2.fullName;
2495
+ prevTime = currentTime;
2496
+ return _extends({}, message, {
2497
+ showTimestamp: showTimestamp,
2498
+ showName: showName
2499
+ });
1966
2500
  });
1967
- }, [selectedReplyMessageId, selectedReplyItemRef.current]);
2501
+ }, [JSON.stringify(messages)]);
2502
+ var isStudent = roles === null || roles === void 0 ? void 0 : roles.includes(Roles.Student);
1968
2503
  return React__default.createElement("ul", {
1969
2504
  ref: listItemRef,
1970
- className: styles$1["list"] + " h-100 d-flex flex-column py-3 px-0 mb-0"
1971
- }, React__default.createElement("li", {
1972
- className: "flex-grow-1",
1973
- key: "start-of-list"
1974
- }), !(messages !== null && messages !== void 0 && messages.length) && React__default.createElement("li", {
2505
+ className: styles["list"] + " " + styles["padding-content"] + " d-flex h-100 flex-column mb-0 " + (!(filterMessage !== null && filterMessage !== void 0 && filterMessage.length) ? 'justify-content-center' : '')
2506
+ }, !(filterMessage !== null && filterMessage !== void 0 && filterMessage.length) && React__default.createElement("li", {
1975
2507
  className: "text-muted text-center fst-italic fs-6"
1976
- }, "No message"), !!(messages !== null && messages !== void 0 && messages.length) && messages.map(function (message) {
2508
+ }, "No message"), !!(filterMessage !== null && filterMessage !== void 0 && filterMessage.length) && filterMessage.map(function (message) {
1977
2509
  return React__default.createElement(ChatItem, Object.assign({
1978
2510
  key: message.id
1979
2511
  }, message, {
1980
- onAddExamMessage: onAddExamMessage,
1981
- onReply: onReply,
1982
- selectedReplyMessageId: selectedReplyMessageId,
1983
- onToggleReply: handleToggleReply,
1984
- selectedReplyItemRef: selectedReplyItemRef,
1985
- onReTrySendMessage: onReTrySendMessage,
1986
- onGotoParentMessage: handleSelectParentMessage
2512
+ isStudent: isStudent,
2513
+ onReTrySendMessage: onReTrySendMessage
1987
2514
  }));
1988
2515
  }));
1989
2516
  };
1990
2517
 
2518
+ var iconSendMessage = function iconSendMessage(_ref) {
2519
+ var _ref$width = _ref.width,
2520
+ width = _ref$width === void 0 ? "16" : _ref$width,
2521
+ _ref$height = _ref.height,
2522
+ height = _ref$height === void 0 ? "16" : _ref$height,
2523
+ color = _ref.color;
2524
+ return React__default.createElement("svg", {
2525
+ width: width,
2526
+ height: height,
2527
+ viewBox: "0 0 16 16",
2528
+ fill: color,
2529
+ xmlns: "http://www.w3.org/2000/svg"
2530
+ }, React__default.createElement("path", {
2531
+ d: "M14.8934 7.09539L14.8884 7.0932L1.54219 1.55758C1.42993 1.51059 1.30778 1.49217 1.18666 1.50395C1.06554 1.51573 0.949225 1.55734 0.848125 1.62508C0.741311 1.69507 0.653573 1.79052 0.592805 1.90283C0.532037 2.01515 0.500145 2.14081 0.5 2.26852V5.80883C0.50006 5.98341 0.561019 6.15249 0.67237 6.28695C0.783722 6.42141 0.938491 6.5128 1.11 6.54539L8.38906 7.89133C8.41767 7.89675 8.44348 7.91199 8.46205 7.93441C8.48062 7.95683 8.49078 7.98503 8.49078 8.01414C8.49078 8.04325 8.48062 8.07145 8.46205 8.09387C8.44348 8.1163 8.41767 8.13153 8.38906 8.13695L1.11031 9.48289C0.938851 9.5154 0.784092 9.60667 0.67269 9.74101C0.561288 9.87534 0.500219 10.0443 0.5 10.2188V13.7598C0.499917 13.8817 0.530111 14.0018 0.587871 14.1092C0.645632 14.2166 0.729152 14.3079 0.830938 14.3751C0.953375 14.4564 1.09706 14.4999 1.24406 14.5001C1.34626 14.5 1.4474 14.4795 1.54156 14.4398L14.8875 8.9357L14.8934 8.93289C15.0731 8.85569 15.2262 8.72751 15.3337 8.56421C15.4413 8.40092 15.4986 8.20968 15.4986 8.01414C15.4986 7.81861 15.4413 7.62736 15.3337 7.46407C15.2262 7.30077 15.0731 7.1726 14.8934 7.09539Z",
2532
+ fill: "white"
2533
+ }));
2534
+ };
2535
+
1991
2536
  var InputChat = function InputChat(_ref) {
1992
2537
  var text = _ref.text,
1993
- parentText = _ref.parentText,
1994
- examTitle = _ref.examTitle,
1995
2538
  inputRef = _ref.inputRef,
1996
2539
  onChangeInput = _ref.onChangeInput,
1997
2540
  onSubmit = _ref.onSubmit,
1998
- onClearReply = _ref.onClearReply;
2541
+ isCompleted = _ref.isCompleted,
2542
+ handleUploadImage = _ref.handleUploadImage,
2543
+ selectedFile = _ref.selectedFile,
2544
+ handleDeleteSelectedImage = _ref.handleDeleteSelectedImage;
2545
+ var _useTranslation = reactI18next.useTranslation(),
2546
+ t = _useTranslation.t;
2547
+ var fileInputRef = React.useRef(null);
1999
2548
  var handleSubmit = function handleSubmit() {
2000
- if (!text.trim().length) return;
2001
2549
  onSubmit();
2002
2550
  };
2003
2551
  var handleInputChange = function handleInputChange(event) {
2004
2552
  onChangeInput(event.target.value);
2005
2553
  };
2006
2554
  var handleKeyPressEnter = function handleKeyPressEnter(e) {
2007
- if (e.code === "Enter") handleSubmit();
2555
+ if (e.key === "Enter") {
2556
+ handleSubmit();
2557
+ return;
2558
+ }
2008
2559
  };
2009
- var handleClearReply = function handleClearReply() {
2010
- onClearReply === null || onClearReply === void 0 ? void 0 : onClearReply();
2560
+ var handleSelectedFile = function handleSelectedFile(e) {
2561
+ var files = e.target.files;
2562
+ handleUploadImage(files[0]);
2563
+ if (fileInputRef.current) {
2564
+ fileInputRef.current.value = "";
2565
+ }
2011
2566
  };
2012
- return React__default.createElement("div", {
2013
- className: "bg-light rounded-3 p-2"
2014
- }, React__default.createElement(reactstrap.Collapse, {
2015
- isOpen: !!parentText || !!examTitle && !parentText
2016
- }, !!parentText ? React__default.createElement("div", {
2017
- className: "d-flex justify-content-between align-items-center"
2018
- }, React__default.createElement("p", {
2019
- className: "mb-3 " + styles$1["reply-text"]
2020
- }, React__default.createElement("b", null, "Reply to:"), " " + parentText), !!onClearReply && React__default.createElement("span", {
2021
- className: "pointer ms-3 mb-3 d-flex justify-content-center align-items-center",
2022
- onClick: handleClearReply
2023
- }, React__default.createElement(io.IoIosCloseCircle, null))) : React__default.createElement("div", {
2024
- className: "d-flex justify-content-between align-items-center"
2025
- }, React__default.createElement("p", {
2026
- className: "mb-3 " + styles$1["reply-text"]
2027
- }, React__default.createElement("b", null, "Reply to", examTitle ? " exam" : "", ": "), " " + examTitle), !!onClearReply && React__default.createElement("span", {
2028
- className: "pointer ms-3 mb-3 d-flex justify-content-center align-items-center",
2029
- onClick: handleClearReply
2030
- }, React__default.createElement(io.IoIosCloseCircle, null)))), React__default.createElement(reactstrap.InputGroup, {
2031
- className: "d-flex align-items"
2032
- }, React__default.createElement(reactstrap.Input, {
2033
- innerRef: inputRef,
2034
- value: text,
2035
- placeholder: "Enter something",
2036
- onKeyUp: handleKeyPressEnter,
2037
- className: "rounded-pill px-3",
2038
- onChange: handleInputChange
2567
+ return React__default.createElement(material.Grid, {
2568
+ item: true,
2569
+ xs: 12,
2570
+ padding: "16px"
2571
+ }, React__default.createElement(material.Box, {
2572
+ display: "flex",
2573
+ flexDirection: "row",
2574
+ gap: "24px"
2575
+ }, React__default.createElement(material.Box, {
2576
+ display: "flex",
2577
+ flexDirection: "column",
2578
+ gap: "7px",
2579
+ width: "100%"
2580
+ }, React__default.createElement(material.Box, {
2581
+ display: "flex",
2582
+ border: "1px solid #97A1AF",
2583
+ borderRadius: "6px",
2584
+ flexDirection: "column"
2585
+ }, selectedFile && React__default.createElement("div", {
2586
+ style: {
2587
+ position: "relative",
2588
+ margin: "10px",
2589
+ width: "fit-content"
2590
+ }
2591
+ }, React__default.createElement("img", {
2592
+ src: selectedFile === null || selectedFile === void 0 ? void 0 : selectedFile.content,
2593
+ style: {
2594
+ backgroundRepeat: "no-repeat",
2595
+ width: "100px",
2596
+ height: "100px",
2597
+ backgroundSize: "cover"
2598
+ }
2039
2599
  }), React__default.createElement("div", {
2040
- className: "p-2 pointer d-flex align-items-center",
2600
+ style: {
2601
+ position: "absolute",
2602
+ right: 0,
2603
+ top: 0,
2604
+ cursor: "pointer"
2605
+ },
2606
+ onClick: handleDeleteSelectedImage
2607
+ }, React__default.createElement(io5.IoCloseOutline, {
2608
+ color: "#fff",
2609
+ size: 30
2610
+ }))), React__default.createElement("input", {
2611
+ className: styles["input-chat"],
2612
+ style: {
2613
+ border: "none"
2614
+ },
2615
+ placeholder: t("send_message"),
2616
+ ref: inputRef,
2617
+ value: text,
2618
+ width: "100%",
2619
+ onKeyPress: handleKeyPressEnter,
2620
+ onChange: handleInputChange,
2621
+ disabled: isCompleted
2622
+ })), React__default.createElement(material.Typography, {
2623
+ fontWeight: 500,
2624
+ fontSize: "10px",
2625
+ lineHeight: "11.93px",
2626
+ color: "#97A1AF"
2627
+ }, "\uC548\uB0B4 \uD14D\uC2A4\uD2B8\uC785\uB2C8\uB2E4.")), React__default.createElement(material.Box, {
2628
+ display: "flex",
2629
+ justifyContent: "flex-end",
2630
+ alignItems: "flex-start",
2631
+ gap: "8px"
2632
+ }, React__default.createElement(material.Button, {
2633
+ variant: "outlined",
2634
+ component: "label"
2635
+ }, React__default.createElement(fa.FaImage, null), React__default.createElement("input", {
2636
+ type: "file",
2637
+ hidden: true,
2638
+ ref: fileInputRef,
2639
+ accept: "image/png, image/gif, image/jpeg",
2640
+ onChangeCapture: handleSelectedFile
2641
+ })), React__default.createElement(material.Button, {
2642
+ variant: "contained",
2643
+ sx: {
2644
+ bgcolor: isCompleted ? "#EBEBFF !important" : "#5458D5 !important"
2645
+ },
2646
+ className: styles["btn-send"],
2647
+ disabled: isCompleted,
2041
2648
  onClick: handleSubmit
2042
- }, React__default.createElement(io.IoMdSend, {
2043
- className: "text-primary fs-4"
2044
- }))));
2649
+ }, React__default.createElement(iconSendMessage, null), React__default.createElement(material.Typography, {
2650
+ fontWeight: 700,
2651
+ fontSize: "13px",
2652
+ lineHeight: "15.51px"
2653
+ }, t("button.send"))))));
2045
2654
  };
2046
2655
 
2047
- var ChatHeader = function ChatHeader(_ref) {
2048
- var name = _ref.name,
2049
- avatar = _ref.avatar,
2050
- options = _ref.options,
2051
- selectedOption = _ref.selectedOption,
2052
- onChangeOption = _ref.onChangeOption;
2053
- var wrapperRef = React.useRef(null);
2054
- var actionRef = React.useRef(null);
2055
- var language = reactRedux.useSelector(function (state) {
2056
- var _state$common;
2057
- return state === null || state === void 0 ? void 0 : (_state$common = state.common) === null || _state$common === void 0 ? void 0 : _state$common.language;
2656
+ var iconChecked = function iconChecked(_ref) {
2657
+ var _ref$width = _ref.width,
2658
+ width = _ref$width === void 0 ? "16" : _ref$width,
2659
+ _ref$height = _ref.height,
2660
+ height = _ref$height === void 0 ? "16" : _ref$height,
2661
+ color = _ref.color;
2662
+ return React__default.createElement("svg", {
2663
+ width: width,
2664
+ height: height,
2665
+ viewBox: "0 0 16 16",
2666
+ fill: color,
2667
+ xmlns: "http://www.w3.org/2000/svg"
2668
+ }, React__default.createElement("path", {
2669
+ d: "M8 1.5C4.41594 1.5 1.5 4.41594 1.5 8C1.5 11.5841 4.41594 14.5 8 14.5C11.5841 14.5 14.5 11.5841 14.5 8C14.5 4.41594 11.5841 1.5 8 1.5ZM11.3828 5.82156L7.18281 10.8216C7.13674 10.8764 7.07941 10.9208 7.01471 10.9516C6.95001 10.9823 6.87945 10.9989 6.80781 11H6.79938C6.72929 11 6.66 10.9852 6.59599 10.9567C6.53198 10.9282 6.47468 10.8865 6.42781 10.8344L4.62781 8.83438C4.5821 8.78589 4.54654 8.72876 4.52322 8.66633C4.4999 8.60391 4.4893 8.53745 4.49203 8.47087C4.49477 8.40429 4.51078 8.33892 4.53914 8.27862C4.56749 8.21831 4.60761 8.16429 4.65715 8.11971C4.70668 8.07514 4.76463 8.04091 4.82757 8.01905C4.89052 7.99719 4.95721 7.98813 5.02371 7.9924C5.09021 7.99668 5.15518 8.01421 5.21481 8.04396C5.27444 8.0737 5.32752 8.11507 5.37094 8.16562L6.78625 9.73812L10.6172 5.17844C10.7031 5.07909 10.8247 5.01754 10.9556 5.00711C11.0866 4.99668 11.2164 5.03819 11.317 5.12268C11.4175 5.20717 11.4808 5.32784 11.4931 5.45862C11.5055 5.5894 11.4658 5.71977 11.3828 5.82156Z",
2670
+ fill: "#5458D5"
2671
+ }));
2672
+ };
2673
+
2674
+ var CONVERSATION_URL = BASE_URL + "/api/conversation";
2675
+ var apiAddMessage = function apiAddMessage(conversationId, message) {
2676
+ return api.post(CONVERSATION_URL + "/" + conversationId + "/messages", message);
2677
+ };
2678
+ var getMessagesByConversation = function getMessagesByConversation(conversationId, filter) {
2679
+ return api.get(CONVERSATION_URL + "/" + conversationId + "/messages", {
2680
+ params: filter
2058
2681
  });
2682
+ };
2683
+ var completeConversation = function completeConversation(conversationId) {
2684
+ return api.post(CONVERSATION_URL + "/" + conversationId + "/finish");
2685
+ };
2686
+ var apiUploadFile = function apiUploadFile(file) {
2687
+ return apiUpload.post(BASE_URL + "/api/file/upload", file);
2688
+ };
2689
+
2690
+ var useDialog = function useDialog() {
2691
+ var _useState = React.useState(false),
2692
+ openConfirmDialog = _useState[0],
2693
+ setOpenConfirmDialog = _useState[1];
2694
+ var toggleConfirmDialog = function toggleConfirmDialog() {
2695
+ setOpenConfirmDialog(function (state) {
2696
+ return !state;
2697
+ });
2698
+ };
2699
+ var handleConfirm = function handleConfirm(conversationId) {
2700
+ try {
2701
+ var _temp2 = function _temp2() {
2702
+ setLoading(false);
2703
+ };
2704
+ setLoading(true);
2705
+ var _temp = _catch(function () {
2706
+ return Promise.resolve(completeConversation(conversationId)).then(function () {
2707
+ toggleConfirmDialog();
2708
+ reactToastify.toast.success("Complete conversation success");
2709
+ });
2710
+ }, function () {
2711
+ reactToastify.toast.error("Failed to complete conversation");
2712
+ });
2713
+ return Promise.resolve(_temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp));
2714
+ } catch (e) {
2715
+ return Promise.reject(e);
2716
+ }
2717
+ };
2718
+ return {
2719
+ openConfirmDialog: openConfirmDialog,
2720
+ toggleConfirmDialog: toggleConfirmDialog,
2721
+ handleConfirm: handleConfirm
2722
+ };
2723
+ };
2724
+
2725
+ var ChatHeader = function ChatHeader(_ref) {
2726
+ var fullName = _ref.fullName,
2727
+ examTitle = _ref.examTitle,
2728
+ questionOrder = _ref.questionOrder,
2729
+ conversationId = _ref.conversationId,
2730
+ isCompleted = _ref.isCompleted,
2731
+ durationExam = _ref.durationExam,
2732
+ createdAt = _ref.createdAt,
2733
+ teacherName = _ref.teacherName,
2734
+ roles = _ref.roles;
2735
+ var _useDialog = useDialog(),
2736
+ openConfirmDialog = _useDialog.openConfirmDialog,
2737
+ toggleConfirmDialog = _useDialog.toggleConfirmDialog,
2738
+ handleConfirm = _useDialog.handleConfirm;
2059
2739
  var _useTranslation = reactI18next.useTranslation(),
2060
2740
  t = _useTranslation.t;
2061
- var handleChangeOption = function handleChangeOption(val) {
2062
- onChangeOption === null || onChangeOption === void 0 ? void 0 : onChangeOption(val);
2741
+ var isStudent = roles === null || roles === void 0 ? void 0 : roles.includes(Roles.Student);
2742
+ var filterDurationExam = React.useMemo(function () {
2743
+ if (!durationExam) return;
2744
+ return moment.duration(durationExam);
2745
+ }, [durationExam]);
2746
+ var renderHeader = function renderHeader() {
2747
+ return isStudent ? React__default.createElement(material.Grid, {
2748
+ item: true,
2749
+ xs: 12,
2750
+ borderTop: "1px solid #E4E7EC",
2751
+ borderBottom: "1px solid #E4E7EC",
2752
+ minHeight: "64px",
2753
+ padding: "16px 8px",
2754
+ display: "flex",
2755
+ alignItems: "center",
2756
+ justifyContent: "space-between"
2757
+ }, React__default.createElement(material.Box, {
2758
+ padding: "8px 12px",
2759
+ display: "flex",
2760
+ alignItems: "center",
2761
+ gap: "24px",
2762
+ border: "1px solid #EBEBFF",
2763
+ borderRadius: "6px"
2764
+ }, React__default.createElement(material.Box, {
2765
+ display: "flex",
2766
+ alignItems: "center",
2767
+ flexDirection: "row",
2768
+ gap: "8px"
2769
+ }, React__default.createElement(iconPersonNoActive, null), React__default.createElement(material.Typography, {
2770
+ fontWeight: 500,
2771
+ fontSize: "14px",
2772
+ lineHeight: "16.71px",
2773
+ color: "#5458D5"
2774
+ }, t("counselor"))), React__default.createElement(material.Typography, {
2775
+ fontWeight: 700,
2776
+ fontSize: "14px",
2777
+ lineHeight: "16.71px",
2778
+ color: "#5458D5"
2779
+ }, teacherName)), React__default.createElement(material.Box, {
2780
+ display: "flex",
2781
+ alignItems: "start",
2782
+ color: "#5458D5",
2783
+ gap: "6px",
2784
+ flexDirection: "column"
2785
+ }, React__default.createElement(material.Typography, {
2786
+ fontWeight: 600,
2787
+ fontSize: "12px",
2788
+ lineHeight: "14.32px"
2789
+ }, examTitle), React__default.createElement(material.Box, {
2790
+ display: "flex",
2791
+ flexDirection: "row",
2792
+ gap: "4px"
2793
+ }, React__default.createElement(material.Typography, {
2794
+ fontWeight: 600,
2795
+ fontSize: "12px",
2796
+ lineHeight: "14.2px"
2797
+ }, "LIVE \uC2DC\uD5D8"), filterDurationExam && React__default.createElement(material.Typography, {
2798
+ fontWeight: 500,
2799
+ fontSize: "12px",
2800
+ lineHeight: "14.32px"
2801
+ }, (!!filterDurationExam.hours() ? filterDurationExam.hours() + " " + t("hour") : "") + " " + (!!filterDurationExam.minutes() ? filterDurationExam.minutes() + " " + t("minute") : "") + " " + (!!filterDurationExam.seconds() ? filterDurationExam.seconds() + " " + t("second") : "")))), React__default.createElement(material.Box, {
2802
+ display: "flex",
2803
+ alignItems: "center",
2804
+ gap: "6px",
2805
+ flexDirection: "column"
2806
+ }, React__default.createElement(material.Typography, {
2807
+ fontWeight: 700,
2808
+ fontSize: "12px",
2809
+ lineHeight: "14.32px",
2810
+ color: "#5458D5"
2811
+ }, questionOrder != undefined ? t("problem_number_question", {
2812
+ number: questionOrder + 1
2813
+ }) : t("class_inquiry")), React__default.createElement(material.Typography, {
2814
+ fontWeight: 500,
2815
+ fontSize: "12px",
2816
+ lineHeight: "14.32px",
2817
+ color: "#97A1AF"
2818
+ }, utcToLocalTime(createdAt, t("date_time_format"))))) : React__default.createElement(material.Grid, {
2819
+ item: true,
2820
+ xs: 12,
2821
+ borderTop: "1px solid #E4E7EC",
2822
+ borderBottom: "1px solid #E4E7EC",
2823
+ minHeight: "64px",
2824
+ padding: "16px 8px",
2825
+ display: "flex",
2826
+ alignItems: "center",
2827
+ justifyContent: "space-between"
2828
+ }, React__default.createElement(material.Box, {
2829
+ display: "flex",
2830
+ alignItems: "center",
2831
+ gap: "24px",
2832
+ color: "#5458D5"
2833
+ }, React__default.createElement(material.Box, {
2834
+ display: "flex",
2835
+ justifyContent: "space-between",
2836
+ alignItems: "center",
2837
+ gap: "8px"
2838
+ }, React__default.createElement(iconPersonNoActive, null), React__default.createElement(material.Typography, {
2839
+ fontWeight: 500,
2840
+ fontSize: "14px",
2841
+ lineHeight: "16.71px"
2842
+ }, t("student"))), React__default.createElement(material.Typography, {
2843
+ fontWeight: 700,
2844
+ fontSize: "14px",
2845
+ lineHeight: "16.71px"
2846
+ }, fullName)), React__default.createElement(material.Box, {
2847
+ display: "flex",
2848
+ alignItems: "center",
2849
+ gap: "24px",
2850
+ color: "#5458D5"
2851
+ }, examTitle && React__default.createElement(material.Typography, {
2852
+ fontWeight: 600,
2853
+ fontSize: "12px",
2854
+ lineHeight: "14.32px"
2855
+ }, examTitle), React__default.createElement(material.Typography, {
2856
+ fontWeight: 700,
2857
+ fontSize: "14px",
2858
+ lineHeight: "16.71px"
2859
+ }, questionOrder != undefined ? t("problem_number_question", {
2860
+ number: questionOrder + 1
2861
+ }) : t("class_inquiry"))), !isCompleted ? React__default.createElement("div", {
2862
+ onClick: toggleConfirmDialog
2863
+ }, React__default.createElement(material.Box, {
2864
+ padding: "8px 12px",
2865
+ display: "flex",
2866
+ alignItems: "center",
2867
+ gap: "8px",
2868
+ border: "1px solid #5458D5",
2869
+ borderRadius: "6px"
2870
+ }, React__default.createElement(iconChecked, null), React__default.createElement(material.Typography, {
2871
+ fontWeight: 700,
2872
+ fontSize: "13px",
2873
+ lineHeight: "15.51px",
2874
+ color: "#5458D5"
2875
+ }, "\uC644\uB8CC \uCC98\uB9AC"))) : React__default.createElement("div", null));
2063
2876
  };
2064
- React.useEffect(function () {
2065
- var handleClickOutside = function handleClickOutside(event) {
2066
- if (wrapperRef.current && !wrapperRef.current.contains(event.target) && actionRef.current && !actionRef.current.contains(event.target)) ;
2067
- };
2068
- document.addEventListener("mousedown", handleClickOutside);
2069
- return function () {
2070
- document.removeEventListener("mousedown", handleClickOutside);
2071
- };
2072
- }, [wrapperRef, actionRef]);
2073
- var selectOptions = React.useMemo(function () {
2074
- return options === null || options === void 0 ? void 0 : options.map(function (i) {
2075
- return {
2076
- value: i.id,
2077
- label: i.title + " (" + utcToLocalTime(i.startTime, t("date_time_format")) + ")"
2078
- };
2079
- });
2080
- }, [JSON.stringify(options), language]);
2081
- return React__default.createElement("div", {
2082
- className: "d-flex bg-light rounded-3 p-3"
2083
- }, React__default.createElement("div", null, React__default.createElement("img", {
2084
- className: "rounded-circle " + styles$1["header__avatar"],
2085
- src: avatar,
2086
- alt: name
2087
- })), React__default.createElement("div", {
2088
- className: "flex-grow-1 px-3 d-flex align-items-center"
2089
- }, React__default.createElement("p", {
2090
- className: "mb-0 text-primary fw-medium"
2091
- }, name)), React__default.createElement("div", {
2092
- className: "d-flex align-items-center"
2093
- }, selectOptions !== undefined && React__default.createElement("div", {
2094
- className: styles$1["header__select"] + " mx-3"
2095
- }, React__default.createElement(CustomSelect, {
2096
- value: selectedOption,
2097
- options: selectOptions,
2098
- onChange: handleChangeOption,
2099
- isClearable: true
2100
- })), React__default.createElement("div", {
2101
- className: "actions d-flex align-items-center"
2102
- })));
2877
+ return React__default.createElement(material.Grid, {
2878
+ container: true
2879
+ }, React__default.createElement(material.Grid, {
2880
+ item: true,
2881
+ xs: 12,
2882
+ paddingLeft: "32px",
2883
+ paddingTop: "20px",
2884
+ paddingBottom: "16px",
2885
+ minHeight: "60px"
2886
+ }, React__default.createElement(material.Typography, {
2887
+ fontWeight: 800,
2888
+ fontSize: "20px",
2889
+ color: "#5458D5",
2890
+ lineHeight: "23.87px"
2891
+ }, t("question_and_answer"))), renderHeader(), React__default.createElement(ConfirmDialog, {
2892
+ open: openConfirmDialog,
2893
+ toggle: toggleConfirmDialog,
2894
+ text: "정말로 이 채팅 베팅을 완료하시겠습니까?",
2895
+ onConfirm: function onConfirm() {
2896
+ return handleConfirm(conversationId || 0);
2897
+ },
2898
+ title: t("confirmation"),
2899
+ okText: t("yes"),
2900
+ cancelText: t("no")
2901
+ }));
2103
2902
  };
2104
2903
 
2105
2904
  var ChatContainer = function ChatContainer(_ref) {
@@ -2111,55 +2910,47 @@ var ChatContainer = function ChatContainer(_ref) {
2111
2910
  _ref$isLoading = _ref.isLoading,
2112
2911
  isLoading = _ref$isLoading === void 0 ? false : _ref$isLoading,
2113
2912
  isScrollToEnd = _ref.isScrollToEnd,
2114
- onRead = _ref.onRead,
2115
2913
  onReachTop = _ref.onReachTop,
2116
2914
  onReachBottom = _ref.onReachBottom,
2117
2915
  onEndScrollToEnd = _ref.onEndScrollToEnd;
2118
- var onReply = chatListProps.onReply,
2119
- onAddExamMessage = chatListProps.onAddExamMessage;
2120
- var onChangeOption = chatHeaderProps.onChangeOption;
2121
2916
  var inputRef = React.useRef(null);
2122
2917
  var listRef = React.useRef(null);
2123
2918
  var listItemRef = React.useRef(null);
2124
2919
  var scrollRef = React.useRef();
2125
- var focusRef = React.useRef();
2126
2920
  var addEventTimeout = React.useRef();
2127
- var handleReply = function handleReply(id, content, examId) {
2128
- var _inputRef$current;
2129
- (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.focus();
2130
- onReply === null || onReply === void 0 ? void 0 : onReply(id, content, examId);
2131
- };
2132
- var handleAddExamMessage = function handleAddExamMessage(examId, examTitle, examCode) {
2133
- var _inputRef$current2;
2134
- (_inputRef$current2 = inputRef.current) === null || _inputRef$current2 === void 0 ? void 0 : _inputRef$current2.focus();
2135
- onAddExamMessage(examId, examTitle, examCode);
2136
- };
2137
- var handleChangeExamOption = function handleChangeExamOption(val) {
2138
- var _inputRef$current3;
2139
- if (!!(val !== null && val !== void 0 && val.value)) (_inputRef$current3 = inputRef.current) === null || _inputRef$current3 === void 0 ? void 0 : _inputRef$current3.focus();
2140
- onChangeOption === null || onChangeOption === void 0 ? void 0 : onChangeOption(val);
2141
- };
2142
2921
  var handleScroll = function handleScroll() {
2143
- if (listRef.current) {
2144
- var scrollTop = listRef.current.scrollTop;
2145
- var scrollHeight = listRef.current.scrollHeight;
2146
- var clientHeight = listRef.current.clientHeight;
2147
- if (scrollTop + clientHeight + scrollOffset >= scrollHeight) {
2148
- onReachBottom === null || onReachBottom === void 0 ? void 0 : onReachBottom();
2149
- } else if (scrollTop <= scrollOffset) {
2150
- onReachTop === null || onReachTop === void 0 ? void 0 : onReachTop();
2151
- }
2922
+ try {
2923
+ var _temp4 = function _temp4() {
2924
+ if (scrollRef.current) clearTimeout(scrollRef.current);
2925
+ };
2926
+ var _temp3 = function () {
2927
+ if (listRef.current) {
2928
+ var scrollTop = listRef.current.scrollTop;
2929
+ var scrollHeight = listRef.current.scrollHeight;
2930
+ var clientHeight = listRef.current.clientHeight;
2931
+ var _temp2 = function () {
2932
+ if (scrollTop + clientHeight + scrollOffset >= scrollHeight) {
2933
+ onReachBottom === null || onReachBottom === void 0 ? void 0 : onReachBottom();
2934
+ } else {
2935
+ var _temp5 = function () {
2936
+ if (scrollTop <= scrollOffset) {
2937
+ return Promise.resolve(onReachTop === null || onReachTop === void 0 ? void 0 : onReachTop()).then(function (isSuccessLoad) {
2938
+ if (isSuccessLoad) {
2939
+ listRef.current.scrollTop = listRef.current.scrollHeight - scrollHeight;
2940
+ }
2941
+ });
2942
+ }
2943
+ }();
2944
+ if (_temp5 && _temp5.then) return _temp5.then(function () {});
2945
+ }
2946
+ }();
2947
+ if (_temp2 && _temp2.then) return _temp2.then(function () {});
2948
+ }
2949
+ }();
2950
+ return Promise.resolve(_temp3 && _temp3.then ? _temp3.then(_temp4) : _temp4(_temp3));
2951
+ } catch (e) {
2952
+ return Promise.reject(e);
2152
2953
  }
2153
- if (scrollRef.current) clearTimeout(scrollRef.current);
2154
- scrollRef.current = setTimeout(function () {
2155
- onRead === null || onRead === void 0 ? void 0 : onRead();
2156
- }, 800);
2157
- };
2158
- var handleFocus = function handleFocus() {
2159
- if (focusRef.current) clearTimeout(focusRef.current);
2160
- focusRef.current = setTimeout(function () {
2161
- onRead === null || onRead === void 0 ? void 0 : onRead();
2162
- }, 300);
2163
2954
  };
2164
2955
  React.useEffect(function () {
2165
2956
  var _listRef$current, _chatListProps$messag, _listRef$current3;
@@ -2183,131 +2974,34 @@ var ChatContainer = function ChatContainer(_ref) {
2183
2974
  scrollRef.current && clearTimeout(scrollRef.current);
2184
2975
  addEventTimeout.current && clearTimeout(addEventTimeout.current);
2185
2976
  };
2186
- }, [JSON.stringify(chatListProps.messages), scrollOffset, isLoading, onEndScrollToEnd, onRead, isScrollToEnd]);
2977
+ }, [JSON.stringify(chatListProps.messages), scrollOffset, isLoading, onEndScrollToEnd, isScrollToEnd]);
2187
2978
  React.useEffect(function () {
2188
- var _inputRef$current4;
2189
- (_inputRef$current4 = inputRef.current) === null || _inputRef$current4 === void 0 ? void 0 : _inputRef$current4.addEventListener("focus", handleFocus);
2190
- return function () {
2191
- var _inputRef$current5;
2192
- (_inputRef$current5 = inputRef.current) === null || _inputRef$current5 === void 0 ? void 0 : _inputRef$current5.removeEventListener("focus", handleFocus);
2193
- focusRef.current && clearTimeout(focusRef.current);
2194
- };
2195
- }, [onRead]);
2196
- return React__default.createElement("div", {
2197
- className: "d-flex flex-column w-100 h-100 border border-1 border-light rounded-3 shadow-sm"
2198
- }, React__default.createElement("div", null, React__default.createElement(ChatHeader, Object.assign({}, chatHeaderProps, {
2199
- onChangeOption: handleChangeExamOption
2200
- }))), React__default.createElement("div", {
2979
+ onReachBottom === null || onReachBottom === void 0 ? void 0 : onReachBottom();
2980
+ }, [JSON.stringify(chatListProps.messages)]);
2981
+ return React__default.createElement(material.Grid, {
2982
+ container: true
2983
+ }, React__default.createElement(ChatHeader, Object.assign({}, chatHeaderProps)), React__default.createElement("div", {
2201
2984
  ref: listRef,
2202
- className: "flex-grow-1 " + styles$1["body"]
2203
- }, isLoading && React__default.createElement("div", {
2204
- className: "d-flex justify-content-center"
2205
- }, React__default.createElement(reactstrap.Spinner, {
2206
- color: "secondary",
2207
- className: "my-2"
2208
- }, "Loading...")), React__default.createElement(ChatList, Object.assign({}, chatListProps, {
2209
- listItemRef: listItemRef,
2210
- onReply: handleReply,
2211
- onAddExamMessage: handleAddExamMessage
2212
- }))), React__default.createElement("div", null, React__default.createElement(InputChat, Object.assign({}, inputProps, {
2213
- inputRef: inputRef
2214
- }))));
2215
- };
2216
-
2217
- var CONVERSATION_URL = BASE_URL + "/api/conversation";
2218
- var getListConversation = function getListConversation(query) {
2219
- return api.get("" + CONVERSATION_URL, {
2220
- params: query
2221
- });
2222
- };
2223
- var createConversation = function createConversation(studentId) {
2224
- return api.post("" + CONVERSATION_URL, {
2225
- targetUserId: "" + studentId
2226
- });
2227
- };
2228
- var apiAddMessage = function apiAddMessage(conversationId, message) {
2229
- return api.post(CONVERSATION_URL + "/" + conversationId + "/messages", message);
2230
- };
2231
- var getMessagesByConversation = function getMessagesByConversation(conversationId, filter) {
2232
- return api.get(CONVERSATION_URL + "/" + conversationId + "/messages", {
2233
- params: filter
2234
- });
2235
- };
2236
- var apiMarkReadMessage = function apiMarkReadMessage(conversationId, messageId) {
2237
- return api.put(CONVERSATION_URL + "/" + conversationId + "/messages/" + messageId + "/mark-read");
2238
- };
2239
- var apiGetConversationByUserId = function apiGetConversationByUserId(userId) {
2240
- return api.get(CONVERSATION_URL + "/users/" + userId);
2241
- };
2242
-
2243
- var ExamStatus;
2244
- (function (ExamStatus) {
2245
- ExamStatus["Default"] = "Default";
2246
- ExamStatus["Pending"] = "Pending";
2247
- ExamStatus["Inprogress"] = "Inprogress";
2248
- ExamStatus["Completed"] = "Completed";
2249
- })(ExamStatus || (ExamStatus = {}));
2250
- var CONVERSATION_DEFAULT_FILTER = {
2251
- currentPage: 1,
2252
- pageSize: -1,
2253
- textSearch: ""
2254
- };
2255
- var MESSAGE_DEFAULT_FILTER = {
2256
- currentPage: 1,
2257
- pageSize: 12,
2258
- textSearch: "",
2259
- sortColumnDirection: OrderBy.DESC,
2260
- sortColumnName: MessageSortBy.CreatedAt
2261
- };
2262
-
2263
- var EXAM_URL = BASE_URL + "/api/exam";
2264
- var getListExamApi = function getListExamApi(query) {
2265
- return api.get(EXAM_URL + "/getList", {
2266
- params: query
2267
- });
2268
- };
2269
-
2270
- var useExamList = function useExamList(isStudent) {
2271
- if (isStudent === void 0) {
2272
- isStudent = true;
2273
- }
2274
- var _useState = React.useState(),
2275
- exams = _useState[0],
2276
- setExams = _useState[1];
2277
- var getListExam = function getListExam(userId) {
2278
- try {
2279
- setExams([]);
2280
- var _temp = _catch(function () {
2281
- return Promise.resolve(getListExamApi({
2282
- currentPage: 1,
2283
- pageSize: -1,
2284
- sortColumnDirection: "DESC",
2285
- sortColumnName: "CreatedAt",
2286
- statuses: [ExamStatus.Completed],
2287
- studentId: !isStudent ? userId : undefined,
2288
- teacherId: isStudent ? userId : undefined
2289
- })).then(function (res) {
2290
- var _res$data;
2291
- var data = ((_res$data = res.data) === null || _res$data === void 0 ? void 0 : _res$data.items) || [];
2292
- setExams(data);
2293
- });
2294
- }, function (error) {
2295
- console.log({
2296
- error: error
2297
- });
2298
- });
2299
- return Promise.resolve(_temp && _temp.then ? _temp.then(function () {}) : void 0);
2300
- } catch (e) {
2301
- return Promise.reject(e);
2985
+ className: "flex-grow-1 " + styles["body"],
2986
+ style: {
2987
+ height: "60vh",
2988
+ overflowY: "scroll",
2989
+ background: "#F9FAFB"
2302
2990
  }
2303
- };
2304
- return {
2305
- getListExam: getListExam,
2306
- exams: exams
2307
- };
2991
+ }, isLoading && React__default.createElement("div", {
2992
+ style: {
2993
+ height: "100%",
2994
+ width: "100%"
2995
+ },
2996
+ className: "d-flex justify-content-center align-items-center"
2997
+ }, React__default.createElement(material.CircularProgress, null)), React__default.createElement(ChatList, Object.assign({}, chatListProps, {
2998
+ listItemRef: listItemRef
2999
+ }))), React__default.createElement(InputChat, Object.assign({}, inputProps, {
3000
+ inputRef: inputRef
3001
+ })));
2308
3002
  };
2309
3003
 
2310
- var useMessageList = function useMessageList(userId, getListExamOptions) {
3004
+ var useMessageList = function useMessageList() {
2311
3005
  var _useState = React.useState([]),
2312
3006
  messages = _useState[0],
2313
3007
  setMessages = _useState[1];
@@ -2317,58 +3011,70 @@ var useMessageList = function useMessageList(userId, getListExamOptions) {
2317
3011
  var _useState3 = React.useState(false),
2318
3012
  isLoading = _useState3[0],
2319
3013
  setLoading = _useState3[1];
2320
- var getMessageList = function getMessageList(conversationId, examId) {
3014
+ var getMessageList = function getMessageList(conversationId) {
2321
3015
  try {
2322
- var _temp3 = function _temp3() {
3016
+ var _temp2 = function _temp2() {
2323
3017
  setLoading(false);
2324
3018
  };
2325
3019
  setLoading(true);
2326
- var _temp2 = _catch(function () {
2327
- var filter = _extends({}, messageFilter, {
2328
- examId: !examId ? messageFilter.examId : examId
2329
- });
3020
+ var _temp = _catch(function () {
3021
+ var filter = _extends({}, messageFilter);
2330
3022
  return Promise.resolve(getMessagesByConversation(conversationId, filter)).then(function (res) {
2331
- var _res$data$items2;
2332
- function _temp(_getListExamOptions) {
2333
- _getListExamOptions;
2334
- }
2335
- if (messageFilter.beforeDate) setMessages(function (state) {
3023
+ setMessages(function (prev) {
2336
3024
  var _res$data$items;
2337
- return [].concat(((_res$data$items = res.data.items) === null || _res$data$items === void 0 ? void 0 : _res$data$items.reverse()) || [], state);
2338
- });else setMessages((_res$data$items2 = res.data.items) === null || _res$data$items2 === void 0 ? void 0 : _res$data$items2.reverse());
2339
- return getListExamOptions ? Promise.resolve(!!getListExamOptions && getListExamOptions(userId)).then(_temp) : _temp(!!getListExamOptions && getListExamOptions(userId));
2340
- });
2341
- }, function (error) {
2342
- console.log({
2343
- error: error
3025
+ return [].concat((_res$data$items = res.data.items) === null || _res$data$items === void 0 ? void 0 : _res$data$items.reverse(), prev);
3026
+ });
3027
+ setMessageFilter(function (prev) {
3028
+ return _extends({}, prev, {
3029
+ totalItems: res.data.totalItems,
3030
+ totalPages: res.data.totalPages
3031
+ });
3032
+ });
2344
3033
  });
3034
+ }, function () {
3035
+ reactToastify.toast.error("Fail to fetch data!");
2345
3036
  });
2346
- return Promise.resolve(_temp2 && _temp2.then ? _temp2.then(_temp3) : _temp3(_temp2));
3037
+ return Promise.resolve(_temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp));
2347
3038
  } catch (e) {
2348
3039
  return Promise.reject(e);
2349
3040
  }
2350
3041
  };
2351
- var handleLoadMore = function handleLoadMore() {
2352
- if (isLoading) return;
2353
- var lastItem = messages[0];
2354
- if (!lastItem) return;
2355
- var newFilter = _extends({}, messageFilter, {
2356
- currentPage: 1,
2357
- beforeDate: lastItem.createdAt
2358
- });
2359
- setMessageFilter(newFilter);
2360
- return JSON.stringify(newFilter) === JSON.stringify(messageFilter);
2361
- };
2362
- var handleMarkReadMessage = function handleMarkReadMessage(conversationId, messageId) {
3042
+ var handleLoadMore = function handleLoadMore(conversationId) {
2363
3043
  try {
2364
- var _temp4 = _catch(function () {
2365
- return Promise.resolve(apiMarkReadMessage(conversationId, messageId)).then(function () {});
2366
- }, function (error) {
2367
- console.log({
2368
- error: error
3044
+ var _temp4 = function _temp4(_result) {
3045
+ if (_exit) return _result;
3046
+ setLoading(false);
3047
+ return true;
3048
+ };
3049
+ var _exit = false;
3050
+ if (isLoading) return Promise.resolve();
3051
+ var filter = _extends({}, messageFilter, {
3052
+ currentPage: ((messageFilter === null || messageFilter === void 0 ? void 0 : messageFilter.currentPage) || 1) + 1
3053
+ });
3054
+ setMessageFilter(filter);
3055
+ setLoading(true);
3056
+ var _temp3 = _catch(function () {
3057
+ return Promise.resolve(getMessagesByConversation(conversationId, filter)).then(function (res) {
3058
+ setMessages(function (prev) {
3059
+ var _res$data$items2;
3060
+ var data = [].concat((_res$data$items2 = res.data.items) === null || _res$data$items2 === void 0 ? void 0 : _res$data$items2.reverse(), prev);
3061
+ var dataFilter = new Set(data);
3062
+ return Array.from(dataFilter);
3063
+ });
3064
+ if (res.data.items) {
3065
+ setMessageFilter(function (prev) {
3066
+ return _extends({}, prev, {
3067
+ totalItems: res.data.totalItems,
3068
+ totalPages: res.data.totalPages
3069
+ });
3070
+ });
3071
+ }
2369
3072
  });
3073
+ }, function () {
3074
+ reactToastify.toast.error("Fail to fetch data!");
3075
+ _exit = true;
2370
3076
  });
2371
- return Promise.resolve(_temp4 && _temp4.then ? _temp4.then(function () {}) : void 0);
3077
+ return Promise.resolve(_temp3 && _temp3.then ? _temp3.then(_temp4) : _temp4(_temp3));
2372
3078
  } catch (e) {
2373
3079
  return Promise.reject(e);
2374
3080
  }
@@ -2377,12 +3083,6 @@ var useMessageList = function useMessageList(userId, getListExamOptions) {
2377
3083
  setMessageFilter(MESSAGE_DEFAULT_FILTER);
2378
3084
  setMessages([]);
2379
3085
  };
2380
- var handleChangeExamId = function handleChangeExamId(value) {
2381
- setMessageFilter(_extends({}, messageFilter, {
2382
- examId: value === null || value === void 0 ? void 0 : value.value,
2383
- currentPage: 1
2384
- }));
2385
- };
2386
3086
  return {
2387
3087
  isLoading: isLoading,
2388
3088
  messageFilter: messageFilter,
@@ -2390,53 +3090,45 @@ var useMessageList = function useMessageList(userId, getListExamOptions) {
2390
3090
  getMessageList: getMessageList,
2391
3091
  setMessages: setMessages,
2392
3092
  resetMessages: resetMessages,
2393
- handleChangeExamId: handleChangeExamId,
2394
- handleMarkReadMessage: handleMarkReadMessage,
2395
3093
  handleLoadMore: handleLoadMore
2396
3094
  };
2397
3095
  };
2398
3096
 
2399
3097
  var useChatContainer = function useChatContainer(props) {
2400
- var _selectedConversation, _selectedConversation2, _selectedConversation3, _selectedConversation4, _selectedConversation5, _selectedConversation6;
3098
+ var _selectedConversation;
2401
3099
  var conversation = props.conversation,
2402
- userId = props.userId,
2403
- examId = props.examId,
2404
- onUpdateLastMessage = props.onUpdateLastMessage,
2405
- onCreateConversationSuccess = props.onCreateConversationSuccess,
2406
- onGetMessagesSuccess = props.onGetMessagesSuccess;
3100
+ student = props.student;
2407
3101
  var pusher = React.useRef();
2408
3102
  var channel = React.useRef();
2409
3103
  var channelName = React.useRef();
2410
3104
  var loadingRef = React.useRef(false);
2411
- var firstLoadRef = React.useRef(true);
2412
- var dispatch = reactRedux.useDispatch();
3105
+ var infoUser = reactRedux.useSelector(function (state) {
3106
+ var _state$common;
3107
+ return (state === null || state === void 0 ? void 0 : (_state$common = state.common) === null || _state$common === void 0 ? void 0 : _state$common.user) || {};
3108
+ });
3109
+ var academyDomain = infoUser === null || infoUser === void 0 ? void 0 : infoUser.academyDomain;
2413
3110
  var roles = reactRedux.useSelector(function (state) {
2414
- var _state$common, _state$common$user;
2415
- return state === null || state === void 0 ? void 0 : (_state$common = state.common) === null || _state$common === void 0 ? void 0 : (_state$common$user = _state$common.user) === null || _state$common$user === void 0 ? void 0 : _state$common$user.roles;
2416
- }) || [];
2417
- var isStudent = roles.includes("Student");
3111
+ var _state$common2, _state$common2$user;
3112
+ return (state === null || state === void 0 ? void 0 : (_state$common2 = state.common) === null || _state$common2 === void 0 ? void 0 : (_state$common2$user = _state$common2.user) === null || _state$common2$user === void 0 ? void 0 : _state$common2$user.roles) || [];
3113
+ });
2418
3114
  var _useState = React.useState(),
2419
3115
  selectedConversation = _useState[0],
2420
3116
  setSelectedConversation = _useState[1];
2421
3117
  var _useState2 = React.useState(),
2422
- message = _useState2[0],
2423
- setMessage = _useState2[1];
2424
- var _useState3 = React.useState(MessageStatus.Default),
2425
- messageStatus = _useState3[0],
2426
- setMessageStatus = _useState3[1];
3118
+ selectedFile = _useState2[0],
3119
+ setSelectedFile = _useState2[1];
3120
+ var _useState3 = React.useState(),
3121
+ message = _useState3[0],
3122
+ setMessage = _useState3[1];
2427
3123
  var _useState4 = React.useState(true),
2428
3124
  isScrollToEnd = _useState4[0],
2429
3125
  setScrollToEnd = _useState4[1];
2430
- var _useExamList = useExamList(isStudent),
2431
- exams = _useExamList.exams,
2432
- getListExam = _useExamList.getListExam;
2433
- var _useMessageList = useMessageList(isStudent ? selectedConversation === null || selectedConversation === void 0 ? void 0 : (_selectedConversation = selectedConversation.teacher) === null || _selectedConversation === void 0 ? void 0 : _selectedConversation.id : selectedConversation === null || selectedConversation === void 0 ? void 0 : (_selectedConversation2 = selectedConversation.student) === null || _selectedConversation2 === void 0 ? void 0 : _selectedConversation2.id, !userId ? getListExam : undefined),
3126
+ var _useMessageList = useMessageList(),
2434
3127
  isLoadingMessages = _useMessageList.isLoading,
2435
3128
  messages = _useMessageList.messages,
2436
3129
  messageFilter = _useMessageList.messageFilter,
2437
3130
  getMessageList = _useMessageList.getMessageList,
2438
3131
  resetMessages = _useMessageList.resetMessages,
2439
- handleChangeExamId = _useMessageList.handleChangeExamId,
2440
3132
  setMessages = _useMessageList.setMessages,
2441
3133
  handleLoadMore = _useMessageList.handleLoadMore;
2442
3134
  var handleToggleScrollToEnd = function handleToggleScrollToEnd() {
@@ -2446,309 +3138,150 @@ var useChatContainer = function useChatContainer(props) {
2446
3138
  };
2447
3139
  var handleAddMessage = function handleAddMessage() {
2448
3140
  try {
2449
- var _message$content, _message$content$trim;
2450
- var _temp2 = function _temp2() {
3141
+ var _temp6 = function _temp6() {
2451
3142
  loadingRef.current = false;
2452
3143
  };
2453
3144
  if (loadingRef.current) return Promise.resolve();
2454
- if (messages.some(function (i) {
2455
- return i.id === 0;
2456
- })) return Promise.resolve();
2457
3145
  loadingRef.current = true;
2458
- if (!(selectedConversation !== null && selectedConversation !== void 0 && selectedConversation.id) || !(message !== null && message !== void 0 && (_message$content = message.content) !== null && _message$content !== void 0 && (_message$content$trim = _message$content.trim()) !== null && _message$content$trim !== void 0 && _message$content$trim.length)) return Promise.resolve();
3146
+ if (!(selectedConversation !== null && selectedConversation !== void 0 && selectedConversation.id)) return Promise.resolve();
2459
3147
  setScrollToEnd(true);
2460
- setMessages(function (state) {
2461
- return [].concat(state, [{
2462
- id: 0,
2463
- isStudent: isStudent,
2464
- content: message.content,
2465
- examId: message.examId,
2466
- parentId: message.parentId,
2467
- parentContent: message.parentContent,
2468
- exam: message.examId ? {
2469
- id: message.examId,
2470
- startTime: moment().format("YYYY-MM-DDTHH:mm:ss"),
2471
- title: message.examTitle || "",
2472
- code: message.examCode || "",
2473
- createdAt: moment().format("YYYY-MM-DDTHH:mm:ss")
2474
- } : undefined,
2475
- isRead: false,
2476
- createdAt: moment().format("YYYY-MM-DDTHH:mm:ss")
2477
- }]);
2478
- });
2479
- setMessage(function (state) {
2480
- if (!state) return undefined;
2481
- return _extends({}, state, {
2482
- content: "",
2483
- parentId: undefined,
2484
- parentContent: "",
2485
- examId: messageFilter.examId,
2486
- examTitle: messageFilter.examId ? message.examTitle : ""
2487
- });
2488
- });
2489
- setMessageStatus(MessageStatus.Sending);
2490
- var _temp = _catch(function () {
2491
- return Promise.resolve(apiAddMessage(selectedConversation.id, _extends({}, message, {
2492
- examId: !!userId ? examId : message.examId
2493
- }))).then(function () {});
3148
+ var _temp5 = _catch(function () {
3149
+ function _temp4() {
3150
+ function _temp2() {
3151
+ handleChangeInput('');
3152
+ setSelectedFile(null);
3153
+ }
3154
+ var _temp = function (_message$content) {
3155
+ if (message !== null && message !== void 0 && (_message$content = message.content) !== null && _message$content !== void 0 && _message$content.trim().length) {
3156
+ return Promise.resolve(apiAddMessage(selectedConversation === null || selectedConversation === void 0 ? void 0 : selectedConversation.id, _extends({}, message))).then(function () {});
3157
+ }
3158
+ }();
3159
+ return _temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp);
3160
+ }
3161
+ var _temp3 = function () {
3162
+ if (selectedFile !== null && selectedFile !== void 0 && selectedFile.content) {
3163
+ return Promise.resolve(apiAddMessage(selectedConversation === null || selectedConversation === void 0 ? void 0 : selectedConversation.id, _extends({}, selectedFile, {
3164
+ contentType: 1
3165
+ }))).then(function () {});
3166
+ }
3167
+ }();
3168
+ return _temp3 && _temp3.then ? _temp3.then(_temp4) : _temp4(_temp3);
2494
3169
  }, function (error) {
2495
3170
  var _error$response;
2496
- console.log({
2497
- error: error
2498
- });
2499
- setMessageStatus(MessageStatus.SentError);
2500
3171
  setMessages(function (state) {
2501
3172
  return [].concat(state.filter(function (i) {
2502
- return i.id !== 0;
3173
+ return (i === null || i === void 0 ? void 0 : i.id) !== 0;
2503
3174
  }));
2504
3175
  });
2505
3176
  reactToastify.toast.error((_error$response = error.response) === null || _error$response === void 0 ? void 0 : _error$response.data);
2506
3177
  });
2507
- return Promise.resolve(_temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp));
3178
+ return Promise.resolve(_temp5 && _temp5.then ? _temp5.then(_temp6) : _temp6(_temp5));
2508
3179
  } catch (e) {
2509
3180
  return Promise.reject(e);
2510
3181
  }
2511
3182
  };
2512
- var handleAddExamMessage = function handleAddExamMessage(examId, title, examCode) {
2513
- setMessage(!!message ? _extends({}, message, {
2514
- examId: examId,
2515
- examCode: examCode,
2516
- examTitle: title,
2517
- parentId: undefined,
2518
- parentContent: ""
2519
- }) : {
2520
- examId: examId,
2521
- examCode: examCode,
2522
- content: "",
2523
- examTitle: title,
2524
- parentId: undefined,
2525
- parentContent: ""
2526
- });
2527
- };
2528
- var handleReplyMessage = function handleReplyMessage(parentId, content, examId) {
2529
- setMessage({
2530
- content: "",
2531
- examId: examId,
2532
- parentId: parentId,
2533
- parentContent: content,
2534
- examTitle: message === null || message === void 0 ? void 0 : message.examTitle
2535
- });
2536
- };
2537
- var handleClearReply = function handleClearReply() {
2538
- message && setMessage(_extends({}, message, {
2539
- parentId: undefined,
2540
- examId: messageFilter.examId ? messageFilter.examId : undefined,
2541
- parentContent: "",
2542
- examTitle: messageFilter.examId ? message.examTitle : ""
2543
- }));
3183
+ var handleUploadImage = function handleUploadImage(file) {
3184
+ try {
3185
+ console.log({
3186
+ file: file
3187
+ });
3188
+ if (!file) return Promise.resolve();
3189
+ return Promise.resolve(_finally(function () {
3190
+ return _catch(function () {
3191
+ var formData = new FormData();
3192
+ formData.append("upload", file);
3193
+ return Promise.resolve(apiUploadFile(formData)).then(function (res) {
3194
+ var _res$data;
3195
+ setSelectedFile({
3196
+ content: res === null || res === void 0 ? void 0 : (_res$data = res.data) === null || _res$data === void 0 ? void 0 : _res$data.url
3197
+ });
3198
+ });
3199
+ }, function (error) {
3200
+ var _error$response2;
3201
+ setMessages(function (state) {
3202
+ return [].concat(state.filter(function (i) {
3203
+ return (i === null || i === void 0 ? void 0 : i.id) !== 0;
3204
+ }));
3205
+ });
3206
+ reactToastify.toast.error((_error$response2 = error.response) === null || _error$response2 === void 0 ? void 0 : _error$response2.data);
3207
+ });
3208
+ }, function () {}));
3209
+ } catch (e) {
3210
+ return Promise.reject(e);
3211
+ }
2544
3212
  };
2545
3213
  var handleChangeInput = function handleChangeInput(text) {
2546
- setMessage(_extends({}, message, {
2547
- content: text
2548
- }));
2549
- };
2550
- var handleFilterExam = function handleFilterExam(val) {
2551
- var _val$label, _val$label$split;
2552
- var examTitle = val === null || val === void 0 ? void 0 : (_val$label = val.label) === null || _val$label === void 0 ? void 0 : (_val$label$split = _val$label.split(" ")) === null || _val$label$split === void 0 ? void 0 : _val$label$split.slice(0, -1).join(" ");
2553
3214
  setMessage({
2554
- examId: val === null || val === void 0 ? void 0 : val.value,
2555
- content: "",
2556
- examTitle: examTitle,
2557
- parentId: undefined,
2558
- parentContent: ""
3215
+ content: text
2559
3216
  });
2560
- handleChangeExamId(val);
2561
3217
  };
2562
- var messageList = React.useMemo(function () {
2563
- if (!selectedConversation) return [];
2564
- var examCode = undefined;
2565
- var results = messages.map(function (i, index) {
2566
- var _i$exam, _i$exam4, _i$exam5, _i$exam6, _i$exam7, _i$exam8, _i$exam9, _i$exam10, _i$exam11;
2567
- var isFirst = index === 0;
2568
- var isLast = index === messages.length - 1;
2569
- if (index > 0 && (messages[index - 1].isStudent !== i.isStudent && !i.isSystemLog || i.isSystemLog || messages[index - 1].examId !== i.examId)) isFirst = true;
2570
- if (index < messages.length - 1 && (messages[index + 1].isStudent !== i.isStudent && i.examId !== messages[index + 1].examId || i.examId !== messages[index + 1].examId || messages[index + 1].isSystemLog)) isLast = true;
2571
- var name = isStudent ? "You" : selectedConversation.student.displayName;
2572
- var content = i === null || i === void 0 ? void 0 : i.content;
2573
- var showExamHeader = false;
2574
- if (examCode != ((_i$exam = i.exam) === null || _i$exam === void 0 ? void 0 : _i$exam.code) && !messageFilter.examId && !userId) {
2575
- var _i$exam2, _i$exam3;
2576
- if ((_i$exam2 = i.exam) !== null && _i$exam2 !== void 0 && _i$exam2.code) showExamHeader = true;
2577
- examCode = (_i$exam3 = i.exam) === null || _i$exam3 === void 0 ? void 0 : _i$exam3.code;
2578
- }
2579
- switch (i.type) {
2580
- case MessageSourceType.Exam:
2581
- switch (i.action) {
2582
- case MessageAction.Took:
2583
- content = name + " took the exam " + ((_i$exam4 = i.exam) === null || _i$exam4 === void 0 ? void 0 : _i$exam4.title);
2584
- break;
2585
- }
2586
- break;
2587
- }
2588
- return {
2589
- id: i.id,
2590
- isMe: isStudent === i.isStudent,
2591
- avatar: isStudent ? selectedConversation.teacher.avatar : selectedConversation.student.avatar,
2592
- name: selectedConversation.student.displayName,
2593
- isRead: i.isRead,
2594
- createdAt: i.createdAt,
2595
- content: content,
2596
- isFirst: isFirst,
2597
- isLast: isLast,
2598
- isSystemLog: i.isSystemLog,
2599
- examCode: !messageFilter.examId && !userId ? (_i$exam5 = i.exam) === null || _i$exam5 === void 0 ? void 0 : _i$exam5.code : undefined,
2600
- examId: (_i$exam6 = i.exam) === null || _i$exam6 === void 0 ? void 0 : _i$exam6.id,
2601
- examTitle: (_i$exam7 = i.exam) === null || _i$exam7 === void 0 ? void 0 : _i$exam7.title,
2602
- type: (_i$exam8 = i.exam) !== null && _i$exam8 !== void 0 && _i$exam8.code ? exports.ChatItemType.Exam : undefined,
2603
- showExamHeader: showExamHeader,
2604
- actionLink: ((_i$exam9 = i.exam) === null || _i$exam9 === void 0 ? void 0 : _i$exam9.code) && (isStudent ? "/student/check/live-result?examCode=" + ((_i$exam10 = i.exam) === null || _i$exam10 === void 0 ? void 0 : _i$exam10.code) : "/teacher/exam-status/main?examCode=" + ((_i$exam11 = i.exam) === null || _i$exam11 === void 0 ? void 0 : _i$exam11.code)),
2605
- parentId: i.parentId,
2606
- parentContent: i.parentContent,
2607
- status: i.id ? MessageStatus.Default : messageStatus
2608
- };
2609
- });
2610
- return results;
2611
- }, [JSON.stringify(messages), JSON.stringify(message), isStudent, JSON.stringify(selectedConversation), messageFilter.examId, isStudent, userId, messageStatus]);
2612
3218
  var handleNewMessageSent = function handleNewMessageSent(data) {
2613
- if (!messageFilter.examId && !examId || messageFilter.examId && data.examId === messageFilter.examId || examId && examId === data.examId) {
2614
- setScrollToEnd(true);
2615
- setMessages(function (state) {
2616
- if (state.some(function (i) {
2617
- return i.id === 0;
2618
- })) return [].concat(state.filter(function (i) {
2619
- return i.id !== 0;
2620
- }), [data]);else return [].concat(state, [data]);
2621
- });
2622
- }
2623
- onUpdateLastMessage === null || onUpdateLastMessage === void 0 ? void 0 : onUpdateLastMessage(data);
2624
- };
2625
- var handleMessageMarkRead = function handleMessageMarkRead(data) {
3219
+ if (!data) return;
3220
+ setScrollToEnd(true);
2626
3221
  setMessages(function (state) {
2627
- return [].concat(state.map(function (i) {
2628
- return _extends({}, i, {
2629
- isRead: data.includes(i.id || 0) ? true : i.isRead
2630
- });
2631
- }));
3222
+ return [].concat(state, [data]);
2632
3223
  });
2633
3224
  };
3225
+ var handleCompletedConversation = function handleCompletedConversation(data) {
3226
+ if (!data) return;
3227
+ setSelectedConversation(JSON.parse(data));
3228
+ };
2634
3229
  var handleLoadMoreMessages = function handleLoadMoreMessages() {
2635
- if (handleLoadMore()) {
2636
- getMessageConversation();
3230
+ try {
3231
+ if ((selectedConversation === null || selectedConversation === void 0 ? void 0 : selectedConversation.id) === undefined) return Promise.resolve();
3232
+ return Promise.resolve(handleLoadMore(selectedConversation === null || selectedConversation === void 0 ? void 0 : selectedConversation.id));
3233
+ } catch (e) {
3234
+ return Promise.reject(e);
2637
3235
  }
2638
3236
  };
3237
+ var handleDeleteSelectedImage = function handleDeleteSelectedImage() {
3238
+ setSelectedFile(null);
3239
+ };
2639
3240
  var cleanupPusher = function cleanupPusher() {
2640
- var _pusher$current, _pusher$current2;
3241
+ var _pusher$current;
2641
3242
  (_pusher$current = pusher.current) === null || _pusher$current === void 0 ? void 0 : _pusher$current.unbind("new-message-event", handleNewMessageSent);
2642
- (_pusher$current2 = pusher.current) === null || _pusher$current2 === void 0 ? void 0 : _pusher$current2.unbind("message-read-event", handleMessageMarkRead);
2643
3243
  channelName.current && pusher.current && pusher.current.unsubscribe(channelName.current);
2644
3244
  };
2645
3245
  React.useEffect(function () {
2646
- if (PUSHER_CONFIG.cluster && PUSHER_CONFIG.key && !!(selectedConversation !== null && selectedConversation !== void 0 && selectedConversation.id)) {
3246
+ if (PUSHER_CONFIG.cluster && PUSHER_CONFIG.key && academyDomain && !!(selectedConversation !== null && selectedConversation !== void 0 && selectedConversation.id)) {
3247
+ var _headers;
2647
3248
  var token = getAccessToken();
2648
3249
  pusher.current = new Pusher(PUSHER_CONFIG.key, {
2649
3250
  cluster: PUSHER_CONFIG.cluster,
2650
3251
  authEndpoint: BASE_URL + "/api/auth/pusher",
2651
3252
  auth: {
2652
3253
  params: {},
2653
- headers: {
3254
+ headers: (_headers = {
2654
3255
  Authorization: "Bearer " + token
2655
- }
3256
+ }, _headers[AcademyHeaders] = academyDomain, _headers)
2656
3257
  }
2657
3258
  });
2658
3259
  channelName.current = "presence-conversation-channel-" + (selectedConversation === null || selectedConversation === void 0 ? void 0 : selectedConversation.id);
2659
3260
  channel.current = pusher.current.subscribe(channelName.current);
2660
3261
  pusher.current.bind("new-message-event", handleNewMessageSent);
2661
- pusher.current.bind("message-read-event", handleMessageMarkRead);
3262
+ pusher.current.bind("completed-conversation-event", handleCompletedConversation);
2662
3263
  }
2663
3264
  return cleanupPusher;
2664
- }, [selectedConversation === null || selectedConversation === void 0 ? void 0 : selectedConversation.id, messageFilter.examId, examId]);
3265
+ }, [selectedConversation === null || selectedConversation === void 0 ? void 0 : selectedConversation.id, academyDomain]);
2665
3266
  React.useEffect(function () {
2666
3267
  var getConversation = function getConversation() {
2667
3268
  try {
2668
- var _temp6 = function _temp6() {
2669
- dispatch(setLoading(false));
2670
- };
2671
3269
  resetMessages();
2672
3270
  setScrollToEnd(true);
2673
- if ((conversation === null || conversation === void 0 ? void 0 : conversation.id) !== undefined) {
2674
- setSelectedConversation(conversation);
2675
- return Promise.resolve();
2676
- }
2677
- if (!userId) return Promise.resolve();
2678
- dispatch(setLoading(true));
2679
- var _temp5 = _catch(function () {
2680
- return Promise.resolve(apiGetConversationByUserId(userId)).then(function (res) {
2681
- function _temp4() {
2682
- setSelectedConversation(res.data.data);
2683
- }
2684
- var _temp3 = function () {
2685
- if (!res.data.data) {
2686
- return Promise.resolve(createConversation(userId)).then(function (_createConversation) {
2687
- res = _createConversation;
2688
- });
2689
- }
2690
- }();
2691
- return _temp3 && _temp3.then ? _temp3.then(_temp4) : _temp4(_temp3);
2692
- });
2693
- }, function (error) {
2694
- console.log({
2695
- error: error
2696
- });
2697
- });
2698
- return Promise.resolve(_temp5 && _temp5.then ? _temp5.then(_temp6) : _temp6(_temp5));
3271
+ if (!(conversation !== null && conversation !== void 0 && conversation.id)) return Promise.resolve();
3272
+ setSelectedConversation(conversation);
3273
+ return Promise.resolve();
2699
3274
  } catch (e) {
2700
3275
  return Promise.reject(e);
2701
3276
  }
2702
3277
  };
2703
3278
  getConversation();
2704
- }, [conversation === null || conversation === void 0 ? void 0 : conversation.id, userId]);
2705
- var handleMarkRead = React.useCallback(function () {
2706
- try {
2707
- if (!(selectedConversation !== null && selectedConversation !== void 0 && selectedConversation.id)) return Promise.resolve();
2708
- var _temp7 = _catch(function () {
2709
- return Promise.resolve(apiMarkReadMessage(selectedConversation.id, -1)).then(function () {});
2710
- }, function (error) {
2711
- console.log({
2712
- error: error
2713
- });
2714
- });
2715
- return Promise.resolve(_temp7 && _temp7.then ? _temp7.then(function () {}) : void 0);
2716
- } catch (e) {
2717
- return Promise.reject(e);
2718
- }
2719
- }, [selectedConversation === null || selectedConversation === void 0 ? void 0 : selectedConversation.id]);
3279
+ }, [conversation === null || conversation === void 0 ? void 0 : conversation.id]);
2720
3280
  var getMessageConversation = function getMessageConversation() {
2721
3281
  try {
2722
- if (!roles.length) return Promise.resolve();
2723
3282
  if ((selectedConversation === null || selectedConversation === void 0 ? void 0 : selectedConversation.id) === undefined) return Promise.resolve();
2724
- return Promise.resolve(_catch(function () {
2725
- var _temp10 = function () {
2726
- if (selectedConversation.id === 0) {
2727
- var _userId = isStudent ? selectedConversation.teacher.id : selectedConversation.student.id;
2728
- return Promise.resolve(createConversation(_userId)).then(function (res) {
2729
- var _res$data$data;
2730
- return Promise.resolve(onCreateConversationSuccess === null || onCreateConversationSuccess === void 0 ? void 0 : onCreateConversationSuccess((_res$data$data = res.data.data) === null || _res$data$data === void 0 ? void 0 : _res$data$data.id)).then(function () {});
2731
- });
2732
- } else {
2733
- var _temp9 = function _temp9() {
2734
- return Promise.resolve(getMessageList(selectedConversation.id, examId)).then(function () {
2735
- onGetMessagesSuccess === null || onGetMessagesSuccess === void 0 ? void 0 : onGetMessagesSuccess();
2736
- });
2737
- };
2738
- var _temp8 = function () {
2739
- if (firstLoadRef.current) {
2740
- return Promise.resolve(handleMarkRead()).then(function () {
2741
- firstLoadRef.current = false;
2742
- });
2743
- }
2744
- }();
2745
- return _temp8 && _temp8.then ? _temp8.then(_temp9) : _temp9(_temp8);
2746
- }
2747
- }();
2748
- if (_temp10 && _temp10.then) return _temp10.then(function () {});
2749
- }, function () {
2750
- reactToastify.toast.error("Fail to fetch data!");
2751
- }));
3283
+ getMessageList(selectedConversation === null || selectedConversation === void 0 ? void 0 : selectedConversation.id);
3284
+ return Promise.resolve();
2752
3285
  } catch (e) {
2753
3286
  return Promise.reject(e);
2754
3287
  }
@@ -2757,231 +3290,55 @@ var useChatContainer = function useChatContainer(props) {
2757
3290
  resetMessages();
2758
3291
  setScrollToEnd(true);
2759
3292
  };
3293
+ var messageList = React.useMemo(function () {
3294
+ var results = messages.map(function (i) {
3295
+ var _i$sender;
3296
+ return _extends({}, i, {
3297
+ isMe: (infoUser === null || infoUser === void 0 ? void 0 : infoUser.id) === ((_i$sender = i.sender) === null || _i$sender === void 0 ? void 0 : _i$sender.id)
3298
+ });
3299
+ });
3300
+ return results;
3301
+ }, [JSON.stringify(messages)]);
2760
3302
  React.useEffect(function () {
2761
3303
  getMessageConversation();
2762
- }, [JSON.stringify(selectedConversation), JSON.stringify(roles), JSON.stringify(messageFilter), examId]);
2763
- var userName = (isStudent ? selectedConversation === null || selectedConversation === void 0 ? void 0 : (_selectedConversation3 = selectedConversation.teacher) === null || _selectedConversation3 === void 0 ? void 0 : _selectedConversation3.displayName : selectedConversation === null || selectedConversation === void 0 ? void 0 : (_selectedConversation4 = selectedConversation.student) === null || _selectedConversation4 === void 0 ? void 0 : _selectedConversation4.displayName) || "";
2764
- var userAvatar = (isStudent ? selectedConversation === null || selectedConversation === void 0 ? void 0 : (_selectedConversation5 = selectedConversation.teacher) === null || _selectedConversation5 === void 0 ? void 0 : _selectedConversation5.avatar : selectedConversation === null || selectedConversation === void 0 ? void 0 : (_selectedConversation6 = selectedConversation.student) === null || _selectedConversation6 === void 0 ? void 0 : _selectedConversation6.avatar) || "";
3304
+ }, [JSON.stringify(selectedConversation)]);
2765
3305
  return {
2766
3306
  chatHeaderProps: {
2767
- name: userName,
2768
- avatar: userAvatar,
2769
- options: exams,
2770
- selectedOption: messageFilter.examId,
2771
- onChangeOption: handleFilterExam
3307
+ fullName: student === null || student === void 0 ? void 0 : student.fullName,
3308
+ examTitle: selectedConversation === null || selectedConversation === void 0 ? void 0 : selectedConversation.examTitle,
3309
+ questionOrder: selectedConversation === null || selectedConversation === void 0 ? void 0 : (_selectedConversation = selectedConversation.question) === null || _selectedConversation === void 0 ? void 0 : _selectedConversation.questionOrder,
3310
+ conversationId: selectedConversation === null || selectedConversation === void 0 ? void 0 : selectedConversation.id,
3311
+ isCompleted: selectedConversation === null || selectedConversation === void 0 ? void 0 : selectedConversation.isCompleted,
3312
+ durationExam: selectedConversation === null || selectedConversation === void 0 ? void 0 : selectedConversation.duration,
3313
+ createdAt: selectedConversation === null || selectedConversation === void 0 ? void 0 : selectedConversation.createdAt,
3314
+ teacherName: selectedConversation === null || selectedConversation === void 0 ? void 0 : selectedConversation.teacherName,
3315
+ roles: roles
2772
3316
  },
2773
3317
  chatListProps: {
2774
3318
  messages: messageList,
2775
- onAddExamMessage: handleAddExamMessage,
2776
- onReply: handleReplyMessage,
2777
- onReTrySendMessage: handleAddMessage
3319
+ onReTrySendMessage: handleAddMessage,
3320
+ roles: roles
2778
3321
  },
2779
3322
  inputProps: {
3323
+ selectedFile: selectedFile,
2780
3324
  text: (message === null || message === void 0 ? void 0 : message.content) || "",
2781
- parentText: message === null || message === void 0 ? void 0 : message.parentContent,
2782
- examTitle: message === null || message === void 0 ? void 0 : message.examTitle,
2783
3325
  onChangeInput: handleChangeInput,
2784
3326
  onSubmit: handleAddMessage,
2785
- onClearReply: !messageFilter.examId || message !== null && message !== void 0 && message.parentContent ? handleClearReply : undefined
3327
+ handleDeleteSelectedImage: handleDeleteSelectedImage,
3328
+ handleUploadImage: handleUploadImage,
3329
+ isCompleted: selectedConversation === null || selectedConversation === void 0 ? void 0 : selectedConversation.isCompleted
2786
3330
  },
2787
3331
  isScrollToEnd: isScrollToEnd,
2788
3332
  isLoadingMessages: isLoadingMessages,
2789
- exams: exams,
2790
3333
  messageList: messageList,
2791
3334
  selectedConversation: selectedConversation,
2792
- messageStatus: messageStatus,
2793
3335
  messageFilter: messageFilter,
2794
3336
  handleToggleScrollToEnd: handleToggleScrollToEnd,
2795
3337
  handleLoadMoreMessages: handleLoadMoreMessages,
2796
3338
  getMessageList: getMessageList,
2797
- handleFilterExam: handleFilterExam,
2798
3339
  setMessage: setMessage,
2799
3340
  resetMessages: handleConversationChange,
2800
- getMessageConversation: getMessageConversation,
2801
- handleMarkRead: handleMarkRead
2802
- };
2803
- };
2804
-
2805
- var STUDENT_STATUS_URL = BASE_URL + "/api/user";
2806
- var getStudentConversationListApi = function getStudentConversationListApi(query) {
2807
- return api.get(STUDENT_STATUS_URL + "/GetStudentConversations", {
2808
- params: query
2809
- });
2810
- };
2811
-
2812
- var isFirstLoad = true;
2813
- var useConversationList = function useConversationList() {
2814
- var dispatch = reactRedux.useDispatch();
2815
- var user = reactRedux.useSelector(function (state) {
2816
- var _state$common;
2817
- return state === null || state === void 0 ? void 0 : (_state$common = state.common) === null || _state$common === void 0 ? void 0 : _state$common.user;
2818
- });
2819
- var roles = (user === null || user === void 0 ? void 0 : user.roles) || [];
2820
- var isStudent = roles.includes("Student");
2821
- var _useState = React.useState(),
2822
- selectedConversation = _useState[0],
2823
- setSelectedConversation = _useState[1];
2824
- var _useState2 = React.useState([]),
2825
- conversations = _useState2[0],
2826
- setConversations = _useState2[1];
2827
- var _useState3 = React.useState(CONVERSATION_DEFAULT_FILTER),
2828
- conversationFilter = _useState3[0],
2829
- setConversationFilter = _useState3[1];
2830
- var handleChangeSelectedConversation = function handleChangeSelectedConversation(val) {
2831
- setSelectedConversation(val);
2832
- };
2833
- var handleNewMessageConversation = function handleNewMessageConversation(val) {
2834
- setConversations(function (state) {
2835
- var index = state.findIndex(function (i) {
2836
- return i.id === val.id;
2837
- });
2838
- if (index > -1 && JSON.stringify(val) !== JSON.stringify(state[index])) {
2839
- return [val].concat(state.slice(0, index), state.slice(index + 1));
2840
- } else return [val].concat(state);
2841
- });
2842
- setSelectedConversation(function (state) {
2843
- if (!state) return val;
2844
- return state;
2845
- });
2846
- };
2847
- var handleMessageReadConversation = function handleMessageReadConversation(id, totalUnread) {
2848
- setConversations(function (state) {
2849
- var index = state.findIndex(function (i) {
2850
- return i.id === id;
2851
- });
2852
- if (index === -1 || totalUnread === state[index].totalUnReadMessage) return state;
2853
- return [].concat(state.slice(0, index), [_extends({}, state[index], {
2854
- totalUnReadMessage: totalUnread
2855
- })], state.slice(index + 1));
2856
- });
2857
- setSelectedConversation(function (state) {
2858
- if (!!state) return _extends({}, state, {
2859
- totalUnReadMessage: totalUnread
2860
- });
2861
- return state;
2862
- });
2863
- };
2864
- var handleChangeTextSearch = function handleChangeTextSearch(e) {
2865
- setConversationFilter(function (state) {
2866
- return _extends({}, state, {
2867
- textSearch: e.target.value
2868
- });
2869
- });
2870
- };
2871
- var handleChangeFilter = function handleChangeFilter(filter) {
2872
- setConversationFilter(function (state) {
2873
- return _extends({}, state, filter);
2874
- });
2875
- };
2876
- var formatConversationLastMessageContent = function formatConversationLastMessageContent(conversation) {
2877
- var _conversation$lastMes;
2878
- if (!(conversation !== null && conversation !== void 0 && conversation.lastMessage)) return "";
2879
- var content = conversation.lastMessage.content;
2880
- switch (conversation.lastMessage.type) {
2881
- case MessageSourceType.Exam:
2882
- switch (conversation.lastMessage.action) {
2883
- case MessageAction.Took:
2884
- content = (isStudent ? "You" : conversation.student.displayName) + " took the exam " + ((_conversation$lastMes = conversation.lastMessage.exam) === null || _conversation$lastMes === void 0 ? void 0 : _conversation$lastMes.title);
2885
- break;
2886
- }
2887
- break;
2888
- }
2889
- return content;
2890
- };
2891
- var getConversationList = function getConversationList() {
2892
- try {
2893
- var _temp2 = function _temp2() {
2894
- isFirstLoad && dispatch(setLoading(false));
2895
- if (isFirstLoad) isFirstLoad = false;
2896
- };
2897
- if (!roles.length) return Promise.resolve();
2898
- isFirstLoad && dispatch(setLoading(true));
2899
- var _temp = _catch(function () {
2900
- var apiGetConversations = isStudent ? getListConversation : getStudentConversationListApi;
2901
- return Promise.resolve(apiGetConversations(conversationFilter)).then(function (res) {
2902
- var _res$data$items;
2903
- setConversations(res.data.items || []);
2904
- !selectedConversation && setSelectedConversation((_res$data$items = res.data.items) === null || _res$data$items === void 0 ? void 0 : _res$data$items[0]);
2905
- });
2906
- }, function () {
2907
- setSelectedConversation(undefined);
2908
- dispatch(setAlert({
2909
- type: "danger",
2910
- message: "Fail to fetch data!"
2911
- }));
2912
- });
2913
- return Promise.resolve(_temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp));
2914
- } catch (e) {
2915
- return Promise.reject(e);
2916
- }
2917
- };
2918
- var handleUpdateTotalUnreadMessage = function handleUpdateTotalUnreadMessage() {
2919
- if (!(selectedConversation !== null && selectedConversation !== void 0 && selectedConversation.id)) return;
2920
- setConversations(function (state) {
2921
- var updateIndex = state.findIndex(function (i) {
2922
- return i.id === selectedConversation.id;
2923
- });
2924
- if (updateIndex < 0) return state;
2925
- return [].concat(state.slice(0, updateIndex), [_extends({}, state[updateIndex], {
2926
- totalUnReadMessage: 0
2927
- })], state.slice(updateIndex + 1));
2928
- });
2929
- };
2930
- var handleUpdateLastMessage = function handleUpdateLastMessage(lastMessage) {
2931
- setConversations(function (state) {
2932
- var updateIndex = state.findIndex(function (i) {
2933
- return i.id === lastMessage.conversationId;
2934
- });
2935
- if (updateIndex < 0) return state;
2936
- console.log({
2937
- lastMessage: lastMessage
2938
- });
2939
- return [_extends({}, state[updateIndex], {
2940
- lastMessage: lastMessage
2941
- })].concat(state.slice(0, updateIndex), state.slice(updateIndex + 1));
2942
- });
2943
- };
2944
- var handleCreateConversationSuccess = function handleCreateConversationSuccess(id) {
2945
- try {
2946
- if (!selectedConversation) return Promise.resolve();
2947
- setSelectedConversation(_extends({}, selectedConversation, {
2948
- id: id
2949
- }));
2950
- var index = conversations.findIndex(function (i) {
2951
- return i.student.id === (selectedConversation === null || selectedConversation === void 0 ? void 0 : selectedConversation.student.id) && i.teacher.id === (selectedConversation === null || selectedConversation === void 0 ? void 0 : selectedConversation.teacher.id);
2952
- });
2953
- if (index > -1) {
2954
- setConversations([].concat(conversations.slice(0, index), [_extends({}, selectedConversation, {
2955
- id: id
2956
- })], conversations.slice(index + 1)));
2957
- }
2958
- return Promise.resolve();
2959
- } catch (e) {
2960
- return Promise.reject(e);
2961
- }
2962
- };
2963
- React.useEffect(function () {
2964
- getConversationList();
2965
- }, [JSON.stringify(conversationFilter), roles.length]);
2966
- React.useEffect(function () {
2967
- window.document.title = "Q&A";
2968
- }, []);
2969
- return {
2970
- isStudent: isStudent,
2971
- conversationFilter: conversationFilter,
2972
- selectedConversation: selectedConversation,
2973
- conversations: conversations,
2974
- handleUpdateTotalUnreadMessage: handleUpdateTotalUnreadMessage,
2975
- handleChangeFilter: handleChangeFilter,
2976
- handleChangeSelectedConversation: handleChangeSelectedConversation,
2977
- handleChangeTextSearch: handleChangeTextSearch,
2978
- setSelectedConversation: setSelectedConversation,
2979
- handleUpdateLastMessage: handleUpdateLastMessage,
2980
- getConversationList: getConversationList,
2981
- formatConversationLastMessageContent: formatConversationLastMessageContent,
2982
- handleNewMessageConversation: handleNewMessageConversation,
2983
- handleCreateConversationSuccess: handleCreateConversationSuccess,
2984
- handleMessageReadConversation: handleMessageReadConversation
3341
+ getMessageConversation: getMessageConversation
2985
3342
  };
2986
3343
  };
2987
3344
 
@@ -2989,10 +3346,12 @@ var usePusherConversation = function usePusherConversation(onNewMessageConversat
2989
3346
  var pusher = React.useRef();
2990
3347
  var channel = React.useRef();
2991
3348
  var channelName = React.useRef();
2992
- var userId = reactRedux.useSelector(function (state) {
2993
- var _state$common, _state$common$user;
2994
- return state === null || state === void 0 ? void 0 : (_state$common = state.common) === null || _state$common === void 0 ? void 0 : (_state$common$user = _state$common.user) === null || _state$common$user === void 0 ? void 0 : _state$common$user.id;
3349
+ var user = reactRedux.useSelector(function (state) {
3350
+ var _state$common;
3351
+ return state === null || state === void 0 ? void 0 : (_state$common = state.common) === null || _state$common === void 0 ? void 0 : _state$common.user;
2995
3352
  });
3353
+ var userId = user === null || user === void 0 ? void 0 : user.id;
3354
+ var academyDomain = user === null || user === void 0 ? void 0 : user.academyDomain;
2996
3355
  var handleNewMessageConversationCreated = function handleNewMessageConversationCreated(data) {
2997
3356
  onNewMessageConversation === null || onNewMessageConversation === void 0 ? void 0 : onNewMessageConversation(data);
2998
3357
  };
@@ -3005,16 +3364,17 @@ var usePusherConversation = function usePusherConversation(onNewMessageConversat
3005
3364
  channelName.current && pusher.current && pusher.current.unsubscribe(channelName.current);
3006
3365
  };
3007
3366
  React.useEffect(function () {
3008
- if (PUSHER_CONFIG.cluster && PUSHER_CONFIG.key && !!userId) {
3367
+ if (PUSHER_CONFIG.cluster && PUSHER_CONFIG.key && academyDomain && !!userId) {
3368
+ var _headers;
3009
3369
  var token = getAccessToken$1();
3010
3370
  pusher.current = new Pusher(PUSHER_CONFIG.key, {
3011
3371
  cluster: PUSHER_CONFIG.cluster,
3012
3372
  authEndpoint: BASE_URL + "/api/auth/pusher",
3013
3373
  auth: {
3014
3374
  params: {},
3015
- headers: {
3375
+ headers: (_headers = {
3016
3376
  Authorization: "Bearer " + token
3017
- }
3377
+ }, _headers[AcademyHeaders] = academyDomain, _headers)
3018
3378
  }
3019
3379
  });
3020
3380
  channelName.current = "presence-conversation-channel-userId-" + userId;
@@ -3023,18 +3383,18 @@ var usePusherConversation = function usePusherConversation(onNewMessageConversat
3023
3383
  channel.current.bind("message-conversation-read-event", handleReadMessageConversation);
3024
3384
  }
3025
3385
  return cleanupPusher;
3026
- }, [userId]);
3386
+ }, [userId, academyDomain]);
3027
3387
  return {};
3028
3388
  };
3029
3389
 
3030
- var _excluded$1 = ["defaultValue", "options", "isDisabled", "scrollBottom", "value", "isMulti"];
3390
+ var _excluded$2 = ["defaultValue", "options", "isDisabled", "scrollBottom", "value", "isMulti"];
3031
3391
  var CustomCreatable = function CustomCreatable(_ref) {
3032
3392
  var options = _ref.options,
3033
3393
  isDisabled = _ref.isDisabled,
3034
3394
  scrollBottom = _ref.scrollBottom,
3035
3395
  value = _ref.value,
3036
3396
  isMulti = _ref.isMulti,
3037
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$1);
3397
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$2);
3038
3398
  var initialValues = Array.isArray(value) ? options.filter(function (i) {
3039
3399
  return value.includes(i.value);
3040
3400
  }) : isMulti ? options.filter(function (i) {
@@ -3052,7 +3412,7 @@ var CustomCreatable = function CustomCreatable(_ref) {
3052
3412
  }, rest));
3053
3413
  };
3054
3414
 
3055
- var _excluded$2 = ["isDefault", "defaultValue", "options", "isDisabled", "scrollBottom", "value", "isMulti"];
3415
+ var _excluded$3 = ["isDefault", "defaultValue", "options", "isDisabled", "scrollBottom", "value", "isMulti"];
3056
3416
  var CustomAsyncSelect = function CustomAsyncSelect(_ref) {
3057
3417
  var isDefault = _ref.isDefault,
3058
3418
  options = _ref.options,
@@ -3060,7 +3420,7 @@ var CustomAsyncSelect = function CustomAsyncSelect(_ref) {
3060
3420
  scrollBottom = _ref.scrollBottom,
3061
3421
  value = _ref.value,
3062
3422
  isMulti = _ref.isMulti,
3063
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$2);
3423
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$3);
3064
3424
  var initialValues = Array.isArray(value) ? options.filter(function (i) {
3065
3425
  return value.includes(i.value);
3066
3426
  }) : isMulti ? options.filter(function (i) {
@@ -3078,7 +3438,7 @@ var CustomAsyncSelect = function CustomAsyncSelect(_ref) {
3078
3438
  }, rest));
3079
3439
  };
3080
3440
 
3081
- var styles$2 = {"question":"_2uc_W","question-article":"_2p7kY","question-title":"_2tHmc","question--active":"_3IHYm","question-label":"_26ATj","question-input":"_3R8PR","question-btn":"_1VZac"};
3441
+ var styles$1 = {"question":"_2uc_W","question-article":"_2p7kY","question-title":"_2tHmc","question--active":"_3IHYm","question-label":"_26ATj","question-input":"_3R8PR","question-btn":"_1VZac"};
3082
3442
 
3083
3443
  var DURATION_OPTIONS = Array.from({
3084
3444
  length: 120
@@ -3091,7 +3451,7 @@ var SCORE_OPTIONS = Array.from({
3091
3451
  return i + 1;
3092
3452
  });
3093
3453
  var QUESTION_OPTIONS = Array.from({
3094
- length: 40
3454
+ length: 10
3095
3455
  }, function (_, i) {
3096
3456
  return i + 1;
3097
3457
  });
@@ -3121,7 +3481,7 @@ var QuestionView = function QuestionView(_ref) {
3121
3481
  }, React__default.createElement("div", {
3122
3482
  className: "d-flex flex-grow-1"
3123
3483
  }, React__default.createElement("div", {
3124
- className: styles$2["question-title"] + " me-2"
3484
+ className: styles$1["question-title"] + " me-2"
3125
3485
  }, "\uBB38\uC81C ", question.questionOrder + 1, "\uBC88"), React__default.createElement("div", {
3126
3486
  className: "d-flex flex-grow-1"
3127
3487
  }, Array.from({
@@ -3130,15 +3490,16 @@ var QuestionView = function QuestionView(_ref) {
3130
3490
  return i + 1;
3131
3491
  }).map(function (i) {
3132
3492
  return React__default.createElement(reactstrap.FormGroup, {
3133
- className: "d-flex flex-column px-4"
3493
+ className: "d-flex flex-column px-4",
3494
+ key: i
3134
3495
  }, React__default.createElement(reactstrap.Label, {
3135
3496
  htmlFor: "answer-" + i,
3136
- className: "" + styles$2["question-label"]
3497
+ className: "" + styles$1["question-label"]
3137
3498
  }, i, "\uBC88"), React__default.createElement(reactstrap.Input, {
3138
3499
  id: "answer-" + i,
3139
3500
  type: "radio",
3140
3501
  checked: question.correctAnswers.includes(i),
3141
- onClick: function onClick() {
3502
+ onChange: function onChange() {
3142
3503
  return onChangeCorrectAnswers(i, index);
3143
3504
  },
3144
3505
  disabled: isDisabled
@@ -3204,7 +3565,7 @@ var ArticleGroupView = function ArticleGroupView(_ref) {
3204
3565
  };
3205
3566
  });
3206
3567
  return React__default.createElement("div", {
3207
- className: "d-flex " + styles$2["question"] + " " + (isActive ? styles$2["question--active"] : "")
3568
+ className: "d-flex " + styles$1["question"] + " " + (isActive ? styles$1["question--active"] : "")
3208
3569
  }, React__default.createElement("div", {
3209
3570
  className: "py-1"
3210
3571
  }, React__default.createElement(pi.PiDotsNineLight, {
@@ -3214,16 +3575,16 @@ var ArticleGroupView = function ArticleGroupView(_ref) {
3214
3575
  }, React__default.createElement(reactstrap.Row, null, React__default.createElement(reactstrap.Col, {
3215
3576
  xs: 12
3216
3577
  }, React__default.createElement("p", {
3217
- className: "mb-0 " + styles$2["question-article"]
3578
+ className: "mb-0 " + styles$1["question-article"]
3218
3579
  }, "\uBB38\uD56D"), React__default.createElement("p", {
3219
- className: "text-center " + styles$2["question-article"]
3580
+ className: "text-center " + styles$1["question-article"]
3220
3581
  }, article)))), React__default.createElement("div", {
3221
3582
  className: "flex-grow-1"
3222
3583
  }, React__default.createElement(reactstrap.Row, null, React__default.createElement(reactstrap.Col, {
3223
3584
  xs: 3
3224
3585
  }, React__default.createElement(reactstrap.FormGroup, null, React__default.createElement(reactstrap.Label, {
3225
3586
  htmlFor: "question_count",
3226
- className: "" + styles$2["question-label"]
3587
+ className: "" + styles$1["question-label"]
3227
3588
  }, t("question_count")), React__default.createElement(CustomSelect, {
3228
3589
  inputId: "question_count",
3229
3590
  value: questionCount,
@@ -3234,7 +3595,7 @@ var ArticleGroupView = function ArticleGroupView(_ref) {
3234
3595
  xs: 3
3235
3596
  }, React__default.createElement(reactstrap.FormGroup, null, React__default.createElement(reactstrap.Label, {
3236
3597
  htmlFor: "category",
3237
- className: "" + styles$2["question-label"]
3598
+ className: "" + styles$1["question-label"]
3238
3599
  }, t("category")), React__default.createElement(CustomSelect, {
3239
3600
  inputId: "category",
3240
3601
  value: categoryId,
@@ -3245,7 +3606,7 @@ var ArticleGroupView = function ArticleGroupView(_ref) {
3245
3606
  xs: 3
3246
3607
  }, React__default.createElement(reactstrap.FormGroup, null, React__default.createElement(reactstrap.Label, {
3247
3608
  htmlFor: "answer_count",
3248
- className: "" + styles$2["question-label"]
3609
+ className: "" + styles$1["question-label"]
3249
3610
  }, t("answer_count")), React__default.createElement(CustomSelect, {
3250
3611
  inputId: "answer_count",
3251
3612
  value: answerCount,
@@ -3358,9 +3719,10 @@ var useExamDetailView = function useExamDetailView(props) {
3358
3719
  } else {
3359
3720
  onChangeExam(_extends({}, exam, {
3360
3721
  questions: [].concat(otherQuestions, questions.map(function (q) {
3722
+ var _q$correctAnswers;
3361
3723
  return _extends({}, q, {
3362
3724
  numberOfAnswers: newAnswerCount,
3363
- correctAnswers: q.correctAnswers.filter(function (i) {
3725
+ correctAnswers: (_q$correctAnswers = q.correctAnswers) === null || _q$correctAnswers === void 0 ? void 0 : _q$correctAnswers.filter(function (i) {
3364
3726
  return i <= newAnswerCount;
3365
3727
  })
3366
3728
  });
@@ -3501,24 +3863,28 @@ var ExamDetailView = function ExamDetailView(_ref) {
3501
3863
  handleChangeAnswerCount = _useExamDetailView.handleChangeAnswerCount,
3502
3864
  handleChangeQuestionCount = _useExamDetailView.handleChangeQuestionCount,
3503
3865
  handleChangeCategory = _useExamDetailView.handleChangeCategory;
3504
- return React__default.createElement(reactstrap.Row, {
3505
- className: "" + className
3506
- }, React__default.createElement(reactstrap.Col, {
3507
- xs: 5
3508
- }, React__default.createElement(reactstrap.FormGroup, null, React__default.createElement(reactstrap.Label, {
3509
- className: "" + styles$2["question-label"],
3866
+ return React__default.createElement("div", {
3867
+ className: className + " " + stylesGlobal["custom-row"]
3868
+ }, React__default.createElement("div", {
3869
+ className: stylesGlobal["custom-col-5"]
3870
+ }, React__default.createElement("div", {
3871
+ className: 'mb-3'
3872
+ }, React__default.createElement("label", {
3873
+ className: stylesGlobal["form-label"] + " " + styles$1["question-label"],
3510
3874
  htmlFor: "title"
3511
- }, t("title")), React__default.createElement(reactstrap.Input, {
3875
+ }, t("title")), React__default.createElement("input", {
3512
3876
  disabled: isDisabled,
3513
- className: "w-100 rounded-2 " + styles$2["question-input"],
3877
+ className: "" + stylesGlobal["form-control"],
3514
3878
  value: exam.title,
3515
3879
  id: "title",
3516
3880
  placeholder: t("enter_title"),
3517
3881
  onChange: handleChangeTitle
3518
- }))), React__default.createElement(reactstrap.Col, {
3519
- xs: 3
3520
- }, React__default.createElement(reactstrap.FormGroup, null, React__default.createElement(reactstrap.Label, {
3521
- className: "" + styles$2["question-label"],
3882
+ }))), React__default.createElement("div", {
3883
+ className: stylesGlobal["custom-col-3"]
3884
+ }, React__default.createElement("div", {
3885
+ className: 'mb-3'
3886
+ }, React__default.createElement("label", {
3887
+ className: stylesGlobal["form-label"] + " " + styles$1["question-label"],
3522
3888
  htmlFor: "duration"
3523
3889
  }, t("duration")), React__default.createElement(CustomSelect, {
3524
3890
  inputId: "duration",
@@ -3526,13 +3892,10 @@ var ExamDetailView = function ExamDetailView(_ref) {
3526
3892
  options: durationOptions,
3527
3893
  onChange: handleChangeDuration,
3528
3894
  isDisabled: isDisabled
3529
- }))), React__default.createElement(reactstrap.Col, {
3530
- xs: 4
3531
- }), examGroupByArticle.map(function (i, index) {
3532
- return React__default.createElement(reactstrap.Col, {
3533
- xs: 12,
3895
+ }))), examGroupByArticle.map(function (i, index) {
3896
+ return React__default.createElement("div", {
3534
3897
  key: i.article,
3535
- className: (index === 0 && !isUsingMui ? "mt-3" : "") + " " + (!isUsingMui ? "mb-4" : "")
3898
+ className: stylesGlobal["custom-col-12"] + " " + (index === 0 && !isUsingMui ? "mt-3" : "") + " " + (!isUsingMui ? "mb-4" : "")
3536
3899
  }, React__default.createElement(ArticleGroupView, Object.assign({}, i, {
3537
3900
  categoryOptions: categoryOptions,
3538
3901
  isActive: index === examGroupByArticle.length - 1,
@@ -3543,49 +3906,106 @@ var ExamDetailView = function ExamDetailView(_ref) {
3543
3906
  onChangeScoreAnswer: handleChangeScoreAnswer,
3544
3907
  isDisabled: isDisabled
3545
3908
  })));
3546
- }), React__default.createElement(reactstrap.Col, {
3547
- xs: 12
3548
- }, React__default.createElement(reactstrap.Button, {
3909
+ }), React__default.createElement("div", {
3910
+ className: stylesGlobal["custom-col-12"]
3911
+ }, React__default.createElement("button", {
3549
3912
  disabled: isDisabled,
3550
- className: "w-100 d-flex justify-content-center align-items-center " + styles$2["question-btn"],
3551
- color: "primary",
3552
- outline: true,
3913
+ className: stylesGlobal["btn-outline-primary"] + " w-100 d-flex justify-content-center align-items-center " + styles$1["question-btn"] + " mt-3",
3553
3914
  onClick: handleAddArticle
3554
3915
  }, React__default.createElement(fa.FaPlusCircle, {
3555
3916
  className: "me-2"
3556
3917
  }), "\uBB38\uD56D \uCD94\uAC00\uD558\uAE30")));
3557
3918
  };
3558
3919
 
3920
+ var useAutoAcademyDomain = function useAutoAcademyDomain(logout, history, superUrls, homeUrl, homeAcademyUrl) {
3921
+ var searchParams = new URLSearchParams(window.location.search);
3922
+ var user = reactRedux.useSelector(function (state) {
3923
+ var _state$common;
3924
+ return state === null || state === void 0 ? void 0 : (_state$common = state.common) === null || _state$common === void 0 ? void 0 : _state$common.user;
3925
+ });
3926
+ var initialAcademySearchParam = function initialAcademySearchParam() {
3927
+ var paramAcademyDomain = searchParams.get("domain");
3928
+ var domain = getAcademyDomain();
3929
+ var pathname = window.location.pathname.toLowerCase();
3930
+ if (!user) return;
3931
+ var academyDomain = user.academyDomain;
3932
+ if (!academyDomain) {
3933
+ if (!superUrls.some(function (i) {
3934
+ return pathname.startsWith(i);
3935
+ })) {
3936
+ pushTo({
3937
+ pathname: homeUrl,
3938
+ search: ""
3939
+ });
3940
+ }
3941
+ if (domain) {
3942
+ searchParams.append("domain", domain);
3943
+ pushTo({
3944
+ pathname: homeUrl,
3945
+ search: ""
3946
+ });
3947
+ }
3948
+ } else {
3949
+ if (superUrls.some(function (i) {
3950
+ return pathname.startsWith(i);
3951
+ })) {
3952
+ pushTo({
3953
+ pathname: homeAcademyUrl,
3954
+ search: ""
3955
+ });
3956
+ }
3957
+ if (paramAcademyDomain && academyDomain.trim().toLocaleLowerCase() != (paramAcademyDomain === null || paramAcademyDomain === void 0 ? void 0 : paramAcademyDomain.trim().toLocaleLowerCase())) {
3958
+ logout();
3959
+ }
3960
+ if (!paramAcademyDomain && academyDomain) {
3961
+ searchParams.append("domain", academyDomain);
3962
+ pushTo(_extends({}, window.location, {
3963
+ search: searchParams.toString()
3964
+ }));
3965
+ }
3966
+ }
3967
+ };
3968
+ var pushTo = function pushTo(data) {
3969
+ if (history.push) history.push(data);else history(data);
3970
+ };
3971
+ React.useEffect(function () {
3972
+ initialAcademySearchParam();
3973
+ }, [window.location.pathname, user === null || user === void 0 ? void 0 : user.academyDomain]);
3974
+ };
3975
+
3559
3976
  var historyCore = history.createBrowserHistory();
3560
3977
 
3561
3978
  exports.moment = moment;
3562
3979
  Object.defineProperty(exports, 'I18nextProvider', {
3563
- enumerable: true,
3564
- get: function () {
3565
- return reactI18next.I18nextProvider;
3566
- }
3980
+ enumerable: true,
3981
+ get: function () {
3982
+ return reactI18next.I18nextProvider;
3983
+ }
3567
3984
  });
3568
3985
  Object.defineProperty(exports, 'useTranslation', {
3569
- enumerable: true,
3570
- get: function () {
3571
- return reactI18next.useTranslation;
3572
- }
3986
+ enumerable: true,
3987
+ get: function () {
3988
+ return reactI18next.useTranslation;
3989
+ }
3573
3990
  });
3574
3991
  Object.defineProperty(exports, 'ToastContainer', {
3575
- enumerable: true,
3576
- get: function () {
3577
- return reactToastify.ToastContainer;
3578
- }
3992
+ enumerable: true,
3993
+ get: function () {
3994
+ return reactToastify.ToastContainer;
3995
+ }
3579
3996
  });
3580
3997
  Object.defineProperty(exports, 'toast', {
3581
- enumerable: true,
3582
- get: function () {
3583
- return reactToastify.toast;
3584
- }
3998
+ enumerable: true,
3999
+ get: function () {
4000
+ return reactToastify.toast;
4001
+ }
3585
4002
  });
4003
+ exports.ACADEMY_DOMAIN = ACADEMY_DOMAIN;
3586
4004
  exports.ACCESS_TOKEN = ACCESS_TOKEN;
4005
+ exports.AcademyHeaders = AcademyHeaders;
3587
4006
  exports.BASE_URL = BASE_URL;
3588
4007
  exports.ChatContainer = ChatContainer;
4008
+ exports.ChatTypes = types;
3589
4009
  exports.CommonAlert = CommonAlert;
3590
4010
  exports.CommonDialog = CommonDialog;
3591
4011
  exports.ConfirmDialog = ConfirmDialog;
@@ -3604,11 +4024,15 @@ exports.Loading = Loading;
3604
4024
  exports.Login = Login;
3605
4025
  exports.NotFound = NotFound;
3606
4026
  exports.PUSHER_CONFIG = PUSHER_CONFIG;
4027
+ exports.SUPER_ADMIN_BASE_URL = SUPER_ADMIN_BASE_URL;
4028
+ exports.TheAcademyDropdown = TheAcademyDropdown;
3607
4029
  exports.TheLanguageDropdown = TheLanguageDropdown;
3608
4030
  exports.api = api;
4031
+ exports.apiUpload = apiUpload;
3609
4032
  exports.canAccessRoute = canAccess;
3610
4033
  exports.diffFromNow = diffFromNow;
3611
4034
  exports.formatTime = formatTime;
4035
+ exports.getAcademyDomain = getAcademyDomain;
3612
4036
  exports.getAccessToken = getAccessToken$1;
3613
4037
  exports.historyCore = historyCore;
3614
4038
  exports.i18n = i18n;
@@ -3616,13 +4040,16 @@ exports.minutesToTimeSpan = minutesToTimeSpan;
3616
4040
  exports.setAlert = setAlert;
3617
4041
  exports.setLanguage = setLanguage;
3618
4042
  exports.setLoading = setLoading;
4043
+ exports.setReFetchUserAcademies = setReFetchUserAcademies;
3619
4044
  exports.setUser = setUser;
3620
4045
  exports.store = store;
3621
4046
  exports.toISOString = toISOString;
4047
+ exports.useAutoAcademyDomain = useAutoAcademyDomain;
3622
4048
  exports.useChatContainer = useChatContainer;
3623
- exports.useConversationList = useConversationList;
3624
4049
  exports.useGoogleSignOut = useGoogleSignOut;
3625
4050
  exports.useLanguage = useLanguage;
4051
+ exports.useLogin = useLogin;
3626
4052
  exports.usePusherConversation = usePusherConversation;
4053
+ exports.useSwitchAcademy = useSwitchAcademy;
3627
4054
  exports.utcToLocalTime = utcToLocalTime;
3628
4055
  //# sourceMappingURL=index.js.map