This commit is contained in:
Andras Schmelczer 2026-05-14 20:42:48 +01:00
parent 273d7a83ee
commit 084117cea8
48 changed files with 2283 additions and 890 deletions

View file

@ -5,6 +5,8 @@ import type { Bounds, FeatureFilters, FeatureMeta } from '../../../types';
import { apiUrl, authHeaders, buildFilterString, logNonAbortError } from '../../../lib/api';
import { trackEvent } from '../../../lib/analytics';
import type { ExportNotice, ExportState } from './types';
import type { TravelTimeEntry } from '../../../hooks/useTravelTime';
import { buildTravelParam } from '../../../lib/travel-params';
const EXPORT_FILE_NAME = 'perfect-postcode-export.xlsx';
const EXPORT_TIMEOUT_MS = 150_000;
@ -65,10 +67,24 @@ function triggerExportDownload(blob: Blob, fileName: string): void {
window.setTimeout(() => URL.revokeObjectURL(objectUrl), 30_000);
}
function appendTravelStateParams(params: URLSearchParams, entries: TravelTimeEntry[]): void {
for (const entry of entries) {
if (!entry.slug) continue;
let value = `${entry.mode}:${entry.slug}:${encodeURIComponent(entry.label)}`;
if (entry.useBest) value += ':b';
if (entry.timeRange) {
value += `:${entry.timeRange[0]}:${entry.timeRange[1]}`;
}
params.append('tt', value);
}
}
interface UseExportControllerOptions {
bounds: Bounds | null;
filters: FeatureFilters;
features: FeatureMeta[];
travelTimeEntries: TravelTimeEntry[];
shareCode?: string;
t: TFunction;
onExportStateChange?: (state: ExportState) => void;
}
@ -77,6 +93,8 @@ export function useExportController({
bounds,
filters,
features,
travelTimeEntries,
shareCode,
t,
onExportStateChange,
}: UseExportControllerOptions) {
@ -126,6 +144,10 @@ export function useExportController({
});
const filterStr = buildFilterString(filters, features);
if (filterStr) params.set('filters', filterStr);
const travelParam = buildTravelParam(travelTimeEntries);
if (travelParam) params.set('travel', travelParam);
appendTravelStateParams(params, travelTimeEntries);
if (shareCode) params.set('share', shareCode);
const url = apiUrl('export', params);
const controller = new AbortController();
@ -161,7 +183,17 @@ export function useExportController({
setExporting(false);
}
})();
}, [bounds, clearExportNotice, exporting, features, filters, showExportNotice, t]);
}, [
bounds,
clearExportNotice,
exporting,
features,
filters,
shareCode,
showExportNotice,
t,
travelTimeEntries,
]);
useEffect(() => {
onExportStateChange?.({ onExport: handleExport, exporting });