77 lines
2.6 KiB
TypeScript
77 lines
2.6 KiB
TypeScript
import {
|
|
inventoryApi as assetInventoryApi,
|
|
inventoryKeys as assetInventoryKeys,
|
|
} from "@metis/assets/client";
|
|
import { useListQuery } from "@metis/core/client";
|
|
import {
|
|
inventoryApi as resourceInventoryApi,
|
|
inventoryKeys as resourceInventoryKeys,
|
|
} from "@metis/resources/client";
|
|
import { useQuery } from "@tanstack/react-query";
|
|
import { useState } from "react";
|
|
|
|
import type { PeopleListDataState } from "../../../people";
|
|
import { profileApi, profileKeys } from "../../../work-profiles/shared/api";
|
|
import { companyKeys } from "../../shared/queries";
|
|
import type { CompanyTab } from "../../shared/types";
|
|
import { getCompany } from "../api";
|
|
import type { CompanyDetailProps } from "../types";
|
|
|
|
export function useCompanyDetailController({
|
|
id,
|
|
initialSection,
|
|
section,
|
|
onSectionChange,
|
|
layoutReady = true,
|
|
}: CompanyDetailProps) {
|
|
const query = useQuery({ queryKey: companyKeys.detail(id), queryFn: () => getCompany(id) });
|
|
const [editOpen, setEditOpen] = useState(false);
|
|
const [localTab, setLocalTab] = useState<CompanyTab>(initialSection ?? "overview");
|
|
const tab = section ?? localTab;
|
|
const setTab = onSectionChange ?? setLocalTab;
|
|
const company = query.data?.company;
|
|
|
|
const inventory = useListQuery({
|
|
queryKey: assetInventoryKeys.company(id),
|
|
queryFn: () => assetInventoryApi.get(id),
|
|
enabled: Boolean(company),
|
|
});
|
|
const resources = useListQuery({
|
|
queryKey: resourceInventoryKeys.company(id),
|
|
queryFn: () => resourceInventoryApi.get(id),
|
|
enabled: Boolean(company),
|
|
});
|
|
const profiles = useListQuery({
|
|
queryKey: profileKeys.company(id),
|
|
queryFn: () => profileApi.get(id),
|
|
enabled: Boolean(company),
|
|
});
|
|
const counts: Partial<Record<CompanyTab, { count: number | undefined; failed: boolean }>> = {
|
|
people: { count: company?.people.length, failed: false },
|
|
departments: { count: company?.departments.length, failed: false },
|
|
sites: { count: company?.sites.length, failed: false },
|
|
inventory: { count: inventory.data?.assets.length, failed: inventory.isError },
|
|
workstations: { count: inventory.data?.workstations.length, failed: inventory.isError },
|
|
resources: { count: resources.data?.resources.length, failed: resources.isError },
|
|
profiles: { count: profiles.data?.profiles.length, failed: profiles.isError },
|
|
};
|
|
|
|
const peopleDataState: PeopleListDataState = query.isFetching
|
|
? "pending"
|
|
: query.isError
|
|
? "unverified"
|
|
: "ready";
|
|
|
|
return {
|
|
peopleDataState,
|
|
query,
|
|
editOpen,
|
|
setEditOpen,
|
|
tab,
|
|
setTab,
|
|
company,
|
|
counts,
|
|
listLayoutReady: layoutReady && !query.isFetching,
|
|
};
|
|
}
|