touchstudy-core 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/containers/Login/hooks/useLogin.d.ts +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +149 -83
- package/dist/index.js.map +1 -1
- package/dist/index.modern.js +149 -84
- package/dist/index.modern.js.map +1 -1
- package/dist/layouts/LayoutContext.d.ts +1 -0
- package/dist/redux/commons/action.d.ts +1 -0
- package/dist/utils/constants.d.ts +1 -1
- package/dist/utils/useGoogleSignOut.d.ts +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
@@ -21,4 +21,5 @@ import TheLanguageDropdown from "./layouts/TheLanguageDropdown";
|
|
21
21
|
import { useTranslation, I18nextProvider } from "react-i18next";
|
22
22
|
import minutesToTimeSpan from "./utils/minutesToTimeSpan";
|
23
23
|
import toISOString from "./utils/toISOString";
|
24
|
-
|
24
|
+
import canAccessRoute from "./utils/canAccessRoute";
|
25
|
+
export { diffFromNow, formatTime, utcToLocalTime, setLoading, BASE_URL, ACCESS_TOKEN, Login, store, historyCore, setAlert, setUser, Loading, NotFound, LayoutContext, api, ConfirmDialog, CommonDialog, CommonAlert, CustomPagination, useGoogleSignOut, PUSHER_CONFIG, ExamEvent, EXAM_CHANNEL, setLanguage, i18n, TheLanguageDropdown, useTranslation, I18nextProvider, DATE_MIN_VALUE, minutesToTimeSpan, toISOString, canAccessRoute };
|
package/dist/index.js
CHANGED
@@ -22,12 +22,13 @@ var setLoading = toolkit.createAction("common/setLoading");
|
|
22
22
|
var setAlert = toolkit.createAction("common/setAlert");
|
23
23
|
var setUser = toolkit.createAction("common/setUser");
|
24
24
|
var setLanguage = toolkit.createAction("common/setLanguage");
|
25
|
+
var reset = toolkit.createAction("common/reset");
|
25
26
|
|
26
27
|
var GOOGLE_CLIENT_ID = "64118819726-0qlur4qjrs9jbuu6rnoa0u91g680lmpg.apps.googleusercontent.com";
|
27
28
|
var GOOGLE_RECAPTCHA_ID = "6LfNtLUaAAAAAL24lbBV11jS-gBtt1mhtxb4NXs0";
|
28
29
|
var ACCESS_TOKEN = "ACCESS_TOKEN";
|
29
30
|
var DATE_MIN_VALUE = "0001-01-01T00:00:00+00:00";
|
30
|
-
var BASE_URL = "
|
31
|
+
var BASE_URL = "http://api.touchstudy.kr";
|
31
32
|
var PUSHER_CONFIG = {
|
32
33
|
cluster: "ap1",
|
33
34
|
key: "9018c77328885a14150b"
|
@@ -143,17 +144,37 @@ var AuthenticationMessage;
|
|
143
144
|
})(AuthenticationMessage || (AuthenticationMessage = {}));
|
144
145
|
|
145
146
|
var useGoogleSignOut = function useGoogleSignOut(props) {
|
147
|
+
var dispatch = reactRedux.useDispatch();
|
146
148
|
var onLogoutSuccess = props.onLogoutSuccess,
|
147
149
|
onFailure = props.onFailure;
|
150
|
+
var handleLogoutSuccess = function handleLogoutSuccess() {
|
151
|
+
onLogoutSuccess === null || onLogoutSuccess === void 0 ? void 0 : onLogoutSuccess();
|
152
|
+
};
|
153
|
+
var handleLogoutFailure = function handleLogoutFailure() {
|
154
|
+
onFailure === null || onFailure === void 0 ? void 0 : onFailure();
|
155
|
+
};
|
148
156
|
var _useGoogleLogout = GoogleLogin.useGoogleLogout({
|
149
157
|
clientId: GOOGLE_CLIENT_ID,
|
150
|
-
onLogoutSuccess:
|
151
|
-
onFailure:
|
158
|
+
onLogoutSuccess: handleLogoutSuccess,
|
159
|
+
onFailure: handleLogoutFailure
|
152
160
|
}),
|
153
161
|
signOut = _useGoogleLogout.signOut,
|
154
162
|
loaded = _useGoogleLogout.loaded;
|
163
|
+
var handleSignOut = function handleSignOut() {
|
164
|
+
localStorage.removeItem("USER_INFORMATION");
|
165
|
+
localStorage.removeItem(ACCESS_TOKEN);
|
166
|
+
try {
|
167
|
+
signOut();
|
168
|
+
} catch (error) {
|
169
|
+
console.log({
|
170
|
+
error: error
|
171
|
+
});
|
172
|
+
}
|
173
|
+
dispatch(reset());
|
174
|
+
window.location.href = "/login";
|
175
|
+
};
|
155
176
|
return {
|
156
|
-
|
177
|
+
handleSignOut: handleSignOut,
|
157
178
|
loaded: loaded
|
158
179
|
};
|
159
180
|
};
|
@@ -172,14 +193,23 @@ var BlockLogin = function BlockLogin(_ref) {
|
|
172
193
|
var _useGoogleReCaptcha = reactGoogleRecaptchaV3.useGoogleReCaptcha(),
|
173
194
|
executeRecaptcha = _useGoogleReCaptcha.executeRecaptcha;
|
174
195
|
var _useGoogleSignOut = useGoogleSignOut({}),
|
175
|
-
|
196
|
+
handleSignOut = _useGoogleSignOut.handleSignOut;
|
176
197
|
var clickHandler = React.useCallback(function () {
|
177
198
|
try {
|
199
|
+
var _exit = false;
|
178
200
|
if (!executeRecaptcha) {
|
179
|
-
console.log("execute recaptcha undefined");
|
180
201
|
return Promise.resolve();
|
181
202
|
}
|
182
|
-
return Promise.resolve(
|
203
|
+
return Promise.resolve(_catch(function () {
|
204
|
+
return Promise.resolve(executeRecaptcha("login")).then(function (result) {
|
205
|
+
_exit = true;
|
206
|
+
return result;
|
207
|
+
});
|
208
|
+
}, function (error) {
|
209
|
+
console.log({
|
210
|
+
error: error
|
211
|
+
});
|
212
|
+
}));
|
183
213
|
} catch (e) {
|
184
214
|
return Promise.reject(e);
|
185
215
|
}
|
@@ -187,65 +217,59 @@ var BlockLogin = function BlockLogin(_ref) {
|
|
187
217
|
var handleVerify = React.useCallback(function () {}, []);
|
188
218
|
var onSuccessGoogle = function onSuccessGoogle(res) {
|
189
219
|
try {
|
190
|
-
var _exit = false;
|
191
220
|
return Promise.resolve(function () {
|
192
221
|
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
222
|
var _res$profileObj = res.profileObj,
|
198
223
|
email = _res$profileObj.email,
|
199
224
|
imageUrl = _res$profileObj.imageUrl,
|
200
225
|
name = _res$profileObj.name;
|
201
226
|
var accessToken = res.tokenObj.id_token;
|
202
227
|
var googleId = res.googleId;
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
228
|
+
return Promise.resolve(clickHandler()).then(function (clickHandlerRes) {
|
229
|
+
function _temp2() {
|
230
|
+
dispatch(setLoading(false));
|
231
|
+
}
|
232
|
+
if (!clickHandlerRes) return;
|
233
|
+
var infoLogin = {
|
234
|
+
imageUrl: imageUrl,
|
235
|
+
fullName: name,
|
236
|
+
email: email,
|
237
|
+
token: accessToken,
|
238
|
+
googleId: googleId,
|
239
|
+
captcha: clickHandlerRes
|
240
|
+
};
|
241
|
+
var role = isTeacher ? "Teacher" : "Student";
|
242
|
+
dispatch(setLoading(true));
|
243
|
+
var _temp = _catch(function () {
|
244
|
+
return Promise.resolve(apiLoginGoogle(infoLogin, role)).then(function (res1) {
|
245
|
+
var isFirstLogin = res1.data.isFirstLogin;
|
246
|
+
var tokenJWT = res1.data.token;
|
247
|
+
localStorage.setItem("USER_INFORMATION", JSON.stringify(infoLogin));
|
248
|
+
localStorage.setItem(ACCESS_TOKEN, tokenJWT);
|
249
|
+
if (!isTeacher && isFirstLogin) {
|
250
|
+
onNavigate("/register/info");
|
251
|
+
} else {
|
252
|
+
onNavigate("/");
|
253
|
+
}
|
254
|
+
});
|
255
|
+
}, function (error) {
|
256
|
+
var _error$response, _error$response$data;
|
257
|
+
var message = undefined;
|
258
|
+
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;
|
259
|
+
if (type === AuthenticationMessage.NotAllowedToRegister) {
|
260
|
+
alert("가입 권한이 없는 계정입니다. 관리자에게 문의하세요.");
|
261
|
+
} else if (type) {
|
262
|
+
var _error$response2, _error$response2$data;
|
263
|
+
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;
|
225
264
|
} else {
|
226
|
-
|
265
|
+
var _error$response3;
|
266
|
+
message = (error === null || error === void 0 ? void 0 : (_error$response3 = error.response) === null || _error$response3 === void 0 ? void 0 : _error$response3.data) || ERROR_MESSAGE;
|
227
267
|
}
|
268
|
+
message && alert(message);
|
269
|
+
handleSignOut();
|
228
270
|
});
|
229
|
-
|
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
|
-
}));
|
271
|
+
return _temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp);
|
247
272
|
});
|
248
|
-
return _temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp);
|
249
273
|
}
|
250
274
|
}());
|
251
275
|
} catch (e) {
|
@@ -261,14 +285,10 @@ var BlockLogin = function BlockLogin(_ref) {
|
|
261
285
|
validationSchema: schema,
|
262
286
|
onSubmit: function (values) {
|
263
287
|
try {
|
264
|
-
return Promise.resolve(
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
});
|
269
|
-
}, function (err) {
|
270
|
-
console.error(err);
|
271
|
-
}));
|
288
|
+
return Promise.resolve(clickHandler()).then(function (clickHandlerRes) {
|
289
|
+
if (!clickHandlerRes) return;
|
290
|
+
values.captcha = clickHandlerRes;
|
291
|
+
});
|
272
292
|
} catch (e) {
|
273
293
|
return Promise.reject(e);
|
274
294
|
}
|
@@ -304,13 +324,21 @@ var BlockLogin = function BlockLogin(_ref) {
|
|
304
324
|
});
|
305
325
|
};
|
306
326
|
|
327
|
+
var getAccessToken$1 = (function () {
|
328
|
+
try {
|
329
|
+
return localStorage.getItem(ACCESS_TOKEN);
|
330
|
+
} catch (err) {
|
331
|
+
return null;
|
332
|
+
}
|
333
|
+
});
|
334
|
+
|
307
335
|
var defaultInfo = {
|
308
336
|
email: "",
|
309
337
|
password: "",
|
310
338
|
captcha: "",
|
311
339
|
rememberMe: false
|
312
340
|
};
|
313
|
-
var useLogin = function useLogin() {
|
341
|
+
var useLogin = function useLogin(onNavigate) {
|
314
342
|
var _useState = React.useState(false),
|
315
343
|
openLogin = _useState[0],
|
316
344
|
setOpenLogin = _useState[1];
|
@@ -330,7 +358,11 @@ var useLogin = function useLogin() {
|
|
330
358
|
scope: 'email'
|
331
359
|
});
|
332
360
|
};
|
333
|
-
gapiScript.gapi.load('client:auth2', start);
|
361
|
+
!!gapiScript.gapi && gapiScript.gapi.load('client:auth2', start);
|
362
|
+
}, [gapiScript.gapi]);
|
363
|
+
React.useEffect(function () {
|
364
|
+
var token = getAccessToken$1();
|
365
|
+
if (!!token) onNavigate("/");
|
334
366
|
}, []);
|
335
367
|
return {
|
336
368
|
defaultInfo: defaultInfo,
|
@@ -346,7 +378,7 @@ var useLogin = function useLogin() {
|
|
346
378
|
var Login = function Login(_ref) {
|
347
379
|
var onNavigate = _ref.onNavigate,
|
348
380
|
isTeacher = _ref.isTeacher;
|
349
|
-
var _useLogin = useLogin(),
|
381
|
+
var _useLogin = useLogin(onNavigate),
|
350
382
|
defaultInfo = _useLogin.defaultInfo;
|
351
383
|
return React__default.createElement("div", {
|
352
384
|
className: styles["login"] + " container-fluid font-family-lato"
|
@@ -584,6 +616,8 @@ var commonReducer = toolkit.createReducer(initialState, function (builder) {
|
|
584
616
|
state.user = action.payload;
|
585
617
|
}).addCase(setLanguage, function (state, action) {
|
586
618
|
state.language = action.payload;
|
619
|
+
}).addCase(reset, function (_state, _action) {
|
620
|
+
return initialState;
|
587
621
|
});
|
588
622
|
});
|
589
623
|
|
@@ -660,14 +694,6 @@ var encodeParams$1 = (function (params) {
|
|
660
694
|
}).join('&');
|
661
695
|
});
|
662
696
|
|
663
|
-
var getAccessToken$1 = (function () {
|
664
|
-
try {
|
665
|
-
return localStorage.getItem(ACCESS_TOKEN);
|
666
|
-
} catch (err) {
|
667
|
-
return null;
|
668
|
-
}
|
669
|
-
});
|
670
|
-
|
671
697
|
var api$1 = axios.create({
|
672
698
|
baseURL: BASE_URL,
|
673
699
|
timeout: 0,
|
@@ -719,15 +745,28 @@ var getInfo = function getInfo() {
|
|
719
745
|
|
720
746
|
var LayoutContext = function LayoutContext(_ref) {
|
721
747
|
var children = _ref.children,
|
722
|
-
|
748
|
+
role = _ref.role;
|
723
749
|
var _useGoogleSignOut = useGoogleSignOut({}),
|
724
|
-
|
750
|
+
handleSignOut = _useGoogleSignOut.handleSignOut;
|
725
751
|
var dispatch = reactRedux.useDispatch();
|
752
|
+
var user = reactRedux.useSelector(function (state) {
|
753
|
+
var _state$common;
|
754
|
+
return state === null || state === void 0 ? void 0 : (_state$common = state.common) === null || _state$common === void 0 ? void 0 : _state$common.user;
|
755
|
+
});
|
726
756
|
var resetAuth = function resetAuth() {
|
727
|
-
|
728
|
-
signOut();
|
729
|
-
onNavigate("/login");
|
757
|
+
handleSignOut();
|
730
758
|
};
|
759
|
+
var checkRoleUser = React.useCallback(function () {
|
760
|
+
var _user$roles, _user$roles2;
|
761
|
+
if (!user) return;
|
762
|
+
var isAdmin = (_user$roles = user.roles) === null || _user$roles === void 0 ? void 0 : _user$roles.includes("Admin");
|
763
|
+
if (isAdmin && role !== "Teacher") alert(user.email + " not allow to register " + role);
|
764
|
+
if (isAdmin) return;
|
765
|
+
if (!((_user$roles2 = user.roles) !== null && _user$roles2 !== void 0 && _user$roles2.includes(role))) {
|
766
|
+
alert(user.email + " not allow to register " + role);
|
767
|
+
resetAuth();
|
768
|
+
}
|
769
|
+
}, [role, JSON.stringify(user)]);
|
731
770
|
var loadInfo = function loadInfo() {
|
732
771
|
try {
|
733
772
|
var _temp2 = function _temp2() {
|
@@ -746,7 +785,11 @@ var LayoutContext = function LayoutContext(_ref) {
|
|
746
785
|
}
|
747
786
|
dispatch(setUser(info.data));
|
748
787
|
});
|
749
|
-
}, function () {
|
788
|
+
}, function (err) {
|
789
|
+
console.log({
|
790
|
+
err: err
|
791
|
+
});
|
792
|
+
role === "Student" ? alert("학생, 다시 로그인해주세요.") : alert("선생님, 다시 로그인해주세요.");
|
750
793
|
resetAuth();
|
751
794
|
});
|
752
795
|
return Promise.resolve(_temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp));
|
@@ -755,8 +798,9 @@ var LayoutContext = function LayoutContext(_ref) {
|
|
755
798
|
}
|
756
799
|
};
|
757
800
|
React.useEffect(function () {
|
758
|
-
loadInfo();
|
759
|
-
|
801
|
+
!user && loadInfo();
|
802
|
+
!!user && checkRoleUser();
|
803
|
+
}, [JSON.stringify(user)]);
|
760
804
|
return React__default.createElement(React.Fragment, null, children);
|
761
805
|
};
|
762
806
|
|
@@ -972,6 +1016,7 @@ var description_success = "스터디 터치는 엄태욱 선생님의 수업에
|
|
972
1016
|
var logout = "로그 아웃";
|
973
1017
|
var overall_status = "전체 현황";
|
974
1018
|
var exam_status = "시험별 현";
|
1019
|
+
var student_status = "학생 신분";
|
975
1020
|
var user_manager = "사용자 목록";
|
976
1021
|
var recent_exam_results = "최근 시험 결과";
|
977
1022
|
var instructor_name = "강사이름";
|
@@ -1016,6 +1061,7 @@ var no_data = "데이터 없음";
|
|
1016
1061
|
var internet_connection_was_lost = "인터넷 연결이 끊어졌습니다";
|
1017
1062
|
var problem = "문제";
|
1018
1063
|
var problem_solving_time = "문제풀이 시간";
|
1064
|
+
var minutes = "분";
|
1019
1065
|
var lang_ko = {
|
1020
1066
|
problem_solving: problem_solving,
|
1021
1067
|
my_story: my_story,
|
@@ -1027,6 +1073,7 @@ var lang_ko = {
|
|
1027
1073
|
logout: logout,
|
1028
1074
|
overall_status: overall_status,
|
1029
1075
|
exam_status: exam_status,
|
1076
|
+
student_status: student_status,
|
1030
1077
|
user_manager: user_manager,
|
1031
1078
|
recent_exam_results: recent_exam_results,
|
1032
1079
|
instructor_name: instructor_name,
|
@@ -1070,7 +1117,8 @@ var lang_ko = {
|
|
1070
1117
|
no_data: no_data,
|
1071
1118
|
internet_connection_was_lost: internet_connection_was_lost,
|
1072
1119
|
problem: problem,
|
1073
|
-
problem_solving_time: problem_solving_time
|
1120
|
+
problem_solving_time: problem_solving_time,
|
1121
|
+
minutes: minutes
|
1074
1122
|
};
|
1075
1123
|
|
1076
1124
|
var problem_solving$1 = "Problem Solving";
|
@@ -1083,6 +1131,7 @@ var description_success$1 = "Study Touch is a learning tool used in teacher Taew
|
|
1083
1131
|
var logout$1 = "Logout";
|
1084
1132
|
var overall_status$1 = "Overall Status";
|
1085
1133
|
var exam_status$1 = "Exam Status";
|
1134
|
+
var student_status$1 = "Student Status";
|
1086
1135
|
var user_manager$1 = "User Manager";
|
1087
1136
|
var recent_exam_results$1 = "Recent exam";
|
1088
1137
|
var instructor_name$1 = "Instructor name";
|
@@ -1127,6 +1176,7 @@ var no_data$1 = "No data";
|
|
1127
1176
|
var internet_connection_was_lost$1 = "Internet connection was lost";
|
1128
1177
|
var problem$1 = "Problem ";
|
1129
1178
|
var problem_solving_time$1 = "Problem solving time";
|
1179
|
+
var minutes$1 = "m";
|
1130
1180
|
var lang_en = {
|
1131
1181
|
problem_solving: problem_solving$1,
|
1132
1182
|
my_story: my_story$1,
|
@@ -1138,6 +1188,7 @@ var lang_en = {
|
|
1138
1188
|
logout: logout$1,
|
1139
1189
|
overall_status: overall_status$1,
|
1140
1190
|
exam_status: exam_status$1,
|
1191
|
+
student_status: student_status$1,
|
1141
1192
|
user_manager: user_manager$1,
|
1142
1193
|
recent_exam_results: recent_exam_results$1,
|
1143
1194
|
instructor_name: instructor_name$1,
|
@@ -1181,7 +1232,8 @@ var lang_en = {
|
|
1181
1232
|
no_data: no_data$1,
|
1182
1233
|
internet_connection_was_lost: internet_connection_was_lost$1,
|
1183
1234
|
problem: problem$1,
|
1184
|
-
problem_solving_time: problem_solving_time$1
|
1235
|
+
problem_solving_time: problem_solving_time$1,
|
1236
|
+
minutes: minutes$1
|
1185
1237
|
};
|
1186
1238
|
|
1187
1239
|
i18n.use(reactI18next.initReactI18next).init({
|
@@ -1313,6 +1365,19 @@ var toISOString = (function (time) {
|
|
1313
1365
|
}
|
1314
1366
|
});
|
1315
1367
|
|
1368
|
+
var canAccess = function canAccess(userRoles, componentRoles) {
|
1369
|
+
if (!Array.isArray(userRoles)) {
|
1370
|
+
return false;
|
1371
|
+
}
|
1372
|
+
if (Array.isArray(componentRoles)) {
|
1373
|
+
var intersects = userRoles.filter(function (i) {
|
1374
|
+
return componentRoles.includes(i);
|
1375
|
+
});
|
1376
|
+
return intersects.length > 0;
|
1377
|
+
}
|
1378
|
+
return true;
|
1379
|
+
};
|
1380
|
+
|
1316
1381
|
var historyCore = history.createBrowserHistory();
|
1317
1382
|
|
1318
1383
|
Object.defineProperty(exports, 'I18nextProvider', {
|
@@ -1342,6 +1407,7 @@ exports.NotFound = NotFound;
|
|
1342
1407
|
exports.PUSHER_CONFIG = PUSHER_CONFIG;
|
1343
1408
|
exports.TheLanguageDropdown = TheLanguageDropdown;
|
1344
1409
|
exports.api = api$1;
|
1410
|
+
exports.canAccessRoute = canAccess;
|
1345
1411
|
exports.diffFromNow = diffFromNow;
|
1346
1412
|
exports.formatTime = formatTime;
|
1347
1413
|
exports.historyCore = historyCore;
|