import { Button, Card, Checkbox, Col, Empty, Input, Row, Space, Table, Tag, Typography, message } from "antd"; import { useEffect, useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import { listRoles, listUserRoles, listUsers, saveUserRoles } from "@/api"; import { SaveOutlined, SearchOutlined, TeamOutlined, UserOutlined } from "@ant-design/icons"; import type { SysRole, SysUser } from "@/types"; import PageHeader from "@/components/shared/PageHeader"; const { Text } = Typography; export default function UserRoleBinding() { const { t } = useTranslation(); const [users, setUsers] = useState([]); const [roles, setRoles] = useState([]); const [loadingUsers, setLoadingUsers] = useState(false); const [loadingRoles, setLoadingRoles] = useState(false); const [saving, setSaving] = useState(false); const [selectedUserId, setSelectedUserId] = useState(null); const [checkedRoleIds, setCheckedRoleIds] = useState([]); const [searchText, setSearchText] = useState(""); const selectedUser = useMemo(() => users.find((user) => user.userId === selectedUserId) || null, [users, selectedUserId]); const loadUsers = async () => { setLoadingUsers(true); try { const list = await listUsers(); setUsers(list || []); } finally { setLoadingUsers(false); } }; const loadRoles = async () => { setLoadingRoles(true); try { const list = await listRoles(); setRoles(list || []); } finally { setLoadingRoles(false); } }; const loadUserRoles = async (userId: number) => { try { const list = await listUserRoles(userId); setCheckedRoleIds(list || []); } catch { setCheckedRoleIds([]); } }; useEffect(() => { loadUsers(); loadRoles(); }, []); useEffect(() => { if (selectedUserId) { loadUserRoles(selectedUserId); } else { setCheckedRoleIds([]); } }, [selectedUserId]); const filteredUsers = useMemo(() => { if (!searchText) return users; const lower = searchText.toLowerCase(); return users.filter( (user) => user.username.toLowerCase().includes(lower) || user.displayName.toLowerCase().includes(lower) ); }, [users, searchText]); const handleSave = async () => { if (!selectedUserId) { message.warning(t("userRole.selectUser")); return; } setSaving(true); try { await saveUserRoles(selectedUserId, checkedRoleIds); message.success(t("common.success")); } finally { setSaving(false); } }; return (