"use client"; import React, { ReactNode, useCallback, useMemo, useState } from "react"; export interface ModalControl { isOpen: boolean; openModal: (position?: { x: number; y: number }) => void; closeModal: () => void; position?: { x: number; y: number }; } export function useModal() { const [isOpen, setIsOpen] = useState(false); const [position, setPosition] = useState< { x: number; y: number } | undefined >(undefined); const openModal = useCallback((pos?: { x: number; y: number }) => { setPosition(pos); setIsOpen(true); }, []); const closeModal = useCallback(() => { setIsOpen(false); setPosition(undefined); }, []); return useMemo( () => ({ isOpen, openModal, closeModal, position, }), [closeModal, isOpen, openModal, position], ); } export default function Modal({ children, buttonText = "", buttonClass = "", modalWidth = "w-1/3", modalControl, buttonComponent, backgroundCoverColor = "bg-black/80", }: { children: (props: { closeModal: () => void }) => ReactNode; buttonText?: string; buttonClass?: string; modalWidth?: string; modalControl: ModalControl; buttonComponent?: (props: { openModal: () => void }) => ReactNode; backgroundCoverColor?: string; }) { return ( <> {buttonComponent ? buttonComponent({ openModal: () => modalControl.openModal() }) : buttonText && ( )}