{"version":3,"sources":["../src/components/chat/Window.tsx"],"sourcesContent":["import React, { useCallback, useEffect } from \"react\";\nimport { WindowProps } from \"./props\";\nimport { useChatContext } from \"./ChatContext\";\n\nexport const Window = ({\n  children,\n  clickOutsideToClose,\n  shortcut,\n  hitEscapeToClose,\n}: WindowProps) => {\n  const windowRef = React.useRef<HTMLDivElement>(null);\n\n  const { open, setOpen } = useChatContext();\n\n  const handleClickOutside = useCallback(\n    (event: MouseEvent) => {\n      if (!clickOutsideToClose) {\n        return;\n      }\n\n      const parentElement = windowRef.current?.parentElement;\n\n      let className = \"\";\n      if (event.target instanceof HTMLElement) {\n        className = event.target.className;\n      }\n\n      if (\n        open &&\n        parentElement &&\n        !parentElement.contains(event.target as any) &&\n        // prevent closing the window when clicking on the debug menu\n        !className.includes(\"copilotKitDebugMenu\")\n      ) {\n        setOpen(false);\n      }\n    },\n    [clickOutsideToClose, open, setOpen],\n  );\n\n  const handleKeyDown = useCallback(\n    (event: KeyboardEvent) => {\n      const target = event.target as HTMLElement;\n      const isInput =\n        target.tagName === \"INPUT\" ||\n        target.tagName === \"SELECT\" ||\n        target.tagName === \"TEXTAREA\" ||\n        target.isContentEditable;\n\n      const isDescendantOfWrapper = windowRef.current?.contains(target);\n\n      if (\n        open &&\n        event.key === \"Escape\" &&\n        (!isInput || isDescendantOfWrapper) &&\n        hitEscapeToClose\n      ) {\n        setOpen(false);\n      } else if (\n        event.key === shortcut &&\n        ((isMacOS() && event.metaKey) || (!isMacOS() && event.ctrlKey)) &&\n        (!isInput || isDescendantOfWrapper)\n      ) {\n        setOpen(!open);\n      }\n    },\n    [hitEscapeToClose, shortcut, open, setOpen],\n  );\n\n  const adjustForMobile = useCallback(() => {\n    const copilotKitWindow = windowRef.current;\n    const vv = window.visualViewport;\n    if (!copilotKitWindow || !vv) {\n      return;\n    }\n\n    if (window.innerWidth < 640 && open) {\n      copilotKitWindow.style.height = `${vv.height}px`;\n      copilotKitWindow.style.left = `${vv.offsetLeft}px`;\n      copilotKitWindow.style.top = `${vv.offsetTop}px`;\n\n      document.body.style.position = \"fixed\";\n      document.body.style.width = \"100%\";\n      document.body.style.height = `${window.innerHeight}px`;\n      document.body.style.overflow = \"hidden\";\n      document.body.style.touchAction = \"none\";\n\n      // Prevent scrolling on iOS\n      document.body.addEventListener(\"touchmove\", preventScroll, {\n        passive: false,\n      });\n    } else {\n      copilotKitWindow.style.height = \"\";\n      copilotKitWindow.style.left = \"\";\n      copilotKitWindow.style.top = \"\";\n      document.body.style.position = \"\";\n      document.body.style.height = \"\";\n      document.body.style.width = \"\";\n      document.body.style.overflow = \"\";\n      document.body.style.top = \"\";\n      document.body.style.touchAction = \"\";\n\n      document.body.removeEventListener(\"touchmove\", preventScroll);\n    }\n  }, [open]);\n\n  useEffect(() => {\n    document.addEventListener(\"mousedown\", handleClickOutside);\n    document.addEventListener(\"keydown\", handleKeyDown);\n    if (window.visualViewport) {\n      window.visualViewport.addEventListener(\"resize\", adjustForMobile);\n      adjustForMobile();\n    }\n\n    return () => {\n      document.removeEventListener(\"mousedown\", handleClickOutside);\n      document.removeEventListener(\"keydown\", handleKeyDown);\n      if (window.visualViewport) {\n        window.visualViewport.removeEventListener(\"resize\", adjustForMobile);\n      }\n    };\n  }, [adjustForMobile, handleClickOutside, handleKeyDown]);\n\n  return (\n    <div className={`copilotKitWindow${open ? \" open\" : \"\"}`} ref={windowRef}>\n      {children}\n    </div>\n  );\n};\n\nconst preventScroll = (event: TouchEvent): void => {\n  let targetElement = event.target as Element;\n\n  // Function to check if the target has the parent with a given class\n  const hasParentWithClass = (element: Element, className: string): boolean => {\n    while (element && element !== document.body) {\n      if (element.classList.contains(className)) {\n        return true;\n      }\n      element = element.parentElement!;\n    }\n    return false;\n  };\n\n  // Check if the target of the touch event is inside an element with the 'copilotKitMessages' class\n  if (!hasParentWithClass(targetElement, \"copilotKitMessages\")) {\n    event.preventDefault();\n  }\n};\n\nfunction isMacOS() {\n  return /Mac|iMac|Macintosh/i.test(navigator.userAgent);\n}\n"],"mappings":"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","names":[]}