9819d8db0b
continuous-integration/drone/push Build is failing
- implemented /notifications page with overdue/upcoming alerts - Fixed sidebar scrolling in collapsed mode - Moved notification button to sidebar footer - Enhanced Achievements page with streak stats and tooltips - Improved XP history to show task titles - Added missing translations (en/de) - Removed top bar header - Fixed Docker environment routing
114 lines
5.1 KiB
TypeScript
114 lines
5.1 KiB
TypeScript
import { useForm } from "react-hook-form";
|
|
import { zodResolver } from "@hookform/resolvers/zod";
|
|
import { insertUserSchema } from "@shared/schema";
|
|
import { useLocation } from "wouter";
|
|
import { useMutation } from "@tanstack/react-query";
|
|
import { apiRequest, queryClient } from "@/lib/queryClient";
|
|
import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form";
|
|
import { Input } from "@/components/ui/input";
|
|
import { Button } from "@/components/ui/button";
|
|
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
|
|
import { useToast } from "@/hooks/use-toast";
|
|
import { ShieldCheck } from "lucide-react";
|
|
|
|
export default function SetupWizard() {
|
|
const [, setLocation] = useLocation();
|
|
const { toast } = useToast();
|
|
|
|
const form = useForm({
|
|
resolver: zodResolver(insertUserSchema),
|
|
defaultValues: {
|
|
username: "",
|
|
email: "",
|
|
password: "",
|
|
},
|
|
});
|
|
|
|
const setupMutation = useMutation({
|
|
mutationFn: async (data: any) => {
|
|
const res = await apiRequest("POST", "/api/setup", data);
|
|
return res.json();
|
|
},
|
|
onSuccess: (user) => {
|
|
queryClient.setQueryData(["/api/user"], user);
|
|
queryClient.invalidateQueries({ queryKey: ["/api/setup/status"] });
|
|
setLocation("/");
|
|
toast({
|
|
title: "Setup Complete",
|
|
description: "Super Administrator created successfully.",
|
|
});
|
|
},
|
|
onError: (error: Error) => {
|
|
toast({
|
|
title: "Setup Failed",
|
|
description: error.message,
|
|
variant: "destructive"
|
|
});
|
|
}
|
|
});
|
|
|
|
return (
|
|
<div className="min-h-screen flex flex-col items-center justify-center p-4 bg-gradient-to-br from-background to-muted">
|
|
<Card className="w-full max-w-md border-2 border-primary/20 shadow-xl">
|
|
<CardHeader className="text-center">
|
|
<div className="mx-auto bg-primary/10 p-3 rounded-full w-fit mb-4">
|
|
<ShieldCheck className="w-10 h-10 text-primary" />
|
|
</div>
|
|
<CardTitle className="text-2xl">First-Time Setup</CardTitle>
|
|
<CardDescription>
|
|
Create your Super Administrator account to get started.
|
|
</CardDescription>
|
|
</CardHeader>
|
|
<CardContent>
|
|
<Form {...form}>
|
|
<form onSubmit={form.handleSubmit((data) => setupMutation.mutate(data))} className="space-y-4">
|
|
<FormField
|
|
control={form.control}
|
|
name="username"
|
|
render={({ field }) => (
|
|
<FormItem>
|
|
<FormLabel>Admin Username</FormLabel>
|
|
<FormControl>
|
|
<Input placeholder="admin" {...field} />
|
|
</FormControl>
|
|
<FormMessage />
|
|
</FormItem>
|
|
)}
|
|
/>
|
|
<FormField
|
|
control={form.control}
|
|
name="email"
|
|
render={({ field }) => (
|
|
<FormItem>
|
|
<FormLabel>Admin Email</FormLabel>
|
|
<FormControl>
|
|
<Input type="email" placeholder="admin@example.com" {...field} />
|
|
</FormControl>
|
|
<FormMessage />
|
|
</FormItem>
|
|
)}
|
|
/>
|
|
<FormField
|
|
control={form.control}
|
|
name="password"
|
|
render={({ field }) => (
|
|
<FormItem>
|
|
<FormLabel>Password</FormLabel>
|
|
<FormControl>
|
|
<Input type="password" placeholder="••••••••" {...field} />
|
|
</FormControl>
|
|
<FormMessage />
|
|
</FormItem>
|
|
)}
|
|
/>
|
|
<Button type="submit" className="w-full" disabled={setupMutation.isPending}>
|
|
{setupMutation.isPending ? "Creating Admin..." : "Create Administrator"}
|
|
</Button>
|
|
</form>
|
|
</Form>
|
|
</CardContent>
|
|
</Card>
|
|
</div>
|
|
);
|
|
}
|