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 && } - -
- ))} + {/* Overlay for text readability if background image exists */} +
+

{campaign.name}

+ +
+
+ ); + })} {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