164 lines
5.1 KiB
JavaScript
164 lines
5.1 KiB
JavaScript
import { useState, useEffect } from 'react'
|
|
import EventList from './components/EventList'
|
|
import EventForm from './components/EventForm'
|
|
import TemplateEditor from './components/TemplateEditor'
|
|
import EventMembers from './components/EventMembers'
|
|
import GuestList from './components/GuestList'
|
|
import GuestSelfService from './components/GuestSelfService'
|
|
import Login from './components/Login'
|
|
import ThemeToggle from './components/ThemeToggle'
|
|
import './App.css'
|
|
|
|
function App() {
|
|
const [currentPage, setCurrentPage] = useState('events') // 'events', 'guests', 'guest-self-service', 'templates'
|
|
const [selectedEventId, setSelectedEventId] = useState(null)
|
|
const [showEventForm, setShowEventForm] = useState(false)
|
|
const [showMembersModal, setShowMembersModal] = useState(false)
|
|
// Check if user is authenticated by looking for userId in localStorage
|
|
const [isAuthenticated, setIsAuthenticated] = useState(() => {
|
|
return !!localStorage.getItem('userId')
|
|
})
|
|
const [theme, setTheme] = useState(() => {
|
|
return localStorage.getItem('theme') || 'light'
|
|
})
|
|
|
|
// Initialize theme
|
|
useEffect(() => {
|
|
document.documentElement.setAttribute('data-theme', theme)
|
|
localStorage.setItem('theme', theme)
|
|
}, [theme])
|
|
|
|
// Listen for authentication changes (when user logs in via Google)
|
|
useEffect(() => {
|
|
const handleStorageChange = () => {
|
|
setIsAuthenticated(!!localStorage.getItem('userId'))
|
|
}
|
|
|
|
// Check if just logged in via Google OAuth callback
|
|
if (localStorage.getItem('userId') && !isAuthenticated) {
|
|
setIsAuthenticated(true)
|
|
}
|
|
|
|
// Listen for changes in other tabs
|
|
window.addEventListener('storage', handleStorageChange)
|
|
return () => window.removeEventListener('storage', handleStorageChange)
|
|
}, [isAuthenticated])
|
|
|
|
// Check URL for current page/event and restore from URL params
|
|
useEffect(() => {
|
|
const path = window.location.pathname
|
|
const params = new URLSearchParams(window.location.search)
|
|
|
|
// Handle guest self-service mode
|
|
if (path === '/guest' || path === '/guest/') {
|
|
setCurrentPage('guest-self-service')
|
|
return
|
|
}
|
|
|
|
// Handle guests page with eventId in URL: /events/:eventId/guests
|
|
const match = path.match(/^\/events\/([^/]+)\/guests\/?$/)
|
|
if (match) {
|
|
const eventIdFromUrl = match[1]
|
|
setSelectedEventId(eventIdFromUrl)
|
|
setCurrentPage('guests')
|
|
return
|
|
}
|
|
|
|
// Handle OAuth callback - either in query params or sessionStorage
|
|
const eventIdFromUrl = params.get('eventId')
|
|
const googleEventId = sessionStorage.getItem('googleEventId')
|
|
const eventToNavigateTo = eventIdFromUrl || googleEventId
|
|
|
|
if (eventToNavigateTo) {
|
|
setSelectedEventId(eventToNavigateTo)
|
|
setCurrentPage('guests')
|
|
// Navigate to proper URL format
|
|
window.history.replaceState({}, document.title, `/events/${eventToNavigateTo}/guests`)
|
|
// Clean up sessionStorage
|
|
sessionStorage.removeItem('googleEventId')
|
|
return
|
|
}
|
|
|
|
// Default to events page
|
|
setCurrentPage('events')
|
|
}, [])
|
|
|
|
const handleGoToTemplates = () => setCurrentPage('templates')
|
|
const handleBackFromTemplates = () => setCurrentPage('events')
|
|
|
|
const handleEventSelect = (eventId) => {
|
|
setSelectedEventId(eventId)
|
|
setCurrentPage('guests')
|
|
// Navigate to proper URL format
|
|
window.history.pushState({}, document.title, `/events/${eventId}/guests`)
|
|
}
|
|
|
|
const handleBackToEvents = () => {
|
|
setSelectedEventId(null)
|
|
setCurrentPage('events')
|
|
window.history.pushState({}, document.title, '/')
|
|
}
|
|
|
|
const handleEventCreated = (newEvent) => {
|
|
setShowEventForm(false)
|
|
setSelectedEventId(newEvent.id)
|
|
setCurrentPage('guests')
|
|
window.history.pushState({}, document.title, `/events/${newEvent.id}/guests`)
|
|
}
|
|
|
|
const toggleTheme = () => {
|
|
setTheme(theme === 'light' ? 'dark' : 'light')
|
|
}
|
|
|
|
if (!isAuthenticated && currentPage !== 'guest-self-service') {
|
|
return <Login onLogin={() => setIsAuthenticated(true)} />
|
|
}
|
|
|
|
return (
|
|
<div className="app" dir="rtl">
|
|
<ThemeToggle theme={theme} onToggle={toggleTheme} />
|
|
{currentPage === 'events' && (
|
|
<>
|
|
<EventList
|
|
onEventSelect={handleEventSelect}
|
|
onCreateEvent={() => setShowEventForm(true)}
|
|
onManageTemplates={handleGoToTemplates}
|
|
/>
|
|
{showEventForm && (
|
|
<EventForm
|
|
onEventCreated={handleEventCreated}
|
|
onCancel={() => setShowEventForm(false)}
|
|
/>
|
|
)}
|
|
</>
|
|
)}
|
|
|
|
{currentPage === 'guests' && selectedEventId && (
|
|
<>
|
|
<GuestList
|
|
eventId={selectedEventId}
|
|
onBack={handleBackToEvents}
|
|
onShowMembers={() => setShowMembersModal(true)}
|
|
/>
|
|
{showMembersModal && (
|
|
<EventMembers
|
|
eventId={selectedEventId}
|
|
onClose={() => setShowMembersModal(false)}
|
|
/>
|
|
)}
|
|
</>
|
|
)}
|
|
|
|
{currentPage === 'templates' && (
|
|
<TemplateEditor onBack={handleBackFromTemplates} />
|
|
)}
|
|
|
|
{currentPage === 'guest-self-service' && (
|
|
<GuestSelfService />
|
|
)}
|
|
</div>
|
|
)
|
|
}
|
|
|
|
export default App
|