metis-desk/modules/companies/src/web/companies/detail/controllers/use-company-detail-controller.ts
2026-10-25 01:19:17 +02:00

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,
};
}