FactuGES_ERP/apps/web/src/lib/hooks/use-app-company-switcher-controller.ts
David d57b71c200 refactor: standardize import statements and formatting across components
- Updated import statements in `textarea.tsx`, `toggle.tsx`, and `tooltip.tsx` for consistency.
- Added missing semicolons and adjusted formatting in `use-mobile.ts` and `use-mobile.tsx`.
- Cleaned up `package.json` and `root.json` files by removing unnecessary line breaks.
- Simplified `turbo.json` by consolidating array formatting for better readability.
2026-09-10 13:26:33 +02:00

108 lines
3.1 KiB
TypeScript

import { useIdentityAuthSession } from "@erp/identity/client";
import { showErrorToast, showSuccessToast } from "@repo/rdx-ui/helpers";
import { useQueryClient } from "@tanstack/react-query";
import { useState } from "react";
function resolveCompanyDisplayName(legalName: string, tradeName: string | null) {
return tradeName?.trim() || legalName;
}
function resolveCompanySecondaryLabel(legalName: string, tradeName: string | null) {
if (tradeName?.trim()) {
return legalName;
}
return null;
}
function resolveCompanyInitials(name: string) {
const words = name.trim().split(/\s+/).filter(Boolean);
if (words.length === 0) {
return "--";
}
return words
.slice(0, 2)
.map((word) => word.charAt(0).toUpperCase())
.join("");
}
function resolveErrorMessage(error: unknown) {
if (error instanceof Error && error.message.trim().length > 0) {
return error.message;
}
return "Please try again in a few seconds.";
}
export function useAppCompanySwitcherController() {
const queryClient = useQueryClient();
const { activeCompany, availableCompanies, changeActiveCompany } = useIdentityAuthSession();
const [isChangingCompany, setIsChangingCompany] = useState(false);
const activeCompanyView = activeCompany
? {
id: activeCompany.id,
name: resolveCompanyDisplayName(activeCompany.legalName, activeCompany.tradeName),
secondaryLabel: resolveCompanySecondaryLabel(
activeCompany.legalName,
activeCompany.tradeName
),
initials: resolveCompanyInitials(
resolveCompanyDisplayName(activeCompany.legalName, activeCompany.tradeName)
),
}
: null;
const companyOptions = availableCompanies.map((company) => {
const name = resolveCompanyDisplayName(company.legalName, company.tradeName);
return {
id: company.id,
name,
secondaryLabel: resolveCompanySecondaryLabel(company.legalName, company.tradeName),
initials: resolveCompanyInitials(name),
isSelected: company.id === activeCompany?.id,
};
});
const handleSelectCompany = async (companyId: string) => {
if (isChangingCompany || companyId === activeCompany?.id) {
return;
}
setIsChangingCompany(true);
try {
const nextActiveCompany = await changeActiveCompany(companyId);
if (!nextActiveCompany) {
showErrorToast("Unable to switch company", "The selected company is not available.");
return;
}
await queryClient.cancelQueries();
queryClient.removeQueries({ type: "inactive" });
await queryClient.resetQueries({ type: "active" });
showSuccessToast(
"Active company updated",
`${resolveCompanyDisplayName(nextActiveCompany.legalName, nextActiveCompany.tradeName)} is now active.`
);
} catch (error) {
showErrorToast("Unable to switch company", resolveErrorMessage(error));
} finally {
setIsChangingCompany(false);
}
};
return {
activeCompany: activeCompanyView,
companies: companyOptions,
isChangingCompany,
isDisabled: isChangingCompany || companyOptions.length <= 1,
handleSelectCompany,
};
}