Update: 2026-07-13 22:23:21

This commit is contained in:
Hamza-Ayed
2026-07-13 22:23:22 +03:00
parent fd3f4a365a
commit c6f48a1f91
45 changed files with 3533 additions and 36 deletions
+67
View File
@@ -0,0 +1,67 @@
// api/client.js — عميل HTTP رفيع لبوابة transit/connect_admin.php
// كل الردود بنمط {status:'success'|'failure', message: ...}
const API_BASE = import.meta.env.VITE_API_BASE || 'https://api.siromove.com/transit'
const TOKEN_KEY = 'transit_admin_token'
export function getToken() {
return localStorage.getItem(TOKEN_KEY) || ''
}
export function setToken(token) {
if (token) localStorage.setItem(TOKEN_KEY, token)
else localStorage.removeItem(TOKEN_KEY)
}
class ApiError extends Error {
constructor(message, status) {
super(message)
this.status = status
}
}
async function request(path, body, { isForm = false } = {}) {
const headers = {}
const token = getToken()
if (token) headers['Authorization'] = `Bearer ${token}`
let payload
if (isForm) {
payload = body // already FormData
} else {
headers['Content-Type'] = 'application/x-www-form-urlencoded'
const params = new URLSearchParams()
Object.entries(body || {}).forEach(([k, v]) => {
if (v !== undefined && v !== null) params.append(k, v)
})
payload = params
}
let res
try {
res = await fetch(`${API_BASE}/${path}`, { method: 'POST', headers, body: payload })
} catch (e) {
throw new ApiError('تعذّر الاتصال بالخادم — تحقق من اتصالك بالإنترنت', 0)
}
if (res.status === 401) {
setToken(null)
throw new ApiError('انتهت الجلسة — سجّل الدخول مجدداً', 401)
}
let json
try {
json = await res.json()
} catch (e) {
throw new ApiError('استجابة غير صالحة من الخادم', res.status)
}
if (json.status !== 'success') {
const msg = typeof json.message === 'string' ? json.message : 'حدث خطأ، حاول مجدداً'
throw new ApiError(msg, res.status)
}
return json.message
}
export const api = { request }
export { ApiError }
+54
View File
@@ -0,0 +1,54 @@
// api/transit.js — كل نداءات backend/transit/* (بوابة connect_admin.php)
import { api } from './client'
// ── الدخول ──────────────────────────────────────────────
export const loginRequest = (phone) => api.request('admin/login_request.php', { phone })
export const loginVerify = (phone, otp) => api.request('admin/login_verify.php', { phone, otp })
export const logout = () => api.request('admin/logout.php', {})
// ── لوحة اليوم ──────────────────────────────────────────
export const getDashboard = () => api.request('admin/dashboard.php', {})
// ── الأسطول: مركبات ─────────────────────────────────────
export const listVehicles = () => api.request('vehicle/list.php', {})
export const addVehicle = (v) => api.request('vehicle/add.php', v)
export const updateVehicle = (v) => api.request('vehicle/update.php', v)
export const toggleVehicle = (vehicle_id, is_active) =>
api.request('vehicle/toggle.php', { vehicle_id, is_active: is_active ? 1 : 0 })
// ── الأسطول: سائقون ──────────────────────────────────────
export const listDrivers = (status = 'all') => api.request('driver/list.php', { status })
export const inviteDriver = (d) => api.request('driver/invite.php', d)
export const suspendDriver = (driver_id, action) => api.request('driver/suspend.php', { driver_id, action })
// ── الخطوط ──────────────────────────────────────────────
export const listRoutes = (status = 'all') => api.request('route/list.php', { status })
export const getRoute = (route_id) => api.request('route/get.php', { route_id })
export const addRoute = (payload) =>
api.request('route/add.php', { ...payload, stops: JSON.stringify(payload.stops || []) })
export const updateRoute = (payload) =>
api.request('route/update.php', { ...payload, stops: JSON.stringify(payload.stops || []) })
// ── الجداول ─────────────────────────────────────────────
export const listSchedules = (route_id) => api.request('schedule/list.php', { route_id })
export const addSchedule = (s) => api.request('schedule/add.php', s)
export const deleteSchedule = (schedule_id) => api.request('schedule/delete.php', { schedule_id })
// ── الطلاب / الأعضاء ────────────────────────────────────
export const listEnrollments = (status = 'all', page = 1) =>
api.request('enrollment/list.php', { status, page })
export const approveEnrollment = (enrollment_id, action, expires_at) =>
api.request('enrollment/approve.php', { enrollment_id, action, expires_at })
export const listRosters = () => api.request('enrollment/rosters_list.php', {})
export const importRoster = (file, semester) => {
const fd = new FormData()
fd.append('file', file)
if (semester) fd.append('semester', semester)
return api.request('enrollment/import_roster.php', fd, { isForm: true })
}
// ── الرحلات ─────────────────────────────────────────────
export const cancelTrip = (trip_id, reason) => api.request('trip/cancel.php', { trip_id, reason })
// ── الإعلانات ───────────────────────────────────────────
export const sendBroadcast = (b) => api.request('broadcast/send.php', b)