From 70c938916d24f5e2cd515f058b3f3e815226c35a Mon Sep 17 00:00:00 2001 From: adilkadivala Date: Wed, 27 Aug 2025 22:56:35 +0530 Subject: [PATCH] drag and drop page builder completed --- certs/server.cert | 22 -------- certs/server.key | 28 ---------- .../route-protection/auth-protected-route.tsx | 3 +- .../dashboard-protected-route.tsx | 3 +- .../route-protection/protected-route.tsx | 44 +++++++++++++--- src/components/service-card.tsx | 16 ++++-- src/components/setting-profile.tsx | 52 +++++++++++++------ src/hooks/use-protected-route.ts | 41 --------------- src/hooks/use-route-guard.ts | 12 ----- src/hooks/useAuth.ts | 20 +++++++ src/lib/utils.ts | 20 ++++--- src/pages/dashboard/dashboard.tsx | 24 ++++++--- src/pages/dashboard/library.tsx | 3 +- .../dashboard}/page-builder.tsx | 52 ++++++++++++++++--- src/pages/dashboard/website.tsx | 38 ++++++++++++++ src/routes/index.tsx | 5 +- vite.config.ts | 5 -- 17 files changed, 226 insertions(+), 162 deletions(-) delete mode 100644 certs/server.cert delete mode 100644 certs/server.key delete mode 100644 src/hooks/use-protected-route.ts delete mode 100644 src/hooks/use-route-guard.ts create mode 100644 src/hooks/useAuth.ts rename src/{components => pages/dashboard}/page-builder.tsx (59%) create mode 100644 src/pages/dashboard/website.tsx diff --git a/certs/server.cert b/certs/server.cert deleted file mode 100644 index c44f652..0000000 --- a/certs/server.cert +++ /dev/null @@ -1,22 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDnTCCAoWgAwIBAgIUaScp9HKYUHQ9t1UzWGfQxArGnmEwDQYJKoZIhvcNAQEL -BQAwXjELMAkGA1UEBhMCdXMxCzAJBgNVBAgMAnNmMQswCQYDVQQHDAJueTEhMB8G -A1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRIwEAYDVQQDDAlsb2NhbGhv -c3QwHhcNMjUwODA0MDIxMzA4WhcNMjYwODA0MDIxMzA4WjBeMQswCQYDVQQGEwJ1 -czELMAkGA1UECAwCc2YxCzAJBgNVBAcMAm55MSEwHwYDVQQKDBhJbnRlcm5ldCBX -aWRnaXRzIFB0eSBMdGQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAMl/qxmf9CAHHgmXDXjQenBWgDv/SzH8Fujle3LA -VbRWjhQkGqsIb97cVUgMrLOvAunPGxrYrnKKxgnglNvyaogE0lhs7KEToMTLjxTj -RkDqZEDDLnYqHXW63PACfXTn9XEFnM748mL6c3LjrzyPqZjgmVbkWuvTq32AQhCl -ae/f466LZdjonz6GIOCmqwBZ/aDmsCQNblSqBroapoxKNL8J2yGl3sa1SqazCqAr -OTGVhp7iSRdfVwnto0jokhJBhps2PVrWqLQSNOpdcg1WV6Hb8fvfFW2c8N89A9Y6 -Y44XzXlZi9VaDEiLC0iTg8WvzDAdmgBLHDYXjEsIrP2FttcCAwEAAaNTMFEwHQYD -VR0OBBYEFMcThLqeWaU+Zs3CKf+Uf9Z5ZRG8MB8GA1UdIwQYMBaAFMcThLqeWaU+ -Zs3CKf+Uf9Z5ZRG8MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB -AJWgJ83jvy7N5/2FFcWtiXuLiCzqW2iuuIh0TfwRF+ZFuwjPnvWDZz4o9UMGOqWX -rgm2Y1OuvLKCOHEt7rrSk4Ibda+Uue23Uy68UNMyTD0QGWcDSLWs6kFiyXwiXe3u -4dl9w0v5giYNljuYcFiD5VTdJAnb5oePRUNmr/zCy9d7oBeKPD6EUocD4o3yPmg0 -HBWrZAXO7BCmKrFd+f7yM9SXNenemacB9bkgKsNwXf7t/Z7RAPTqv26Y/06WvsLo -x/ML+JWyloQ6g+NzP6ilMHip3bVgr98GeypOBeYAsGfvD/w6F0U+HvS1iSh4auZZ -uGPeigs2PsR4mwEF/EEES3Y= ------END CERTIFICATE----- diff --git a/certs/server.key b/certs/server.key deleted file mode 100644 index a843e46..0000000 --- a/certs/server.key +++ /dev/null @@ -1,28 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDJf6sZn/QgBx4J -lw140HpwVoA7/0sx/Bbo5XtywFW0Vo4UJBqrCG/e3FVIDKyzrwLpzxsa2K5yisYJ -4JTb8mqIBNJYbOyhE6DEy48U40ZA6mRAwy52Kh11utzwAn105/VxBZzO+PJi+nNy -4688j6mY4JlW5Frr06t9gEIQpWnv3+Oui2XY6J8+hiDgpqsAWf2g5rAkDW5Uqga6 -GqaMSjS/Cdshpd7GtUqmswqgKzkxlYae4kkXX1cJ7aNI6JISQYabNj1a1qi0EjTq -XXINVleh2/H73xVtnPDfPQPWOmOOF815WYvVWgxIiwtIk4PFr8wwHZoASxw2F4xL -CKz9hbbXAgMBAAECggEAQrP3sRjpWLzibaxKcmcZURzhgHsHqnlYICrvjdIrzPIm -QHafOWUmm3D27k370dOqtDmyMFXwkcxsuJJW1OTP7U0jUNBmGQCFZQA50mFWPWEa -ZPH37HgOno2IXA+G9m9fKdYAzedNXgSouSy0Mukf7JLVUBVyH8VHbNlLhXUst5Ig -m1a6i21DYyQLu4X14Zqq8k24jble0DNxwp3RKn6k1JZ2GqBd6bpNudBzprd5yffI -kxO4q8LkH9BA+YfRhlksXLnfuTn4cIE9Zn3/EUlFx6+goBUg7U+AxppjvpT5NZwk -PjWlfiNjZ2IL2k5NL8VCeHP0X5lWIKvgZIwn6MHOuQKBgQDvLp4yq4F9CqlaHO2A -4nVw4pKt3cefx60wU/340ADUOF9Kw+GhC9sLivy1eArHgA3InqcfImLyNN4VH9rK -ZqIsmcvYFdCb8bIEPqRYQWRSLMFSvfadBer+N9azcA9cdJoxeW768cydzfJZ/OWR -WIRTwdcCl9/Lb7CVWI6EbgkJtQKBgQDXqrubKB5moDFTGDz6HqQ4w3cOcmG+J2MS -oAf77hu4HUcF7Z0/aoobkL35OKgvUEGn5rdTc6PWKZpcVOqsqIjRLKje/CaWFN99 -OGK377H7cJRt5dkSP2etjVfp/NVNtB/6fVPWPWAH3oNeBOnQawphaZYN64swv/Wa -CofjYN5l2wKBgEKDc0jh+tt8CIZfvwh1cXVX/LRPFYFwdNAYu2ri5SgfGRjgijFP -67U1DHumi1DZYnvk6tK0rFFwtEWpmx1oFzdR+ab4wg9r0jZt+SP142EawxQwcZFP -IP9bJeC2i/8JCgwyGdO9REqqB/hQZMLbm8jzAcjd1UVspO2TN+bJ9sd1AoGBAJYa -4QS2waIQMQRyxE4Z8ZcIhN7rQZiF9XDLLYNtUKGuzvYTUfUHhCR3c6H4iyaTJ39j -F4nf3NJ8llFZURTnIILmIItC2OBwmrSfACahkDE/RC/RYGpQ8ypaTCwxq4yvp+pC -PI3KngIcHzbbGJnVRp5STPxXSsOdd6XFWpspmuEtAoGAeYibCw/X4sJYKA1aKz4+ -Ebw1R5TpHsRYzy5RiKicm2UUrrp+bW9gtELpg+8pa9pLjyrIhEZsU4Be7BQtSH9e -wViIp9Su1lN06vI1w5ET9JizoMKxNqy81nFVxX9IcGGydBOLKGrxATWxl6vliZvZ -/9sNkQxD9t8OW0I/Zhudjsg= ------END PRIVATE KEY----- diff --git a/src/components/route-protection/auth-protected-route.tsx b/src/components/route-protection/auth-protected-route.tsx index 94f4cda..54b9d04 100644 --- a/src/components/route-protection/auth-protected-route.tsx +++ b/src/components/route-protection/auth-protected-route.tsx @@ -1,6 +1,5 @@ -// auth-protected-route.tsx import React from "react"; -import { ProtectedRoute } from "@/components/route-protection/protected-route"; +import { ProtectedRoute } from "./protected-route"; interface AuthProtectedRouteProps { children: React.ReactNode; diff --git a/src/components/route-protection/dashboard-protected-route.tsx b/src/components/route-protection/dashboard-protected-route.tsx index a3115ac..a2162c1 100644 --- a/src/components/route-protection/dashboard-protected-route.tsx +++ b/src/components/route-protection/dashboard-protected-route.tsx @@ -1,5 +1,6 @@ + import React from "react"; -import { ProtectedRoute } from "@/components/route-protection/protected-route"; +import { ProtectedRoute } from "./protected-route"; interface DashboardProtectedRouteProps { children: React.ReactNode; diff --git a/src/components/route-protection/protected-route.tsx b/src/components/route-protection/protected-route.tsx index b3f9daa..2b0cbe0 100644 --- a/src/components/route-protection/protected-route.tsx +++ b/src/components/route-protection/protected-route.tsx @@ -1,5 +1,6 @@ -import React from "react"; -import { useProtectedRoute } from "@/hooks/use-protected-route"; +import React, { useEffect, useRef } from "react"; +import { useNavigate } from "react-router-dom"; +import { useAuth } from "@/hooks/useAuth"; import { BookOpen } from "lucide-react"; interface ProtectedRouteProps { @@ -11,19 +12,48 @@ export const ProtectedRoute: React.FC = ({ children, requireVerification = true, }) => { - const { loading, shouldRender } = useProtectedRoute(requireVerification); + const { loading, isUserExist, isVerified } = useAuth(); + const navigate = useNavigate(); + const hasRedirected = useRef(false); + useEffect(() => { + if (loading || hasRedirected.current) return; + + // -------- First-time visitor -------- + if (!isUserExist) { + navigate("/auth/sign-up", { replace: true }); + hasRedirected.current = true; + return; + } + + // -------- Unverified users -------- + if (requireVerification && !isVerified) { + if (!window.location.pathname.startsWith("/auth/user-email")) { + navigate("/auth/user-email", { replace: true }); + hasRedirected.current = true; + } + return; + } + + // -------- Verified users trying to access auth pages -------- + const authPages = ["/auth/sign-in", "/auth/sign-up"]; + if (isVerified && authPages.includes(window.location.pathname)) { + navigate("/", { replace: true }); + hasRedirected.current = true; + } + }, [loading, isUserExist, isVerified, requireVerification, navigate]); + + // -------- Loading state -------- if (loading) { return (
-
- -
+
); } - if (!shouldRender) { + // -------- Block rendering for unverified users on dashboard -------- + if (requireVerification && !isVerified) { return (
Please verify your account
diff --git a/src/components/service-card.tsx b/src/components/service-card.tsx index f289803..eaf9fa2 100644 --- a/src/components/service-card.tsx +++ b/src/components/service-card.tsx @@ -2,23 +2,26 @@ import { ArrowRight } from "lucide-react"; import { Card, CardContent } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { cn } from "@/lib/utils"; +import { Link } from "react-router-dom"; interface ServiceCardProps { icon: React.ComponentType<{ className?: string }>; title: string; description: string; - buttonText: string; + linkText: string; buttonVariant?: "default" | "outline" | "secondary"; className?: string; + link: string; } export const ServiceCard = ({ icon: Icon, title, description, - buttonText, + linkText, buttonVariant = "outline", className, + link, }: ServiceCardProps) => { return ( {description}

-
diff --git a/src/components/setting-profile.tsx b/src/components/setting-profile.tsx index 71e721e..bab34f2 100644 --- a/src/components/setting-profile.tsx +++ b/src/components/setting-profile.tsx @@ -1,5 +1,5 @@ import { Card, CardContent } from "@/components/ui/card"; -import { Camera, User } from "lucide-react"; +import { Camera } from "lucide-react"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; @@ -16,6 +16,7 @@ import { student } from "@/store/atoms/user"; const base_api = import.meta.env.VITE_SERVER_BASE_URL; interface UserData { + profilepic: File | null; firstname: string; lastname: string; email: string; @@ -30,6 +31,7 @@ const SettingProfile = () => { const refreshAdmin = useRecoilRefresher_UNSTABLE(student); const [userData, setUserData] = useState({ + profilepic: null, firstname: "", lastname: "", email: "", @@ -40,24 +42,31 @@ const SettingProfile = () => { // form handler + // form submit handler const handleFormSubmit = async (e: React.FormEvent) => { e.preventDefault(); setIsLoading(true); - // removing empty fields - const filteredData: Partial = Object.fromEntries( - Object.entries(userData).filter(([_, value]) => value !== "") - ); - try { + const formData = new FormData(); + Object.entries(userData).forEach(([key, value]) => { + if (value) { + formData.append(key, value); + } + }); + const response = await axios.put( `${base_api}/api/v1/update-profile`, - filteredData, - { withCredentials: true } + formData, + { + withCredentials: true, + headers: { "Content-Type": "multipart/form-data" }, + } ); if (response.status === 200) { setUserData({ + profilepic: null, firstname: "", lastname: "", email: "", @@ -65,17 +74,19 @@ const SettingProfile = () => { bio: "", dob: "", }); - toast.success("Profile updated successfully"); setIsLoading(false); + toast.success("Profile updated successfully"); refreshAdmin(); } } catch (error) { console.log(error); setIsLoading(false); + toast.error("Failed to update profile"); + } finally { + setIsLoading(false); } }; - if (loading) { return ( @@ -120,25 +131,34 @@ const SettingProfile = () => { {/* Profile Photo */}
-
- {loading ? ( - +
+ {userData.profilepic ? ( + Preview ) : ( )}

- JPG, PNG or GIF. Max size 2MB. + JPG or PNG, Max size 2MB.

diff --git a/src/hooks/use-protected-route.ts b/src/hooks/use-protected-route.ts deleted file mode 100644 index 29402da..0000000 --- a/src/hooks/use-protected-route.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { useNavigate } from "react-router"; -import { useRouteGuards } from "./use-route-guard"; -import { useEffect } from "react"; -import { toast } from "sonner"; - -export const useProtectedRoute = (requiredVerification = true) => { - const { loading, isUserExist, isVerified } = useRouteGuards(); - const navigate = useNavigate(); - - useEffect(() => { - if (loading) return; - - if (requiredVerification) { - if (!isUserExist) { - navigate("/auth/sign-up", { replace: true }); - toast.warning("Please create account to get access to My-Uni"); - return; - } - if (!isVerified) { - navigate("/auth/user-email", { replace: true }); - toast.warning("Please verify your account"); - return; - } - } else { - if (isUserExist && isVerified) { - navigate("/", { replace: true }); - toast.success("Welcome to the board"); - return; - } - } - }, [loading, isUserExist, isVerified, requiredVerification, navigate]); - - return { - loading, - isUserExist, - isVerified, - shouldRender: requiredVerification - ? isUserExist && isVerified - : !(isUserExist && isVerified), - }; -}; diff --git a/src/hooks/use-route-guard.ts b/src/hooks/use-route-guard.ts deleted file mode 100644 index a16f268..0000000 --- a/src/hooks/use-route-guard.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { useUserData } from "@/store/hooks/useUserData"; - -export const useRouteGuards = () => { - const { studentInfo, loading } = useUserData(); - - return { - userInfo: studentInfo, - loading, - isUserExist: !!studentInfo, - isVerified: studentInfo?.isVerified || false, - }; -}; diff --git a/src/hooks/useAuth.ts b/src/hooks/useAuth.ts new file mode 100644 index 0000000..8f53715 --- /dev/null +++ b/src/hooks/useAuth.ts @@ -0,0 +1,20 @@ +import { useState, useEffect } from "react"; +import { useUserData } from "@/store/hooks/useUserData"; + +export const useAuth = () => { + const { studentInfo, loading } = useUserData(); + const [checkingSession, setCheckingSession] = useState(true); + + useEffect(() => { + if (!loading) { + setCheckingSession(false); + } + }, [loading]); + + return { + studentInfo, + loading: loading || checkingSession, + isUserExist: !!studentInfo, + isVerified: studentInfo?.isVerified || false, + }; +}; diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 7865282..0809d08 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -7,14 +7,22 @@ export function cn(...inputs: ClassValue[]) { export function InputHandler( e: React.ChangeEvent, - setState: any + setState: React.Dispatch> ) { - const { name, value } = e.target; + const { name, type, value } = e.target; - setState((prev: any) => ({ - ...prev, - [name]: value, - })); + if (type === "file" && "files" in e.target) { + const files = (e.target as HTMLInputElement).files; + setState((prev: any) => ({ + ...prev, + [name]: files && files[0] ? files[0] : null, + })); + } else { + setState((prev: any) => ({ + ...prev, + [name]: value, + })); + } } // password visibility handler diff --git a/src/pages/dashboard/dashboard.tsx b/src/pages/dashboard/dashboard.tsx index cf3fec1..30a0ba9 100644 --- a/src/pages/dashboard/dashboard.tsx +++ b/src/pages/dashboard/dashboard.tsx @@ -19,9 +19,10 @@ interface ServiceCardProps { icon: React.ComponentType<{ className?: string }>; title: string; description: string; - buttonText: string; + linkText: string; buttonVariant?: "default" | "outline" | "secondary"; className?: string; + link: string; } const serviceCards: ServiceCardProps[] = [ @@ -30,48 +31,54 @@ const serviceCards: ServiceCardProps[] = [ icon: UtensilsCrossed, title: "Restaurant", description: "Check today's menu and weekly specials", - buttonText: "Today's special", + linkText: "Today's special", buttonVariant: "outline" as const, + link: "/restaurant", }, { id: 2, icon: BookOpen, title: "Library", description: "Hours, resources, and study spaces", - buttonText: "open until 08:00 pm", + linkText: "open until 08:00 pm", buttonVariant: "secondary" as const, + link: "/library", }, { id: 3, icon: Users, title: "Academic Personnel", description: "Faculty directory and contact info", - buttonText: "Dir faculty", + linkText: "faculty", buttonVariant: "outline" as const, + link: "/academic-personnel", }, { id: 4, icon: Clipboard, title: "Freshmen Guide", description: "Online info for new students", - buttonText: "new student", + linkText: "new student", buttonVariant: "outline" as const, + link: "/freshmenguide", }, { id: 5, icon: Briefcase, title: "Other services", description: "Offices, clubs, and support services", - buttonText: "200 services", + linkText: "All services", buttonVariant: "outline" as const, + link: "/services", }, { id: 6, icon: Settings, title: "Settings", description: "Manage your account and preferences", - buttonText: "profile", + linkText: "profile", buttonVariant: "outline" as const, + link: "/settings", }, ]; @@ -90,8 +97,9 @@ const Dashboard = () => { icon={service.icon} title={service.title} description={service.description} - buttonText={service.buttonText} + linkText={service.linkText} buttonVariant={service.buttonVariant} + link={service.link} /> ))} diff --git a/src/pages/dashboard/library.tsx b/src/pages/dashboard/library.tsx index 624a2fc..6db51bc 100644 --- a/src/pages/dashboard/library.tsx +++ b/src/pages/dashboard/library.tsx @@ -1,7 +1,6 @@ import { BookOpen, Calendar, Phone, Mail, MapPin } from "lucide-react"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; -import { Tabs } from "@radix-ui/react-tabs"; -import { TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; interface LibrarySchedule { day: string; diff --git a/src/components/page-builder.tsx b/src/pages/dashboard/page-builder.tsx similarity index 59% rename from src/components/page-builder.tsx rename to src/pages/dashboard/page-builder.tsx index 046e03b..526823c 100644 --- a/src/components/page-builder.tsx +++ b/src/pages/dashboard/page-builder.tsx @@ -5,8 +5,13 @@ import type { DefaultComponentProps, DefaultRootFieldProps, } from "@measured/puck"; -import { config, initialData } from "./puck/config"; +import { config, initialData } from "../../components/puck/config"; import { useState } from "react"; +import { useUserData } from "@/store/hooks/useUserData"; +import axios from "axios"; +import { toast } from "sonner"; + +const base_api = import.meta.env.VITE_SERVER_BASE_URL; export default function PageBuilder() { const [data, setData] = @@ -14,6 +19,42 @@ export default function PageBuilder() { Data >(initialData); const [isPreview, setIsPreview] = useState(false); + const [isLoading, setIsLoading] = useState(false); + + const { error, loading, studentInfo } = useUserData(); + + if (error) { + return

error

; + } + if (loading) { + return

loading

; + } + + const handlePublish = async (data: any) => { + console.log(data); + try { + setIsLoading(true); + const userId = studentInfo?.id; + const name = initialData.root.props.title; + const slug = studentInfo?.firstname; + console.log(data); + const response = await axios.post( + `${base_api}/api/v1/create-website`, + { userId, name, slug, data }, + { + withCredentials: true, + } + ); + + if (response.status === 200) { + toast.success("website published"); + setIsLoading(false); + } + } catch (error: any) { + setIsLoading(false); + console.log(error.message); + } + }; if (isPreview) { return ( @@ -43,13 +84,10 @@ export default function PageBuilder() { Preview
@@ -60,7 +98,7 @@ export default function PageBuilder() { data={data} onPublish={(data) => { setData(data); - console.log("Published data:", data); + handlePublish(data); }} /> diff --git a/src/pages/dashboard/website.tsx b/src/pages/dashboard/website.tsx new file mode 100644 index 0000000..b3f446b --- /dev/null +++ b/src/pages/dashboard/website.tsx @@ -0,0 +1,38 @@ +import { useParams } from "react-router-dom"; +import { useEffect, useState } from "react"; +import axios from "axios"; +import { Render } from "@measured/puck"; +import { config } from "../../components/puck/config"; + +const base_api = import.meta.env.VITE_SERVER_BASE_URL; + +export default function Website() { + const { slug } = useParams<{ slug: string }>(); + const [website, setWebsite] = useState(null); + const [loading, setLoading] = useState(true); + + const fetchWebsite = async () => { + try { + const res = await axios.get(`${base_api}/api/v1/get-website/${slug}`); + if (res.status === 200) { + setWebsite(res.data); + } + } catch (err) { + console.error(err); + } finally { + setLoading(false); + } + }; + useEffect(() => { + fetchWebsite(); + }, [slug]); + + if (loading) return

Loading...

; + if (!website) return

Website not found

; + + return ( +
+ +
+ ); +} diff --git a/src/routes/index.tsx b/src/routes/index.tsx index 60ed202..13718db 100644 --- a/src/routes/index.tsx +++ b/src/routes/index.tsx @@ -19,7 +19,8 @@ import VerifyEmail from "@/pages/auth/verify-user/verify-email"; import VerifyUserOtp from "@/pages/auth/verify-user/verify-user-otp"; import { AuthProtectedRoute } from "@/components/route-protection/auth-protected-route"; import { DashboardProtectedRoute } from "@/components/route-protection/dashboard-protected-route"; -import PageBuilder from "@/components/page-builder"; +import PageBuilder from "@/pages/dashboard/page-builder"; +import Website from "@/pages/dashboard/website"; const Paths = () => { return ( @@ -62,6 +63,8 @@ const Paths = () => { } /> + {/* website */} + } /> {/* dashboard */}