install nextjs
npx create-next-app@latest
# install shadcn and pnpm
npm i -g pnpm
pnpm dlx shadcn@latest init
install sidebar default layout for dashboard
pnpm dlx shadcn@latest add sidebar
return (
<SidebarProvider>
<AppSidebar />
<SidebarInset className="m-5">
<Separator
orientation="vertical"
className="mr-2 data-[orientation=vertical]:h-4"
/>
<SidebarTrigger className="-ml-1" />
<Separator
orientation="vertical"
className="mr-2 data-[orientation=vertical]:h-4"
/>
{children}
</SidebarInset>
</SidebarProvider>
);
build the landing page
import { Badge } from "@/components/ui/badge";
import { Button } from "@/components/ui/button";
import { ArrowUpRight, CirclePlay } from "lucide-react";
import React from "react";
import Login02Page from "./login";
const Hero04 = () => {
return (
<div className="min-h-screen flex items-center justify-center overflow-hidden">
<div className="max-w-screen-xl w-full mx-auto grid lg:grid-cols-2 gap-12 px-6 py-12 lg:py-0">
<div className="my-auto">
<Badge className="bg-gradient-to-br via-70% from-primary via-muted/30 to-primary rounded-full py-1 border-none">
Just released v1.0.0
</Badge>
<h1 className="mt-6 max-w-[17ch] text-4xl md:text-5xl lg:text-[2.75rem] xl:text-5xl font-bold !leading-[1.2] tracking-tight">
Customized Shadcn UI Blocks & Components
</h1>
<p className="mt-6 max-w-[60ch] text-lg">
Explore a collection of Shadcn UI blocks and components, ready to
preview and copy. Streamline your development workflow with
easy-to-implement examples.
</p>
<div className="mt-12 flex items-center gap-4">
<Button size="lg" className="rounded-full text-base">
Get Started <ArrowUpRight className="!h-5 !w-5" />
</Button>
<Button
variant="outline"
size="lg"
className="rounded-full text-base shadow-none"
>
<CirclePlay className="!h-5 !w-5" /> Watch Demo
</Button>
</div>
</div>
<div className="w-full aspect-video lg:aspect-auto lg:w-[1000px] lg:h-[calc(100vh-4rem)] bg-accent rounded-xl" >
<Login02Page/>
</div>
</div>
</div>
);
};
export default Hero04;
login.tsx
"use client";
import { Button } from "@/components/ui/button";
import {
Form,
FormControl,
FormField,
FormItem,
FormLabel,
FormMessage,
} from "@/components/ui/form";
import { Input } from "@/components/ui/input";
import { Separator } from "@/components/ui/separator";
import { zodResolver } from "@hookform/resolvers/zod";
import Link from "next/link";
import { useRouter } from "next/navigation";
import { useState } from "react";
import { useForm } from "react-hook-form";
import { z } from "zod";
const formSchema = z.object({
username: z.string(),
password: z.string().min(5, "Password must be at least 8 characters long"),
});
const Login02Page = () => {
const [errorMessage,setErrorMessage]=useState("")
const router = useRouter()
const form = useForm<z.infer<typeof formSchema>>({
defaultValues: {
username: "",
password: "",
},
resolver: zodResolver(formSchema),
});
const onSubmit = async (data: z.infer<typeof formSchema>) => {
setErrorMessage("")
try{
const response = await fetch('http://127.0.0.1:8000/api/login/',{
method:'POST',
headers:{'Content-Type':'application/json'},
credentials: "include",
body:JSON.stringify(data)
})
const result = await response.json()
if(!response.ok){
throw new Error(result.message || "Login Failed")
}
localStorage.setItem("adminToken",result.access)
router.push("/menu")
console.log(result.access );
}
catch(err:any){
setErrorMessage(err.message)
}
};
return (
<div className="min-h-screen flex items-center justify-center">
<div className="max-w-sm w-full flex flex-col items-center border rounded-lg p-6 shadow-sm">
<p className="mt-4 mb-10 text-xl font-bold tracking-tight">
Log in to Shadcn UI Blocks
</p>
<Form {...form}>
<form
className="w-full space-y-4"
onSubmit={form.handleSubmit(onSubmit)}
>
<FormField
control={form.control}
name="username"
render={({ field }) => (
<FormItem>
<FormLabel>Username</FormLabel>
<FormControl>
<Input
type="text"
placeholder="Username"
className="w-full"
{...field}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="password"
render={({ field }) => (
<FormItem>
<FormLabel>Password</FormLabel>
<FormControl>
<Input
type="password"
placeholder="Password"
className="w-full"
{...field}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<Button type="submit" className="mt-4 w-full">
Login
</Button>
</form>
</Form>
<div className="mt-5 space-y-5">
<Link
href="#"
className="text-sm block underline text-muted-foreground text-center"
>
Forgot your password?
</Link>
<p className="text-sm text-center">
Don't have an account?
<Link href="#" className="ml-1 underline text-muted-foreground">
Create account
</Link>
</p>
</div>
</div>
</div>
);
};
export default Login02Page;
Top comments (0)