use-detach-action.js 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import { useCallback, useEffect } from 'react'
  2. import { useDetachContext } from '../context/detach-context'
  3. import getMeta from '../../utils/meta'
  4. const debugPdfDetach = getMeta('ol-debugPdfDetach')
  5. export default function useDetachAction(
  6. actionName,
  7. actionFunction,
  8. senderRole,
  9. targetRole
  10. ) {
  11. const { role, broadcastEvent, addEventHandler, deleteEventHandler } =
  12. useDetachContext()
  13. const eventName = `action-${actionName}`
  14. const triggerFn = useCallback(
  15. (...args) => {
  16. if (role === senderRole) {
  17. broadcastEvent(eventName, { args })
  18. } else {
  19. actionFunction(...args)
  20. }
  21. },
  22. [role, senderRole, eventName, actionFunction, broadcastEvent]
  23. )
  24. const handleActionEvent = useCallback(
  25. message => {
  26. if (message.event !== eventName) {
  27. return
  28. }
  29. if (role !== targetRole) {
  30. return
  31. }
  32. if (debugPdfDetach) {
  33. console.log(`Do ${actionFunction.name} on event ${eventName}`)
  34. }
  35. actionFunction(...message.data.args)
  36. },
  37. [role, targetRole, eventName, actionFunction]
  38. )
  39. useEffect(() => {
  40. addEventHandler(handleActionEvent)
  41. return () => deleteEventHandler(handleActionEvent)
  42. }, [addEventHandler, deleteEventHandler, handleActionEvent])
  43. return triggerFn
  44. }