chat-store-effect.js 1.2 KB

1234567891011121314151617181920212223242526272829303132333435
  1. import { useState, useEffect, useRef } from 'react'
  2. import { ChatStore } from './chat-store'
  3. import { useApplicationContext } from '../../../shared/context/application-context'
  4. import { useEditorContext } from '../../../shared/context/editor-context'
  5. export function useChatStore() {
  6. const { user } = useApplicationContext()
  7. const { projectId } = useEditorContext()
  8. const chatStoreRef = useRef(new ChatStore(user, projectId))
  9. const [atEnd, setAtEnd] = useState(chatStoreRef.current.atEnd)
  10. const [loading, setLoading] = useState(chatStoreRef.current.loading)
  11. const [messages, setMessages] = useState(chatStoreRef.current.messages)
  12. useEffect(() => {
  13. const chatStore = chatStoreRef.current
  14. function handleStoreUpdated() {
  15. setAtEnd(chatStore.atEnd)
  16. setLoading(chatStore.loading)
  17. setMessages(chatStore.messages)
  18. }
  19. chatStore.on('updated', handleStoreUpdated)
  20. return () => chatStore.destroy()
  21. }, [chatStoreRef])
  22. return {
  23. userId: user.id,
  24. atEnd,
  25. loading,
  26. messages,
  27. loadMoreMessages: () => chatStoreRef.current.loadMoreMessages(),
  28. sendMessage: message => chatStoreRef.current.sendMessage(message)
  29. }
  30. }