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.
@@ -5,7 +5,7 @@ declare type LoginInfo = {
5
5
  captcha: string;
6
6
  rememberMe: boolean;
7
7
  };
8
- declare const useLogin: () => {
8
+ declare const useLogin: (onNavigate: Function) => {
9
9
  defaultInfo: LoginInfo;
10
10
  openLogin: boolean;
11
11
  toggle: () => void;
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
- 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 };
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 = "https://localhost:7045";
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: onLogoutSuccess,
151
- onFailure: 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
- signOut: signOut,
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
- signOut = _useGoogleSignOut.signOut;
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(executeRecaptcha("login"));
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
- 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");
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
- onNavigate("/student/check/main");
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
- }, 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
- }));
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(_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
- }));
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
- onNavigate = _ref.onNavigate;
748
+ role = _ref.role;
723
749
  var _useGoogleSignOut = useGoogleSignOut({}),
724
- signOut = _useGoogleSignOut.signOut;
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
- localStorage.removeItem(ACCESS_TOKEN);
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;