From 290dff0b4abe1b8f95af89412445600dd94168f3 Mon Sep 17 00:00:00 2001 From: Alaguraj0361 Date: Thu, 18 Sep 2025 13:38:03 +0530 Subject: [PATCH] only for login user access pages condition updated for homw page and crawl page and logout function updated --- app/(defaults)/crawl/page.tsx | 57 +++++++++++++++++++++------------- app/(defaults)/page.tsx | 25 +++++++++++---- app/layout.tsx | 4 +-- components/layouts/footer.tsx | 2 +- components/layouts/header.tsx | 50 ++++++++++++++++++++--------- components/layouts/sidebar.tsx | 2 +- package-lock.json | 4 +-- package.json | 2 +- 8 files changed, 97 insertions(+), 49 deletions(-) diff --git a/app/(defaults)/crawl/page.tsx b/app/(defaults)/crawl/page.tsx index e62fb38..e893aa8 100644 --- a/app/(defaults)/crawl/page.tsx +++ b/app/(defaults)/crawl/page.tsx @@ -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 { @@ -104,28 +117,28 @@ export default function CrawlPage() { URL.revokeObjectURL(url); } -function exportCSV() { - const rows = filteredRows; - if (!rows.length) return; - const cols = visibleCols.length ? visibleCols : defaultCols; + function exportCSV() { + const rows = filteredRows; + if (!rows.length) return; + const cols = visibleCols.length ? visibleCols : defaultCols; - const csvEscape = (v: any) => { - if (v == null) return ''; - const s = String(v); - // NOTE: keep this regex on one line! - return /[",\n]/.test(s) ? `"${s.replace(/"/g, '""')}"` : s; - }; + const csvEscape = (v: any) => { + if (v == null) return ''; + const s = String(v); + // NOTE: keep this regex on one line! + return /[",\n]/.test(s) ? `"${s.replace(/"/g, '""')}"` : s; + }; - const header = cols.join(','); - const lines = rows.map((r) => cols.map((c) => csvEscape(r[c])).join(',')); - const csv = [header, ...lines].join('\n'); + const header = cols.join(','); + const lines = rows.map((r) => cols.map((c) => csvEscape(r[c])).join(',')); + const csv = [header, ...lines].join('\n'); - const blob = new Blob([csv], { type: 'text/csv;charset=utf-8' }); - const a = document.createElement('a'); - a.href = URL.createObjectURL(blob); - a.download = 'crawl-report.csv'; - a.click(); -} + const blob = new Blob([csv], { type: 'text/csv;charset=utf-8' }); + const a = document.createElement('a'); + a.href = URL.createObjectURL(blob); + a.download = 'crawl-report.csv'; + a.click(); + } /* ---------------- data shaping ---------------- */ const rows = useMemo(() => dataRows(report), [report]); @@ -144,7 +157,7 @@ function exportCSV() { useEffect(() => { if (!rows.length) return; if (!visibleCols.length) setVisibleCols(PRESets[view]?.columns ?? defaultCols); - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line react-hooks/exhaustive-deps }, [rows.length]); // recompute on view change @@ -422,8 +435,8 @@ function dataRows(report: any): any[] { const data = Array.isArray(report) ? report : Array.isArray(report?.results) - ? report.results - : null; + ? report.results + : null; return Array.isArray(data) ? data : []; } diff --git a/app/(defaults)/page.tsx b/app/(defaults)/page.tsx index b7df97f..bc6e1f3 100644 --- a/app/(defaults)/page.tsx +++ b/app/(defaults)/page.tsx @@ -1,12 +1,25 @@ -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 = () => { - return
starter page
; + const router = useRouter(); + + useEffect(() => { + const token = localStorage.getItem("token"); + if (!token) { + // If no token, redirect to login page + router.push("/login"); + } + }, [router]); + + return
starter page
; }; export default Dashboard; diff --git a/app/layout.tsx b/app/layout.tsx index 1711fec..a1c40e0 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -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({ diff --git a/components/layouts/footer.tsx b/components/layouts/footer.tsx index 29c2de7..9dd3d06 100644 --- a/components/layouts/footer.tsx +++ b/components/layouts/footer.tsx @@ -1,6 +1,6 @@ const Footer = () => { return ( -
© {new Date().getFullYear()}. Vristo All rights reserved.
+
© {new Date().getFullYear()}. CrawlerX All rights reserved.
); }; diff --git a/components/layouts/header.tsx b/components/layouts/header.tsx index 3a3b637..ee1353d 100644 --- a/components/layouts/header.tsx +++ b/components/layouts/header.tsx @@ -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 (
@@ -152,7 +163,7 @@ const Header = () => {
logo - VRISTO + CrawlerX + ) : ( + + + Login + + )} + + diff --git a/components/layouts/sidebar.tsx b/components/layouts/sidebar.tsx index 534fbe8..104142a 100644 --- a/components/layouts/sidebar.tsx +++ b/components/layouts/sidebar.tsx @@ -91,7 +91,7 @@ const Sidebar = () => {
logo - VRISTO + CrawlerX