Skip to content

Commit 6db28e2

Browse files
committed
fix: refresh token, export email send
1 parent daf6659 commit 6db28e2

12 files changed

Lines changed: 41 additions & 58 deletions

File tree

‎apps/public-api/src/app.js‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ app.use(standardizeApiResponse);
3333
const projectCorsPreflight = (req, res, next) => {
3434
res.header("Access-Control-Allow-Origin", req.headers.origin || "*");
3535
res.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, PATCH");
36-
res.header("Access-Control-Allow-Headers", "Content-Type, Authorization, x-api-key");
36+
res.header("Access-Control-Allow-Headers", "Content-Type, Authorization, x-api-key, x-refresh-token, x-refresh-token-mode");
3737
res.header("Access-Control-Allow-Credentials", "true");
3838
res.header("Access-Control-Max-Age", "86400"); // Cache preflight for 24 hours
3939
if (req.method === 'OPTIONS') {

‎packages/common/src/utils/emailService.js‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,7 @@ urBackend Team`;
365365
`;
366366

367367
const { data, error } = await resend.emails.send({
368-
from: `"urBackend" <${process.env.EMAIL_FROM || 'onboarding@resend.dev'}>`,
368+
from: "urBackend `<${process.env.EMAIL_FROM || 'onboarding@resend.dev'}>`",
369369
to: to,
370370
subject: subject,
371371
text: textBody,

‎sdks/urbackend-react/dist/index.js‎

Lines changed: 8 additions & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎sdks/urbackend-react/dist/index.js.map‎

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎sdks/urbackend-react/dist/index.mjs‎

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,6 @@ var UrProvider = ({ apiKey, baseUrl, children }) => {
2121
let mounted = true;
2222
const initAuth = async () => {
2323
try {
24-
if (typeof window !== "undefined") {
25-
const savedToken = localStorage.getItem("ur_auth_token");
26-
if (savedToken) auth.setToken(savedToken);
27-
}
2824
const urlParams = new URLSearchParams(window.location.search);
2925
const hashParams = new URLSearchParams(window.location.hash.substring(1));
3026
const token = hashParams.get("token");
@@ -36,12 +32,14 @@ var UrProvider = ({ apiKey, baseUrl, children }) => {
3632
window.history.replaceState({}, document.title, window.location.pathname);
3733
} else if (token) {
3834
auth.setToken(token);
39-
if (typeof window !== "undefined") localStorage.setItem("ur_auth_token", token);
4035
if (rtCode) {
4136
try {
4237
const exRes = await auth.socialExchange({ token, rtCode });
43-
const exToken = exRes.accessToken || exRes.token;
44-
if (exToken && typeof window !== "undefined") localStorage.setItem("ur_auth_token", exToken);
38+
if (exRes?.refreshToken) {
39+
const refreshed = await auth.refreshToken(exRes.refreshToken);
40+
const newAcc = refreshed?.accessToken || refreshed?.token;
41+
if (newAcc) auth.setToken(newAcc);
42+
}
4543
} catch (err) {
4644
console.error("Failed to exchange refresh token", err);
4745
if (mounted) setError(err.message || "Failed to complete social login");
@@ -52,8 +50,8 @@ var UrProvider = ({ apiKey, baseUrl, children }) => {
5250
} else {
5351
try {
5452
const res = await auth.refreshToken();
55-
const newToken = res.accessToken || res.token;
56-
if (newToken && typeof window !== "undefined") localStorage.setItem("ur_auth_token", newToken);
53+
const newToken = res?.accessToken || res?.token;
54+
if (newToken) auth.setToken(newToken);
5755
} catch (e) {
5856
}
5957
}
@@ -62,7 +60,6 @@ var UrProvider = ({ apiKey, baseUrl, children }) => {
6260
setUser(currentUser);
6361
}
6462
} catch (error2) {
65-
console.error("InitAuth Error:", error2);
6663
if (mounted) {
6764
setUser(null);
6865
}
@@ -111,9 +108,7 @@ var useAuth = () => {
111108
try {
112109
setError(null);
113110
setIsLoading(true);
114-
const res = await auth.login(payload);
115-
const token = res.accessToken || res.token;
116-
if (token && typeof window !== "undefined") localStorage.setItem("ur_auth_token", token);
111+
await auth.login(payload);
117112
const currentUser = await auth.me();
118113
setUser(currentUser);
119114
} catch (err) {
@@ -141,7 +136,6 @@ var useAuth = () => {
141136
setError(null);
142137
setIsLoading(true);
143138
await auth.logout();
144-
if (typeof window !== "undefined") localStorage.removeItem("ur_auth_token");
145139
setUser(null);
146140
} catch (err) {
147141
setError(err.message || "Logout failed");

‎sdks/urbackend-react/dist/index.mjs.map‎

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎sdks/urbackend-react/package.json‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@urbackend/react",
3-
"version": "0.2.5",
3+
"version": "0.2.6",
44
"description": "React SDK for urBackend",
55
"publishConfig": {
66
"access": "public"
@@ -21,7 +21,7 @@
2121
"test:watch": "vitest"
2222
},
2323
"dependencies": {
24-
"@urbackend/sdk": "^0.4.5"
24+
"@urbackend/sdk": "^0.4.6"
2525
},
2626
"peerDependencies": {
2727
"react": ">=17.0.0",

‎sdks/urbackend-react/src/context.tsx‎

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,6 @@ export const UrProvider: React.FC<UrProviderProps> = ({ apiKey, baseUrl, childre
4545

4646
const initAuth = async () => {
4747
try {
48-
// Hydrate from localStorage first as a fallback for environments without cookies
49-
if (typeof window !== 'undefined') {
50-
const savedToken = localStorage.getItem('ur_auth_token');
51-
if (savedToken) auth.setToken(savedToken);
52-
}
53-
5448
// Check for social auth callback params
5549
const urlParams = new URLSearchParams(window.location.search);
5650
const hashParams = new URLSearchParams(window.location.hash.substring(1));
@@ -65,14 +59,16 @@ export const UrProvider: React.FC<UrProviderProps> = ({ apiKey, baseUrl, childre
6559
} else if (token) {
6660
// Social auth succeeded, establish session immediately
6761
auth.setToken(token);
68-
if (typeof window !== 'undefined') localStorage.setItem('ur_auth_token', token);
6962

7063
if (rtCode) {
7164
// Exchange for long-lived refresh token
7265
try {
7366
const exRes = await auth.socialExchange({ token, rtCode });
74-
const exToken = (exRes as any).accessToken || (exRes as any).token;
75-
if (exToken && typeof window !== 'undefined') localStorage.setItem('ur_auth_token', exToken);
67+
if (exRes?.refreshToken) {
68+
const refreshed = await auth.refreshToken(exRes.refreshToken);
69+
const newAcc = refreshed?.accessToken || (refreshed as any)?.token;
70+
if (newAcc) auth.setToken(newAcc);
71+
}
7672
} catch (err: any) {
7773
console.error('Failed to exchange refresh token', err);
7874
if (mounted) setError(err.message || 'Failed to complete social login');
@@ -84,10 +80,10 @@ export const UrProvider: React.FC<UrProviderProps> = ({ apiKey, baseUrl, childre
8480
// Attempt to silently refresh session using the HTTP-only cookie
8581
try {
8682
const res = await auth.refreshToken();
87-
const newToken = res.accessToken || (res as any).token;
88-
if (newToken && typeof window !== 'undefined') localStorage.setItem('ur_auth_token', newToken);
83+
const newToken = res?.accessToken || (res as any)?.token;
84+
if (newToken) auth.setToken(newToken);
8985
} catch (e) {
90-
// If refresh fails, me() will catch it
86+
// If refresh fails, user is not logged in / session expired
9187
}
9288
}
9389

@@ -96,7 +92,6 @@ export const UrProvider: React.FC<UrProviderProps> = ({ apiKey, baseUrl, childre
9692
setUser(currentUser);
9793
}
9894
} catch (error: any) {
99-
console.error("InitAuth Error:", error);
10095
if (mounted) {
10196
setUser(null);
10297
// Don't set global error for initial me() check failure (usually just means not logged in)

‎sdks/urbackend-react/src/hooks.ts‎

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,7 @@ export const useAuth = () => {
2020
try {
2121
setError(null);
2222
setIsLoading(true);
23-
const res = await auth.login(payload);
24-
const token = res.accessToken || (res as any).token;
25-
if (token && typeof window !== 'undefined') localStorage.setItem('ur_auth_token', token);
23+
await auth.login(payload);
2624
const currentUser = await auth.me();
2725
setUser(currentUser);
2826
} catch (err: any) {
@@ -52,7 +50,6 @@ export const useAuth = () => {
5250
setError(null);
5351
setIsLoading(true);
5452
await auth.logout();
55-
if (typeof window !== 'undefined') localStorage.removeItem('ur_auth_token');
5653
setUser(null);
5754
} catch (err: any) {
5855
setError(err.message || 'Logout failed');

‎sdks/urbackend-sdk/package.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@urbackend/sdk",
3-
"version": "0.4.5",
3+
"version": "0.4.6",
44
"description": "Official TypeScript SDK for urBackend BaaS",
55
"publishConfig": {
66
"access": "public"

0 commit comments

Comments
 (0)