mirror of
http://88.130.71.182:3000/BlitTech/badoHair_fe.git
synced 2026-06-12 23:23:22 +00:00
103 lines
3.5 KiB
TypeScript
103 lines
3.5 KiB
TypeScript
"use client";
|
|
|
|
import React, { useContext, useState, ReactNode, createContext } from "react";
|
|
import { Product, products } from "@/data/products";
|
|
|
|
export interface Reservation {
|
|
id: string;
|
|
clientName: string;
|
|
email: string;
|
|
phone: string;
|
|
service: string;
|
|
date: string;
|
|
time: string;
|
|
status: "pending" | "confirmed" | "cancelled";
|
|
createdAt: string;
|
|
}
|
|
|
|
const initialReservations: Reservation[] = [
|
|
{ id: "r1", clientName: "Marie Dupont", email: "marie@example.com", phone: "+33 6 12 34 56 78", service: "Pose complète", date: "2026-04-22", time: "10:00", status: "confirmed", createdAt: "2026-04-15" },
|
|
{ id: "r2", clientName: "Sophie Laurent", email: "sophie@example.com", phone: "+33 6 98 76 54 32", service: "Conseil personnalisé", date: "2026-04-23", time: "14:30", status: "pending", createdAt: "2026-04-16" },
|
|
{ id: "r3", clientName: "Amira Benali", email: "amira@example.com", phone: "+33 7 11 22 33 44", service: "Retouche", date: "2026-04-25", time: "11:00", status: "confirmed", createdAt: "2026-04-17" },
|
|
{ id: "r4", clientName: "Léa Martin", email: "lea@example.com", phone: "+33 6 55 44 33 22", service: "Pose complète", date: "2026-04-28", time: "15:00", status: "pending", createdAt: "2026-04-17" },
|
|
];
|
|
|
|
interface AdminContextType {
|
|
isAdmin: boolean;
|
|
login: (password: string) => boolean;
|
|
logout: () => void;
|
|
products: Product[];
|
|
addProduct: (product: Omit<Product, "id">) => void;
|
|
updateProduct: (id: string, product: Partial<Product>) => void;
|
|
deleteProduct: (id: string) => void;
|
|
reservations: Reservation[];
|
|
updateReservationStatus: (id: string, status: Reservation["status"]) => void;
|
|
deleteReservation: (id: string) => void;
|
|
}
|
|
|
|
const AdminContext = createContext<AdminContextType | undefined>(undefined);
|
|
|
|
const ADMIN_PASSWORD = "admin123";
|
|
|
|
export const AdminProvider = ({ children }: { children: ReactNode }) => {
|
|
const [isAdmin, setIsAdmin] = useState(false);
|
|
const [productList, setProducts] = useState<Product[]>(products);
|
|
const [reservations, setReservations] = useState<Reservation[]>(initialReservations);
|
|
|
|
const login = (password: string) => {
|
|
if (password === ADMIN_PASSWORD) {
|
|
setIsAdmin(true);
|
|
return true;
|
|
}
|
|
return false;
|
|
};
|
|
|
|
const logout = () => setIsAdmin(false);
|
|
|
|
const addProduct = (product: Omit<Product, "id">) => {
|
|
const newProduct: Product = { ...product, id: `p-${Date.now()}` };
|
|
setProducts((prev) => [newProduct, ...prev]);
|
|
};
|
|
|
|
const updateProduct = (id: string, updates: Partial<Product>) => {
|
|
setProducts((prev) => prev.map((p) => (p.id === id ? { ...p, ...updates } : p)));
|
|
};
|
|
|
|
const deleteProduct = (id: string) => {
|
|
setProducts((prev) => prev.filter((p) => p.id !== id));
|
|
};
|
|
|
|
const updateReservationStatus = (id: string, status: Reservation["status"]) => {
|
|
setReservations((prev) => prev.map((r) => (r.id === id ? { ...r, status } : r)));
|
|
};
|
|
|
|
const deleteReservation = (id: string) => {
|
|
setReservations((prev) => prev.filter((r) => r.id !== id));
|
|
};
|
|
|
|
return (
|
|
<AdminContext.Provider
|
|
value={{
|
|
isAdmin,
|
|
login,
|
|
logout,
|
|
products: productList,
|
|
addProduct,
|
|
updateProduct,
|
|
deleteProduct,
|
|
reservations,
|
|
updateReservationStatus,
|
|
deleteReservation,
|
|
}}
|
|
>
|
|
{children}
|
|
</AdminContext.Provider>
|
|
);
|
|
};
|
|
|
|
export const useAdmin = () => {
|
|
const ctx = useContext(AdminContext);
|
|
if (!ctx) throw new Error("useAdmin must be used within AdminProvider");
|
|
return ctx;
|
|
};
|