diff --git a/cshare-app/src/lib/api.js b/cshare-app/src/lib/api.js new file mode 100644 index 0000000..3f95382 --- /dev/null +++ b/cshare-app/src/lib/api.js @@ -0,0 +1,97 @@ +const API_BASE = ( + import.meta.env.VITE_API_BASE_URL || + (import.meta.env.DEV ? 'http://localhost:4001' : window.location.origin) +).replace(/\/$/, ''); + +async function request(path, options = {}) { + const response = await fetch(`${API_BASE}${path}`, { + credentials: 'include', + headers: { + ...(options.body instanceof FormData ? {} : { 'Content-Type': 'application/json' }), + ...options.headers, + }, + ...options, + }); + + if (!response.ok) { + const payload = await response.json().catch(() => ({})); + throw new Error(payload.error || `Request failed with ${response.status}`); + } + + if (response.status === 204) return null; + return response.json(); +} + +export function uploadFile(file, { onProgress } = {}) { + return new Promise((resolve, reject) => { + const xhr = new XMLHttpRequest(); + const form = new FormData(); + form.append('file', file); + + xhr.open('POST', `${API_BASE}/api/v1/files/upload`); + xhr.withCredentials = true; + + xhr.upload.onprogress = (event) => { + if (event.lengthComputable && onProgress) { + onProgress(Math.round((event.loaded / event.total) * 100)); + } + }; + + xhr.onload = () => { + if (xhr.status >= 200 && xhr.status < 300) { + resolve(JSON.parse(xhr.responseText)); + return; + } + try { + reject(new Error(JSON.parse(xhr.responseText).error || 'Upload failed')); + } catch { + reject(new Error('Upload failed')); + } + }; + + xhr.onerror = () => reject(new Error('Could not reach upload service')); + xhr.send(form); + }); +} + +export async function listFiles() { + const payload = await request('/api/v1/files'); + return payload.data; +} + +export async function deleteFile(id) { + await request(`/api/v1/files/${id}`, { method: 'DELETE' }); +} + +export async function getDashboardStats() { + const payload = await request('/api/v1/dashboard/stats'); + return payload.data; +} + +export async function getDashboardActivity() { + const payload = await request('/api/v1/dashboard/activity'); + return payload.data; +} + +export async function getDashboardStorage() { + const payload = await request('/api/v1/dashboard/storage'); + return payload.data; +} + +export async function getFileAnalytics(fileId) { + const payload = await request(`/api/v1/files/${fileId}/analytics`); + return payload.data; +} + +export async function resolveLink(linkId) { + const payload = await request(`/api/v1/links/${linkId}`); + return payload.data; +} + +export function downloadUrl(linkId) { + return `${API_BASE}/api/v1/links/${linkId}/download`; +} + +export function previewUrl(linkId) { + return `${API_BASE}/api/v1/links/${linkId}/preview`; +}