@b3dotfun/sdk 0.0.81-alpha.1 → 0.0.81
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/cjs/global-account/react/components/SignInWithB3/SignInWithB3Flow.js +1 -1
- package/dist/cjs/global-account/react/hooks/useUserQuery.d.ts +2 -2
- package/dist/cjs/global-account/react/hooks/useUserQuery.js +55 -76
- package/dist/esm/global-account/react/components/SignInWithB3/SignInWithB3Flow.js +1 -1
- package/dist/esm/global-account/react/hooks/useUserQuery.d.ts +2 -2
- package/dist/esm/global-account/react/hooks/useUserQuery.js +55 -76
- package/dist/types/global-account/react/hooks/useUserQuery.d.ts +2 -2
- package/package.json +1 -1
- package/src/global-account/react/components/SignInWithB3/SignInWithB3Flow.tsx +1 -1
- package/src/global-account/react/hooks/useUserQuery.ts +54 -82
|
@@ -165,7 +165,7 @@ function SignInWithB3Flow({ strategies, onLoginSuccess, onSessionKeySuccess, onE
|
|
|
165
165
|
isOpen,
|
|
166
166
|
source,
|
|
167
167
|
});
|
|
168
|
-
if (isConnected && isAuthenticated
|
|
168
|
+
if (isConnected && isAuthenticated) {
|
|
169
169
|
// Mark that login just completed BEFORE opening manage account or closing modal
|
|
170
170
|
// This allows Turnkey modal to show (if enableTurnkey is true)
|
|
171
171
|
if (closeAfterLogin) {
|
|
@@ -2,7 +2,7 @@ import { Users } from "@b3dotfun/b3-api";
|
|
|
2
2
|
/**
|
|
3
3
|
* NOTE: THIS IS ONLY MEANT FOR INTERNAL USE, from useOnConnect
|
|
4
4
|
*
|
|
5
|
-
* Custom hook to manage user state with
|
|
5
|
+
* Custom hook to manage user state with react-query
|
|
6
6
|
* This allows for invalidation and refetching of user data
|
|
7
7
|
*/
|
|
8
8
|
export declare function useUserQuery(): {
|
|
@@ -59,7 +59,7 @@ export declare function useUserQuery(): {
|
|
|
59
59
|
};
|
|
60
60
|
} | undefined;
|
|
61
61
|
setUser: (newUser?: Users) => void;
|
|
62
|
-
refetchUser: () => Promise<
|
|
62
|
+
refetchUser: () => Promise<void>;
|
|
63
63
|
clearUser: () => void;
|
|
64
64
|
queryKey: string[];
|
|
65
65
|
};
|
|
@@ -2,100 +2,79 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.useUserQuery = useUserQuery;
|
|
4
4
|
const debug_1 = require("../../../shared/utils/debug");
|
|
5
|
-
const
|
|
6
|
-
const zustand_1 = require("zustand");
|
|
7
|
-
const middleware_1 = require("zustand/middleware");
|
|
5
|
+
const react_query_1 = require("@tanstack/react-query");
|
|
8
6
|
const debug = (0, debug_1.debugB3React)("useUserQuery");
|
|
9
7
|
const USER_QUERY_KEY = ["b3-user"];
|
|
10
8
|
/**
|
|
11
|
-
*
|
|
12
|
-
* Persists user data to localStorage
|
|
9
|
+
* Retrieves the user from localStorage
|
|
13
10
|
*/
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
11
|
+
function getUserFromStorage() {
|
|
12
|
+
if (typeof window === "undefined") {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
const storedUser = localStorage.getItem("b3-user");
|
|
17
|
+
return storedUser ? JSON.parse(storedUser) : null;
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
console.warn("Failed to restore user from localStorage:", error);
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Saves user to localStorage
|
|
26
|
+
*/
|
|
27
|
+
function saveUserToStorage(user) {
|
|
28
|
+
if (typeof window === "undefined") {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (user) {
|
|
32
|
+
localStorage.setItem("b3-user", JSON.stringify(user));
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
localStorage.removeItem("b3-user");
|
|
36
|
+
}
|
|
37
|
+
}
|
|
33
38
|
/**
|
|
34
39
|
* NOTE: THIS IS ONLY MEANT FOR INTERNAL USE, from useOnConnect
|
|
35
40
|
*
|
|
36
|
-
* Custom hook to manage user state with
|
|
41
|
+
* Custom hook to manage user state with react-query
|
|
37
42
|
* This allows for invalidation and refetching of user data
|
|
38
43
|
*/
|
|
39
44
|
function useUserQuery() {
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
useUserStore.setState({ user: null });
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
window.addEventListener("storage", handleStorageChange);
|
|
66
|
-
return () => {
|
|
67
|
-
window.removeEventListener("storage", handleStorageChange);
|
|
68
|
-
};
|
|
69
|
-
}, []);
|
|
45
|
+
const queryClient = (0, react_query_1.useQueryClient)();
|
|
46
|
+
// Query to get user data (primarily from cache/localStorage)
|
|
47
|
+
const { data: user } = (0, react_query_1.useQuery)({
|
|
48
|
+
queryKey: USER_QUERY_KEY,
|
|
49
|
+
queryFn: getUserFromStorage,
|
|
50
|
+
staleTime: Infinity, // User data doesn't go stale automatically
|
|
51
|
+
gcTime: Infinity, // Keep in cache indefinitely
|
|
52
|
+
initialData: getUserFromStorage,
|
|
53
|
+
});
|
|
54
|
+
// Mutation to update user
|
|
55
|
+
const setUserMutation = (0, react_query_1.useMutation)({
|
|
56
|
+
mutationFn: async (newUser) => {
|
|
57
|
+
const userToSave = newUser ?? null;
|
|
58
|
+
saveUserToStorage(userToSave);
|
|
59
|
+
return userToSave;
|
|
60
|
+
},
|
|
61
|
+
onSuccess: data => {
|
|
62
|
+
queryClient.setQueryData(USER_QUERY_KEY, data);
|
|
63
|
+
debug("User updated", data);
|
|
64
|
+
},
|
|
65
|
+
});
|
|
70
66
|
// Helper function to set user (maintains backward compatibility)
|
|
71
67
|
const setUser = (newUser) => {
|
|
72
|
-
|
|
68
|
+
setUserMutation.mutate(newUser);
|
|
73
69
|
};
|
|
74
70
|
// Helper function to invalidate and refetch user
|
|
75
71
|
const refetchUser = async () => {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
const stored = localStorage.getItem("b3-user");
|
|
79
|
-
if (stored) {
|
|
80
|
-
try {
|
|
81
|
-
const parsed = JSON.parse(stored);
|
|
82
|
-
// Zustand persist format: { state: { user: ... }, version: ... }
|
|
83
|
-
const userData = parsed?.state?.user ?? parsed?.user ?? null;
|
|
84
|
-
useUserStore.setState({ user: userData });
|
|
85
|
-
return userData ?? undefined;
|
|
86
|
-
}
|
|
87
|
-
catch (error) {
|
|
88
|
-
console.warn("Failed to refetch user from localStorage:", error);
|
|
89
|
-
// Fallback to current store state
|
|
90
|
-
return useUserStore.getState().user ?? undefined;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
useUserStore.setState({ user: null });
|
|
94
|
-
return undefined;
|
|
72
|
+
await queryClient.invalidateQueries({ queryKey: USER_QUERY_KEY });
|
|
73
|
+
return queryClient.refetchQueries({ queryKey: USER_QUERY_KEY });
|
|
95
74
|
};
|
|
96
75
|
// Helper function to clear user
|
|
97
76
|
const clearUser = () => {
|
|
98
|
-
|
|
77
|
+
setUser(undefined);
|
|
99
78
|
};
|
|
100
79
|
return {
|
|
101
80
|
user: user ?? undefined,
|
|
@@ -162,7 +162,7 @@ export function SignInWithB3Flow({ strategies, onLoginSuccess, onSessionKeySucce
|
|
|
162
162
|
isOpen,
|
|
163
163
|
source,
|
|
164
164
|
});
|
|
165
|
-
if (isConnected && isAuthenticated
|
|
165
|
+
if (isConnected && isAuthenticated) {
|
|
166
166
|
// Mark that login just completed BEFORE opening manage account or closing modal
|
|
167
167
|
// This allows Turnkey modal to show (if enableTurnkey is true)
|
|
168
168
|
if (closeAfterLogin) {
|
|
@@ -2,7 +2,7 @@ import { Users } from "@b3dotfun/b3-api";
|
|
|
2
2
|
/**
|
|
3
3
|
* NOTE: THIS IS ONLY MEANT FOR INTERNAL USE, from useOnConnect
|
|
4
4
|
*
|
|
5
|
-
* Custom hook to manage user state with
|
|
5
|
+
* Custom hook to manage user state with react-query
|
|
6
6
|
* This allows for invalidation and refetching of user data
|
|
7
7
|
*/
|
|
8
8
|
export declare function useUserQuery(): {
|
|
@@ -59,7 +59,7 @@ export declare function useUserQuery(): {
|
|
|
59
59
|
};
|
|
60
60
|
} | undefined;
|
|
61
61
|
setUser: (newUser?: Users) => void;
|
|
62
|
-
refetchUser: () => Promise<
|
|
62
|
+
refetchUser: () => Promise<void>;
|
|
63
63
|
clearUser: () => void;
|
|
64
64
|
queryKey: string[];
|
|
65
65
|
};
|
|
@@ -1,98 +1,77 @@
|
|
|
1
1
|
import { debugB3React } from "../../../shared/utils/debug.js";
|
|
2
|
-
import {
|
|
3
|
-
import { create } from "zustand";
|
|
4
|
-
import { persist } from "zustand/middleware";
|
|
2
|
+
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
5
3
|
const debug = debugB3React("useUserQuery");
|
|
6
4
|
const USER_QUERY_KEY = ["b3-user"];
|
|
7
5
|
/**
|
|
8
|
-
*
|
|
9
|
-
* Persists user data to localStorage
|
|
6
|
+
* Retrieves the user from localStorage
|
|
10
7
|
*/
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
8
|
+
function getUserFromStorage() {
|
|
9
|
+
if (typeof window === "undefined") {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
try {
|
|
13
|
+
const storedUser = localStorage.getItem("b3-user");
|
|
14
|
+
return storedUser ? JSON.parse(storedUser) : null;
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
console.warn("Failed to restore user from localStorage:", error);
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Saves user to localStorage
|
|
23
|
+
*/
|
|
24
|
+
function saveUserToStorage(user) {
|
|
25
|
+
if (typeof window === "undefined") {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (user) {
|
|
29
|
+
localStorage.setItem("b3-user", JSON.stringify(user));
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
localStorage.removeItem("b3-user");
|
|
33
|
+
}
|
|
34
|
+
}
|
|
30
35
|
/**
|
|
31
36
|
* NOTE: THIS IS ONLY MEANT FOR INTERNAL USE, from useOnConnect
|
|
32
37
|
*
|
|
33
|
-
* Custom hook to manage user state with
|
|
38
|
+
* Custom hook to manage user state with react-query
|
|
34
39
|
* This allows for invalidation and refetching of user data
|
|
35
40
|
*/
|
|
36
41
|
export function useUserQuery() {
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
useUserStore.setState({ user: null });
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
};
|
|
62
|
-
window.addEventListener("storage", handleStorageChange);
|
|
63
|
-
return () => {
|
|
64
|
-
window.removeEventListener("storage", handleStorageChange);
|
|
65
|
-
};
|
|
66
|
-
}, []);
|
|
42
|
+
const queryClient = useQueryClient();
|
|
43
|
+
// Query to get user data (primarily from cache/localStorage)
|
|
44
|
+
const { data: user } = useQuery({
|
|
45
|
+
queryKey: USER_QUERY_KEY,
|
|
46
|
+
queryFn: getUserFromStorage,
|
|
47
|
+
staleTime: Infinity, // User data doesn't go stale automatically
|
|
48
|
+
gcTime: Infinity, // Keep in cache indefinitely
|
|
49
|
+
initialData: getUserFromStorage,
|
|
50
|
+
});
|
|
51
|
+
// Mutation to update user
|
|
52
|
+
const setUserMutation = useMutation({
|
|
53
|
+
mutationFn: async (newUser) => {
|
|
54
|
+
const userToSave = newUser ?? null;
|
|
55
|
+
saveUserToStorage(userToSave);
|
|
56
|
+
return userToSave;
|
|
57
|
+
},
|
|
58
|
+
onSuccess: data => {
|
|
59
|
+
queryClient.setQueryData(USER_QUERY_KEY, data);
|
|
60
|
+
debug("User updated", data);
|
|
61
|
+
},
|
|
62
|
+
});
|
|
67
63
|
// Helper function to set user (maintains backward compatibility)
|
|
68
64
|
const setUser = (newUser) => {
|
|
69
|
-
|
|
65
|
+
setUserMutation.mutate(newUser);
|
|
70
66
|
};
|
|
71
67
|
// Helper function to invalidate and refetch user
|
|
72
68
|
const refetchUser = async () => {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
const stored = localStorage.getItem("b3-user");
|
|
76
|
-
if (stored) {
|
|
77
|
-
try {
|
|
78
|
-
const parsed = JSON.parse(stored);
|
|
79
|
-
// Zustand persist format: { state: { user: ... }, version: ... }
|
|
80
|
-
const userData = parsed?.state?.user ?? parsed?.user ?? null;
|
|
81
|
-
useUserStore.setState({ user: userData });
|
|
82
|
-
return userData ?? undefined;
|
|
83
|
-
}
|
|
84
|
-
catch (error) {
|
|
85
|
-
console.warn("Failed to refetch user from localStorage:", error);
|
|
86
|
-
// Fallback to current store state
|
|
87
|
-
return useUserStore.getState().user ?? undefined;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
useUserStore.setState({ user: null });
|
|
91
|
-
return undefined;
|
|
69
|
+
await queryClient.invalidateQueries({ queryKey: USER_QUERY_KEY });
|
|
70
|
+
return queryClient.refetchQueries({ queryKey: USER_QUERY_KEY });
|
|
92
71
|
};
|
|
93
72
|
// Helper function to clear user
|
|
94
73
|
const clearUser = () => {
|
|
95
|
-
|
|
74
|
+
setUser(undefined);
|
|
96
75
|
};
|
|
97
76
|
return {
|
|
98
77
|
user: user ?? undefined,
|
|
@@ -2,7 +2,7 @@ import { Users } from "@b3dotfun/b3-api";
|
|
|
2
2
|
/**
|
|
3
3
|
* NOTE: THIS IS ONLY MEANT FOR INTERNAL USE, from useOnConnect
|
|
4
4
|
*
|
|
5
|
-
* Custom hook to manage user state with
|
|
5
|
+
* Custom hook to manage user state with react-query
|
|
6
6
|
* This allows for invalidation and refetching of user data
|
|
7
7
|
*/
|
|
8
8
|
export declare function useUserQuery(): {
|
|
@@ -59,7 +59,7 @@ export declare function useUserQuery(): {
|
|
|
59
59
|
};
|
|
60
60
|
} | undefined;
|
|
61
61
|
setUser: (newUser?: Users) => void;
|
|
62
|
-
refetchUser: () => Promise<
|
|
62
|
+
refetchUser: () => Promise<void>;
|
|
63
63
|
clearUser: () => void;
|
|
64
64
|
queryKey: string[];
|
|
65
65
|
};
|
package/package.json
CHANGED
|
@@ -198,7 +198,7 @@ export function SignInWithB3Flow({
|
|
|
198
198
|
source,
|
|
199
199
|
});
|
|
200
200
|
|
|
201
|
-
if (isConnected && isAuthenticated
|
|
201
|
+
if (isConnected && isAuthenticated) {
|
|
202
202
|
// Mark that login just completed BEFORE opening manage account or closing modal
|
|
203
203
|
// This allows Turnkey modal to show (if enableTurnkey is true)
|
|
204
204
|
if (closeAfterLogin) {
|
|
@@ -1,116 +1,88 @@
|
|
|
1
1
|
import { Users } from "@b3dotfun/b3-api";
|
|
2
2
|
import { debugB3React } from "@b3dotfun/sdk/shared/utils/debug";
|
|
3
|
-
import {
|
|
4
|
-
import { create } from "zustand";
|
|
5
|
-
import { persist } from "zustand/middleware";
|
|
3
|
+
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
6
4
|
|
|
7
5
|
const debug = debugB3React("useUserQuery");
|
|
8
6
|
|
|
9
7
|
const USER_QUERY_KEY = ["b3-user"];
|
|
10
8
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
/**
|
|
10
|
+
* Retrieves the user from localStorage
|
|
11
|
+
*/
|
|
12
|
+
function getUserFromStorage(): Users | null {
|
|
13
|
+
if (typeof window === "undefined") {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
try {
|
|
18
|
+
const storedUser = localStorage.getItem("b3-user");
|
|
19
|
+
return storedUser ? JSON.parse(storedUser) : null;
|
|
20
|
+
} catch (error) {
|
|
21
|
+
console.warn("Failed to restore user from localStorage:", error);
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
15
24
|
}
|
|
16
25
|
|
|
17
26
|
/**
|
|
18
|
-
*
|
|
19
|
-
* Persists user data to localStorage
|
|
27
|
+
* Saves user to localStorage
|
|
20
28
|
*/
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
debug("User cleared");
|
|
33
|
-
},
|
|
34
|
-
}),
|
|
35
|
-
{
|
|
36
|
-
name: "b3-user",
|
|
37
|
-
onRehydrateStorage: () => (_, error) => {
|
|
38
|
-
if (error) {
|
|
39
|
-
console.warn("Failed to rehydrate user store:", error);
|
|
40
|
-
}
|
|
41
|
-
},
|
|
42
|
-
},
|
|
43
|
-
),
|
|
44
|
-
);
|
|
29
|
+
function saveUserToStorage(user: Users | null) {
|
|
30
|
+
if (typeof window === "undefined") {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (user) {
|
|
35
|
+
localStorage.setItem("b3-user", JSON.stringify(user));
|
|
36
|
+
} else {
|
|
37
|
+
localStorage.removeItem("b3-user");
|
|
38
|
+
}
|
|
39
|
+
}
|
|
45
40
|
|
|
46
41
|
/**
|
|
47
42
|
* NOTE: THIS IS ONLY MEANT FOR INTERNAL USE, from useOnConnect
|
|
48
43
|
*
|
|
49
|
-
* Custom hook to manage user state with
|
|
44
|
+
* Custom hook to manage user state with react-query
|
|
50
45
|
* This allows for invalidation and refetching of user data
|
|
51
46
|
*/
|
|
52
47
|
export function useUserQuery() {
|
|
53
|
-
const
|
|
54
|
-
const setUserStore = useUserStore(state => state.setUser);
|
|
55
|
-
const clearUserStore = useUserStore(state => state.clearUser);
|
|
48
|
+
const queryClient = useQueryClient();
|
|
56
49
|
|
|
57
|
-
//
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const parsed = JSON.parse(stored);
|
|
66
|
-
// Zustand persist format: { state: { user: ... }, version: ... }
|
|
67
|
-
const userData = parsed?.state?.user ?? parsed?.user ?? null;
|
|
68
|
-
useUserStore.setState({ user: userData });
|
|
69
|
-
} catch (error) {
|
|
70
|
-
console.warn("Failed to parse user from storage event:", error);
|
|
71
|
-
}
|
|
72
|
-
} else {
|
|
73
|
-
useUserStore.setState({ user: null });
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
};
|
|
50
|
+
// Query to get user data (primarily from cache/localStorage)
|
|
51
|
+
const { data: user } = useQuery<Users | null>({
|
|
52
|
+
queryKey: USER_QUERY_KEY,
|
|
53
|
+
queryFn: getUserFromStorage,
|
|
54
|
+
staleTime: Infinity, // User data doesn't go stale automatically
|
|
55
|
+
gcTime: Infinity, // Keep in cache indefinitely
|
|
56
|
+
initialData: getUserFromStorage,
|
|
57
|
+
});
|
|
77
58
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
59
|
+
// Mutation to update user
|
|
60
|
+
const setUserMutation = useMutation({
|
|
61
|
+
mutationFn: async (newUser: Users | undefined) => {
|
|
62
|
+
const userToSave = newUser ?? null;
|
|
63
|
+
saveUserToStorage(userToSave);
|
|
64
|
+
return userToSave;
|
|
65
|
+
},
|
|
66
|
+
onSuccess: data => {
|
|
67
|
+
queryClient.setQueryData(USER_QUERY_KEY, data);
|
|
68
|
+
debug("User updated", data);
|
|
69
|
+
},
|
|
70
|
+
});
|
|
83
71
|
|
|
84
72
|
// Helper function to set user (maintains backward compatibility)
|
|
85
73
|
const setUser = (newUser?: Users) => {
|
|
86
|
-
|
|
74
|
+
setUserMutation.mutate(newUser);
|
|
87
75
|
};
|
|
88
76
|
|
|
89
77
|
// Helper function to invalidate and refetch user
|
|
90
78
|
const refetchUser = async () => {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
const stored = localStorage.getItem("b3-user");
|
|
94
|
-
if (stored) {
|
|
95
|
-
try {
|
|
96
|
-
const parsed = JSON.parse(stored);
|
|
97
|
-
// Zustand persist format: { state: { user: ... }, version: ... }
|
|
98
|
-
const userData = parsed?.state?.user ?? parsed?.user ?? null;
|
|
99
|
-
useUserStore.setState({ user: userData });
|
|
100
|
-
return userData ?? undefined;
|
|
101
|
-
} catch (error) {
|
|
102
|
-
console.warn("Failed to refetch user from localStorage:", error);
|
|
103
|
-
// Fallback to current store state
|
|
104
|
-
return useUserStore.getState().user ?? undefined;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
useUserStore.setState({ user: null });
|
|
108
|
-
return undefined;
|
|
79
|
+
await queryClient.invalidateQueries({ queryKey: USER_QUERY_KEY });
|
|
80
|
+
return queryClient.refetchQueries({ queryKey: USER_QUERY_KEY });
|
|
109
81
|
};
|
|
110
82
|
|
|
111
83
|
// Helper function to clear user
|
|
112
84
|
const clearUser = () => {
|
|
113
|
-
|
|
85
|
+
setUser(undefined);
|
|
114
86
|
};
|
|
115
87
|
|
|
116
88
|
return {
|