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