"use client" import { useCallback, useEffect, useRef, useState, useMemo } from "react" import { PageHeader } from "@/components/page-header" import { DataPageToolbar } from "@/components/data-page-toolbar" import { DataPageCard } from "@/components/data-page-card" import { UsersDataGrid } from "@/components/data-grids/users-data-grid" import { KpiStatGrid } from "@/components/reui-kit/kpi-stat-grid" import { UserSheet } from "@/components/users/user-sheet" import { Button } from "@/components/ui/button" import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogMedia, AlertDialogTitle, } from "@/components/ui/alert-dialog" import { servers as mockServers } from "@/lib/data" import { useDataSource } from "@/lib/data-source" import { ALL_SECTIONS, INIT_USERS, userInitials, type AppUser, type AppUserForm, type UserServerOption, } from "@/lib/users" import { serverListSchema } from "@mmapp/contracts/servers" import { requestJson } from "@/shared/api/http-client" import { can } from "@/lib/auth" import { userApiError, createAppUser, getAppUser, createUserBinding, deleteAppUser, deleteUserBinding, listAppUsers, updateAppUser, } from "@/shared/api/users" import { saveUserSteps, userProfileRequest, type UserSaveCheckpoint } from "@/lib/user-save" import { toast } from "sonner" import { CableIcon, PlusIcon, TrashIcon, UserCheckIcon, UsersIcon, } from "lucide-react" function toServerOptionsFromMock(): UserServerOption[] { return mockServers.map((s) => ({ id: s.id, name: s.name, host: s.host, site: s.site, country: s.country, status: s.status === "unknown" ? null : s.status, })) } export default function UsersPage() { const { mode, backendUrl, prefsHydrated } = useDataSource() if (!prefsHydrated) return
Загрузка настроек пользователей…
return{operationNotice}
} {!isLive &&Демо: изменения сохраняются только в текущем экране.
} {!canRead &&Для чтения пользователей требуется mm:users:read.
} {!canWrite &&Для изменения пользователей требуется mm:users:write.
} {isLive && !canReadServers &&Каталог серверов недоступен: требуется mm:servers:read. Изменения приостановлены.
} {usersError &&{usersKnown ? "Не удалось обновить пользователей. Последний список сохранён." : "Пользователи пока неизвестны."}
{usersError}
{serversKnown ? "Не удалось обновить серверы. Последний каталог сохранён." : "Каталог серверов пока неизвестен."} Изменения приостановлены.
{serversError}
Пользователи получены: {new Date(usersReadAt).toLocaleTimeString("ru-RU")}{loading ? " · обновляются" : ""}
} {isLive && loading && !usersKnown &&Загрузка пользователей…
} {/* Preview: https://reui.io/preview/base/stats-12 · https://reui.io/docs/components/base/icon-tile */}{deleteError}
}