{product.name}
{(product.category && product.category.name) || 'Uncategorized'}{product.short_description}
: null}import { useEffect, useMemo, useState } from 'react';
import Head from 'next/head';
import { AdminLayout } from '../../../components/AdminLayout';
import { useAdminApi } from '../../../hooks/useAdminApi';
const LOCAL_TOKEN_KEY = 'fullmoon_admin_token';
export default function AdminMenu() {
const [token, setToken] = useState('');
const [products, setProducts] = useState([]);
const [categories, setCategories] = useState([]);
const [isEditing, setIsEditing] = useState(false);
const [formState, setFormState] = useState(initialProductState);
useEffect(() => {
if (typeof window !== 'undefined') {
const stored = window.localStorage.getItem(LOCAL_TOKEN_KEY);
if (stored) {
setToken(stored);
}
}
}, []);
const { request, loading, error } = useAdminApi(token);
useEffect(() => {
if (!token) return;
async function loadData() {
try {
const [productsData, categoriesData] = await Promise.all([
request('/api/commerce/admin/products/'),
request('/api/commerce/admin/categories/'),
]);
setProducts(productsData);
setCategories(categoriesData);
} catch (err) {
console.error(err);
}
}
loadData();
}, [token, request]);
const featuredProducts = useMemo(
() => products.filter((product) => product.is_featured),
[products]
);
const handleSubmit = async (event) => {
event.preventDefault();
try {
const payload = buildPayload(formState);
const url = isEditing
? `/api/commerce/admin/products/${formState.id}/`
: '/api/commerce/admin/products/';
const method = isEditing ? 'PUT' : 'POST';
const saved = await request(url, {
method,
body: JSON.stringify(payload),
});
setProducts((prev) => {
if (isEditing) {
return prev.map((product) => (product.id === saved.id ? saved : product));
}
return [saved, ...prev];
});
resetForm();
} catch (err) {
console.error(err);
}
};
const handleEdit = (product) => {
setIsEditing(true);
setFormState(mapProductToForm(product));
window.scrollTo({ top: 0, behavior: 'smooth' });
};
const handleDelete = async (productId) => {
if (!window.confirm('Delete this product?')) return;
try {
await request(`/api/commerce/admin/products/${productId}/`, {
method: 'DELETE',
});
setProducts((prev) => prev.filter((product) => product.id !== productId));
} catch (err) {
console.error(err);
}
};
const resetForm = () => {
setIsEditing(false);
setFormState(initialProductState);
};
if (!token) {
return
Add breads, bagels, sweets, and weekly specials. Quantities decrement automatically with each order so you never oversell.
{products.length} product{products.length === 1 ? '' : 's'} · {featuredProducts.length}{' '} featured
{product.short_description}
: null}Paste your API token to unlock the admin tools. Generate one via Django Admin → Tokens.