metis-desk/modules/companies/src/web/mailboxes/shared/ui/mailbox-relations.tsx

77 lines
2.9 KiB
TypeScript
Raw Normal View History

2026-10-24 23:19:17 +00:00
import { BrowserLink } from "@metis/core/client";
import { EntityListStatus } from "@repo/rdx-ui/components/entity-list-status";
import { FormSectionTitle } from "@repo/rdx-ui/components/form-section-title";
2026-10-05 15:01:32 +00:00
import { Button } from "@repo/shadcn-ui/components/button";
import { useTranslation } from "react-i18next";
import { MailboxUseEditorDialog } from "../../../mailbox-uses";
2026-10-24 23:19:17 +00:00
import { useCompanyListState } from "../../../shared/hooks/use-company-list-state";
import { useMailboxRelationsController } from "../controllers";
import type { MailboxRelationsProps } from "../types";
export function MailboxRelations(props: MailboxRelationsProps) {
2026-10-10 10:42:56 +00:00
const { company, mailboxId } = props;
const { editor, setEditor, query, uses, edited } = useMailboxRelationsController(props);
2026-10-05 15:01:32 +00:00
const { t } = useTranslation("companies");
2026-10-24 23:19:17 +00:00
const { state, denied } = useCompanyListState([query]);
const available = state.status !== "loading" && state.status !== "unavailable";
2026-10-10 10:01:58 +00:00
2026-10-05 15:01:32 +00:00
return (
<section className="space-y-3 border-t pt-4">
<div className="flex items-center justify-between gap-3">
2026-10-24 23:19:17 +00:00
<FormSectionTitle layout="inline">{t("people")}</FormSectionTitle>
<Button disabled={!available} onClick={() => setEditor("new")} size="sm" variant="outline">
2026-10-05 15:01:32 +00:00
{t("mailbox.linkPerson")}
</Button>
</div>
2026-10-24 23:19:17 +00:00
<EntityListStatus
onRetry={denied ? undefined : () => query.refetch()}
retryLabel={t("retry")}
state={state}
/>
2026-10-05 15:01:32 +00:00
<ul className="space-y-2">
2026-10-24 23:19:17 +00:00
{available &&
uses.map((item) => (
<li
className="flex flex-wrap items-center justify-between gap-3 text-sm"
data-entity-id={item.id}
key={item.id}
>
<span>
{company.people.find((person) => person.id === item.values.personId) ? (
<BrowserLink href={`/companies/${company.id}/people/${item.values.personId}`}>
{company.people.find((person) => person.id === item.values.personId)?.name}
</BrowserLink>
) : (
"—"
)}{" "}
· {item.values.startDate} → {item.values.endDate ?? t("mailbox.openPeriod")}
</span>
{!item.values.endDate && (
<Button onClick={() => setEditor(item.id)} size="sm" variant="outline">
{t("mailbox.closeUse")}
</Button>
)}
</li>
))}
2026-10-05 15:01:32 +00:00
</ul>
2026-10-24 23:19:17 +00:00
{available && uses.length === 0 && (
<p className="text-sm text-muted-foreground">{t("mailbox.noUses")}</p>
)}
2026-10-05 15:01:32 +00:00
{editor && (
2026-10-08 14:43:34 +00:00
<MailboxUseEditorDialog
company={company}
mailboxId={mailboxId}
2026-10-05 15:01:32 +00:00
onOpenChange={(open) => {
if (!open) {
setEditor(undefined);
}
}}
2026-10-08 14:43:34 +00:00
onSaved={() => setEditor(undefined)}
use={edited}
/>
2026-10-05 15:01:32 +00:00
)}
</section>
);
}