Header.tsx 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import { Button } from '@/components/ui/button';
  2. import { Input } from '@/components/ui/input';
  3. import { Badge } from '@/components/ui/badge';
  4. import { Search, Plus, Settings, User, Rss, List, LogOut, Shield, Pin } from 'lucide-react';
  5. import { Link } from 'react-router-dom';
  6. import { useAuth } from '@/hooks/useAuth';
  7. import { useSuperUser } from '@/hooks/useSuperUser';
  8. interface HeaderProps {
  9. searchQuery: string;
  10. onSearchChange: (query: string) => void;
  11. pinnedCount: number;
  12. }
  13. const Header = ({
  14. searchQuery,
  15. onSearchChange,
  16. pinnedCount
  17. }: HeaderProps) => {
  18. const {
  19. user,
  20. signOut
  21. } = useAuth();
  22. const {
  23. isSuperUser
  24. } = useSuperUser();
  25. const handleSignOut = async () => {
  26. await signOut();
  27. };
  28. return <header className="border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60 sticky top-0 z-50">
  29. <div className="container mx-auto px-4 py-4">
  30. <div className="flex items-center justify-between gap-4">
  31. <div className="flex items-center gap-3">
  32. <div className="flex items-center gap-2">
  33. <Rss className="h-6 w-6 text-primary" />
  34. <h1 className="text-xl font-bold">Feeds.Duhaz.fr</h1>
  35. {isSuperUser && <Badge variant="destructive" className="gap-1">
  36. <Shield className="h-3 w-3" />
  37. Admin
  38. </Badge>}
  39. </div>
  40. <div className="hidden sm:flex items-center gap-2 text-sm text-muted-foreground">
  41. </div>
  42. </div>
  43. <div className="flex items-center gap-3">
  44. <div className="relative">
  45. <Search className="absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-muted-foreground" />
  46. <Input placeholder="Rechercher..." value={searchQuery} onChange={e => onSearchChange(e.target.value)} className="pl-10 w-64" />
  47. </div>
  48. {user ? <>
  49. <Link to="/pinned">
  50. <Button variant="outline" size="sm" className="gap-2">
  51. <Pin className="h-4 w-4" />
  52. Épinglés
  53. {pinnedCount > 0 && (
  54. <Badge variant="secondary" className="ml-1 h-5 px-1.5">
  55. {pinnedCount}
  56. </Badge>
  57. )}
  58. </Button>
  59. </Link>
  60. <Link to="/feeds">
  61. <Button variant="outline" size="sm" className="gap-2">
  62. <List className="h-4 w-4" />
  63. Gérer les flux
  64. </Button>
  65. </Link>
  66. <Button variant="ghost" size="sm">
  67. <Settings className="h-4 w-4" />
  68. </Button>
  69. <div className="flex items-center gap-2">
  70. <span className="text-sm text-muted-foreground">{user.email}</span>
  71. <Button variant="ghost" size="sm" onClick={handleSignOut} className="gap-2">
  72. <LogOut className="h-4 w-4" />
  73. </Button>
  74. </div>
  75. </> : <Link to="/auth">
  76. <Button variant="default" size="sm" className="gap-2">
  77. <User className="h-4 w-4" />
  78. Se connecter
  79. </Button>
  80. </Link>}
  81. </div>
  82. </div>
  83. </div>
  84. </header>;
  85. };
  86. export default Header;