@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.
@@ -165,7 +165,7 @@ function SignInWithB3Flow({ strategies, onLoginSuccess, onSessionKeySuccess, onE
165
165
  isOpen,
166
166
  source,
167
167
  });
168
- if (isConnected && isAuthenticated && user) {
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 Zustand
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<any>;
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 react_1 = require("react");
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
- * Zustand store for managing user state
12
- * Persists user data to localStorage
9
+ * Retrieves the user from localStorage
13
10
  */
14
- const useUserStore = (0, zustand_1.create)()((0, middleware_1.persist)(set => ({
15
- user: null,
16
- setUser: (newUser) => {
17
- const userToSave = newUser ?? null;
18
- set({ user: userToSave });
19
- debug("User updated", userToSave);
20
- },
21
- clearUser: () => {
22
- set({ user: null });
23
- debug("User cleared");
24
- },
25
- }), {
26
- name: "b3-user",
27
- onRehydrateStorage: () => (_, error) => {
28
- if (error) {
29
- console.warn("Failed to rehydrate user store:", error);
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 Zustand
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 user = useUserStore(state => state.user);
41
- const setUserStore = useUserStore(state => state.setUser);
42
- const clearUserStore = useUserStore(state => state.clearUser);
43
- // Listen for storage events from other tabs/windows
44
- (0, react_1.useEffect)(() => {
45
- const handleStorageChange = (e) => {
46
- if (e.key === "b3-user") {
47
- // Sync with changes from other tabs/windows
48
- const stored = e.newValue;
49
- if (stored) {
50
- try {
51
- const parsed = JSON.parse(stored);
52
- // Zustand persist format: { state: { user: ... }, version: ... }
53
- const userData = parsed?.state?.user ?? parsed?.user ?? null;
54
- useUserStore.setState({ user: userData });
55
- }
56
- catch (error) {
57
- console.warn("Failed to parse user from storage event:", error);
58
- }
59
- }
60
- else {
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
- setUserStore(newUser);
68
+ setUserMutation.mutate(newUser);
73
69
  };
74
70
  // Helper function to invalidate and refetch user
75
71
  const refetchUser = async () => {
76
- // Re-read from localStorage and update store
77
- // Zustand persist stores data as { state: { user: ... }, version: ... }
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
- clearUserStore();
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 && user) {
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 Zustand
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<any>;
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 { useEffect } from "react";
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
- * Zustand store for managing user state
9
- * Persists user data to localStorage
6
+ * Retrieves the user from localStorage
10
7
  */
11
- const useUserStore = create()(persist(set => ({
12
- user: null,
13
- setUser: (newUser) => {
14
- const userToSave = newUser ?? null;
15
- set({ user: userToSave });
16
- debug("User updated", userToSave);
17
- },
18
- clearUser: () => {
19
- set({ user: null });
20
- debug("User cleared");
21
- },
22
- }), {
23
- name: "b3-user",
24
- onRehydrateStorage: () => (_, error) => {
25
- if (error) {
26
- console.warn("Failed to rehydrate user store:", error);
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 Zustand
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 user = useUserStore(state => state.user);
38
- const setUserStore = useUserStore(state => state.setUser);
39
- const clearUserStore = useUserStore(state => state.clearUser);
40
- // Listen for storage events from other tabs/windows
41
- useEffect(() => {
42
- const handleStorageChange = (e) => {
43
- if (e.key === "b3-user") {
44
- // Sync with changes from other tabs/windows
45
- const stored = e.newValue;
46
- if (stored) {
47
- try {
48
- const parsed = JSON.parse(stored);
49
- // Zustand persist format: { state: { user: ... }, version: ... }
50
- const userData = parsed?.state?.user ?? parsed?.user ?? null;
51
- useUserStore.setState({ user: userData });
52
- }
53
- catch (error) {
54
- console.warn("Failed to parse user from storage event:", error);
55
- }
56
- }
57
- else {
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
- setUserStore(newUser);
65
+ setUserMutation.mutate(newUser);
70
66
  };
71
67
  // Helper function to invalidate and refetch user
72
68
  const refetchUser = async () => {
73
- // Re-read from localStorage and update store
74
- // Zustand persist stores data as { state: { user: ... }, version: ... }
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
- clearUserStore();
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 Zustand
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<any>;
62
+ refetchUser: () => Promise<void>;
63
63
  clearUser: () => void;
64
64
  queryKey: string[];
65
65
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@b3dotfun/sdk",
3
- "version": "0.0.81-alpha.1",
3
+ "version": "0.0.81",
4
4
  "source": "src/index.ts",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "react-native": "./dist/cjs/index.native.js",
@@ -198,7 +198,7 @@ export function SignInWithB3Flow({
198
198
  source,
199
199
  });
200
200
 
201
- if (isConnected && isAuthenticated && user) {
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 { useEffect } from "react";
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
- interface UserStore {
12
- user: Users | null;
13
- setUser: (user: Users | undefined) => void;
14
- clearUser: () => void;
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
- * Zustand store for managing user state
19
- * Persists user data to localStorage
27
+ * Saves user to localStorage
20
28
  */
21
- const useUserStore = create<UserStore>()(
22
- persist(
23
- set => ({
24
- user: null,
25
- setUser: (newUser: Users | undefined) => {
26
- const userToSave = newUser ?? null;
27
- set({ user: userToSave });
28
- debug("User updated", userToSave);
29
- },
30
- clearUser: () => {
31
- set({ user: null });
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 Zustand
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 user = useUserStore(state => state.user);
54
- const setUserStore = useUserStore(state => state.setUser);
55
- const clearUserStore = useUserStore(state => state.clearUser);
48
+ const queryClient = useQueryClient();
56
49
 
57
- // Listen for storage events from other tabs/windows
58
- useEffect(() => {
59
- const handleStorageChange = (e: StorageEvent) => {
60
- if (e.key === "b3-user") {
61
- // Sync with changes from other tabs/windows
62
- const stored = e.newValue;
63
- if (stored) {
64
- try {
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
- window.addEventListener("storage", handleStorageChange);
79
- return () => {
80
- window.removeEventListener("storage", handleStorageChange);
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
- setUserStore(newUser);
74
+ setUserMutation.mutate(newUser);
87
75
  };
88
76
 
89
77
  // Helper function to invalidate and refetch user
90
78
  const refetchUser = async () => {
91
- // Re-read from localStorage and update store
92
- // Zustand persist stores data as { state: { user: ... }, version: ... }
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
- clearUserStore();
85
+ setUser(undefined);
114
86
  };
115
87
 
116
88
  return {