use-pdf-pane.ts 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import { useCallback, 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. // triggered by a double-click on the resizer
  12. const togglePdfPane = useCallback(() => {
  13. if (pdfIsOpen) {
  14. changeLayout('flat', 'editor')
  15. } else {
  16. changeLayout('sideBySide')
  17. }
  18. }, [changeLayout, pdfIsOpen])
  19. // triggered by a click on the toggle button
  20. const setPdfIsOpen = useCallback(
  21. (value: boolean) => {
  22. if (value) {
  23. // opening the PDF view, so close a detached PDF
  24. if (detachRole === 'detacher') {
  25. reattach()
  26. }
  27. changeLayout('sideBySide')
  28. } else {
  29. changeLayout('flat', 'editor')
  30. }
  31. },
  32. [changeLayout, detachRole, reattach]
  33. )
  34. // triggered when the PDF pane becomes open
  35. const handlePdfPaneExpand = useCallback(() => {
  36. if (pdfLayout === 'flat' && view === 'editor') {
  37. changeLayout('sideBySide', 'editor')
  38. }
  39. }, [changeLayout, pdfLayout, view])
  40. // triggered when the PDF pane becomes closed (either by dragging or toggling)
  41. const handlePdfPaneCollapse = useCallback(() => {
  42. if (pdfLayout === 'sideBySide') {
  43. changeLayout('flat', 'editor')
  44. }
  45. }, [changeLayout, pdfLayout])
  46. return {
  47. togglePdfPane,
  48. handlePdfPaneExpand,
  49. handlePdfPaneCollapse,
  50. setPdfIsOpen,
  51. pdfIsOpen,
  52. pdfPanelRef,
  53. }
  54. }