Skip to content

Commit d66b3eb

Browse files
committed
La til direkteurl
1 parent f1e8199 commit d66b3eb

File tree

2 files changed

+103
-4
lines changed

2 files changed

+103
-4
lines changed

src/components/WebsitePicker.tsx

+63-2
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,74 @@ const WebsitePicker = ({
6161
const websitesLoaded = useRef<boolean>(false);
6262
const prevExternalDateRange = useRef<number>(externalDateRange || 3);
6363
const prevShouldReload = useRef<boolean>(shouldReload);
64+
const initialUrlChecked = useRef<boolean>(false);
6465

6566
// @ts-ignore
6667
const [isInitialLoading, setIsInitialLoading] = useState<boolean>(true);
6768
const [error, setError] = useState<string | null>(null);
6869
const [showLoading, setShowLoading] = useState<boolean>(false);
6970
const loadingTimerRef = useRef<number | null>(null);
7071

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+
71132
const handleLoadingState = useCallback((loading: boolean) => {
72133
if (loading) {
73134
loadingTimerRef.current = window.setTimeout(() => {
@@ -287,9 +348,9 @@ const WebsitePicker = ({
287348
onToggleSelected={(option: string, isSelected: boolean) => {
288349
if (isSelected) {
289350
const website = websites.find(w => w.name === option);
290-
onWebsiteChange(website || null);
351+
handleWebsiteChange(website || null); // Use the new handler
291352
} else {
292-
onWebsiteChange(null);
353+
handleWebsiteChange(null); // Use the new handler
293354
}
294355
}}
295356
clearButton

src/pages/Chartbuilder.tsx

+40-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ import {
1414
MetricOption,
1515
ColumnOption,
1616
ChartConfig,
17-
Filter
17+
Filter,
18+
Website // Add the missing Website type
1819
} from '../types/chart';
1920
import CopyButton from '../components/theme/CopyButton/CopyButton';
2021

@@ -1086,6 +1087,43 @@ const ChartsPage = () => {
10861087
}
10871088
}, [tempDateRangeInDays, maxDaysAvailable, config.website]);
10881089

1090+
// Modify website change handler to handle URL sharing
1091+
const handleWebsiteChange = useCallback((website: Website | null) => {
1092+
setConfig(prev => ({
1093+
...prev,
1094+
website
1095+
}));
1096+
1097+
// Reset filters and selections when the website changes
1098+
if (website && website.id !== config.website?.id) {
1099+
setFilters([]);
1100+
setConfig(prev => ({
1101+
...prev,
1102+
website,
1103+
metrics: [],
1104+
groupByFields: [],
1105+
orderBy: null
1106+
}));
1107+
}
1108+
}, [config.website?.id]);
1109+
1110+
// Check if the page is loaded via a shared URL with preset website
1111+
useEffect(() => {
1112+
// This will only handle URL parameters not related to website ID
1113+
// Website ID is handled directly in WebsitePicker component
1114+
const urlParams = new URLSearchParams(window.location.search);
1115+
1116+
// You could add more URL parameters here like date range
1117+
const dateRange = urlParams.get('dateRange');
1118+
if (dateRange && !isNaN(Number(dateRange))) {
1119+
const days = Number(dateRange);
1120+
if (days > 0 && days <= 90) { // Add reasonable limits
1121+
setDateRangeInDays(days);
1122+
setTempDateRangeInDays(days);
1123+
}
1124+
}
1125+
}, []);
1126+
10891127
// Modify handleEventsLoad to update loading state
10901128
const handleEventsLoad = (events: string[], autoParameters?: { key: string; type: 'string' }[], maxDays?: number) => {
10911129
setAvailableEvents(events);
@@ -1135,7 +1173,7 @@ const ChartsPage = () => {
11351173
{/* @ts-ignore Data section - Website picker */}
11361174
<WebsitePicker
11371175
selectedWebsite={config.website}
1138-
onWebsiteChange={(website) => setConfig(prev => ({ ...prev, website }))}
1176+
onWebsiteChange={handleWebsiteChange}
11391177
onEventsLoad={handleEventsLoad}
11401178
dateRangeInDays={dateRangeInDays} // Pass dateRangeInDays to WebsitePicker
11411179
shouldReload={forceReload} // Pass the reload flag

0 commit comments

Comments
 (0)