@b3dotfun/sdk 0.0.80 → 0.0.81-alpha.1

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.
Files changed (25) hide show
  1. package/dist/cjs/anyspend/react/components/AnySpend.js +23 -10
  2. package/dist/cjs/anyspend/react/components/AnySpendCustom.js +22 -6
  3. package/dist/cjs/anyspend/react/components/common/FiatPaymentMethod.d.ts +4 -0
  4. package/dist/cjs/anyspend/react/components/common/FiatPaymentMethod.js +14 -7
  5. package/dist/cjs/anyspend/react/components/common/PanelOnramp.js +7 -1
  6. package/dist/cjs/global-account/react/components/SignInWithB3/SignInWithB3Flow.js +1 -1
  7. package/dist/cjs/global-account/react/hooks/useUserQuery.d.ts +2 -2
  8. package/dist/cjs/global-account/react/hooks/useUserQuery.js +76 -55
  9. package/dist/esm/anyspend/react/components/AnySpend.js +23 -10
  10. package/dist/esm/anyspend/react/components/AnySpendCustom.js +23 -7
  11. package/dist/esm/anyspend/react/components/common/FiatPaymentMethod.d.ts +4 -0
  12. package/dist/esm/anyspend/react/components/common/FiatPaymentMethod.js +13 -6
  13. package/dist/esm/anyspend/react/components/common/PanelOnramp.js +8 -2
  14. package/dist/esm/global-account/react/components/SignInWithB3/SignInWithB3Flow.js +1 -1
  15. package/dist/esm/global-account/react/hooks/useUserQuery.d.ts +2 -2
  16. package/dist/esm/global-account/react/hooks/useUserQuery.js +76 -55
  17. package/dist/types/anyspend/react/components/common/FiatPaymentMethod.d.ts +4 -0
  18. package/dist/types/global-account/react/hooks/useUserQuery.d.ts +2 -2
  19. package/package.json +1 -1
  20. package/src/anyspend/react/components/AnySpend.tsx +24 -10
  21. package/src/anyspend/react/components/AnySpendCustom.tsx +42 -33
  22. package/src/anyspend/react/components/common/FiatPaymentMethod.tsx +14 -6
  23. package/src/anyspend/react/components/common/PanelOnramp.tsx +23 -27
  24. package/src/global-account/react/components/SignInWithB3/SignInWithB3Flow.tsx +1 -1
  25. package/src/global-account/react/hooks/useUserQuery.ts +82 -54
@@ -1,88 +1,116 @@
1
1
  import { Users } from "@b3dotfun/b3-api";
2
2
  import { debugB3React } from "@b3dotfun/sdk/shared/utils/debug";
3
- import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
3
+ import { useEffect } from "react";
4
+ import { create } from "zustand";
5
+ import { persist } from "zustand/middleware";
4
6
 
5
7
  const debug = debugB3React("useUserQuery");
6
8
 
7
9
  const USER_QUERY_KEY = ["b3-user"];
8
10
 
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
- }
11
+ interface UserStore {
12
+ user: Users | null;
13
+ setUser: (user: Users | undefined) => void;
14
+ clearUser: () => void;
24
15
  }
25
16
 
26
17
  /**
27
- * Saves user to localStorage
18
+ * Zustand store for managing user state
19
+ * Persists user data to localStorage
28
20
  */
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
- }
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
+ );
40
45
 
41
46
  /**
42
47
  * NOTE: THIS IS ONLY MEANT FOR INTERNAL USE, from useOnConnect
43
48
  *
44
- * Custom hook to manage user state with react-query
49
+ * Custom hook to manage user state with Zustand
45
50
  * This allows for invalidation and refetching of user data
46
51
  */
47
52
  export function useUserQuery() {
48
- const queryClient = useQueryClient();
53
+ const user = useUserStore(state => state.user);
54
+ const setUserStore = useUserStore(state => state.setUser);
55
+ const clearUserStore = useUserStore(state => state.clearUser);
49
56
 
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
- });
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
+ };
58
77
 
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
- });
78
+ window.addEventListener("storage", handleStorageChange);
79
+ return () => {
80
+ window.removeEventListener("storage", handleStorageChange);
81
+ };
82
+ }, []);
71
83
 
72
84
  // Helper function to set user (maintains backward compatibility)
73
85
  const setUser = (newUser?: Users) => {
74
- setUserMutation.mutate(newUser);
86
+ setUserStore(newUser);
75
87
  };
76
88
 
77
89
  // Helper function to invalidate and refetch user
78
90
  const refetchUser = async () => {
79
- await queryClient.invalidateQueries({ queryKey: USER_QUERY_KEY });
80
- return queryClient.refetchQueries({ queryKey: USER_QUERY_KEY });
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;
81
109
  };
82
110
 
83
111
  // Helper function to clear user
84
112
  const clearUser = () => {
85
- setUser(undefined);
113
+ clearUserStore();
86
114
  };
87
115
 
88
116
  return {