word-count-server.tsx 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import { FC, useEffect, useState } from 'react'
  2. import { ServerWordCountData } from '@/features/word-count-modal/components/word-count-data'
  3. import { WordCountError } from '@/features/word-count-modal/components/word-count-error'
  4. import { useProjectContext } from '@/shared/context/project-context'
  5. import { useLocalCompileContext } from '@/shared/context/local-compile-context'
  6. import useAbortController from '@/shared/hooks/use-abort-controller'
  7. import { getJSON } from '@/infrastructure/fetch-json'
  8. import { debugConsole } from '@/utils/debugging'
  9. import { WordCounts } from '@/features/word-count-modal/components/word-counts'
  10. import LoadingSpinner from '@/shared/components/loading-spinner'
  11. export const WordCountServer: FC = () => {
  12. const { projectId } = useProjectContext()
  13. const { clsiServerId } = useLocalCompileContext()
  14. const [loading, setLoading] = useState(true)
  15. const [error, setError] = useState(false)
  16. const [data, setData] = useState<ServerWordCountData | null>(null)
  17. const { signal } = useAbortController()
  18. useEffect(() => {
  19. const url = new URL(`/project/${projectId}/wordcount`, window.location.href)
  20. if (clsiServerId) {
  21. url.searchParams.set('clsiserverid', clsiServerId)
  22. }
  23. getJSON(url.toString(), { signal })
  24. .then(data => {
  25. setData(data.texcount)
  26. })
  27. .catch(error => {
  28. debugConsole.error(error)
  29. setError(true)
  30. })
  31. .finally(() => {
  32. setLoading(false)
  33. })
  34. }, [projectId, clsiServerId, signal])
  35. return (
  36. <>
  37. {loading && !error && <LoadingSpinner />}
  38. {error && <WordCountError />}
  39. {data && <WordCounts data={data} />}
  40. </>
  41. )
  42. }