diff --git a/src/App.js b/src/App.js
index 4847e70..6b55776 100644
--- a/src/App.js
+++ b/src/App.js
@@ -2,7 +2,7 @@ import React, { useState, useEffect, useRef } from 'react';
import { initializeApp } from 'firebase/app';
import { getAuth, signInAnonymously, onAuthStateChanged, signInWithCustomToken } from 'firebase/auth';
import { getFirestore, doc, setDoc, addDoc, getDoc, getDocs, collection, onSnapshot, updateDoc, deleteDoc, query, writeBatch } from 'firebase/firestore';
-import { PlusCircle, Users, Swords, Shield, Trash2, Eye, Edit3, Save, XCircle, ChevronsUpDown, UserCheck, UserX, HeartCrack, HeartPulse, Zap, Image as ImageIcon, EyeOff, ExternalLink, AlertTriangle } from 'lucide-react'; // Added AlertTriangle
+import { PlusCircle, Users, Swords, Shield, Trash2, Eye, Edit3, Save, XCircle, ChevronsUpDown, UserCheck, UserX, HeartCrack, HeartPulse, Zap, /* ImageIcon removed */ EyeOff, ExternalLink, AlertTriangle } from 'lucide-react'; // ImageIcon removed
// --- Firebase Configuration ---
const firebaseConfig = {
@@ -126,7 +126,7 @@ function useFirestoreCollection(collectionPath, queryConstraints = []) {
// --- Main App Component ---
function App() {
- const [userId, setUserId] = useState(null); // Kept for potential future use, but not displayed
+ const [userId, setUserId] = useState(null);
const [isAuthReady, setIsAuthReady] = useState(false);
const [isLoading, setIsLoading] = useState(true);
const [error, setError] = useState(null);
@@ -218,7 +218,6 @@ function App() {
TTRPG Initiative Tracker
- {/* UID display removed from header */}
);
@@ -281,7 +280,7 @@ function AdminView({ userId }) {
const [selectedCampaignId, setSelectedCampaignId] = useState(null);
const [showCreateCampaignModal, setShowCreateCampaignModal] = useState(false);
const [showDeleteCampaignConfirm, setShowDeleteCampaignConfirm] = useState(false);
- const [itemToDelete, setItemToDelete] = useState(null); // { id, name, type: 'campaign' }
+ const [itemToDelete, setItemToDelete] = useState(null);
useEffect(() => {
if (campaignsData) {
@@ -360,26 +359,35 @@ function AdminView({ userId }) {
{campaigns.length === 0 && No campaigns yet.
}
- {campaigns.map(campaign => (
-
setSelectedCampaignId(campaign.id)}
- className={`p-4 rounded-lg shadow-md cursor-pointer transition-all ${selectedCampaignId === campaign.id ? 'bg-sky-700 ring-2 ring-sky-400' : 'bg-slate-700 hover:bg-slate-600'}`}
- >
-
{campaign.name}
- {/* Campaign ID display removed */}
- {campaign.playerDisplayBackgroundUrl &&
}
-
+ );
+ })}
{showCreateCampaignModal && setShowCreateCampaignModal(false)} title="Create New Campaign"> setShowCreateCampaignModal(false)} />}
@@ -407,7 +415,13 @@ function AdminView({ userId }) {
);
}
-// ... (CreateCampaignForm remains the same)
+// ... (CreateCampaignForm, CharacterManager, EncounterManager, CreateEncounterForm, ParticipantManager, EditParticipantModal, InitiativeControls, DisplayView, Modal, Icons remain the same as v0.1.23)
+// For brevity, only the changed AdminView is shown in full. The rest of the components are identical to the previous version.
+// The DisplayView, CharacterManager, EncounterManager, etc., and their sub-components
+// (CreateEncounterForm, ParticipantManager, EditParticipantModal, InitiativeControls)
+// are not changed from the previous version provided (v0.1.23).
+// The Modal component and Icon components also remain unchanged.
+
function CreateCampaignForm({ onCreate, onCancel }) {
const [name, setName] = useState('');
const [backgroundUrl, setBackgroundUrl] = useState('');
@@ -436,12 +450,11 @@ function CreateCampaignForm({ onCreate, onCancel }) {
}
-// --- CharacterManager ---
function CharacterManager({ campaignId, campaignCharacters }) {
const [characterName, setCharacterName] = useState('');
const [editingCharacter, setEditingCharacter] = useState(null);
const [showDeleteCharConfirm, setShowDeleteCharConfirm] = useState(false);
- const [itemToDelete, setItemToDelete] = useState(null); // { id, name, type: 'character' }
+ const [itemToDelete, setItemToDelete] = useState(null);
const handleAddCharacter = async () => {
@@ -512,7 +525,6 @@ function CharacterManager({ campaignId, campaignCharacters }) {
);
}
-// --- EncounterManager ---
function EncounterManager({ campaignId, initialActiveEncounterId, campaignCharacters }) {
const {data: encountersData, isLoading: isLoadingEncounters } = useFirestoreCollection(campaignId ? getEncountersCollectionPath(campaignId) : null);
const {data: activeDisplayInfo } = useFirestoreDocument(getActiveDisplayDocPath());
@@ -521,7 +533,7 @@ function EncounterManager({ campaignId, initialActiveEncounterId, campaignCharac
const [selectedEncounterId, setSelectedEncounterId] = useState(null);
const [showCreateEncounterModal, setShowCreateEncounterModal] = useState(false);
const [showDeleteEncounterConfirm, setShowDeleteEncounterConfirm] = useState(false);
- const [itemToDelete, setItemToDelete] = useState(null); // { id, name, type: 'encounter' }
+ const [itemToDelete, setItemToDelete] = useState(null);
const selectedEncounterIdRef = useRef(selectedEncounterId);
@@ -669,10 +681,6 @@ function EncounterManager({ campaignId, initialActiveEncounterId, campaignCharac
);
}
-// ... (CreateEncounterForm, ParticipantManager, EditParticipantModal, InitiativeControls, DisplayView, Modal, Icons)
-// The rest of the components remain the same as in v0.1.22, with the following changes in ParticipantManager and InitiativeControls
-// to use the ConfirmationModal for delete/end actions.
-
function CreateEncounterForm({ onCreate, onCancel }) {
const [name, setName] = useState('');
return (
@@ -699,7 +707,7 @@ function ParticipantManager({ encounter, encounterPath, campaignCharacters }) {
const [hpChangeValues, setHpChangeValues] = useState({});
const [draggedItemId, setDraggedItemId] = useState(null);
const [showDeleteParticipantConfirm, setShowDeleteParticipantConfirm] = useState(false);
- const [itemToDelete, setItemToDelete] = useState(null); // { id, name, type: 'participant' }
+ const [itemToDelete, setItemToDelete] = useState(null);
const participants = encounter.participants || [];
@@ -1143,7 +1151,7 @@ function DisplayView() {
const { name, participants, round, currentTurnParticipantId, isStarted } = activeEncounterData;
- let participantsToRender = []; // Renamed from displayParticipants for clarity
+ let participantsToRender = [];
if (participants) {
if (isStarted && activeEncounterData.turnOrderIds?.length > 0 ) {
participantsToRender = activeEncounterData.turnOrderIds