Auth.tsx 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. import { useState } from 'react';
  2. import { useAuth } from '@/hooks/useAuth';
  3. import { Button } from '@/components/ui/button';
  4. import { Input } from '@/components/ui/input';
  5. import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
  6. import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
  7. import { Rss, Mail, Lock } from 'lucide-react';
  8. import { toast } from 'sonner';
  9. import { Navigate } from 'react-router-dom';
  10. const Auth = () => {
  11. const [email, setEmail] = useState('');
  12. const [password, setPassword] = useState('');
  13. const [loading, setLoading] = useState(false);
  14. const { user, signIn, signUp } = useAuth();
  15. // Redirect if user is already authenticated
  16. if (user) {
  17. return <Navigate to="/" replace />;
  18. }
  19. const handleSignIn = async (e: React.FormEvent) => {
  20. e.preventDefault();
  21. setLoading(true);
  22. const { error } = await signIn(email, password);
  23. if (error) {
  24. toast.error(error.message);
  25. } else {
  26. toast.success('Connexion réussie !');
  27. }
  28. setLoading(false);
  29. };
  30. const handleSignUp = async (e: React.FormEvent) => {
  31. e.preventDefault();
  32. setLoading(true);
  33. const { error } = await signUp(email, password);
  34. if (error) {
  35. toast.error(error.message);
  36. } else {
  37. toast.success('Compte créé ! Vérifiez votre email.');
  38. }
  39. setLoading(false);
  40. };
  41. return (
  42. <div className="min-h-screen bg-background flex items-center justify-center p-4">
  43. <div className="w-full max-w-md">
  44. <div className="flex items-center justify-center gap-2 mb-8">
  45. <Rss className="h-8 w-8 text-primary" />
  46. <h1 className="text-2xl font-bold">Feeds.Duhaz.fr</h1>
  47. </div>
  48. <Card>
  49. <CardHeader>
  50. <CardTitle>Authentification</CardTitle>
  51. <CardDescription>
  52. Connectez-vous ou créez un compte pour gérer vos flux
  53. </CardDescription>
  54. </CardHeader>
  55. <CardContent>
  56. <Tabs defaultValue="signin" className="w-full">
  57. <TabsList className="grid w-full grid-cols-2">
  58. <TabsTrigger value="signin">Connexion</TabsTrigger>
  59. <TabsTrigger value="signup">Inscription</TabsTrigger>
  60. </TabsList>
  61. <TabsContent value="signin">
  62. <form onSubmit={handleSignIn} className="space-y-4">
  63. <div className="space-y-2">
  64. <div className="relative">
  65. <Mail className="absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-muted-foreground" />
  66. <Input
  67. type="email"
  68. placeholder="Email"
  69. value={email}
  70. onChange={(e) => setEmail(e.target.value)}
  71. className="pl-10"
  72. required
  73. />
  74. </div>
  75. <div className="relative">
  76. <Lock className="absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-muted-foreground" />
  77. <Input
  78. type="password"
  79. placeholder="Mot de passe"
  80. value={password}
  81. onChange={(e) => setPassword(e.target.value)}
  82. className="pl-10"
  83. required
  84. />
  85. </div>
  86. </div>
  87. <Button type="submit" className="w-full" disabled={loading}>
  88. {loading ? 'Connexion...' : 'Se connecter'}
  89. </Button>
  90. </form>
  91. </TabsContent>
  92. <TabsContent value="signup">
  93. <form onSubmit={handleSignUp} className="space-y-4">
  94. <div className="space-y-2">
  95. <div className="relative">
  96. <Mail className="absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-muted-foreground" />
  97. <Input
  98. type="email"
  99. placeholder="Email"
  100. value={email}
  101. onChange={(e) => setEmail(e.target.value)}
  102. className="pl-10"
  103. required
  104. />
  105. </div>
  106. <div className="relative">
  107. <Lock className="absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-muted-foreground" />
  108. <Input
  109. type="password"
  110. placeholder="Mot de passe"
  111. value={password}
  112. onChange={(e) => setPassword(e.target.value)}
  113. className="pl-10"
  114. required
  115. />
  116. </div>
  117. </div>
  118. <Button type="submit" className="w-full" disabled={loading}>
  119. {loading ? 'Création...' : 'Créer un compte'}
  120. </Button>
  121. </form>
  122. </TabsContent>
  123. </Tabs>
  124. </CardContent>
  125. </Card>
  126. </div>
  127. </div>
  128. );
  129. };
  130. export default Auth;