11import { useEffect , useRef , useState } from 'react'
22import React from 'react'
33import { Spinner } from '../Layout.js'
4- import ContentHeader from './ContentHeader.js'
4+ import ContentHeader , { parseFileSize , TextContent } from './ContentHeader.js'
55
66enum LoadingState {
77 NotLoaded ,
@@ -20,7 +20,7 @@ interface ViewerProps {
2020 */
2121export default function TextView ( { file, setError } : ViewerProps ) {
2222 const [ loading , setLoading ] = useState ( LoadingState . NotLoaded )
23- const [ text , setText ] = useState < string | undefined > ( )
23+ const [ content , setContent ] = useState < TextContent > ( )
2424 const textRef = useRef < HTMLPreElement > ( null )
2525
2626 const isUrl = file . startsWith ( 'http://' ) || file . startsWith ( 'https://' )
@@ -32,7 +32,8 @@ export default function TextView({ file, setError }: ViewerProps) {
3232 try {
3333 const res = await fetch ( url )
3434 const text = await res . text ( )
35- setText ( text )
35+ const fileSize = parseFileSize ( res . headers ) ?? text . length
36+ setContent ( { text, fileSize } )
3637 } catch ( error ) {
3738 setError ( error as Error )
3839 } finally {
@@ -49,13 +50,13 @@ export default function TextView({ file, setError }: ViewerProps) {
4950 } , [ file , loading , setError ] )
5051
5152 const headers = < >
52- < span > { text ? newlines ( text ) : 0 } lines</ span >
53+ < span > { newlines ( content ?. text ?? "" ) } lines</ span >
5354 </ >
5455
5556 // Simple text viewer
56- return < ContentHeader content = { { fileSize : text ?. length } } headers = { headers } >
57+ return < ContentHeader content = { content } headers = { headers } >
5758 < code className = 'text' ref = { textRef } >
58- { text }
59+ { content ?. text }
5960 </ code >
6061
6162 { loading && < Spinner className = 'center' /> }
0 commit comments