"use client" import type React from "react" import { ComponentContainer } from "@/components/ui/component-container" import { SectionHeading } from "@/components/ui/section-heading" import { useState, useRef, useEffect } from "react" import { createPortal } from "react-dom" // Functional Context Menu Component with Portal Rendering function ContextMenuDemo() { const [isOpen, setIsOpen] = useState(false) const [position, setPosition] = useState({ x: 0, y: 0 }) const [mounted, setMounted] = useState(false) const triggerRef = useRef(null) const menuRef = useRef(null) // Handle SSR useEffect(() => { setMounted(true) return () => setMounted(false) }, []) const handleContextMenu = (e: React.MouseEvent) => { e.preventDefault() // Calculate position relative to the viewport const x = e.clientX const y = e.clientY // Adjust position to ensure menu stays within viewport const menuWidth = 220 const menuHeight = 300 // Approximate height const adjustedX = Math.min(x, window.innerWidth - menuWidth - 10) const adjustedY = Math.min(y, window.innerHeight - menuHeight - 10) setPosition({ x: adjustedX, y: adjustedY }) setIsOpen(true) } const handleClickOutside = (e: MouseEvent) => { if (menuRef.current && !menuRef.current.contains(e.target as Node)) { setIsOpen(false) } } useEffect(() => { if (isOpen) { document.addEventListener("mousedown", handleClickOutside) document.addEventListener("contextmenu", handleClickOutside) } else { document.removeEventListener("mousedown", handleClickOutside) document.removeEventListener("contextmenu", handleClickOutside) } return () => { document.removeEventListener("mousedown", handleClickOutside) document.removeEventListener("contextmenu", handleClickOutside) } }, [isOpen]) // Menu component to be rendered in portal const ContextMenuPortal = () => { if (!mounted || !isOpen) return null return createPortal(
Back ⌘[
Forward ⌘]
Reload ⌘R
Save Page As... ⌘S
Create Shortcut...
Name Window...
Show Bookmarks Bar ⌘⇧B
Show Full URLs
People
Pedro Duarte
Colm Tuite
, document.body, ) } return (
Right click here
) } export function ContextMenuSection() { return (
Right click here Back ⌘[ Forward ⌘] Reload ⌘R More Tools Save Page As... ⌘S Create Shortcut... Name Window... Developer Tools Show Bookmarks Bar ⌘⇧B Show Full URLs People Pedro Duarte Colm Tuite ) }`} >
) }