import React from 'react' import { FolderOpen, Settings, Zap, Bell, Mail, ChevronRight, FileText } from 'lucide-react' import { applyFilters } from '../extensions/registry' // WP doesn't have Tippy, so we build a lightweight Tippy-style tooltip + flyout import { useState, useRef, useEffect } from 'react' export function Tooltip({ content, placement = 'right', children }) { const [show, setShow] = useState(false) const ref = useRef(null) const [pos, setPos] = useState({ top: 0, left: 0 }) useEffect(() => { if (show && ref.current) { const rect = ref.current.getBoundingClientRect() setPos({ top: rect.top + rect.height / 2, left: rect.right + 8 }) } }, [show]) return (
setShow(true)} onMouseLeave={() => setShow(false)} className="relative" > {children} {show && (
{content}
)}
) } /** One tile of the left rail (icon + label). Extensions reuse it for their own tiles. */ export function RailTile({ icon: Icon, label, onClick, collapsed = false, dataTile }) { return ( ) } /** One row of the Settings flyout. */ function FlyoutItem({ icon: Icon, label, sublabel, iconBg = '#F3F4F6', iconClass = 'text-gray-700', hoverBg = 'rgba(249,250,251,0.9)', onClick }) { return ( ) } /** * Left rail tiles. Extensions add tiles with the `leftRail.tiles` filter (items: { id, label, tooltip, icon, onClick } * or { id, Component } for a custom tile, which receives { collapsed, openSettings }) and Settings flyout rows with * `leftRail.settingsMenu` (items: { id, label, sublabel, icon, onClick }). */ const FloatingIcons = ({ onTemplatesClick, onSettingsItemClick, collapsed = false, onEntriesClick, }) => { const [settingsOpen, setSettingsOpen] = useState(false) const settingsTimerRef = useRef(null) const handleSettingsEnter = () => { if (settingsTimerRef.current) clearTimeout(settingsTimerRef.current) setSettingsOpen(true) } const handleSettingsLeave = () => { settingsTimerRef.current = setTimeout(() => { setSettingsOpen(false) }, 160) } const openSettings = (tab) => onSettingsItemClick && onSettingsItemClick(tab) const ctx = { collapsed, openSettings } const tiles = applyFilters('leftRail.tiles', [ { id: 'entries', label: 'Entries', tooltip: 'View and manage form submissions', icon: FileText, onClick: onEntriesClick }, { id: 'templates', label: 'Templates', tooltip: 'Browse pre-built templates or start fresh', icon: FolderOpen, onClick: onTemplatesClick, dataTile: 'templates' }, { id: 'actions', label: 'Actions', tooltip: 'Configure redirects, messages, and submit behavior', icon: Zap, onClick: () => openSettings('Submit Actions') }, { id: 'notices', label: 'Notices', tooltip: 'Configure admin email alerts and autoresponders', icon: Bell, onClick: () => openSettings('Notifications') }, ], ctx) || [] const settingsMenu = applyFilters('leftRail.settingsMenu', [ { id: 'general', label: 'General Setup', icon: Settings, onClick: () => openSettings('Form Settings') }, { id: 'email', label: 'Sender Identity (SMTP)', icon: Mail, iconBg: 'rgba(209,250,229,0.7)', iconClass: 'text-emerald-700', hoverBg: 'rgba(236,253,245,0.7)', onClick: () => openSettings('Email Settings') }, ], ctx) || [] return (
{tiles.map((tile) => { if (tile.Component) return return ( ) })} {/* Settings with flyout submenu */}
openSettings('Form Settings')} collapsed={collapsed} dataTile="settings" /> {settingsOpen && (
Form Settings
{settingsMenu.map(({ id, onClick, ...item }) => ( { if (onClick) onClick(); setSettingsOpen(false) }} /> ))}
)}
) } export default FloatingIcons