use-detach-state.js 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import { useEffect, useState, useCallback } 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 useDetachState(
  6. key,
  7. defaultValue,
  8. senderRole,
  9. targetRole
  10. ) {
  11. const [value, setValue] = useState(defaultValue)
  12. const { role, broadcastEvent, addEventHandler, deleteEventHandler } =
  13. useDetachContext()
  14. const eventName = `state-${key}`
  15. useEffect(() => {
  16. if (role === senderRole) {
  17. broadcastEvent(eventName, { value })
  18. }
  19. }, [role, senderRole, eventName, value, broadcastEvent])
  20. const handleStateEvent = useCallback(
  21. message => {
  22. if (message.event !== eventName) {
  23. return
  24. }
  25. if (role !== targetRole) {
  26. return
  27. }
  28. if (debugPdfDetach) {
  29. console.log(`Set ${message.data.value} for ${eventName}`)
  30. }
  31. setValue(message.data.value)
  32. },
  33. [role, targetRole, eventName, setValue]
  34. )
  35. useEffect(() => {
  36. addEventHandler(handleStateEvent)
  37. return () => deleteEventHandler(handleStateEvent)
  38. }, [addEventHandler, deleteEventHandler, handleStateEvent])
  39. return [value, setValue]
  40. }