{"version":3,"sources":["../../../src/messages/use-messages.tsx"],"sourcesContent":["import { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react'\n\nimport { MessagesContext } from './messages-provider'\n\ninterface IUseMessagesProps<TTopic extends string> {\n  topics: TTopic[]\n  onConnect?: () => void\n  onError?: (error: Error) => void\n  onMessage: (topic: TTopic, message: string) => void\n  onClose?: () => void\n}\n\nconst useMessages = <TTopic extends string>({\n  topics,\n  onConnect = () => {},\n  onError = () => {},\n  onMessage,\n  onClose = () => {},\n}: IUseMessagesProps<TTopic>) => {\n  const context = useContext(MessagesContext)\n\n  if (!context) {\n    throw new Error('MessagesProvider not found in the context')\n  }\n\n  const [map, setMap] = useState<\n    Record<string, { messages: string[]; removeListener: () => void }>\n  >({})\n\n  const onMessageRef = useRef(onMessage)\n  useEffect(() => {\n    onMessageRef.current = onMessage\n  }, [onMessage])\n\n  const handleOnMessageReceiveFromContext = useCallback(\n    (topic: TTopic, message: string) => {\n      setMap((prev) => {\n        const newMap = { ...prev }\n        if (!newMap[topic]) {\n          newMap[topic] = { messages: [], removeListener: () => {} }\n        }\n        newMap[topic].messages.push(message)\n        return newMap\n      })\n\n      if (onMessageRef.current) onMessageRef.current(topic, message)\n    },\n    [],\n  )\n\n  const registerListener = useCallback(\n    (topic: string) => {\n      setMap((prev) => {\n        if (prev[topic]) return prev;\n        const removeFn = context?.registerListener(\n          topic,\n          handleOnMessageReceiveFromContext,\n        )\n        if (!removeFn) return prev\n        return { ...prev, [topic]: { messages: [], removeListener: removeFn } }\n      })\n    },\n    [context, handleOnMessageReceiveFromContext],\n  )\n\n  const removeListener = useCallback((topic: string) => {\n    setMap((prev) => {\n      if (!prev[topic]) return prev\n\n      prev[topic].removeListener()\n      const newMap = { ...prev }\n      delete newMap[topic]\n      return newMap\n    })\n  }, [])\n  useEffect(() => {\n    topics.forEach((topic) => {\n      if (!map[topic]) {\n        registerListener(topic)\n      }\n    })\n\n    return () => {\n      Object.keys(map).forEach((topic) => {\n        if (!topics.includes(topic as TTopic)) {\n          removeListener(topic)\n        }\n      })\n    }\n  }, [topics, registerListener, removeListener])\n\n  return useMemo(\n    () => ({ messages: map, removeListener, registerListener }),\n    [map, removeListener, registerListener],\n  )\n}\n\nexport default useMessages\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA8E;AAE9E,+BAAgC;AAUhC,IAAM,cAAc,CAAwB;AAAA,EAC1C;AAAA,EACA,YAAY,MAAM;AAAA,EAAC;AAAA,EACnB,UAAU,MAAM;AAAA,EAAC;AAAA,EACjB;AAAA,EACA,UAAU,MAAM;AAAA,EAAC;AACnB,MAAiC;AAC/B,QAAM,cAAU,yBAAW,wCAAe;AAE1C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AAEA,QAAM,CAAC,KAAK,MAAM,QAAI,uBAEpB,CAAC,CAAC;AAEJ,QAAM,mBAAe,qBAAO,SAAS;AACrC,8BAAU,MAAM;AACd,iBAAa,UAAU;AAAA,EACzB,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,wCAAoC;AAAA,IACxC,CAAC,OAAe,YAAoB;AAClC,aAAO,CAAC,SAAS;AACf,cAAM,SAAS,EAAE,GAAG,KAAK;AACzB,YAAI,CAAC,OAAO,KAAK,GAAG;AAClB,iBAAO,KAAK,IAAI,EAAE,UAAU,CAAC,GAAG,gBAAgB,MAAM;AAAA,UAAC,EAAE;AAAA,QAC3D;AACA,eAAO,KAAK,EAAE,SAAS,KAAK,OAAO;AACnC,eAAO;AAAA,MACT,CAAC;AAED,UAAI,aAAa,QAAS,cAAa,QAAQ,OAAO,OAAO;AAAA,IAC/D;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,uBAAmB;AAAA,IACvB,CAAC,UAAkB;AACjB,aAAO,CAAC,SAAS;AACf,YAAI,KAAK,KAAK,EAAG,QAAO;AACxB,cAAM,WAAW,SAAS;AAAA,UACxB;AAAA,UACA;AAAA,QACF;AACA,YAAI,CAAC,SAAU,QAAO;AACtB,eAAO,EAAE,GAAG,MAAM,CAAC,KAAK,GAAG,EAAE,UAAU,CAAC,GAAG,gBAAgB,SAAS,EAAE;AAAA,MACxE,CAAC;AAAA,IACH;AAAA,IACA,CAAC,SAAS,iCAAiC;AAAA,EAC7C;AAEA,QAAM,qBAAiB,0BAAY,CAAC,UAAkB;AACpD,WAAO,CAAC,SAAS;AACf,UAAI,CAAC,KAAK,KAAK,EAAG,QAAO;AAEzB,WAAK,KAAK,EAAE,eAAe;AAC3B,YAAM,SAAS,EAAE,GAAG,KAAK;AACzB,aAAO,OAAO,KAAK;AACnB,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AACL,8BAAU,MAAM;AACd,WAAO,QAAQ,CAAC,UAAU;AACxB,UAAI,CAAC,IAAI,KAAK,GAAG;AACf,yBAAiB,KAAK;AAAA,MACxB;AAAA,IACF,CAAC;AAED,WAAO,MAAM;AACX,aAAO,KAAK,GAAG,EAAE,QAAQ,CAAC,UAAU;AAClC,YAAI,CAAC,OAAO,SAAS,KAAe,GAAG;AACrC,yBAAe,KAAK;AAAA,QACtB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,QAAQ,kBAAkB,cAAc,CAAC;AAE7C,aAAO;AAAA,IACL,OAAO,EAAE,UAAU,KAAK,gBAAgB,iBAAiB;AAAA,IACzD,CAAC,KAAK,gBAAgB,gBAAgB;AAAA,EACxC;AACF;AAEA,IAAO,uBAAQ;","names":[]}