system-messages.tsx 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import { useEffect } from 'react'
  2. import SystemMessage from './system-message'
  3. import TranslationMessage from './translation-message'
  4. import useAsync from '../hooks/use-async'
  5. import { getJSON } from '@/infrastructure/fetch-json'
  6. import getMeta from '../../utils/meta'
  7. import { SystemMessage as TSystemMessage } from '../../../../types/system-message'
  8. import { debugConsole } from '@/utils/debugging'
  9. const MESSAGE_POLL_INTERVAL = 15 * 60 * 1000
  10. function SystemMessages() {
  11. const { data: messages, runAsync } = useAsync<TSystemMessage[]>()
  12. const suggestedLanguage = getMeta('ol-suggestedLanguage')
  13. useEffect(() => {
  14. const pollMessages = () => {
  15. // Ignore polling if tab is hidden or browser is offline
  16. if (document.hidden || !navigator.onLine) {
  17. return
  18. }
  19. runAsync(getJSON('/system/messages')).catch(debugConsole.error)
  20. }
  21. pollMessages()
  22. const interval = setInterval(pollMessages, MESSAGE_POLL_INTERVAL)
  23. return () => {
  24. clearInterval(interval)
  25. }
  26. }, [runAsync])
  27. if (!messages?.length && !suggestedLanguage) {
  28. return null
  29. }
  30. return (
  31. <ul className="system-messages">
  32. {messages?.map((message, idx) => (
  33. <SystemMessage key={idx} id={message._id}>
  34. {message.content}
  35. </SystemMessage>
  36. ))}
  37. {suggestedLanguage ? <TranslationMessage /> : null}
  38. </ul>
  39. )
  40. }
  41. export default SystemMessages