@vylth/nexus-react 1.0.1 → 1.0.3

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/index.js CHANGED
@@ -42,6 +42,7 @@ var import_react = require("react");
42
42
  var TOKEN_KEY = "nexus_access_token";
43
43
  var REFRESH_KEY = "nexus_refresh_token";
44
44
  var STATE_KEY = "nexus_oauth_state";
45
+ var PROFILE_KEY = "nexus_user_profile";
45
46
  var memoryAccessToken = null;
46
47
  var memoryRefreshToken = null;
47
48
  var refreshPromise = null;
@@ -68,6 +69,18 @@ function clearTokens() {
68
69
  memoryRefreshToken = null;
69
70
  localStorage.removeItem(TOKEN_KEY);
70
71
  localStorage.removeItem(REFRESH_KEY);
72
+ localStorage.removeItem(PROFILE_KEY);
73
+ }
74
+ function saveUserProfile(firstName, lastName, avatar) {
75
+ localStorage.setItem(PROFILE_KEY, JSON.stringify({ firstName, lastName, avatar }));
76
+ }
77
+ function loadUserProfile() {
78
+ try {
79
+ const raw = localStorage.getItem(PROFILE_KEY);
80
+ return raw ? JSON.parse(raw) : null;
81
+ } catch {
82
+ return null;
83
+ }
71
84
  }
72
85
  function isTokenValid() {
73
86
  const token = getAccessToken();
@@ -82,13 +95,14 @@ function isTokenValid() {
82
95
  function decodeUser(token) {
83
96
  try {
84
97
  const payload = JSON.parse(atob(token.split(".")[1].replace(/-/g, "+").replace(/_/g, "/")));
98
+ const profile = loadUserProfile();
85
99
  return {
86
100
  id: payload.sub,
87
101
  email: payload.email,
88
102
  username: payload.username || "",
89
- firstName: "",
90
- lastName: "",
91
- avatar: payload.avatar || "",
103
+ firstName: profile?.firstName || "",
104
+ lastName: profile?.lastName || "",
105
+ avatar: profile?.avatar || payload.avatar || "",
92
106
  globalRole: payload.global_role || "citizen",
93
107
  emailVerified: payload.email_verified || false,
94
108
  affiliateCode: payload.affiliate_code || "",
@@ -145,6 +159,9 @@ async function doRefresh(apiUrl) {
145
159
  if (res.ok) {
146
160
  const data = await res.json();
147
161
  setTokens(data.access_token, data.refresh_token);
162
+ if (data.investor) {
163
+ saveUserProfile(data.investor.first_name, data.investor.last_name, data.investor.avatar_url || "");
164
+ }
148
165
  return true;
149
166
  }
150
167
  } catch {
@@ -216,6 +233,19 @@ function NexusProvider({
216
233
  if (isTokenValid()) {
217
234
  const decoded = decodeUser(token);
218
235
  if (decoded) {
236
+ if (!decoded.firstName) {
237
+ try {
238
+ const data = await nexusFetch(
239
+ resolvedApiUrl,
240
+ "/account/profile"
241
+ );
242
+ decoded.firstName = data.investor.first_name || "";
243
+ decoded.lastName = data.investor.last_name || "";
244
+ decoded.avatar = data.investor.avatar_url || decoded.avatar;
245
+ saveUserProfile(decoded.firstName, decoded.lastName, decoded.avatar);
246
+ } catch {
247
+ }
248
+ }
219
249
  setUser(decoded);
220
250
  setIsLoading(false);
221
251
  return;
@@ -319,6 +349,7 @@ function NexusCallback({ onSuccess, onError }) {
319
349
  user.lastName = result.investor.last_name;
320
350
  user.avatar = result.investor.avatar_url || user.avatar;
321
351
  user.emailVerified = result.investor.email_verified;
352
+ saveUserProfile(user.firstName, user.lastName, user.avatar);
322
353
  config.setUser(user);
323
354
  }
324
355
  onSuccess?.();
package/dist/index.mjs CHANGED
@@ -5,6 +5,7 @@ import { createContext, useCallback, useEffect, useState } from "react";
5
5
  var TOKEN_KEY = "nexus_access_token";
6
6
  var REFRESH_KEY = "nexus_refresh_token";
7
7
  var STATE_KEY = "nexus_oauth_state";
8
+ var PROFILE_KEY = "nexus_user_profile";
8
9
  var memoryAccessToken = null;
9
10
  var memoryRefreshToken = null;
10
11
  var refreshPromise = null;
@@ -31,6 +32,18 @@ function clearTokens() {
31
32
  memoryRefreshToken = null;
32
33
  localStorage.removeItem(TOKEN_KEY);
33
34
  localStorage.removeItem(REFRESH_KEY);
35
+ localStorage.removeItem(PROFILE_KEY);
36
+ }
37
+ function saveUserProfile(firstName, lastName, avatar) {
38
+ localStorage.setItem(PROFILE_KEY, JSON.stringify({ firstName, lastName, avatar }));
39
+ }
40
+ function loadUserProfile() {
41
+ try {
42
+ const raw = localStorage.getItem(PROFILE_KEY);
43
+ return raw ? JSON.parse(raw) : null;
44
+ } catch {
45
+ return null;
46
+ }
34
47
  }
35
48
  function isTokenValid() {
36
49
  const token = getAccessToken();
@@ -45,13 +58,14 @@ function isTokenValid() {
45
58
  function decodeUser(token) {
46
59
  try {
47
60
  const payload = JSON.parse(atob(token.split(".")[1].replace(/-/g, "+").replace(/_/g, "/")));
61
+ const profile = loadUserProfile();
48
62
  return {
49
63
  id: payload.sub,
50
64
  email: payload.email,
51
65
  username: payload.username || "",
52
- firstName: "",
53
- lastName: "",
54
- avatar: payload.avatar || "",
66
+ firstName: profile?.firstName || "",
67
+ lastName: profile?.lastName || "",
68
+ avatar: profile?.avatar || payload.avatar || "",
55
69
  globalRole: payload.global_role || "citizen",
56
70
  emailVerified: payload.email_verified || false,
57
71
  affiliateCode: payload.affiliate_code || "",
@@ -108,6 +122,9 @@ async function doRefresh(apiUrl) {
108
122
  if (res.ok) {
109
123
  const data = await res.json();
110
124
  setTokens(data.access_token, data.refresh_token);
125
+ if (data.investor) {
126
+ saveUserProfile(data.investor.first_name, data.investor.last_name, data.investor.avatar_url || "");
127
+ }
111
128
  return true;
112
129
  }
113
130
  } catch {
@@ -179,6 +196,19 @@ function NexusProvider({
179
196
  if (isTokenValid()) {
180
197
  const decoded = decodeUser(token);
181
198
  if (decoded) {
199
+ if (!decoded.firstName) {
200
+ try {
201
+ const data = await nexusFetch(
202
+ resolvedApiUrl,
203
+ "/account/profile"
204
+ );
205
+ decoded.firstName = data.investor.first_name || "";
206
+ decoded.lastName = data.investor.last_name || "";
207
+ decoded.avatar = data.investor.avatar_url || decoded.avatar;
208
+ saveUserProfile(decoded.firstName, decoded.lastName, decoded.avatar);
209
+ } catch {
210
+ }
211
+ }
182
212
  setUser(decoded);
183
213
  setIsLoading(false);
184
214
  return;
@@ -282,6 +312,7 @@ function NexusCallback({ onSuccess, onError }) {
282
312
  user.lastName = result.investor.last_name;
283
313
  user.avatar = result.investor.avatar_url || user.avatar;
284
314
  user.emailVerified = result.investor.email_verified;
315
+ saveUserProfile(user.firstName, user.lastName, user.avatar);
285
316
  config.setUser(user);
286
317
  }
287
318
  onSuccess?.();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vylth/nexus-react",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "Nexus SSO SDK for React — Sign in with Nexus",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",