system-messages.tsx 1.5 KB

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