|
1 | 1 | import { useMutation, useQuery, useQueryClient } from 'react-query'; |
2 | | -import { Assembly, Manufacturer, Material, MaterialType, Unit, WbsNumber, wbsPipe } from 'shared'; |
| 2 | +import { Assembly, Manufacturer, Material, MaterialType, ProjectPreview, Unit, WbsNumber, wbsPipe } from 'shared'; |
3 | 3 | import { useToast } from '../hooks/toasts.hooks'; |
4 | 4 | import { |
5 | 5 | assignMaterialToAssembly, |
@@ -326,3 +326,33 @@ export const useGetMaterialsForWbsElement = (wbsNum: WbsNumber) => { |
326 | 326 | return data; |
327 | 327 | }); |
328 | 328 | }; |
| 329 | + |
| 330 | +export const useGetMaterialsForCar = (carNumber: number | null, projects: ProjectPreview[]) => { |
| 331 | + const projectsInCar = projects.filter((p) => p.wbsNum.carNumber === carNumber); |
| 332 | + |
| 333 | + return useQuery<Material[], Error>( |
| 334 | + ['materials', 'car', carNumber ?? 'none'], |
| 335 | + async () => { |
| 336 | + const results = await Promise.all( |
| 337 | + projectsInCar.map(async (p) => { |
| 338 | + const { data } = await getMaterialsForWbsElement({ |
| 339 | + carNumber: p.wbsNum.carNumber, |
| 340 | + projectNumber: p.wbsNum.projectNumber, |
| 341 | + workPackageNumber: 0 |
| 342 | + }); |
| 343 | + return data; |
| 344 | + }) |
| 345 | + ); |
| 346 | + |
| 347 | + const flat = results.flat(); |
| 348 | + const seen = new Set<string>(); |
| 349 | + return flat.filter((material) => { |
| 350 | + const key = `${material.name.toLowerCase()}-${material.assemblyId ?? 'no-assembly'}`; |
| 351 | + if (seen.has(key)) return false; |
| 352 | + seen.add(key); |
| 353 | + return true; |
| 354 | + }); |
| 355 | + }, |
| 356 | + { enabled: carNumber !== null && projectsInCar.length > 0 } |
| 357 | + ); |
| 358 | +}; |
0 commit comments