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
| User ID |
Name |
Email |
Registration Role |
Status |
Created |
Actions |
| Loading... |
| Failed to load. Is the backend running? |
| No users found. |
0}>
{(item) => (
| {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()
: '—'}
|
↗
✎
|
)}
Select a user from list to view 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 || '—'}
);
}