import { A } from '@solidjs/router'; import { createMemo, createResource, createSignal, For, Show } from 'solid-js'; import AdminShell from '~/components/AdminShell'; const API = '/api/gateway'; interface User { id: string; name?: string; full_name?: string; email: string; role?: string; role_name?: string; status: 'ACTIVE' | 'INACTIVE' | 'PENDING'; created_at?: string; createdAt?: string; roleId?: string; role_name?: string; userType?: string | number; } const ROLE_OPTIONS = [ 'company', 'job_seeker', 'customer', 'photographer', 'video_editor', 'graphic_designer', 'social_media_manager', 'fitness_trainer', 'catering_services', 'makeup_artist', 'tutor', 'developer', ]; async function fetchUsers(): Promise { try { const res = await fetch(`${API}/api/admin/users`); if (res.status === 404) { const res2 = await fetch(`${API}/api/users`); if (!res2.ok) throw new Error('Failed to load'); const data2 = await res2.json(); return Array.isArray(data2) ? data2 : (data2.users || []); } if (!res.ok) throw new Error('Failed to load'); const data = await res.json(); return Array.isArray(data) ? data : (data.users || []); } catch { return []; } } function StatusBadge(props: { status: string }) { if (props.status === 'ACTIVE') { return ACTIVE; } if (props.status === 'PENDING') { return PENDING; } return INACTIVE; } export default function UsersPage() { const [users, { refetch }] = createResource(fetchUsers); const [activeTab, setActiveTab] = createSignal<'list' | 'view'>('list'); const [selectedUser, setSelectedUser] = createSignal(null); const [search, setSearch] = createSignal(''); const [filterRole, setFilterRole] = createSignal(''); const [filterStatus, setFilterStatus] = createSignal(''); const [currentPage, setCurrentPage] = createSignal(1); const usersPerPage = 10; const filtered = createMemo(() => { const list = users() ?? []; const q = search().toLowerCase(); const role = filterRole(); const status = filterStatus(); return list.filter((u) => { const name = (u.name || u.full_name || '').toLowerCase(); const email = u.email.toLowerCase(); const matchSearch = !q || name.includes(q) || email.includes(q); const matchRole = !role || u.role === role || u.role_name === role; const matchStatus = !status || u.status === status; return matchSearch && matchRole && matchStatus; }); }); const totalPages = createMemo(() => { const count = filtered().length; return Math.max(1, Math.ceil(count / usersPerPage)); }); const paginated = createMemo(() => { const page = currentPage(); const start = (page - 1) * usersPerPage; return filtered().slice(start, start + usersPerPage); }); const shortId = (id: string) => `${id.slice(0, 8)}...`; const registrationRole = (u: User) => (u.role_name || u.role || 'UNKNOWN').toUpperCase(); const onView = (user: User) => { setSelectedUser(user); setActiveTab('view'); }; return (

External User Management

Manage all external platform users.

{/* Filters */}
{ setSearch(e.currentTarget.value); setCurrentPage(1); }} style="border:1px solid #cbd5e1;border-radius:6px;padding:7px 12px;font-size:14px;width:260px;outline:none;" /> Showing {paginated().length} of {filtered().length} users
0}> {(item) => ( )}
User ID Name Email Registration Role Status Created Actions
Loading...
Failed to load. Is the backend running?
No users found.
{shortId(item.id)} {item.name || item.full_name || '—'} {item.email} {registrationRole(item)} {(item.created_at || item.createdAt) ? new Date((item.created_at || item.createdAt)!).toLocaleDateString() : '—'}
Page {currentPage()} of {totalPages()}
Select a user from list to view details.

}>

User Details

Profile

User ID: {selectedUser()!.id}

Name: {selectedUser()!.name || selectedUser()!.full_name || '—'}

Email: {selectedUser()!.email}

Role: {registrationRole(selectedUser()!)}

Status: {selectedUser()!.status}

Account

Created: {(selectedUser()!.created_at || selectedUser()!.createdAt) ? new Date((selectedUser()!.created_at || selectedUser()!.createdAt)!).toLocaleString() : '—'}

Role ID: {selectedUser()!.roleId || '—'}

Edit User
); }