@tapni/auth 0.0.119 → 0.0.129

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.
@@ -0,0 +1,569 @@
1
+ import to from "await-to-js";
2
+ import UserService from "../services/UserService";
3
+ import DeviceService from "../services/DeviceService";
4
+ import AuthService from "../services/AuthService";
5
+ import CompanyService from "../services/CompanyService";
6
+ import { Device } from "@capacitor/device";
7
+ import axios from "axios";
8
+ import en from "../store/locales/en.js";
9
+ import de from "../store/locales/de.js";
10
+ import es from "../store/locales/es.js";
11
+ import fr from "../store/locales/fr.js";
12
+ import it from "../store/locales/it.js";
13
+ import sr from "../store/locales/sr.js";
14
+ import tr from "../store/locales/tr.js";
15
+ import cn from "../store/locales/cn.js";
16
+ import kr from "../store/locales/kr.js";
17
+ import {EventBus} from "@/store/event-bus.js";
18
+ import router from '../router/index.js';
19
+ export default {
20
+ namespaced: true,
21
+ state: {
22
+ $storex: {},
23
+ view: "AuthWelcome",
24
+ lang: "en",
25
+ realm: "app",
26
+ refreshing: false,
27
+ loggedInUserId: "",
28
+ apiRoot: "",
29
+ account: {},
30
+ device: {},
31
+ loggedInAccounts: {},
32
+ ssoLang: {
33
+ en: en.state,
34
+ de: de.state,
35
+ es: es.state,
36
+ fr: fr.state,
37
+ it: it.state,
38
+ sr: sr.state,
39
+ tr: tr.state,
40
+ cn: cn.state,
41
+ kr: kr.state,
42
+ },
43
+ display: import.meta.env.VITE_APP_MODE,
44
+ redirect_uri: import.meta.env.VITE_APP_APP_ROOT + "/callback/auth",
45
+ response_type: "token",
46
+ state: "",
47
+ allowedOrigins: [
48
+ "https://business.tapni.com",
49
+ "https://business-dev.tapni.com",
50
+ "https://tapni.com",
51
+ "https://tapni.co",
52
+ "https://t.link",
53
+ "https://my.tapni.com",
54
+ "https://my.tapni.co",
55
+ "https://dev.tapni.co",
56
+ "https://dev.tapni.com",
57
+ "https://auth.tapni.com",
58
+ "https://auth.tapni.co",
59
+ "https://mailsign.link",
60
+ "https://sign.tapni.com",
61
+ "https://qrcodetoolkit.com",
62
+ "https://qr.tapni.com",
63
+ "https://designer.tapni.com",
64
+ "https://designer-dev.tapni.com",
65
+ ],
66
+ },
67
+ mutations: {
68
+ setAccountSettings(state, account) {
69
+ state.account = account;
70
+ },
71
+ setStorage(state, storage) {
72
+ state.$storex = {
73
+ ...state.$storex,
74
+ ...storage
75
+ };
76
+ },
77
+ setLoggedInAccounts(state, accounts) {
78
+ state.loggedInAccounts = {};
79
+ accounts.forEach((account) => {
80
+ state.loggedInAccounts[account.username] = account;
81
+ });
82
+ },
83
+ setLoggedInUserId(state, id) {
84
+ state.loggedInUserId = id;
85
+ },
86
+ setRefreshToken(state, token) {
87
+ if(!token) return;
88
+ let refreshTokens = state.$storex.refreshTokens ? state.$storex.refreshTokens.split(",") : [];
89
+ refreshTokens = [token, ...refreshTokens.filter(t => t !== token)];
90
+ state.$storex.refreshTokens = refreshTokens.join(",");
91
+ },
92
+ unsetRefreshToken(state, refreshToken) {
93
+ state.$storex.refreshTokens = state.$storex.refreshTokens?.filter(t => t !== refreshToken).join(",");
94
+ },
95
+ setToken(state, token) {
96
+ state.$storex.token = token;
97
+ },
98
+ setUserID(state, userID) {
99
+ state.$storex.UserId = userID;
100
+ },
101
+ updateLang(state, lang) {
102
+ state.lang = lang;
103
+ },
104
+ setView(state, view) {
105
+ state.view = view;
106
+ },
107
+ setRedirectUri(state, uri) {
108
+ state.redirect_uri = uri;
109
+ },
110
+ setDisplay(state, display) {
111
+ state.display = display;
112
+ },
113
+ setState(state, stateValue) {
114
+ state.state = stateValue;
115
+ },
116
+ setResponseType(state, responseType) {
117
+ state.response_type = responseType;
118
+ },
119
+ setRealm(state, realm) {
120
+ state.realm = realm;
121
+ },
122
+ setApiRoot(state, apiRoot) {
123
+ state.apiRoot = apiRoot;
124
+ },
125
+ },
126
+ actions: {
127
+ async getAccountSettings({ state, commit, dispatch }) {
128
+ console.log('gett', state.$storex);
129
+ const [err, response] = await to(
130
+ AuthService.getAccountSettings()
131
+ );
132
+ if (err) return dispatch('errorHandler', err);
133
+ if (response.data.success) {
134
+ commit('setAccountSettings', response.data.data);
135
+ }
136
+ },
137
+ setStorage({ commit }, storage) {
138
+ console.log('storrr');
139
+ commit('setStorage', storage);
140
+ },
141
+ errorHandler({ dispatch }, error) {
142
+ console.log('ererererer', error);
143
+ if (
144
+ error &&
145
+ error.response &&
146
+ error.response.data &&
147
+ error.response.data.error
148
+ ) {
149
+ if (error.response.data.error === "ACCESS_DENIED") {
150
+ return dispatch('logout');
151
+ }
152
+
153
+ if (error.response.data.error === 'OTP_REQUIRED') {
154
+ return EventBus.$emit('toggleOTPModal', true);
155
+ }
156
+
157
+ // Link click network error bug fix
158
+ if (
159
+ !error.response.data.error.includes("Network Error") &&
160
+ !error.response.data.error.includes("TOKEN_EXPIRED") &&
161
+ !error.response.data.error.includes("Cannot read properties")
162
+ ) {
163
+ dispatch('errorSnack', error.response.data.error);
164
+ }
165
+ }
166
+ return error;
167
+ },
168
+ errorSnack({ commit }, message) {
169
+ let snackbar = document.getElementById("snackbar");
170
+ let errMessage = document.getElementById("errorMessage");
171
+ let errorSnack = document.getElementById("errorSnack");
172
+ errMessage.innerHTML = message;
173
+ snackbar.classList.add("show-snack");
174
+ errorSnack.classList.add("active-snack");
175
+ setTimeout(function () {
176
+ errorSnack.classList.remove("active-snack");
177
+ snackbar.classList.remove("show-snack");
178
+ }, 3000);
179
+ },
180
+ successSnack({ commit }, message) {
181
+ let snackbar = document.getElementById("snackbar");
182
+ let successMessage = document.getElementById("successMessage");
183
+ let successSnack = document.getElementById("successSnack");
184
+ successMessage.innerHTML = message;
185
+ snackbar.classList.add("show-snack");
186
+ successSnack.classList.add("active-snack");
187
+ setTimeout(function () {
188
+ successSnack.classList.remove("active-snack");
189
+ snackbar.classList.remove("show-snack");
190
+ }, 3000);
191
+ },
192
+ closeSnacks({ commit }) {
193
+ document.getElementById("snackbar").classList.remove("show-snack");
194
+ document.getElementById("successSnack").classList.remove("active-snack");
195
+ document.getElementById("errorSnack").classList.remove("active-snack");
196
+ },
197
+ async eventLog({ commit, dispatch }, data) {
198
+ const [err, response] = await to(
199
+ UserService.eventLog(data)
200
+ );
201
+ if (err) return dispatch('errorHandler', err);
202
+ return response;
203
+ },
204
+ async maintenance({ commit }) {
205
+ const [err, response] = await to(
206
+ axios.get("https://status.tapni.co/data/maintenance.json")
207
+ );
208
+ if (err) return console.error(err);
209
+ if (response) {
210
+ let maintenanceState = response.data;
211
+ if (typeof response.data === "string") {
212
+ maintenanceState = JSON.parse(response.data);
213
+ }
214
+
215
+ if (maintenanceState.api && maintenanceState.api.maintenanceActive) {
216
+ location.href =
217
+ "https://t.link/maintenance?msg=" + maintenanceState.api.msg;
218
+ }
219
+ }
220
+ },
221
+ async loginSetup({ commit }, response) {
222
+ // Save Refresh Token
223
+ if (response.data.refreshToken) commit('setRefreshToken', response.data.refreshToken);
224
+
225
+ // Save Access Token
226
+ if (response.data.token) commit('setToken', response.data.token);
227
+
228
+ commit('setLoggedInUserId', response.data.data.id);
229
+
230
+ commit('setStorage', {
231
+ UserId: response.data.data.id,
232
+ username: response.data.data.username,
233
+ localUser: response.data.data
234
+ })
235
+
236
+ if (response.isModal === true) {
237
+ commit('setLoggedInAccounts', [
238
+ {
239
+ id: response.data.data.id,
240
+ username: response.data.data.username,
241
+ refreshToken: response.data.refreshToken,
242
+ photo: response.data.data.photo,
243
+ },
244
+ ]);
245
+ }
246
+ },
247
+ async switchAccount({ commit, dispatch, state }, username) {
248
+ if (state.loggedInAccounts[username]) {
249
+ commit('setStorage', {
250
+ username: username,
251
+ UserId: state.loggedInAccounts[username].id,
252
+ localUser: state.loggedInAccounts[username]
253
+ })
254
+ commit('setLoggedInUserId', state.loggedInAccounts[username].id);
255
+ commit('setRefreshToken', state.loggedInAccounts[username].refreshToken);
256
+ await dispatch('refreshTokenAction', state.loggedInAccounts[username]);
257
+ }
258
+ EventBus.$emit("ssoEvent", { name: "switchAccount", data: { username }, });
259
+ },
260
+ async refreshTokenAction({ commit, state, getters }, data) {
261
+ if (state.refreshing) {
262
+ return null;
263
+ }
264
+
265
+ state.refreshing = true;
266
+ const [err, response] = await to(
267
+ AuthService.refreshToken({
268
+ id: data.id,
269
+ refreshToken: getters.refreshTokens[0],
270
+ refreshTokenAction: true
271
+ })
272
+ );
273
+ if (err && err.response && err.response.data.error === "ACCESS_DENIED") {
274
+ commit('logout', { refreshToken: data.refreshToken, sendRequest: false });
275
+ return location.reload();
276
+ }
277
+
278
+ // Set new access token
279
+ if (response && response.data) {
280
+ commit('setToken', response.data.token);
281
+ }
282
+ state.refreshing = false;
283
+ },
284
+ async login({ commit, state, dispatch }, data) {
285
+ console.log('laagaga')
286
+ const [err, response] = await to(AuthService.login(data));
287
+ console.log('lilili')
288
+ if (err) return dispatch('errorHandler', err);
289
+ if (response.data.success) {
290
+ console.log('lil123123123ili')
291
+ if (state.display === 'npm' || true) {
292
+ dispatch('loginSetup', { ...response, isModal: data.isModal });
293
+ await dispatch('getLoggedInAccounts');
294
+ }
295
+
296
+ dispatch('loginSuccess', { ...response, isModal: data.isModal });
297
+
298
+ return true;
299
+ }
300
+ },
301
+ loginSuccess({ commit, state, dispatch, getters }, response) {
302
+ if (state.display === "redirect") {
303
+ if (state.redirect_uri &&
304
+ !state.allowedOrigins.some((domain) =>
305
+ state.redirect_uri.startsWith(domain)
306
+ )
307
+ ) {
308
+ return console.error("Redirect URI not allowed");
309
+ }
310
+
311
+ return router.push('/account');
312
+
313
+ location.href = state.redirect_uri +
314
+ "?code=" +
315
+ response.data.auth_code +
316
+ "&state=" +
317
+ state.state;
318
+ } else if (state.display === "popup") {
319
+ state.allowedOrigins.forEach((domain) => {
320
+ window.parent?.postMessage(
321
+ { code: response.data.auth_code, state: state.state },
322
+ domain
323
+ );
324
+ });
325
+ } else if (state.display === 'npm') {
326
+ EventBus.$emit('ssoEvent', {name: 'setLoading', data: true})
327
+ EventBus.$emit("ssoEvent", { name: "setStorage", data: state.$storex });
328
+ EventBus.$emit("ssoEvent", { name: "getUser", data: {username: response.data.data.username} });
329
+
330
+ commit('setLoggedInAccounts', [
331
+ {
332
+ id: response.data.data.id,
333
+ username: response.data.data.username,
334
+ refreshToken: response.data.refreshToken,
335
+ photo: response.data.data.photo,
336
+ },
337
+ ]);
338
+
339
+ if (response.isModal) {
340
+ dispatch('successSnack', state.ssoLang[getters.appLanguage].success_login);
341
+ setTimeout(() => {
342
+ location.reload();
343
+ }, 1500);
344
+ }
345
+ }
346
+ },
347
+ async register({ commit, dispatch }, data) {
348
+ const [err, response] = await to(
349
+ AuthService.register(data)
350
+ );
351
+ if (err) return dispatch('errorHandler', err);
352
+ return response;
353
+ },
354
+ async verify({ commit, dispatch }, data) {
355
+ const [err, response] = await to(AuthService.verify(data));
356
+ if (err) return dispatch('errorHandler', err);
357
+ return response;
358
+ },
359
+ async reset({ commit, state, getters, dispatch }, data) {
360
+ const [err, response] = await to(
361
+ AuthService.sendResetEmail(data)
362
+ );
363
+ if (err) return dispatch('errorHandler', err);
364
+ if (response.data.success) {
365
+ dispatch('successSnack', state.ssoLang[getters.appLanguage].password_reset_success);
366
+ }
367
+ },
368
+ async exchangeAuthCode({ commit, dispatch }, data) {
369
+ const [err, response] = await to(AuthService.exchangeAuthCode(data));
370
+ if (err) return dispatch('errorHandler', err);
371
+ await commit('loginSetup', response);
372
+ await commit('getLoggedInAccounts');
373
+ commit('loginSuccess', response);
374
+ },
375
+ async changePassword({ commit, dispatch }, data) {
376
+ const [err, response] = await to(
377
+ AuthService.changePassword(data)
378
+ );
379
+ if (err) return dispatch('errorHandler', err);
380
+ return response.data.success;
381
+ },
382
+ async newPassword({ commit, dispatch }, data) {
383
+ const [err, response] = await to(
384
+ UserService.newPassword(data)
385
+ );
386
+ if (err) return dispatch('errorHandler', err);
387
+ return response.data.success;
388
+ },
389
+ async deleteAccount({ commit, dispatch }, data) {
390
+ const [err, response] = await to(
391
+ UserService.deleteAccount(data)
392
+ );
393
+ if (err) return dispatch('errorHandler', err);
394
+ return response.data.success;
395
+ },
396
+ async registerDevice({ commit, dispatch }) {
397
+ const deviceID = await Device.getId();
398
+ const deviceInfo = await Device.getInfo();
399
+ let deviceData = {
400
+ device_id: deviceID.uuid,
401
+ platform: deviceInfo.platform,
402
+ device_info: {
403
+ model: deviceInfo.model,
404
+ manufacturer: deviceInfo.manufacturer,
405
+ operatingSystem: deviceInfo.operatingSystem,
406
+ osVersion: deviceInfo.osVersion,
407
+ isVirtual: deviceInfo.isVirtual,
408
+ webViewVersion: deviceInfo.webViewVersion,
409
+ },
410
+ };
411
+ const [err, response] = await to(
412
+ DeviceService.registerDevice(deviceData)
413
+ );
414
+ if (err) return dispatch('errorHandler', err);
415
+ return response;
416
+ },
417
+ async addFcmToken({ commit, dispatch }, data) {
418
+ const [err, response] = await to(
419
+ DeviceService.addFcmToken(data)
420
+ );
421
+ if (err) return dispatch('errorHandler', err);
422
+ return response;
423
+ },
424
+ async acceptCompanyInvitation({ commit, dispatch }, code) {
425
+ const [err, response] = await to(
426
+ CompanyService.acceptCompanyInvitation(code)
427
+ );
428
+ if (err) return dispatch('errorHandler', err);
429
+ return response;
430
+ },
431
+ async logout({ commit, dispatch, state }, { refreshToken, sendRequest = true }) {
432
+ if (sendRequest && refreshToken) {
433
+ AuthService.logout({ token: refreshToken });
434
+ }
435
+
436
+ if (state.$storex) {
437
+ state.$storex.username = '';
438
+ state.$storex.UserId = '';
439
+ state.$storex.localUser = '';
440
+ commit('setToken', '');
441
+ }
442
+ commit('setLoggedInUserId', '');
443
+
444
+ const remainingRefreshTokens = commit('unsetRefreshToken', refreshToken);
445
+
446
+ if (remainingRefreshTokens.length >= 1) {
447
+ Object.keys(state.loggedInAccounts).forEach((username) => {
448
+ if (state.loggedInAccounts[username].refreshToken === remainingRefreshTokens[0]) {
449
+
450
+ dispatch('refreshTokenAction', state.loggedInAccounts[username]).then(() => {
451
+ commit('setLoggedInUserId', state.loggedInAccounts[username].id);
452
+ if (state.$storex) {
453
+ state.$storex.username = username;
454
+ state.$storex.UserId = state.loggedInAccounts[username].id;
455
+ }
456
+ dispatch('getLoggedInAccounts');
457
+ });
458
+ }
459
+ });
460
+ }
461
+ },
462
+ async getCompanyBySSOEmail({ commit, dispatch }, data) {
463
+ const [err, response] = await to(
464
+ CompanyService.getBySSOEmail(data.email)
465
+ );
466
+ if (err) return dispatch('errorHandler', err);
467
+ if (response.data.success) {
468
+ return response.data;
469
+ }
470
+ },
471
+ async getLoggedInAccounts({ commit, state, dispatch }, refreshTokens) {
472
+ if (!refreshTokens) refreshTokens = dispatch('getRefreshTokens');
473
+ if (refreshTokens && refreshTokens.length >= 1) {
474
+ const [err, response] = await to(
475
+ AuthService.getLoggedInAccounts({ refreshTokens })
476
+ );
477
+ if (err) return dispatch('errorHandler', err);
478
+ if (response && response.data && response.data.success) {
479
+ commit('setLoggedInAccounts', response.data.accounts);
480
+ }
481
+ }
482
+ },
483
+ async loginUsingQR({ commit, dispatch }, data) {
484
+ const [err, response] = await to(
485
+ UserService.loginUsingQR(data)
486
+ );
487
+ if (err) return dispatch('errorHandler', err);
488
+ return response.data.success;
489
+ },
490
+ setLoggedInAccounts({ commit }, accounts) {
491
+ let loggedInAccounts = {};
492
+ accounts.forEach((account) => {
493
+ loggedInAccounts[account.username] = account;
494
+ });
495
+ commit('setLoggedInAccounts', loggedInAccounts);
496
+ },
497
+ setLoggedInUserId({ commit }, id) {
498
+ commit('setLoggedInUserId', id);
499
+ },
500
+ getRefreshTokens({ state }) {
501
+ if (state.$storex && state.$storex.refreshTokens) return state.$storex.refreshTokens.split(',')
502
+ else return [];
503
+ },
504
+ setRefreshToken({ commit }, token) {
505
+ commit('setRefreshToken', token);
506
+ },
507
+ unsetRefreshToken({ commit, state, dispatch }, refreshToken) {
508
+ let refreshTokens = dispatch('getRefreshTokens');
509
+
510
+ // Remove the specified refresh token from the list
511
+ refreshTokens = refreshTokens?.filter((t) => t !== refreshToken);
512
+
513
+ // Update the refresh tokens in the state
514
+ commit('setRefreshToken', refreshTokens.join(","));
515
+ },
516
+ setToken({ commit }, token) {
517
+ commit('setToken', token);
518
+ },
519
+ setUserID({ commit }, userID) {
520
+ commit('setUserID', userID);
521
+ },
522
+ updateLang({ commit }, lang) {
523
+ commit('updateLang', lang);
524
+ },
525
+ setView({ commit }, view) {
526
+ commit('setView', view);
527
+ },
528
+ setRedirectUri({ commit }, uri) {
529
+ commit('setRedirectUri', uri);
530
+ },
531
+ setDisplay({ commit }, display) {
532
+ commit('setDisplay', display);
533
+ },
534
+ setState({ commit }, stateValue) {
535
+ commit('setState', stateValue);
536
+ },
537
+ setResponseType({ commit }, responseType) {
538
+ commit('setResponseType', responseType);
539
+ },
540
+ setRealm({ commit }, realm) {
541
+ commit('setRealm', realm);
542
+ },
543
+ },
544
+ getters: {
545
+ isLoggedIn: state => {
546
+ return !!state.$storex.token && state.$storex.token !== "" && state.$storex.token !== "null";
547
+ },
548
+ renderView: state => {
549
+ if (state.display === "redirect") {
550
+ return false;
551
+ } else return state.view;
552
+ },
553
+ appRealm: state => {
554
+ return state.realm;
555
+ },
556
+ appLanguage: state => {
557
+ return state.lang;
558
+ },
559
+ accessToken: state => {
560
+ return state.$storex.token;
561
+ },
562
+ refreshTokens: state => {
563
+ return state.$storex.refreshTokens.split(',')
564
+ },
565
+ apiRoot: state => {
566
+ return state.apiRoot || process.env.VUE_APP_API_ROOT;
567
+ }
568
+ }
569
+ };