touchstudy-core 0.1.0 → 0.1.2

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 (39) hide show
  1. package/dist/components/Commons/NotFound.d.ts +3 -0
  2. package/dist/components/Dialogs/CommonDialog.d.ts +11 -0
  3. package/dist/components/Dialogs/ConfirmDialog.d.ts +13 -0
  4. package/dist/components/Loading/Loading.d.ts +3 -0
  5. package/dist/components/Paginations/CustomPagination.d.ts +8 -0
  6. package/dist/configs/constants.d.ts +11 -0
  7. package/dist/containers/Login/apiClient/index.d.ts +1 -0
  8. package/dist/containers/Login/configs/constants.d.ts +4 -0
  9. package/dist/containers/Login/hooks/useLogin.d.ts +0 -3
  10. package/dist/containers/Login/views/Login.d.ts +5 -8
  11. package/dist/containers/Login/views/block/BlockLogin.d.ts +3 -2
  12. package/dist/i18n.d.ts +2 -0
  13. package/dist/index.css +19 -601
  14. package/dist/index.d.ts +23 -3
  15. package/dist/index.js +1334 -12
  16. package/dist/index.js.map +1 -1
  17. package/dist/index.modern.js +1299 -12
  18. package/dist/index.modern.js.map +1 -1
  19. package/dist/layouts/LayoutContext.d.ts +6 -0
  20. package/dist/layouts/TheLanguageDropdown.d.ts +3 -0
  21. package/dist/redux/commons/action.d.ts +2 -0
  22. package/dist/services/accountService.d.ts +1 -0
  23. package/dist/services/api.d.ts +3 -0
  24. package/dist/store.d.ts +2 -0
  25. package/dist/utils/addTime.d.ts +3 -0
  26. package/dist/utils/canAccessRoute.d.ts +2 -0
  27. package/dist/utils/constants.d.ts +10 -1
  28. package/dist/utils/diffFromNow.d.ts +3 -0
  29. package/dist/utils/encodeParams.d.ts +2 -0
  30. package/dist/utils/formatTime.d.ts +2 -0
  31. package/dist/utils/getAccessToken.d.ts +2 -0
  32. package/dist/utils/minutesToTimeSpan.d.ts +2 -0
  33. package/dist/utils/toISOString.d.ts +2 -0
  34. package/dist/utils/types.d.ts +11 -0
  35. package/dist/utils/useGoogleSignOut.d.ts +9 -0
  36. package/dist/utils/utcToLocalTime.d.ts +2 -0
  37. package/package.json +9 -2
  38. package/dist/components/Alerts/ReactNotification.d.ts +0 -4
  39. package/dist/components/Alerts/SandboxAlert.d.ts +0 -3
package/dist/index.js CHANGED
@@ -1,36 +1,1358 @@
1
1
  function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
2
2
 
3
+ var history = require('history');
3
4
  var toolkit = require('@reduxjs/toolkit');
4
- var React = _interopDefault(require('react'));
5
+ var moment = _interopDefault(require('moment'));
6
+ var React = require('react');
7
+ var React__default = _interopDefault(React);
8
+ var reactGoogleRecaptchaV3 = require('react-google-recaptcha-v3');
5
9
  var reactstrap = require('reactstrap');
10
+ var formik = require('formik');
11
+ var yup = require('yup');
12
+ var GoogleLogin = require('@leecheuk/react-google-login');
13
+ var GoogleLogin__default = _interopDefault(GoogleLogin);
14
+ var axios = _interopDefault(require('axios'));
15
+ var reactRedux = require('react-redux');
16
+ var gapiScript = require('gapi-script');
17
+ var i18n = _interopDefault(require('i18next'));
18
+ var reactI18next = require('react-i18next');
19
+ var io5 = require('react-icons/io5');
6
20
 
7
21
  var setLoading = toolkit.createAction("common/setLoading");
8
22
  var setAlert = toolkit.createAction("common/setAlert");
23
+ var setUser = toolkit.createAction("common/setUser");
24
+ var setLanguage = toolkit.createAction("common/setLanguage");
9
25
 
26
+ var GOOGLE_CLIENT_ID = "64118819726-0qlur4qjrs9jbuu6rnoa0u91g680lmpg.apps.googleusercontent.com";
27
+ var GOOGLE_RECAPTCHA_ID = "6LfNtLUaAAAAAL24lbBV11jS-gBtt1mhtxb4NXs0";
10
28
  var ACCESS_TOKEN = "ACCESS_TOKEN";
11
- var BASE_URL = function () {
12
- var windowUrl = window.location.href;
13
- var url = windowUrl.split("//")[0] + "//" + windowUrl.split("//")[1].split("/")[0];
14
- return url;
15
- }();
29
+ var DATE_MIN_VALUE = "0001-01-01T00:00:00+00:00";
30
+ var BASE_URL = "https://localhost:7045";
31
+ var PUSHER_CONFIG = {
32
+ cluster: "ap1",
33
+ key: "9018c77328885a14150b"
34
+ };
35
+ var EXAM_CHANNEL = "EXAM-CHANNEL";
36
+ var getAccessToken = function getAccessToken() {
37
+ try {
38
+ return localStorage.getItem(ACCESS_TOKEN);
39
+ } catch (err) {
40
+ return null;
41
+ }
42
+ };
43
+ var encodeParams = function encodeParams(params) {
44
+ return Object.keys(params).filter(function (key) {
45
+ return params[key] || params[key] === 0 || params[key] === false;
46
+ }).map(function (key) {
47
+ if (Array.isArray(params[key])) {
48
+ return params[key].map(function (i) {
49
+ return encodeURIComponent(key) + "=" + encodeURIComponent(i);
50
+ }).join('&');
51
+ }
52
+ return encodeURIComponent(key) + "=" + encodeURIComponent(params[key]);
53
+ }).join('&');
54
+ };
55
+
56
+ var utcToLocalTime = (function (time, FORMAT) {
57
+ if (time === DATE_MIN_VALUE) return "";
58
+ try {
59
+ return moment.utc(time).local().format(FORMAT || "yyyy-MM-DD");
60
+ } catch (_unused) {
61
+ return "";
62
+ }
63
+ });
64
+
65
+ // A type of promise-like that resolves synchronously and supports only one observer
66
+
67
+ const _iteratorSymbol = /*#__PURE__*/ typeof Symbol !== "undefined" ? (Symbol.iterator || (Symbol.iterator = Symbol("Symbol.iterator"))) : "@@iterator";
68
+
69
+ const _asyncIteratorSymbol = /*#__PURE__*/ typeof Symbol !== "undefined" ? (Symbol.asyncIterator || (Symbol.asyncIterator = Symbol("Symbol.asyncIterator"))) : "@@asyncIterator";
70
+
71
+ // Asynchronously call a function and send errors to recovery continuation
72
+ function _catch(body, recover) {
73
+ try {
74
+ var result = body();
75
+ } catch(e) {
76
+ return recover(e);
77
+ }
78
+ if (result && result.then) {
79
+ return result.then(void 0, recover);
80
+ }
81
+ return result;
82
+ }
83
+
84
+ 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"};
16
85
 
17
- var styles = {"btn-login-google":"_2HqmH","notification-count":"_2sew7","text-introduction":"_3OgWF","btn-trans-border":"_r9cAh","contact":"_NszFe","learn-more":"_MDjzH","title-quote":"_1Swkw","descriptions-quote":"_gi8vj","box-login":"_38Lo1","block-verification":"_1OzGy","block-login":"_wWIyO","title-login":"_3nuns","title-forgot-password":"_21qb6","btn-close":"_NhW9l","btn-login":"_3IL10","digital-privacy-icon":"_141p1","return-to-login":"_Ce3Kg","recover-account":"_2t6d9","link-to-login":"_3bDsd","remember":"_11FZt","term-and-conditions":"_3LXoI","descriptions-forgot-pass":"_PMcjT","content-icon":"_2rZY6","descriptions-icon":"_3SOdX","title-icon":"_y9lM2","nav-home":"_1TT1q","box-introduction":"_32V6L","icon":"_20YJX","form-user-name":"_39BJD","input":"_ozRAq","checkbox-remember":"_2K9b2","btn-rounder":"_2VvIr","btn-active":"_2A0HF","block-reset-password":"_23Sua","block-forgot-pass":"_3CWP6","page-not-login":"_3Wmco","content-quote":"_13Rk0","home-page":"_o6HKW","bg-animate":"_30npl","active":"_3oAH-","show":"_16rY4","fade-in":"_26nbh","behind":"_3A7Vv","login":"_F-hjL","login-content":"_149oA","logo-home":"_24U3W","img-box":"_2v-L_","img-login":"_3ncTL","img-login-rectangle":"_2kOvJ","c-main":"_39l0X","container-fluid":"_1BMwK","input-file-label":"_1XNpH","delete-avatar-button":"_1z5h9","header-logo":"_Gewcf","box-sidebar":"_2vcmv","sidebar-logo":"_1hXpy","sidebar-nav-links":"_3vb3s","c-active":"_36jSM","sidebar-nav-links-hover":"_DNrus","box-sidebar-header":"_3NEZj","box-logout":"_1wUDG","sidebar-btn-minimized":"_1S7Px","sidebar-minimized-logo":"_3846X","sidebar-logout":"_2P85D","nav-mobile":"_1qjbW","filter-media-file":"_1I62C","div":"_3cLcM","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","logout":"_1_9tV","content-text":"_3S4f2","dropdown-content-language":"_3ajui","dropdown-item-language":"_3Y_y4","dropdown-item-language-active":"_CzNMi","popover__sort__item":"_1ocBa","popover__sort__item--active":"_18NhM","popover__search__icon":"_2bquW","popover__search__input":"_3A4G4","popover__options":"_1MsEW","button-export":"_2rTzM","button-content":"_18y0w","button-icon":"_3cZAT","hide-in-mobile":"_1INnO","hamburger-menu":"_2yRc8","box-content-home-page":"_ABUIP","collapse-box":"_WX97m","hide-in-desktop":"_2LIqK","control-input":"_2Zz97","custom-control":"_3-yp5","item-select-role":"_1KcY7","item-role-active":"_dOVso","model-switch-roles":"_3ZqxI","title":"_g-p72"};
86
+ var api = axios.create({
87
+ baseURL: BASE_URL,
88
+ timeout: 0,
89
+ headers: {
90
+ "Content-Type": "application/json"
91
+ },
92
+ paramsSerializer: function paramsSerializer(params) {
93
+ return encodeParams(params);
94
+ }
95
+ });
96
+ var apiUpload = axios.create({
97
+ baseURL: BASE_URL,
98
+ timeout: 60000,
99
+ headers: {
100
+ "Content-Type": "multipart/form-data"
101
+ }
102
+ });
103
+ [api, apiUpload].forEach(function (i) {
104
+ return i.interceptors.request.use(function (config) {
105
+ var token = getAccessToken();
106
+ if (token) {
107
+ config.headers.Authorization = "Bearer " + token;
108
+ localStorage.setItem("LAST_TIME_REQUETST", moment().utc().format("YYYY-MM-DD HH:mm:ss"));
109
+ }
110
+ return config;
111
+ }, function (error) {
112
+ return Promise.reject(error);
113
+ });
114
+ });
115
+ [api, apiUpload].forEach(function (i) {
116
+ return i.interceptors.response.use(function (response) {
117
+ return response;
118
+ }, function (error) {
119
+ var _error$response, _error$response2;
120
+ console.log({
121
+ error: error
122
+ });
123
+ if (((_error$response = error.response) === null || _error$response === void 0 ? void 0 : _error$response.status) === 401) {
124
+ window.location.href = "/login";
125
+ }
126
+ if (((_error$response2 = error.response) === null || _error$response2 === void 0 ? void 0 : _error$response2.status) == 403) {
127
+ localStorage.removeItem(ACCESS_TOKEN);
128
+ localStorage.removeItem("USER_EMAIL");
129
+ window.location.href = "/login";
130
+ }
131
+ return Promise.reject(error);
132
+ });
133
+ });
18
134
 
19
- var Login = function Login(_props) {
20
- return React.createElement("div", {
135
+ var apiLoginGoogle = function apiLoginGoogle(body, role) {
136
+ return api.post(BASE_URL + "/api/auth/" + role + "/login", body);
137
+ };
138
+
139
+ var AuthenticationMessage;
140
+ (function (AuthenticationMessage) {
141
+ AuthenticationMessage["NotAllowedToRegister"] = "NotAllowedToRegister";
142
+ AuthenticationMessage["InvalidGoogleToken"] = "InvalidGoogleToken";
143
+ })(AuthenticationMessage || (AuthenticationMessage = {}));
144
+
145
+ var useGoogleSignOut = function useGoogleSignOut(props) {
146
+ var onLogoutSuccess = props.onLogoutSuccess,
147
+ onFailure = props.onFailure;
148
+ var _useGoogleLogout = GoogleLogin.useGoogleLogout({
149
+ clientId: GOOGLE_CLIENT_ID,
150
+ onLogoutSuccess: onLogoutSuccess,
151
+ onFailure: onFailure
152
+ }),
153
+ signOut = _useGoogleLogout.signOut,
154
+ loaded = _useGoogleLogout.loaded;
155
+ return {
156
+ signOut: signOut,
157
+ loaded: loaded
158
+ };
159
+ };
160
+
161
+ var ERROR_MESSAGE = "Login fail!";
162
+ var schema = yup.object({
163
+ email: yup.string().email("Email is invalid").required("Email is required"),
164
+ password: yup.string().required("Password is required"),
165
+ rememberMe: yup.boolean()
166
+ });
167
+ var BlockLogin = function BlockLogin(_ref) {
168
+ var defaultInfo = _ref.defaultInfo,
169
+ onNavigate = _ref.onNavigate,
170
+ isTeacher = _ref.isTeacher;
171
+ var dispatch = reactRedux.useDispatch();
172
+ var _useGoogleReCaptcha = reactGoogleRecaptchaV3.useGoogleReCaptcha(),
173
+ executeRecaptcha = _useGoogleReCaptcha.executeRecaptcha;
174
+ var _useGoogleSignOut = useGoogleSignOut({}),
175
+ signOut = _useGoogleSignOut.signOut;
176
+ var clickHandler = React.useCallback(function () {
177
+ try {
178
+ if (!executeRecaptcha) {
179
+ console.log("execute recaptcha undefined");
180
+ return Promise.resolve();
181
+ }
182
+ return Promise.resolve(executeRecaptcha("login"));
183
+ } catch (e) {
184
+ return Promise.reject(e);
185
+ }
186
+ }, [executeRecaptcha]);
187
+ var handleVerify = React.useCallback(function () {}, []);
188
+ var onSuccessGoogle = function onSuccessGoogle(res) {
189
+ try {
190
+ var _exit = false;
191
+ return Promise.resolve(function () {
192
+ if (!!(res !== null && res !== void 0 && res.accessToken)) {
193
+ var _temp2 = function _temp2(_result) {
194
+ if (_exit) return _result;
195
+ dispatch(setLoading(false));
196
+ };
197
+ var _res$profileObj = res.profileObj,
198
+ email = _res$profileObj.email,
199
+ imageUrl = _res$profileObj.imageUrl,
200
+ name = _res$profileObj.name;
201
+ var accessToken = res.tokenObj.id_token;
202
+ var googleId = res.googleId;
203
+ var infoLogin = {
204
+ imageUrl: imageUrl,
205
+ fullName: name,
206
+ email: email,
207
+ token: accessToken,
208
+ googleId: googleId
209
+ };
210
+ var role = isTeacher ? "Teacher" : "Student";
211
+ dispatch(setLoading(true));
212
+ var _temp = _catch(function () {
213
+ return Promise.resolve(apiLoginGoogle(infoLogin, role)).then(function (res1) {
214
+ var isFirstLogin = res1.data.isFirstLogin;
215
+ var tokenJWT = res1.data.token;
216
+ localStorage.setItem("USER_INFORMATION", JSON.stringify(infoLogin));
217
+ localStorage.setItem(ACCESS_TOKEN, tokenJWT);
218
+ if (isTeacher) {
219
+ onNavigate("/teacher/overall-status/main");
220
+ _exit = true;
221
+ return;
222
+ }
223
+ if (isFirstLogin) {
224
+ onNavigate("/register/info");
225
+ } else {
226
+ onNavigate("/student/check/main");
227
+ }
228
+ });
229
+ }, function (error) {
230
+ var _error$response, _error$response$data;
231
+ var message = undefined;
232
+ 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;
233
+ if (type === AuthenticationMessage.NotAllowedToRegister) {
234
+ alert("가입 권한이 없는 계정입니다. 관리자에게 문의하세요.");
235
+ } else if (type) {
236
+ var _error$response2, _error$response2$data;
237
+ 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;
238
+ } else {
239
+ var _error$response3;
240
+ message = (error === null || error === void 0 ? void 0 : (_error$response3 = error.response) === null || _error$response3 === void 0 ? void 0 : _error$response3.data) || ERROR_MESSAGE;
241
+ }
242
+ signOut();
243
+ !!message && dispatch(setAlert({
244
+ type: "danger",
245
+ message: message
246
+ }));
247
+ });
248
+ return _temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp);
249
+ }
250
+ }());
251
+ } catch (e) {
252
+ return Promise.reject(e);
253
+ }
254
+ };
255
+ var onFailureGoogle = function onFailureGoogle(err) {
256
+ console.log("error: login google", err);
257
+ onNavigate("/login");
258
+ };
259
+ return React__default.createElement(formik.Formik, {
260
+ initialValues: defaultInfo,
261
+ validationSchema: schema,
262
+ onSubmit: function (values) {
263
+ try {
264
+ return Promise.resolve(_catch(function () {
265
+ return Promise.resolve(clickHandler()).then(function (clickHandlerRes) {
266
+ if (!clickHandlerRes) return;
267
+ values.captcha = clickHandlerRes;
268
+ });
269
+ }, function (err) {
270
+ console.error(err);
271
+ }));
272
+ } catch (e) {
273
+ return Promise.reject(e);
274
+ }
275
+ }
276
+ }, function (formikProps) {
277
+ var handleSubmit = formikProps.handleSubmit;
278
+ return React__default.createElement(reactstrap.Row, {
279
+ className: "" + styles["box-login"]
280
+ }, React__default.createElement(reactstrap.Col, {
281
+ className: "p-0 d-flex justify-content-center"
282
+ }, React__default.createElement(reactstrap.Form, {
283
+ className: "" + styles["block-login"],
284
+ onSubmit: handleSubmit
285
+ }, React__default.createElement("div", {
286
+ className: "" + styles["block-form"]
287
+ }, React__default.createElement("img", {
288
+ src: "/images/logo.jpeg",
289
+ className: "" + styles["img-login-rectangle"]
290
+ }), React__default.createElement(reactstrap.FormGroup, null, React__default.createElement(reactGoogleRecaptchaV3.GoogleReCaptcha, {
291
+ action: "login",
292
+ onVerify: handleVerify
293
+ })), React__default.createElement(reactstrap.Col, {
294
+ className: "p-0 mt-1 mb-4"
295
+ }, React__default.createElement(GoogleLogin__default, {
296
+ clientId: GOOGLE_CLIENT_ID,
297
+ buttonText: "Google \uACC4\uC815\uC73C\uB85C \uB85C\uADF8\uC778",
298
+ onSuccess: onSuccessGoogle,
299
+ onFailure: onFailureGoogle,
300
+ cookiePolicy: "single_host_origin",
301
+ className: "" + styles["btn-login-google"],
302
+ isSignedIn: true
303
+ }))))));
304
+ });
305
+ };
306
+
307
+ var defaultInfo = {
308
+ email: "",
309
+ password: "",
310
+ captcha: "",
311
+ rememberMe: false
312
+ };
313
+ var useLogin = function useLogin() {
314
+ var _useState = React.useState(false),
315
+ openLogin = _useState[0],
316
+ setOpenLogin = _useState[1];
317
+ var _useState2 = React.useState(),
318
+ infoUser = _useState2[0],
319
+ setInfoUser = _useState2[1];
320
+ var toggle = React.useCallback(function () {
321
+ setOpenLogin(!openLogin);
322
+ }, [openLogin]);
323
+ var _useState3 = React.useState(false),
324
+ isShowPassword = _useState3[0],
325
+ setIsShowPassword = _useState3[1];
326
+ React.useEffect(function () {
327
+ var start = function start() {
328
+ gapiScript.gapi.client.init({
329
+ clientId: GOOGLE_CLIENT_ID,
330
+ scope: 'email'
331
+ });
332
+ };
333
+ gapiScript.gapi.load('client:auth2', start);
334
+ }, []);
335
+ return {
336
+ defaultInfo: defaultInfo,
337
+ openLogin: openLogin,
338
+ toggle: toggle,
339
+ isShowPassword: isShowPassword,
340
+ setIsShowPassword: setIsShowPassword,
341
+ infoUser: infoUser,
342
+ setInfoUser: setInfoUser
343
+ };
344
+ };
345
+
346
+ var Login = function Login(_ref) {
347
+ var onNavigate = _ref.onNavigate,
348
+ isTeacher = _ref.isTeacher;
349
+ var _useLogin = useLogin(),
350
+ defaultInfo = _useLogin.defaultInfo;
351
+ return React__default.createElement("div", {
21
352
  className: styles["login"] + " container-fluid font-family-lato"
22
- }, React.createElement(reactstrap.Row, {
353
+ }, React__default.createElement(reactstrap.Row, {
23
354
  className: "h-100"
24
- }, React.createElement(reactstrap.Col, {
355
+ }, React__default.createElement(reactstrap.Col, {
25
356
  lg: 12,
26
357
  md: 12,
27
358
  xs: 12,
28
359
  className: "d-flex justify-content-center h-100 align-items-center"
29
- }, React.createElement("h1", null, "login 123"))));
360
+ }, React__default.createElement(reactGoogleRecaptchaV3.GoogleReCaptchaProvider, {
361
+ useRecaptchaNet: true,
362
+ reCaptchaKey: GOOGLE_RECAPTCHA_ID,
363
+ scriptProps: {
364
+ async: true,
365
+ defer: true,
366
+ appendTo: "body"
367
+ }
368
+ }, React__default.createElement(BlockLogin, {
369
+ defaultInfo: defaultInfo,
370
+ onNavigate: onNavigate,
371
+ isTeacher: isTeacher
372
+ })))));
373
+ };
374
+
375
+ var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
376
+
377
+ function unwrapExports (x) {
378
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
379
+ }
380
+
381
+ function createCommonjsModule(fn, module) {
382
+ return module = { exports: {} }, fn(module, module.exports), module.exports;
383
+ }
384
+
385
+ var reduxLogger = createCommonjsModule(function (module, exports) {
386
+ !function(e,t){t(exports);}(commonjsGlobal,function(e){function t(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}});}function r(e,t){Object.defineProperty(this,"kind",{value:e,enumerable:!0}),t&&t.length&&Object.defineProperty(this,"path",{value:t,enumerable:!0});}function n(e,t,r){n.super_.call(this,"E",e),Object.defineProperty(this,"lhs",{value:t,enumerable:!0}),Object.defineProperty(this,"rhs",{value:r,enumerable:!0});}function o(e,t){o.super_.call(this,"N",e),Object.defineProperty(this,"rhs",{value:t,enumerable:!0});}function i(e,t){i.super_.call(this,"D",e),Object.defineProperty(this,"lhs",{value:t,enumerable:!0});}function a(e,t,r){a.super_.call(this,"A",e),Object.defineProperty(this,"index",{value:t,enumerable:!0}),Object.defineProperty(this,"item",{value:r,enumerable:!0});}function f(e,t,r){var n=e.slice((r||t)+1||e.length);return e.length=t<0?e.length+t:t,e.push.apply(e,n),e}function u(e){var t="undefined"==typeof e?"undefined":N(e);return "object"!==t?t:e===Math?"math":null===e?"null":Array.isArray(e)?"array":"[object Date]"===Object.prototype.toString.call(e)?"date":"function"==typeof e.toString&&/^\/.*\//.test(e.toString())?"regexp":"object"}function l(e,t,r,c,s,d,p){s=s||[],p=p||[];var g=s.slice(0);if("undefined"!=typeof d){if(c){if("function"==typeof c&&c(g,d))return;if("object"===("undefined"==typeof c?"undefined":N(c))){if(c.prefilter&&c.prefilter(g,d))return;if(c.normalize){var h=c.normalize(g,d,e,t);h&&(e=h[0],t=h[1]);}}}g.push(d);}"regexp"===u(e)&&"regexp"===u(t)&&(e=e.toString(),t=t.toString());var y="undefined"==typeof e?"undefined":N(e),v="undefined"==typeof t?"undefined":N(t),b="undefined"!==y||p&&p[p.length-1].lhs&&p[p.length-1].lhs.hasOwnProperty(d),m="undefined"!==v||p&&p[p.length-1].rhs&&p[p.length-1].rhs.hasOwnProperty(d);if(!b&&m)r(new o(g,t));else if(!m&&b)r(new i(g,e));else if(u(e)!==u(t))r(new n(g,e,t));else if("date"===u(e)&&e-t!==0)r(new n(g,e,t));else if("object"===y&&null!==e&&null!==t)if(p.filter(function(t){return t.lhs===e}).length)e!==t&&r(new n(g,e,t));else {if(p.push({lhs:e,rhs:t}),Array.isArray(e)){var w;for(w=0;w<e.length;w++)w>=t.length?r(new a(g,w,new i(void 0,e[w]))):l(e[w],t[w],r,c,g,w,p);for(;w<t.length;)r(new a(g,w,new o(void 0,t[w++])));}else {var x=Object.keys(e),S=Object.keys(t);x.forEach(function(n,o){var i=S.indexOf(n);i>=0?(l(e[n],t[n],r,c,g,n,p),S=f(S,i)):l(e[n],void 0,r,c,g,n,p);}),S.forEach(function(e){l(void 0,t[e],r,c,g,e,p);});}p.length=p.length-1;}else e!==t&&("number"===y&&isNaN(e)&&isNaN(t)||r(new n(g,e,t)));}function c(e,t,r,n){return n=n||[],l(e,t,function(e){e&&n.push(e);},r),n.length?n:void 0}function s(e,t,r){if(r.path&&r.path.length){var n,o=e[t],i=r.path.length-1;for(n=0;n<i;n++)o=o[r.path[n]];switch(r.kind){case"A":s(o[r.path[n]],r.index,r.item);break;case"D":delete o[r.path[n]];break;case"E":case"N":o[r.path[n]]=r.rhs;}}else switch(r.kind){case"A":s(e[t],r.index,r.item);break;case"D":e=f(e,t);break;case"E":case"N":e[t]=r.rhs;}return e}function d(e,t,r){if(e&&t&&r&&r.kind){for(var n=e,o=-1,i=r.path?r.path.length-1:0;++o<i;)"undefined"==typeof n[r.path[o]]&&(n[r.path[o]]="number"==typeof r.path[o]?[]:{}),n=n[r.path[o]];switch(r.kind){case"A":s(r.path?n[r.path[o]]:n,r.index,r.item);break;case"D":delete n[r.path[o]];break;case"E":case"N":n[r.path[o]]=r.rhs;}}}function p(e,t,r){if(r.path&&r.path.length){var n,o=e[t],i=r.path.length-1;for(n=0;n<i;n++)o=o[r.path[n]];switch(r.kind){case"A":p(o[r.path[n]],r.index,r.item);break;case"D":o[r.path[n]]=r.lhs;break;case"E":o[r.path[n]]=r.lhs;break;case"N":delete o[r.path[n]];}}else switch(r.kind){case"A":p(e[t],r.index,r.item);break;case"D":e[t]=r.lhs;break;case"E":e[t]=r.lhs;break;case"N":e=f(e,t);}return e}function g(e,t,r){if(e&&t&&r&&r.kind){var n,o,i=e;for(o=r.path.length-1,n=0;n<o;n++)"undefined"==typeof i[r.path[n]]&&(i[r.path[n]]={}),i=i[r.path[n]];switch(r.kind){case"A":p(i[r.path[n]],r.index,r.item);break;case"D":i[r.path[n]]=r.lhs;break;case"E":i[r.path[n]]=r.lhs;break;case"N":delete i[r.path[n]];}}}function h(e,t,r){if(e&&t){var n=function(n){r&&!r(e,t,n)||d(e,t,n);};l(e,t,n);}}function y(e){return "color: "+F[e].color+"; font-weight: bold"}function v(e){var t=e.kind,r=e.path,n=e.lhs,o=e.rhs,i=e.index,a=e.item;switch(t){case"E":return [r.join("."),n,"→",o];case"N":return [r.join("."),o];case"D":return [r.join(".")];case"A":return [r.join(".")+"["+i+"]",a];default:return []}}function b(e,t,r,n){var o=c(e,t);try{n?r.groupCollapsed("diff"):r.group("diff");}catch(e){r.log("diff");}o?o.forEach(function(e){var t=e.kind,n=v(e);r.log.apply(r,["%c "+F[t].text,y(t)].concat(P(n)));}):r.log("—— no diff ——");try{r.groupEnd();}catch(e){r.log("—— diff end —— ");}}function m(e,t,r,n){switch("undefined"==typeof e?"undefined":N(e)){case"object":return "function"==typeof e[n]?e[n].apply(e,P(r)):e[n];case"function":return e(t);default:return e}}function w(e){var t=e.timestamp,r=e.duration;return function(e,n,o){var i=["action"];return i.push("%c"+String(e.type)),t&&i.push("%c@ "+n),r&&i.push("%c(in "+o.toFixed(2)+" ms)"),i.join(" ")}}function x(e,t){var r=t.logger,n=t.actionTransformer,o=t.titleFormatter,i=void 0===o?w(t):o,a=t.collapsed,f=t.colors,u=t.level,l=t.diff,c="undefined"==typeof t.titleFormatter;e.forEach(function(o,s){var d=o.started,p=o.startedTime,g=o.action,h=o.prevState,y=o.error,v=o.took,w=o.nextState,x=e[s+1];x&&(w=x.prevState,v=x.started-d);var S=n(g),k="function"==typeof a?a(function(){return w},g,o):a,j=D(p),E=f.title?"color: "+f.title(S)+";":"",A=["color: gray; font-weight: lighter;"];A.push(E),t.timestamp&&A.push("color: gray; font-weight: lighter;"),t.duration&&A.push("color: gray; font-weight: lighter;");var O=i(S,j,v);try{k?f.title&&c?r.groupCollapsed.apply(r,["%c "+O].concat(A)):r.groupCollapsed(O):f.title&&c?r.group.apply(r,["%c "+O].concat(A)):r.group(O);}catch(e){r.log(O);}var N=m(u,S,[h],"prevState"),P=m(u,S,[S],"action"),C=m(u,S,[y,h],"error"),F=m(u,S,[w],"nextState");if(N)if(f.prevState){var L="color: "+f.prevState(h)+"; font-weight: bold";r[N]("%c prev state",L,h);}else r[N]("prev state",h);if(P)if(f.action){var T="color: "+f.action(S)+"; font-weight: bold";r[P]("%c action ",T,S);}else r[P]("action ",S);if(y&&C)if(f.error){var M="color: "+f.error(y,h)+"; font-weight: bold;";r[C]("%c error ",M,y);}else r[C]("error ",y);if(F)if(f.nextState){var _="color: "+f.nextState(w)+"; font-weight: bold";r[F]("%c next state",_,w);}else r[F]("next state",w);l&&b(h,w,r,k);try{r.groupEnd();}catch(e){r.log("—— log end ——");}});}function S(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=Object.assign({},L,e),r=t.logger,n=t.stateTransformer,o=t.errorTransformer,i=t.predicate,a=t.logErrors,f=t.diffPredicate;if("undefined"==typeof r)return function(){return function(e){return function(t){return e(t)}}};if(e.getState&&e.dispatch)return console.error("[redux-logger] redux-logger not installed. Make sure to pass logger instance as middleware:\n// Logger with default options\nimport { logger } from 'redux-logger'\nconst store = createStore(\n reducer,\n applyMiddleware(logger)\n)\n// Or you can create your own logger with custom options http://bit.ly/redux-logger-options\nimport createLogger from 'redux-logger'\nconst logger = createLogger({\n // ...options\n});\nconst store = createStore(\n reducer,\n applyMiddleware(logger)\n)\n"),function(){return function(e){return function(t){return e(t)}}};var u=[];return function(e){var r=e.getState;return function(e){return function(l){if("function"==typeof i&&!i(r,l))return e(l);var c={};u.push(c),c.started=O.now(),c.startedTime=new Date,c.prevState=n(r()),c.action=l;var s=void 0;if(a)try{s=e(l);}catch(e){c.error=o(e);}else s=e(l);c.took=O.now()-c.started,c.nextState=n(r());var d=t.diff&&"function"==typeof f?f(r,l):t.diff;if(x(u,Object.assign({},t,{diff:d})),u.length=0,c.error)throw c.error;return s}}}}var k,j,E=function(e,t){return new Array(t+1).join(e)},A=function(e,t){return E("0",t-e.toString().length)+e},D=function(e){return A(e.getHours(),2)+":"+A(e.getMinutes(),2)+":"+A(e.getSeconds(),2)+"."+A(e.getMilliseconds(),3)},O="undefined"!=typeof performance&&null!==performance&&"function"==typeof performance.now?performance:Date,N="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},P=function(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t<e.length;t++)r[t]=e[t];return r}return Array.from(e)},C=[];k="object"===("undefined"==typeof commonjsGlobal?"undefined":N(commonjsGlobal))&&commonjsGlobal?commonjsGlobal:"undefined"!=typeof window?window:{},j=k.DeepDiff,j&&C.push(function(){"undefined"!=typeof j&&k.DeepDiff===c&&(k.DeepDiff=j,j=void 0);}),t(n,r),t(o,r),t(i,r),t(a,r),Object.defineProperties(c,{diff:{value:c,enumerable:!0},observableDiff:{value:l,enumerable:!0},applyDiff:{value:h,enumerable:!0},applyChange:{value:d,enumerable:!0},revertChange:{value:g,enumerable:!0},isConflict:{value:function(){return "undefined"!=typeof j},enumerable:!0},noConflict:{value:function(){return C&&(C.forEach(function(e){e();}),C=null),c},enumerable:!0}});var F={E:{color:"#2196F3",text:"CHANGED:"},N:{color:"#4CAF50",text:"ADDED:"},D:{color:"#F44336",text:"DELETED:"},A:{color:"#2196F3",text:"ARRAY:"}},L={level:"log",logger:console,logErrors:!0,collapsed:void 0,predicate:void 0,duration:!1,timestamp:!0,stateTransformer:function(e){return e},actionTransformer:function(e){return e},errorTransformer:function(e){return e},colors:{title:function(){return "inherit"},prevState:function(){return "#9E9E9E"},action:function(){return "#03A9F4"},nextState:function(){return "#4CAF50"},error:function(){return "#F20404"}},diff:!1,diffPredicate:void 0,transformer:void 0},T=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.dispatch,r=e.getState;return "function"==typeof t||"function"==typeof r?S()({dispatch:t,getState:r}):void console.error("\n[redux-logger v3] BREAKING CHANGE\n[redux-logger v3] Since 3.0.0 redux-logger exports by default logger with default settings.\n[redux-logger v3] Change\n[redux-logger v3] import createLogger from 'redux-logger'\n[redux-logger v3] to\n[redux-logger v3] import { createLogger } from 'redux-logger'\n")};e.defaults=L,e.createLogger=S,e.logger=T,e.default=T,Object.defineProperty(e,"__esModule",{value:!0});});
387
+ });
388
+
389
+ var logger = unwrapExports(reduxLogger);
390
+
391
+ // src/utils/formatProdErrorMessage.ts
392
+ function formatProdErrorMessage(code) {
393
+ return `Minified Redux error #${code}; visit https://redux.js.org/Errors?code=${code} for the full message or use the non-minified dev environment for full errors. `;
394
+ }
395
+
396
+ // src/utils/actionTypes.ts
397
+ var randomString = () => Math.random().toString(36).substring(7).split("").join(".");
398
+ var ActionTypes = {
399
+ INIT: `@@redux/INIT${/* @__PURE__ */ randomString()}`,
400
+ REPLACE: `@@redux/REPLACE${/* @__PURE__ */ randomString()}`,
401
+ PROBE_UNKNOWN_ACTION: () => `@@redux/PROBE_UNKNOWN_ACTION${randomString()}`
30
402
  };
403
+ var actionTypes_default = ActionTypes;
404
+
405
+ // src/utils/isPlainObject.ts
406
+ function isPlainObject(obj) {
407
+ if (typeof obj !== "object" || obj === null)
408
+ return false;
409
+ let proto = obj;
410
+ while (Object.getPrototypeOf(proto) !== null) {
411
+ proto = Object.getPrototypeOf(proto);
412
+ }
413
+ return Object.getPrototypeOf(obj) === proto || Object.getPrototypeOf(obj) === null;
414
+ }
415
+
416
+ // src/utils/kindOf.ts
417
+ function miniKindOf(val) {
418
+ if (val === void 0)
419
+ return "undefined";
420
+ if (val === null)
421
+ return "null";
422
+ const type = typeof val;
423
+ switch (type) {
424
+ case "boolean":
425
+ case "string":
426
+ case "number":
427
+ case "symbol":
428
+ case "function": {
429
+ return type;
430
+ }
431
+ }
432
+ if (Array.isArray(val))
433
+ return "array";
434
+ if (isDate(val))
435
+ return "date";
436
+ if (isError(val))
437
+ return "error";
438
+ const constructorName = ctorName(val);
439
+ switch (constructorName) {
440
+ case "Symbol":
441
+ case "Promise":
442
+ case "WeakMap":
443
+ case "WeakSet":
444
+ case "Map":
445
+ case "Set":
446
+ return constructorName;
447
+ }
448
+ return Object.prototype.toString.call(val).slice(8, -1).toLowerCase().replace(/\s/g, "");
449
+ }
450
+ function ctorName(val) {
451
+ return typeof val.constructor === "function" ? val.constructor.name : null;
452
+ }
453
+ function isError(val) {
454
+ return val instanceof Error || typeof val.message === "string" && val.constructor && typeof val.constructor.stackTraceLimit === "number";
455
+ }
456
+ function isDate(val) {
457
+ if (val instanceof Date)
458
+ return true;
459
+ return typeof val.toDateString === "function" && typeof val.getDate === "function" && typeof val.setDate === "function";
460
+ }
461
+ function kindOf(val) {
462
+ let typeOfVal = typeof val;
463
+ if (process.env.NODE_ENV !== "production") {
464
+ typeOfVal = miniKindOf(val);
465
+ }
466
+ return typeOfVal;
467
+ }
468
+
469
+ // src/utils/warning.ts
470
+ function warning(message) {
471
+ if (typeof console !== "undefined" && typeof console.error === "function") {
472
+ console.error(message);
473
+ }
474
+ try {
475
+ throw new Error(message);
476
+ } catch (e) {
477
+ }
478
+ }
479
+
480
+ // src/combineReducers.ts
481
+ function getUnexpectedStateShapeWarningMessage(inputState, reducers, action, unexpectedKeyCache) {
482
+ const reducerKeys = Object.keys(reducers);
483
+ const argumentName = action && action.type === actionTypes_default.INIT ? "preloadedState argument passed to createStore" : "previous state received by the reducer";
484
+ if (reducerKeys.length === 0) {
485
+ return "Store does not have a valid reducer. Make sure the argument passed to combineReducers is an object whose values are reducers.";
486
+ }
487
+ if (!isPlainObject(inputState)) {
488
+ return `The ${argumentName} has unexpected type of "${kindOf(inputState)}". Expected argument to be an object with the following keys: "${reducerKeys.join('", "')}"`;
489
+ }
490
+ const unexpectedKeys = Object.keys(inputState).filter((key) => !reducers.hasOwnProperty(key) && !unexpectedKeyCache[key]);
491
+ unexpectedKeys.forEach((key) => {
492
+ unexpectedKeyCache[key] = true;
493
+ });
494
+ if (action && action.type === actionTypes_default.REPLACE)
495
+ return;
496
+ if (unexpectedKeys.length > 0) {
497
+ return `Unexpected ${unexpectedKeys.length > 1 ? "keys" : "key"} "${unexpectedKeys.join('", "')}" found in ${argumentName}. Expected to find one of the known reducer keys instead: "${reducerKeys.join('", "')}". Unexpected keys will be ignored.`;
498
+ }
499
+ }
500
+ function assertReducerShape(reducers) {
501
+ Object.keys(reducers).forEach((key) => {
502
+ const reducer = reducers[key];
503
+ const initialState = reducer(void 0, {
504
+ type: actionTypes_default.INIT
505
+ });
506
+ if (typeof initialState === "undefined") {
507
+ throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(12) : `The slice reducer for key "${key}" returned undefined during initialization. If the state passed to the reducer is undefined, you must explicitly return the initial state. The initial state may not be undefined. If you don't want to set a value for this reducer, you can use null instead of undefined.`);
508
+ }
509
+ if (typeof reducer(void 0, {
510
+ type: actionTypes_default.PROBE_UNKNOWN_ACTION()
511
+ }) === "undefined") {
512
+ throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(13) : `The slice reducer for key "${key}" returned undefined when probed with a random type. Don't try to handle '${actionTypes_default.INIT}' or other actions in "redux/*" namespace. They are considered private. Instead, you must return the current state for any unknown actions, unless it is undefined, in which case you must return the initial state, regardless of the action type. The initial state may not be undefined, but can be null.`);
513
+ }
514
+ });
515
+ }
516
+ function combineReducers(reducers) {
517
+ const reducerKeys = Object.keys(reducers);
518
+ const finalReducers = {};
519
+ for (let i = 0; i < reducerKeys.length; i++) {
520
+ const key = reducerKeys[i];
521
+ if (process.env.NODE_ENV !== "production") {
522
+ if (typeof reducers[key] === "undefined") {
523
+ warning(`No reducer provided for key "${key}"`);
524
+ }
525
+ }
526
+ if (typeof reducers[key] === "function") {
527
+ finalReducers[key] = reducers[key];
528
+ }
529
+ }
530
+ const finalReducerKeys = Object.keys(finalReducers);
531
+ let unexpectedKeyCache;
532
+ if (process.env.NODE_ENV !== "production") {
533
+ unexpectedKeyCache = {};
534
+ }
535
+ let shapeAssertionError;
536
+ try {
537
+ assertReducerShape(finalReducers);
538
+ } catch (e) {
539
+ shapeAssertionError = e;
540
+ }
541
+ return function combination(state = {}, action) {
542
+ if (shapeAssertionError) {
543
+ throw shapeAssertionError;
544
+ }
545
+ if (process.env.NODE_ENV !== "production") {
546
+ const warningMessage = getUnexpectedStateShapeWarningMessage(state, finalReducers, action, unexpectedKeyCache);
547
+ if (warningMessage) {
548
+ warning(warningMessage);
549
+ }
550
+ }
551
+ let hasChanged = false;
552
+ const nextState = {};
553
+ for (let i = 0; i < finalReducerKeys.length; i++) {
554
+ const key = finalReducerKeys[i];
555
+ const reducer = finalReducers[key];
556
+ const previousStateForKey = state[key];
557
+ const nextStateForKey = reducer(previousStateForKey, action);
558
+ if (typeof nextStateForKey === "undefined") {
559
+ const actionType = action && action.type;
560
+ throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(14) : `When called with an action of type ${actionType ? `"${String(actionType)}"` : "(unknown type)"}, the slice reducer for key "${key}" returned undefined. To ignore an action, you must explicitly return the previous state. If you want this reducer to hold no value, you can return null instead of undefined.`);
561
+ }
562
+ nextState[key] = nextStateForKey;
563
+ hasChanged = hasChanged || nextStateForKey !== previousStateForKey;
564
+ }
565
+ hasChanged = hasChanged || finalReducerKeys.length !== Object.keys(state).length;
566
+ return hasChanged ? nextState : state;
567
+ };
568
+ }
569
+
570
+ var initialState = {
571
+ isLoading: false,
572
+ alert: {
573
+ type: "",
574
+ message: ""
575
+ },
576
+ user: null
577
+ };
578
+ var commonReducer = toolkit.createReducer(initialState, function (builder) {
579
+ builder.addCase(setLoading, function (state, action) {
580
+ state.isLoading = action.payload;
581
+ }).addCase(setAlert, function (state, action) {
582
+ state.alert = action.payload;
583
+ }).addCase(setUser, function (state, action) {
584
+ state.user = action.payload;
585
+ }).addCase(setLanguage, function (state, action) {
586
+ state.language = action.payload;
587
+ });
588
+ });
589
+
590
+ var rootReducer = combineReducers({
591
+ common: commonReducer
592
+ });
593
+
594
+ var store = toolkit.configureStore({
595
+ reducer: rootReducer,
596
+ middleware: function middleware(getDefaultMiddleware) {
597
+ return getDefaultMiddleware({
598
+ serializableCheck: false
599
+ }).concat(logger);
600
+ }
601
+ });
602
+
603
+ var TITLE = "Not found";
604
+ var NotFound = function NotFound() {
605
+ React.useEffect(function () {
606
+ document.title = TITLE;
607
+ });
608
+ return React__default.createElement("div", {
609
+ className: "not-found"
610
+ }, React__default.createElement("div", {
611
+ className: "clearfix"
612
+ }, React__default.createElement("h1", {
613
+ className: "float-left display-3 mr-4"
614
+ }, "404"), React__default.createElement("div", {
615
+ className: "float-left"
616
+ }, React__default.createElement("h4", {
617
+ className: "pt-3"
618
+ }, "Oops! You are lost."), React__default.createElement("p", {
619
+ className: "text-muted mb-2"
620
+ }, "The page you are looking for was not found."), React__default.createElement("div", null))));
621
+ };
622
+
623
+ var loadingStyle = {
624
+ minWidth: "100vw",
625
+ minHeight: "100vh",
626
+ position: "fixed",
627
+ top: 0,
628
+ left: 0,
629
+ zIndex: 999999999,
630
+ backgroundColor: "rgba(0, 0, 0, 0.4)",
631
+ display: "flex",
632
+ justifyContent: "center",
633
+ alignItems: "center"
634
+ };
635
+ var Loading = function Loading() {
636
+ var isLoading = reactRedux.useSelector(function (state) {
637
+ return state.common.isLoading;
638
+ });
639
+ localStorage.setItem("LAST_TIME_REQUETST", moment().utc().format("YYYY-MM-DD HH:mm:ss"));
640
+ return isLoading ? React__default.createElement("div", {
641
+ style: loadingStyle
642
+ }, React__default.createElement("div", {
643
+ className: "spinner-border text-secondary",
644
+ role: "status"
645
+ }, React__default.createElement("span", {
646
+ className: "sr-only"
647
+ }))) : null;
648
+ };
649
+
650
+ var encodeParams$1 = (function (params) {
651
+ return Object.keys(params).filter(function (key) {
652
+ return params[key] || params[key] === 0 || params[key] === false;
653
+ }).map(function (key) {
654
+ if (Array.isArray(params[key])) {
655
+ return params[key].map(function (i) {
656
+ return encodeURIComponent(key) + "=" + encodeURIComponent(i);
657
+ }).join('&');
658
+ }
659
+ return encodeURIComponent(key) + "=" + encodeURIComponent(params[key]);
660
+ }).join('&');
661
+ });
662
+
663
+ var getAccessToken$1 = (function () {
664
+ try {
665
+ return localStorage.getItem(ACCESS_TOKEN);
666
+ } catch (err) {
667
+ return null;
668
+ }
669
+ });
670
+
671
+ var api$1 = axios.create({
672
+ baseURL: BASE_URL,
673
+ timeout: 0,
674
+ headers: {
675
+ "Content-Type": "application/json"
676
+ },
677
+ paramsSerializer: function paramsSerializer(params) {
678
+ return encodeParams$1(params);
679
+ }
680
+ });
681
+ var apiUpload$1 = axios.create({
682
+ baseURL: BASE_URL,
683
+ timeout: 60000,
684
+ headers: {
685
+ "Content-Type": "multipart/form-data"
686
+ }
687
+ });
688
+ [api$1, apiUpload$1].forEach(function (i) {
689
+ return i.interceptors.request.use(function (config) {
690
+ var token = getAccessToken$1();
691
+ if (token) {
692
+ config.headers.Authorization = "Bearer " + token;
693
+ }
694
+ return config;
695
+ }, function (error) {
696
+ return Promise.reject(error);
697
+ });
698
+ });
699
+ [api$1, apiUpload$1].forEach(function (i) {
700
+ return i.interceptors.response.use(function (response) {
701
+ return response;
702
+ }, function (error) {
703
+ if (error.response.status === 401) {
704
+ window.location.href = "/login";
705
+ }
706
+ if (error.response.status == 403) {
707
+ localStorage.removeItem(ACCESS_TOKEN);
708
+ localStorage.removeItem("USER_EMAIL");
709
+ window.location.href = "/login";
710
+ }
711
+ return Promise.reject(error);
712
+ });
713
+ });
714
+
715
+ var AUTH_URL = BASE_URL + "/api/auth";
716
+ var getInfo = function getInfo() {
717
+ return api$1.get(AUTH_URL + "/info");
718
+ };
719
+
720
+ var LayoutContext = function LayoutContext(_ref) {
721
+ var children = _ref.children,
722
+ onNavigate = _ref.onNavigate;
723
+ var _useGoogleSignOut = useGoogleSignOut({}),
724
+ signOut = _useGoogleSignOut.signOut;
725
+ var dispatch = reactRedux.useDispatch();
726
+ var resetAuth = function resetAuth() {
727
+ localStorage.removeItem(ACCESS_TOKEN);
728
+ signOut();
729
+ onNavigate("/login");
730
+ };
731
+ var loadInfo = function loadInfo() {
732
+ try {
733
+ var _temp2 = function _temp2() {
734
+ dispatch(setLoading(false));
735
+ };
736
+ var token = getAccessToken();
737
+ if (!token) {
738
+ resetAuth();
739
+ return Promise.resolve();
740
+ }
741
+ dispatch(setLoading(true));
742
+ var _temp = _catch(function () {
743
+ return Promise.resolve(getInfo()).then(function (info) {
744
+ if (!info) {
745
+ resetAuth();
746
+ }
747
+ dispatch(setUser(info.data));
748
+ });
749
+ }, function () {
750
+ resetAuth();
751
+ });
752
+ return Promise.resolve(_temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp));
753
+ } catch (e) {
754
+ return Promise.reject(e);
755
+ }
756
+ };
757
+ React.useEffect(function () {
758
+ loadInfo();
759
+ }, []);
760
+ return React__default.createElement(React.Fragment, null, children);
761
+ };
762
+
763
+ var ConfirmDialog = function ConfirmDialog(_ref) {
764
+ var open = _ref.open,
765
+ text = _ref.text,
766
+ _ref$cancelText = _ref.cancelText,
767
+ cancelText = _ref$cancelText === void 0 ? "No" : _ref$cancelText,
768
+ _ref$okText = _ref.okText,
769
+ okText = _ref$okText === void 0 ? "Yes" : _ref$okText,
770
+ isDelete = _ref.isDelete,
771
+ _ref$title = _ref.title,
772
+ title = _ref$title === void 0 ? "Confirmation" : _ref$title,
773
+ toggle = _ref.toggle,
774
+ onConfirm = _ref.onConfirm;
775
+ return React__default.createElement(reactstrap.Modal, {
776
+ isOpen: open,
777
+ toggle: toggle,
778
+ centered: true
779
+ }, React__default.createElement(reactstrap.ModalHeader, {
780
+ toggle: toggle
781
+ }, title), React__default.createElement(reactstrap.ModalBody, null, text), React__default.createElement(reactstrap.ModalFooter, null, React__default.createElement(reactstrap.Button, {
782
+ color: "secondary",
783
+ onClick: toggle
784
+ }, cancelText), React__default.createElement(reactstrap.Button, {
785
+ color: isDelete ? "danger" : "primary",
786
+ onClick: onConfirm
787
+ }, okText)));
788
+ };
789
+
790
+ var CommonDialog = function CommonDialog(_ref) {
791
+ var open = _ref.open,
792
+ children = _ref.children,
793
+ centered = _ref.centered,
794
+ title = _ref.title,
795
+ _ref$size = _ref.size,
796
+ size = _ref$size === void 0 ? "xs" : _ref$size,
797
+ onClose = _ref.onClose,
798
+ backdrop = _ref.backdrop;
799
+ return React__default.createElement(reactstrap.Modal, {
800
+ backdrop: backdrop,
801
+ isOpen: open,
802
+ toggle: onClose,
803
+ centered: centered,
804
+ size: size
805
+ }, React__default.createElement(reactstrap.ModalHeader, {
806
+ toggle: onClose
807
+ }, title), children);
808
+ };
809
+
810
+ var CommonAlert = function CommonAlert() {
811
+ var _alert$message2;
812
+ var dispatch = reactRedux.useDispatch();
813
+ var alert = reactRedux.useSelector(function (state) {
814
+ return state.common.alert;
815
+ });
816
+ var timeout = React.useRef();
817
+ var onDismiss = function onDismiss() {
818
+ dispatch(setAlert({
819
+ message: ""
820
+ }));
821
+ timeout && timeout.current && clearTimeout(timeout.current);
822
+ };
823
+ React.useEffect(function () {
824
+ var _alert$message;
825
+ if (!!((_alert$message = alert.message) !== null && _alert$message !== void 0 && _alert$message.length)) {
826
+ timeout && timeout.current && clearTimeout(timeout.current);
827
+ timeout.current = setTimeout(function () {
828
+ dispatch(setAlert({
829
+ message: ""
830
+ }));
831
+ }, 3000);
832
+ }
833
+ }, [alert]);
834
+ return ((_alert$message2 = alert.message) === null || _alert$message2 === void 0 ? void 0 : _alert$message2.length) > 0 ? React__default.createElement("div", {
835
+ className: "app-alert"
836
+ }, React__default.createElement(reactstrap.Alert, {
837
+ color: alert.type,
838
+ isOpen: alert.message.length > 0,
839
+ toggle: onDismiss
840
+ }, alert.message)) : null;
841
+ };
842
+
843
+ var formatTime = (function (time, ORIGINAL_FORMAT, FORMAT) {
844
+ if (time === DATE_MIN_VALUE) return "";
845
+ try {
846
+ return moment(time, ORIGINAL_FORMAT).format(FORMAT || "yyyy-MM-DD");
847
+ } catch (_unused) {
848
+ return "";
849
+ }
850
+ });
851
+
852
+ var diffFromNow = (function (time, unitOfTime, targetTime) {
853
+ if (time === DATE_MIN_VALUE || targetTime === DATE_MIN_VALUE) return 0;
854
+ try {
855
+ var now = !!targetTime ? moment() : moment.utc(targetTime).local();
856
+ return now.diff(moment.utc(time).local(), unitOfTime);
857
+ } catch (_unused) {
858
+ return "";
859
+ }
860
+ });
861
+
862
+ var CustomPagination = function CustomPagination(_ref) {
863
+ var currentPage = _ref.currentPage,
864
+ totalPage = _ref.totalPage,
865
+ onChangePage = _ref.onChangePage;
866
+ return React__default.createElement(reactstrap.Pagination, {
867
+ className: "w-fit"
868
+ }, React__default.createElement(reactstrap.PaginationItem, {
869
+ disabled: currentPage <= 1
870
+ }, React__default.createElement(reactstrap.PaginationLink, {
871
+ onClick: function onClick(e) {
872
+ e.preventDefault();
873
+ onChangePage(currentPage - 1);
874
+ },
875
+ previous: true,
876
+ href: "#"
877
+ })), React__default.createElement(reactstrap.PaginationItem, {
878
+ active: 1 === currentPage,
879
+ key: 1
880
+ }, React__default.createElement(reactstrap.PaginationLink, {
881
+ onClick: function onClick(e) {
882
+ e.preventDefault();
883
+ onChangePage(1);
884
+ },
885
+ href: "#"
886
+ }, 1)), totalPage > 2 && React__default.createElement(reactstrap.PaginationItem, {
887
+ active: 2 === currentPage,
888
+ key: 1
889
+ }, React__default.createElement(reactstrap.PaginationLink, {
890
+ onClick: function onClick(e) {
891
+ e.preventDefault();
892
+ onChangePage(2);
893
+ },
894
+ href: "#"
895
+ }, 2)), currentPage > 4 && currentPage !== totalPage && totalPage !== 5 && React__default.createElement(reactstrap.PaginationItem, {
896
+ disabled: true,
897
+ key: "first"
898
+ }, React__default.createElement(reactstrap.PaginationLink, {
899
+ href: "#"
900
+ }, "...")), (currentPage === 1 || currentPage === totalPage) && totalPage === 5 && React__default.createElement(reactstrap.PaginationItem, {
901
+ key: 3
902
+ }, React__default.createElement(reactstrap.PaginationLink, {
903
+ onClick: function onClick(e) {
904
+ e.preventDefault();
905
+ onChangePage(3);
906
+ },
907
+ href: "#"
908
+ }, "3")), [currentPage - 1, currentPage, currentPage + 1].filter(function (page) {
909
+ return page > 2 && page < totalPage - 1;
910
+ }).map(function (page) {
911
+ return React__default.createElement(reactstrap.PaginationItem, {
912
+ active: page === currentPage,
913
+ key: page
914
+ }, React__default.createElement(reactstrap.PaginationLink, {
915
+ onClick: function onClick(e) {
916
+ e.preventDefault();
917
+ onChangePage(page);
918
+ },
919
+ href: "#"
920
+ }, page));
921
+ }), totalPage - currentPage > 4 && React__default.createElement(reactstrap.PaginationItem, {
922
+ disabled: true,
923
+ key: "last"
924
+ }, React__default.createElement(reactstrap.PaginationLink, {
925
+ href: "#"
926
+ }, "...")), totalPage > 3 && React__default.createElement(reactstrap.PaginationItem, {
927
+ active: totalPage - 1 === currentPage,
928
+ key: totalPage - 1
929
+ }, React__default.createElement(reactstrap.PaginationLink, {
930
+ onClick: function onClick(e) {
931
+ e.preventDefault();
932
+ onChangePage(totalPage - 1);
933
+ },
934
+ href: "#"
935
+ }, totalPage - 1)), totalPage > 1 && React__default.createElement(reactstrap.PaginationItem, {
936
+ active: totalPage === currentPage,
937
+ key: totalPage
938
+ }, React__default.createElement(reactstrap.PaginationLink, {
939
+ onClick: function onClick(e) {
940
+ e.preventDefault();
941
+ onChangePage(totalPage);
942
+ },
943
+ href: "#"
944
+ }, totalPage)), React__default.createElement(reactstrap.PaginationItem, {
945
+ disabled: currentPage >= totalPage
946
+ }, React__default.createElement(reactstrap.PaginationLink, {
947
+ onClick: function onClick(e) {
948
+ e.preventDefault();
949
+ onChangePage(currentPage + 1);
950
+ },
951
+ next: true,
952
+ href: "#"
953
+ })));
954
+ };
955
+
956
+ (function (ExamEvent) {
957
+ ExamEvent["StartExam"] = "start-exam";
958
+ ExamEvent["TerminateExam"] = "terminate-exam";
959
+ ExamEvent["JoinExam"] = "join-exam";
960
+ ExamEvent["AddExtraDuration"] = "add-extra-duration-exam";
961
+ ExamEvent["TeacherDisconnectChannel"] = "teacher-disconnect-channel";
962
+ ExamEvent["StudentDisconnectChannel"] = "student-disconnect-channel";
963
+ })(exports.ExamEvent || (exports.ExamEvent = {}));
964
+
965
+ var problem_solving = "문제풀기";
966
+ var my_story = "내 스토리";
967
+ var search_find = "검색하여 찾기";
968
+ var test_code = "시험코드 입력";
969
+ var login_success = "로그인 성공";
970
+ var welcome_success = "스터디 터치에 오신 것을 환영합니다!";
971
+ var description_success = "스터디 터치는 엄태욱 선생님의 수업에서 활용되는 학습 도구입니다.";
972
+ var logout = "로그 아웃";
973
+ var overall_status = "전체 현황";
974
+ var exam_status = "시험별 현";
975
+ var user_manager = "사용자 목록";
976
+ var recent_exam_results = "최근 시험 결과";
977
+ var instructor_name = "강사이름";
978
+ var academy_name = "학원 이름";
979
+ var total_students = "총 학생수";
980
+ var student = "명";
981
+ var students = "명";
982
+ var extra_time = "추가 시간";
983
+ var complete = "완료";
984
+ var current_exam = "현재 시험중";
985
+ var exam_time = "시험 시간";
986
+ var time_remaining = "남은 시간";
987
+ var number_results = "결과 {{number}}건";
988
+ var number_result = "결과 {{number}}건";
989
+ var mins_mins_seconds_seconds = "{{mins}}분 {{seconds}}초";
990
+ var mins_mins = "{{mins}}분";
991
+ var class_name = "반 이름";
992
+ var create_new_exam = "새 시험 생성";
993
+ var there_are_no_recent_exams = "최근 시험이 없습니다";
994
+ var you_have_created_a_exam_with_code_code_do_you_want_to_continue = "코드가 {{code}}인 시험을 생성했습니다. 계속하시겠습니까?";
995
+ var here = "여기";
996
+ var do_you_want_to_complete_the_exam = "시험을 완료처리 하시겠습니까?";
997
+ var are_you_sure_you_want_to_delete_the_exam = "시험을 삭제하시겠습니까?";
998
+ var yes = "예";
999
+ var no = "아니요";
1000
+ var cancel = "취소";
1001
+ var confirmation = "확인";
1002
+ var student_name = "학생이름";
1003
+ var full_pool_time = "전체풀이시간";
1004
+ var number_question = "{{number}}번";
1005
+ var answer_rate = "정답률";
1006
+ var seconds = "초";
1007
+ var search_placeholder = "시험 이름으로 검색하기";
1008
+ var study_touch = "영어연구소";
1009
+ var exam_information = "시험정보";
1010
+ var issue_number = "문제번호";
1011
+ var incorrect_rate = "오답률";
1012
+ var question_time_for_each_student = "학생별 문항 시간";
1013
+ var correct_answer_for_each_student = "학생별 정답 여부";
1014
+ var information_by_question = "문항별 정보";
1015
+ var no_data = "데이터 없음";
1016
+ var internet_connection_was_lost = "인터넷 연결이 끊어졌습니다";
1017
+ var problem = "문제";
1018
+ var problem_solving_time = "문제풀이 시간";
1019
+ var lang_ko = {
1020
+ problem_solving: problem_solving,
1021
+ my_story: my_story,
1022
+ search_find: search_find,
1023
+ test_code: test_code,
1024
+ login_success: login_success,
1025
+ welcome_success: welcome_success,
1026
+ description_success: description_success,
1027
+ logout: logout,
1028
+ overall_status: overall_status,
1029
+ exam_status: exam_status,
1030
+ user_manager: user_manager,
1031
+ recent_exam_results: recent_exam_results,
1032
+ instructor_name: instructor_name,
1033
+ academy_name: academy_name,
1034
+ total_students: total_students,
1035
+ student: student,
1036
+ students: students,
1037
+ extra_time: extra_time,
1038
+ complete: complete,
1039
+ current_exam: current_exam,
1040
+ exam_time: exam_time,
1041
+ time_remaining: time_remaining,
1042
+ number_results: number_results,
1043
+ number_result: number_result,
1044
+ mins_mins_seconds_seconds: mins_mins_seconds_seconds,
1045
+ mins_mins: mins_mins,
1046
+ class_name: class_name,
1047
+ create_new_exam: create_new_exam,
1048
+ there_are_no_recent_exams: there_are_no_recent_exams,
1049
+ you_have_created_a_exam_with_code_code_do_you_want_to_continue: you_have_created_a_exam_with_code_code_do_you_want_to_continue,
1050
+ here: here,
1051
+ do_you_want_to_complete_the_exam: do_you_want_to_complete_the_exam,
1052
+ are_you_sure_you_want_to_delete_the_exam: are_you_sure_you_want_to_delete_the_exam,
1053
+ yes: yes,
1054
+ no: no,
1055
+ cancel: cancel,
1056
+ confirmation: confirmation,
1057
+ student_name: student_name,
1058
+ full_pool_time: full_pool_time,
1059
+ number_question: number_question,
1060
+ answer_rate: answer_rate,
1061
+ seconds: seconds,
1062
+ search_placeholder: search_placeholder,
1063
+ study_touch: study_touch,
1064
+ exam_information: exam_information,
1065
+ issue_number: issue_number,
1066
+ incorrect_rate: incorrect_rate,
1067
+ question_time_for_each_student: question_time_for_each_student,
1068
+ correct_answer_for_each_student: correct_answer_for_each_student,
1069
+ information_by_question: information_by_question,
1070
+ no_data: no_data,
1071
+ internet_connection_was_lost: internet_connection_was_lost,
1072
+ problem: problem,
1073
+ problem_solving_time: problem_solving_time
1074
+ };
1075
+
1076
+ var problem_solving$1 = "Problem Solving";
1077
+ var my_story$1 = "My Story";
1078
+ var search_find$1 = "Search and find";
1079
+ var test_code$1 = "Enter test code";
1080
+ var login_success$1 = "Login Success";
1081
+ var welcome_success$1 = "Welcome to Study Touch!";
1082
+ var description_success$1 = "Study Touch is a learning tool used in teacher Taewook Eom's classes.";
1083
+ var logout$1 = "Logout";
1084
+ var overall_status$1 = "Overall Status";
1085
+ var exam_status$1 = "Exam Status";
1086
+ var user_manager$1 = "User Manager";
1087
+ var recent_exam_results$1 = "Recent exam";
1088
+ var instructor_name$1 = "Instructor name";
1089
+ var academy_name$1 = "Academy name";
1090
+ var total_students$1 = "Total students";
1091
+ var students$1 = "Students";
1092
+ var student$1 = "Student";
1093
+ var extra_time$1 = "Extra time";
1094
+ var complete$1 = "Complete";
1095
+ var current_exam$1 = "Current exam";
1096
+ var exam_time$1 = "Extra time";
1097
+ var time_remaining$1 = "Time remaining";
1098
+ var number_results$1 = "{{number}} Results";
1099
+ var number_result$1 = "{{number}} Result";
1100
+ var mins_mins_seconds_seconds$1 = "{{mins}}m {{seconds}}s";
1101
+ var mins_mins$1 = "{{mins}}m";
1102
+ var class_name$1 = "Class name";
1103
+ var create_new_exam$1 = "Create exam";
1104
+ var there_are_no_recent_exams$1 = "There are no recent exams";
1105
+ var you_have_created_a_exam_with_code_code_do_you_want_to_continue$1 = "You have created a exam with code {{code}}, do you want to continue?";
1106
+ var here$1 = "here";
1107
+ var do_you_want_to_complete_the_exam$1 = "Do you want to complete the exam?";
1108
+ var are_you_sure_you_want_to_delete_the_exam$1 = "Are you sure you want to delete the exam?";
1109
+ var yes$1 = "Yes";
1110
+ var no$1 = "No";
1111
+ var cancel$1 = "Cancel";
1112
+ var confirmation$1 = "Confirmation";
1113
+ var student_name$1 = "Student name";
1114
+ var full_pool_time$1 = "Full pool time";
1115
+ var number_question$1 = "No.{{number}}";
1116
+ var answer_rate$1 = "Answer rate";
1117
+ var seconds$1 = "s";
1118
+ var search_placeholder$1 = "Search by exam name";
1119
+ var study_touch$1 = "Study touch";
1120
+ var exam_information$1 = "Exam information";
1121
+ var issue_number$1 = "Issue number";
1122
+ var incorrect_rate$1 = "Incorrect rate";
1123
+ var question_time_for_each_student$1 = "Question time for each student";
1124
+ var correct_answer_for_each_student$1 = "Correct answer for each student";
1125
+ var information_by_question$1 = "Information by question";
1126
+ var no_data$1 = "No data";
1127
+ var internet_connection_was_lost$1 = "Internet connection was lost";
1128
+ var problem$1 = "Problem ";
1129
+ var problem_solving_time$1 = "Problem solving time";
1130
+ var lang_en = {
1131
+ problem_solving: problem_solving$1,
1132
+ my_story: my_story$1,
1133
+ search_find: search_find$1,
1134
+ test_code: test_code$1,
1135
+ login_success: login_success$1,
1136
+ welcome_success: welcome_success$1,
1137
+ description_success: description_success$1,
1138
+ logout: logout$1,
1139
+ overall_status: overall_status$1,
1140
+ exam_status: exam_status$1,
1141
+ user_manager: user_manager$1,
1142
+ recent_exam_results: recent_exam_results$1,
1143
+ instructor_name: instructor_name$1,
1144
+ academy_name: academy_name$1,
1145
+ total_students: total_students$1,
1146
+ students: students$1,
1147
+ student: student$1,
1148
+ extra_time: extra_time$1,
1149
+ complete: complete$1,
1150
+ current_exam: current_exam$1,
1151
+ exam_time: exam_time$1,
1152
+ time_remaining: time_remaining$1,
1153
+ number_results: number_results$1,
1154
+ number_result: number_result$1,
1155
+ mins_mins_seconds_seconds: mins_mins_seconds_seconds$1,
1156
+ mins_mins: mins_mins$1,
1157
+ class_name: class_name$1,
1158
+ create_new_exam: create_new_exam$1,
1159
+ there_are_no_recent_exams: there_are_no_recent_exams$1,
1160
+ you_have_created_a_exam_with_code_code_do_you_want_to_continue: you_have_created_a_exam_with_code_code_do_you_want_to_continue$1,
1161
+ here: here$1,
1162
+ do_you_want_to_complete_the_exam: do_you_want_to_complete_the_exam$1,
1163
+ are_you_sure_you_want_to_delete_the_exam: are_you_sure_you_want_to_delete_the_exam$1,
1164
+ yes: yes$1,
1165
+ no: no$1,
1166
+ cancel: cancel$1,
1167
+ confirmation: confirmation$1,
1168
+ student_name: student_name$1,
1169
+ full_pool_time: full_pool_time$1,
1170
+ number_question: number_question$1,
1171
+ answer_rate: answer_rate$1,
1172
+ seconds: seconds$1,
1173
+ search_placeholder: search_placeholder$1,
1174
+ study_touch: study_touch$1,
1175
+ exam_information: exam_information$1,
1176
+ issue_number: issue_number$1,
1177
+ incorrect_rate: incorrect_rate$1,
1178
+ question_time_for_each_student: question_time_for_each_student$1,
1179
+ correct_answer_for_each_student: correct_answer_for_each_student$1,
1180
+ information_by_question: information_by_question$1,
1181
+ no_data: no_data$1,
1182
+ internet_connection_was_lost: internet_connection_was_lost$1,
1183
+ problem: problem$1,
1184
+ problem_solving_time: problem_solving_time$1
1185
+ };
1186
+
1187
+ i18n.use(reactI18next.initReactI18next).init({
1188
+ lng: "ko",
1189
+ fallbackLng: "ko",
1190
+ interpolation: {
1191
+ escapeValue: false
1192
+ },
1193
+ resources: {
1194
+ ko: {
1195
+ translation: lang_ko
1196
+ },
1197
+ en: {
1198
+ translation: lang_en
1199
+ }
1200
+ }
1201
+ });
1202
+
1203
+ var DEFAULT_LANGUAGE_CODE = "ko";
1204
+ var LANGUAGES = [{
1205
+ code: "ko",
1206
+ fullName: "Korean",
1207
+ shortName: "Korean",
1208
+ nativeName: "Korean",
1209
+ name: "Korean",
1210
+ image: "/images/korea.png"
1211
+ }, {
1212
+ code: "en",
1213
+ fullName: "English",
1214
+ shortName: "English",
1215
+ nativeName: "English",
1216
+ name: "English",
1217
+ image: "/images/usa.png"
1218
+ }];
1219
+ var SUPPORTED_LANGUAGES_CODE = LANGUAGES.map(function (i) {
1220
+ return i.code;
1221
+ });
1222
+
1223
+ var TheLanguageDropdown = function TheLanguageDropdown() {
1224
+ var defaultLanguage = !!localStorage.getItem("language") ? localStorage.getItem("language") : navigator.language || DEFAULT_LANGUAGE_CODE;
1225
+ var dispatch = reactRedux.useDispatch();
1226
+ var _useTranslation = reactI18next.useTranslation(),
1227
+ i18n = _useTranslation.i18n;
1228
+ var _useState = React.useState(false),
1229
+ dropdownOpen = _useState[0],
1230
+ setDropdownOpen = _useState[1];
1231
+ var _useState2 = React.useState(defaultLanguage),
1232
+ language = _useState2[0],
1233
+ setItemLanguage = _useState2[1];
1234
+ var toggle = function toggle() {
1235
+ return setDropdownOpen(function (prevState) {
1236
+ return !prevState;
1237
+ });
1238
+ };
1239
+ var changeLanguageApp = function changeLanguageApp(lang) {
1240
+ if (!SUPPORTED_LANGUAGES_CODE.includes(lang)) lang = DEFAULT_LANGUAGE_CODE;
1241
+ i18n.changeLanguage(lang);
1242
+ localStorage.setItem("language", lang);
1243
+ setItemLanguage(lang);
1244
+ dispatch(setLanguage(lang));
1245
+ };
1246
+ var currentLanguage = React.useMemo(function () {
1247
+ var currentLang = LANGUAGES.find(function (i) {
1248
+ return i.code === language;
1249
+ });
1250
+ if (!currentLang) return null;
1251
+ return React__default.createElement(React__default.Fragment, null, React__default.createElement("img", {
1252
+ className: "mr-2 " + styles['dropdown-menu-flag'],
1253
+ src: currentLang.image
1254
+ }), " ", currentLang.shortName);
1255
+ }, [language]);
1256
+ React.useEffect(function () {
1257
+ changeLanguageApp(language);
1258
+ }, [language]);
1259
+ return React__default.createElement(reactstrap.Dropdown, {
1260
+ isOpen: dropdownOpen,
1261
+ toggle: toggle,
1262
+ className: "" + styles["dropdown-menu"]
1263
+ }, React__default.createElement(reactstrap.DropdownToggle, {
1264
+ className: styles["header-avatar"] + " d-flex align-items-center"
1265
+ }, React__default.createElement("span", {
1266
+ style: {
1267
+ color: "#000",
1268
+ textTransform: "capitalize",
1269
+ display: 'flex',
1270
+ alignItems: 'center'
1271
+ }
1272
+ }, currentLanguage, React__default.createElement(io5.IoChevronDown, {
1273
+ className: "ml-2",
1274
+ style: {
1275
+ fontSize: '15px',
1276
+ marginLeft: "5px",
1277
+ marginTop: "2px"
1278
+ }
1279
+ }))), React__default.createElement(reactstrap.DropdownMenu, {
1280
+ className: styles["dropdown-content-language"]
1281
+ }, LANGUAGES.map(function (lang, index) {
1282
+ return React__default.createElement(reactstrap.DropdownItem, {
1283
+ key: lang.code,
1284
+ className: styles["dropdown-change"] + " px-0 py-0 " + (index === LANGUAGES.length - 1 ? "pb-2" : "pt-2"),
1285
+ onClick: function onClick() {
1286
+ return setItemLanguage(lang.code);
1287
+ }
1288
+ }, React__default.createElement("div", {
1289
+ className: styles["dropdown-item-language"] + " " + styles["item-logout"] + " " + (language == lang.code ? styles['dropdown-item-language-active'] : "") + " d-flex align-items-center w-100"
1290
+ }, React__default.createElement("span", {
1291
+ className: "mr-2 d-flex hover-opacity"
1292
+ }, React__default.createElement("img", {
1293
+ style: {
1294
+ width: "30px",
1295
+ marginRight: "10px"
1296
+ },
1297
+ src: lang.image
1298
+ })), lang.name));
1299
+ })));
1300
+ };
1301
+
1302
+ var minutesToTimeSpan = (function (time) {
1303
+ var h = Math.floor(time / 60);
1304
+ var m = time % 60;
1305
+ return h.toString().padStart(2, "0") + ":" + m.toString().padStart(2, "0") + ":00";
1306
+ });
1307
+
1308
+ var toISOString = (function (time) {
1309
+ try {
1310
+ return moment(time).toISOString();
1311
+ } catch (_unused) {
1312
+ return "";
1313
+ }
1314
+ });
1315
+
1316
+ var historyCore = history.createBrowserHistory();
31
1317
 
1318
+ Object.defineProperty(exports, 'I18nextProvider', {
1319
+ enumerable: true,
1320
+ get: function () {
1321
+ return reactI18next.I18nextProvider;
1322
+ }
1323
+ });
1324
+ Object.defineProperty(exports, 'useTranslation', {
1325
+ enumerable: true,
1326
+ get: function () {
1327
+ return reactI18next.useTranslation;
1328
+ }
1329
+ });
32
1330
  exports.ACCESS_TOKEN = ACCESS_TOKEN;
33
1331
  exports.BASE_URL = BASE_URL;
1332
+ exports.CommonAlert = CommonAlert;
1333
+ exports.CommonDialog = CommonDialog;
1334
+ exports.ConfirmDialog = ConfirmDialog;
1335
+ exports.CustomPagination = CustomPagination;
1336
+ exports.DATE_MIN_VALUE = DATE_MIN_VALUE;
1337
+ exports.EXAM_CHANNEL = EXAM_CHANNEL;
1338
+ exports.LayoutContext = LayoutContext;
1339
+ exports.Loading = Loading;
34
1340
  exports.Login = Login;
1341
+ exports.NotFound = NotFound;
1342
+ exports.PUSHER_CONFIG = PUSHER_CONFIG;
1343
+ exports.TheLanguageDropdown = TheLanguageDropdown;
1344
+ exports.api = api$1;
1345
+ exports.diffFromNow = diffFromNow;
1346
+ exports.formatTime = formatTime;
1347
+ exports.historyCore = historyCore;
1348
+ exports.i18n = i18n;
1349
+ exports.minutesToTimeSpan = minutesToTimeSpan;
1350
+ exports.setAlert = setAlert;
1351
+ exports.setLanguage = setLanguage;
35
1352
  exports.setLoading = setLoading;
1353
+ exports.setUser = setUser;
1354
+ exports.store = store;
1355
+ exports.toISOString = toISOString;
1356
+ exports.useGoogleSignOut = useGoogleSignOut;
1357
+ exports.utcToLocalTime = utcToLocalTime;
36
1358
  //# sourceMappingURL=index.js.map