Header.tsx 3.6 KB

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