Skip to content

Commit 7c82212

Browse files
committed
Refactor EventDetail to preserve slug on updates; enhance Store with orders management and CSV export; update TransactionsPage to reflect status changes; add summary stats to TransactionsPage; fix UserDetailsPage to display correct transaction status.
1 parent 7d79eee commit 7c82212

7 files changed

Lines changed: 2090 additions & 1708 deletions

File tree

src/component/Events.tsx

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import 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";
33
import type { Event } from "../models/Event";
44
import { db } from "../firebase";
55
import { 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 && (

src/models/Transaction.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export interface Transaction {
1515
finalAmount: number; // in paisa (includes transaction fees)
1616
couponCode?: string | null;
1717
couponDetails?: Record<string, unknown> | null;
18-
status: "pending" | "completed" | "failed" | "cancelled";
18+
status: "pending" | "success" | "failed" | "cancelled";
1919
createdAt: string;
2020
checkoutUrl: string;
2121
// New breakdown fields

0 commit comments

Comments
 (0)