11import React , { useEffect , useState } from "react" ;
2- import { collection , getDocs , deleteDoc , doc , setDoc } from "firebase/firestore" ;
2+ import { collection , getDocs , deleteDoc , doc , setDoc , updateDoc } from "firebase/firestore" ;
33import type { Event } from "../models/Event" ;
44import { db } from "../firebase" ;
55import { useNavigate } from "react-router-dom" ;
@@ -133,9 +133,19 @@ const EventsPage: React.FC = () => {
133133 }
134134 } ) ;
135135 try {
136- await setDoc ( doc ( db , "events" , slug ) , eventToSave ) ;
137- fetchEvents ( ) ;
138- alert ( editMode ? "Event updated successfully!" : "Event added successfully!" ) ;
136+ if ( editMode && event . eventId ) {
137+ // Editing existing event: update the existing document by its id.
138+ // This preserves the document id (slug) and avoids creating a new doc when title/slug changes.
139+ // updateDoc expects a partial update object; cast to Record<string, unknown> to satisfy TS without using `any`
140+ await updateDoc ( doc ( db , "events" , event . eventId ) , eventToSave as Record < string , unknown > ) ;
141+ await fetchEvents ( ) ;
142+ alert ( "Event updated successfully!" ) ;
143+ } else {
144+ // Creating new event: generate slug and create document with that id
145+ await setDoc ( doc ( db , "events" , slug ) , eventToSave ) ;
146+ await fetchEvents ( ) ;
147+ alert ( "Event added successfully!" ) ;
148+ }
139149 setModalOpen ( false ) ;
140150 } catch ( error ) {
141151 console . error ( "Error saving event:" , error ) ;
@@ -145,7 +155,11 @@ const EventsPage: React.FC = () => {
145155
146156 const handleDelete = async ( id : string | undefined ) => {
147157 if ( ! id ) return ;
148- // perform deletion (assumes permission already checked by caller)
158+ // Only admins can delete events. Show insufficient modal for others.
159+ if ( ! hasRole ( currentUser || null , "admin" ) ) {
160+ setInsufficientModal ( { show : true , message : "You don't have permission to delete this event." } ) ;
161+ return ;
162+ }
149163 try {
150164 await deleteDoc ( doc ( db , "events" , id ) ) ;
151165 fetchEvents ( ) ;
@@ -166,8 +180,8 @@ const EventsPage: React.FC = () => {
166180 const confirmDeleteNow = async ( ) => {
167181 const id = confirmDelete . id ;
168182 if ( ! id ) return setConfirmDelete ( { show : false } ) ;
169- // Permission check
170- if ( ! hasRole ( currentUser || null , [ "event- admin", "admin" ] ) ) {
183+ // Permission check: only admin can delete
184+ if ( ! hasRole ( currentUser || null , " admin") ) {
171185 setConfirmDelete ( { show : false } ) ;
172186 setInsufficientModal ( { show : true , message : "You don't have permission to delete this event." } ) ;
173187 return ;
@@ -299,7 +313,8 @@ const EventsPage: React.FC = () => {
299313 onRequestDelete = { handleRequestDelete }
300314 navigate = { navigate }
301315 canEdit = { ( ev ) => canEditEvent ( currentUser , ev ) }
302- canDelete = { ( ev ) => canEditEvent ( currentUser , ev ) }
316+ // Only admin users may delete events
317+ canDelete = { ( ) => hasRole ( currentUser || null , "admin" ) }
303318 />
304319 { /* Pagination */ }
305320 { totalPages > 1 && (
0 commit comments