use-pdf-pane.ts 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import { useCallback, useEffect, useRef } from 'react'
  2. import { ImperativePanelHandle } from 'react-resizable-panels'
  3. import useCollapsiblePanel from '@/features/ide-react/hooks/use-collapsible-panel'
  4. import { useLayoutContext } from '@/shared/context/layout-context'
  5. export const usePdfPane = () => {
  6. const { view, pdfLayout, changeLayout, detachRole, reattach } =
  7. useLayoutContext()
  8. const pdfPanelRef = useRef<ImperativePanelHandle>(null)
  9. const pdfIsOpen = pdfLayout === 'sideBySide' || view === 'pdf'
  10. useCollapsiblePanel(pdfIsOpen, pdfPanelRef)
  11. // close a detached PDF when the detacher PDF view opens
  12. useEffect(() => {
  13. if (pdfIsOpen && detachRole === 'detacher') {
  14. reattach()
  15. }
  16. }, [detachRole, pdfIsOpen, reattach])
  17. // triggered by a double-click on the resizer
  18. const togglePdfPane = useCallback(() => {
  19. if (pdfIsOpen) {
  20. changeLayout('flat', 'editor')
  21. } else {
  22. changeLayout('sideBySide')
  23. }
  24. }, [changeLayout, pdfIsOpen])
  25. // triggered by a click on the toggle button
  26. const setPdfIsOpen = useCallback(
  27. (value: boolean) => {
  28. if (value) {
  29. changeLayout('sideBySide')
  30. } else {
  31. changeLayout('flat', 'editor')
  32. }
  33. },
  34. [changeLayout]
  35. )
  36. // triggered when the PDF pane becomes open
  37. const handlePdfPaneExpand = useCallback(() => {
  38. if (pdfLayout === 'flat' && view === 'editor') {
  39. changeLayout('sideBySide', 'editor')
  40. }
  41. }, [changeLayout, pdfLayout, view])
  42. // triggered when the PDF pane becomes closed (either by dragging or toggling)
  43. const handlePdfPaneCollapse = useCallback(() => {
  44. if (pdfLayout === 'sideBySide') {
  45. changeLayout('flat', 'editor')
  46. }
  47. }, [changeLayout, pdfLayout])
  48. return {
  49. togglePdfPane,
  50. handlePdfPaneExpand,
  51. handlePdfPaneCollapse,
  52. setPdfIsOpen,
  53. pdfIsOpen,
  54. pdfPanelRef,
  55. }
  56. }