feat(mod): tickets+team tabs; retire HK writes for live ACL

Co-authored-by: Cursor <[email protected]>
This commit is contained in:
2026-07-22 21:35:35 +02:00
co-authored by Cursor
parent 084cca6ea4
commit 75cace41ea
16 changed files with 735 additions and 1002 deletions
@@ -85,18 +85,29 @@ export function AdminTicketDetail({
staffMembers,
currentUserId,
canEdit,
listHref = "/admin/tickets",
userLinkMode = "admin",
}: {
ticket: TicketInfo;
messages: TicketMessage[];
staffMembers: StaffMember[];
currentUserId: number;
canEdit: boolean;
listHref?: string;
userLinkMode?: "admin" | "public";
}) {
const [messages] = useState(initialMessages);
const [reply, setReply] = useState("");
const { run, isPending } = useServerAction();
const messagesEndRef = useRef<HTMLDivElement>(null);
function creatorHref() {
if (userLinkMode === "public") {
return `/u/${encodeURIComponent(ticket.creator.username)}`;
}
return `/admin/users/show/${ticket.creator.id}`;
}
// biome-ignore lint/correctness/useExhaustiveDependencies: explicitly chosen here, see surrounding code
useEffect(() => {
messagesEndRef.current?.scrollIntoView({ behavior: "smooth" });
@@ -152,7 +163,7 @@ export function AdminTicketDetail({
<div className="space-y-6">
{/* Header */}
<div className="flex items-start gap-4">
<Link href="/admin/tickets">
<Link href={listHref}>
<Button variant="ghost" size="icon">
<ArrowLeft className="h-4 w-4" />
</Button>
@@ -382,7 +393,7 @@ export function AdminTicketDetail({
</CardHeader>
<CardContent className="space-y-2">
<Link
href={`/admin/users/show/${ticket.creator.id}`}
href={creatorHref()}
className="flex items-center gap-2 text-sm font-medium hover:text-primary"
>
<User className="h-3.5 w-3.5" />