import axios from 'axios'; import { RegisterData, UserData, ProductData, OrderData, AuthResponse } from '../types'; import { Board, BoardWithDetails, BoardCreate, List, Card, CardWithDetails, Label, Checklist, CommentWithUser, } from '../types/kanban'; const api = axios.create({ baseURL: '/api', headers: { 'Content-Type': 'application/json', }, }); // Add token to requests if available api.interceptors.request.use( (config) => { const token = localStorage.getItem('token'); if (token) { config.headers.Authorization = `Bearer ${token}`; } return config; }, (error) => Promise.reject(error) ); // Handle response errors api.interceptors.response.use( (response) => response, (error) => { if (error.response?.status === 401) { // Token expired or invalid localStorage.removeItem('token'); localStorage.removeItem('user'); window.location.href = '/login'; } return Promise.reject(error); } ); export function useApi() { return { // Auth login: async (email: string, password: string): Promise => { const response = await api.post('/auth/login', { email, password, }); return response.data; }, register: async (userData: RegisterData): Promise => { const response = await api.post('/auth/register', userData); return response.data; }, getCurrentUser: async (): Promise => { const response = await api.get('/users/me'); return response.data; }, // Products getProducts: async (): Promise => { const response = await api.get('/products'); return response.data; }, getProduct: async (id: string): Promise => { const response = await api.get(`/products/${id}`); return response.data; }, createProduct: async (productData: Omit): Promise => { const response = await api.post('/products', productData); return response.data; }, updateProduct: async (id: string, productData: Partial): Promise => { const response = await api.put(`/products/${id}`, productData); return response.data; }, deleteProduct: async (id: string): Promise => { await api.delete(`/products/${id}`); }, // Orders getOrders: async (): Promise => { const response = await api.get('/orders'); return response.data; }, getOrder: async (id: string): Promise => { const response = await api.get(`/orders/${id}`); return response.data; }, createOrder: async (orderData: Omit): Promise => { const response = await api.post('/orders', orderData); return response.data; }, // Boards getBoards: async (): Promise => { const response = await api.get('/boards'); return response.data; }, getBoard: async (id: number): Promise => { const response = await api.get(`/boards/${id}`); return response.data; }, createBoard: async (boardData: BoardCreate): Promise => { const response = await api.post('/boards', boardData); return response.data; }, updateBoard: async (id: number, boardData: Partial): Promise => { const response = await api.put(`/boards/${id}`, boardData); return response.data; }, deleteBoard: async (id: number): Promise => { await api.delete(`/boards/${id}`); }, // Lists createList: async (boardId: number, listData: { name: string; pos: number }): Promise => { const response = await api.post(`/boards/${boardId}/lists`, listData); return response.data; }, updateList: async ( id: number, listData: { name: string; pos: number; closed?: boolean } ): Promise => { const response = await api.put(`/lists/${id}`, listData); return response.data; }, deleteList: async (id: number): Promise => { await api.delete(`/lists/${id}`); }, // Cards createCard: async ( listId: number, cardData: { name: string; description?: string; pos: number; due?: string | null; due_complete?: boolean; badges?: Record; cover?: Record; desc_data?: Record; } ): Promise => { const response = await api.post(`/lists/${listId}/cards`, cardData); return response.data; }, getCard: async (id: number): Promise => { const response = await api.get(`/cards/${id}`); return response.data; }, updateCard: async ( id: number, cardData: { name: string; description?: string; pos: number; due?: string | null; due_complete?: boolean; closed?: boolean; list_id?: number; badges?: Record; cover?: Record; desc_data?: Record; } ): Promise => { const response = await api.put(`/cards/${id}`, cardData); return response.data; }, deleteCard: async (id: number): Promise => { await api.delete(`/cards/${id}`); }, // Labels getLabels: async (boardId: number): Promise => { const response = await api.get(`/boards/${boardId}/labels`); return response.data; }, createLabel: async ( boardId: number, labelData: { name: string; color: string } ): Promise