only for login user access pages condition updated for homw page and crawl page and logout function updated

This commit is contained in:
Alaguraj0361 2025-09-18 13:38:03 +05:30
parent 3cdab23587
commit 290dff0b4a
8 changed files with 97 additions and 49 deletions

View File

@ -1,6 +1,7 @@
// app/(defaults)/crawl/page.tsx
'use client';
import { useRouter } from 'next/navigation';
import React, { useEffect, useMemo, useState } from 'react';
/**
@ -29,6 +30,18 @@ export default function CrawlPage() {
const apiBase = 'https://api.crawlerx.co/crawl';
const router = useRouter();
useEffect(() => {
const token = localStorage.getItem("token");
if (!token) {
// If no token, redirect to login page
router.push("/login");
}
}, [router]);
/* ---------------- URL helpers ---------------- */
const isValidUrl = useMemo(() => {
try {

View File

@ -1,11 +1,24 @@
import { Metadata } from 'next';
import React from 'react';
"use client";
export const metadata: Metadata = {
title: 'CrawlerX',
};
// import { Metadata } from "next";
import React, { useEffect } from "react";
import { useRouter } from "next/navigation";
// export const metadata: Metadata = {
// title: "CrawlerX",
// };
const Dashboard = () => {
const router = useRouter();
useEffect(() => {
const token = localStorage.getItem("token");
if (!token) {
// If no token, redirect to login page
router.push("/login");
}
}, [router]);
return <div>starter page</div>;
};

View File

@ -6,8 +6,8 @@ import { Nunito } from 'next/font/google';
export const metadata: Metadata = {
title: {
template: '%s | VRISTO - Multipurpose Tailwind Dashboard Template',
default: 'VRISTO - Multipurpose Tailwind Dashboard Template',
template: 'CrawlerX',
default: 'Crawl Smarter. Rank Higher.',
},
};
const nunito = Nunito({

View File

@ -1,6 +1,6 @@
const Footer = () => {
return (
<div className="p-6 pt-0 mt-auto text-center dark:text-white-dark ltr:sm:text-left rtl:sm:text-right">© {new Date().getFullYear()}. Vristo All rights reserved.</div>
<div className="p-6 pt-0 mt-auto text-center dark:text-white-dark ltr:sm:text-left rtl:sm:text-right">© {new Date().getFullYear()}. CrawlerX All rights reserved.</div>
);
};

View File

@ -144,6 +144,17 @@ const Header = () => {
};
const [search, setSearch] = useState(false);
const [token, setToken] = useState("")
useEffect(() => {
const Token: any = localStorage.getItem('token')
setToken(Token)
}, [])
const HandleLogout = () => {
localStorage.removeItem('token')
router.push('/login')
}
return (
<header className={`z-40 ${themeConfig.semidark && themeConfig.menu === 'horizontal' ? 'dark' : ''}`}>
@ -152,7 +163,7 @@ const Header = () => {
<div className="horizontal-logo flex items-center justify-between ltr:mr-2 rtl:ml-2 lg:hidden">
<Link href="/" className="main-logo flex shrink-0 items-center">
<img className="inline w-8 ltr:-ml-1 rtl:-mr-1" src="/assets/images/logo.svg" alt="logo" />
<span className="hidden align-middle text-2xl font-semibold transition-all duration-300 ltr:ml-1.5 rtl:mr-1.5 dark:text-white-light md:inline">VRISTO</span>
<span className="hidden align-middle text-2xl font-semibold transition-all duration-300 ltr:ml-1.5 rtl:mr-1.5 dark:text-white-light md:inline">CrawlerX</span>
</Link>
<button
type="button"
@ -213,8 +224,7 @@ const Header = () => {
<div>
{themeConfig.theme === 'light' ? (
<button
className={`${
themeConfig.theme === 'light' &&
className={`${themeConfig.theme === 'light' &&
'flex items-center rounded-full bg-white-light/40 p-2 hover:bg-white-light/90 hover:text-primary dark:bg-dark/40 dark:hover:bg-dark/60'
}`}
onClick={() => dispatch(toggleTheme('dark'))}
@ -226,8 +236,7 @@ const Header = () => {
)}
{themeConfig.theme === 'dark' && (
<button
className={`${
themeConfig.theme === 'dark' &&
className={`${themeConfig.theme === 'dark' &&
'flex items-center rounded-full bg-white-light/40 p-2 hover:bg-white-light/90 hover:text-primary dark:bg-dark/40 dark:hover:bg-dark/60'
}`}
onClick={() => dispatch(toggleTheme('system'))}
@ -237,8 +246,7 @@ const Header = () => {
)}
{themeConfig.theme === 'system' && (
<button
className={`${
themeConfig.theme === 'system' &&
className={`${themeConfig.theme === 'system' &&
'flex items-center rounded-full bg-white-light/40 p-2 hover:bg-white-light/90 hover:text-primary dark:bg-dark/40 dark:hover:bg-dark/60'
}`}
onClick={() => dispatch(toggleTheme('light'))}
@ -445,10 +453,24 @@ const Header = () => {
</Link>
</li>
<li className="border-t border-white-light dark:border-white-light/10">
<Link href="/auth/boxed-signin" className="!py-3 text-danger">
<li className="border-t border-white-light dark:border-white-light/10">
{token ? (
<button
type="button"
onClick={HandleLogout}
className="!py-3 text-danger flex items-center"
>
<IconLogout className="h-4.5 w-4.5 shrink-0 rotate-90 ltr:mr-2 rtl:ml-2" />
Sign Out
</button>
) : (
<Link href="/login" className="!py-3 text-danger">
<IconLogout className="h-4.5 w-4.5 shrink-0 rotate-90 ltr:mr-2 rtl:ml-2" />
Login
</Link>
)}
</li>
</li>
</ul>
</Dropdown>

View File

@ -91,7 +91,7 @@ const Sidebar = () => {
<div className="flex items-center justify-between px-4 py-3">
<Link href="/" className="main-logo flex shrink-0 items-center">
<img className="ml-[5px] w-8 flex-none" src="/assets/images/logo.svg" alt="logo" />
<span className="align-middle text-2xl font-semibold ltr:ml-1.5 rtl:mr-1.5 dark:text-white-light lg:inline">VRISTO</span>
<span className="align-middle text-2xl font-semibold ltr:ml-1.5 rtl:mr-1.5 dark:text-white-light lg:inline">CrawlerX</span>
</Link>
<button

4
package-lock.json generated
View File

@ -1,11 +1,11 @@
{
"name": "vristo-next",
"name": "CrawlerX",
"version": "0.1.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "vristo-next",
"name": "CrawlerX",
"version": "0.1.0",
"dependencies": {
"@emotion/react": "^11.10.6",

View File

@ -1,5 +1,5 @@
{
"name": "vristo-next",
"name": "crawlerx",
"version": "0.1.0",
"private": true,
"scripts": {