LoginForm.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // components/LoginForm.js
  2. "use client";
  3. import { useState } from "react";
  4. import { useRouter } from "next/navigation";
  5. import { Input } from "@nextui-org/react";
  6. import Link from "next/link";
  7. import SubmitButton from "./SubmitButton"; // Neuen Button importieren
  8. export default function LoginForm() {
  9. const [username, setUsername] = useState("");
  10. const [password, setPassword] = useState("");
  11. const [error, setError] = useState(null);
  12. const [isLoading, setIsLoading] = useState(false);
  13. const router = useRouter();
  14. const handleSubmit = async (e) => {
  15. e.preventDefault();
  16. setError(null);
  17. setIsLoading(true);
  18. try {
  19. const response = await fetch("/api/auth/login", {
  20. method: "POST",
  21. headers: {
  22. "Content-Type": "application/json",
  23. },
  24. body: JSON.stringify({ username, password }),
  25. credentials: "include",
  26. });
  27. const data = await response.json();
  28. if (response.ok && data.redirectUrl) {
  29. router.push(data.redirectUrl);
  30. } else {
  31. setError(data.error || "Login failed. Please try again.");
  32. }
  33. } catch (err) {
  34. setError("An error occurred. Please try again later.");
  35. console.error("Fetch error:", err);
  36. } finally {
  37. setIsLoading(false);
  38. }
  39. };
  40. return (
  41. <form
  42. onSubmit={handleSubmit}
  43. className="bg-slate-200 rounded-xl p-8 shadow-md"
  44. >
  45. <h3 className="text-lg mb-8">
  46. Logge dich mit dem{" "}
  47. <span className="font-semibold">bereitgestellten </span> Login ein.
  48. </h3>
  49. <div className="flex flex-col items-center">
  50. <Input
  51. isRequired
  52. type="text"
  53. label="Niederlassung"
  54. className="max-w-xs"
  55. value={username}
  56. onChange={(e) => setUsername(e.target.value)}
  57. />
  58. </div>
  59. <div className="mt-4 flex flex-col items-center ">
  60. <Input
  61. isRequired
  62. type="password"
  63. label="Passwort"
  64. value={password}
  65. onChange={(e) => setPassword(e.target.value)}
  66. className="max-w-xs"
  67. />
  68. </div>
  69. <div className="flex flex-col items-center mt-4">
  70. {error && <p className="text-red-600 text-lg mb-2">{error}</p>}
  71. <SubmitButton isLoading={isLoading} />
  72. <Link href="mailto:cayan@attus.de" className="mt-4 text-sm">
  73. Passwort vergessen?
  74. </Link>
  75. </div>
  76. </form>
  77. );
  78. }