import { HTMLAttributes, RefObject, useEffect, useRef, useState } from "react"; import { selectedOnChange } from "./selectorItem"; import { createPortal } from "react-dom"; import { Icon } from "@iconify/react"; import React from "react"; export type selectionType = string; interface PickerProps extends HTMLAttributes { selected: selectionType; selectionOnChange: selectedOnChange; displayContent: string; selectionItems: PickedItem; } export interface PickedItem { [key: string]: selectionType; } export default function Picker(props: PickerProps) { const itemListRef: RefObject = useRef(null); const buttonRef: RefObject = useRef(null); const [displayList, setDisplayList] = useState(false); const updatePosition = () => { if (itemListRef.current == null || buttonRef.current == null) { return; } const buttonRect = buttonRef.current.getBoundingClientRect(); const listWidth = itemListRef.current.getBoundingClientRect().width; // Align to center itemListRef.current.style.left = buttonRect.x + buttonRect.width / 2 - listWidth / 2 + "px"; itemListRef.current.style.top = buttonRect.y + buttonRect.height + 16 + "px"; }; useEffect(() => { updatePosition(); const handleResize = () => { updatePosition(); }; window.addEventListener("resize", handleResize); // Cleanup event listener on component unmount return () => { window.removeEventListener("resize", handleResize); }; }, [itemListRef, buttonRef]); function toggleDisplay(targetState?: boolean) { function hideList() { if (itemListRef.current) { itemListRef.current.style.opacity = "0%"; itemListRef.current.style.transform = "scaleX(.85) scaleY(.85)"; } setTimeout(() => { setDisplayList(false); }, 200); } function showList() { setDisplayList(true); setTimeout(() => { updatePosition(); if (itemListRef.current) { itemListRef.current.style.opacity = "100%"; itemListRef.current.style.transform = "scaleX(1) scaleY(1)"; } }, 20); } if (targetState === true) { showList(); } else if (targetState === false) { hideList(); } else if (displayList === true) { hideList(); } else { showList(); } } const { displayContent, selectionOnChange, selectionItems, selected, ...rest } = props; return (
{displayList && ( )}
); } interface PickerListProps { selected: selectionType; selectionOnChange: selectedOnChange; selectionItems: PickedItem; toggleDisplay: Function; } const PickerList = React.forwardRef((props, ref) => { const { selected, selectionOnChange, selectionItems } = props; return createPortal(
{Object.keys(selectionItems).map((key: string, index) => { return (
{ selectionOnChange(key); props.toggleDisplay(); }} > {selectionItems[key]}
{key === selected && ( )}
); })}
, document.body ); }); PickerList.displayName = "PickerList";