| import { useEffect, useState } from 'react' | |
| export function useAccountsData({ apiFetch }) { | |
| const [queueStatus, setQueueStatus] = useState(null) | |
| const [keysExpanded, setKeysExpanded] = useState(false) | |
| const [accounts, setAccounts] = useState([]) | |
| const [page, setPage] = useState(1) | |
| const [pageSize, setPageSize] = useState(10) | |
| const [totalPages, setTotalPages] = useState(1) | |
| const [totalAccounts, setTotalAccounts] = useState(0) | |
| const [loadingAccounts, setLoadingAccounts] = useState(false) | |
| const resolveAccountIdentifier = (acc) => { | |
| if (!acc || typeof acc !== 'object') return '' | |
| return String(acc.identifier || acc.email || acc.mobile || '').trim() | |
| } | |
| const [searchQuery, setSearchQuery] = useState('') | |
| const fetchAccounts = async (targetPage = page, targetPageSize = pageSize, targetQuery = searchQuery) => { | |
| setLoadingAccounts(true) | |
| try { | |
| let url = `/admin/accounts?page=${targetPage}&page_size=${targetPageSize}` | |
| if (targetQuery.trim()) url += `&q=${encodeURIComponent(targetQuery.trim())}` | |
| const res = await apiFetch(url) | |
| if (res.ok) { | |
| const data = await res.json() | |
| setAccounts(data.items || []) | |
| setTotalPages(data.total_pages || 1) | |
| setTotalAccounts(data.total || 0) | |
| setPage(data.page || 1) | |
| } | |
| } catch (e) { | |
| console.error('Failed to fetch accounts:', e) | |
| } finally { | |
| setLoadingAccounts(false) | |
| } | |
| } | |
| const changePageSize = (newSize) => { | |
| setPageSize(newSize) | |
| fetchAccounts(1, newSize) | |
| } | |
| const handleSearchChange = (query) => { | |
| setSearchQuery(query) | |
| fetchAccounts(1, pageSize, query) | |
| } | |
| const fetchQueueStatus = async () => { | |
| try { | |
| const res = await apiFetch('/admin/queue/status') | |
| if (res.ok) { | |
| const data = await res.json() | |
| setQueueStatus(data) | |
| } | |
| } catch (e) { | |
| console.error('Failed to fetch queue status:', e) | |
| } | |
| } | |
| useEffect(() => { | |
| fetchAccounts() | |
| fetchQueueStatus() | |
| const interval = setInterval(fetchQueueStatus, 5000) | |
| return () => clearInterval(interval) | |
| }, []) | |
| return { | |
| queueStatus, | |
| keysExpanded, | |
| setKeysExpanded, | |
| accounts, | |
| page, | |
| pageSize, | |
| totalPages, | |
| totalAccounts, | |
| loadingAccounts, | |
| fetchAccounts, | |
| changePageSize, | |
| resolveAccountIdentifier, | |
| searchQuery, | |
| handleSearchChange, | |
| } | |
| } | |