import { Button, Input, Select } from "@cloudflare/kumo";
import { Dialog } from "@cloudflare/kumo/primitives";
import { useLingui } from "@lingui/react/macro";
import {
X,
Key,
Prohibit,
CheckCircle,
ArrowSquareOut,
FloppyDisk,
Envelope,
} from "@phosphor-icons/react";
import * as React from "react";
import type { UserDetail as UserDetailType, UpdateUserInput } from "../../lib/api";
import { useStableCallback } from "../../lib/hooks";
import { cn } from "../../lib/utils";
import { useRolesConfig } from "./useRolesConfig.js";
export interface UserDetailProps {
user: UserDetailType | null;
isLoading?: boolean;
isOpen: boolean;
isSaving?: boolean;
isSendingRecovery?: boolean;
recoverySent?: boolean;
recoveryError?: string | null;
currentUserId?: string;
onClose: () => void;
onSave: (data: UpdateUserInput) => void;
onDisable: () => void;
onEnable: () => void;
onSendRecovery?: () => void;
}
/**
* User detail slide-over panel with inline editing
*/
export function UserDetail({
user,
isLoading,
isOpen,
isSaving,
isSendingRecovery,
recoverySent,
recoveryError,
currentUserId,
onClose,
onSave,
onDisable,
onEnable,
onSendRecovery,
}: UserDetailProps) {
const { t } = useLingui();
const { roles, roleLabels, getRoleLabel } = useRolesConfig();
const [name, setName] = React.useState(user?.name ?? "");
const [email, setEmail] = React.useState(user?.email ?? "");
const [role, setRole] = React.useState(user?.role ?? 30);
// Reset form when viewing a different user
const userIdRef = React.useRef(user?.id);
if (user?.id !== userIdRef.current) {
userIdRef.current = user?.id;
if (user) {
setName(user.name ?? "");
setEmail(user.email ?? "");
setRole(user.role);
}
}
const stableOnClose = useStableCallback(onClose);
const isSelf = user && currentUserId && user.id === currentUserId;
const isDirty =
user && (name !== (user.name ?? "") || email !== user.email || role !== user.role);
const handleSubmit = (e: React.FormEvent) => {
e.preventDefault();
if (!user) return;
const data: UpdateUserInput = {};
if (name !== (user.name ?? "")) {
data.name = name || undefined;
}
if (email !== user.email) {
data.email = email;
}
if (role !== user.role && !isSelf) {
data.role = role;
}
onSave(data);
};
return (
{t`Recovery link sent to ${user.email}`}
{recoveryError}