Global Chat Layout Integration
Overview
The global chat feature has been refactored to be available as a base layout component for all authenticated users across the entire PadawanForge application. This provides seamless access to global chat functionality from any page without requiring individual page implementations.
Architecture
Core Components
1. GlobalChatProvider
Location: src/components/providers/GlobalChatProvider.tsx
Purpose: Context provider that manages global chat state and provides the chat interface to all authenticated users.
Features:
- Automatic Display: Shows global chat icon for authenticated users after a 2-second delay
- Default Minimized: Global chat starts as a minimized icon by default
- State Management: Manages visibility state across the application
- Context API: Provides global chat controls to child components
- Conditional Rendering: Only renders for authenticated users
Usage:
<GlobalChatProvider player={player}>
{/* Application content */}
</GlobalChatProvider>
2. Global Chat Toggle Components
Location: src/components/ui/global-chat-toggle.tsx
Components:
GlobalChatToggle: Full-width toggle for desktopGlobalChatToggleCompact: Compact toggle for mobile
Features:
- Real-time Stats: Displays online player count from live data
- Visual Indicators: Shows active state when chat is visible
- Responsive Design: Different layouts for desktop and mobile
- Accessibility: Proper ARIA labels and keyboard navigation
3. Global Chat Stats Hook
Location: src/hooks/useGlobalChatStats.ts
Purpose: Manages global chat statistics and online player count.
Features:
- Auto-polling: Updates stats every 30 seconds
- Error Handling: Graceful error management
- Loading States: Provides loading indicators
- Type Safety: Full TypeScript support
Layout Integration
Base Layout Integration
Location: src/layouts/Layout.astro
The global chat provider is integrated at the layout level, ensuring it’s available on all pages:
---
import { GlobalChatProvider } from '@/components/providers/GlobalChatProvider';
---
<GlobalChatProvider player={player} client:load>
<div class="min-h-full">
<HeaderWrapper />
<main class="flex-1">
<slot />
</main>
<footer />
</div>
</GlobalChatProvider>
Header Integration
Location: src/components/Header.tsx
Global chat toggle buttons are integrated into the main header:
<div className="flex items-center space-x-2">
{/* Global Chat Toggle - Desktop */}
<div className="hidden md:block">
<GlobalChatToggle />
</div>
{/* Global Chat Toggle - Mobile */}
<div className="md:hidden">
<GlobalChatToggleCompact />
</div>
{/* Other header items */}
</div>
User Experience
Automatic Display
- Delayed Show: Global chat icon appears automatically 2 seconds after page load for authenticated users
- Default State: Starts as a minimized icon in the bottom-right corner
- Non-intrusive: Icon-only display by default to avoid interfering with content
- Expandable: Users can click the icon to expand the full chat interface
- Minimizable: Users can minimize or fully hide the chat interface
Visual Feedback
- Active Indicators: Green dot shows when chat is visible
- Online Count: Real-time display of online players
- Connection Status: Visual indicators for connection state
- Responsive Design: Adapts to different screen sizes
Accessibility
- Keyboard Navigation: Full keyboard support for all controls
- Screen Reader Support: Proper ARIA labels and descriptions
- Focus Management: Logical tab order and focus indicators
- High Contrast: Works with high contrast themes
Technical Implementation
Context API Usage
import { useGlobalChat } from '@/components/providers/GlobalChatProvider';
function MyComponent() {
const { isGlobalChatVisible, toggleGlobalChat, showGlobalChat, hideGlobalChat } = useGlobalChat();
return (
<button onClick={toggleGlobalChat}>
{isGlobalChatVisible ? 'Hide' : 'Show'} Global Chat
</button>
);
}
Stats Integration
import { useGlobalChatStats } from '@/hooks/useGlobalChatStats';
function StatsDisplay() {
const { stats, isLoading, error } = useGlobalChatStats();
if (isLoading) return <div>Loading...</div>;
if (error) return <div>Error: {error}</div>;
return (
<div>
<span>{stats.totalOnlinePlayers} online</span>
<span>{stats.activeRooms} rooms</span>
</div>
);
}
WebSocket Management
The global chat uses the existing WebSocket infrastructure:
- Connection: Automatically connects to
/api/global-chat - Reconnection: Automatic reconnection on connection loss
- Message Handling: Supports all global chat message types
- State Persistence: Maintains chat state across page navigation
Configuration Options
Provider Props
<GlobalChatProvider
player={player} // Player data (required)
/>
Toggle Component Props
<GlobalChatToggle
className="custom-class" // Custom CSS classes
showBadge={true} // Show online count badge
onlineCount={42} // Override online count (optional)
/>
Hook Return Values
const {
stats, // Current statistics
isLoading, // Loading state
error, // Error state
refetch // Manual refresh function
} = useGlobalChatStats();
Performance Considerations
Optimizations
- Lazy Loading: Global chat only loads for authenticated users
- Conditional Rendering: Components only render when needed
- Efficient Polling: Stats update every 30 seconds, not continuously
- Memory Management: Proper cleanup of intervals and event listeners
Resource Usage
- WebSocket: Single connection per user for global chat
- API Calls: Minimal API calls for statistics
- DOM Elements: Only renders when visible
- State Updates: Efficient state management with React hooks
Security
Authentication
- User Validation: Only authenticated users can access global chat
- Session Management: Uses existing session infrastructure
- Permission Checks: Respects user roles and permissions
Data Protection
- Input Sanitization: All user input is properly sanitized
- Rate Limiting: Built-in rate limiting for messages
- Content Filtering: AI-powered content moderation
- Privacy Controls: Respects user privacy settings
Migration Guide
For Existing Pages
No changes required! The global chat is automatically available on all pages that use the base layout.
For Custom Layouts
If you have custom layouts, add the GlobalChatProvider:
---
import { GlobalChatProvider } from '@/components/providers/GlobalChatProvider';
---
<GlobalChatProvider player={player} client:load>
<!-- Your custom layout content -->
</GlobalChatProvider>
For Component Integration
To add global chat controls to custom components:
import { useGlobalChat } from '@/components/providers/GlobalChatProvider';
import { GlobalChatToggle } from '@/components/ui/global-chat-toggle';
function MyCustomComponent() {
const { isGlobalChatVisible } = useGlobalChat();
return (
<div>
<GlobalChatToggle />
{/* Your component content */}
</div>
);
}
Future Enhancements
Planned Features
- Chat Preferences: User-configurable chat settings
- Notification Integration: Global chat notifications
- Advanced Moderation: Enhanced moderation tools
- Chat Channels: Multiple global chat channels
- Integration APIs: External system integration
Scalability Improvements
- Message Batching: Efficient handling of high-volume chat
- Regional Distribution: Geographic chat distribution
- Advanced Caching: Intelligent message caching
- Performance Monitoring: Real-time performance metrics
Troubleshooting
Common Issues
Global Chat Not Appearing
- Check if user is authenticated
- Verify GlobalChatProvider is in the layout
- Check browser console for errors
Connection Issues
- Verify WebSocket endpoint is available
- Check network connectivity
- Review server logs for errors
Performance Issues
- Monitor WebSocket connection count
- Check for memory leaks in components
- Review API call frequency
Debug Tools
// Enable debug logging
localStorage.setItem('debug', 'global-chat');
// Check global chat state
console.log(window.__GLOBAL_CHAT_DEBUG__);
Conclusion
The global chat layout integration provides a seamless, accessible, and performant chat experience for all authenticated users across the PadawanForge platform. The modular architecture ensures easy maintenance and future enhancements while maintaining high performance and security standards.
The integration follows React best practices with proper context management, efficient state updates, and comprehensive error handling. Users can now access global chat from any page without additional implementation, making the platform more engaging and interactive.