Spaces:
Running
Running
| import axios from 'axios' | |
| // 1. Generate or retrieve a unique, invisible session ID for this browser | |
| const getSessionId = () => { | |
| let sessionId = localStorage.getItem('gradeops_session_id'); | |
| if (!sessionId) { | |
| // Fallback included just in case crypto isn't supported | |
| sessionId = typeof crypto !== 'undefined' && crypto.randomUUID | |
| ? crypto.randomUUID() | |
| : 'sess_' + Math.random().toString(36).substr(2, 9); | |
| localStorage.setItem('gradeops_session_id', sessionId); | |
| } | |
| return sessionId; | |
| }; | |
| // 2. Attach the Session ID to the Axios client headers | |
| const client = axios.create({ | |
| baseURL: '/api', // <--- FIXED: Now ALWAYS uses /api for every environment | |
| timeout: 600_000, | |
| headers: { | |
| 'X-Session-ID': getSessionId() | |
| } | |
| }) | |
| export const api = { | |
| health: () => client.get('/health').then(r => r.data), | |
| users: () => client.get('/users').then(r => r.data), | |
| // Exams | |
| createExam: (payload) => client.post('/exams', payload).then(r => r.data), | |
| listExams: () => client.get('/exams').then(r => r.data), | |
| // Rubrics | |
| createRubric: (payload) => client.post('/rubrics', payload).then(r => r.data), | |
| listRubrics: (examId) => client.get('/rubrics', { params: examId ? { exam_id: examId } : {} }).then(r => r.data), | |
| // Papers / upload | |
| uploadPaper: (examId, rubricId, file, anonId) => { | |
| const fd = new FormData() | |
| fd.append('exam_id', examId) | |
| fd.append('rubric_id', rubricId) | |
| if (anonId) fd.append('student_anon_id', anonId) | |
| fd.append('file', file) | |
| return client.post('/papers/upload', fd, { | |
| headers: { 'Content-Type': 'multipart/form-data' }, | |
| }).then(r => r.data) | |
| }, | |
| // Review queue | |
| reviewQueue: (examId) => client.get('/review/queue', { params: examId ? { exam_id: examId } : {} }).then(r => r.data), | |
| submitReview: (payload) => client.post('/reviews', payload).then(r => r.data), | |
| // Audit + stats | |
| audit: () => client.get('/audit').then(r => r.data), | |
| plagiarism: () => client.get('/plagiarism').then(r => r.data), | |
| stats: () => client.get('/stats').then(r => r.data), | |
| // Crop image URL | |
| cropImageUrl: (cropId) => `/api/crops/${cropId}/image`, | |
| } |