@@ -61,13 +61,74 @@ const WebsitePicker = ({
61
61
const websitesLoaded = useRef < boolean > ( false ) ;
62
62
const prevExternalDateRange = useRef < number > ( externalDateRange || 3 ) ;
63
63
const prevShouldReload = useRef < boolean > ( shouldReload ) ;
64
+ const initialUrlChecked = useRef < boolean > ( false ) ;
64
65
65
66
// @ts -ignore
66
67
const [ isInitialLoading , setIsInitialLoading ] = useState < boolean > ( true ) ;
67
68
const [ error , setError ] = useState < string | null > ( null ) ;
68
69
const [ showLoading , setShowLoading ] = useState < boolean > ( false ) ;
69
70
const loadingTimerRef = useRef < number | null > ( null ) ;
70
71
72
+ // Function to update URL with website ID
73
+ const updateUrlWithWebsiteId = useCallback ( ( website : Website | null ) => {
74
+ const url = new URL ( window . location . href ) ;
75
+
76
+ if ( website && website . id ) {
77
+ url . searchParams . set ( 'websiteId' , website . id ) ;
78
+ } else {
79
+ url . searchParams . delete ( 'websiteId' ) ;
80
+ }
81
+
82
+ // Update URL without full page reload
83
+ window . history . pushState ( { } , '' , url . toString ( ) ) ;
84
+ } , [ ] ) ;
85
+
86
+ // Handle website selection and update URL
87
+ const handleWebsiteChange = useCallback ( ( website : Website | null ) => {
88
+ onWebsiteChange ( website ) ;
89
+ updateUrlWithWebsiteId ( website ) ;
90
+ } , [ onWebsiteChange , updateUrlWithWebsiteId ] ) ;
91
+
92
+ // Check for website ID in URL on initial load
93
+ useEffect ( ( ) => {
94
+ if ( websitesLoaded . current && ! initialUrlChecked . current && websites . length > 0 ) {
95
+ const urlParams = new URLSearchParams ( window . location . search ) ;
96
+ const websiteIdFromUrl = urlParams . get ( 'websiteId' ) ;
97
+
98
+ if ( websiteIdFromUrl ) {
99
+ const website = websites . find ( w => w . id === websiteIdFromUrl ) ;
100
+ if ( website && ! selectedWebsite ) {
101
+ onWebsiteChange ( website ) ;
102
+ }
103
+ }
104
+
105
+ initialUrlChecked . current = true ;
106
+ }
107
+ } , [ websites , selectedWebsite , onWebsiteChange ] ) ;
108
+
109
+ // Handle browser back/forward navigation
110
+ useEffect ( ( ) => {
111
+ const handlePopState = ( ) => {
112
+ if ( websitesLoaded . current ) {
113
+ const urlParams = new URLSearchParams ( window . location . search ) ;
114
+ const websiteIdFromUrl = urlParams . get ( 'websiteId' ) ;
115
+
116
+ if ( websiteIdFromUrl ) {
117
+ const website = websites . find ( w => w . id === websiteIdFromUrl ) ;
118
+ if ( website && ( ! selectedWebsite || website . id !== selectedWebsite . id ) ) {
119
+ onWebsiteChange ( website ) ;
120
+ }
121
+ } else if ( selectedWebsite ) {
122
+ // No website ID in URL, but we have a selected website, clear it
123
+ onWebsiteChange ( null ) ;
124
+ }
125
+ }
126
+ } ;
127
+
128
+ window . addEventListener ( 'popstate' , handlePopState ) ;
129
+ return ( ) => window . removeEventListener ( 'popstate' , handlePopState ) ;
130
+ } , [ websites , selectedWebsite , onWebsiteChange ] ) ;
131
+
71
132
const handleLoadingState = useCallback ( ( loading : boolean ) => {
72
133
if ( loading ) {
73
134
loadingTimerRef . current = window . setTimeout ( ( ) => {
@@ -287,9 +348,9 @@ const WebsitePicker = ({
287
348
onToggleSelected = { ( option : string , isSelected : boolean ) => {
288
349
if ( isSelected ) {
289
350
const website = websites . find ( w => w . name === option ) ;
290
- onWebsiteChange ( website || null ) ;
351
+ handleWebsiteChange ( website || null ) ; // Use the new handler
291
352
} else {
292
- onWebsiteChange ( null ) ;
353
+ handleWebsiteChange ( null ) ; // Use the new handler
293
354
}
294
355
} }
295
356
clearButton
0 commit comments