import React, { createContext, useContext, useState, ReactNode } from "react"; import { EventData, EventStatus, EventType, Institution } from "../types"; // Initial Mock Data const INITIAL_INSTITUTIONS: Institution[] = [ { id: "inst-1", name: "Universidade Federal do Rio Grande do Sul", type: "Universidade Pública", phone: "(51) 3308-3333", email: "eventos@ufrgs.br", address: { street: "Av. Paulo Gama", number: "110", city: "Porto Alegre", state: "RS", zip: "90040-060", }, description: "Campus Central - Principais eventos realizados no Salão de Atos", ownerId: "client-1", }, ]; const INITIAL_EVENTS: EventData[] = [ { id: "1", name: "Casamento Juliana & Marcos", date: "2024-10-15", time: "16:00", type: EventType.WEDDING, status: EventStatus.CONFIRMED, address: { street: "Av. das Hortênsias", number: "1200", city: "Gramado", state: "RS", zip: "95670-000", }, briefing: "Cerimônia ao pôr do sol. Foco em fotos espontâneas dos noivos e pais.", coverImage: "https://picsum.photos/id/1059/800/400", contacts: [ { id: "c1", name: "Cerimonial Silva", role: "Cerimonialista", phone: "9999-9999", email: "c@teste.com", }, ], checklist: [], ownerId: "client-1", photographerIds: ["photographer-1"], institutionId: "inst-1", }, { id: "2", name: "Conferência Tech Innovators", date: "2024-11-05", time: "08:00", type: EventType.CORPORATE, status: EventStatus.PENDING_APPROVAL, address: { street: "Rua Olimpíadas", number: "205", city: "São Paulo", state: "SP", zip: "04551-000", }, briefing: "Cobrir palestras principais e networking no coffee break.", coverImage: "https://picsum.photos/id/3/800/400", contacts: [], checklist: [], ownerId: "client-2", // Other client photographerIds: [], }, ]; interface DataContextType { events: EventData[]; institutions: Institution[]; addEvent: (event: EventData) => void; updateEventStatus: (id: string, status: EventStatus) => void; assignPhotographer: (eventId: string, photographerId: string) => void; getEventsByRole: (userId: string, role: string) => EventData[]; addInstitution: (institution: Institution) => void; updateInstitution: (id: string, institution: Partial) => void; getInstitutionsByUserId: (userId: string) => Institution[]; getInstitutionById: (id: string) => Institution | undefined; } const DataContext = createContext(undefined); export const DataProvider: React.FC<{ children: ReactNode }> = ({ children, }) => { const [events, setEvents] = useState(INITIAL_EVENTS); const [institutions, setInstitutions] = useState(INITIAL_INSTITUTIONS); const addEvent = (event: EventData) => { setEvents((prev) => [event, ...prev]); }; const updateEventStatus = (id: string, status: EventStatus) => { setEvents((prev) => prev.map((e) => (e.id === id ? { ...e, status } : e))); }; const assignPhotographer = (eventId: string, photographerId: string) => { setEvents((prev) => prev.map((e) => { if (e.id === eventId) { const current = e.photographerIds || []; if (!current.includes(photographerId)) { return { ...e, photographerIds: [...current, photographerId] }; } } return e; }) ); }; const getEventsByRole = (userId: string, role: string) => { if (role === "SUPERADMIN" || role === "BUSINESS_OWNER") { return events; } if (role === "EVENT_OWNER") { return events.filter((e) => e.ownerId === userId); } if (role === "PHOTOGRAPHER") { return events.filter((e) => e.photographerIds.includes(userId)); } return []; }; const addInstitution = (institution: Institution) => { setInstitutions((prev) => [...prev, institution]); }; const updateInstitution = (id: string, updatedData: Partial) => { setInstitutions((prev) => prev.map((inst) => (inst.id === id ? { ...inst, ...updatedData } : inst)) ); }; const getInstitutionsByUserId = (userId: string) => { return institutions.filter((inst) => inst.ownerId === userId); }; const getInstitutionById = (id: string) => { return institutions.find((inst) => inst.id === id); }; return ( {children} ); }; export const useData = () => { const context = useContext(DataContext); if (!context) throw new Error("useData must be used within a DataProvider"); return context; };