import React, { useEffect, useRef } from "react" import { motion, AnimatePresence } from "framer-motion" import { icons } from "lucide-react" import { Button } from "@/components/ui/button" import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip" import { getSpecialShortcut, formatShortcut, isMacOS } from "@/lib/utils" import { LaIcon } from "@/components/custom/la-icon" import { useAtom } from "jotai" import { linkShowCreateAtom } from "@/store/link" import { useQueryState } from "nuqs" import { useConfirm } from "@omit/react-confirm-dialog" import { useAccount, useCoState } from "@/lib/providers/jazz-provider" import { PersonalLink } from "@/lib/schema" import { ID } from "jazz-tools" import { globalLinkFormExceptionRefsAtom } from "./partials/form/link-form" import { useLinkActions } from "./hooks/use-link-actions" interface ToolbarButtonProps extends React.ComponentPropsWithoutRef { icon: keyof typeof icons onClick?: (e: React.MouseEvent) => void tooltip?: string } const ToolbarButton = React.forwardRef( ({ icon, onClick, tooltip, ...props }, ref) => { const button = ( ) if (tooltip) { return ( {button}

{tooltip}

) } return button } ) ToolbarButton.displayName = "ToolbarButton" export const LinkBottomBar: React.FC = () => { const [editId, setEditId] = useQueryState("editId") const [, setGlobalLinkFormExceptionRefsAtom] = useAtom(globalLinkFormExceptionRefsAtom) const [showCreate, setShowCreate] = useAtom(linkShowCreateAtom) const { me } = useAccount({ root: { personalLinks: [] } }) const personalLink = useCoState(PersonalLink, editId as ID) const cancelBtnRef = useRef(null) const confirmBtnRef = useRef(null) const overlayRef = useRef(null) const contentRef = useRef(null) const deleteBtnRef = useRef(null) const editMoreBtnRef = useRef(null) const plusBtnRef = useRef(null) const plusMoreBtnRef = useRef(null) const { deleteLink } = useLinkActions() const confirm = useConfirm() useEffect(() => { setGlobalLinkFormExceptionRefsAtom([ overlayRef, contentRef, deleteBtnRef, editMoreBtnRef, cancelBtnRef, confirmBtnRef, plusBtnRef, plusMoreBtnRef ]) }, [setGlobalLinkFormExceptionRefsAtom]) const handleDelete = async (e: React.MouseEvent) => { if (!personalLink) return const result = await confirm({ title: `Delete "${personalLink.title}"?`, description: "This action cannot be undone.", alertDialogTitle: { className: "text-base" }, alertDialogOverlay: { ref: overlayRef }, alertDialogContent: { ref: contentRef }, cancelButton: { variant: "outline", ref: cancelBtnRef }, confirmButton: { variant: "destructive", ref: confirmBtnRef } }) if (result) { if (!me) return deleteLink(me, personalLink) setEditId(null) } } useEffect(() => { const handleKeyDown = (event: KeyboardEvent) => { if (isMacOS()) { if (event.ctrlKey && event.metaKey && event.key.toLowerCase() === "n") { event.preventDefault() setShowCreate(true) } } else { // For Windows, we'll use Ctrl + Win + N // Note: The Windows key is not directly detectable in most browsers if (event.ctrlKey && event.key.toLowerCase() === "n" && (event.metaKey || event.altKey)) { event.preventDefault() setShowCreate(true) } } } window.addEventListener("keydown", handleKeyDown) return () => window.removeEventListener("keydown", handleKeyDown) }, [setShowCreate]) const shortcutKeys = getSpecialShortcut("expandToolbar") const shortcutText = formatShortcut(shortcutKeys) return ( {editId && ( setEditId(null)} /> )} {!editId && ( {showCreate && setShowCreate(true)} />} {!showCreate && ( setShowCreate(true)} tooltip={`New Link (${shortcutText})`} ref={plusBtnRef} /> )} {/* */} )} ) } LinkBottomBar.displayName = "LinkBottomBar" export default LinkBottomBar