import React, { useState, useEffect, useContext } from 'react' import { useNavigate } from 'react-router-dom' import api from '../api' import { AuthContext } from '../context/AuthContext' import '../styles/global.css' export default function Models() { const navigate = useNavigate() const { user } = useContext(AuthContext) const [models, setModels] = useState([]) const [categories, setCategories] = useState([]) const [brands, setBrands] = useState([]) const [loading, setLoading] = useState(true) const [showForm, setShowForm] = useState(false) const [editingModel, setEditingModel] = useState(null) const [formData, setFormData] = useState({ name: '', category_id: '', brand: '', base_price: '', sizes: '', description: '', }) // Redirect if not admin useEffect(() => { if (!user?.is_admin) { navigate('/') } }, [user, navigate]) useEffect(() => { fetchModels() fetchCategories() fetchBrands() }, []) const fetchModels = async () => { try { const response = await api.get('/models') setModels(response.data) } catch (error) { console.error('Error fetching models:', error) } finally { setLoading(false) } } const fetchCategories = async () => { try { const response = await api.get('/categories') setCategories(response.data) } catch (error) { console.error('Error fetching categories:', error) } } const fetchBrands = async () => { try { const response = await api.get('/brands') setBrands(response.data.map(b => b.name).sort()) } catch (error) { console.error('Error fetching brands:', error) } } const handleChange = (e) => { const { name, value } = e.target setFormData({ ...formData, [name]: value }) } const handleSubmit = async (e) => { e.preventDefault() const modelData = { ...formData, category_id: parseInt(formData.category_id), base_price: formData.base_price ? parseFloat(formData.base_price) : null, sizes: formData.sizes ? formData.sizes.split(',').map(s => s.trim()) : [], } try { if (editingModel) { await api.put(`/models/${editingModel.id}`, modelData) alert('Model updated successfully!') } else { await api.post('/models', modelData) alert('Model created successfully!') } setShowForm(false) setEditingModel(null) resetForm() fetchModels() } catch (error) { console.error('Error saving model:', error) alert('Error saving model: ' + (error.response?.data?.detail || 'Unknown error')) } } const handleEdit = (model) => { setEditingModel(model) setFormData({ name: model.name || '', category_id: model.category_id || '', brand: model.brand || '', base_price: model.base_price || '', sizes: Array.isArray(model.sizes) ? model.sizes.join(', ') : '', description: model.description || '', }) setShowForm(true) setTimeout(() => { window.scrollTo({ top: 0, behavior: 'smooth' }) }, 100) } const handleDelete = async (id) => { if (!confirm('Are you sure you want to delete this model? This will unlink all associated products.')) return try { await api.delete(`/models/${id}`) alert('Model deleted successfully!') fetchModels() } catch (error) { console.error('Error deleting model:', error) alert('Error deleting model: ' + (error.response?.data?.detail || 'Unknown error')) } } const resetForm = () => { setFormData({ name: '', category_id: '', brand: '', base_price: '', sizes: '', description: '', }) } const handleCancel = () => { setShowForm(false) setEditingModel(null) resetForm() } if (!user?.is_admin) { return null } const getCategoryName = (categoryId) => { const category = categories.find(c => c.id === categoryId) return category ? category.name : 'Unknown' } return (
Loading...
) : (| ID | Model Name | Brand | Category | Base Price | Sizes | Actions |
|---|---|---|---|---|---|---|
| {model.id} | {model.name} | {model.brand} | {getCategoryName(model.category_id)} | {model.base_price ? `$${parseFloat(model.base_price).toFixed(2)}` : '-'} | {model.sizes ? model.sizes.join(', ') : '-'} |