feat(platform): persist realtime source filters

This commit is contained in:
lingniu
2026-07-04 06:45:38 +08:00
parent 2feaf246be
commit b9534af233
3 changed files with 142 additions and 10 deletions

View File

@@ -23,6 +23,9 @@ export default function App() {
const [vehicleFilters, setVehicleFilters] = useState<Record<string, string>>(
initialRoute.page === 'vehicles' ? vehicleFiltersFromRoute(initialRoute) : {}
);
const [realtimeFilters, setRealtimeFilters] = useState<Record<string, string>>(
initialRoute.page === 'realtime' ? realtimeFiltersFromRoute(initialRoute) : {}
);
const [qualityFilters, setQualityFilters] = useState<Record<string, string>>(
initialRoute.page === 'quality' ? qualityFiltersFromRoute(initialRoute) : {}
);
@@ -98,6 +101,9 @@ export default function App() {
if (route.page === 'vehicles') {
setVehicleFilters(vehicleFiltersFromRoute(route));
}
if (route.page === 'realtime') {
setRealtimeFilters(realtimeFiltersFromRoute(route));
}
if (route.page === 'quality') {
setQualityFilters(qualityFiltersFromRoute(route));
}
@@ -133,6 +139,10 @@ export default function App() {
replaceVehicleHash(vehicleFilters);
return;
}
if (page === 'realtime') {
replaceRealtimeHash(realtimeFilters);
return;
}
replaceHash(page);
};
@@ -152,6 +162,16 @@ export default function App() {
replaceHash('vehicles', keyword, protocol, restFilters);
};
const updateRealtimeFilters = (filters: Record<string, string> = {}) => {
setRealtimeFilters(filters);
replaceRealtimeHash(filters);
};
const replaceRealtimeHash = (filters: Record<string, string> = {}) => {
const { keyword, protocol, ...restFilters } = filters;
replaceHash('realtime', keyword, protocol, restFilters);
};
const replaceQualityHash = (filters: Record<string, string> = {}) => {
const keyword = filters.keyword;
const protocol = filters.protocol;
@@ -241,7 +261,7 @@ export default function App() {
const pages: Record<PageKey, JSX.Element> = {
dashboard: <Dashboard onOpenVehicle={openVehicle} onOpenQuality={() => navigatePage('quality')} onOpenVehicles={openVehicles} />,
vehicles: <Vehicles onOpenVehicle={openVehicle} onFiltersChange={updateVehicleFilters} initialFilters={vehicleFilters} />,
realtime: <Realtime onOpenVehicle={openVehicle} />,
realtime: <Realtime onOpenVehicle={openVehicle} onFiltersChange={updateRealtimeFilters} initialFilters={realtimeFilters} />,
detail: <VehicleDetail vin={activeVin} protocol={activeProtocol} onOpenHistory={openHistoryForVehicle} onOpenRaw={openRawForVehicle} onOpenMileage={openMileageForVehicle} onOpenVehicles={openVehicles} onQueryChange={updateVehicleDetailQuery} />,
history: <History initialVin={analysisVin} initialProtocol={activeProtocol} initialTab={historyTab} onOpenVehicle={openVehicle} />,
mileage: <Mileage initialVin={analysisVin} initialProtocol={activeProtocol} onOpenVehicle={openVehicle} />,
@@ -271,6 +291,15 @@ function vehicleFiltersFromRoute(route: ReturnType<typeof parseAppHash>): Record
};
}
function realtimeFiltersFromRoute(route: ReturnType<typeof parseAppHash>): Record<string, string> {
return {
...(route.keyword ? { keyword: route.keyword } : {}),
...(route.protocol ? { protocol: route.protocol } : {}),
...(route.filters?.online ? { online: route.filters.online } : {}),
...(route.filters?.serviceStatus ? { serviceStatus: route.filters.serviceStatus } : {})
};
}
function serviceStatusFromOverview(overview: VehicleServiceOverview): VehicleServiceStatus {
const sourceCount = overview.sourceCount;
const onlineSourceCount = overview.onlineSourceCount;