Duffer Derek

Current Path : /var/www/sitesecurity.bitkit.dk/httpdocs/src/app/
Upload File :
Current File : /var/www/sitesecurity.bitkit.dk/httpdocs/src/app/page.tsx

"use client";
import { useEffect, useState, Suspense } from "react";
import { useRouter, useSearchParams } from "next/navigation";
import Cookies from "js-cookie";
import axios from "axios";
import Loader from "@/components/modules/loader/Loader";

function HomeContent() {
  const router = useRouter();
  const searchParams = useSearchParams();
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    const checkPermissions = async () => {
      // First check for code parameter
      const code = searchParams.get("code");
      // console.log("Root page - Checking code:", code);

      if (code) {
        try {
          // console.log("Root page - Processing code...");
          // Exchange code for token
          const response = await axios.get(`${process.env.NEXT_PUBLIC_API_BASE_URL}/land`, {
            params: { code },
          });

          // console.log(response.data);

          if (response.data.access_token) {
            // Store the token
            Cookies.set("authToken", response.data.access_token);
            sessionStorage.setItem("authToken", response.data.access_token);
            // console.log("Root page - Token stored successfully");

            // Remove code from URL
            window.history.replaceState({}, "", "/");
          } else {
            // No token received, redirect to sign-in
            setLoading(false);
            router.replace("/sign-in");
            return;
          }
        } catch (error) {
          console.error("Root page - Failed to exchange code for token:", error);
          setLoading(false);
          router.replace("/sign-in");
          return;
        }
      }

      // Check both cookie and sessionStorage for token (Firefox compatibility);
      const cookieToken = Cookies.get("authToken");
      const sessionToken = typeof window !== "undefined" ? sessionStorage.getItem("authToken") : null;
      const storedToken = cookieToken || sessionToken;

      if (!storedToken) {
        setLoading(false);
        router.replace("/sign-in");
        return;
      }

      // If we have sessionStorage token but no cookie, restore the cookie for consistency
      if (sessionToken && !cookieToken) {
        Cookies.set("authToken", sessionToken, {
          secure: true,
          sameSite: "strict",
        });
      }

      try {
        const baseUrl = process.env.NEXT_PUBLIC_API_BASE_URL;
        const response = await axios.get(`${baseUrl}/me`, {
          headers: {
            Authorization: `Bearer ${storedToken}`,
          },
        });

        // console.log(response.data);

        const access = response.data.role.access || [];

        setLoading(false);
        
        // Check for intendedPath first before doing permission-based redirect
        const intendedPath = sessionStorage.getItem("intendedPath");
        if (intendedPath && intendedPath !== "/") {
          sessionStorage.removeItem("intendedPath");
          router.replace(intendedPath);
          return;
        }

        // If no intendedPath, do permission-based redirect
        const hasStream = access.includes("unit:stream");
        const hasList = access.includes("unit:list");
        
        if (hasStream && !hasList) {
          router.replace("/live-view");
        } else {
          router.replace("/dashboard");
        }
      } catch (error) {
        setLoading(false);
        router.replace("/sign-in");
      }
    };

    checkPermissions();
  }, [router, searchParams]);

  if (loading) {
    return (
      <div className="flex h-screen w-full items-center justify-center bg-[#F5F6F9]">
        <Loader />
      </div>
    );
  }

  return null;
}

export default function Home() {
  return (
    <Suspense
      fallback={
        <div className="flex h-screen w-full items-center justify-center bg-[#F5F6F9]">
          <Loader />
        </div>
      }
    >
      <HomeContent />
    </Suspense>
  );
}

Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists