feat(platform): persist quality filters in route

This commit is contained in:
lingniu
2026-07-04 04:45:52 +08:00
parent b53cfbabfe
commit 753faca269
5 changed files with 120 additions and 7 deletions

View File

@@ -20,6 +20,9 @@ export default function App() {
const [analysisVin, setAnalysisVin] = useState(initialVehicleKey);
const [activeProtocol, setActiveProtocol] = useState(initialRoute.protocol ?? '');
const [vehicleFilters, setVehicleFilters] = useState<Record<string, string>>(initialRoute.filters ?? {});
const [qualityFilters, setQualityFilters] = useState<Record<string, string>>(
initialRoute.page === 'quality' ? qualityFiltersFromRoute(initialRoute) : {}
);
const [linkIssueCount, setLinkIssueCount] = useState<number | null>(null);
const [currentVehicleStatus, setCurrentVehicleStatus] = useState<VehicleServiceStatus | undefined>();
const [currentVehicleLabel, setCurrentVehicleLabel] = useState('');
@@ -87,6 +90,9 @@ export default function App() {
if (route.page === 'vehicles') {
setVehicleFilters(route.filters ?? {});
}
if (route.page === 'quality') {
setQualityFilters(qualityFiltersFromRoute(route));
}
setActiveProtocol(route.protocol ?? '');
};
window.addEventListener('hashchange', applyHashRoute);
@@ -110,6 +116,10 @@ export default function App() {
replaceHash(page, analysisVin, activeProtocol);
return;
}
if (page === 'quality') {
replaceQualityHash(qualityFilters);
return;
}
replaceHash(page, undefined, undefined, page === 'vehicles' ? vehicleFilters : undefined);
};
@@ -124,6 +134,21 @@ export default function App() {
replaceHash('vehicles', undefined, undefined, filters);
};
const replaceQualityHash = (filters: Record<string, string> = {}) => {
const keyword = filters.keyword;
const protocol = filters.protocol;
const issueFilters: Record<string, string> = {};
if (filters.issueType) {
issueFilters.issueType = filters.issueType;
}
replaceHash('quality', keyword, protocol, issueFilters);
};
const updateQualityFilters = (filters: Record<string, string> = {}) => {
setQualityFilters(filters);
replaceQualityHash(filters);
};
const openVehicle = async (keyword: string, protocol?: string) => {
const lookupKey = keyword.trim();
const nextProtocol = protocol?.trim() ?? '';
@@ -188,7 +213,7 @@ export default function App() {
detail: <VehicleDetail vin={activeVin} protocol={activeProtocol} onOpenHistory={openHistoryForVehicle} onOpenMileage={openMileageForVehicle} onQueryChange={updateVehicleDetailQuery} />,
history: <History initialVin={analysisVin} initialProtocol={activeProtocol} onOpenVehicle={openVehicle} />,
mileage: <Mileage initialVin={analysisVin} initialProtocol={activeProtocol} onOpenVehicle={openVehicle} />,
quality: <Quality onOpenVehicle={openVehicle} onHealthLoaded={(health) => setLinkIssueCount(health.linkHealth.filter((item) => item.status !== 'ok').length)} />
quality: <Quality onOpenVehicle={openVehicle} onHealthLoaded={(health) => setLinkIssueCount(health.linkHealth.filter((item) => item.status !== 'ok').length)} onFiltersChange={updateQualityFilters} initialFilters={qualityFilters} />
};
return (
@@ -198,6 +223,14 @@ export default function App() {
);
}
function qualityFiltersFromRoute(route: ReturnType<typeof parseAppHash>): Record<string, string> {
return {
...(route.keyword ? { keyword: route.keyword } : {}),
...(route.protocol ? { protocol: route.protocol } : {}),
...(route.filters?.issueType ? { issueType: route.filters.issueType } : {})
};
}
function serviceStatusFromOverview(overview: VehicleServiceOverview): VehicleServiceStatus {
const sourceCount = overview.sourceCount;
const onlineSourceCount = overview.onlineSourceCount;