Files
clinicpro/assets/admin/lib/api.ts
T
hamed f619449167 feat: add Settlements, SMS, User detail, and Users management pages
- Implement SettlementsPage for managing settlement requests with approval and rejection functionalities.
- Create SmsPage for handling SMS templates, including creation, approval, rejection, and logging.
- Add UserDetailPage to display detailed information about users.
- Develop UsersPage for listing users with search, view, edit, and delete options.
- Introduce new types for User, SmsTemplate, SmsLog, and Settlement to support the new features.
2026-06-09 22:53:26 +03:30

77 lines
1.8 KiB
TypeScript

const BASE_URL = '';
function getToken(): string | null {
try {
const raw = localStorage.getItem('clinicpro-auth');
if (!raw) return null;
const parsed = JSON.parse(raw);
return parsed?.state?.token ?? null;
} catch {
return null;
}
}
export class ApiError extends Error {
constructor(
public status: number,
public code: string,
message: string,
) {
super(message);
}
}
async function request<T>(
path: string,
options: RequestInit = {},
): Promise<T> {
const token = getToken();
const headers: Record<string, string> = {
'Content-Type': 'application/json',
...(options.headers as Record<string, string>),
};
if (token) headers['Authorization'] = `Bearer ${token}`;
const res = await fetch(`${BASE_URL}${path}`, { ...options, headers });
if (!res.ok) {
const body = await res.json().catch(() => ({}));
const firstErr = body?.errors?.[0];
throw new ApiError(
res.status,
firstErr?.code ?? 'ERR_UNKNOWN',
firstErr?.message ?? 'خطای ناشناخته',
);
}
return res.json() as Promise<T>;
}
export const api = {
get: <T>(path: string) => request<T>(path),
post: <T>(path: string, body: unknown) =>
request<T>(path, { method: 'POST', body: JSON.stringify(body) }),
patch: <T>(path: string, body: unknown) =>
request<T>(path, { method: 'PATCH', body: JSON.stringify(body) }),
put: <T>(path: string, body: unknown) =>
request<T>(path, { method: 'PUT', body: JSON.stringify(body) }),
delete: <T>(path: string) => request<T>(path, { method: 'DELETE' }),
};
export interface ApiResponse<T> {
success: boolean;
data: T;
errors: { code: string; message: string; field?: string }[];
}
export interface PaginatedResponse<T> {
success: boolean;
data: {
items: T[];
total: number;
page: number;
limit: number;
};
errors: [];
}