All files / components/windows BrowserContent.tsx

0% Statements 0/88
100% Branches 1/1
100% Functions 1/1
0% Lines 0/88

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124                                                                                                                                                                                                                                                       
"use client";
 
import { useState, useRef, useCallback } from "react";
import styles from "@/components/windows/WindowContent.module.css";
import { ArrowLeft, ArrowRight, RotateCw, Home, Search } from "lucide-react";
 
// 🧠 Debug toggle
const DEBUG =
  (typeof process !== "undefined" &&
    process.env.NODE_ENV !== "production") ||
  (typeof process !== "undefined" &&
    process.env.NEXT_PUBLIC_DEBUG === "true");
 
const dlog = (...args: any[]) => {
  if (DEBUG) console.log("[BrowserContent]", ...args);
};
 
interface BrowserContentProps {
  url: string;
}
 
export default function BrowserContent({ url: initialUrl }: BrowserContentProps) {
  const safeUrl =
    initialUrl && typeof initialUrl === "string"
      ? initialUrl
      : "https://example.com";
 
  const [currentUrl, setCurrentUrl] = useState(safeUrl);
  const [inputUrl, setInputUrl] = useState(safeUrl);
  const iframeRef = useRef<HTMLIFrameElement | null>(null);
 
  // 🧭 Input handlers
  const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    setInputUrl(e.target.value);
  };
 
  const handleNavigate = (e: React.FormEvent) => {
    e.preventDefault();
    let urlToLoad = inputUrl.trim();
    if (!urlToLoad.startsWith("http://") && !urlToLoad.startsWith("https://")) {
      urlToLoad = `https://${urlToLoad}`;
    }
    setCurrentUrl(urlToLoad);
    dlog(`🌐 Navigating to ${urlToLoad}`);
  };
 
  const handleReload = () => {
    if (iframeRef.current) {
      iframeRef.current.src = currentUrl;
      dlog(`🔄 Reloading ${currentUrl}`);
    }
  };
 
  const handleGoHome = () => {
    setCurrentUrl(safeUrl);
    setInputUrl(safeUrl);
    dlog("🏠 Returning to home URL");
  };
 
  const handleGoBack = () => {
    alert(
      "Browser back functionality is limited in this demo due to browser security (CORS)."
    );
    dlog("⚠️ Back navigation attempted");
  };
 
  const handleGoForward = () => {
    alert(
      "Browser forward functionality is limited in this demo due to browser security (CORS)."
    );
    dlog("⚠️ Forward navigation attempted");
  };
 
  return (
    <div className={styles.browserContainer}>
      <div className={styles.browserToolbar}>
        <button onClick={handleGoBack} aria-label="Go back" title="Back">
          <ArrowLeft size={20} />
        </button>
        <button onClick={handleGoForward} aria-label="Go forward" title="Forward">
          <ArrowRight size={20} />
        </button>
        <button onClick={handleReload} aria-label="Reload page" title="Reload">
          <RotateCw size={20} />
        </button>
        <button onClick={handleGoHome} aria-label="Go home" title="Home">
          <Home size={20} />
        </button>
 
        <form
          onSubmit={handleNavigate}
          style={{ flexGrow: 1, display: "flex" }}
          title="Address Bar"
        >
          <input
            type="text"
            value={inputUrl}
            onChange={handleInputChange}
            placeholder="Enter URL or search"
            aria-label="URL input"
          />
          <button type="submit" aria-label="Go" title="Go">
            <Search size={20} />
          </button>
        </form>
      </div>
 
      <iframe
        ref={iframeRef}
        src={currentUrl}
        title="Browser"
        sandbox="allow-scripts allow-same-origin allow-popups allow-forms"
        allow="accelerometer; autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share"
        style={{
          flexGrow: 1,
          border: "none",
          background: "#fff",
        }}
        loading="lazy"
      />
    </div>
  );
}