@tagadapay/plugin-sdk 2.7.37 → 2.7.39

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.
@@ -66,20 +66,13 @@ export function useCheckoutQuery(options = {}) {
66
66
  // Internal token state that can be updated after init
67
67
  const [internalToken, setInternalToken] = useState(providedToken);
68
68
  // Update internal token when provided token changes
69
- // Always sync when providedToken is explicitly provided (not undefined)
70
69
  useEffect(() => {
71
- // If providedToken is explicitly set (not undefined), sync internalToken
72
- // This handles both: null -> string and string -> string transitions
73
- if (providedToken !== undefined && providedToken !== internalToken) {
70
+ if (providedToken && providedToken !== internalToken) {
74
71
  setInternalToken(providedToken);
75
72
  }
76
- // If providedToken is undefined, keep internalToken (from init) - don't clear it
77
- }, [providedToken, internalToken]);
78
- // Use provided token directly when available, otherwise fall back to internal token
79
- // Memoize to ensure React Query sees the change when providedToken updates
80
- const checkoutToken = useMemo(() => {
81
- return providedToken !== undefined ? providedToken : internalToken;
82
73
  }, [providedToken, internalToken]);
74
+ // Use provided token or internal token
75
+ const checkoutToken = providedToken || internalToken;
83
76
  // Main checkout query
84
77
  const { data: checkout, isLoading, error, isSuccess, refetch, } = useQuery({
85
78
  queryKey: ['checkout', checkoutToken, currency.code],
@@ -1,6 +1,7 @@
1
1
  export interface UseCheckoutTokenOptions {
2
2
  checkoutToken?: string;
3
3
  autoLoadFromToken?: boolean;
4
+ autoLoadFromQueryCache?: boolean;
4
5
  }
5
6
  export interface UseCheckoutTokenResult {
6
7
  checkoutToken: string | null;
@@ -1,3 +1,4 @@
1
+ import { useQueryClient } from '@tanstack/react-query';
1
2
  import { useCallback, useEffect, useRef, useState } from 'react';
2
3
  import { useTagadaContext } from '../providers/TagadaProvider';
3
4
  /**
@@ -6,12 +7,14 @@ import { useTagadaContext } from '../providers/TagadaProvider';
6
7
  */
7
8
  export function useCheckoutToken(options = {}) {
8
9
  const { isSessionInitialized } = useTagadaContext();
9
- const { checkoutToken: providedToken, autoLoadFromToken = true } = options;
10
+ const { checkoutToken: providedToken, autoLoadFromToken = true, autoLoadFromQueryCache = true } = options;
11
+ const queryClient = useQueryClient();
10
12
  const [checkoutToken, setCheckoutToken] = useState(providedToken || null);
11
13
  const [isLoading, _setIsLoading] = useState(false);
12
14
  const [error, setError] = useState(null);
13
15
  const [isInitialized, setIsInitialized] = useState(false);
14
16
  const hasAutoLoadedRef = useRef(false);
17
+ const hasAutoLoadedFromCacheRef = useRef(false);
15
18
  const isSessionInitializedRef = useRef(isSessionInitialized);
16
19
  // Keep ref in sync with state
17
20
  useEffect(() => {
@@ -23,8 +26,36 @@ export function useCheckoutToken(options = {}) {
23
26
  setCheckoutToken(providedToken);
24
27
  setIsInitialized(false);
25
28
  hasAutoLoadedRef.current = false;
29
+ hasAutoLoadedFromCacheRef.current = false;
26
30
  }
27
31
  }, [providedToken, checkoutToken]);
32
+ // Auto-load token from React Query cache if available (from useCheckoutQuery)
33
+ useEffect(() => {
34
+ if (!providedToken && autoLoadFromQueryCache && !checkoutToken && !hasAutoLoadedFromCacheRef.current) {
35
+ try {
36
+ // Check React Query cache for checkout queries
37
+ // Query key format: ['checkout', checkoutToken, currency.code]
38
+ const queryCache = queryClient.getQueryCache();
39
+ const checkoutQueries = queryCache.findAll({ queryKey: ['checkout'] });
40
+ // Find the first query with a valid token in the query key
41
+ for (const query of checkoutQueries) {
42
+ const queryKey = query.queryKey;
43
+ if (Array.isArray(queryKey) && queryKey.length >= 2 && typeof queryKey[1] === 'string' && queryKey[1]) {
44
+ const cachedToken = queryKey[1];
45
+ if (cachedToken) {
46
+ setCheckoutToken(cachedToken);
47
+ hasAutoLoadedFromCacheRef.current = true;
48
+ return;
49
+ }
50
+ }
51
+ }
52
+ }
53
+ catch (err) {
54
+ // Silently fail if query cache access fails
55
+ console.debug('Failed to load checkoutToken from query cache:', err);
56
+ }
57
+ }
58
+ }, [providedToken, autoLoadFromQueryCache, checkoutToken, queryClient]);
28
59
  // Auto-load token from URL if no token provided
29
60
  useEffect(() => {
30
61
  if (!providedToken && autoLoadFromToken && !checkoutToken && !hasAutoLoadedRef.current) {
@@ -53,6 +84,7 @@ export function useCheckoutToken(options = {}) {
53
84
  setIsInitialized(false);
54
85
  setError(null);
55
86
  hasAutoLoadedRef.current = false;
87
+ hasAutoLoadedFromCacheRef.current = false;
56
88
  }, []);
57
89
  return {
58
90
  checkoutToken,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tagadapay/plugin-sdk",
3
- "version": "2.7.37",
3
+ "version": "2.7.39",
4
4
  "description": "Modern React SDK for building Tagada Pay plugins",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",