feat: PresenceBar component shows who is watching each page
Made-with: Cursor
This commit is contained in:
@@ -7,6 +7,7 @@ import Logo from './components/Logo';
|
|||||||
import ThemeToggle from './components/ThemeToggle';
|
import ThemeToggle from './components/ThemeToggle';
|
||||||
import InstallPrompt from './components/InstallPrompt';
|
import InstallPrompt from './components/InstallPrompt';
|
||||||
import SafariInstallPrompt from './components/SafariInstallPrompt';
|
import SafariInstallPrompt from './components/SafariInstallPrompt';
|
||||||
|
import PresenceBar from './components/PresenceBar';
|
||||||
import Home from './pages/Home';
|
import Home from './pages/Home';
|
||||||
import Login from './pages/Login';
|
import Login from './pages/Login';
|
||||||
import Picker from './pages/Picker';
|
import Picker from './pages/Picker';
|
||||||
@@ -156,6 +157,9 @@ function App() {
|
|||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
|
{/* Admin Presence */}
|
||||||
|
<PresenceBar />
|
||||||
|
|
||||||
{/* Main Content */}
|
{/* Main Content */}
|
||||||
<main className="container mx-auto px-4 py-8 flex-grow">
|
<main className="container mx-auto px-4 py-8 flex-grow">
|
||||||
<Routes>
|
<Routes>
|
||||||
|
|||||||
41
frontend/src/components/PresenceBar.jsx
Normal file
41
frontend/src/components/PresenceBar.jsx
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { usePresence } from '../hooks/usePresence';
|
||||||
|
import { useAuth } from '../context/AuthContext';
|
||||||
|
|
||||||
|
function PresenceBar() {
|
||||||
|
const { isAuthenticated } = useAuth();
|
||||||
|
const { viewers } = usePresence();
|
||||||
|
|
||||||
|
if (!isAuthenticated) return null;
|
||||||
|
|
||||||
|
const otherViewers = viewers.filter(v => v !== 'me');
|
||||||
|
if (otherViewers.length === 0) return null;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="container mx-auto px-2 sm:px-4 pt-3">
|
||||||
|
<div className="bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 px-4 py-2">
|
||||||
|
<div className="flex items-center gap-3">
|
||||||
|
<span className="text-xs text-gray-500 dark:text-gray-400 uppercase tracking-wider font-medium flex-shrink-0">
|
||||||
|
who is watching
|
||||||
|
</span>
|
||||||
|
<div className="flex flex-wrap gap-1.5">
|
||||||
|
{viewers.map((name, i) => (
|
||||||
|
<span
|
||||||
|
key={`${name}-${i}`}
|
||||||
|
className={`inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium ${
|
||||||
|
name === 'me'
|
||||||
|
? 'bg-indigo-100 dark:bg-indigo-900/40 text-indigo-700 dark:text-indigo-300'
|
||||||
|
: 'bg-gray-100 dark:bg-gray-700 text-gray-700 dark:text-gray-300'
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
{name}
|
||||||
|
</span>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default PresenceBar;
|
||||||
Reference in New Issue
Block a user