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