Spaces:
Sleeping
Sleeping
File size: 4,600 Bytes
759768a |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
import React, { useState } from 'react';
import './Header.css';
import ProfileDropdown from '../ui/ProfileDropdown';
const Header = ({
currentPage,
sidebarOpen,
onSidebarToggle,
userStats = {},
notifications = [],
isGuest = false,
user = null,
onLogin,
onLogout,
onProfile
}) => {
const [showRefresh, setShowRefresh] = useState(false);
const formatNumber = (num) => {
if (num >= 1000000) {
return (num / 1000000).toFixed(1) + 'M';
}
if (num >= 1000) {
return (num / 1000).toFixed(1) + 'K';
}
return num?.toString() || '0';
};
const getTimeGreeting = () => {
const hour = new Date().getHours();
if (hour < 12) return 'Good morning';
if (hour < 17) return 'Good afternoon';
return 'Good evening';
};
return (
<header className="terra-header">
<div className="terra-header__left">
{/* Mobile menu button */}
<button
className="terra-header__menu-btn"
onClick={onSidebarToggle}
aria-label="Toggle navigation menu"
>
<span className={`terra-header__menu-icon ${sidebarOpen ? 'terra-header__menu-icon--open' : ''}`}>
<span></span>
<span></span>
<span></span>
</span>
</button>
{/* Page info */}
<div className="terra-header__page-info">
<h1 className="terra-header__page-title">
<span className="terra-header__page-icon">{currentPage?.icon}</span>
<span className="terra-header__page-name">{currentPage?.name}</span>
</h1>
<p className="terra-header__page-subtitle">{currentPage?.description}</p>
</div>
</div>
<div className="terra-header__right">
{/* Environmental Stats */}
<div className="terra-header__stats">
<div className="terra-header__stat" title="COโ Saved">
<span className="terra-header__stat-icon">๐ฟ</span>
<div className="terra-header__stat-content">
<div className="terra-header__stat-value">
{formatNumber(userStats.co2Saved || (isGuest ? 0 : 0))}
</div>
<div className="terra-header__stat-label">COโ Saved (kg)</div>
</div>
</div>
<div className="terra-header__stat" title="Water Tests Completed">
<span className="terra-header__stat-icon">๐ง</span>
<div className="terra-header__stat-content">
<div className="terra-header__stat-value">
{formatNumber(userStats.waterTests || (isGuest ? 0 : 0))}
</div>
<div className="terra-header__stat-label">Water Tests</div>
</div>
</div>
<div className="terra-header__stat" title="Biodiversity Scans">
<span className="terra-header__stat-icon">๐ฆ</span>
<div className="terra-header__stat-content">
<div className="terra-header__stat-value">
{formatNumber(userStats.bioScans || (isGuest ? 0 : 0))}
</div>
<div className="terra-header__stat-label">Bio Scans</div>
</div>
</div>
</div>
{/* User Actions */}
<div className="terra-header__actions">
{/* Notifications */}
<div className="terra-header__notifications">
<button
className="terra-header__notification-btn"
aria-label="View notifications"
>
<span className="terra-header__notification-icon">๐</span>
{notifications.length > 0 && (
<span className="terra-header__notification-badge">
{notifications.length > 9 ? '9+' : notifications.length}
</span>
)}
</button>
</div>
{/* Refresh Button (when needed) */}
{showRefresh && (
<button
className="terra-header__refresh-btn"
onClick={() => window.location.reload()}
title="Refresh page"
>
๐
</button>
)}
{/* Profile Dropdown */}
<ProfileDropdown
user={user}
onLogin={onLogin}
onLogout={onLogout}
onProfile={onProfile}
/>
</div>
</div>
</header>
);
};
export default Header; |