"use client" import { useState, useEffect } from 'react' import { useQuery } from '@apollo/client' import { gql } from '@apollo/client' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar' import { Badge } from '@/components/ui/badge' import { Search, Phone, Building, Calendar, ChevronLeft, ChevronRight, Loader2 } from 'lucide-react' // GraphQL запрос для получения пользователей const ALL_USERS = gql` query AllUsers($search: String, $limit: Int, $offset: Int) { allUsers(search: $search, limit: $limit, offset: $offset) { users { id phone managerName avatar createdAt updatedAt organization { id inn name fullName type status createdAt } } total hasMore } } ` interface User { id: string phone: string managerName?: string avatar?: string createdAt: string updatedAt: string organization?: { id: string inn: string name?: string fullName?: string type: string status?: string createdAt: string } } export function UsersSection() { const [search, setSearch] = useState('') const [currentPage, setCurrentPage] = useState(1) const [searchQuery, setSearchQuery] = useState('') const limit = 20 const { data, loading, error, refetch } = useQuery(ALL_USERS, { variables: { search: searchQuery || undefined, limit, offset: (currentPage - 1) * limit }, fetchPolicy: 'cache-and-network' }) // Обновляем запрос при изменении поиска с дебаунсом useEffect(() => { const timer = setTimeout(() => { setSearchQuery(search) setCurrentPage(1) // Сбрасываем на первую страницу при поиске }, 500) return () => clearTimeout(timer) }, [search]) const users = data?.allUsers?.users || [] const total = data?.allUsers?.total || 0 const hasMore = data?.allUsers?.hasMore || false const totalPages = Math.ceil(total / limit) const getOrganizationTypeBadge = (type: string) => { const typeMap = { FULFILLMENT: { label: 'Фулфилмент', variant: 'default' as const }, SELLER: { label: 'Селлер', variant: 'secondary' as const }, LOGIST: { label: 'Логистика', variant: 'outline' as const }, WHOLESALE: { label: 'Поставщик', variant: 'destructive' as const } } return typeMap[type as keyof typeof typeMap] || { label: type, variant: 'outline' as const } } const formatDate = (dateString: string) => { try { const date = new Date(dateString) if (isNaN(date.getTime())) { return 'Неизвестно' } return date.toLocaleDateString('ru-RU', { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit' }) } catch (error) { return 'Неизвестно' } } const getInitials = (name?: string, phone?: string) => { if (name) { return name.split(' ').map(n => n[0]).join('').toUpperCase().slice(0, 2) } if (phone) { return phone.slice(-2) } return 'У' } const handlePrevPage = () => { if (currentPage > 1) { setCurrentPage(currentPage - 1) } } const handleNextPage = () => { if (currentPage < totalPages) { setCurrentPage(currentPage + 1) } } if (error) { return (
Ошибка загрузки пользователей: {error.message}
Управление пользователями системы
Загрузка пользователей...
{searchQuery ? 'Пользователи не найдены' : 'Пользователи отсутствуют'}
ИНН: {user.organization.inn}
{user.organization.status && (Статус: {user.organization.status}
)}Зарегистрировано: {formatDate(user.organization.createdAt)}