{"version":3,"file":"index162.mjs","sources":["../src/atoms/dropdown/wheelpicker/index.tsx"],"sourcesContent":["import React, {\n  useEffect,\n  useState,\n  useRef,\n  CSSProperties,\n  useMemo,\n  RefObject,\n} from \"react\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport DropdownItemAtom from \"../item\";\nimport styles from \"../container/DropdownContainerAtom.module.css\";\nimport { useDevice } from \"../../../hooks/useDevice\";\nimport ActionSheet, { ActionSheetType } from \"../../../components/action-sheet\";\nimport { DropdownContainerType, DropdownItemType } from \"../container/\";\n\nconst dropdownVariants = {\n  hidden: {\n    opacity: 0,\n    maxHeight: 0,\n    transition: { duration: 0.2 },\n    display: \"none\",\n  },\n  visible: {\n    opacity: 1,\n    maxHeight: \"500px\",\n    transition: { duration: 0.2 },\n    display: \"block\",\n  },\n};\n\n/**\n * Scrolls the given list container to the item at the specified index.\n * @param listContainer The container element to scroll.\n * @param itemIdx The index of the item to scroll to (not counting padding items).\n * @param itemSize \"sm\" or \"md\" (determines item height).\n */\nexport function scrollListContainerToItem(\n  listContainer: HTMLDivElement,\n  itemIdx: number,\n  itemSize: \"sm\" | \"md\" = \"sm\"\n) {\n  const itemHeight = itemSize === \"sm\" ? 32 : 48;\n  listContainer.scrollTo({\n    top: itemHeight * itemIdx,\n    behavior: \"smooth\",\n  });\n}\n\nexport interface WheelpickerContainerType extends DropdownContainerType {\n  itemWidth?: \"fill\" | \"fit-content\";\n  actionsheet?: ActionSheetType;\n}\n\nexport const WheelpickerContainerAtom: React.FC<WheelpickerContainerType> = ({\n  className = \"\",\n  width = \"200px\",\n  parent,\n  isOpen = false,\n  data = [],\n  itemSize = \"sm\",\n  itemWidth = \"fill\",\n  selected: selectedItems = [],\n  offsetTop = 0,\n  textAlignment = \"left\",\n  onChange,\n  actionsheet,\n  customContent,\n}) => {\n  const { isDesktop } = useDevice();\n  const containerRef = useRef<HTMLDivElement>(null);\n  const [topPosition, setTopPosition] = useState(0);\n  const [isMounted, setIsMounted] = useState(false);\n  const [selected, setSelected] = useState<\n    DropdownItemType | DropdownItemType[]\n  >(selectedItems);\n  const wheelpickerRef = useRef<HTMLDivElement>(null);\n  const activeContainerRef = useRef<HTMLDivElement | null>(null);\n  const lastSelectedRef = useRef<DropdownItemType[]>([]);\n  const centerCheckIntervalRef = useRef<NodeJS.Timeout | null>(null);\n\n  let height: string | undefined;\n\n  // Wheelpicker sizing\n  if (itemSize === \"sm\") {\n    height = \"177px\";\n  } else if (itemSize === \"md\") {\n    height = \"258px\";\n  }\n\n  const dropdownContainerStyle: CSSProperties = useMemo(() => {\n    return {\n      overflow: \"hidden\",\n      maxHeight: height,\n      width: width,\n      top: `${topPosition}px`,\n    };\n  }, [height, topPosition]);\n\n  useEffect(() => {\n    if (parent.current && isOpen) {\n      const elementHeight =\n        parent.current.getBoundingClientRect().height + offsetTop;\n      setTopPosition(elementHeight);\n    }\n  }, [parent, isOpen]);\n\n  // Scroll to the selected item on open\n  useEffect(() => {\n    if (selected && Array.isArray(selected) && isOpen && !isMounted) {\n      setTimeout(() => {\n        setIsMounted(true);\n      }, 300);\n\n      setTimeout(() => {\n        selected.forEach((item, index) => {\n          const itemIdx = data[index]?.items?.findIndex(\n            (i) => i.value === item.value\n          );\n          if (itemIdx !== undefined && itemIdx >= 0) {\n            const listContainer = document.querySelector(\n              `.wheelpicker-container-list[data-list-index=\"${index}\"]`\n            ) as HTMLDivElement;\n            if (listContainer) {\n              scrollListContainerToItem(listContainer, itemIdx, itemSize);\n            }\n          }\n        });\n      }, 10);\n    }\n  }, [selected, isOpen]);\n\n  // Add this function above the useEffect for keyboard controls\n  const handleListNavigation = (eventOrKey: KeyboardEvent | string) => {\n    if (!isOpen || !activeContainerRef.current) return;\n\n    const container = activeContainerRef.current;\n    const itemHeight = itemSize === \"sm\" ? 32 : 48;\n\n    let key: string;\n    let preventDefault = () => {};\n\n    if (typeof eventOrKey === \"string\") {\n      key = eventOrKey;\n    } else {\n      key = eventOrKey.key;\n      preventDefault = () => eventOrKey.preventDefault();\n    }\n\n    switch (key) {\n      case \"ArrowUp\":\n        preventDefault();\n        container.scrollBy({ top: -itemHeight, behavior: \"smooth\" });\n        break;\n      case \"ArrowDown\":\n        preventDefault();\n        container.scrollBy({ top: itemHeight, behavior: \"smooth\" });\n        break;\n      case \"PageUp\":\n        preventDefault();\n        container.scrollBy({ top: -itemHeight * 5, behavior: \"smooth\" });\n        break;\n      case \"PageDown\":\n        preventDefault();\n        container.scrollBy({ top: itemHeight * 5, behavior: \"smooth\" });\n        break;\n      case \"ArrowLeft\":\n        preventDefault();\n        moveActiveContainer(\"left\");\n        break;\n      case \"ArrowRight\":\n        preventDefault();\n        moveActiveContainer(\"right\");\n        break;\n      default:\n        break;\n    }\n  };\n\n  // Update the useEffect for keyboard controls:\n  useEffect(() => {\n    const handleKeyDown = (e: KeyboardEvent) => {\n      handleListNavigation(e);\n    };\n\n    window.addEventListener(\"keydown\", handleKeyDown);\n    return () => window.removeEventListener(\"keydown\", handleKeyDown);\n  }, [isOpen, activeContainerRef]);\n\n  const defaultRenderItem = (\n    {\n      label,\n      value,\n      iconLeft,\n      iconRight,\n      className,\n      itemKey,\n      state = \"default\",\n    }: DropdownItemType,\n    listContainer: string\n  ) => {\n    const isItemSelected =\n      !Array.isArray(selected) && selected?.value === value;\n\n    console.log({ textAlignment });\n    return (\n      <DropdownItemAtom\n        className={className}\n        size={itemSize}\n        width={itemWidth}\n        label={label}\n        value={value}\n        type={\"text\"}\n        textAlignment={textAlignment}\n        state={state}\n        itemKey={itemKey}\n        key={`item-${label}-${value}`}\n        selected={isItemSelected}\n        onClick={() => {\n          const container = document.querySelector(listContainer);\n          if (container instanceof HTMLDivElement && itemKey !== undefined) {\n            scrollListContainerToItem(container, itemKey, itemSize);\n          }\n        }}\n        iconLeft={iconLeft}\n        iconRight={iconRight}\n      />\n    );\n  };\n\n  const startCenterCheckInterval = () => {\n    centerCheckIntervalRef.current = setInterval(() => {\n      // Loop over all .wheelpicker-container-list elements\n      const containers = wheelpickerRef.current?.querySelectorAll<HTMLElement>(\n        \".wheelpicker-container-list\"\n      );\n\n      if (containers) {\n        containers.forEach((container) => {\n          // Only get items with the 'active-item' class\n          const items = Array.from(container.getElementsByClassName(\"active-item\")) as HTMLElement[];\n          const containerRect = container.getBoundingClientRect();\n          const containerCenter = containerRect.top + containerRect.height / 2;\n          let closestItem: HTMLElement | null = null;\n          let minDistance = Infinity;\n          items.forEach((item: HTMLElement) => {\n            const rect = item.getBoundingClientRect();\n            const itemCenter = rect.top + rect.height / 2;\n            const distance = Math.abs(itemCenter - containerCenter);\n            if (distance < minDistance) {\n              minDistance = distance;\n              closestItem = item;\n            }\n          });\n\n          if (closestItem) {\n            items.forEach((sibling) => {\n              const desiredState =\n                sibling === closestItem ? \"default\" : \"disabled\";\n              if (sibling.getAttribute(\"data-state\") !== desiredState) {\n                sibling.setAttribute(\"data-state\", desiredState);\n              }\n            });\n          }\n        });\n\n        // After the containers.forEach loop, collect newSelected\n        const newSelected = Array.from(containers)\n          .map((container) => {\n            // Only get items with the 'active-item' class\n            const items = Array.from(container.getElementsByClassName(\"active-item\")) as HTMLElement[];\n            const containerRect = container.getBoundingClientRect();\n            const containerCenter = containerRect.top + containerRect.height / 2;\n            let closestItem: HTMLElement | null = null;\n            let minDistance = Infinity;\n            items.forEach((item: HTMLElement) => {\n              const rect = item.getBoundingClientRect();\n              const itemCenter = rect.top + rect.height / 2;\n              const distance = Math.abs(itemCenter - containerCenter);\n              if (distance < minDistance) {\n                minDistance = distance;\n                closestItem = item;\n              }\n            });\n            if (closestItem) {\n              return {\n                label:\n                  (closestItem as HTMLElement).getAttribute(\n                    \"data-item-label\"\n                  ) || \"\",\n                value:\n                  (closestItem as HTMLElement).getAttribute(\n                    \"data-item-value\"\n                  ) || \"\",\n              };\n            }\n            return undefined;\n          })\n          .filter((item): item is { label: string; value: string } =>\n            Boolean(item)\n          );\n\n        // Set the newSelected state only if array is not empty\n        const isEqual =\n          lastSelectedRef.current.length === newSelected.length &&\n          lastSelectedRef.current.every(\n            (item, idx) =>\n              item.label === newSelected[idx].label &&\n              item.value === newSelected[idx].value\n          );\n\n        if (!isEqual && newSelected.length > 0) {\n          setSelected(newSelected);\n          lastSelectedRef.current = newSelected;\n\n          // Only fire onChange if at least one label or value is not an empty string\n          const hasNonEmpty = newSelected.some(\n            (item) => item.label !== \"\" || item.value !== \"\"\n          );\n\n          if (onChange && hasNonEmpty) {\n            onChange(newSelected);\n          }\n        }\n      }\n    }, 10);\n    return () => {\n      if (centerCheckIntervalRef.current) {\n        clearInterval(centerCheckIntervalRef.current);\n        centerCheckIntervalRef.current = null;\n      }\n    };\n  };\n\n  // Create content for action sheet\n  const renderDropdownContent = () => {\n    if (customContent) {\n      return customContent;\n    } else {\n      return (\n        <div\n          className={`${styles.wheelpickerContainer} wheelpicker-container`}\n          data-size={itemSize}\n          ref={wheelpickerRef}\n        >\n          {data?.map(({ items, extra }, key) => (\n            <div\n              data-size={itemSize}\n              data-list-index={key}\n              className={`${styles.wheelpickerList} wheelpicker-container-list wheelpicker-container-list-${key}`}\n              key={key}\n              onMouseOver={(e) => {\n                const target = e.currentTarget;\n                if (target !== activeContainerRef.current) {\n                  activeContainerRef.current = target;\n                }\n              }}\n            >\n              {extra && (\n                <span className={`item-list-extra ${styles.itemListExtra}`}>\n                  {extra}\n                </span>\n              )}\n\n              <DropdownItemAtom\n                className={styles.wheelpickerItem}\n                size={itemSize}\n                label=\"\"\n                noFocus={true}\n                width={itemWidth}\n              />\n\n              <DropdownItemAtom\n                size={itemSize}\n                label=\"\"\n                className={styles.wheelpickerItem}\n                noFocus={true}\n                width={itemWidth}\n              />\n              {items.length > 0 &&\n                items.map((item, itemKey) =>\n                  defaultRenderItem(\n                    {\n                      ...item,\n                      className: `${styles.wheelpickerItem} active-item`,\n                      itemKey: itemKey,\n                    },\n                    `.wheelpicker-container-list-${key}`\n                  )\n                )}\n              <DropdownItemAtom\n                size={itemSize}\n                label=\"\"\n                className={styles.wheelpickerItem}\n                noFocus={true}\n                width={itemWidth}\n              />\n              <DropdownItemAtom\n                size={itemSize}\n                label=\"\"\n                className={styles.wheelpickerItem}\n                width={itemWidth}\n              />\n            </div>\n          ))}\n        </div>\n      );\n    }\n  };\n\n  useEffect(() => {\n    if (isMounted) {\n      const stopInterval = startCenterCheckInterval();\n\n      return () => {\n        stopInterval();\n      };\n    }\n  }, [isMounted]);\n\n  useEffect(() => {\n    if (!isOpen) {\n      if (centerCheckIntervalRef.current) {\n        clearInterval(centerCheckIntervalRef.current);\n        centerCheckIntervalRef.current = null;\n        setIsMounted(false);\n      }\n    }\n  }, [isOpen]);\n\n  useEffect(() => {\n    const containers = document.querySelectorAll<HTMLElement>(\n      \".wheelpicker-container-list\"\n    );\n\n    const handleNativeWheel = (e: WheelEvent) => {\n      const container = e.currentTarget as HTMLElement;\n      const { scrollTop, scrollHeight, clientHeight } = container;\n      const isScrollingDown = e.deltaY > 0;\n\n      if (\n        (isScrollingDown && scrollTop + clientHeight >= scrollHeight) ||\n        (!isScrollingDown && scrollTop <= 0)\n      ) {\n        e.preventDefault();\n      }\n    };\n\n    containers.forEach((container) => {\n      container.addEventListener(\"wheel\", handleNativeWheel, {\n        passive: false,\n      });\n    });\n\n    return () => {\n      containers.forEach((container) => {\n        container.removeEventListener(\"wheel\", handleNativeWheel);\n      });\n    };\n  }, [isMounted]);\n\n  const moveActiveContainer = (direction: \"left\" | \"right\") => {\n    if (!activeContainerRef.current) return;\n    let sibling =\n      direction === \"left\"\n        ? activeContainerRef.current.previousElementSibling\n        : activeContainerRef.current.nextElementSibling;\n    while (\n      sibling &&\n      !sibling.classList.contains(\"wheelpicker-container-list\")\n    ) {\n      sibling =\n        direction === \"left\"\n          ? sibling.previousElementSibling\n          : sibling.nextElementSibling;\n    }\n    if (sibling && sibling.classList.contains(\"wheelpicker-container-list\")) {\n      activeContainerRef.current = sibling as HTMLDivElement;\n      (sibling as HTMLDivElement).focus?.();\n    }\n  };\n\n  return (\n    isOpen &&\n    (data.length > 0 || customContent) && (\n      <>\n        {isDesktop ? (\n          <AnimatePresence>\n            <motion.div\n              ref={containerRef}\n              className={[\n                styles.inputsDropdownListChe,\n                \"quill-ui-next-dropdown-container\",\n                className,\n              ].join(\" \")}\n              style={dropdownContainerStyle}\n              initial=\"hidden\"\n              animate={\"visible\"}\n              exit=\"hidden\"\n              variants={dropdownVariants}\n            >\n              {renderDropdownContent()}\n            </motion.div>\n          </AnimatePresence>\n        ) : (\n          <ActionSheet\n            showHeader={false}\n            {...actionsheet}\n            show={isOpen}\n            showSearchBar={false}\n            content={renderDropdownContent()}\n            type=\"bottom\"\n            onClose={actionsheet?.onClose}\n            buttonPrimary={{\n              label: \"Done\",\n              onClick: () => {\n                actionsheet?.onClose?.();\n              },\n            }}\n          />\n        )}\n      </>\n    )\n  );\n};\n\nexport default WheelpickerContainerAtom;\n"],"names":["className"],"mappings":"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"}