import { useState } from 'react' import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query' import { apiClient } from '../../core/api/api-client' const fetchMitras = async () => { const res = await apiClient.get('/internal/mitras') return res.data.data } const fetchOnlineMitras = async () => { const res = await apiClient.get('/internal/mitras/online') return res.data.data } const createMitra = async (data) => { const res = await apiClient.post('/internal/mitras', data) return res.data.data } const updateMitraStatus = async ({ id, is_active }) => { const res = await apiClient.patch(`/internal/mitras/${id}/status`, { is_active }) return res.data.data } const fetchOnlineLogs = async (mitraId) => { const res = await apiClient.get(`/internal/mitras/${mitraId}/online-logs`) return res.data.data } export default function MitrasPage() { const queryClient = useQueryClient() const { data, isLoading } = useQuery({ queryKey: ['mitras'], queryFn: fetchMitras }) const { data: onlineData } = useQuery({ queryKey: ['mitras-online'], queryFn: fetchOnlineMitras, refetchInterval: 10000, }) const [form, setForm] = useState({ phone: '', display_name: '' }) const [showForm, setShowForm] = useState(false) const [logsForMitra, setLogsForMitra] = useState(null) const { data: logsData, isLoading: logsLoading } = useQuery({ queryKey: ['mitra-online-logs', logsForMitra], queryFn: () => fetchOnlineLogs(logsForMitra), enabled: !!logsForMitra, }) const createMutation = useMutation({ mutationFn: createMitra, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['mitras'] }) setForm({ phone: '', display_name: '' }) setShowForm(false) }, }) const statusMutation = useMutation({ mutationFn: updateMitraStatus, onSuccess: () => queryClient.invalidateQueries({ queryKey: ['mitras'] }), }) if (isLoading) return
Loading...
// Build a set of online mitra IDs for quick lookup const onlineMitraMap = new Map() for (const m of onlineData ?? []) { onlineMitraMap.set(m.id, m) } return (

Mitra

{showForm && (
{ e.preventDefault(); createMutation.mutate(form) }} style={{ marginBottom: 24, padding: 16, border: '1px solid #eee' }}>

Tambah Mitra Baru

setForm(f => ({ ...f, phone: e.target.value }))} required style={{ display: 'block', marginBottom: 8, width: '100%' }} /> setForm(f => ({ ...f, display_name: e.target.value }))} required style={{ display: 'block', marginBottom: 8, width: '100%' }} /> {createMutation.isError &&

Gagal menyimpan.

}
)} {data?.items?.map((mitra) => { const onlineInfo = onlineMitraMap.get(mitra.id) return ( ) })}
Nama Nomor HP Status Akun Online Sesi Aktif Aksi
{mitra.display_name} {mitra.phone} {mitra.is_active ? 'Aktif' : 'Nonaktif'} {onlineInfo ? '● Online' : '○ Offline'} {onlineInfo ? onlineInfo.active_session_count : '-'}
{logsForMitra && (

Log Online/Offline

{logsLoading ? (

Loading...

) : ( {logsData?.items?.map((log) => ( ))}
Status Waktu
{log.status === 'online' ? '● Online' : '○ Offline'} {new Date(log.timestamp).toLocaleString('id-ID')}
)}
)}
) }