90 lines
2.8 KiB
TypeScript
90 lines
2.8 KiB
TypeScript
"use client";
|
|
|
|
import { useState } from "react";
|
|
import { useRouter } from "next/navigation";
|
|
import { Card, CardContent } from "@/components/ui/card";
|
|
import { Input } from "@/components/ui/input";
|
|
import { Select } from "@/components/ui/select";
|
|
import { Button } from "@/components/ui/button";
|
|
import { createUser } from "../actions";
|
|
|
|
export default function NewUserForm({
|
|
establishments,
|
|
isSuperadmin,
|
|
}: {
|
|
establishments: any[];
|
|
isSuperadmin: boolean;
|
|
}) {
|
|
const [error, setError] = useState<string | null>(null);
|
|
const [loading, setLoading] = useState(false);
|
|
const router = useRouter();
|
|
|
|
async function handleSubmit(formData: FormData) {
|
|
setLoading(true);
|
|
setError(null);
|
|
try {
|
|
await createUser(formData);
|
|
} catch (err: any) {
|
|
setError(err.message || "Une erreur est survenue");
|
|
setLoading(false);
|
|
}
|
|
}
|
|
|
|
return (
|
|
<Card>
|
|
<CardContent className="pt-6">
|
|
<form action={handleSubmit} className="space-y-4">
|
|
{error && (
|
|
<div className="rounded-md bg-destructive/10 p-3 text-sm text-destructive">
|
|
{error}
|
|
</div>
|
|
)}
|
|
<div>
|
|
<label className="block text-sm font-medium mb-1">Email</label>
|
|
<Input type="email" name="email" required />
|
|
</div>
|
|
<div>
|
|
<label className="block text-sm font-medium mb-1">Mot de passe</label>
|
|
<Input type="password" name="password" minLength={8} required />
|
|
<p className="text-xs text-muted-foreground mt-1">Minimum 8 caractères</p>
|
|
</div>
|
|
<div>
|
|
<label className="block text-sm font-medium mb-1">Rôle</label>
|
|
<Select name="role" required>
|
|
<option value="">Choisir un rôle</option>
|
|
<option value="admin">Admin</option>
|
|
<option value="teacher">Teacher</option>
|
|
</Select>
|
|
</div>
|
|
{isSuperadmin && (
|
|
<div>
|
|
<label className="block text-sm font-medium mb-1">Établissement</label>
|
|
<Select name="establishmentId">
|
|
<option value="">Aucun</option>
|
|
{establishments.map((e) => (
|
|
<option key={e.id} value={e.id}>
|
|
{e.name}
|
|
</option>
|
|
))}
|
|
</Select>
|
|
</div>
|
|
)}
|
|
<div className="flex gap-2 pt-2">
|
|
<Button type="submit" disabled={loading}>
|
|
{loading ? "Création..." : "Créer"}
|
|
</Button>
|
|
<Button
|
|
type="button"
|
|
variant="outline"
|
|
onClick={() => router.push("/dashboard/users")}
|
|
disabled={loading}
|
|
>
|
|
Annuler
|
|
</Button>
|
|
</div>
|
|
</form>
|
|
</CardContent>
|
|
</Card>
|
|
);
|
|
}
|