@faststore/core 4.0.1-dev.0 → 4.0.1-dev.2

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@faststore/core",
3
- "version": "4.0.1-dev.0",
3
+ "version": "4.0.1-dev.2",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -39,11 +39,11 @@
39
39
  "@envelop/graphql-jit": "catalog:",
40
40
  "@envelop/parser-cache": "catalog:",
41
41
  "@envelop/validation-cache": "catalog:",
42
- "@faststore/api": "4.0.1-dev.0",
43
- "@faststore/diagnostics": "4.0.1-dev.0",
44
- "@faststore/lighthouse": "4.0.1-dev.0",
45
- "@faststore/sdk": "4.0.1-dev.0",
46
- "@faststore/ui": "4.0.1-dev.0",
42
+ "@faststore/api": "4.0.1-dev.2",
43
+ "@faststore/diagnostics": "4.0.1-dev.2",
44
+ "@faststore/lighthouse": "4.0.1-dev.2",
45
+ "@faststore/sdk": "4.0.1-dev.2",
46
+ "@faststore/ui": "4.0.1-dev.2",
47
47
  "@graphql-codegen/cli": "catalog:",
48
48
  "@graphql-codegen/client-preset": "4.2.6",
49
49
  "@graphql-codegen/typescript": "catalog:",
@@ -113,5 +113,5 @@
113
113
  "react": "catalog:",
114
114
  "react-dom": "catalog:"
115
115
  },
116
- "gitHead": "a9d781c453243794ea7f5b58dfa0643c42fc62c0"
116
+ "gitHead": "78469e62248563c911ba449ea69fc1edacf7277e"
117
117
  }
@@ -49,6 +49,7 @@ const LocalizationButton = ({
49
49
  setLocaleCode,
50
50
  setCurrencyCode,
51
51
  save,
52
+ reset,
52
53
  isSaveEnabled,
53
54
  error,
54
55
  } = useBindingSelector()
@@ -97,7 +98,10 @@ const LocalizationButton = ({
97
98
  {isSelectorOpen && (
98
99
  <LocalizationSelector
99
100
  isOpen={isSelectorOpen}
100
- onClose={() => setIsSelectorOpen(false)}
101
+ onClose={() => {
102
+ setIsSelectorOpen(false)
103
+ reset()
104
+ }}
101
105
  triggerRef={buttonRef}
102
106
  languages={languages}
103
107
  currencies={currencies}
@@ -1,4 +1,4 @@
1
- import { useCallback, useMemo, useState } from 'react'
1
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
2
2
 
3
3
  import storeConfig from '../../../discovery.config'
4
4
  import { buildRedirectUrl } from '../../utils/localization/bindingPaths'
@@ -56,6 +56,8 @@ export interface UseBindingSelectorReturn {
56
56
  setCurrencyCode: (code: string) => void
57
57
  /** Action to save selections and redirect */
58
58
  save: () => void
59
+ /** Discards unsaved changes and resets selections to current session values */
60
+ reset: () => void
59
61
  }
60
62
 
61
63
  /**
@@ -77,6 +79,23 @@ export function useBindingSelector(): UseBindingSelectorReturn {
77
79
  )
78
80
  const [error, setError] = useState<BindingSelectorError | null>(null)
79
81
 
82
+ const hasUserEditedSelection = useRef(false)
83
+
84
+ // Sync selections when session resolves after initial render (e.g. stale session
85
+ // from a previous locale when navigating between locale-prefixed paths).
86
+ // Skipped once the user has made an in-progress selection; call reset() on close to re-enable.
87
+ useEffect(() => {
88
+ if (!hasUserEditedSelection.current) {
89
+ setLocaleCode(currentLocale ?? null)
90
+ }
91
+ }, [currentLocale])
92
+
93
+ useEffect(() => {
94
+ if (!hasUserEditedSelection.current) {
95
+ setCurrencyCode(currentCurrency?.code ?? null)
96
+ }
97
+ }, [currentCurrency?.code])
98
+
80
99
  // Build language options with disambiguation - returns Record<localeCode, languageName>
81
100
  const languages = useMemo(
82
101
  () => buildLanguageOptions(localizationConfig.locales),
@@ -98,6 +117,7 @@ export function useBindingSelector(): UseBindingSelectorReturn {
98
117
  // Handle locale code change
99
118
  const handleSetLocaleCode = useCallback(
100
119
  (code: string) => {
120
+ hasUserEditedSelection.current = true
101
121
  setLocaleCode(code)
102
122
  setError(null)
103
123
 
@@ -126,6 +146,7 @@ export function useBindingSelector(): UseBindingSelectorReturn {
126
146
 
127
147
  // Handle currency code change
128
148
  const handleSetCurrencyCode = useCallback((code: string) => {
149
+ hasUserEditedSelection.current = true
129
150
  setCurrencyCode(code)
130
151
  setError(null)
131
152
  }, [])
@@ -169,6 +190,14 @@ export function useBindingSelector(): UseBindingSelectorReturn {
169
190
 
170
191
  const isSaveEnabled = Boolean(localeCode && currencyCode && !error)
171
192
 
193
+ // Discards unsaved changes and re-enables session syncing
194
+ const reset = useCallback(() => {
195
+ hasUserEditedSelection.current = false
196
+ setLocaleCode(currentLocale ?? null)
197
+ setCurrencyCode(currentCurrency?.code ?? null)
198
+ setError(null)
199
+ }, [currentLocale, currentCurrency?.code])
200
+
172
201
  return {
173
202
  languages,
174
203
  currencies,
@@ -179,5 +208,6 @@ export function useBindingSelector(): UseBindingSelectorReturn {
179
208
  setLocaleCode: handleSetLocaleCode,
180
209
  setCurrencyCode: handleSetCurrencyCode,
181
210
  save,
211
+ reset,
182
212
  }
183
213
  }